From 3a98726d1b644392538b1f053c92ea84ac04bb86 Mon Sep 17 00:00:00 2001 From: ko1234 Date: Tue, 17 Jun 2025 17:50:29 +0800 Subject: [PATCH] init --- .env.development | 3 + .env.production | 3 + .env.staging | 3 + .gitignore | 26 + README.md | 3 + index.html | 26 + package-lock.json | 5553 +++++ package.json | 45 + postcss.config.js | 7 + public/background.jpg | Bin 0 -> 344909 bytes public/hotspot.svg | 21 + public/logo.png | Bin 0 -> 25085 bytes public/logo.svg | 80 + public/setting.html | 15 + src/App.vue | 67 + src/apis/account/api.js | 14 + src/apis/account/index.js | 158 + src/apis/alert/api.js | 22 + src/apis/alert/index.js | 214 + src/apis/asset/api.js | 19 + src/apis/asset/index.js | 187 + src/apis/building/api.js | 4 + src/apis/building/index.js | 67 + src/apis/dashboard/api.js | 9 + src/apis/dashboard/index.js | 137 + src/apis/forge/api.js | 3 + src/apis/forge/index.js | 24 + src/apis/graph/api.js | 16 + src/apis/graph/index.js | 122 + src/apis/history/api.js | 11 + src/apis/history/index.js | 173 + src/apis/login/api.js | 1 + src/apis/login/index.js | 23 + src/apis/operation/api.js | 16 + src/apis/operation/index.js | 190 + src/apis/productSetting/api.js | 4 + src/apis/productSetting/index.js | 45 + src/assets/base.css | 89 + src/assets/btn.css | 56 + src/assets/img/background.jpg | Bin 0 -> 6444 bytes src/assets/img/pagination/small-btn.svg | 14 + src/assets/img/pagination/small-btn02.svg | 9 + .../img/table/content-box-background01.svg | 44 + .../img/table/content-box-background02.svg | 43 + .../img/table/content-box-background03.svg | 43 + .../img/table/content-box-background04.svg | 38 + .../img/table/content-box-background05.svg | 44 + src/assets/img/table/large-btn.svg | 18 + src/assets/img/table/large-btn02.svg | 14 + src/assets/img/table/small-btn.svg | 14 + src/assets/img/table/small-btn02.svg | 9 + src/assets/index.css | 68 + src/assets/logo.svg | 1 + src/assets/main.css | 29 + src/assets/pagination.css | 40 + src/assets/table.css | 122 + src/components/Loading.vue | 32 + src/components/SvgIcon.vue | 44 + src/components/alarm/AlarmCards.vue | 75 + src/components/alarm/AlarmDrawer.vue | 74 + src/components/chart/BarChart.vue | 31 + src/components/chart/EffectScatter.vue | 75 + src/components/chart/GaugeChart.vue | 34 + src/components/chart/LineChart.vue | 34 + src/components/chart/LiquidfillChart.vue | 119 + src/components/chart/SankeyChart.vue | 31 + .../customUI/ButtonConnectedGroup.vue | 52 + src/components/customUI/ButtonGroup.vue | 43 + src/components/customUI/Checkbox.vue | 65 + src/components/customUI/Collapse.vue | 72 + src/components/customUI/DateGroup.vue | 124 + src/components/customUI/Dropdown.vue | 29 + .../customUI/FileSystemCollapse.vue | 189 + src/components/customUI/Input.vue | 96 + src/components/customUI/InputNumber.vue | 92 + src/components/customUI/Modal.vue | 94 + src/components/customUI/Pagination.vue | 192 + src/components/customUI/RadioGroup.vue | 56 + src/components/customUI/Select.vue | 85 + src/components/customUI/Table.vue | 381 + src/components/customUI/Textarea.vue | 30 + src/components/customUI/Toast.vue | 73 + src/components/customUI/Upload.vue | 287 + src/components/forge/Forge.vue | 282 + src/components/forge/ForgeInfoModal.vue | 106 + src/components/forge/ForgeInfoModalChart.vue | 219 + src/components/forge/ForgeInfoModalCog.vue | 118 + .../forge/ForgeInfoModalDesktop.vue | 34 + src/components/forge/ForgeModal.vue | 160 + src/components/forge/ForgeModalContent.vue | 223 + src/components/forge/index.vue | 270 + src/components/navbar/Navbar.vue | 156 + src/components/navbar/NavbarBuilding.vue | 48 + src/components/navbar/NavbarItem.vue | 129 + src/constant/CalculateTableColumn.js | 127 + src/constant/api_app.js | 8 + src/constant/api_forge.js | 4 + src/constant/authPage.js | 61 + src/constant/calculateIcon.js | 465 + src/constant/colors.js | 32 + src/constant/index.js | 45 + src/directives/draggable.js | 76 + src/directives/focusPlugin.js | 9 + src/fontawsomeIconRegister.js | 103 + src/hooks/baja/useAlarmData.js | 91 + src/hooks/baja/useRefrigerantHeatMap.js | 150 + src/hooks/baja/useSystemHeatmap.js | 173 + src/hooks/baja/useSystemStatusByBaja.js | 408 + src/hooks/useActiveBtn.js | 41 + src/hooks/useDashboardOption.js | 20 + src/hooks/useFormErrorMessage.js | 50 + src/hooks/useGetCookie.js | 8 + src/hooks/useGetDevice.js | 31 + src/hooks/useSearchParam.js | 29 + src/lib/jquery-ui/AUTHORS.txt | 381 + src/lib/jquery-ui/LICENSE.txt | 43 + src/lib/jquery-ui/external/jquery/jquery.js | 10716 +++++++++ .../images/ui-icons_444444_256x240.png | Bin 0 -> 7126 bytes .../images/ui-icons_555555_256x240.png | Bin 0 -> 7110 bytes .../images/ui-icons_777620_256x240.png | Bin 0 -> 4654 bytes .../images/ui-icons_777777_256x240.png | Bin 0 -> 7147 bytes .../images/ui-icons_cc0000_256x240.png | Bin 0 -> 4654 bytes .../images/ui-icons_ffffff_256x240.png | Bin 0 -> 6523 bytes src/lib/jquery-ui/index.html | 503 + src/lib/jquery-ui/jquery-ui.css | 1315 ++ src/lib/jquery-ui/jquery-ui.js | 19070 ++++++++++++++++ src/lib/jquery-ui/jquery-ui.min.css | 7 + src/lib/jquery-ui/jquery-ui.min.js | 6 + src/lib/jquery-ui/jquery-ui.structure.css | 886 + src/lib/jquery-ui/jquery-ui.structure.min.css | 5 + src/lib/jquery-ui/jquery-ui.theme.css | 446 + src/lib/jquery-ui/jquery-ui.theme.min.css | 5 + src/lib/jquery-ui/package.json | 84 + src/main.js | 41 + src/router/index.js | 101 + src/stores/useAlarmStore.js | 101 + src/stores/useBuildingStore.js | 47 + src/stores/useForgeDbIdStore.js | 13 + src/stores/useUserInfoStore.js | 18 + src/util/apiHandler.js | 11 + src/util/clearChart.js | 13 + src/util/downloadExcel.js | 42 + src/util/getModalPosition.js | 18 + src/util/hexToRgb.js | 12 + src/util/request.js | 99 + src/util/showChartLoading.js | 9 + src/views/AssetManagement/AssetManagement.vue | 14 + .../components/AssetBuildFloorAddModal.vue | 359 + .../components/AssetMainList.vue | 57 + .../components/AssetSubList.vue | 157 + .../components/AssetSubListAddModal.vue | 140 + .../AssetManagement/components/AssetTable.vue | 233 + .../components/AssetTableAddModal.vue | 146 + .../components/AssetTableModalLeft.vue | 20 + .../components/AssetTableModalLeftInfo.vue | 209 + .../components/AssetTableModalLeftInfoIoT.vue | 191 + .../components/AssetTableModalLeftModule.vue | 11 + .../components/AssetTableModalRight.vue | 22 + .../components/AssetTableModalRightInfo.vue | 196 + src/views/Test.vue | 27 + .../accountManagement/AccountManagement.vue | 53 + .../accountManagement/components/Account.vue | 214 + .../components/AccountModal.vue | 221 + .../components/AccountPasswordModal.vue | 91 + .../accountManagement/components/Role.vue | 152 + .../components/RoleAuthModal.vue | 209 + src/views/alert/AlertManagement.vue | 46 + .../AlertQuery/AlertActionButton.vue | 41 + .../components/AlertQuery/AlertQuery.vue | 173 + .../components/AlertQuery/AlertSearch.vue | 26 + .../AlertQuery/AlertSearchAckBtns.vue | 54 + .../AlertQuery/AlertSearchNormalBtns.vue | 55 + .../AlertQuery/AlertSearchTimeRange.vue | 78 + .../AlertQuery/AlertSearchTypesButton.vue | 82 + .../components/AlertQuery/AlertTable.vue | 87 + .../components/AlertQuery/AlertTableModal.vue | 265 + .../AlertSetting/AlertNoticesTable.vue | 38 + .../AlertSetting/AlertNotifyTable.vue | 111 + .../AlertSetting/AlertNotifyTableAddModal.vue | 136 + .../AlertSetting/AlertOutliersTable.vue | 216 + .../AlertOutliersTableAddModal.vue | 209 + .../components/AlertSetting/AlertSetting.vue | 46 + .../components/AlertSetting/AlertSubList.vue | 50 + .../AlertSetting/AlertTimeTable.vue | 109 + .../AlertSetting/AlertTimeTableAddModal.vue | 425 + src/views/dashboard/Dashboard.vue | 80 + .../dashboard/components/DashboardAlert.vue | 47 + .../components/DashboardDescriptionCard.vue | 31 + .../components/DashboardElectricity.vue | 124 + .../dashboard/components/DashboardEnergy.vue | 32 + .../components/DashboardForgeOptionButton.vue | 104 + .../components/DashboardForgeOptionCard.vue | 623 + .../components/DashboardFormulaTemp.vue | 212 + .../components/DashboardFrozenTemp.vue | 156 + .../components/DashboardImmediateTemp.vue | 199 + .../components/DashboardMoreModal.vue | 115 + .../dashboard/components/DashboardProduct.vue | 106 + .../components/DashboardProductComplete.vue | 71 + .../DashboardProductCompleteModal.vue | 99 + .../DashboardProductCompleteModalRecord.vue | 125 + .../DashboardProductCompleteModalTarget.vue | 111 + .../dashboard/components/DashboardTarget.vue | 137 + src/views/graphManagement/GraphManagement.vue | 24 + .../graphManagement/components/GraphModal.vue | 166 + .../components/GraphSidebar.vue | 239 + .../components/GraphSidebarDropdown.vue | 63 + .../graphManagement/components/GraphTable.vue | 154 + src/views/history/History.vue | 49 + .../components/HistoryActionButton.vue | 138 + .../components/HistoryFavoriteOption.vue | 206 + src/views/history/components/HistoryModal.vue | 189 + .../history/components/HistorySearch.vue | 260 + .../history/components/HistorySearchTime.vue | 138 + .../history/components/HistorySidebar.vue | 206 + src/views/history/components/HistoryTable.vue | 42 + src/views/login/Login.vue | 117 + src/views/operation/Operation.vue | 146 + .../components/OperationActionButton.vue | 94 + .../operation/components/OperationSearch.vue | 137 + .../components/OperationSearchSubSys.vue | 145 + .../components/OperationSearchType.vue | 151 + .../operation/components/OperationTable.vue | 141 + .../components/OperationTableModal.vue | 624 + .../constant/OperationTableColumns.js | 85 + src/views/productSetting/ProductSetting.vue | 46 + .../components/ProducSettingBtn.vue | 54 + .../components/ProductSettingPointModal.vue | 162 + .../components/ProductSettingTypeAddModal.vue | 141 + .../components/ProductSettingTypeModal.vue | 86 + tailwind.config.js | 44 + vite.config.js | 55 + 231 files changed, 59626 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .env.staging create mode 100644 .gitignore create mode 100644 README.md create mode 100644 index.html create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.js create mode 100644 public/background.jpg create mode 100644 public/hotspot.svg create mode 100644 public/logo.png create mode 100644 public/logo.svg create mode 100644 public/setting.html create mode 100644 src/App.vue create mode 100644 src/apis/account/api.js create mode 100644 src/apis/account/index.js create mode 100644 src/apis/alert/api.js create mode 100644 src/apis/alert/index.js create mode 100644 src/apis/asset/api.js create mode 100644 src/apis/asset/index.js create mode 100644 src/apis/building/api.js create mode 100644 src/apis/building/index.js create mode 100644 src/apis/dashboard/api.js create mode 100644 src/apis/dashboard/index.js create mode 100644 src/apis/forge/api.js create mode 100644 src/apis/forge/index.js create mode 100644 src/apis/graph/api.js create mode 100644 src/apis/graph/index.js create mode 100644 src/apis/history/api.js create mode 100644 src/apis/history/index.js create mode 100644 src/apis/login/api.js create mode 100644 src/apis/login/index.js create mode 100644 src/apis/operation/api.js create mode 100644 src/apis/operation/index.js create mode 100644 src/apis/productSetting/api.js create mode 100644 src/apis/productSetting/index.js create mode 100644 src/assets/base.css create mode 100644 src/assets/btn.css create mode 100644 src/assets/img/background.jpg create mode 100644 src/assets/img/pagination/small-btn.svg create mode 100644 src/assets/img/pagination/small-btn02.svg create mode 100644 src/assets/img/table/content-box-background01.svg create mode 100644 src/assets/img/table/content-box-background02.svg create mode 100644 src/assets/img/table/content-box-background03.svg create mode 100644 src/assets/img/table/content-box-background04.svg create mode 100644 src/assets/img/table/content-box-background05.svg create mode 100644 src/assets/img/table/large-btn.svg create mode 100644 src/assets/img/table/large-btn02.svg create mode 100644 src/assets/img/table/small-btn.svg create mode 100644 src/assets/img/table/small-btn02.svg create mode 100644 src/assets/index.css create mode 100644 src/assets/logo.svg create mode 100644 src/assets/main.css create mode 100644 src/assets/pagination.css create mode 100644 src/assets/table.css create mode 100644 src/components/Loading.vue create mode 100644 src/components/SvgIcon.vue create mode 100644 src/components/alarm/AlarmCards.vue create mode 100644 src/components/alarm/AlarmDrawer.vue create mode 100644 src/components/chart/BarChart.vue create mode 100644 src/components/chart/EffectScatter.vue create mode 100644 src/components/chart/GaugeChart.vue create mode 100644 src/components/chart/LineChart.vue create mode 100644 src/components/chart/LiquidfillChart.vue create mode 100644 src/components/chart/SankeyChart.vue create mode 100644 src/components/customUI/ButtonConnectedGroup.vue create mode 100644 src/components/customUI/ButtonGroup.vue create mode 100644 src/components/customUI/Checkbox.vue create mode 100644 src/components/customUI/Collapse.vue create mode 100644 src/components/customUI/DateGroup.vue create mode 100644 src/components/customUI/Dropdown.vue create mode 100644 src/components/customUI/FileSystemCollapse.vue create mode 100644 src/components/customUI/Input.vue create mode 100644 src/components/customUI/InputNumber.vue create mode 100644 src/components/customUI/Modal.vue create mode 100644 src/components/customUI/Pagination.vue create mode 100644 src/components/customUI/RadioGroup.vue create mode 100644 src/components/customUI/Select.vue create mode 100644 src/components/customUI/Table.vue create mode 100644 src/components/customUI/Textarea.vue create mode 100644 src/components/customUI/Toast.vue create mode 100644 src/components/customUI/Upload.vue create mode 100644 src/components/forge/Forge.vue create mode 100644 src/components/forge/ForgeInfoModal.vue create mode 100644 src/components/forge/ForgeInfoModalChart.vue create mode 100644 src/components/forge/ForgeInfoModalCog.vue create mode 100644 src/components/forge/ForgeInfoModalDesktop.vue create mode 100644 src/components/forge/ForgeModal.vue create mode 100644 src/components/forge/ForgeModalContent.vue create mode 100644 src/components/forge/index.vue create mode 100644 src/components/navbar/Navbar.vue create mode 100644 src/components/navbar/NavbarBuilding.vue create mode 100644 src/components/navbar/NavbarItem.vue create mode 100644 src/constant/CalculateTableColumn.js create mode 100644 src/constant/api_app.js create mode 100644 src/constant/api_forge.js create mode 100644 src/constant/authPage.js create mode 100644 src/constant/calculateIcon.js create mode 100644 src/constant/colors.js create mode 100644 src/constant/index.js create mode 100644 src/directives/draggable.js create mode 100644 src/directives/focusPlugin.js create mode 100644 src/fontawsomeIconRegister.js create mode 100644 src/hooks/baja/useAlarmData.js create mode 100644 src/hooks/baja/useRefrigerantHeatMap.js create mode 100644 src/hooks/baja/useSystemHeatmap.js create mode 100644 src/hooks/baja/useSystemStatusByBaja.js create mode 100644 src/hooks/useActiveBtn.js create mode 100644 src/hooks/useDashboardOption.js create mode 100644 src/hooks/useFormErrorMessage.js create mode 100644 src/hooks/useGetCookie.js create mode 100644 src/hooks/useGetDevice.js create mode 100644 src/hooks/useSearchParam.js create mode 100644 src/lib/jquery-ui/AUTHORS.txt create mode 100644 src/lib/jquery-ui/LICENSE.txt create mode 100644 src/lib/jquery-ui/external/jquery/jquery.js create mode 100644 src/lib/jquery-ui/images/ui-icons_444444_256x240.png create mode 100644 src/lib/jquery-ui/images/ui-icons_555555_256x240.png create mode 100644 src/lib/jquery-ui/images/ui-icons_777620_256x240.png create mode 100644 src/lib/jquery-ui/images/ui-icons_777777_256x240.png create mode 100644 src/lib/jquery-ui/images/ui-icons_cc0000_256x240.png create mode 100644 src/lib/jquery-ui/images/ui-icons_ffffff_256x240.png create mode 100644 src/lib/jquery-ui/index.html create mode 100644 src/lib/jquery-ui/jquery-ui.css create mode 100644 src/lib/jquery-ui/jquery-ui.js create mode 100644 src/lib/jquery-ui/jquery-ui.min.css create mode 100644 src/lib/jquery-ui/jquery-ui.min.js create mode 100644 src/lib/jquery-ui/jquery-ui.structure.css create mode 100644 src/lib/jquery-ui/jquery-ui.structure.min.css create mode 100644 src/lib/jquery-ui/jquery-ui.theme.css create mode 100644 src/lib/jquery-ui/jquery-ui.theme.min.css create mode 100644 src/lib/jquery-ui/package.json create mode 100644 src/main.js create mode 100644 src/router/index.js create mode 100644 src/stores/useAlarmStore.js create mode 100644 src/stores/useBuildingStore.js create mode 100644 src/stores/useForgeDbIdStore.js create mode 100644 src/stores/useUserInfoStore.js create mode 100644 src/util/apiHandler.js create mode 100644 src/util/clearChart.js create mode 100644 src/util/downloadExcel.js create mode 100644 src/util/getModalPosition.js create mode 100644 src/util/hexToRgb.js create mode 100644 src/util/request.js create mode 100644 src/util/showChartLoading.js create mode 100644 src/views/AssetManagement/AssetManagement.vue create mode 100644 src/views/AssetManagement/components/AssetBuildFloorAddModal.vue create mode 100644 src/views/AssetManagement/components/AssetMainList.vue create mode 100644 src/views/AssetManagement/components/AssetSubList.vue create mode 100644 src/views/AssetManagement/components/AssetSubListAddModal.vue create mode 100644 src/views/AssetManagement/components/AssetTable.vue create mode 100644 src/views/AssetManagement/components/AssetTableAddModal.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeft.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfo.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftInfoIoT.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalLeftModule.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalRight.vue create mode 100644 src/views/AssetManagement/components/AssetTableModalRightInfo.vue create mode 100644 src/views/Test.vue create mode 100644 src/views/accountManagement/AccountManagement.vue create mode 100644 src/views/accountManagement/components/Account.vue create mode 100644 src/views/accountManagement/components/AccountModal.vue create mode 100644 src/views/accountManagement/components/AccountPasswordModal.vue create mode 100644 src/views/accountManagement/components/Role.vue create mode 100644 src/views/accountManagement/components/RoleAuthModal.vue create mode 100644 src/views/alert/AlertManagement.vue create mode 100644 src/views/alert/components/AlertQuery/AlertActionButton.vue create mode 100644 src/views/alert/components/AlertQuery/AlertQuery.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearch.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchAckBtns.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchNormalBtns.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchTimeRange.vue create mode 100644 src/views/alert/components/AlertQuery/AlertSearchTypesButton.vue create mode 100644 src/views/alert/components/AlertQuery/AlertTable.vue create mode 100644 src/views/alert/components/AlertQuery/AlertTableModal.vue create mode 100644 src/views/alert/components/AlertSetting/AlertNoticesTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertNotifyTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertNotifyTableAddModal.vue create mode 100644 src/views/alert/components/AlertSetting/AlertOutliersTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertOutliersTableAddModal.vue create mode 100644 src/views/alert/components/AlertSetting/AlertSetting.vue create mode 100644 src/views/alert/components/AlertSetting/AlertSubList.vue create mode 100644 src/views/alert/components/AlertSetting/AlertTimeTable.vue create mode 100644 src/views/alert/components/AlertSetting/AlertTimeTableAddModal.vue create mode 100644 src/views/dashboard/Dashboard.vue create mode 100644 src/views/dashboard/components/DashboardAlert.vue create mode 100644 src/views/dashboard/components/DashboardDescriptionCard.vue create mode 100644 src/views/dashboard/components/DashboardElectricity.vue create mode 100644 src/views/dashboard/components/DashboardEnergy.vue create mode 100644 src/views/dashboard/components/DashboardForgeOptionButton.vue create mode 100644 src/views/dashboard/components/DashboardForgeOptionCard.vue create mode 100644 src/views/dashboard/components/DashboardFormulaTemp.vue create mode 100644 src/views/dashboard/components/DashboardFrozenTemp.vue create mode 100644 src/views/dashboard/components/DashboardImmediateTemp.vue create mode 100644 src/views/dashboard/components/DashboardMoreModal.vue create mode 100644 src/views/dashboard/components/DashboardProduct.vue create mode 100644 src/views/dashboard/components/DashboardProductComplete.vue create mode 100644 src/views/dashboard/components/DashboardProductCompleteModal.vue create mode 100644 src/views/dashboard/components/DashboardProductCompleteModalRecord.vue create mode 100644 src/views/dashboard/components/DashboardProductCompleteModalTarget.vue create mode 100644 src/views/dashboard/components/DashboardTarget.vue create mode 100644 src/views/graphManagement/GraphManagement.vue create mode 100644 src/views/graphManagement/components/GraphModal.vue create mode 100644 src/views/graphManagement/components/GraphSidebar.vue create mode 100644 src/views/graphManagement/components/GraphSidebarDropdown.vue create mode 100644 src/views/graphManagement/components/GraphTable.vue create mode 100644 src/views/history/History.vue create mode 100644 src/views/history/components/HistoryActionButton.vue create mode 100644 src/views/history/components/HistoryFavoriteOption.vue create mode 100644 src/views/history/components/HistoryModal.vue create mode 100644 src/views/history/components/HistorySearch.vue create mode 100644 src/views/history/components/HistorySearchTime.vue create mode 100644 src/views/history/components/HistorySidebar.vue create mode 100644 src/views/history/components/HistoryTable.vue create mode 100644 src/views/login/Login.vue create mode 100644 src/views/operation/Operation.vue create mode 100644 src/views/operation/components/OperationActionButton.vue create mode 100644 src/views/operation/components/OperationSearch.vue create mode 100644 src/views/operation/components/OperationSearchSubSys.vue create mode 100644 src/views/operation/components/OperationSearchType.vue create mode 100644 src/views/operation/components/OperationTable.vue create mode 100644 src/views/operation/components/OperationTableModal.vue create mode 100644 src/views/operation/constant/OperationTableColumns.js create mode 100644 src/views/productSetting/ProductSetting.vue create mode 100644 src/views/productSetting/components/ProducSettingBtn.vue create mode 100644 src/views/productSetting/components/ProductSettingPointModal.vue create mode 100644 src/views/productSetting/components/ProductSettingTypeAddModal.vue create mode 100644 src/views/productSetting/components/ProductSettingTypeModal.vue create mode 100644 tailwind.config.js create mode 100644 vite.config.js diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..7fb6562 --- /dev/null +++ b/.env.development @@ -0,0 +1,3 @@ +VITE_API_BASEURL = "https://pccv-api.production.mjmtech.com.tw" +VITE_FILE_API_BASEURL = "" +VITE_FORGE_BASEURL = "http://localhost:5173" \ No newline at end of file diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..db3fc25 --- /dev/null +++ b/.env.production @@ -0,0 +1,3 @@ +VITE_API_BASEURL = "https://pccv-api.production.mjmtech.com.tw" +VITE_FILE_API_BASEURL = ".." +VITE_FORGE_BASEURL = "http://202.39.218.221:8080/file/netzero" \ No newline at end of file diff --git a/.env.staging b/.env.staging new file mode 100644 index 0000000..3a51cfe --- /dev/null +++ b/.env.staging @@ -0,0 +1,3 @@ +VITE_API_BASEURL = "http://220.132.206.5:8008" +VITE_FILE_API_BASEURL = "http://220.132.206.5:8085/file" +VITE_FORGE_BASEURL = "http://localhost:5173" \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1f8f13b --- /dev/null +++ b/.gitignore @@ -0,0 +1,26 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +/public/forge/* diff --git a/README.md b/README.md new file mode 100644 index 0000000..5df7063 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# ibms_netzero + +Node version: 18 \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..78bb417 --- /dev/null +++ b/index.html @@ -0,0 +1,26 @@ + + + + + + + + + 台灣百家珍釀造食品股份有限公司 + + + + + + +
+ + + + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..2422aba --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5553 @@ +{ + "name": "ibms_netzero", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ibms_netzero", + "version": "0.0.0", + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "@fortawesome/fontawesome-svg-core": "^1.2.36", + "@fortawesome/free-brands-svg-icons": "^5.15.4", + "@fortawesome/free-regular-svg-icons": "^5.15.4", + "@fortawesome/free-solid-svg-icons": "^5.15.4", + "@fortawesome/vue-fontawesome": "^3.0.5", + "@vuepic/vue-datepicker": "^8.0.0", + "ant-design-vue": "^4.0.7", + "axios": "^1.6.2", + "date-fns": "^3.3.1", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "echarts-liquidfill": "^3.1.0", + "pinia": "^2.1.7", + "requirejs": "^2.3.6", + "tailwind-merge": "^2.2.1", + "vue": "^3.3.4", + "vue-router": "^4.2.5", + "yup": "^1.4.0", + "yup-phone-lite": "^2.0.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.4.0", + "autoprefixer": "^10.4.16", + "daisyui": "^4.4.17", + "postcss": "^8.4.31", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "tailwindcss": "^3.3.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^4.4.11", + "vite-plugin-svg-icons": "^2.0.1" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.3.1.tgz", + "integrity": "sha512-4QBZg8ccyC6LPIRii7A0bZUk3+lEDCLnhB+FVsflGdcWPPmV+j3fire4AwwoqHV/BibgvBmR9ZIo4s867smv+g==" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.6", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.6.tgz", + "integrity": "sha512-pvFiLP2BeOKA/ZOS6jxx4XhKzdVLHDhGlFEaZ2flWWYf2xOqVniqpk38I04DFRyz+L0ASggl7SkItTc+ZLju4w==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.5.tgz", + "integrity": "sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.9", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz", + "integrity": "sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@fortawesome/fontawesome-common-types": { + "version": "0.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz", + "integrity": "sha512-a/7BiSgobHAgBWeN7N0w+lAhInrGxksn13uK7231n2m8EDPE3BMCl9NZLTGrj9ZXfCmC6LM0QLqXidIizVQ6yg==", + "hasInstallScript": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/fontawesome-svg-core": { + "version": "1.2.36", + "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-1.2.36.tgz", + "integrity": "sha512-YUcsLQKYb6DmaJjIHdDWpBIGCcyE/W+p/LMGvjQem55Mm2XWVAP5kWTMKWLv9lwpCVjpLxPyOMOyUocP1GxrtA==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-brands-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-5.15.4.tgz", + "integrity": "sha512-f1witbwycL9cTENJegcmcZRYyawAFbm8+c6IirLmwbbpqz46wyjbQYLuxOc7weXFXfB7QR8/Vd2u5R3q6JYD9g==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-regular-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-5.15.4.tgz", + "integrity": "sha512-9VNNnU3CXHy9XednJ3wzQp6SwNwT3XaM26oS4Rp391GsxVYA+0oDR2J194YCIWf7jNRCYKjUCOduxdceLrx+xw==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/free-solid-svg-icons": { + "version": "5.15.4", + "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-5.15.4.tgz", + "integrity": "sha512-JLmQfz6tdtwxoihXLg6lT78BorrFyCf59SAwBM6qV/0zXyVeDygJVb3fk+j5Qat+Yvcxp1buLTY5iDh1ZSAQ8w==", + "hasInstallScript": true, + "dependencies": { + "@fortawesome/fontawesome-common-types": "^0.2.36" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/@fortawesome/vue-fontawesome": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.5.tgz", + "integrity": "sha512-isZZ4+utQH9qg9cWxWYHQ9GwI3r5FeO7GnmzKYV+gbjxcptQhh+F99iZXi1Y9AvFUEgy8kRpAdvDlbb3drWFrw==", + "peerDependencies": { + "@fortawesome/fontawesome-svg-core": "~1 || ~6", + "vue": ">= 3.0.0 < 4" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.0.tgz", + "integrity": "sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/eslint": { + "version": "8.44.8", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.8.tgz", + "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "peer": true + }, + "node_modules/@types/node": { + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/svgo": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/@types/svgo/-/svgo-2.6.4.tgz", + "integrity": "sha512-l4cmyPEckf8moNYHdJ+4wkHvFxjyW6ulm9l4YGaOxeyBWPhBOT0gvni1InpFPdzx1dKf/2s62qGITwxNWnPQng==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.5.0.tgz", + "integrity": "sha512-a2WSpP8X8HTEww/U00bU4mX1QpLINNuz/2KMNpLsdu3BzOpak3AGI1CJYBTXcc4SPhaD0eNRUp7IyQK405L5dQ==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0 || ^5.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.9.tgz", + "integrity": "sha512-+/Lf68Vr/nFBA6ol4xOtJrW+BQWv3QWKfRwGSm70jtXwfhZNF4R/eRgyVJYoxFRhdCTk/F6g99BP0ffPgZihfQ==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.9.tgz", + "integrity": "sha512-nfWubTtLXuT4iBeDSZ5J3m218MjOy42Vp2pmKVuBKo2/BLcrFUX8nCSr/bKRFiJ32R8qbdnnnBgRn9AdU5v0Sg==", + "dependencies": { + "@vue/compiler-core": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.9.tgz", + "integrity": "sha512-wy0CNc8z4ihoDzjASCOCsQuzW0A/HP27+0MDSSICMjVIFzk/rFViezkR3dzH+miS2NDEz8ywMdbjO5ylhOLI2A==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/compiler-core": "3.3.9", + "@vue/compiler-dom": "3.3.9", + "@vue/compiler-ssr": "3.3.9", + "@vue/reactivity-transform": "3.3.9", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5", + "postcss": "^8.4.31", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.9.tgz", + "integrity": "sha512-NO5oobAw78R0G4SODY5A502MGnDNiDjf6qvhn7zD7TJGc8XDeIEw4fg6JU705jZ/YhuokBKz0A5a/FL/XZU73g==", + "dependencies": { + "@vue/compiler-dom": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/reactivity": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.9.tgz", + "integrity": "sha512-VmpIqlNp+aYDg2X0xQhJqHx9YguOmz2UxuUJDckBdQCNkipJvfk9yA75woLWElCa0Jtyec3lAAt49GO0izsphw==", + "dependencies": { + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.9.tgz", + "integrity": "sha512-HnUFm7Ry6dFa4Lp63DAxTixUp8opMtQr6RxQCpDI1vlh12rkGIeYqMvJtK+IKyEfEOa2I9oCkD1mmsPdaGpdVg==", + "dependencies": { + "@babel/parser": "^7.23.3", + "@vue/compiler-core": "3.3.9", + "@vue/shared": "3.3.9", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.5" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.9.tgz", + "integrity": "sha512-xxaG9KvPm3GTRuM4ZyU8Tc+pMVzcu6eeoSRQJ9IE7NmCcClW6z4B3Ij6L4EDl80sxe/arTtQ6YmgiO4UZqRc+w==", + "dependencies": { + "@vue/reactivity": "3.3.9", + "@vue/shared": "3.3.9" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.9.tgz", + "integrity": "sha512-e7LIfcxYSWbV6BK1wQv9qJyxprC75EvSqF/kQKe6bdZEDNValzeRXEVgiX7AHI6hZ59HA4h7WT5CGvm69vzJTQ==", + "dependencies": { + "@vue/runtime-core": "3.3.9", + "@vue/shared": "3.3.9", + "csstype": "^3.1.2" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.9.tgz", + "integrity": "sha512-w0zT/s5l3Oa3ZjtLW88eO4uV6AQFqU8X5GOgzq7SkQQu6vVr+8tfm+OI2kDBplS/W/XgCBuFXiPw6T5EdwXP0A==", + "dependencies": { + "@vue/compiler-ssr": "3.3.9", + "@vue/shared": "3.3.9" + }, + "peerDependencies": { + "vue": "3.3.9" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.9.tgz", + "integrity": "sha512-ZE0VTIR0LmYgeyhurPTpy4KzKsuDyQbMSdM49eKkMnT5X4VfFBLysMzjIZhLEFQYjjOVVfbvUDHckwjDFiO2eA==" + }, + "node_modules/@vuepic/vue-datepicker": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@vuepic/vue-datepicker/-/vue-datepicker-8.0.0.tgz", + "integrity": "sha512-0HsxG2GGTWzeitPVhIEFPHLyLwTU+VT0vk15JreqNi0cB6D5Mpf5vqHppJE0ech+ZTQx36Ip99oSfnQdA0SNrA==", + "dependencies": { + "date-fns": "^3.3.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/acorn": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "peer": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ant-design-vue": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.0.7.tgz", + "integrity": "sha512-oHTtc1GZkfENZTkt2aDvjaD4yoRsowYvCOmxA6+5AGqm5uz/datdJOXsq9nokIhC+vrAMhk6JQVFZ2hh7eU6Pw==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha512-YVIQ82gZPGBebQV/a8dar4AitzCQs0jjXwMPZllpXMaGjXPYVUawSxQrRsjhjupyVxEvbHgUmIhKVlND+j02kA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==" + }, + "node_modules/array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha512-SleRWjh9JUud2wH1hPs9rZBZ33H6T9HOiL0uwGnGx9FpE6wKGyfWugmbkEOIs6qWrZhg0LWeLziLrEwQJhs5mQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha512-Q+JC7Whu8HhmTdBph/Tq59IoRtoy6KAm5zzPv00WdujX82lbAL8K7WVjne7vdCsAmbF4AYaDOPyO3k0kl8qIrw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.16", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.16.tgz", + "integrity": "sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001538", + "fraction.js": "^4.3.6", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axios": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", + "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "dependencies": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/big.js": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true, + "peer": true + }, + "node_modules/cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "dependencies": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cache-base/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001565", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001565.tgz", + "integrity": "sha512-xrE//a3O7TP0vaJ8ikzkD2c2NgcVUvsEe2IvFTntV4Yd1Z9FVzh+gW+enX96L0psrbaFMcVcH2l90xNuGDWc8w==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dev": true, + "dependencies": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/class-utils/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/class-utils/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha512-lNkKvzEeMBBjUGHZ+q6z9pSJla0KWAQPvtzhEV9+iGyQYG+pBpl7xKDhxoNSOZH2hhv0v5k0y2yAM4o4SjoSkw==", + "dev": true, + "dependencies": { + "map-visit": "^1.0.0", + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-emitter": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", + "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha512-XgZ0pFcakEUlbwQEVNg3+QAis1FyTL3Qel9FYy8pSkQqoG3PNoT0bOCQtOXcOkur21r2Eq2kI+IE+gsmAEVlYw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/core-js": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.34.0.tgz", + "integrity": "sha512-aDdvlDder8QmY91H88GzNi9EtQi2TjvQhpCX6B1v/dAZHU1AuLgHvRh54RiOerpEhEW46Tkf+vgAViB/CWC0ag==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-select/node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/css-select/node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-select/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-select/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/css-tree": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", + "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", + "dev": true, + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dev": true, + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/culori": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/culori/-/culori-3.3.0.tgz", + "integrity": "sha512-pHJg+jbuFsCjz9iclQBqyL3B2HLCBF71BwVNujUYEvCeQMvV97R59MNK3R2+jgJ3a1fcZgI9B3vYgz8lzr/BFQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/daisyui": { + "version": "4.4.17", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-4.4.17.tgz", + "integrity": "sha512-vcxLKoWiqPjEtcBkSayi9sDW1kWgWRdy1GjSu3zNtMiCsXwqDpCzNkdijuY9RuJ/2tBCtnwxhBv72Yizfi7KAQ==", + "dev": true, + "dependencies": { + "css-selector-tokenizer": "^0.8", + "culori": "^3", + "picocolors": "^1", + "postcss-js": "^4" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/date-fns": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.3.1.tgz", + "integrity": "sha512-y8e109LYGgoQDveiEBD3DYXKba1jWf5BA8YU1FL5Tvm0BTdEfy54WLCwnuYWZNnzzvALy/QQ4Hov+Q9RVRv+Zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha512-cZTYKFWspt9jZsMscWo8sc/5lbPC9Q0N5nBLgb+Yd915iL3udB1uFgS3B8YCx66UVHq018DAVFoee7x+gxggeA==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==" + }, + "node_modules/dom-serializer": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", + "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "entities": "^2.0.0" + } + }, + "node_modules/dom-serializer/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/dom-serializer/node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==", + "dev": true + }, + "node_modules/domhandler": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz", + "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==", + "dev": true, + "dependencies": { + "domelementtype": "1" + } + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dev": true, + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/echarts": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/echarts/-/echarts-5.4.3.tgz", + "integrity": "sha512-mYKxLxhzy6zyTi/FaEbJMOZU1ULGEQHaeIeuMR5L+JnJTpz+YR03mnnpBhbR4+UYJAgiXgpyTVLffPAjOTLkZA==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.4" + } + }, + "node_modules/echarts-liquidfill": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/echarts-liquidfill/-/echarts-liquidfill-3.1.0.tgz", + "integrity": "sha512-5Dlqs/jTsdTUAsd+K5LPLLTgrbbNORUSBQyk8PSy1Mg2zgHDWm83FmvA4s0ooNepCJojFYRITTQ4GU1UUSKYLw==", + "license": "MIT", + "peerDependencies": { + "echarts": "^5.0.1" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.600", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.600.tgz", + "integrity": "sha512-KD6CWjf1BnQG+NsXuyiTDDT1eV13sKuYsOUioXkQweYTQIbgHkXPry9K7M+7cKtYHnSUPitVaLrXYB1jTkkYrw==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz", + "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==", + "dev": true + }, + "node_modules/es-module-lexer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", + "dev": true, + "peer": true + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "peer": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "peer": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "peer": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha512-w/ozOKR9Obk3qoWeY/WDi6MFta9AoMR+zud60mdnbniMcBxRuFJyDt2LdX/14A1UABeqk+Uk+LDfUpvoGKppZA==", + "dev": true, + "dependencies": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/expand-brackets/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/expand-brackets/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/expand-brackets/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dev": true, + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "dependencies": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "peer": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "peer": true + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha512-GMBAbW9antB8iZRHLoGw0b3HANt57diZYFO/HL1JGIC1MjKrdmhxvrJbupnVvpys0zsz7yBApXdQyfepKly2kA==", + "dev": true, + "dependencies": { + "map-cache": "^0.2.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha512-IBXk4GTsLYdQ7Rvt+GRBrFSVEkmuOUy4re0Xjd9kJSUQpnTrWR4/y9RpfexN9vkAPMFuQoeWKwqzPozRTlasGw==", + "dev": true, + "dependencies": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha512-ODYZC64uqzmtfGMEAX/FvZiRyWLpAC3vYnNunURUnkGVTS+mI0smVsWaPydRBsE3g+ok7h960jChO8mFcWlHaQ==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-values/node_modules/kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha512-24XsCxmEbRwEDbz/qz3stgin8TTzZ1ESR56OMCN0ujYg+vRutNSiOj9bHH9u85DKgXguraugV5sFuvbD4FW/hw==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/htmlparser2": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz", + "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==", + "dev": true, + "dependencies": { + "domelementtype": "^1.3.1", + "domhandler": "^2.3.0", + "domutils": "^1.5.1", + "entities": "^1.1.1", + "inherits": "^2.0.1", + "readable-stream": "^3.1.1" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "dev": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-accessor-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.1.tgz", + "integrity": "sha512-YBUanLI8Yoihw923YeFUS5fs0fF2f5TSFTNiYAAzhhDscDa3lEqYuz1pDOEP5KvX94I9ey3vsqjJcLVFVU+3QA==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-data-descriptor": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.1.tgz", + "integrity": "sha512-bc4NlCDiCr28U4aEsQ3Qs2491gVq4V8G7MQyws968ImqjKuYtTJXrl7Vq7jsN7Ly/C3xj5KWFrY7sHNeDkAzXw==", + "dev": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-descriptor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.3.tgz", + "integrity": "sha512-JCNNGbwWZEVaSPtS45mdtrneRWJFp07LLmykxeFV5F6oBvNF8vHSfJuJgoT472pSfk+Mf8VnlrspaFBHWM8JAw==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", + "dev": true + }, + "node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "peer": true + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/libphonenumber-js": { + "version": "1.10.60", + "resolved": "https://registry.npmjs.org/libphonenumber-js/-/libphonenumber-js-1.10.60.tgz", + "integrity": "sha512-Ctgq2lXUpEJo5j1762NOzl2xo7z7pqmVWYai0p07LvAkQ32tbPv3wb+tcUeHEiXhKU5buM4H9MXsXo6OlM6C2g==" + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz", + "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/magic-string": { + "version": "0.30.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.5.tgz", + "integrity": "sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha512-4y7uGv8bd2WdM9vpQsiQNo41Ln1NvhvDRuVt0k2JZQ+ezN2uaQes7lZeZ+QQUHOLQAtDaBJ+7wCbi+ab/KFs+w==", + "dev": true, + "dependencies": { + "object-visit": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mdn-data": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", + "dev": true + }, + "node_modules/merge-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-options/-/merge-options-1.0.1.tgz", + "integrity": "sha512-iuPV41VWKWBIOpBsjoxjDZw8/GbSfZ2mk7N1453bwMrfzdrIk7EzBd+8UVR6rkw67th7xnk9Dytl3J+lHPdxvg==", + "dev": true, + "dependencies": { + "is-plain-obj": "^1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "dependencies": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/mixin-deep/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanomatch/node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nanopop": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.3.0.tgz", + "integrity": "sha512-fzN+T2K7/Ah25XU02MJkPZ5q4Tj5FpjmIYq4rvoHX4yb16HzFdCO6JxFFn5Y/oBhQ8no8fUZavnyIv9/+xkBBw==" + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha512-79LYn6VAb63zgtmAteVOWo9Vdj71ZVBy3Pbse+VqxDpEP83XuujMrGqHIwAXJ5I/aM0zU7dIyIAhifVTPrNItQ==", + "dev": true, + "dependencies": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-copy/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-copy/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha512-GBaMwwAVK9qbQN3Scdo0OyvgPW7l3lnaVMj84uTOZlswkX0KpF6fyDBJhtTthf7pymztoN36/KEr1DyhF96zEA==", + "dev": true, + "dependencies": { + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-visit/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object.pick/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha512-XHXfu/yOQRy9vYOtUDVMN60OEJjW013GoObG1o+xwQTpB9eYJX/BjXMsdW13ZDPruFhYYn0AG22w0xgQMwl3Nw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/pathe": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-0.2.0.tgz", + "integrity": "sha512-sTitTPYnn23esFR3RlqYBWn4c45WGeLcsKzQiUpXJAyfcWkolvlYpV8FLo7JishK946oQwMFUCHXQ9AjGPKExw==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.7.tgz", + "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha512-xTgYBc3fuo7Yt7JbiuFxSYGToMoz8fLoE6TC9Wx1P/u+LfeThMOAqmuyECnlBaaJb+u1m9hHiXUEtwW4OzfUJg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss": { + "version": "8.4.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", + "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.0.0.tgz", + "integrity": "sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==", + "dev": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-prefix-selector": { + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.0.tgz", + "integrity": "sha512-rdVMIi7Q4B0XbXqNUEI+Z4E+pueiu/CS5E6vRCQommzdQ/sgsS4dK42U7GX8oJR+TJOtT+Qv3GkNo6iijUMp3Q==", + "dev": true, + "peerDependencies": { + "postcss": ">4 <9" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/posthtml": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.9.2.tgz", + "integrity": "sha512-spBB5sgC4cv2YcW03f/IAUN1pgDJWNWD8FzkyY4mArLUMJW+KlQhlmUdKAHQuPfb00Jl5xIfImeOsf6YL8QK7Q==", + "dev": true, + "dependencies": { + "posthtml-parser": "^0.2.0", + "posthtml-render": "^1.0.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/posthtml-parser": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.2.1.tgz", + "integrity": "sha512-nPC53YMqJnc/+1x4fRYFfm81KV2V+G9NZY+hTohpYg64Ay7NemWWcV4UWuy/SgMupqQ3kJ88M/iRfZmSnxT+pw==", + "dev": true, + "dependencies": { + "htmlparser2": "^3.8.3", + "isobject": "^2.1.0" + } + }, + "node_modules/posthtml-rename-id": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/posthtml-rename-id/-/posthtml-rename-id-1.0.12.tgz", + "integrity": "sha512-UKXf9OF/no8WZo9edRzvuMenb6AD5hDLzIepJW+a4oJT+T/Lx7vfMYWT4aWlGNQh0WMhnUx1ipN9OkZ9q+ddEw==", + "dev": true, + "dependencies": { + "escape-string-regexp": "1.0.5" + } + }, + "node_modules/posthtml-render": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.4.0.tgz", + "integrity": "sha512-W1779iVHGfq0Fvh2PROhCe2QhB8mEErgqzo1wpIt36tCgChafP+hbXIhLDOM8ePJrZcFs0vkNEtdibEWVqChqw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/posthtml-svg-mode": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/posthtml-svg-mode/-/posthtml-svg-mode-1.0.3.tgz", + "integrity": "sha512-hEqw9NHZ9YgJ2/0G7CECOeuLQKZi8HjWLkBaSVtOWjygQ9ZD8P7tqeowYs7WrFdKsWEKG7o+IlsPY8jrr0CJpQ==", + "dev": true, + "dependencies": { + "merge-options": "1.0.1", + "posthtml": "^0.9.2", + "posthtml-parser": "^0.2.1", + "posthtml-render": "^1.0.6" + } + }, + "node_modules/property-expr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.6.tgz", + "integrity": "sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha512-O2XLNDBIg1DnTOa+2XrIwSiXEV8h2KImXUnjhhn2+UsvZ+Es2uyd5CCRTNQlDGbzUQOW3aYCBx9rVA6dzsiY7Q==", + "dev": true, + "dependencies": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/regex-not/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-element": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.4.tgz", + "integrity": "sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/requirejs": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz", + "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==", + "bin": { + "r_js": "bin/r.js", + "r.js": "bin/r.js" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated", + "dev": true + }, + "node_modules/ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha512-aJXcif4xnaNUzvUuC5gcb46oTS7zvg4jpMTnuqtrEPlR3vFr4pxtdTwaF1Qs3Enjn9HK+ZlwQui+a7z0SywIzg==", + "dev": true, + "dependencies": { + "ret": "~0.1.10" + } + }, + "node_modules/sass": { + "version": "1.69.5", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.69.5.tgz", + "integrity": "sha512-qg2+UCJibLr2LCVOt3OlPhr/dqVHWOa9XtZf2OjbLs/T4VPSJ00udtgJxH3neXZm+QqX8B+3cU7RaLqp1iVfcQ==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-loader": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", + "dev": true, + "dependencies": { + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", + "sass": "^1.3.0", + "sass-embedded": "*", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + } + } + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/set-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==" + }, + "node_modules/snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "dependencies": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "dependencies": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-node/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "dependencies": { + "kind-of": "^3.2.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon-util/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/snapdragon/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/snapdragon/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/snapdragon/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + }, + "node_modules/snapdragon/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated", + "dev": true + }, + "node_modules/split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "dependencies": { + "extend-shallow": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/split-string/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", + "dev": true + }, + "node_modules/static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha512-72E9+uLc27Mt718pMHt9VMNiAL4LMsmDbBva8mxWUCkT07fSzEGMYUCk0XWY6lp0j6RBAG4cJ3mWuZv2OE3s0g==", + "dev": true, + "dependencies": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha512-Rr7ADjQZenceVOAKop6ALkkRAmH1A4Gx9hV/7ZujPUN2rkATqFO0JZLZInbAjpZYoJ1gUx8MRMQVkYemcbMSTA==", + "dev": true, + "dependencies": { + "is-descriptor": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/static-extend/node_modules/is-descriptor": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.7.tgz", + "integrity": "sha512-C3grZTvObeN1xud4cRWl366OMXZTj0+HGyk4hvfpx4ZHt1Pb60ANSXqCK7pdOTeUQpRzECBSTphqvD7U+l22Eg==", + "dev": true, + "dependencies": { + "is-accessor-descriptor": "^1.0.1", + "is-data-descriptor": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha512-R3f198pcvnB+5IpnBlRkphuE9n46WyVl8I39W/ZUTZLz4nqSP/oLYUrcnJrw462Ds8he4YKMov2efsTIw1BDGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dev": true, + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylis": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.0.tgz", + "integrity": "sha512-E87pIogpwUsUwXw7dNyU4QDjdgVMy52m+XEOPEKUn161cCzWjjhPSQhByfd1CcNvrOLnXQ6OnnZDwnJrz/Z4YQ==" + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-baker": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/svg-baker/-/svg-baker-1.7.0.tgz", + "integrity": "sha512-nibslMbkXOIkqKVrfcncwha45f97fGuAOn1G99YwnwTj8kF9YiM6XexPcUso97NxOm6GsP0SIvYVIosBis1xLg==", + "dev": true, + "dependencies": { + "bluebird": "^3.5.0", + "clone": "^2.1.1", + "he": "^1.1.1", + "image-size": "^0.5.1", + "loader-utils": "^1.1.0", + "merge-options": "1.0.1", + "micromatch": "3.1.0", + "postcss": "^5.2.17", + "postcss-prefix-selector": "^1.6.0", + "posthtml-rename-id": "^1.0", + "posthtml-svg-mode": "^1.0.3", + "query-string": "^4.3.2", + "traverse": "^0.6.6" + } + }, + "node_modules/svg-baker/node_modules/braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "dependencies": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha512-VcpLTWqWDiTerugjj8e3+esbg+skS3M9e54UuR3iCeIDMXCLTsAH8hTSzDQU/X6/6t3eYkOKoZSef2PlU6U1XQ==", + "dev": true, + "dependencies": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha512-DyYHfIYwAJmjAjSSPKANxI8bFY9YtFrgkAfinBojQ8YJTOuOuav64tMUJv584SES4xl74PmuaevIyaLESHdTAA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha512-4cboCqIpliH+mAvFNegjZQ4kgKc3ZUhQVr3HvWbSh5q3WH2v82ct+T2Y1hdU5Gdtorx/cLifQjqCbL7bpznLTg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/is-number/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/micromatch": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.0.tgz", + "integrity": "sha512-3StSelAE+hnRvMs8IdVW7Uhk8CVed5tp+kLLGlBP6WiRAXS21GPGu/Nat4WNPXj2Eoc24B02SaeoyozPMfj0/g==", + "dev": true, + "dependencies": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.2.2", + "define-property": "^1.0.0", + "extend-shallow": "^2.0.1", + "extglob": "^2.0.2", + "fragment-cache": "^0.2.1", + "kind-of": "^5.0.2", + "nanomatch": "^1.2.1", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/postcss": { + "version": "5.2.18", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz", + "integrity": "sha512-zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==", + "dev": true, + "dependencies": { + "chalk": "^1.1.3", + "js-base64": "^2.1.9", + "source-map": "^0.5.6", + "supports-color": "^3.2.3" + }, + "engines": { + "node": ">=0.12" + } + }, + "node_modules/svg-baker/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svg-baker/node_modules/supports-color": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz", + "integrity": "sha512-Jds2VIYDrlp5ui7t8abHN2bjAu4LV/q4N2KivFPpGH0lrka0BMq/33AmECUXlKPcHigkNaqfXRENFju+rlcy+A==", + "dev": true, + "dependencies": { + "has-flag": "^1.0.0" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/svg-baker/node_modules/to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha512-ZZWNfCjUokXXDGXFpZehJIkZqq91BcULFq/Pi7M5i4JnxXdhMKAK682z8bCW3o8Hj1wuuzoKcW3DfVzaP6VuNg==", + "dev": true, + "dependencies": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/svgo": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", + "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", + "dev": true, + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tailwind-merge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.2.1.tgz", + "integrity": "sha512-o+2GTLkthfa5YUt4JxPfzMIpQzZ3adD1vLVkvKE1Twl9UAhGsEbIZhHHZVRttyW177S8PDJI3bTQNaebyofK3Q==", + "dependencies": { + "@babel/runtime": "^7.23.7" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.5", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.5.tgz", + "integrity": "sha512-5SEZU4J7pxZgSkv7FP1zY8i2TIAOooNZ1e/OGtxIEv6GltpoiXUqWvLy89+a10qYTB1N5Ifkuw9lqQkN9sscvA==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.19.1", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true, + "peer": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throttle-debounce": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.0.tgz", + "integrity": "sha512-2iQTSgkkc1Zyk0MeVrt/3BvuOXYPl/R8Z0U2xxo9rjwNciaHDG3R+Lm6dh4EeUci49DanvBnuqI6jshoQQRGEg==", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tiny-case": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-case/-/tiny-case-1.0.3.tgz", + "integrity": "sha512-Eet/eeMhkO6TX8mnUteS9zgPbUMQa4I6Kkp5ORiBD5476/m+PIRiumP5tmh5ioJpH7k51Kehawy2UDfsnxxY8Q==" + }, + "node_modules/to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha512-9mWHdnGRuh3onocaHzukyvCZhzvr6tiflAy/JRFXcJX0TjgfWA9pk9t8CMbzmBE4Jfw58pXbkngtBtqYxzNEyg==", + "dev": true, + "dependencies": { + "kind-of": "^3.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-object-path/node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dev": true, + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "dependencies": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/to-regex/node_modules/define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "dependencies": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha512-BwY5b5Ql4+qZoefgMj2NUmx+tehVTH/Kf4k1ZEtOHNFcm2wSxMRo992l6X3TIgni2eZVTZ85xMOjF31fwZAj6Q==", + "dev": true, + "dependencies": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "dependencies": { + "is-plain-object": "^2.0.4" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/toposort": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz", + "integrity": "sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==" + }, + "node_modules/traverse": { + "version": "0.6.8", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.8.tgz", + "integrity": "sha512-aXJDbk6SnumuaZSANd21XAo15ucCDE38H4fkqiGsc3MhCK+wOlZvLP9cB/TvpHT0mOyWgC4Z8EwRlzqYSUzdsA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz", + "integrity": "sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, + "node_modules/union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "dependencies": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unplugin": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.5.1.tgz", + "integrity": "sha512-0QkvG13z6RD+1L1FoibQqnvTwVBXvS4XSPwAyinVgoOCl2jAgwzdUKmEj05o4Lt8xwQI85Hb6mSyYkcAGwZPew==", + "dev": true, + "dependencies": { + "acorn": "^8.11.2", + "chokidar": "^3.5.3", + "webpack-sources": "^3.2.3", + "webpack-virtual-modules": "^0.6.0" + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.26.0.tgz", + "integrity": "sha512-s7IdPDlnOvPamjunVxw8kNgKNK8A5KM1YpK5j/p97jEKTjlPNrA0nZBiSfAKKlK1gWZuyWXlKL5dk3EDw874LQ==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.6", + "@rollup/pluginutils": "^5.0.4", + "chokidar": "^3.5.3", + "debug": "^4.3.4", + "fast-glob": "^3.3.1", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.3", + "minimatch": "^9.0.3", + "resolve": "^1.22.4", + "unplugin": "^1.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/unplugin-vue-components/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha512-PcA2tsuGSF9cnySLHTLSh2qrQiJ70mn+r+Glzxv2TWZblxsxCC52BDlZoPCsz7STd9pN7EZetkWZBAvk4cgZdQ==", + "dev": true, + "dependencies": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha512-gpG936j8/MzaeID5Yif+577c17TxaDmhuyVgSwtnL/q8UUTySg8Mecb+8Cf1otgLoD7DDH75axp86ER7LFsf3Q==", + "dev": true, + "dependencies": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-value/node_modules/isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha512-+OUdGJlgjOBZDfxnDjYYG6zp487z0JGNQq3cYQYg5f5hKR+syHMsaztzGeml/4kGG55CSpKSpWTY+jYGgsHLgA==", + "dev": true, + "dependencies": { + "isarray": "1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha512-J8S0cEdWuQbqD9//tlZxiMuMNmxB8PlEwvYwuxsTmR1G5RXUePEX/SJn7aD0GMLieuZYSwNH0cQuJGwnYunXRQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/unset-value/node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "peer": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated", + "dev": true + }, + "node_modules/use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vite": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.0.tgz", + "integrity": "sha512-ulr8rNLA6rkyFAlVWw2q5YJ91v098AFQ2R0PRFwPzREXOUJQPtFUG0t+/ZikhaOCDqFoDhN6/v8Sq0o4araFAw==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-svg-icons": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/vite-plugin-svg-icons/-/vite-plugin-svg-icons-2.0.1.tgz", + "integrity": "sha512-6ktD+DhV6Rz3VtedYvBKKVA2eXF+sAQVaKkKLDSqGUfnhqXl3bj5PPkVTl3VexfTuZy66PmINi8Q6eFnVfRUmA==", + "dev": true, + "dependencies": { + "@types/svgo": "^2.6.1", + "cors": "^2.8.5", + "debug": "^4.3.3", + "etag": "^1.8.1", + "fs-extra": "^10.0.0", + "pathe": "^0.2.0", + "svg-baker": "1.7.0", + "svgo": "^2.8.0" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vue": { + "version": "3.3.9", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.9.tgz", + "integrity": "sha512-sy5sLCTR8m6tvUk1/ijri3Yqzgpdsmxgj6n6yl7GXXCXqVbmW2RCXe9atE4cEI6Iv7L89v5f35fZRRr5dChP9w==", + "dependencies": { + "@vue/compiler-dom": "3.3.9", + "@vue/compiler-sfc": "3.3.9", + "@vue/runtime-dom": "3.3.9", + "@vue/server-renderer": "3.3.9", + "@vue/shared": "3.3.9" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.2.5.tgz", + "integrity": "sha512-DIUpKcyg4+PTQKfFPX88UWhlagBEBEfJ5A8XDXRJLUnZOvcpMF8o/dnL90vpVkGaPbjvXazV/rC1qBKrZlFugw==", + "dependencies": { + "@vue/devtools-api": "^6.5.0" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz", + "integrity": "sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.4.tgz", + "integrity": "sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yup": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/yup/-/yup-1.4.0.tgz", + "integrity": "sha512-wPbgkJRCqIf+OHyiTBQoJiP5PFuAXaWiJK6AmYkzQAh5/c2K9hzSApBZG5wV9KoKSePF7sAxmNSvh/13YHkFDg==", + "dependencies": { + "property-expr": "^2.0.5", + "tiny-case": "^1.0.3", + "toposort": "^2.0.2", + "type-fest": "^2.19.0" + } + }, + "node_modules/yup-phone-lite": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/yup-phone-lite/-/yup-phone-lite-2.0.1.tgz", + "integrity": "sha512-IV8q5VSq3MqVDm58ZyPSrtKfVtl+Z5N8UxWdEP573Nk09MLrF6drReOjUX6OggL0ByTMLO+z8r/L8taftUCGyw==", + "dependencies": { + "libphonenumber-js": "^1.10.18" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "yup": ">0.32.0" + } + }, + "node_modules/zrender": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.4.4.tgz", + "integrity": "sha512-0VxCNJ7AGOMCWeHVyTrGzUgrK4asT4ml9PEkeGirAkKNYXYzoPJCLvmyfdoOXcjTHPs10OZVMfD1Rwg16AZyYw==", + "dependencies": { + "tslib": "2.3.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..f262e17 --- /dev/null +++ b/package.json @@ -0,0 +1,45 @@ +{ + "name": "ibms_netzero", + "version": "0.0.0", + "private": true, + "homepage": "/netzero", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "@fortawesome/fontawesome-svg-core": "^1.2.36", + "@fortawesome/free-brands-svg-icons": "^5.15.4", + "@fortawesome/free-regular-svg-icons": "^5.15.4", + "@fortawesome/free-solid-svg-icons": "^5.15.4", + "@fortawesome/vue-fontawesome": "^3.0.5", + "@vuepic/vue-datepicker": "^8.0.0", + "ant-design-vue": "^4.0.7", + "axios": "^1.6.2", + "date-fns": "^3.3.1", + "dayjs": "^1.11.10", + "echarts": "^5.4.3", + "echarts-liquidfill": "^3.1.0", + "pinia": "^2.1.7", + "requirejs": "^2.3.6", + "tailwind-merge": "^2.2.1", + "vue": "^3.3.4", + "vue-router": "^4.2.5", + "yup": "^1.4.0", + "yup-phone-lite": "^2.0.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^4.4.0", + "autoprefixer": "^10.4.16", + "daisyui": "^4.4.17", + "postcss": "^8.4.31", + "sass": "^1.69.5", + "sass-loader": "^13.3.2", + "tailwindcss": "^3.3.5", + "unplugin-vue-components": "^0.26.0", + "vite": "^4.4.11", + "vite-plugin-svg-icons": "^2.0.1" + } +} diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..a5a6ff8 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,7 @@ +module.exports = { + plugins: { + "postcss-import": {}, + tailwindcss: {}, + autoprefixer: {}, + }, +}; diff --git a/public/background.jpg b/public/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..c48a33743aec9b84402c936064a50d15fdf407a3 GIT binary patch literal 344909 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≫_8jFU7FzJaTHe+6_ycUvO_3<3!NaA1c5?9 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

2o&*8qx-skl?JeSg9*X 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


yQjV)cQ`S<1Biq-69A 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⋑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 literal 0 HcmV?d00001 diff --git a/public/hotspot.svg b/public/hotspot.svg new file mode 100644 index 0000000..2b2249a --- /dev/null +++ b/public/hotspot.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f3cba73f8b0b7770692203c6bdbcd5bc9bd93c73 GIT binary patch literal 25085 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 z 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 + + + + + + + + + + + + + + + + + + + + + diff --git a/public/setting.html b/public/setting.html new file mode 100644 index 0000000..fd3c8b8 --- /dev/null +++ b/public/setting.html @@ -0,0 +1,15 @@ + + + + + + 百家珍 + + + + + diff --git a/src/App.vue b/src/App.vue new file mode 100644 index 0000000..689e491 --- /dev/null +++ b/src/App.vue @@ -0,0 +1,67 @@ + + + + + diff --git a/src/apis/account/api.js b/src/apis/account/api.js new file mode 100644 index 0000000..8ae9418 --- /dev/null +++ b/src/apis/account/api.js @@ -0,0 +1,14 @@ +export const GET_ACCOUNT_USERLIST_API = `/User/UserManagerList`; + +export const GET_ACCOUNT_ROLELIST_API = `/User/RoleManagerList`; +export const GET_ACCOUNT_ROLEAUTHLIST_API = `/User/RoleAuthList`; +export const GET_ACCOUNT_ROLEAUTHPAGELIST_API = `/User/AuthPageListByVariable`; + +// export const POST_ROLEAUTHLIST_API = `/User/SaveRoleAuth`; + +export const POST_ACCOUNT_ROLE_API = `/User/SaveRoleAndAuth`; +export const DELETE_ACCOUNT_ROLE_API = `/User/DeleteOneRole`; + +export const GET_ACCOUNT_USER_API = `/User/GetOneUser`; +export const POST_ACCOUNT_USER_API = `/User/SaveUser`; +export const DELETE_ACCOUNT_USER_API = `/User/DeleteOneUser`; diff --git a/src/apis/account/index.js b/src/apis/account/index.js new file mode 100644 index 0000000..210b375 --- /dev/null +++ b/src/apis/account/index.js @@ -0,0 +1,158 @@ +import { + GET_ACCOUNT_USERLIST_API, + GET_ACCOUNT_ROLELIST_API, + GET_ACCOUNT_ROLEAUTHLIST_API, + GET_ACCOUNT_ROLEAUTHPAGELIST_API, + DELETE_ACCOUNT_ROLE_API, + POST_ACCOUNT_ROLE_API, + POST_ACCOUNT_USER_API, + GET_ACCOUNT_USER_API, + DELETE_ACCOUNT_USER_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getAccountUserList = async (search_condition = {}) => { + const res = await instance.post(GET_ACCOUNT_USERLIST_API, search_condition); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountRoleList = async (search_condition = {}) => { + const res = await instance.post(GET_ACCOUNT_ROLELIST_API, { + Layer: 1, + ...search_condition, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountRoleAuthList = async (SelectedRoleId) => { + const res = await instance.post(GET_ACCOUNT_ROLEAUTHLIST_API, { + SelectedRoleId, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountRoleAuthPageList = async () => { + const res = await instance.post(GET_ACCOUNT_ROLEAUTHPAGELIST_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAccountRole = async ({ Id, Name, SaveCheckAuth }) => { + const res = await instance.post(POST_ACCOUNT_ROLE_API, { + Id, + Name, + SaveCheckAuth, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const delRole = async (Id) => { + const res = await instance.post(DELETE_ACCOUNT_ROLE_API, { + Id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccountOneUser = async (Id) => { + const res = await instance.post(GET_ACCOUNT_USER_API, { + Id, + }); + + res.data = { + Account: res.data?.account, + Name: res.data?.full_name, + Email: res.data?.email, + Phone: res.data?.phone, + RoleId: res.data?.role_guid, + Id, + }; + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAccountUser = async ({ + Id, + Account, + Name, + Email, + Phone, + RoleId, + Password, +}) => { + const res = await instance.post( + POST_ACCOUNT_USER_API, + Id + ? { + Id: Id, + Account, + Name, + Email, + Phone, + RoleId, + } + : { + Id: "0", + Account, + Name, + Email, + Phone, + RoleId, + Password, + } + ); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const changePassword = async ({ Id, Password }) => { + const res = await instance.post(POST_ACCOUNT_USER_API, { + Id, + Password, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const delAccount = async (Id) => { + const res = await instance.post(DELETE_ACCOUNT_USER_API, { + Id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/alert/api.js b/src/apis/alert/api.js new file mode 100644 index 0000000..3bf0021 --- /dev/null +++ b/src/apis/alert/api.js @@ -0,0 +1,22 @@ +export const POST_ACK_API = `/obix/alarm`; +export const GET_ALERT_FORMID_API = `/Alert/AlertList`; +export const POST_OPERATION_RECORD_API = `/operation/SavOpeRecord`; + +export const GET_ALERT_SUB_LIST_API = `api/Device/GetMainSub`; + +export const GET_ALERT_MEMBER_LIST_API = `api/Alarm/GetAlarmMemberList`; +export const GET_ALERT_MEMBER = `api/Alarm/GetAlarmMember`; +export const POST_ALERT_MEMBER = `api/Alarm/SaveAlarmMember`; +export const DELETE_ALERT_MEMBER = `api/Alarm/DeleteAlarmMember`; +export const GET_NOTICE_LIST_API = `api/Alarm/GetNotice`; +export const GET_SHOW_ALERT_API = `api/Alarm/GetShowAlarm`; // 取得告警顯示清單 + +export const GET_OUTLIERS_LIST_API = `api/Alarm/GetAlarmSetting`; +export const GET_OUTLIERS_DEVLIST_API = `api/Alarm/GetDevList`; // 取得設備 +export const GET_OUTLIERS_POINTS_API = `api/Alarm/GetAlarmPoints`; // 取得點位 +export const POST_OUTLIERS_SETTING_API = `api/Alarm/SaveAlarmSetting`; // 新增與修改 +export const DELETE_OUTLIERS_SETTING_API = `api/Alarm/DeleteAlarmSetting`; // 刪除 + +export const GET_ALERT_SCHEDULE_LIST_API = `api/Alarm/GetAlarmSchedule`; +export const POST_ALERT_SCHEDULE = `api/Alarm/SaveAlarmSchedule`; +export const DELETE_ALERT_SCHEDULE = `api/Alarm/DeleteAlarmSchedule`; \ No newline at end of file diff --git a/src/apis/alert/index.js b/src/apis/alert/index.js new file mode 100644 index 0000000..796f356 --- /dev/null +++ b/src/apis/alert/index.js @@ -0,0 +1,214 @@ +import { + POST_ACK_API, + GET_ALERT_FORMID_API, + POST_OPERATION_RECORD_API, + GET_ALERT_SUB_LIST_API, + GET_OUTLIERS_LIST_API, + GET_OUTLIERS_DEVLIST_API, + GET_OUTLIERS_POINTS_API, + POST_OUTLIERS_SETTING_API, + DELETE_OUTLIERS_SETTING_API, + GET_ALERT_MEMBER_LIST_API, + GET_ALERT_MEMBER, + POST_ALERT_MEMBER, + DELETE_ALERT_MEMBER, + GET_NOTICE_LIST_API, + GET_SHOW_ALERT_API, + GET_ALERT_SCHEDULE_LIST_API, + POST_ALERT_SCHEDULE, + DELETE_ALERT_SCHEDULE +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import axios from "axios"; + +export const postChgAck = async (uuid) => { + try { + const data = + ''; + const res = await axios.post(`${POST_ACK_API}/${uuid}/ack`, data, { + headers: { + "Content-Type": "text/plain", + }, + }); + + // 解析XML錯誤信息 + const parser = new DOMParser(); + const xmlDoc = parser.parseFromString(res.data, "text/xml"); + const errElement = xmlDoc.querySelector("err"); + + if (errElement) { + console.error("Error in acknowledging alarm"); + return { isSuccess: false, msg: `Error in acknowledging alarm` }; + } + + return { isSuccess: true }; + } catch (error) { + console.error("Error in acknowledging alarm:", error); + return { isSuccess: false, msg: "Error in acknowledging alarm" }; + } +}; + +export const getAlertFormId = async (uuid) => { + const res = await instance.post(GET_ALERT_FORMID_API, uuid); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postOperationRecord = async (formData) => { + const res = await instance.post(POST_OPERATION_RECORD_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlertSubList = async () => { + const res = await instance.post(GET_ALERT_SUB_LIST_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlarmMemberList = async () => { + const res = await instance.post(GET_ALERT_MEMBER_LIST_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getNoticeList = async () => { + const res = await instance.post(GET_NOTICE_LIST_API, {}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAlertMember = async (data) => { + const res = await instance.post(POST_ALERT_MEMBER, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAlarmMember = async (id) => { + try { + const res = await instance.post(DELETE_ALERT_MEMBER, { id }); + console.log("Delete Alarm Member Response:", res); + return { + isSuccess: res.code === "0000", + msg: res.msg || "刪除成功", + }; + } catch (error) { + console.error("API request failed", error); + return { isSuccess: false, msg: "API request failed" }; + } +}; + +export const getAlarmMember = async (data) => { + try { + const res = await instance.post(GET_ALERT_MEMBER, data); + return res.data; + } catch (error) { + console.error("API request failed", error); + return { isSuccess: false, msg: "API request failed" }; + } +}; + +export const getOutliersList = async (id) => { + const res = await instance.post(GET_OUTLIERS_LIST_API, id); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOutliersDevList = async (id) => { + const res = await instance.post(GET_OUTLIERS_DEVLIST_API, id); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOutliersPoints = async (id) => { + const res = await instance.post(GET_OUTLIERS_POINTS_API, id); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postOutliersSetting = async (data) => { + const res = await instance.post(POST_OUTLIERS_SETTING_API, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const delOutliersSetting = async (Id) => { + const res = await instance.post(DELETE_OUTLIERS_SETTING_API, { + Id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getShowAlarm = async () => { + const res = await instance.post(GET_SHOW_ALERT_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAlarmScheduleList = async () => { + const res = await instance.post(GET_ALERT_SCHEDULE_LIST_API,{}); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAlertSchedule = async (data) => { + const res = await instance.post(POST_ALERT_SCHEDULE, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAlarmSchedule = async (id) => { + try { + const res = await instance.post(DELETE_ALERT_SCHEDULE, { id }); + return { + isSuccess: res.code === "0000", + msg: res.msg || "刪除成功", + }; + } catch (error) { + console.error("API request failed", error); + return { isSuccess: false, msg: "API request failed" }; + } +}; \ No newline at end of file diff --git a/src/apis/asset/api.js b/src/apis/asset/api.js new file mode 100644 index 0000000..8b67be3 --- /dev/null +++ b/src/apis/asset/api.js @@ -0,0 +1,19 @@ +export const GET_ASSET_SUB_LIST_API = `/AssetManage/GetAssetSubList`; +export const GET_ASSET_MAIN_LIST_API = `/AssetManage/GetAssetMainList`; +export const POST_ASSET_SUB_LIST_API = `/AssetManage/SaveAssetSub`; +export const DELETE_ASSET_SUB_LIST_API = `/AssetManage/DeleteAssetSub`; + +export const GET_ASSET_LIST_API = `/AssetManage/GetAssetList`; +export const GET_ASSET_SINGLE_API = `/AssetManage/GetAsset`; +export const POST_ASSET_SINGLE_API = `/AssetManage/SaveAsset`; +export const DELETE_ASSET_ITEM_API = `/AssetManage/DeleteAsset`; + +export const GET_ASSET_BUILD_LIST_API = `/AssetManage/GetBuildingList`; +export const POST_ASSET_BUILD_API = `AssetManage/SaveBuilding`; +export const DELETE_ASSET_BUILD_API = `AssetManage/DeleteBuilding`; + +export const GET_ASSET_FLOOR_LIST_API = `/AssetManage/GetFloorList`; +export const POST_ASSET_FLOOR_API = `/AssetManage/SaveFloor`; +export const DELETE_ASSET_FLOOR_API = `/AssetManage/DeleteFloor`; + +export const GET_ASSET_IOT_LIST_API = `/AssetManage/GetIOTList`; diff --git a/src/apis/asset/index.js b/src/apis/asset/index.js new file mode 100644 index 0000000..a07bb39 --- /dev/null +++ b/src/apis/asset/index.js @@ -0,0 +1,187 @@ +import { + GET_ASSET_SUB_LIST_API, + GET_ASSET_MAIN_LIST_API, + DELETE_ASSET_SUB_LIST_API, + POST_ASSET_SUB_LIST_API, + GET_ASSET_LIST_API, + GET_ASSET_SINGLE_API, + GET_ASSET_BUILD_LIST_API, + POST_ASSET_BUILD_API, + DELETE_ASSET_BUILD_API, + GET_ASSET_FLOOR_LIST_API, + POST_ASSET_FLOOR_API, + DELETE_ASSET_FLOOR_API, + GET_ASSET_IOT_LIST_API, + DELETE_ASSET_ITEM_API, + POST_ASSET_SINGLE_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import { object } from "yup"; + +export const getAssetSubList = async () => { + const res = await instance.post(GET_ASSET_SUB_LIST_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetMainList = async () => { + const res = await instance.post(GET_ASSET_MAIN_LIST_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetSubList = async ({ + system_key, + // system_value, + // system_parent_id, + id, +}) => { + const res = await instance.post(POST_ASSET_SUB_LIST_API, { + system_key, + // system_value, + // system_parent_id, + id, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAssetSubItem = async (id) => { + const res = await instance.post(DELETE_ASSET_SUB_LIST_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetList = async (variable_id) => { + const res = await instance.post(GET_ASSET_LIST_API, { + variable_id: parseInt(variable_id), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetSingle = async (main_id) => { + const res = await instance.post(GET_ASSET_SINGLE_API, { main_id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetSingle = async (data) => { + let formData = new FormData(); + + for (let [key, value] of Object.entries(data)) { + console.log(key, value); + if (Array.isArray(value)) { + if (key === "oriFile") { + value.forEach((element, index) => { + formData.append(`${key}[${index}].file`, element.id ? null : element); + formData.append(`${key}[${index}].orgName`, element.name); + formData.append( + `${key}[${index}].saveName`, + element.id ? element.saveName : "" + ); + }); + } else { + value.forEach((element, index) => { + formData.append(`${key}[${index}].device_guid`, element); + }); + } + } else { + formData.append(key, value); + } + } + + const res = await instance.post(POST_ASSET_SINGLE_API, formData); + return apihandler(res.code, res.data, { msg: res.msg, code: res.code }); +}; + +export const deleteAssetItem = async (main_id) => { + const res = await instance.post(DELETE_ASSET_ITEM_API, { main_id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetBuildList = async () => { + const res = await instance.post(GET_ASSET_BUILD_LIST_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetBuild = async (formData) => { + const res = await instance.post(POST_ASSET_BUILD_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAssetBuild = async (building_guid) => { + const res = await instance.post(DELETE_ASSET_BUILD_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetFloorList = async (building_guid) => { + const res = await instance.post(GET_ASSET_FLOOR_LIST_API, { building_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postAssetFloor = async (formData) => { + const res = await instance.post(POST_ASSET_FLOOR_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteAssetFloor = async (Floor_guid) => { + const res = await instance.post(DELETE_ASSET_FLOOR_API, { Floor_guid }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAssetIOTList = async () => { + const res = await instance.post(GET_ASSET_IOT_LIST_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/building/api.js b/src/apis/building/api.js new file mode 100644 index 0000000..a7a5027 --- /dev/null +++ b/src/apis/building/api.js @@ -0,0 +1,4 @@ +export const GET_BUILDING_API = `/api/Device/GetBuild`; +export const GET_AUTHPAGE_API = `/api/GetUsrFroList`; +export const GET_SUBAUTHPAGE_API = `/api/Device/GetMainSub`; +export const GET_ALL_DEVICE_API = `/api/Device/GetAllDevice`; diff --git a/src/apis/building/index.js b/src/apis/building/index.js new file mode 100644 index 0000000..9576c46 --- /dev/null +++ b/src/apis/building/index.js @@ -0,0 +1,67 @@ +import { + GET_BUILDING_API, + GET_AUTHPAGE_API, + GET_SUBAUTHPAGE_API, + GET_ALL_DEVICE_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getBuildings = async () => { + const res = await instance.post(GET_BUILDING_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAuth = async () => { + const res = await instance.post(GET_AUTHPAGE_API); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAllSysSidebar = async () => { + const res = await instance.post(GET_SUBAUTHPAGE_API, { + building_tag: "", + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getSysSidebar = async (building_tag) => { + const res = await instance.post(GET_SUBAUTHPAGE_API, { + building_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAllDevice = async () => { + const res = await instance.post(GET_ALL_DEVICE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const ackSingleAlarm = async (uuid) => { + const res = await instance.post( + `/obix/alarm/${uuid}/ack`, + '' + ); + console.log("acked", res); + return apihandler(res.code, res, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/dashboard/api.js b/src/apis/dashboard/api.js new file mode 100644 index 0000000..b7a5f6b --- /dev/null +++ b/src/apis/dashboard/api.js @@ -0,0 +1,9 @@ +export const GET_DASHBOARD_INIT_API = `/SituationRoom/Initialize`; +export const GET_DASHBOARD_DEVICE_API = `/SituationRoom/GetDeviceList`; +export const GET_DASHBOARD_PRODUCT_COMPLETE_API = `/SituationRoom/GetProductionStatus`; +export const GET_DASHBOARD_TEMP_API = `/SituationRoom/GetTempratureData`; +export const GET_DASHBOARD_ROOM_TEMP_API = `/SituationRoom/GetFormulaRoomStatusData`; +export const GET_DASHBOARD_ENERGY_API = `/SituationRoom/GetEnergeData`; +export const POST_DASHBOARD_PRODUCT_TARGET_SETTING_API = `/SituationRoom/SetTargetSetting`; +export const GET_DASHBOARD_PRODUCT_TARGET_SETTING_API = `/SituationRoom/GetTargetSetting` +export const GET_DASHBOARD_PRODUCT_HISTORY_API = `/SituationRoom/GetProductionHistory` \ No newline at end of file diff --git a/src/apis/dashboard/index.js b/src/apis/dashboard/index.js new file mode 100644 index 0000000..1f64f20 --- /dev/null +++ b/src/apis/dashboard/index.js @@ -0,0 +1,137 @@ +import { + GET_DASHBOARD_INIT_API, + GET_DASHBOARD_DEVICE_API, + GET_DASHBOARD_PRODUCT_COMPLETE_API, + GET_DASHBOARD_TEMP_API, + GET_DASHBOARD_ROOM_TEMP_API, + GET_DASHBOARD_ENERGY_API, + POST_DASHBOARD_PRODUCT_TARGET_SETTING_API, + GET_DASHBOARD_PRODUCT_TARGET_SETTING_API, + GET_DASHBOARD_PRODUCT_HISTORY_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export const getDashboardInit = async (page_type = "SR") => { + const res = await instance.post(GET_DASHBOARD_INIT_API, { + page_type, // SR:戰情室;PS:生產設定 + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardDevice = async ({ option }) => { + const res = await instance.post(GET_DASHBOARD_DEVICE_API, { + option: parseInt(option), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardProductCompletion = async () => { + const res = await instance.post(GET_DASHBOARD_PRODUCT_COMPLETE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardEnergy = async () => { + const res = await instance.post(GET_DASHBOARD_ENERGY_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardFormulaRoom = async ({ timeInterval, typeOption }) => { + const res = await instance.post(GET_DASHBOARD_ROOM_TEMP_API, { + timeInterval, + typeOption, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardTemp = async ({ + timeInterval, + tempOption, + typeOption = "", +}) => { + const res = typeOption + ? await instance.post(GET_DASHBOARD_TEMP_API, { + timeInterval, + tempOption, + typeOption, + }) + : await instance.post(GET_DASHBOARD_TEMP_API, { + timeInterval, + tempOption, + }); + console.log(res); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postDashboardProductTarget = async ({ date, type, data }) => { + let formatData = []; + + for (let [key, value] of Object.entries(data)) { + formatData.push({ + name: key, + value, + }); + } + + const res = await instance.post(POST_DASHBOARD_PRODUCT_TARGET_SETTING_API, { + target: { + date, + type, + data: formatData, + }, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardProductTarget = async ({ date, type }) => { + const res = await instance.post(GET_DASHBOARD_PRODUCT_TARGET_SETTING_API, { + target: { + date, + type, + }, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getDashboardProductRecord = async ({ start_time, end_time }) => { + const res = await instance.post(GET_DASHBOARD_PRODUCT_HISTORY_API, { + start_time, + end_time, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + diff --git a/src/apis/forge/api.js b/src/apis/forge/api.js new file mode 100644 index 0000000..fa01175 --- /dev/null +++ b/src/apis/forge/api.js @@ -0,0 +1,3 @@ +export const GET_FORGETOKEN_API = `/api/forge/oauth/token`; + +export const GET_FORGEURN_API = `/api/Device/GetBuild`; diff --git a/src/apis/forge/index.js b/src/apis/forge/index.js new file mode 100644 index 0000000..d13d4bb --- /dev/null +++ b/src/apis/forge/index.js @@ -0,0 +1,24 @@ +import instance from "@/util/request"; +import { GET_FORGETOKEN_API, GET_FORGEURN_API } from "./api"; +import apihandler from "@/util/apihandler"; + +export const getUrn = async () => { + const res = await instance.post(GET_FORGEURN_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getAccessToken = async (callback) => { + try { + const resp = await instance.get(GET_FORGETOKEN_API); + console.log(resp) + const { dictionary } = resp; + callback(dictionary.access_token, dictionary.expires_in); + } catch (err) { + alert("Could not obtain access token. See the console for more details."); + console.error(err); + } +}; diff --git a/src/apis/graph/api.js b/src/apis/graph/api.js new file mode 100644 index 0000000..427ae7c --- /dev/null +++ b/src/apis/graph/api.js @@ -0,0 +1,16 @@ +// graph +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const GET_GRAPH_SIDEBAR_API = `/GraphManage/GraphManageTreeList`; + +export const UPDATE_GRAPH_SIDEBAR_API = `/GraphManage/EditGraphManageTree`; +export const REMOVE_GRAPH_SIDEBAR_API = `/GraphManage/DelGraphManageTree`; +export const POST_GRAPH_SIDEBAR_API = `/GraphManage/SaveGraphManageTree`; + +export const GET_GRAPH_PARAM_OPTION_API = `/GraphManage/GraManSpecList`; + +export const GET_GRAPH_TABLE_API = `/GraphManage/GraManList`; +export const POST_GRAPH_TABLE_API = `/GraphManage/SaveGraMan`; +export const POST_GRAPH_TABLE_API_2 = `/GraphManage/SaveGraMan`; // 原先沒有小類及規格的 +export const UPDATE_GRAPH_TABLE_API = `/GraphManage/EdtOneGraMan`; + +export const DELETE_GRAPH_TABLE_API = `/GraphManage/DelOneGraMan`; diff --git a/src/apis/graph/index.js b/src/apis/graph/index.js new file mode 100644 index 0000000..d3deb75 --- /dev/null +++ b/src/apis/graph/index.js @@ -0,0 +1,122 @@ +import { + GET_GRAPH_SIDEBAR_API, + UPDATE_GRAPH_SIDEBAR_API, + REMOVE_GRAPH_SIDEBAR_API, + POST_GRAPH_SIDEBAR_API, + GET_GRAPH_TABLE_API, + GET_GRAPH_PARAM_OPTION_API, + POST_GRAPH_TABLE_API, + DELETE_GRAPH_TABLE_API, + POST_GRAPH_TABLE_API_2, + UPDATE_GRAPH_TABLE_API +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apiHandler"; + +export const getSideBar = async () => { + const res = await instance.post(GET_GRAPH_SIDEBAR_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const addSideBarTreeName = async ({ parent_id, name }) => { + const res = await instance.post(POST_GRAPH_SIDEBAR_API, { parent_id, name }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const updateSideBarTreeName = async ({ id, name }) => { + const res = await instance.post(UPDATE_GRAPH_SIDEBAR_API, { id, name }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const removeSideBarTreeName = async (id) => { + const res = await instance.post(REMOVE_GRAPH_SIDEBAR_API, { id }); + + return apihandler( + res.code, + { isSuccess: true }, + { + msg: res.msg, + code: res.code, + isSuccess: false, + } + ); +}; + +// 中間 table +export const getGraphData = async (id) => { + const res = await instance.post(GET_GRAPH_TABLE_API, { layer_id: id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const getGraphAddParamOption = async () => { + const res = await instance.post(GET_GRAPH_PARAM_OPTION_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const addGraphTableData = async (formData) => { + const res = await instance.post(POST_GRAPH_TABLE_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const delGraphData = async (id) => { + const res = await instance.post(DELETE_GRAPH_TABLE_API, { id }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + + +export const addGraphTableDataWithoutSubSys = async (formData) => { + const res = await instance.post(POST_GRAPH_TABLE_API_2, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const editGraphTableDataWithoutSubSys = async (formData) => { + const res = await instance.post(UPDATE_GRAPH_TABLE_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + + + + + diff --git a/src/apis/history/api.js b/src/apis/history/api.js new file mode 100644 index 0000000..64de717 --- /dev/null +++ b/src/apis/history/api.js @@ -0,0 +1,11 @@ +// history +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const GET_HISTORY_SIDEBAR_API = `/api/History/GetDeviceInfo`; +export const GET_HISTORY_POINT_API = `/api/History/GetAllDevPoi`; +export const GET_HISTORY_DATA_API = `/api/History/GetHistoryData`; +export const GET_HISTORY_EXPORT_API = `/api/ExportHistoryExcel`; + +export const GET_HISTORY_FAVORITE_API = `/api/History/GetHistoryFavorite`; +export const POST_HISTORY_FAVORITE_API = `/api/History/SaveHistoryFavorite`; +export const DELETE_HISTORY_FAVORITE_API = `/api/History/DeleteHistoryFavorite`; +export const UPDATE_HISTORY_FAVORITE_API = `/api/History/EditHistoryFavorite`; diff --git a/src/apis/history/index.js b/src/apis/history/index.js new file mode 100644 index 0000000..4210540 --- /dev/null +++ b/src/apis/history/index.js @@ -0,0 +1,173 @@ +import { + GET_HISTORY_SIDEBAR_API, + GET_HISTORY_POINT_API, + GET_HISTORY_DATA_API, + GET_HISTORY_FAVORITE_API, + POST_HISTORY_FAVORITE_API, + DELETE_HISTORY_FAVORITE_API, + UPDATE_HISTORY_FAVORITE_API, + GET_HISTORY_EXPORT_API, +} from "./api"; +import instance, { fileInstance } from "@/util/request"; +import apihandler from "@/util/apiHandler"; +import downloadExcel from "@/util/downloadExcel"; + +export const getHistorySideBar = async (sub_system_tag) => { + const res = await instance.post(GET_HISTORY_SIDEBAR_API, { + sub_system_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getHistoryPoints = async ({ Device_list, Cumulant }) => { + const res = await instance.post(GET_HISTORY_POINT_API, { + Device_list, + value_type: parseInt(Cumulant), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getHistoryData = async ({ + Type, + Cumulant, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, +}) => { + /* + { + Type, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, + } + */ + const res = await instance.post(GET_HISTORY_DATA_API, { + Start_date, + End_date, + Start_time, + End_time, + Device_list: Array.isArray(Device_list) ? Device_list : [Device_list], + Points: Array.isArray(Points) ? Points : [Points], + Type: parseInt(Type), + value_type: parseInt(Cumulant), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getHistoryExportData = async ({ + Type, + Cumulant, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, +}) => { + /* + { + Type, + Start_date, + End_date, + Start_time, + End_time, + Device_list, + Points, + } + */ + const res = await fileInstance.post( + GET_HISTORY_EXPORT_API, + { + // ...exportContent, + Start_date: Start_date, + End_date: End_date, + Start_time: Start_time, + End_time: End_time, + Points: Array.isArray(Points) ? Points : [Points], + Device_list: Array.isArray(Device_list) ? Device_list : [Device_list], + Type: parseInt(Type), + value_type: parseInt(Cumulant), + Building_tag_list: [...new Set(Device_list.map((d) => d.split("_")[1]))], + }, + { responseType: "blob" } + ); + + return apihandler( + res.code, + res, + { + msg: res.msg, + code: res.code, + }, + downloadExcel + ); +}; + +export const getHistoryFavorite = async () => { + const res = await instance.post(GET_HISTORY_FAVORITE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const addHistoryFavorite = async (value) => { + const res = await instance.post(POST_HISTORY_FAVORITE_API, { + device_name_tag: value.sub_system_tag, + Device_list: Array.isArray(value.Device_list) + ? value.Device_list + : [value.Device_list], + Points: Array.isArray(value.Points) ? value.Points : [value.Points], + favorite_name: value.favorite_name, + Type: parseInt(value.Type), + value_type: parseInt(value.Cumulant), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteHistoryFavorite = async (favorite_guid) => { + const res = await instance.post(DELETE_HISTORY_FAVORITE_API, { + favorite_guid, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const editHistoryFavorite = async ({ favorite_guid, favorite_name }) => { + const res = await instance.post(UPDATE_HISTORY_FAVORITE_API, { + favorite_guid, + favorite_name, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/login/api.js b/src/apis/login/api.js new file mode 100644 index 0000000..f145d28 --- /dev/null +++ b/src/apis/login/api.js @@ -0,0 +1 @@ +export const POST_LOGIN = `/api/LoginV2/`; diff --git a/src/apis/login/index.js b/src/apis/login/index.js new file mode 100644 index 0000000..8c01c49 --- /dev/null +++ b/src/apis/login/index.js @@ -0,0 +1,23 @@ +import { POST_LOGIN } from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; + +export async function Login({ account, password }) { + const res = await instance.post(POST_LOGIN, { + account, + password, + }); + + if (res.code === "0000") { + console.log(res.data); + document.cookie = `JWT-Authorization=${res.data.token}; Max-Age=${ + 24 * 60 * 60 * 1000 + }`; + } + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +} diff --git a/src/apis/operation/api.js b/src/apis/operation/api.js new file mode 100644 index 0000000..ae51f10 --- /dev/null +++ b/src/apis/operation/api.js @@ -0,0 +1,16 @@ +export const GET_OPERATION_RECORD_API = `/operation/OpeRecList`; +export const GET_OPERATION_EXPORT_API = `/operation/OpeExportExcel`; +export const GET_OPERATION_DEVICELIST_API = `/operation/DevList`; +export const GET_OPERATION_COMPANYLIST_API = `/operation/OpeFirSel`; + +export const GET_SINGLE_OPERATION_RECORD_API = `/operation/OpeRecRead`; +export const GET_OPERATION_FORMID_API = `/operation/GetFormId`; // 新增單號前置 +export const POST_OPERATION_RECORD_API = `/operation/SavOpeRecord`; +export const DELETE_OPERATION_RECORD_API = `/operation/DelOpeRecord`; + +// 廠商 +export const GET_OPERATION_COMPANY_API = `/operation/OpeFirList`; // 廠商列表 +export const GET_OPERATION_SINGLE_CONPANY_API = `/operation/OpeFirRead`; // 單一廠商 +export const POST_OPERATION_COMPANY_API = `/operation/SaveOpeFirm`; +export const UPDATE_OPERATION_COMPANY_API = `/operation/EdtOneOpeFirm`; +export const DELETE_OPERATION_COMPANY_API = `/operation/DelOpeFirm`; diff --git a/src/apis/operation/index.js b/src/apis/operation/index.js new file mode 100644 index 0000000..c7c9d1b --- /dev/null +++ b/src/apis/operation/index.js @@ -0,0 +1,190 @@ +import { + GET_OPERATION_RECORD_API, + GET_OPERATION_COMPANY_API, + GET_SINGLE_OPERATION_RECORD_API, + GET_OPERATION_DEVICELIST_API, + POST_OPERATION_RECORD_API, + GET_OPERATION_EXPORT_API, + GET_OPERATION_FORMID_API, + DELETE_OPERATION_RECORD_API, + POST_OPERATION_COMPANY_API, + UPDATE_OPERATION_COMPANY_API, + DELETE_OPERATION_COMPANY_API, +} from "./api"; +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import dayjs from "dayjs"; + +export const getOperationRecord = async ({ + work_type, + start_created_at, + end_created_at, + serial_number, + sub_system_tag, +}) => { + const res = await instance.post(GET_OPERATION_RECORD_API, { + work_type: parseInt(work_type), + // start_created_at: dayjs(start_created_at).format("YYYY-MM-DDTHH:mm:ss"), + // end_created_at: dayjs(end_created_at) + // .date(dayjs(end_created_at).get("date") + 1) + // .format("YYYY-MM-DDTHH:mm:ss"), + serial_number: serial_number || null, + main_system_tag: null, + sub_system_tag: + typeof sub_system_tag === "string" ? [sub_system_tag] : sub_system_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationExportRecord = async ({ + work_type, + start_created_at, + end_created_at, +}) => { + const res = await instance.post(GET_OPERATION_EXPORT_API, { + work_type: parseInt(work_type), + startdate: dayjs(start_created_at).format("YYYY-MM-DDTHH:mm:ss"), + enddate: dayjs(end_created_at) + .date(dayjs(end_created_at).get("date") + 1) + .format("YYYY-MM-DDTHH:mm:ss"), + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationCompanyList = async () => { + const res = await instance.post(GET_OPERATION_COMPANY_API, { + sub_system_tag: [], + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationDeviceList = async ({ + list_sub_system_tag, + device_building_tag, + device_area_tag, +}) => { + const res = await instance.post(GET_OPERATION_DEVICELIST_API, { + list_sub_system_tag: + typeof list_sub_system_tag === "string" + ? [list_sub_system_tag] + : list_sub_system_tag, + device_building_tag, + device_area_tag, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationEditRecord = async (formId) => { + const res = await instance.post(GET_SINGLE_OPERATION_RECORD_API, { + formId, + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const postOperationRecord = async (formData) => { + const res = await instance.post(POST_OPERATION_RECORD_API, formData); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const getOperationFormId = async () => { + const res = await instance.post(GET_OPERATION_FORMID_API, {}); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteOperationRecord = async (id) => { + const res = await instance.post(DELETE_OPERATION_RECORD_API, { id }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +// 公司 +export const postOperationCompany = async ({ + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, +}) => { + const res = await instance.post(POST_OPERATION_COMPANY_API, { + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const updateOperationCompany = async ({ + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, + id, +}) => { + const res = await instance.post(UPDATE_OPERATION_COMPANY_API, { + id, + name, + contact_person, + phone, + email, + city, + address, + tax_id_number, + remark, + }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; + +export const deleteOperationCompany = async (id) => { + const res = await instance.post(DELETE_OPERATION_COMPANY_API, { id }); + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + }); +}; diff --git a/src/apis/productSetting/api.js b/src/apis/productSetting/api.js new file mode 100644 index 0000000..d19a40d --- /dev/null +++ b/src/apis/productSetting/api.js @@ -0,0 +1,4 @@ +export const POST_SETTING_POINT_API = `/SituationRoom/SetPointSetting`; + +export const GET_SETTING_TYPE_API = `/SituationRoom/GetProducts`; +export const POST_SETTING_TYPE_API = `/SituationRoom/SetProduct`; diff --git a/src/apis/productSetting/index.js b/src/apis/productSetting/index.js new file mode 100644 index 0000000..1ed4d46 --- /dev/null +++ b/src/apis/productSetting/index.js @@ -0,0 +1,45 @@ +import instance from "@/util/request"; +import apihandler from "@/util/apihandler"; +import { + POST_SETTING_POINT_API, + GET_SETTING_TYPE_API, + POST_SETTING_TYPE_API, +} from "./api"; + +export const postProductSettingPoint = async (type, devices) => { + const res = await instance.post(POST_SETTING_POINT_API, { + devices: devices.map(({ device_number }) => device_number), + values: [ + { + point: "Type", + value: type.value, + }, + ], + }); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const getProductSettingType = async () => { + const res = await instance.post(GET_SETTING_TYPE_API); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; + +export const postProductSettingType = async (data) => { + const res = await instance.post(POST_SETTING_TYPE_API, data); + + return apihandler(res.code, res.data, { + msg: res.msg, + code: res.code, + isSuccess: false, + }); +}; diff --git a/src/assets/base.css b/src/assets/base.css new file mode 100644 index 0000000..09140d1 --- /dev/null +++ b/src/assets/base.css @@ -0,0 +1,89 @@ +/* color palette from */ +:root { + --primary: #6fdda8; + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-dark-1); + + --section-gap: 160px; + +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + +} diff --git a/src/assets/btn.css b/src/assets/btn.css new file mode 100644 index 0000000..9071e94 --- /dev/null +++ b/src/assets/btn.css @@ -0,0 +1,56 @@ +/**區域框**/ +.area-box { + /* width: 100%; */ + border-radius: 10px; + display: flex; + align-items: center; + flex-wrap: wrap; + color: #fff; +} + +.area-box .item { + display: flex; + align-items: center; + flex-wrap: wrap; + color: #fff; + margin: 0; +} + +.area-box .item button:last-child::after { + display: none; +} + +.area-box .item button::after { + content: ""; + position: absolute; + top: 0; + bottom: 0; + right: -15px; + margin: auto; + display: block; + width: 15px; + height: 1px; + background-color: #a1ffd6; + z-index: -1; +} + +.area-box .item button { + position: relative; + z-index: 1; + border-radius: 5px; + margin: 0 7px; + background-color: #021422; + padding: 0.5rem 0; + min-width: 65px; + color: #fff; + border: 1px solid #a1ffd6 !important; + text-align: center; + margin-bottom: 15px; + padding: 0 5px; +} + +.area-box .item button.active { + background-color: #6fdda8; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.9); + box-shadow: 0px 0px 5px rgba(255, 255, 255, 0.8); +} diff --git a/src/assets/img/background.jpg b/src/assets/img/background.jpg new file mode 100644 index 0000000000000000000000000000000000000000..34e5bee71e30806dc025f9f7292e23532e973db7 GIT binary patch literal 6444 zcmbVQy>A>v6o0d~m#ohp+6xyE*(t^mmM&80=-IPO6NGe0LrQ~8O~F4fmW)K10=Yw) zM5ISn3QB__ffA6?@zvxnpy3ZNzu%kP*}c8J^EprU&exmwJ#XIJ#h(}d%I@Uo%g?`% zBPSxJCwVXFT|+m*#XoW)8(Frwws~`7vBxdP8&ZLXN}`qO9ncq<4L8lC$|N zp2+!|;ml5KesiNebAIu+Z1jvthP@#W{@eZIag*CjKdDCRWAu_&MHt`nXsrywND?P~ zbI|7$kevRBj5EoIFvw4DpS)(T6I?YrV&_2-hEp`48U`dN4pUgBr4!I zDL&o(j!T`OQgB7Z9*{IZHOfN6F_amNa|q$eflz#3$SGHo6Kj6`guO0^W}=|7UIZMP z2P>))3a0_gV|3uBBL#Q_Wp)%8%<1z#o zJK1wwf09j$#jc2EQVwUO$5bPwq#Up|>gOd3Q_yO(l7%LK@&2QJntk<7!NEL44sfAJ zzch?;u&N5TK<56vsD!6-G4DN4bTwx?O>l z0BVvE9S%?@yU4*~=Ip%oH3T3B8_ed@$pqs?N~meE8gkS6`|JW>3fh{A5kRur*Osf} zeVG;xoo-ifMS*fxuGZjPCBdfLI!=mdp^@9^3XO8&(e~2HO)ohIfC>BS{8|inJYh}P z=~$4(0qSc_wVl3*EHr{z8P<~k0H>@k%?#`G)MaA0$^@IMI?1iB4CROfP!5%^RioP1 zJao0Mp_fdVPSOInv4i&`|(&qL5#rx{}zjh8}{|k2~t&u62wu^5UqU8yA9j5 z;VMW@eStf!8gRAYYd6Z(*SK8G@drd|f~^KB`15ka@U=lP^muz-o?^Mxiu`!PvDbjC z>O<0{DfS+Zy8{k%V=%x{R@M&D!?}aEHF%+B^5#D08W34-U zL2P`htwjhmtSX19bRvhkCSY7Wd{xC0&K)Og>psN}YBrX`mJ*S}rT3{hfT1kNfIj~q z@9cd_7VtTWwxbpk$0Y(i+^PU6ErIRw3J_%h5e*niv4{nurgk@sPqnq-yce^7jFY2; zFeudBX>_+t_k+9f#a({wz;jmx(N-$+dJ*R78my>l=<cJ>LWI-Rc%L5m1 zSPgWfDMqa#@adw*62={?!?LvSzfsP#>#b9Y8JL+5L{aYtsZM9 z$fWI5vUB=@Zi?ngIG%O##fllvr_i&~RXh*CzU4DeYJwLCR5Wi8~PrS=>w4w=j6D!LAXlv9sVRawm+ z1W`nMsvn7Tsjd(-)t=)E!dij);EnhrQFwG?(ZY~Kl1XL7Fv%&kvB>k#*Z8ufqJip? z2P=O$2u`)oO*x!Y7dz=;Hh@R7(l0FSsBJs|W}_CeIS^HzXoJL6)N0NmK34!d(Xl}A z9K*n|K&W%=p2MC~?$`~6(yU=QLFn_-Otw}@ah4?ON^0ErIZa);IBbL9mLv#o6}F-5 zALNa93@clZE8{jKKSu@xkN;LJrK(~2YH@2xsEpfL9%}ll#qCqQB|z|`D{c)~wQM!! z)Z4}F9v + + + + + + + + + diff --git a/src/assets/img/pagination/small-btn02.svg b/src/assets/img/pagination/small-btn02.svg new file mode 100644 index 0000000..131fed5 --- /dev/null +++ b/src/assets/img/pagination/small-btn02.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/assets/img/table/content-box-background01.svg b/src/assets/img/table/content-box-background01.svg new file mode 100644 index 0000000..ac04bca --- /dev/null +++ b/src/assets/img/table/content-box-background01.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background02.svg b/src/assets/img/table/content-box-background02.svg new file mode 100644 index 0000000..634a8e7 --- /dev/null +++ b/src/assets/img/table/content-box-background02.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background03.svg b/src/assets/img/table/content-box-background03.svg new file mode 100644 index 0000000..325068e --- /dev/null +++ b/src/assets/img/table/content-box-background03.svg @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background04.svg b/src/assets/img/table/content-box-background04.svg new file mode 100644 index 0000000..3034171 --- /dev/null +++ b/src/assets/img/table/content-box-background04.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/content-box-background05.svg b/src/assets/img/table/content-box-background05.svg new file mode 100644 index 0000000..a99f849 --- /dev/null +++ b/src/assets/img/table/content-box-background05.svg @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/img/table/large-btn.svg b/src/assets/img/table/large-btn.svg new file mode 100644 index 0000000..60f7df9 --- /dev/null +++ b/src/assets/img/table/large-btn.svg @@ -0,0 +1,18 @@ + + + + + + + + + + + + + diff --git a/src/assets/img/table/large-btn02.svg b/src/assets/img/table/large-btn02.svg new file mode 100644 index 0000000..4ac0476 --- /dev/null +++ b/src/assets/img/table/large-btn02.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/assets/img/table/small-btn.svg b/src/assets/img/table/small-btn.svg new file mode 100644 index 0000000..4aab060 --- /dev/null +++ b/src/assets/img/table/small-btn.svg @@ -0,0 +1,14 @@ + + + + + + + + + + diff --git a/src/assets/img/table/small-btn02.svg b/src/assets/img/table/small-btn02.svg new file mode 100644 index 0000000..131fed5 --- /dev/null +++ b/src/assets/img/table/small-btn02.svg @@ -0,0 +1,9 @@ + + + + + + diff --git a/src/assets/index.css b/src/assets/index.css new file mode 100644 index 0000000..b6ae254 --- /dev/null +++ b/src/assets/index.css @@ -0,0 +1,68 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer components { + .arrow { + @apply relative triangle flex justify-center items-center text-lg; + box-shadow: inset 0px 6px 10px -10px rgba(255, 255, 255, 0.8), + inset 0px -6px 10px -10px rgba(255, 255, 255, 0.8); + } + + .triangle { + @apply after:block after:absolute after:bottom-0 after:left-[100%] + after:border-t-[1rem] after:border-b-[1rem] after:border-l-[2rem] + after:border-t-transparent after:border-b-transparent after:z-50; + } + .triangle-dark { + @apply after:border-l-info; + } + + .triangle-light { + @apply after:border-l-success; + } + .item button { + @apply hover:bg-active !important; + } + /* table */ + .content-box-background { + background: linear-gradient( + 180deg, + rgba(127, 237, 193, 0.1), + rgba(0, 0, 0, 0), + rgba(127, 237, 193, 0.1) + ); + } +} + +@layer utilities { + .btn{ + @apply px-4 py-1; + text-shadow: 0px 0px 5px rgba(0, 0, 0, 0.9); + box-shadow: 0px 0px 5px rgba(255, 255, 255, 0.8); + } + + .btn-success { + @apply text-white border border-active bg-active hover:bg-[theme("colors.green.500")] + } + + .btn-info { + @apply text-white border border-info bg-info hover:bg-[theme("colors.sky.400")] + } + + .btn-outline-success { + @apply text-white border border-active hover:bg-active bg-transparent + } + + .btn-outline-info { + @apply text-white border border-info hover:bg-info bg-transparent + } + + .custom-border { + @apply border border-info rounded-md; + } + + .btn-text-without-border { + @apply active:border-0 focus:border-0 focus-visible:border-0 active:outline-none focus:outline-none focus-visible:outline-none; + } +} \ No newline at end of file diff --git a/src/assets/logo.svg b/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/assets/main.css b/src/assets/main.css new file mode 100644 index 0000000..563f00d --- /dev/null +++ b/src/assets/main.css @@ -0,0 +1,29 @@ +@import "./base.css"; + +#app { + overflow: hidden; + font-weight: normal; + background-color: theme("colors.body"); + background-image: url("./img/background.jpg"); + background-size: cover; + color: #fff; + min-height: 100dvh; +} + +::-webkit-scrollbar { + width: 5px !important; + height: 8px !important; +} + +/* Track */ +::-webkit-scrollbar-track { + box-shadow: inset 0 0 5px grey; + border-radius: 10px; +} + +/* Handle */ +::-webkit-scrollbar-thumb { + background: theme("colors.info"); + border-radius: 10px; + box-shadow: theme("boxShadow.custom"); +} diff --git a/src/assets/pagination.css b/src/assets/pagination.css new file mode 100644 index 0000000..e5369ab --- /dev/null +++ b/src/assets/pagination.css @@ -0,0 +1,40 @@ +.page-box ul { + display: flex; + justify-content: flex-end; + flex-wrap: wrap; + font-size: 1rem; + color: #fff; + margin-bottom: 10px; +} + +.page-box ul li { + padding: 10px; + white-space: nowrap; + cursor: pointer; +} + + +.page-box ul .ant-pagination-item { + background-image: url(./img/pagination/small-btn.svg); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + padding: 10px 15px 10px 25px; + background-color: transparent; + display: flex; + justify-content: center; + align-items: center; + border: none; +} + +.page-box ul .ant-pagination-item.ant-pagination-item-active { + background-image: url(./img/pagination/small-btn02.svg); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + padding: 10px 15px 10px 25px; +} + +.page-box .ant-pagination-item a { + color: #fff; +} diff --git a/src/assets/table.css b/src/assets/table.css new file mode 100644 index 0000000..30adf55 --- /dev/null +++ b/src/assets/table.css @@ -0,0 +1,122 @@ +/**資料框**/ +.ant-table { + width: 100%; + margin-bottom: 1rem; + background-color: transparent !important; + color: white; +} +.ant-table::-webkit-scrollbar-thumb { + background-color: theme("colors.info") !important; +} + +.ant-table th.ant-table-cell::before{ + height: 100% !important; +} + +.content-box { + border: 1px solid #35eded; + padding: 5px; + position: relative; + margin-bottom: 15px; + background-color: theme("colors.body"); +} + +.content-box table, +.content-box table th { + border-radius: 0 !important; +} + +.content-box .ant-table th.ant-table-cell, +.content-box .ant-table td.ant-table-cell { + border-color: #fff !important; + color: #fff !important; + font-size: 1rem !important; + font-weight: 300 !important; + border-right: 1px solid #fff !important; + text-align: center !important; + padding: 0.5rem 0.75rem !important; + background-color: transparent !important; +} + +.content-box .ant-table th.ant-table-cell.ant-table-cell-fix-left, +.content-box .ant-table th.ant-table-cell.ant-table-cell-fix-right { + background-color: theme("colors.body") !important; + color: white; +} + +.content-box .ant-table th.ant-table-cell { + border-bottom: 1px solid #e9e9e9 !important; +} + +.content-box .ant-table tr td:last-child, +.content-box .ant-table tr:first-child th:last-child { + border-right: 0 !important; +} +.content-box .ant-table tr:last-child td { + border-bottom: 0 !important; +} + +/**資料框裝飾**/ +.content-box::before { + content: "" !important; + background: url(./img/table/content-box-background01.svg) center center !important; + position: absolute !important; + left: 4px !important; + top: 4px !important; + height: 20px !important; + width: 20px !important; + background-repeat: no-repeat !important; + z-index: 1 !important; +} + +.content-box::after { + content: "" !important; + background: url(./img/table/content-box-background05.svg) center center !important; + position: absolute !important; + right: 4px !important; + bottom: 4px !important; + height: 20px !important; + width: 20px !important; + background-repeat: no-repeat !important; + z-index: 3 !important; +} + +.content-box .page-box::before { + content: "" !important; + background: url(./img/table/content-box-background03.svg) center center !important; + position: absolute !important; + left: -1.2% !important; + bottom: -2px !important; + height: 56px !important; + width: 30px !important; + background-repeat: no-repeat !important; + z-index: 2 !important; +} + +.content-box .page-box::after { + content: "" !important; + background: url(./img/table/content-box-background04.svg) center center !important; + position: absolute !important; + right: -27px !important; + bottom: -7px !important; + height: 65px !important; + width: 50px !important; + background-repeat: no-repeat !important; + z-index: 2 !important; +} + +.content-box .content-decoration { + @apply px-2; +} + +.content-box .content-decoration::before { + content: "" !important; + background: url(./img/table/content-box-background02.svg) center center !important; + position: absolute !important; + right: -10px !important; + top: -10px !important; + height: 30px !important; + width: 29px !important; + background-repeat: no-repeat !important; + z-index: 1 !important; +} diff --git a/src/components/Loading.vue b/src/components/Loading.vue new file mode 100644 index 0000000..6ad4f0d --- /dev/null +++ b/src/components/Loading.vue @@ -0,0 +1,32 @@ + + + + + diff --git a/src/components/SvgIcon.vue b/src/components/SvgIcon.vue new file mode 100644 index 0000000..ecf5446 --- /dev/null +++ b/src/components/SvgIcon.vue @@ -0,0 +1,44 @@ + + + + diff --git a/src/components/alarm/AlarmCards.vue b/src/components/alarm/AlarmCards.vue new file mode 100644 index 0000000..bb058fa --- /dev/null +++ b/src/components/alarm/AlarmCards.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/src/components/alarm/AlarmDrawer.vue b/src/components/alarm/AlarmDrawer.vue new file mode 100644 index 0000000..d190c9c --- /dev/null +++ b/src/components/alarm/AlarmDrawer.vue @@ -0,0 +1,74 @@ + + + + + diff --git a/src/components/chart/BarChart.vue b/src/components/chart/BarChart.vue new file mode 100644 index 0000000..00b185f --- /dev/null +++ b/src/components/chart/BarChart.vue @@ -0,0 +1,31 @@ + + + + diff --git a/src/components/chart/EffectScatter.vue b/src/components/chart/EffectScatter.vue new file mode 100644 index 0000000..0be1380 --- /dev/null +++ b/src/components/chart/EffectScatter.vue @@ -0,0 +1,75 @@ + + + + diff --git a/src/components/chart/GaugeChart.vue b/src/components/chart/GaugeChart.vue new file mode 100644 index 0000000..da53127 --- /dev/null +++ b/src/components/chart/GaugeChart.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/components/chart/LineChart.vue b/src/components/chart/LineChart.vue new file mode 100644 index 0000000..da53127 --- /dev/null +++ b/src/components/chart/LineChart.vue @@ -0,0 +1,34 @@ + + + + diff --git a/src/components/chart/LiquidfillChart.vue b/src/components/chart/LiquidfillChart.vue new file mode 100644 index 0000000..62b3cc1 --- /dev/null +++ b/src/components/chart/LiquidfillChart.vue @@ -0,0 +1,119 @@ + + + + + diff --git a/src/components/chart/SankeyChart.vue b/src/components/chart/SankeyChart.vue new file mode 100644 index 0000000..557d51e --- /dev/null +++ b/src/components/chart/SankeyChart.vue @@ -0,0 +1,31 @@ + + + + diff --git a/src/components/customUI/ButtonConnectedGroup.vue b/src/components/customUI/ButtonConnectedGroup.vue new file mode 100644 index 0000000..67880cc --- /dev/null +++ b/src/components/customUI/ButtonConnectedGroup.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/src/components/customUI/ButtonGroup.vue b/src/components/customUI/ButtonGroup.vue new file mode 100644 index 0000000..3c4621d --- /dev/null +++ b/src/components/customUI/ButtonGroup.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/components/customUI/Checkbox.vue b/src/components/customUI/Checkbox.vue new file mode 100644 index 0000000..2f28bfc --- /dev/null +++ b/src/components/customUI/Checkbox.vue @@ -0,0 +1,65 @@ + + + + + diff --git a/src/components/customUI/Collapse.vue b/src/components/customUI/Collapse.vue new file mode 100644 index 0000000..2b9a911 --- /dev/null +++ b/src/components/customUI/Collapse.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/src/components/customUI/DateGroup.vue b/src/components/customUI/DateGroup.vue new file mode 100644 index 0000000..20653f0 --- /dev/null +++ b/src/components/customUI/DateGroup.vue @@ -0,0 +1,124 @@ + + + + + + diff --git a/src/components/customUI/Dropdown.vue b/src/components/customUI/Dropdown.vue new file mode 100644 index 0000000..78f5453 --- /dev/null +++ b/src/components/customUI/Dropdown.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/src/components/customUI/FileSystemCollapse.vue b/src/components/customUI/FileSystemCollapse.vue new file mode 100644 index 0000000..7b058b0 --- /dev/null +++ b/src/components/customUI/FileSystemCollapse.vue @@ -0,0 +1,189 @@ + + + + + diff --git a/src/components/customUI/Input.vue b/src/components/customUI/Input.vue new file mode 100644 index 0000000..6a0efeb --- /dev/null +++ b/src/components/customUI/Input.vue @@ -0,0 +1,96 @@ + + + + + diff --git a/src/components/customUI/InputNumber.vue b/src/components/customUI/InputNumber.vue new file mode 100644 index 0000000..4bc9ea4 --- /dev/null +++ b/src/components/customUI/InputNumber.vue @@ -0,0 +1,92 @@ + + + + + diff --git a/src/components/customUI/Modal.vue b/src/components/customUI/Modal.vue new file mode 100644 index 0000000..dde09c4 --- /dev/null +++ b/src/components/customUI/Modal.vue @@ -0,0 +1,94 @@ + + + + + diff --git a/src/components/customUI/Pagination.vue b/src/components/customUI/Pagination.vue new file mode 100644 index 0000000..8418768 --- /dev/null +++ b/src/components/customUI/Pagination.vue @@ -0,0 +1,192 @@ + + + diff --git a/src/components/customUI/RadioGroup.vue b/src/components/customUI/RadioGroup.vue new file mode 100644 index 0000000..f0ed74a --- /dev/null +++ b/src/components/customUI/RadioGroup.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/src/components/customUI/Select.vue b/src/components/customUI/Select.vue new file mode 100644 index 0000000..41166bc --- /dev/null +++ b/src/components/customUI/Select.vue @@ -0,0 +1,85 @@ + + + + + diff --git a/src/components/customUI/Table.vue b/src/components/customUI/Table.vue new file mode 100644 index 0000000..7cd640a --- /dev/null +++ b/src/components/customUI/Table.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/src/components/customUI/Textarea.vue b/src/components/customUI/Textarea.vue new file mode 100644 index 0000000..e14f010 --- /dev/null +++ b/src/components/customUI/Textarea.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/components/customUI/Toast.vue b/src/components/customUI/Toast.vue new file mode 100644 index 0000000..e5190e1 --- /dev/null +++ b/src/components/customUI/Toast.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/src/components/customUI/Upload.vue b/src/components/customUI/Upload.vue new file mode 100644 index 0000000..90e8f56 --- /dev/null +++ b/src/components/customUI/Upload.vue @@ -0,0 +1,287 @@ + + + + + diff --git a/src/components/forge/Forge.vue b/src/components/forge/Forge.vue new file mode 100644 index 0000000..ba411a8 --- /dev/null +++ b/src/components/forge/Forge.vue @@ -0,0 +1,282 @@ + + + + + diff --git a/src/components/forge/ForgeInfoModal.vue b/src/components/forge/ForgeInfoModal.vue new file mode 100644 index 0000000..9a48c37 --- /dev/null +++ b/src/components/forge/ForgeInfoModal.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/src/components/forge/ForgeInfoModalChart.vue b/src/components/forge/ForgeInfoModalChart.vue new file mode 100644 index 0000000..ac6bb72 --- /dev/null +++ b/src/components/forge/ForgeInfoModalChart.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/src/components/forge/ForgeInfoModalCog.vue b/src/components/forge/ForgeInfoModalCog.vue new file mode 100644 index 0000000..171f010 --- /dev/null +++ b/src/components/forge/ForgeInfoModalCog.vue @@ -0,0 +1,118 @@ + + + + + diff --git a/src/components/forge/ForgeInfoModalDesktop.vue b/src/components/forge/ForgeInfoModalDesktop.vue new file mode 100644 index 0000000..e706405 --- /dev/null +++ b/src/components/forge/ForgeInfoModalDesktop.vue @@ -0,0 +1,34 @@ + + + + + diff --git a/src/components/forge/ForgeModal.vue b/src/components/forge/ForgeModal.vue new file mode 100644 index 0000000..df4a248 --- /dev/null +++ b/src/components/forge/ForgeModal.vue @@ -0,0 +1,160 @@ + + + + + diff --git a/src/components/forge/ForgeModalContent.vue b/src/components/forge/ForgeModalContent.vue new file mode 100644 index 0000000..b83816f --- /dev/null +++ b/src/components/forge/ForgeModalContent.vue @@ -0,0 +1,223 @@ + + + + + diff --git a/src/components/forge/index.vue b/src/components/forge/index.vue new file mode 100644 index 0000000..a9f0e80 --- /dev/null +++ b/src/components/forge/index.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/src/components/navbar/Navbar.vue b/src/components/navbar/Navbar.vue new file mode 100644 index 0000000..8cea6f1 --- /dev/null +++ b/src/components/navbar/Navbar.vue @@ -0,0 +1,156 @@ + + + + + diff --git a/src/components/navbar/NavbarBuilding.vue b/src/components/navbar/NavbarBuilding.vue new file mode 100644 index 0000000..b3a1099 --- /dev/null +++ b/src/components/navbar/NavbarBuilding.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/src/components/navbar/NavbarItem.vue b/src/components/navbar/NavbarItem.vue new file mode 100644 index 0000000..7bf2731 --- /dev/null +++ b/src/components/navbar/NavbarItem.vue @@ -0,0 +1,129 @@ + + + diff --git a/src/constant/CalculateTableColumn.js b/src/constant/CalculateTableColumn.js new file mode 100644 index 0000000..5a81ee0 --- /dev/null +++ b/src/constant/CalculateTableColumn.js @@ -0,0 +1,127 @@ +const transformColumns = (columns) => + columns.map((col) => ({ + ...col, + dataIndex: col.key, + width: col.width ?? 120, + align: "center", + })); + +const MONTHCOLUMNS = transformColumns([ + { title: "項目", key: "item", width: 190, fixed: true }, + { title: "1月", key: "January" }, + { title: "2月", key: "February" }, + { title: "3月", key: "March" }, + { title: "4月", key: "April" }, + { title: "5月", key: "May" }, + { title: "6月", key: "June" }, + { title: "7月", key: "July" }, + { title: "8月", key: "August" }, + { title: "9月", key: "September" }, + { title: "10月", key: "October" }, + { title: "11月", key: "November" }, + { title: "12月", key: "December" }, +]); + +const WORKHOURSROW = [ + { + key: "Index", + item: "月份", + }, + { + key: "WorkerNumber", + item: "員工數", + }, + { + key: "WorkDay", + item: "每日每人平均工作時數", + }, + { + key: "Scalar", + item: "總工時", + }, + { + key: "OverTimeWorkerNumber", + item: "加班員工數", + }, + { + key: "OverTimeAverageHourPerDay", + item: "每日每人平均加班時數", + }, + { + key: "OverTimeWorkDay", + item: "月加班工作天數", + }, + { + key: "OverTimeScalar", + item: "月合計加班時數", + }, + { key: "TotalHours", item: "總工時", readonly: true }, + { key: "KgCO2e", item: "KgCO2e", readonly: true }, + { key: "Description", item: "描述/說明" }, + { + item: "使用量佐證文件", + key: "ReferenceFileLink", + }, +]; + +const ELECTRICROW = transformColumns([ + { + key: "Index", + title: "月份", + }, + { + key: "Peak", + title: "尖峰 / 峰", + }, + { + key: "HalfPeak", + title: "半尖峰 / 平", + }, + { + key: "SaturdayHalfPeak", + title: "週六半尖峰", + }, + { + key: "OffPeak", + title: "離峰 / 谷", + }, + { + key: "KgCO2e", + title: "碳排放 KgCO2e", + }, + // { + // key: "Elecdeduct1", + // item: "電力扣除額1", + // }, + // { + // key: "Elecdeduct2", + // item: "電力扣除額2", + // }, + // { + // key: "Scalar", + // item: "總用電量", + // }, + // { key: "Description", item: "描述/說明" }, + // { key: "KgCO2e", item: "KgCO2e", readonly: true }, + // { + // item: "使用量佐證文件", + // key: "ReferenceFileLink", + // }, +]); + +const REFRIGERANTCOLUMNS = transformColumns([ + { title: "廠區 / 製程別", key: "ProcessName" }, + { title: "負責單位", key: "ResponsibleUnit" }, + { title: "設備名稱", key: "Name" }, + { title: "型號", key: "ModelNumber" }, + { title: "使用冷媒 / 製冷劑種類 ", key: "ParameterIDTitle" }, + { title: "全廠台數", key: "TotalNumber" }, + { title: "冷媒 / 製冷劑原始填充量(Kg) ", key: "Scalar" }, + { title: "使用月數", key: "UsedMonth" }, + { title: "設備類型(排放因子) ", key: "ParameterID2Title" }, + { title: "GWP", key: "GWP" }, + { title: "設備逸散率", key: "factor" }, + { title: "KgCO2e", key: "KgCO2e" }, +]); + +export { MONTHCOLUMNS, WORKHOURSROW, ELECTRICROW, REFRIGERANTCOLUMNS }; diff --git a/src/constant/api_app.js b/src/constant/api_app.js new file mode 100644 index 0000000..2744f29 --- /dev/null +++ b/src/constant/api_app.js @@ -0,0 +1,8 @@ +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const POST_LOGIN = `${BASEURL}/api/Login/`; +export const GET_AUTHPAGE_API = `${BASEURL}/api/GetUsrFroList`; +export const GET_SUBAUTHPAGE_API = `${BASEURL}/api/Device/GetMainSub`; +export const GET_DEVICELIST_API = `${BASEURL}/api/Device/GetDeviceList`; +export const GET_DEVICEIMME_API = `${BASEURL}/api/Energe/GetElecBySubSysTag`; + + diff --git a/src/constant/api_forge.js b/src/constant/api_forge.js new file mode 100644 index 0000000..9234002 --- /dev/null +++ b/src/constant/api_forge.js @@ -0,0 +1,4 @@ +const BASEURL = import.meta.env.VITE_API_BASEURL; +export const GET_FORGETOKEN_API = `${BASEURL}/api/forge/oauth/token`; + +export const GET_FORGEURN_API = `${BASEURL}/api/Device/GetBuild`; diff --git a/src/constant/authPage.js b/src/constant/authPage.js new file mode 100644 index 0000000..be0575a --- /dev/null +++ b/src/constant/authPage.js @@ -0,0 +1,61 @@ +export const AUTHPAGES = [ + { + authCode: "PF1", + icon: "tv", + // pageName: "systemMonitor", + navigate: "/dashboard", + }, + { + authCode: "PF2", + icon: "chart-pie", + pageName: "energyManagement", + navigate: "/energyManagement", + }, + { + authCode: "PF3", + icon: "chart-area", + // pageName: "historyData", + navigate: "/historyData", + }, + { + authCode: "PF4", + icon: "chart-line", + navigate: "/historyData", + }, + { + authCode: "PF5", + icon: "bell", + pageName: "alert", + navigate: "/alert", + }, + { + authCode: "PF6", + icon: "server", + pageName: "operation", + navigate: "/operation", + }, + { + authCode: "PF7", + icon: "image", + pageName: "graphManagement", + navigate: "/graphManagement", + }, + { + authCode: "PF8", + icon: "user", + pageName: "accountManagement", + navigate: "/accountManagement", + }, + { + authCode: "PF9", + icon: "database", + pageName: "AssetManagement", + navigate: "/assetManagement", + }, + { + authCode: "PF10", + icon: "leaf", + pageName: "ProductSetting", + navigate: "/productSetting", + }, +]; diff --git a/src/constant/calculateIcon.js b/src/constant/calculateIcon.js new file mode 100644 index 0000000..b73e845 --- /dev/null +++ b/src/constant/calculateIcon.js @@ -0,0 +1,465 @@ +// import CapitalGood from "@ASSET/icon/CapitalGood.svg"; // 上游購買資本物品 +// import CapitalGoodHover from "@ASSET/icon/CapitalGood-h.svg"; +// import upstreamEnergyEmission from "@ASSET/icon/UpstreamEnergyEmission.svg"; // 與能源相關活動 +// import upstreamEnergyEmissionHover from "@ASSET/icon/UpstreamEnergyEmission-h.svg"; +// import Energy from "@ASSET/icon/Energy.svg"; // 外購能源排放 +// import EnergyHover from "@ASSET/icon/Energy-h.svg"; +// import Disposal from "@ASSET/icon/Disposal.svg"; // 上游廢棄 +// import DisposalHover from "@ASSET/icon/Disposal-h.svg"; +// import LeasedAsset from "@ASSET/icon/LeasedAsset.svg"; // 上游租賃資產 +// import LeasedAssetHover from "@ASSET/icon/LeasedAsset-h.svg"; +// import PurchasedGood from "@ASSET/icon/PurchasedGood.svg"; // 購買商品 +// import PurchasedGoodHover from "@ASSET/icon/PurchasedGood-h.svg"; +// import Consultant from "@ASSET/icon/Consultant.svg"; // 購買服務 +// import ConsultantHover from "@ASSET/icon/Consultant-h.svg"; +// import UpstreamTransport from "@ASSET/icon/UpstreamTransport.svg"; // 上游運輸及配送 +// import UpstreamTransportHover from "@ASSET/icon/UpstreamTransport-h.svg"; +// import BusinessTravel from "@ASSET/icon/BusinessTravel.svg"; // 商務旅行 +// import BusinessTravelHover from "@ASSET/icon/BusinessTravel-h.svg"; +// import Visitor from "@ASSET/icon/Visitor.svg"; // 訪客 +// import VisitorHover from "@ASSET/icon/Visitor-h.svg"; +// import Commuting from "@ASSET/icon/Commuting.svg"; // 員工通勤 +// import CommutingHover from "@ASSET/icon/Commuting-h.svg"; + +// import StationaryCombustion from "@ASSET/icon/StationaryCombustion.svg"; // 固定源 +// import StationaryCombustionHover from "@ASSET/icon/StationaryCombustion-h.svg"; +// import MobileCombustion from "@ASSET/icon/MobileCombustion.svg"; // 移動源 +// import MobileCombustionHover from "@ASSET/icon/MobileCombustion-h.svg"; +// import DirectFugitiveEmission from "@ASSET/icon/DirectFugitiveEmission.svg"; // 逸散源 +// import DirectFugitiveEmissionHover from "@ASSET/icon/DirectFugitiveEmission-h.svg"; +// import DirectProcessEmission from "@ASSET/icon/DirectProcessEmission.svg"; // 製程 +// import DirectProcessEmissionHover from "@ASSET/icon/DirectProcessEmission-h.svg"; +// import Electricity from "@ASSET/icon/Electricity.svg"; // 用電量 +// import ElectricityHover from "@ASSET/icon/Electricity-h.svg"; +// import Steam from "@ASSET/icon/Steam.svg"; // 蒸氣 +// import SteamHover from "@ASSET/icon/Steam-h.svg"; +// import Refrigerant from "@ASSET/icon/Refrigerant.svg"; // 冷媒 +// import RefrigerantHover from "@ASSET/icon/Refrigerant-h.svg"; +// import OtherCompound from "@ASSET/icon/OtherCompound.svg"; // 其他關注類 +// import OtherCompoundHover from "@ASSET/icon/OtherCompound-h.svg"; + +// import UseEmission from "@ASSET/icon/UseEmission.svg"; // 下游使用銷售產品 +// import UseEmissionHover from "@ASSET/icon/UseEmission-h.svg"; +// import DownstreamDisposal from "@ASSET/icon/DownstreamDisposal.svg"; // 下銷售產品廢棄處理 +// import DownstreamDisposalHover from "@ASSET/icon/DownstreamDisposal-h.svg"; +// import Investment from "@ASSET/icon/Investment.svg"; // 投資 +// import InvestmentHover from "@ASSET/icon/Investment-h.svg"; + +// import Other from "@ASSET/icon/Other.svg"; // 投資 +// import OtherHover from "@ASSET/icon/Other-h.svg"; + +// import WaterUsages from "@ASSET/icon/WaterUsages.png"; // 水 +// import WaterUsagesHover from "@ASSET/icon/WaterUsagesHover.png"; + +import { + MONTHCOLUMNS, + WORKHOURSROW, + ELECTRICROW, + REFRIGERANTCOLUMNS, +} from "./CalculateTableColumn"; + +const alterSourceIcon = (sourceList) => + sourceList.map(({ link, icon, hoverIcon, title, children = null }) => ({ + icon, + hoverIcon, + title, + key: link, + link, + children, + })); + +const sourceIconListForUpstreamS3 = alterSourceIcon([ + { + icon: "CapitalGood", + hoverIcon: "CapitalGood-h", + link: "capitalGood", + title: "購買資本物品 C4", + children: [ + { + title: "購買資本物品 C4", + editType: "lifecycle", + link: "capitalGood", + }, + ], + }, + { + icon: "UpstreamEnergyEmission", + hoverIcon: "UpstreamEnergyEmission-h", + link: "upstreamEmissions", + title: "輸入能源上游排放 C4", + children: [ + { + title: "輸入能源上游排放 C4", + editType: "lifecycle", + link: "upstreamEmissions", + }, + ], + }, + { + icon: "WaterUsages", + hoverIcon: "WaterUsages-h", + link: "waterUsage", + title: "用水(水資源管理) C4", + children: [ + { + title: "用水(水資源管理) C4", + editType: "lifecycle", + link: "waterUsage", + }, + ], + }, + { + icon: "PurchasedGood", + hoverIcon: "PurchasedGood-h", + link: "purchasedGood", + title: "購買商品 C4", + children: [ + { + title: "購買商品 C4", + editType: "lifecycle", + link: "purchasedGood", + }, + ], + }, + { + icon: "LeasedAsset", + hoverIcon: "LeasedAsset-h", + link: "leasedAsset", + title: "上游租賃資產 C4", + children: [ + { + title: "上游租賃資產 C4", + editType: "lifecycle", + link: "leasedAsset", + }, + ], + }, + { + icon: "Consultant", + hoverIcon: "Consultant-h", + link: "consultant", + title: "顧問諮詢、清潔、維護等 C4", + children: [ + { + title: "顧問諮詢、清潔、維護等 C4", + editType: "lifecycle", + link: "consultant", + }, + ], + }, +]); + +const sourceIconListForBusinessS2UP = alterSourceIcon([ + { + icon: "UpstreamTransport", + hoverIcon: "UpstreamTransport-h", + link: "upstreamTransport", + title: "上游運輸及配送 C3", + children: [ + { + title: "上游運輸及配送 C3", + editType: "lifecycle", + link: "upstreamTransport", + }, + ], + }, +]); + +const sourceIconListForBusinessS1 = alterSourceIcon([ + { + icon: "MobileCombustion", + hoverIcon: "MobileCombustion-h", + link: "mobileCombustion", + title: "移動源 C1", + children: [ + { + title: "移動源 C1", + editType: "yearlyDevice", + link: "mobileCombustion", + }, + ], + }, + { + icon: "StationaryCombustion", + hoverIcon: "StationaryCombustion-h", + link: "stationaryCombustion", + title: "固定燃燒源 C1", + children: [ + { + title: "固定燃燒源 C1", + editType: "yearlyDevice", + link: "stationaryCombustion", + }, + ], + }, + { + icon: "DirectProcessEmission", + hoverIcon: "DirectProcessEmission-h", + link: "directProcessEmission", + title: "工業製程 C1", + children: [ + { + title: "工業製程 C1", + editType: "yearlyDevice", + link: "directProcessEmission", + }, + ], + }, + { + icon: "DirectFugitiveEmission", + hoverIcon: "DirectFugitiveEmission-h", + link: "directFugitiveEmission", + title: "人為逸散 C1", + children: [ + { + title: "冷媒設備 B.2.2.d", + editType: "nonYearlyDevice", + link: "refrigerant", + cols: REFRIGERANTCOLUMNS, + main_system_tag: "ME", + sub_system_tag: "M10", + }, + { + title: "工時計算 B.2.2.d", + editType: "lifecycle", + link: "workHour", + rows: WORKHOURSROW, + cols: MONTHCOLUMNS, + data_api: "./mock/workhour.json", + }, + { + title: "消防設備 B.2.2.d", + editType: "nonYearlyDevice", + link: "fireEquipment", + }, + ], + }, + { + icon: "OtherCompound", + hoverIcon: "OtherCompound-h", + link: "otherCompound", + title: "其他關注類物質 C1", + children: [ + { + title: "其他關注類物質 C1", + editType: "nonYearlyDevice", + link: "otherCompound", + }, + ], + }, + + { + icon: "Electricity", + hoverIcon: "Electricity-h", + link: "electricity", + title: "輸入電力 C2", + children: [ + { + title: "一般用電 B.3.2.a", + editType: "month", + link: "plus", + rows: ELECTRICROW, + cols: MONTHCOLUMNS, + main_system_tag: "EE", + sub_system_tag: "E4", + data_api: "./mock/electricity.json", + }, + // { + // title: "綠電 B.3.2.a", + // editType: "month", + // link: "minus", + // rows: ELECTRICROW, + // cols: MONTHCOLUMNS, + // }, + ], + }, + { + icon: "Steam", + hoverIcon: "Steam-h", + link: "steam", + title: "輸入蒸汽 C2", + children: [ + { + title: "蒸氣加項 B.3.2.b", + editType: "month", + link: "plus", + }, + { + title: "蒸氣減項 B.3.2.b", + editType: "month", + link: "minus", + }, + ], + }, + { + icon: "Visitor", + hoverIcon: "Visitor-h", + link: "visitor", + title: "客戶和訪客運輸 C3", + children: [ + { + title: "客戶和訪客運輸 C3", + editType: "lifecycle", + link: "visitor", + }, + ], + }, + { + icon: "BusinessTravel", + hoverIcon: "BusinessTravel-h", + link: "businessTravel", + title: "員工差旅 C3", + children: [ + { + title: "員工差旅 C3", + editType: "lifecycle", + link: "businessTravel", + }, + ], + }, + { + icon: "Commuting", + hoverIcon: "Commuting-h", + link: "commuting", + title: "員工通勤 C3", + children: [ + { + title: "員工通勤 C3", + editType: "lifecycle", + link: "commuting", + }, + ], + }, + { + icon: "Disposal", + hoverIcon: "Disposal-h", + link: "disposal", + title: "營運產生之廢棄物 C4", + children: [ + { + title: "營運產生之廢棄物 C4", + editType: "lifecycle", + link: "disposal", + }, + ], + }, +]); + +const sourceIconListForBusinessS2Down = alterSourceIcon([ + { + icon: "UpstreamTransport", + hoverIcon: "UpstreamTransport-h", + link: "downstreamTransport", + title: "下游運輸及配送 C3", + children: [ + { + title: "下游運輸及配送 C3", + editType: "lifecycle", + link: "downstreamTransport", + }, + ], + }, + { + icon: "UpstreamTransport", + hoverIcon: "UpstreamTransport-h", + link: "disposalDownTransport", + title: "廢棄物運輸 C3", + children: [ + { + title: "廢棄物運輸 C3", + editType: "lifecycle", + link: "disposalDownTransport", + }, + ], + }, +]); + +const sourceIconListForDownstreamS3 = alterSourceIcon([ + { + icon: "LeasedAsset", + hoverIcon: "LeasedAsset-h", + link: "downLeasedAsset", + title: "下游租賃資產 C5", + children: [ + { + title: "下游租賃資產 C5", + editType: "lifecycle", + link: "downLeasedAsset", + }, + ], + }, + { + icon: "UseEmission", + hoverIcon: "UseEmission-h", + link: "useEmission", + title: "產品使用階段 C5", + children: [ + { + title: "產品使用階段 C5", + editType: "lifecycle", + link: "useEmission", + }, + ], + }, + { + icon: "Investment", + hoverIcon: "Investment-h", + link: "investment", + title: "投資 C5", + children: [ + { + title: "投資 C5", + editType: "lifecycle", + link: "investment", + }, + ], + }, + { + icon: "DownstreamDisposal", + hoverIcon: "DownstreamDisposal-h", + link: "downstreamDisposal", + title: "產品壽命終止階段 C5", + children: [ + { + title: "產品壽命終止階段 C5", + editType: "lifecycle", + link: "downstreamDisposal", + }, + ], + }, +]); + +const sourceIconListForOtherS3 = alterSourceIcon([ + { + icon: "Other", + hoverIcon: "Other-h", + link: "other", + title: "其它間接排放 C6", + children: [ + { + title: "其它間接排放 C6", + editType: "lifecycle", + link: "other", + }, + ], + }, +]); + +const allSourceIconList = [ + ...sourceIconListForUpstreamS3, + ...sourceIconListForBusinessS1, + ...sourceIconListForBusinessS2UP, + ...sourceIconListForBusinessS2Down, + ...sourceIconListForDownstreamS3, + ...sourceIconListForOtherS3, +]; + +export { + sourceIconListForUpstreamS3, + sourceIconListForBusinessS1, + sourceIconListForBusinessS2UP, + sourceIconListForBusinessS2Down, + sourceIconListForDownstreamS3, + sourceIconListForOtherS3, + allSourceIconList, +}; diff --git a/src/constant/colors.js b/src/constant/colors.js new file mode 100644 index 0000000..9665e09 --- /dev/null +++ b/src/constant/colors.js @@ -0,0 +1,32 @@ +export const COLOR = [ + "#4cf3e9", // 亮藍 + "#f5d54e", // 黃 + "#63ed84", // 亮綠 + "#9afed8", // 淺綠 + "#e266fe", // 紫 + "#e0e2e2", // 灰 + "#500080", // 紫 + "#115852", // 深綠 + "#4B4E6C", // 灰 + "#eb4c42", // 紅 + "#007ba7", // 藍 + "#da3287", // 粉紅 + "#ccff00", // 綠 + "#fff44f", // 黃 +]; + +// 淺色 +export const CHART_COLOR = [ + "#cb4154", // 紅 + "#fad6a5", // 黃 + "#ace1af", // 綠 + "#9bddff", // 亮藍 +]; + +// 深色 +export const SECOND_CHART_COLOR = [ + "#cc0000", // 紅 + "#ffb300", // 黃 + "#00cc99", // 綠 + "#4997d0", // 藍 +]; diff --git a/src/constant/index.js b/src/constant/index.js new file mode 100644 index 0000000..5a01247 --- /dev/null +++ b/src/constant/index.js @@ -0,0 +1,45 @@ +import { + POST_LOGIN, + GET_AUTHPAGE_API, + GET_SUBAUTHPAGE_API, + GET_DEVICELIST_API, + GET_DEVICEIMME_API, +} from "./api_app"; +import { GET_FORGETOKEN_API, GET_FORGEURN_API } from "./api_forge"; +import { AUTHPAGES } from "./authPage"; +import { + sourceIconListForUpstreamS3, + sourceIconListForBusinessS1, + sourceIconListForBusinessS2UP, + sourceIconListForBusinessS2Down, + sourceIconListForDownstreamS3, + sourceIconListForOtherS3, + allSourceIconList, +} from "./calculateIcon"; +import { MONTHCOLUMNS } from "./CalculateTableColumn"; +import { COLOR, CHART_COLOR, SECOND_CHART_COLOR } from "./colors"; + +export { + // api_app + POST_LOGIN, + GET_AUTHPAGE_API, + GET_SUBAUTHPAGE_API, + GET_DEVICELIST_API, + GET_DEVICEIMME_API, + + //api_forge + GET_FORGETOKEN_API, + GET_FORGEURN_API, + AUTHPAGES, + sourceIconListForUpstreamS3, + sourceIconListForBusinessS1, + sourceIconListForBusinessS2UP, + sourceIconListForBusinessS2Down, + sourceIconListForDownstreamS3, + sourceIconListForOtherS3, + allSourceIconList, + MONTHCOLUMNS, + COLOR, + CHART_COLOR, + SECOND_CHART_COLOR, +}; diff --git a/src/directives/draggable.js b/src/directives/draggable.js new file mode 100644 index 0000000..caaf03a --- /dev/null +++ b/src/directives/draggable.js @@ -0,0 +1,76 @@ +const moveModal = (elmnt, draggableAreaSelector = null) => { + console.log("Initializing draggable for:", elmnt); + let pos1 = 0, + pos2 = 0, + pos3 = 0, + pos4 = 0; + + const dragMouseDown = (e) => { + console.log("dragMouseDown", e); + + if (draggableAreaSelector) { + const draggableArea = elmnt.querySelector(draggableAreaSelector); + if (!draggableArea || !draggableArea.contains(e.target)) { + return; // 只允許指定區域觸發拖動 + } + } + + e.preventDefault(); + e.stopPropagation(); + pos3 = e.clientX; + pos4 = e.clientY; + + // 綁定事件到元素範圍 + document.addEventListener("mouseup", closeDragElement); + document.addEventListener("mousemove", elementDrag); + }; + + const elementDrag = (e) => { + e.preventDefault(); + pos1 = pos3 - e.clientX; + pos2 = pos4 - e.clientY; + pos3 = e.clientX; + pos4 = e.clientY; + + elmnt.style.top = `${elmnt.offsetTop - pos2}px`; + elmnt.style.left = `${elmnt.offsetLeft - pos1}px`; + }; + + const closeDragElement = () => { + document.removeEventListener("mouseup", closeDragElement); + document.removeEventListener("mousemove", elementDrag); + }; + + elmnt.addEventListener("mousedown", dragMouseDown); + + // 返回一個清理函數 + return () => { + elmnt.removeEventListener("mousedown", dragMouseDown); + document.removeEventListener("mouseup", closeDragElement); + document.removeEventListener("mousemove", elementDrag); + }; +}; + +export const draggable = { + install(app) { + app.directive("draggable", { + mounted(el, binding) { + console.log("Initializing draggable directive for:", el.id); + + // 檢查條件並啟用 draggable 行為 + if (binding.value) { + el.style.position = "absolute"; // 確保元素可拖動 + const draggableArea = binding.value.draggableArea || ".card-title"; + el._cleanup = moveModal(el, draggableArea); // 保存清理函數 + } + }, + unmounted(el) { + // 清理事件 + if (el._cleanup) { + el._cleanup(); + delete el._cleanup; + } + }, + }); + }, +}; diff --git a/src/directives/focusPlugin.js b/src/directives/focusPlugin.js new file mode 100644 index 0000000..d917077 --- /dev/null +++ b/src/directives/focusPlugin.js @@ -0,0 +1,9 @@ +export const focusPlugin = { + install(app) { + app.directive("focus", { + mounted: (el, binding, vnode, prevVnode) => { + el.focus(); + }, + }); + }, +}; diff --git a/src/fontawsomeIconRegister.js b/src/fontawsomeIconRegister.js new file mode 100644 index 0000000..8cc3a7c --- /dev/null +++ b/src/fontawsomeIconRegister.js @@ -0,0 +1,103 @@ +/* import the fontawesome core */ +import { library } from "@fortawesome/fontawesome-svg-core"; + +/* import specific icons */ +import { + faTv, + faChartArea, + faChartPie, + faChartLine, + faBell, + faServer, + faImage, + faUser, + faLeaf, + faDesktop, + faCog, + faExclamationTriangle, + faBars, + faTimes, + faAngleDown, + faUserCircle, + faCommentDots, + faCommentSlash, + faPlus, + faSearch, + faCaretRight, + faFolder, + faCloudUploadAlt, + faTrashAlt, + faChevronRight, + faChevronLeft, + faPencilAlt, + faSortUp, + faSortDown, + faFilter, + faFilePdf, + faFileExcel, + faFileWord, + faFilePowerpoint, + faFileAlt, + faDatabase, + faLock, + faLockOpen, + faSignOutAlt, + faEye, + faEyeSlash, + faTemperatureHigh, + faTint, + faCircle +} from "@fortawesome/free-solid-svg-icons"; + +import { faClock } from "@fortawesome/free-regular-svg-icons"; + +/* add icons to the library */ +library.add( + faTv, + faChartArea, + faChartPie, + faChartLine, + faBell, + faServer, + faImage, + faUser, + faLeaf, + faDesktop, + faCog, + faExclamationTriangle, + faBars, + faTimes, + faAngleDown, + faUserCircle, + faCommentDots, + faPlus, + faCommentSlash, + faSearch, + faCaretRight, + faFolder, + faCloudUploadAlt, + faTrashAlt, + faChevronRight, + faChevronLeft, + faPencilAlt, + faSortUp, + faSortDown, + faFilter, + faFilePdf, + faFileExcel, + faFileWord, + faFilePowerpoint, + faFileAlt, + faDatabase, + faLock, + faLockOpen, + faSignOutAlt, + faEye, + faEyeSlash, + faTemperatureHigh, + faClock, + faTint, + faCircle +); + +export default library; diff --git a/src/hooks/baja/useAlarmData.js b/src/hooks/baja/useAlarmData.js new file mode 100644 index 0000000..6b15202 --- /dev/null +++ b/src/hooks/baja/useAlarmData.js @@ -0,0 +1,91 @@ +import { ref, onMounted, onUnmounted } from 'vue'; +import dayjs from 'dayjs'; +import { getAllDevice } from "@/apis/building"; + +export default function useAlarmData() { + let timer = null; + const alarmData = ref([]); + const allDeviceList = ref([]); + + const getFormateDate = (datetime, formatRule = 'YYYY-MM-DD HH:mm') => { + return dayjs(datetime).format(formatRule); + }; + + const getAlarmByBaja = ( + startDate, + endDate, + isRecover, + isAck, + alarmClass, + callback + ) => { + window.require && + window.requirejs(["baja!"], (baja) => { + let alarms = []; + // console.log("進入 bajaSubscriber 準備執行BQL訂閱"); + const alarmClassQuery = alarmClass.map(ac => `alarmClass = '${ac}'`).join(' or '); + const ord = `local:|foxs:|alarm:|bql:select * where (${alarmClassQuery}) and timestamp.millis > ${startDate} and timestamp.millis < ${endDate} and sourceState = '${isRecover}' and ackState = '${isAck}' order by timestamp desc`; + baja.Ord.make(ord).get({ + cursor: { + before: () => { + timer = null; + }, + each: (record) => { + let alarmDisplayName = record.get("alarmData").get("sourceName"); + alarmDisplayName = alarmDisplayName.replace(/\$2d/g, "_"); // 檢查並替換 $2d 為 _ + const sourceTmp = alarmDisplayName.split("_"); + const bfName = sourceTmp[1] + "-" + sourceTmp[4]; + const sourceName = sourceTmp.slice(0, 8).join("_"); + const sourceTmpFinal = sourceTmp[7] + "-" + sourceTmp[8]; + const origSourceName = record.get("alarmData").get("sourceName"); + if (!sourceTmpFinal.includes("undefined")) { + alarms.push({ + building_tag: bfName, + uuid: record.get("uuid").$val, + timestamp_date: getFormateDate(record.get("timestamp").getJsDate(), "YYYY/MM/DD "), + timestamp_time: getFormateDate(record.get("timestamp").getJsDate(), "HH:mm:ss"), + alarmClass: record.get("alarmClass"), + device_number: sourceName, + origSourceName: origSourceName, + full_name: allDeviceList.value.find((d) => origSourceName.includes(d.device_number))?.full_name, + msg: record.get("alarmData").get("msgText"), + sourceState: record.get("sourceState").getDisplayTag(), + normalTime: getFormateDate(record.get("normalTime").getJsDate()), + ackState: record.get("ackState").getDisplayTag(), + ackedTime: getFormateDate(record.get("ackTime").getJsDate()), + }); + } + }, + after: () => { + if (typeof callback === 'function') { + callback({ count: alarms.length, data: alarms }); + } + }, + limit: -1, + offset: 0, + }, + }); + }); + }; + + const getDevice = async () => { + const res = await getAllDevice(); + allDeviceList.value = res.data; + }; + + const stopFetching = () => { + if (timer) { + clearTimeout(timer); + } + }; + + onMounted(() => { + getDevice(); + }); + + onUnmounted(() => { + stopFetching(); + }); + + return { getAlarmByBaja, alarmData, stopFetching }; +} diff --git a/src/hooks/baja/useRefrigerantHeatMap.js b/src/hooks/baja/useRefrigerantHeatMap.js new file mode 100644 index 0000000..4a68ea9 --- /dev/null +++ b/src/hooks/baja/useRefrigerantHeatMap.js @@ -0,0 +1,150 @@ +import { ref, watch, markRaw } from "vue"; + +export default function useRefrigerantTemp() { + const deviceList = ref([]); + const dataVizExtension = ref(null); + + const getBasicData = (viewer, dataVizExtn, deviceArr) => { + dataVizExtension.value = markRaw(dataVizExtn); + const devices = deviceArr.map((d) => ({ + ...d, + id: d.device_number, // An ID to identify this device + roomDbId: Number(d.room_dbid), + position: JSON.parse(d.device_coordinate_3d), // World coordinates of this device + sensorTypes: ["temperature"], // The types/properties this device exposes + temp: 10, + dbId: d.forge_dbid, + })); + deviceList.value = devices; + initHeatMap(viewer, dataVizExtn, devices); + }; + + const initHeatMap = async (viewer, dataVizExtn, deviceList) => { + const { + SurfaceShadingData, + SurfaceShadingPoint, + SurfaceShadingNode, + SurfaceShadingGroup, + } = Autodesk.DataVisualization.Core; + const shadingGroup = new SurfaceShadingGroup("iot-heatmap"); + const rooms = new Map(); + + for (const { id, roomDbId, position, sensorTypes } of deviceList) { + if (!id || roomDbId == -1) { + continue; + } + + if (!rooms.has(roomDbId)) { + const room = new SurfaceShadingNode(id, roomDbId); + shadingGroup.addChild(room); + rooms.set(roomDbId, room); + } + const room = rooms.get(roomDbId); + room.addPoint(new SurfaceShadingPoint(id, position, sensorTypes)); + } + + const shadingData = new SurfaceShadingData(); + shadingData.addChild(shadingGroup); + shadingData.initialize(viewer.model); + + await dataVizExtn.setupSurfaceShading(viewer.model, shadingData); + dataVizExtn.registerSurfaceShadingColors( + "temperature", + [0x0000ff, 0x00ff00, 0xffff00, 0xff0000] + ); + dataVizExtn.renderSurfaceShading( + "iot-heatmap", + "temperature", + getSensorValue + ); + }; + + // Function that provides sensor value in the range of [0.0, 1.0] + function getSensorValue(device, sensorType, pointData) { + const dev = deviceList.value.find( + ({ device_number }) => device_number === device.id + ); + console.log(9, device, dev); + + return (dev?.temp || 0) / 40; + } + + function updateTemp() { + console.log(8, deviceList.value, dataVizExtension.value.updateSurfaceShading); + dataVizExtension.value.updateSurfaceShading(getSensorValue); + + + } + + const transformDeviceNumber = (device_number) => { + return device_number.replaceAll("_", "/"); + }; + + const subscribeDevice = (deviceList) => { + deviceList.forEach((d) => { + const ordPath = transformDeviceNumber(d.device_number); + getRealTempByBaja(ordPath); + }); + }; + + const getRealTempByBaja = (ordPath) => { + window.require && + window.requirejs(["baja!"], (baja) => { + console.log("進入 bajaSubscriber 準備執行BQL訂閱"); + const sub = new baja.Subscriber(); + function changeDeviceValue(temp) { + const device = deviceList.value.find( + ({ device_number }) => + transformDeviceNumber(device_number) === ordPath + ); + console.log(7, device, temp); + device.temp = Number(temp.replace(" °C", "")); + updateTemp(); + } + sub.attach("changed", (prop) => { + if (prop && prop.$displayName === "Out") { + console.log(5, ordPath, prop); + if (prop.$getValue().getValueDisplay().includes(" °C")) { + changeDeviceValue(prop.$getValue().getValueDisplay()); + } + } + }); + sub.attach("subscribed", (prop) => { + if (prop && prop.$displayName === "Out") { + console.log(6, ordPath, prop); + if (prop.$getValue().getValueDisplay().includes(" °C")) { + changeDeviceValue(prop.$getValue().getValueDisplay()); + } + } + }); + // ord 為要訂閱的點位 + // ord 為要訂閱的點位 + baja.Ord.make(`local:|foxs:|station:|slot:/${ordPath}`) + .get() + .then((folder) => { + folder + .getSlots() + .is("control:NumericWritable") + .eachValue((point) => { + if ( + point.getDisplayName() === "Temp" || + point.getDisplayName() === "TEMP" + ) { + baja.Ord.make( + `local:|foxs:|station:|slot:/${ordPath}/${point.getDisplayName()}` + ).get({ subscriber: sub }); + } + }); + }); + }); + }; + + watch(deviceList, (newValue) => { + subscribeDevice(newValue); + }); + + return { + getBasicData, + updateTemp, + }; +} diff --git a/src/hooks/baja/useSystemHeatmap.js b/src/hooks/baja/useSystemHeatmap.js new file mode 100644 index 0000000..536aeb3 --- /dev/null +++ b/src/hooks/baja/useSystemHeatmap.js @@ -0,0 +1,173 @@ +// to deal with the temperature heatmap +import { ref, watch, markRaw, onUnmounted } from "vue"; +import useSearchParams from "@/hooks/useSearchParam"; + +export default function useSystemHeatmap(updateHeatBarIsShow) { + const { searchParams } = useSearchParams(); + + // Viewer and DataVisualization Extension References + const forgeViewer = ref(null); + const dataVizExtension = ref(null); + const deviceList = ref([]); + const heatMaps = ref({}); + const isHeatMapSetup = ref(false); // 狀態標記,追蹤是否已初始化熱圖 + + // Initialize Heatmap + const initHeatMap = async (viewer) => { + forgeViewer.value = markRaw(viewer); + const dataVizExtn = await viewer.loadExtension( + "Autodesk.DataVisualization" + ); + dataVizExtension.value = markRaw(dataVizExtn); + }; + + // Update Heatmap Data + const updateHeatMapData = (deviceArr) => { + deviceList.value = Object.values(deviceArr).map((d) => ({ + ...d, + id: d.device_number, // An ID to identify this device + roomDbId: d.room_dbid, + position: d.device_coordinate_3d, // World coordinates of this device + sensorTypes: ["temperature"], // The types/properties this device exposes + temp: 10, + dbId: d.forge_dbid, + })); + }; + + //create the heatmap + function getSensorValue(device, sensorType, pointData) { + const dev = deviceList.value.find( + ({ device_number }) => device_number === device.id + ); + console.log(9, device, dev); + // 假設溫度範圍 -20 ~ 40 + const temp = parseFloat(dev?.temp ?? 0); + const min = -20, + max = 40; + const ratio = (temp - min) / (max - min); + return Math.max(0, Math.min(1, ratio)); + } + + // Update Specific Device Temperature + const updateTemp = (device_number, temp) => { + const subDevIndex = deviceList.value.findIndex( + (d) => d.device_number === device_number + ); + if (subDevIndex !== -1) { + deviceList.value[subDevIndex] = { + ...deviceList.value[subDevIndex], + temp, + }; + if (isHeatMapSetup.value) { + dataVizExtension.value.updateSurfaceShading(getSensorValue); + } + } + }; + + // Create Heatmap + const createHeatMap = async (heatMapName) => { + const { + SurfaceShadingData, + SurfaceShadingPoint, + SurfaceShadingNode, + SurfaceShadingGroup, + } = Autodesk.DataVisualization.Core; + + const shadingGroup = new SurfaceShadingGroup(`iot_heatmap_${heatMapName}`); + const rooms = new Map(); + + for (const { id, roomDbId, position, sensorTypes } of deviceList.value) { + if (!id || roomDbId == -1 || !roomDbId) continue; + + if (!rooms.has(roomDbId)) { + const room = new SurfaceShadingNode(id, roomDbId); + shadingGroup.addChild(room); + rooms.set(roomDbId, room); + } + + const room = rooms.get(roomDbId); + room.addPoint(new SurfaceShadingPoint(id, position, sensorTypes)); + } + + const shadingData = new SurfaceShadingData(); + shadingData.addChild(shadingGroup); + shadingData.initialize(forgeViewer.value?.model); + + try { + await dataVizExtension.value.setupSurfaceShading( + forgeViewer.value.model, + shadingData + ); + dataVizExtension.value.registerSurfaceShadingColors( + "temperature", + [0x0000ff, 0x00ff00, 0xffff00, 0xff0000] + ); + dataVizExtension.value.renderSurfaceShading( + `iot_heatmap_${heatMapName}`, + "temperature", + getSensorValue + ); + + isHeatMapSetup.value = true; // 標記初始化完成 + console.log(`熱圖 ${heatMapName} 初始化完成`); + } catch (error) { + console.error("初始化熱圖時出現錯誤:", error); + isHeatMapSetup.value = false; + } + }; + + // Cleanup Heatmap + const cleanupHeatMap = () => { + if (isHeatMapSetup.value) { + try { + dataVizExtension.value?.removeSurfaceShading(); + console.log("成功清理熱圖資源"); + } catch (error) { + console.error("清理熱圖資源時出現錯誤:", error); + } finally { + isHeatMapSetup.value = false; + } + } + }; + + // Watcher for Device List Changes + watch(deviceList, (newValue) => { + console.log("熱圖更新", newValue); + switch (parseInt(searchParams.value.option)) { + case 2: + createHeatMap("frozen"); + updateHeatBarIsShow(true); + break; + case 3: + createHeatMap("gland"); + updateHeatBarIsShow(true); + break; + case 4: + createHeatMap("packing"); + break; + case 5: + createHeatMap("formula"); + updateHeatBarIsShow(true); + break; + default: + if (isHeatMapSetup.value) { + dataVizExtension.value?.removeSurfaceShading(); + isHeatMapSetup.value = false; + console.log("成功移除熱圖"); + } else { + console.warn( + "跳過 removeSurfaceShading,因為尚未 setupSurfaceShading" + ); + } + updateHeatBarIsShow(false); + break; + } + }); + + // Cleanup on Component Unmount + onUnmounted(() => { + cleanupHeatMap(); + }); + + return { updateHeatMapData, updateTemp, initHeatMap }; +} diff --git a/src/hooks/baja/useSystemStatusByBaja.js b/src/hooks/baja/useSystemStatusByBaja.js new file mode 100644 index 0000000..c8a90f5 --- /dev/null +++ b/src/hooks/baja/useSystemStatusByBaja.js @@ -0,0 +1,408 @@ +import { onMounted, ref, computed, watch, markRaw, inject } from "vue"; +import { getDashboardDevice } from "@/apis/dashboard"; +import useSearchParams from "@/hooks/useSearchParam"; +import useSystemHeatmap from "./useSystemHeatmap"; + +export default function useSystemStatusByBaja(updateHeatBarIsShow) { + const rawData = ref([]); + const forgeViewer = ref(null); + const urn = ref(""); + const lightColorMap = { + 1: "#009100", + 2: "#c9bf00", + 4: "#ff1212", + }; + const { searchParams } = useSearchParams(); + + const initialData = ref(null); + + const updateInitialData = (data = false) => { + initialData.value = data; + }; + + const { updateHeatMapData, updateTemp, initHeatMap } = + useSystemHeatmap(updateHeatBarIsShow); + + const updateForgeViewer = (viewer) => { + if (!viewer) { + forgeViewer.value = null; + return; + } + forgeViewer.value = markRaw(viewer); + initHeatMap(viewer); + }; + + const getSubPoint = (normal, close, error, sub_points = []) => { + let points = { + ...Object.fromEntries(sub_points.map((p) => [p, ""])), + }; + if (normal) points[normal] = ""; + if (close) points[close] = ""; + if (error) points[error] = ""; + return points; + }; + const subscribeData = ref({}); + + watch(rawData, () => { + let sub_data = {}; + + rawData.value.forEach((d) => { + sub_data = { + ...sub_data, + ...Object.fromEntries( + (d.device || []).map((dev) => [ + dev.device_number, + { + ...dev, + labelText: d.labelText, + show_value: d.labelText, + device_normal_point_name: d.device_normal_point_name, + device_close_point_name: d.device_close_point_name, + device_error_point_name: d.device_error_point_name, + device_normal_point_value: d.device_normal_point_value, + device_close_point_value: d.device_close_point_value, + device_error_point_value: d.device_error_point_value, + device_normal_color: d.device_normal_color, + device_close_color: d.device_close_color, + device_error_color: d.device_error_color, + forge_dbid: parseInt(dev.forge_dbid), + device_coordinate_3d: dev.device_coordinate_3d + ? JSON.parse(dev.device_coordinate_3d) + : { x: 0, y: 0 }, + points: getSubPoint( + d.device_normal_point_name, + d.device_close_point_name, + d.device_error_point_name, + d.points || [] + ), + subSys:d.subSys, + is_show: true, + currentColor: d.device_normal_color, + }, + ]) + ), + }; + }); + subscribeData.value = sub_data; + updateHeatMapData(sub_data); + updateSubscribeDataFromBaja(sub_data); + }); + + const visibleDbid = computed(() => { + let visible = []; + + rawData.value.forEach((d) => { + visible = [ + ...visible, + ...d.device.map((dev) => parseInt(dev.forge_dbid)), + ]; + }); + + // return visible; + return [26, 32, 38, 43, 48, 53, 58, 63, 70, 76]; + }); + + const getDevice = async (option = 1) => { + const res = await getDashboardDevice({ + option: parseInt(option), + }); + rawData.value = res.data.map((d) => ({ + ...d, + key: d.subSys, + })); + }; + + // subscribe from baja + const booleanPointFacets = ref({}); + const updateFacets = (point, facets) => { + booleanPointFacets.value = { + ...booleanPointFacets, + [point]: facets, + }; + }; + const updateDeviceData = (device_number, point, value) => { + // 檢查 subscribeData.value[device_number] 是否存在 + if (!subscribeData.value[device_number]) { + console.log(`Device ${device_number} is not initialized.`); + return; + } + + const correspondPoint = initialData.value.points.find( + ({ name }) => name === point + ); + // console.log("sub 回傳值 ", typeof value) + const text = correspondPoint + ? correspondPoint.values.find( + ({ value: pValue }) => pValue === parseInt(value) + )?.text || "" + : value; + + // console.log("baja update data sub", correspondPoint, device_number, point, value); + subscribeData.value[device_number].points[point] = text; + if ( + point.toLowerCase() === "temp" && + parseInt(searchParams.value.option) > 1 + ) { + updateTemp(device_number, value); + } + // 當點位是 "light",且目前顏色不是錯誤顏色時,從 lightColorMap 取顏色 + if ( + point.toLowerCase() === "light" && + subscribeData.value[device_number].currentColor !== subscribeData.value[device_number].device_error_color + ) { + subscribeData.value[device_number].currentColor = + lightColorMap[Number(value)] || subscribeData.value[device_number].device_normal_color; + } + + // 當點位是錯誤點時,判斷值是否等於錯誤值,決定是否使用錯誤顏色 + if (point === subscribeData.value[device_number].device_error_point_name) { + subscribeData.value[device_number].currentColor = + value === subscribeData.value[device_number].device_error_point_value + ? subscribeData.value[device_number].device_error_color + : subscribeData.value[device_number].device_normal_color; + } + + updateLabelText(device_number, point, text); + }; + + const transformDeviceNumber = (device_number) => { + return device_number.replaceAll("_", "/"); + }; + + const updateLabelText = (key, point, value) => { + let text = subscribeData.value[key].labelText.replace(`%${point}`, value); + Object.keys(subscribeData.value[key].points) + .filter((p) => p !== point) + .forEach((p) => { + text = text.replace(`%${p}`, subscribeData.value[key].points[p]); + }); + subscribeData.value[key].show_value = text; + }; + + const subComponents = ref(null); + const updateSubscribeDataFromBaja = (data) => { + for (let [key, value] of Object.entries(data)) { + window.require && + window.requirejs(["baja!"], (baja) => { + console.log("進入 bajaSubscriber 準備執行BQL訂閱"); + + const ordPath = transformDeviceNumber(key); + baja.Ord.make(`local:|foxs:|station:|slot:/${ordPath}`) + .get() + .then((folder) => { + const batch = new baja.comm.Batch(); + + const sub = new baja.Subscriber(); + sub.attach({ + changed: function (prop, cx) { + if (prop.$getDisplayName() !== "Out") return; + if ( + Object.hasOwn( + booleanPointFacets.value, + prop.$complex.$propInParent.$slotName + ) + ) { + const facets = + booleanPointFacets.value[ + prop.$complex.$propInParent.$slotName + ]; + + for (let [facetKey, facetValue] of Object.entries(facets)) { + if (facetValue === prop.$getValue().getValueDisplay()) { + updateDeviceData( + key, + prop.$complex.$propInParent.$slotName, + facetKey + ); + } + } + } else { + updateDeviceData( + key, + prop.$complex.$propInParent.$slotName, + prop.$getValue().getValueDisplay() + ); + } + }, + }); + + folder + .getSlots() + .is("control:ControlPoint") + .eachValue((point) => { + if ( + Object.keys(value.points).includes(point.getDisplayName()) + ) { + baja.Ord.make( + `local:|foxs:|station:|slot:/${ordPath}/${point.getDisplayName()}` + ) + .get() + .then((component) => { + if ( + point.getType().getTypeSpec() === + "control:BooleanWritable" + ) { + const facets = component.getFacets1().toObject(); + updateFacets(point.getDisplayName(), facets); + for (let [facetKey, facetValue] of Object.entries( + facets + )) { + if ( + facetValue === + component.getOut().getValue().toString() + ) { + updateDeviceData( + key, + point.getDisplayName(), + facetKey + ); + } + } + } else { + updateDeviceData( + key, + point.getDisplayName(), + component.getOut().getValue() + ); + } + + sub + .subscribe({ + comps: component, // Can also just be an singular Component instance + batch, // if defined, any network calls will be batched into this object (optional) + }) + .then(() => { + console.log("subscribed successfully"); + subComponents.value = sub; + }) + .catch(function (err) { + baja.error( + "some components failed to subscribe: " + err + ); + }); + }); + } + }); + }); + }); + } + }; + + const updateDbidPosition = (viewer, data) => { + if (!viewer) return; + if (!forgeViewer.value) forgeViewer.value = markRaw(viewer); + const tree = viewer.model.getData().instanceTree; + const fragList = viewer.model.getFragmentList(); + for (let [key, value] of Object.entries(data)) { + const nodebBox = new window.THREE.Box3(); + + // for each fragId on the list, get the bounding box + tree.enumNodeFragments( + value.forge_dbid, + (fragId) => { + const fragbBox = new window.THREE.Box3(); + fragList.getWorldBounds(fragId, fragbBox); + nodebBox.union(fragbBox); // create a unifed bounding box + }, + true + ); + subscribeData.value[key].device_coordinate_3d = viewer.worldToClient( + nodebBox.getCenter() + ); + subscribeData.value[key].is_show = viewer.isNodeVisible(value.forge_dbid); + } + }; + + const fitToView = () => { + const { x, y, z } = JSON.parse(searchParams.value.camera_position); + const newPosition = new THREE.Vector3(x, y, z); //!<<< 相机的新位置 + + const { + x: x1, + y: y1, + z: z1, + } = JSON.parse(searchParams.value.target_position); //!<<< 计算新焦点位置 + const newTarget = new THREE.Vector3(x1, y1, z1); //!<<< 焦點的新位置 + + forgeViewer.value.navigation.getCamera().setView({ + position: newPosition.clone(), + target: newTarget.clone(), + }); + setTimeout(() => { + updateDbidPosition(forgeViewer.value, subscribeData.value); + }, 700); + }; + + const hideAllObjects = (instanceTree, filDbids = []) => { + const tree = instanceTree || forgeViewer.value.model?.getInstanceTree(); + const allDbIdsStr = Object.keys(tree.nodeAccess.dbIdToIndex); + for (var i = 0; i < allDbIdsStr.length; i++) { + forgeViewer.value.hide(parseInt(allDbIdsStr[i])); + } + + for (var i = 0; i < filDbids.length; i++) { + forgeViewer.value.show(parseInt(filDbids[i])); + } + fitToView(); + forgeViewer.value.impl.invalidate(true); + }; + + const loadModel = (viewer, filePath) => { + return new Promise(function (resolve, reject) { + // 使用 loadModel 直接加載本地 .svf 文件 + viewer.loadModel( + filePath, + {}, + (model) => { + viewer.setGroundShadow(false); + viewer.setLightPreset(18); + + viewer.impl.renderer().setClearAlpha(0); // 清除 alpha 通道 + viewer.impl.glrenderer().setClearColor(0xffffff, 0); // 設置透明背景,顏色碼無關緊要 + viewer.impl.invalidate(true); // 觸發渲染 + resolve(model); + }, + (error) => { + console.error("模型加載失敗: ", error); + reject(error); + } + ); + }); + }; + + const reloadModal = () => {}; + + watch(visibleDbid, (newValue) => { + forgeViewer.value && + hideAllObjects(forgeViewer.value.model.getData().instanceTree, newValue); + }); + + watch(initialData, (newValue) => { + if (newValue) { + getDevice(searchParams.value.option); + } + }); + + watch( + searchParams, + (newValue) => { + getDevice(newValue.option); + }, + { + deep: true, + } + ); + + return { + subscribeData, + visibleDbid, + updateDbidPosition, + hideAllObjects, + updateForgeViewer, + forgeViewer, + loadModel, + urn, + updateInitialData, + subComponents, + }; +} diff --git a/src/hooks/useActiveBtn.js b/src/hooks/useActiveBtn.js new file mode 100644 index 0000000..9691ab2 --- /dev/null +++ b/src/hooks/useActiveBtn.js @@ -0,0 +1,41 @@ +import { computed } from "@vue/reactivity"; +import { ref } from "vue"; +export default function useActiveBtn(type = "single") { + // default buttons + const items = ref([]); + + const setItems = (btnGroup) => { + items.value = btnGroup; + }; + + const selectedBtn = computed(() => { + if (type === "single") { + return items.value?.find((d) => { + return d.active + }); + } else if (type === "multiple") { + return items.value?.filter(({ active }) => active); + } + }); + + // change active button + const changeActiveBtn = (item) => { + if (type === "single") { + // 先將全部變成false + const newItems = Object.assign(items.value).map((it) => ({ + ...it, + active: item.key === it.key, + })); + items.value = newItems; + } else if (type === "multiple") { + // 先將全部變成false + const newItems = Object.assign(items.value).map((it) => ({ + ...it, + active: item.key === it.key ? !item.active : it.active, + })); + items.value = newItems; + } + }; + + return { items, changeActiveBtn, setItems, selectedBtn }; +} diff --git a/src/hooks/useDashboardOption.js b/src/hooks/useDashboardOption.js new file mode 100644 index 0000000..ad2117a --- /dev/null +++ b/src/hooks/useDashboardOption.js @@ -0,0 +1,20 @@ +import { inject, watch } from "vue"; + +export default function useDashboardOption( + SetFn, + injectData = "dashboard_items" +) { + const { initialData } = inject(injectData); + + watch(initialData, (newValue) => { + const data = newValue.points[1].values.filter(({ value }) => value !== 0); + SetFn( + data.map(({ value, text }, index) => ({ + title: text, + key: `option_${value}`, + active: index === 0, + typeOption: value, + })) + ); + }); +} diff --git a/src/hooks/useFormErrorMessage.js b/src/hooks/useFormErrorMessage.js new file mode 100644 index 0000000..4d40f21 --- /dev/null +++ b/src/hooks/useFormErrorMessage.js @@ -0,0 +1,50 @@ +import { onMounted, ref } from "vue"; + +export default function useFormErrorMessage(scheme) { + const formErrorMsg = ref({}); + + onMounted(() => { + // formErrorMsg.value = scheme + if (scheme) { + formErrorMsg.value = Object.fromEntries( + Object.keys(scheme.fields).map((f) => [f, ""]) + ); + } + }); + + const handleSubmit = (scheme, value) => { + return new Promise((resolve, reject) => { + scheme + .validate(value, { + abortEarly: false, + }) + .then((res) => resolve(res)) + .catch((err) => { + let errorMsg = Object.fromEntries( + err.inner.map((e) => [e.path, e.message]) + ); + formErrorMsg.value = errorMsg; + reject(errorMsg); + }); + }); + }; + + const handleErrorReset = () => { + // formErrorMsg.value = Object.fromEntries( + // Object.keys(scheme.fields).map((f) => [f, ""]) + // ); + let resetMsg = {}; + for (let key in formErrorMsg.value) { + resetMsg[key] = ""; + } + formErrorMsg.value = resetMsg; + }; + + const updateScheme = (scheme) => { + formErrorMsg.value = Object.fromEntries( + Object.keys(scheme.fields).map((f) => [f, ""]) + ); + }; + + return { formErrorMsg, handleSubmit, handleErrorReset, updateScheme }; +} diff --git a/src/hooks/useGetCookie.js b/src/hooks/useGetCookie.js new file mode 100644 index 0000000..6d150b0 --- /dev/null +++ b/src/hooks/useGetCookie.js @@ -0,0 +1,8 @@ +export default function getCookie(cookieName) { + let cookie = {}; + document.cookie.split(";").forEach(function (el) { + let [key, value] = el.split("="); + cookie[key.trim()] = value; + }); + return cookie[cookieName]; +} diff --git a/src/hooks/useGetDevice.js b/src/hooks/useGetDevice.js new file mode 100644 index 0000000..a717fe6 --- /dev/null +++ b/src/hooks/useGetDevice.js @@ -0,0 +1,31 @@ +import { ref, computed } from "vue"; +import instance from "@/util/request"; +import { GET_DEVICELIST_API } from "@/constant"; + +export default function useGetDevice() { + const deviceList = ref(null); + //取得設備列表 + const getDeviceList = async ({ + building_tag, + main_system_tag, + sub_system_tag, + floor_tag, + }) => { + const res = await instance.post(GET_DEVICELIST_API, { + building_tag, + floor_tag, + sub_system_tag, + }); + + let devices = [] + res.data.data.forEach(({device_list})=>{ + devices = [...devices, ...device_list] + }) + deviceList.value = devices; + }; + + return { + deviceList, + getDeviceList, + }; +} diff --git a/src/hooks/useSearchParam.js b/src/hooks/useSearchParam.js new file mode 100644 index 0000000..c971a02 --- /dev/null +++ b/src/hooks/useSearchParam.js @@ -0,0 +1,29 @@ +// 取得目前的params +import { computed } from "vue"; +import { useRouter, useRoute } from "vue-router"; + +export default function useSearchParam() { + const router = useRouter(); + const route = useRoute(); + + const searchParams = computed(() => route.query); + + // 排除null + + const deleteNull = (query) => { + let newQuery = {}; + for (let key in query) { + if (Array.isArray(query[key]) && query[key].length === 0) continue; + if (query[key]) { + newQuery[key] = query[key]; + } + } + return newQuery; + }; + + const changeParams = (query) => { + router.push({ path: route.path, query: deleteNull(query) }); + }; + + return { searchParams, changeParams }; +} diff --git a/src/lib/jquery-ui/AUTHORS.txt b/src/lib/jquery-ui/AUTHORS.txt new file mode 100644 index 0000000..5fcf5d1 --- /dev/null +++ b/src/lib/jquery-ui/AUTHORS.txt @@ -0,0 +1,381 @@ +Authors ordered by first contribution +A list of current team members is available at https://jqueryui.com/about + +Paul Bakaus +Richard Worth +Yehuda Katz +Sean Catchpole +John Resig +Tane Piper +Dmitri Gaskin +Klaus Hartl +Stefan Petre +Gilles van den Hoven +Micheil Bryan Smith +Jörn Zaefferer +Marc Grabanski +Keith Wood +Brandon Aaron +Scott González +Eduardo Lundgren +Aaron Eisenberger +Joan Piedra +Bruno Basto +Remy Sharp +Bohdan Ganicky +David Bolter +Chi Cheng +Ca-Phun Ung +Ariel Flesler +Maggie Wachs +Scott Jehl +Todd Parker +Andrew Powell +Brant Burnett +Douglas Neiner +Paul Irish +Ralph Whitbeck +Thibault Duplessis +Dominique Vincent +Jack Hsu +Adam Sontag +Carl Fürstenberg +Kevin Dalman +Alberto Fernández Capel +Jacek Jędrzejewski (https://jacek.jedrzejewski.name) +Ting Kuei +Samuel Cormier-Iijima +Jon Palmer +Ben Hollis +Justin MacCarthy +Eyal Kobrigo +Tiago Freire +Diego Tres +Holger Rüprich +Ziling Zhao +Mike Alsup +Robson Braga Araujo +Pierre-Henri Ausseil +Christopher McCulloh +Andrew Newcomb +Lim Chee Aun +Jorge Barreiro +Daniel Steigerwald +John Firebaugh +John Enters +Andrey Kapitcyn +Dmitry Petrov +Eric Hynds +Chairat Sunthornwiphat +Josh Varner +Stéphane Raimbault +Jay Merrifield +J. Ryan Stinnett +Peter Heiberg +Alex Dovenmuehle +Jamie Gegerson +Raymond Schwartz +Phillip Barnes +Kyle Wilkinson +Khaled AlHourani +Marian Rudzynski +Jean-Francois Remy +Doug Blood +Filippo Cavallarin +Heiko Henning +Aliaksandr Rahalevich +Mario Visic +Xavi Ramirez +Max Schnur +Saji Nediyanchath +Corey Frang +Aaron Peterson +Ivan Peters +Mohamed Cherif Bouchelaghem +Marcos Sousa +Michael DellaNoce +George Marshall +Tobias Brunner +Martin Solli +David Petersen +Dan Heberden +William Kevin Manire +Gilmore Davidson +Michael Wu +Adam Parod +Guillaume Gautreau +Marcel Toele +Dan Streetman +Matt Hoskins +Giovanni Giacobbi +Kyle Florence +Pavol Hluchý +Hans Hillen +Mark Johnson +Trey Hunner +Shane Whittet +Edward A Faulkner +Adam Baratz +Kato Kazuyoshi +Eike Send +Kris Borchers +Eddie Monge +Israel Tsadok +Carson McDonald +Jason Davies +Garrison Locke +David Murdoch +Benjamin Scott Boyle +Jesse Baird +Jonathan Vingiano +Dylan Just +Hiroshi Tomita +Glenn Goodrich +Tarafder Ashek-E-Elahi +Ryan Neufeld +Marc Neuwirth +Philip Graham +Benjamin Sterling +Wesley Walser +Kouhei Sutou +Karl Kirch +Chris Kelly +Jason Oster +Felix Nagel +Alexander Polomoshnov +David Leal +Igor Milla +Dave Methvin +Florian Gutmann +Marwan Al Jubeh +Milan Broum +Sebastian Sauer +Gaëtan Muller +Michel Weimerskirch +William Griffiths +Stojce Slavkovski +David Soms +David De Sloovere +Michael P. Jung +Shannon Pekary +Dan Wellman +Matthew Edward Hutton +James Khoury +Rob Loach +Alberto Monteiro +Alex Rhea +Krzysztof Rosiński +Ryan Olton +Genie <386@mail.com> +Rick Waldron +Ian Simpson +Lev Kitsis +TJ VanToll +Justin Domnitz +Douglas Cerna +Bert ter Heide +Jasvir Nagra +Yuriy Khabarov <13real008@gmail.com> +Harri Kilpiö +Lado Lomidze +Amir E. Aharoni +Simon Sattes +Jo Liss +Guntupalli Karunakar +Shahyar Ghobadpour +Lukasz Lipinski +Timo Tijhof +Jason Moon +Martin Frost +Eneko Illarramendi +EungJun Yi +Courtland Allen +Viktar Varvanovich +Danny Trunk +Pavel Stetina +Michael Stay +Steven Roussey +Michael Hollis +Lee Rowlands +Timmy Willison +Karl Swedberg +Baoju Yuan +Maciej Mroziński +Luis Dalmolin +Mark Aaron Shirley +Martin Hoch +Jiayi Yang +Philipp Benjamin Köppchen +Sindre Sorhus +Bernhard Sirlinger +Jared A. Scheel +Rafael Xavier de Souza +John Chen +Robert Beuligmann +Dale Kocian +Mike Sherov +Andrew Couch +Marc-Andre Lafortune +Nate Eagle +David Souther +Mathias Stenbom +Sergey Kartashov +Avinash R +Ethan Romba +Cory Gackenheimer +Juan Pablo Kaniefsky +Roman Salnikov +Anika Henke +Samuel Bovée +Fabrício Matté +Viktor Kojouharov +Pawel Maruszczyk (http://hrabstwo.net) +Pavel Selitskas +Bjørn Johansen +Matthieu Penant +Dominic Barnes +David Sullivan +Thomas Jaggi +Vahid Sohrabloo +Travis Carden +Bruno M. Custódio +Nathanael Silverman +Christian Wenz +Steve Urmston +Zaven Muradyan +Woody Gilk +Zbigniew Motyka +Suhail Alkowaileet +Toshi MARUYAMA +David Hansen +Brian Grinstead +Christian Klammer +Steven Luscher +Gan Eng Chin +Gabriel Schulhof +Alexander Schmitz +Vilhjálmur Skúlason +Siebrand Mazeland +Mohsen Ekhtiari +Pere Orga +Jasper de Groot +Stephane Deschamps +Jyoti Deka +Andrei Picus +Ondrej Novy +Jacob McCutcheon +Monika Piotrowicz +Imants Horsts +Eric Dahl +Dave Stein +Dylan Barrell +Daniel DeGroff +Michael Wiencek +Thomas Meyer +Ruslan Yakhyaev +Brian J. Dowling +Ben Higgins +Yermo Lamers +Patrick Stapleton +Trisha Crowley +Usman Akeju +Rodrigo Menezes +Jacques Perrault +Frederik Elvhage +Will Holley +Uri Gilad +Richard Gibson +Simen Bekkhus +Chen Eshchar +Bruno Pérel +Mohammed Alshehri +Lisa Seacat DeLuca +Anne-Gaelle Colom +Adam Foster +Luke Page +Daniel Owens +Michael Orchard +Marcus Warren +Nils Heuermann +Marco Ziech +Patricia Juarez +Ben Mosher +Ablay Keldibek +Thomas Applencourt +Jiabao Wu +Eric Lee Carraway +Victor Homyakov +Myeongjin Lee +Liran Sharir +Weston Ruter +Mani Mishra +Hannah Methvin +Leonardo Balter +Benjamin Albert +Michał Gołębiowski-Owczarek +Alyosha Pushak +Fahad Ahmad +Matt Brundage +Francesc Baeta +Piotr Baran +Mukul Hase +Konstantin Dinev +Rand Scullard +Dan Strohl +Maksim Ryzhikov +Amine HADDAD +Amanpreet Singh +Alexey Balchunas +Peter Kehl +Peter Dave Hello +Johannes Schäfer +Ville Skyttä +Ryan Oriecuia +Sergei Ratnikov +milk54 +Evelyn Masso +Robin +Simon Asika +Kevin Cupp +Jeremy Mickelson +Kyle Rosenberg +Petri Partio +pallxk +Luke Brookhart +claudi +Eirik Sletteberg +Albert Johansson +A. Wells +Robert Brignull +Horus68 +Maksymenkov Eugene +OskarNS +Gez Quinn +jigar gala +Florian Wegscheider +Fatér Zsolt +Szabolcs Szabolcsi-Toth +Jérémy Munsch +Hrvoje Novosel +Paul Capron +Micah Miller +sakshi87 <53863764+sakshi87@users.noreply.github.com> +Mikolaj Wolicki +Patrick McKay +c-lambert <58025159+c-lambert@users.noreply.github.com> +Josep Sanz +Ben Mullins +Christian Oliff +dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +Adam Lidén Hällgren +James Hinderks +Denny Septian Panggabean <97607754+ddevsr@users.noreply.github.com> +Matías Cánepa +Ashish Kurmi <100655670+boahc077@users.noreply.github.com> +DeerBear +Дилян Палаузов +Kenneth DeBacker +Timo Tijhof +Timmy Willison +divdeploy <166095818+divdeploy@users.noreply.github.com> +mark van tilburg diff --git a/src/lib/jquery-ui/LICENSE.txt b/src/lib/jquery-ui/LICENSE.txt new file mode 100644 index 0000000..7810829 --- /dev/null +++ b/src/lib/jquery-ui/LICENSE.txt @@ -0,0 +1,43 @@ +Copyright OpenJS Foundation and other contributors, https://openjsf.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. diff --git a/src/lib/jquery-ui/external/jquery/jquery.js b/src/lib/jquery-ui/external/jquery/jquery.js new file mode 100644 index 0000000..1a86433 --- /dev/null +++ b/src/lib/jquery-ui/external/jquery/jquery.js @@ -0,0 +1,10716 @@ +/*! + * jQuery JavaScript Library v3.7.1 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-08-28T13:37Z + */ +( function( global, factory ) { + + "use strict"; + + if ( typeof module === "object" && typeof module.exports === "object" ) { + + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket trac-14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +} )( typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1 +// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode +// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common +// enough that all such attempts are guarded in a try block. +"use strict"; + +var arr = []; + +var getProto = Object.getPrototypeOf; + +var slice = arr.slice; + +var flat = arr.flat ? function( array ) { + return arr.flat.call( array ); +} : function( array ) { + return arr.concat.apply( [], array ); +}; + + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var fnToString = hasOwn.toString; + +var ObjectFunctionString = fnToString.call( Object ); + +var support = {}; + +var isFunction = function isFunction( obj ) { + + // Support: Chrome <=57, Firefox <=52 + // In some browsers, typeof returns "function" for HTML elements + // (i.e., `typeof document.createElement( "object" ) === "function"`). + // We don't want to classify *any* DOM node as a function. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +var isWindow = function isWindow( obj ) { + return obj != null && obj === obj.window; + }; + + +var document = window.document; + + + + var preservedScriptAttributes = { + type: true, + src: true, + nonce: true, + noModule: true + }; + + function DOMEval( code, node, doc ) { + doc = doc || document; + + var i, val, + script = doc.createElement( "script" ); + + script.text = code; + if ( node ) { + for ( i in preservedScriptAttributes ) { + + // Support: Firefox 64+, Edge 18+ + // Some browsers don't support the "nonce" property on scripts. + // On the other hand, just using `getAttribute` is not enough as + // the `nonce` attribute is reset to an empty string whenever it + // becomes browsing-context connected. + // See https://github.com/whatwg/html/issues/2369 + // See https://html.spec.whatwg.org/#nonce-attributes + // The `node.getAttribute` check was added for the sake of + // `jQuery.globalEval` so that it can fake a nonce-containing node + // via an object. + val = node[ i ] || node.getAttribute && node.getAttribute( i ); + if ( val ) { + script.setAttribute( i, val ); + } + } + } + doc.head.appendChild( script ).parentNode.removeChild( script ); + } + + +function toType( obj ) { + if ( obj == null ) { + return obj + ""; + } + + // Support: Android <=2.3 only (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; +} +/* global Symbol */ +// Defining this global in .eslintrc.json would create a danger of using the global +// unguarded in another place, it seems safer to define global only for this module + + + +var version = "3.7.1", + + rhtmlSuffix = /HTML$/i, + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + + // Return all the elements in a clean array + if ( num == null ) { + return slice.call( this ); + } + + // Return just the one element from the set + return num < 0 ? this[ num + this.length ] : this[ num ]; + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + even: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return ( i + 1 ) % 2; + } ) ); + }, + + odd: function() { + return this.pushStack( jQuery.grep( this, function( _elem, i ) { + return i % 2; + } ) ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !isFunction( target ) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + copy = options[ name ]; + + // Prevent Object.prototype pollution + // Prevent never-ending loop + if ( name === "__proto__" || target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = Array.isArray( copy ) ) ) ) { + src = target[ name ]; + + // Ensure proper type for the source value + if ( copyIsArray && !Array.isArray( src ) ) { + clone = []; + } else if ( !copyIsArray && !jQuery.isPlainObject( src ) ) { + clone = {}; + } else { + clone = src; + } + copyIsArray = false; + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isPlainObject: function( obj ) { + var proto, Ctor; + + // Detect obvious negatives + // Use toString instead of jQuery.type to catch host objects + if ( !obj || toString.call( obj ) !== "[object Object]" ) { + return false; + } + + proto = getProto( obj ); + + // Objects with no prototype (e.g., `Object.create( null )`) are plain + if ( !proto ) { + return true; + } + + // Objects with prototype are plain iff they were constructed by a global Object function + Ctor = hasOwn.call( proto, "constructor" ) && proto.constructor; + return typeof Ctor === "function" && fnToString.call( Ctor ) === ObjectFunctionString; + }, + + isEmptyObject: function( obj ) { + var name; + + for ( name in obj ) { + return false; + } + return true; + }, + + // Evaluates a script in a provided context; falls back to the global one + // if not specified. + globalEval: function( code, options, doc ) { + DOMEval( code, { nonce: options && options.nonce }, doc ); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + + // Retrieve the text value of an array of DOM nodes + text: function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + + // If no nodeType, this is expected to be an array + while ( ( node = elem[ i++ ] ) ) { + + // Do not traverse comment nodes + ret += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return flat( ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ]; +} + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), + function( _i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); + } ); + +function isArrayLike( obj ) { + + // Support: real iOS 8.2 only (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = toType( obj ); + + if ( isFunction( obj ) || isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + +var i, + Expr, + outermostContext, + sortInput, + hasDuplicate, + push = pushNative, + + // Local document vars + document, + documentElement, + documentIsHTML, + rbuggyQSA, + matches, + + // Instance-specific data + expando = jQuery.expando, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // https://www.w3.org/TR/css-syntax-3/#ident-token-diagram + identifier = "(?:\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\[^\\r\\n\\f]|[\\w-]|[^\0-\\x7f])+", + + // Attribute selectors: https://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + + whitespace + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rleadingCombinator = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + + whitespace + "*" ), + rdescend = new RegExp( whitespace + "|>" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + ID: new RegExp( "^#(" + identifier + ")" ), + CLASS: new RegExp( "^\\.(" + identifier + ")" ), + TAG: new RegExp( "^(" + identifier + "|[*])" ), + ATTR: new RegExp( "^" + attributes ), + PSEUDO: new RegExp( "^" + pseudos ), + CHILD: new RegExp( + "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + + whitespace + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + + whitespace + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + bool: new RegExp( "^(?:" + booleans + ")$", "i" ), + + // For use in libraries implementing .is() + // We use this for POS matching in `select` + needsContext: new RegExp( "^" + whitespace + + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + whitespace + + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // https://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\[\\da-fA-F]{1,6}" + whitespace + + "?|\\\\([^\\r\\n\\f])", "g" ), + funescape = function( escape, nonHex ) { + var high = "0x" + escape.slice( 1 ) - 0x10000; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return nonHex; + } + + // Replace a hexadecimal escape sequence with the encoded Unicode code point + // Support: IE <=11+ + // For values outside the Basic Multilingual Plane (BMP), manually construct a + // surrogate pair + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE/Edge. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + ( arr = slice.call( preferredDoc.childNodes ) ), + preferredDoc.childNodes + ); + + // Support: Android <=4.0 + // Detect silently failing push.apply + // eslint-disable-next-line no-unused-expressions + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { + apply: function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); + } + }; +} + +function find( selector, context, results, seed ) { + var m, i, elem, nid, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + setDocument( context ); + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && ( match = rquickExpr.exec( selector ) ) ) { + + // ID selector + if ( ( m = match[ 1 ] ) ) { + + // Document context + if ( nodeType === 9 ) { + if ( ( elem = context.getElementById( m ) ) ) { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + push.call( results, elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + find.contains( context, elem ) && + elem.id === m ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + newSelector = selector; + newContext = context; + + // qSA considers elements outside a scoping root when evaluating child or + // descendant combinators, which is not what we want. + // In such cases, we work around the behavior by prefixing every selector in the + // list with an ID selector referencing the scope context. + // The technique has to be used as well when a leading combinator is used + // as such selectors are not recognized by querySelectorAll. + // Thanks to Andrew Dupont for this technique. + if ( nodeType === 1 && + ( rdescend.test( selector ) || rleadingCombinator.test( selector ) ) ) { + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + + // We can use :scope instead of the ID hack if the browser + // supports it & if we're not changing the context. + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when + // strict-comparing two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( newContext != context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } else { + context.setAttribute( "id", ( nid = expando ) ); + } + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + while ( i-- ) { + groups[ i ] = ( nid ? "#" + nid : ":scope" ) + " " + + toSelector( groups[ i ] ); + } + newSelector = groups.join( "," ); + } + + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + nonnativeSelectorCache( selector, true ); + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + + // All others + return select( selector.replace( rtrimCSS, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + + // Use (key + " ") to avoid collision with native prototype properties + // (see https://github.com/jquery/sizzle/issues/157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return ( cache[ key + " " ] = value ); + } + return cache; +} + +/** + * Mark a function for special use by jQuery selector module + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created element and returns a boolean result + */ +function assert( fn ) { + var el = document.createElement( "fieldset" ); + + try { + return !!fn( el ); + } catch ( e ) { + return false; + } finally { + + // Remove from its parent by default + if ( el.parentNode ) { + el.parentNode.removeChild( el ); + } + + // release memory in IE + el = null; + } +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "button" ) ) && + elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for :enabled/:disabled + * @param {Boolean} disabled true for :disabled; false for :enabled + */ +function createDisabledPseudo( disabled ) { + + // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable + return function( elem ) { + + // Only certain elements can match :enabled or :disabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled + // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled + if ( "form" in elem ) { + + // Check for inherited disabledness on relevant non-disabled elements: + // * listed form-associated elements in a disabled fieldset + // https://html.spec.whatwg.org/multipage/forms.html#category-listed + // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled + // * option elements in a disabled optgroup + // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled + // All such elements have a "form" property. + if ( elem.parentNode && elem.disabled === false ) { + + // Option elements defer to a parent optgroup if present + if ( "label" in elem ) { + if ( "label" in elem.parentNode ) { + return elem.parentNode.disabled === disabled; + } else { + return elem.disabled === disabled; + } + } + + // Support: IE 6 - 11+ + // Use the isDisabled shortcut property to check for disabled fieldset ancestors + return elem.isDisabled === disabled || + + // Where there is no isDisabled, check manually + elem.isDisabled !== !disabled && + inDisabledFieldset( elem ) === disabled; + } + + return elem.disabled === disabled; + + // Try to winnow out elements that can't be disabled before trusting the disabled property. + // Some victims get caught in our net (label, legend, menu, track), but it shouldn't + // even exist on them, let alone have a boolean value. + } else if ( "label" in elem ) { + return elem.disabled === disabled; + } + + // Remaining elements are neither :enabled nor :disabled + return false; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction( function( argument ) { + argument = +argument; + return markFunction( function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ ( j = matchIndexes[ i ] ) ] ) { + seed[ j ] = !( matches[ j ] = seed[ j ] ); + } + } + } ); + } ); +} + +/** + * Checks a node for validity as a jQuery selector context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +function setDocument( node ) { + var subWindow, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( doc == document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); + } + + // Support: IE <10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programmatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert( function( el ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; + } ); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } + } ); + + // ID filter and find + if ( support.getById ) { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute( "id" ) === attrId; + }; + }; + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var elem = context.getElementById( id ); + return elem ? [ elem ] : []; + } + }; + } else { + Expr.filter.ID = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode( "id" ); + return node && node.value === attrId; + }; + }; + + // Support: IE 6 - 7 only + // getElementById is not reliable as a find shortcut + Expr.find.ID = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var node, i, elems, + elem = context.getElementById( id ); + + if ( elem ) { + + // Verify the id attribute + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + + // Fall back on getElementsByName + elems = context.getElementsByName( id ); + i = 0; + while ( ( elem = elems[ i++ ] ) ) { + node = elem.getAttributeNode( "id" ); + if ( node && node.value === id ) { + return [ elem ]; + } + } + } + + return []; + } + }; + } + + // Tag + Expr.find.TAG = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; + + // Class + Expr.find.CLASS = function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + rbuggyQSA = []; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + documentElement.appendChild( el ).innerHTML = + "" + + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: iOS 8 only + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibling-combinator selector` fails + if ( !el.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push( ".#.+[+~]" ); + } + + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Support: IE 11+, Edge 15 - 18+ + // IE 11/Edge don't find elements on a `[name='']` query in some cases. + // Adding a temporary attribute to the document before the selection works + // around the issue. + // Interestingly, IE 10 & older don't seem to have the issue. + input = document.createElement( "input" ); + input.setAttribute( "name", "" ); + el.appendChild( input ); + if ( !el.querySelectorAll( "[name='']" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*name" + whitespace + "*=" + + whitespace + "*(?:''|\"\")" ); + } + } ); + + if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + compare = ( a.ownerDocument || a ) == ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + ( !support.sortDetached && b.compareDocumentPosition( a ) === compare ) ) { + + // Choose the first element that is related to our preferred document + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( a === document || a.ownerDocument == preferredDoc && + find.contains( preferredDoc, a ) ) { + return -1; + } + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( b === document || b.ownerDocument == preferredDoc && + find.contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + }; + + return document; +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ expr + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch ( e ) { + nonnativeSelectorCache( expr, true ); + } + } + + return find( expr, document, null, [ elem ] ).length > 0; +}; + +find.contains = function( context, elem ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( context.ownerDocument || context ) != document ) { + setDocument( context ); + } + return jQuery.contains( context, elem ); +}; + + +find.attr = function( elem, name ) { + + // Set document vars if needed + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( ( elem.ownerDocument || elem ) != document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + + // Don't get fooled by Object.prototype properties (see trac-13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + if ( val !== undefined ) { + return val; + } + + return elem.getAttribute( name ); +}; + +find.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +Expr = jQuery.expr = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + ATTR: function( match ) { + match[ 1 ] = match[ 1 ].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[ 3 ] = ( match[ 3 ] || match[ 4 ] || match[ 5 ] || "" ) + .replace( runescape, funescape ); + + if ( match[ 2 ] === "~=" ) { + match[ 3 ] = " " + match[ 3 ] + " "; + } + + return match.slice( 0, 4 ); + }, + + CHILD: function( match ) { + + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[ 1 ] = match[ 1 ].toLowerCase(); + + if ( match[ 1 ].slice( 0, 3 ) === "nth" ) { + + // nth-* requires argument + if ( !match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[ 4 ] = +( match[ 4 ] ? + match[ 5 ] + ( match[ 6 ] || 1 ) : + 2 * ( match[ 3 ] === "even" || match[ 3 ] === "odd" ) + ); + match[ 5 ] = +( ( match[ 7 ] + match[ 8 ] ) || match[ 3 ] === "odd" ); + + // other types prohibit arguments + } else if ( match[ 3 ] ) { + find.error( match[ 0 ] ); + } + + return match; + }, + + PSEUDO: function( match ) { + var excess, + unquoted = !match[ 6 ] && match[ 2 ]; + + if ( matchExpr.CHILD.test( match[ 0 ] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[ 3 ] ) { + match[ 2 ] = match[ 4 ] || match[ 5 ] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + + // Get excess from tokenize (recursively) + ( excess = tokenize( unquoted, true ) ) && + + // advance to the next closing parenthesis + ( excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length ) ) { + + // excess is a negative index + match[ 0 ] = match[ 0 ].slice( 0, excess ); + match[ 2 ] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + TAG: function( nodeNameSelector ) { + var expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + CLASS: function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + ( pattern = new RegExp( "(^|" + whitespace + ")" + className + + "(" + whitespace + "|$)" ) ) && + classCache( className, function( elem ) { + return pattern.test( + typeof elem.className === "string" && elem.className || + typeof elem.getAttribute !== "undefined" && + elem.getAttribute( "class" ) || + "" + ); + } ); + }, + + ATTR: function( name, operator, check ) { + return function( elem ) { + var result = find.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return false; + }; + }, + + CHILD: function( type, what, _argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, _context, xml ) { + var cache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( ( node = node[ dir ] ) ) { + if ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) { + + return false; + } + } + + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( ( node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + + // Use the same loop as above to seek `elem` from the start + while ( ( node = ++nodeIndex && node && node[ dir ] || + ( diff = nodeIndex = 0 ) || start.pop() ) ) { + + if ( ( ofType ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + outerCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + PSEUDO: function( pseudo, argument ) { + + // pseudo-class names are case-insensitive + // https://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + find.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction( function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf.call( seed, matched[ i ] ); + seed[ idx ] = !( matches[ idx ] = matched[ i ] ); + } + } ) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + + // Potentially complex pseudos + not: markFunction( function( selector ) { + + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrimCSS, "$1" ) ); + + return matcher[ expando ] ? + markFunction( function( seed, matches, _context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( ( elem = unmatched[ i ] ) ) { + seed[ i ] = !( matches[ i ] = elem ); + } + } + } ) : + function( elem, _context, xml ) { + input[ 0 ] = elem; + matcher( input, null, xml, results ); + + // Don't keep the element + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || jQuery.text( elem ) ).indexOf( text ) > -1; + }; + } ), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + find.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( ( elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute( "xml:lang" ) || elem.getAttribute( "lang" ) ) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( ( elem = elem.parentNode ) && elem.nodeType === 1 ); + return false; + }; + } ), + + // Miscellaneous + target: function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + root: function( elem ) { + return elem === documentElement; + }, + + focus: function( elem ) { + return elem === safeActiveElement() && + document.hasFocus() && + !!( elem.type || elem.href || ~elem.tabIndex ); + }, + + // Boolean properties + enabled: createDisabledPseudo( false ), + disabled: createDisabledPseudo( true ), + + checked: function( elem ) { + + // In CSS3, :checked should return both checked and selected elements + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + parent: function( elem ) { + return !Expr.pseudos.empty( elem ); + }, + + // Element/input types + header: function( elem ) { + return rheader.test( elem.nodeName ); + }, + + input: function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + button: function( elem ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + var attr; + return nodeName( elem, "input" ) && elem.type === "text" && + + // Support: IE <10 only + // New HTML5 attribute values (e.g., "search") appear + // with elem.type === "text" + ( ( attr = elem.getAttribute( "type" ) ) == null || + attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + first: createPositionalPseudo( function() { + return [ 0 ]; + } ), + + last: createPositionalPseudo( function( _matchIndexes, length ) { + return [ length - 1 ]; + } ), + + eq: createPositionalPseudo( function( _matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + } ), + + even: createPositionalPseudo( function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + odd: createPositionalPseudo( function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + lt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = argument; + } + + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ), + + gt: createPositionalPseudo( function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + } ) + } +}; + +Expr.pseudos.nth = Expr.pseudos.eq; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +function tokenize( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || ( match = rcomma.exec( soFar ) ) ) { + if ( match ) { + + // Don't consume trailing commas as valid + soFar = soFar.slice( match[ 0 ].length ) || soFar; + } + groups.push( ( tokens = [] ) ); + } + + matched = false; + + // Combinators + if ( ( match = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( ( match = matchExpr[ type ].exec( soFar ) ) && ( !preFilters[ type ] || + ( match = preFilters[ type ]( match ) ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + type: type, + matches: match + } ); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + find.error( selector ) : + + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +} + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[ i ].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + skip = combinator.next, + key = skip || dir, + checkNonElements = base && key === "parentNode", + doneName = done++; + + return combinator.first ? + + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + return false; + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( ( elem = elem[ dir ] ) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ key ] ) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return ( newCache[ 2 ] = oldCache[ 2 ] ); + } else { + + // Reuse newcache so results back-propagate to previous elements + outerCache[ key ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( ( newCache[ 2 ] = matcher( elem, context, xml ) ) ) { + return true; + } + } + } + } + } + return false; + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[ i ]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[ 0 ]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + find( selector, contexts[ i ], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( ( elem = unmatched[ i ] ) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction( function( seed, results, context, xml ) { + var temp, i, elem, matcherOut, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || + multipleContexts( selector || "*", + context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( ( elem = temp[ i ] ) ) { + matcherOut[ postMap[ i ] ] = !( matcherIn[ postMap[ i ] ] = elem ); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) ) { + + // Restore matcherIn since elem is not yet a final match + temp.push( ( matcherIn[ i ] = elem ) ); + } + } + postFinder( null, ( matcherOut = [] ), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( ( elem = matcherOut[ i ] ) && + ( temp = postFinder ? indexOf.call( seed, elem ) : preMap[ i ] ) > -1 ) { + + seed[ temp ] = !( results[ temp ] = elem ); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + } ); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[ 0 ].type ], + implicitRelative = leadingRelative || Expr.relative[ " " ], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( ( matcher = Expr.relative[ tokens[ i ].type ] ) ) { + matchers = [ addCombinator( elementMatcher( matchers ), matcher ) ]; + } else { + matcher = Expr.filter[ tokens[ i ].type ].apply( null, tokens[ i ].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[ j ].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ) + .concat( { value: tokens[ i - 2 ].type === " " ? "*" : "" } ) + ).replace( rtrimCSS, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( ( tokens = tokens.slice( j ) ) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find.TAG( "*", outermost ), + + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = ( dirruns += contextBackup == null ? 1 : Math.random() || 0.1 ), + len = elems.length; + + if ( outermost ) { + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + outermostContext = context == document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) + for ( ; i !== len && ( elem = elems[ i ] ) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + + // Support: IE 11+, Edge 17 - 18+ + // IE/Edge sometimes throw a "Permission denied" error when strict-comparing + // two documents; shallow comparisons work. + // eslint-disable-next-line eqeqeq + if ( !context && elem.ownerDocument != document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( ( matcher = elementMatchers[ j++ ] ) ) { + if ( matcher( elem, context || document, xml ) ) { + push.call( results, elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + + // They will have gone through all possible matchers + if ( ( elem = !matcher && elem ) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( ( matcher = setMatchers[ j++ ] ) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !( unmatched[ i ] || setMatched[ i ] ) ) { + setMatched[ i ] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[ i ] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, + matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +} + +/** + * A low-level selection function that works with jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( ( selector = compiled.selector || selector ) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[ 0 ] = match[ 0 ].slice( 0 ); + if ( tokens.length > 2 && ( token = tokens[ 0 ] ).type === "ID" && + context.nodeType === 9 && documentIsHTML && Expr.relative[ tokens[ 1 ].type ] ) { + + context = ( Expr.find.ID( + token.matches[ 0 ].replace( runescape, funescape ), + context + ) || [] )[ 0 ]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr.needsContext.test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[ i ]; + + // Abort if we hit a combinator + if ( Expr.relative[ ( type = token.type ) ] ) { + break; + } + if ( ( find = Expr.find[ type ] ) ) { + + // Search, expanding context for leading sibling combinators + if ( ( seed = find( + token.matches[ 0 ].replace( runescape, funescape ), + rsibling.test( tokens[ 0 ].type ) && + testContext( context.parentNode ) || context + ) ) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +} + +// One-time assignments + +// Support: Android <=4.0 - 4.1+ +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Initialize against the default document +setDocument(); + +// Support: Android <=4.0 - 4.1+ +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert( function( el ) { + + // Should return 1, but returns 4 (following) + return el.compareDocumentPosition( document.createElement( "fieldset" ) ) & 1; +} ); + +jQuery.find = find; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + + /* eslint-enable */ + +} )(); + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i ); + + + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + return !!qualifier.call( elem, i, elem ) !== not; + } ); + } + + // Single element + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + } + + // Arraylike of elements (jQuery, arguments, Array) + if ( typeof qualifier !== "string" ) { + return jQuery.grep( elements, function( elem ) { + return ( indexOf.call( qualifier, elem ) > -1 ) !== not; + } ); + } + + // Filtered directly for both simple and complex selectors + return jQuery.filter( qualifier, elements, not ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + if ( elems.length === 1 && elem.nodeType === 1 ) { + return jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : []; + } + + return jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, ret, + len = this.length, + self = this; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + ret = this.pushStack( [] ); + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + return len > 1 ? jQuery.uniqueSort( ret ) : ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (trac-9521) + // Strict HTML recognition (trac-11290: must start with <) + // Shortcut simple #id case for speed + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // Method init() accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector[ 0 ] === "<" && + selector[ selector.length - 1 ] === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // Option to run scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + if ( elem ) { + + // Inject the element directly into the jQuery object + this[ 0 ] = elem; + this.length = 1; + } + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( isFunction( selector ) ) { + return root.ready !== undefined ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // Methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var targets = jQuery( target, this ), + l = targets.length; + + return this.filter( function() { + var i = 0; + for ( ; i < l; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + targets = typeof selectors !== "string" && jQuery( selectors ); + + // Positional selectors never match, since there's no _selection_ context + if ( !rneedsContext.test( selectors ) ) { + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( targets ? + targets.index( cur ) > -1 : + + // Don't pass non-elements to jQuery#find + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within the set + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // Index in selector + if ( typeof elem === "string" ) { + return indexOf.call( jQuery( elem ), this[ 0 ] ); + } + + // Locate the position of the desired element + return indexOf.call( this, + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem + ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {} + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, _i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, _i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, _i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + if ( elem.contentDocument != null && + + // Support: IE 11+ + // elements with no `data` attribute has an object + // `contentDocument` with a `null` prototype. + getProto( elem.contentDocument ) ) { + + return elem.contentDocument; + } + + // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only + // Treat the template element as a regular one in browsers that + // don't support it. + if ( nodeName( elem, "template" ) ) { + elem = elem.content || elem; + } + + return jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var matched = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + matched = jQuery.filter( selector, matched ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + jQuery.uniqueSort( matched ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + matched.reverse(); + } + } + + return this.pushStack( matched ); + }; +} ); +var rnothtmlwhite = ( /[^\x20\t\r\n\f]+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnothtmlwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = locked || options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && toType( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = queue = []; + if ( !memory && !firing ) { + list = memory = ""; + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +function Identity( v ) { + return v; +} +function Thrower( ex ) { + throw ex; +} + +function adoptValue( value, resolve, reject, noValue ) { + var method; + + try { + + // Check for promise aspect first to privilege synchronous behavior + if ( value && isFunction( ( method = value.promise ) ) ) { + method.call( value ).done( resolve ).fail( reject ); + + // Other thenables + } else if ( value && isFunction( ( method = value.then ) ) ) { + method.call( value, resolve, reject ); + + // Other non-thenables + } else { + + // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer: + // * false: [ value ].slice( 0 ) => resolve( value ) + // * true: [ value ].slice( 1 ) => resolve() + resolve.apply( undefined, [ value ].slice( noValue ) ); + } + + // For Promises/A+, convert exceptions into rejections + // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in + // Deferred#then to conditionally suppress rejection. + } catch ( value ) { + + // Support: Android 4.0 only + // Strict mode functions invoked without .call/.apply get global-object context + reject.apply( undefined, [ value ] ); + } +} + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, callbacks, + // ... .then handlers, argument index, [final state] + [ "notify", "progress", jQuery.Callbacks( "memory" ), + jQuery.Callbacks( "memory" ), 2 ], + [ "resolve", "done", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 0, "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), + jQuery.Callbacks( "once memory" ), 1, "rejected" ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + "catch": function( fn ) { + return promise.then( null, fn ); + }, + + // Keep pipe for back-compat + pipe: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( _i, tuple ) { + + // Map tuples (progress, done, fail) to arguments (done, fail, progress) + var fn = isFunction( fns[ tuple[ 4 ] ] ) && fns[ tuple[ 4 ] ]; + + // deferred.progress(function() { bind to newDefer or newDefer.notify }) + // deferred.done(function() { bind to newDefer or newDefer.resolve }) + // deferred.fail(function() { bind to newDefer or newDefer.reject }) + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + then: function( onFulfilled, onRejected, onProgress ) { + var maxDepth = 0; + function resolve( depth, deferred, handler, special ) { + return function() { + var that = this, + args = arguments, + mightThrow = function() { + var returned, then; + + // Support: Promises/A+ section 2.3.3.3.3 + // https://promisesaplus.com/#point-59 + // Ignore double-resolution attempts + if ( depth < maxDepth ) { + return; + } + + returned = handler.apply( that, args ); + + // Support: Promises/A+ section 2.3.1 + // https://promisesaplus.com/#point-48 + if ( returned === deferred.promise() ) { + throw new TypeError( "Thenable self-resolution" ); + } + + // Support: Promises/A+ sections 2.3.3.1, 3.5 + // https://promisesaplus.com/#point-54 + // https://promisesaplus.com/#point-75 + // Retrieve `then` only once + then = returned && + + // Support: Promises/A+ section 2.3.4 + // https://promisesaplus.com/#point-64 + // Only check objects and functions for thenability + ( typeof returned === "object" || + typeof returned === "function" ) && + returned.then; + + // Handle a returned thenable + if ( isFunction( then ) ) { + + // Special processors (notify) just wait for resolution + if ( special ) { + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ) + ); + + // Normal processors (resolve) also hook into progress + } else { + + // ...and disregard older resolution values + maxDepth++; + + then.call( + returned, + resolve( maxDepth, deferred, Identity, special ), + resolve( maxDepth, deferred, Thrower, special ), + resolve( maxDepth, deferred, Identity, + deferred.notifyWith ) + ); + } + + // Handle all other returned values + } else { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Identity ) { + that = undefined; + args = [ returned ]; + } + + // Process the value(s) + // Default process is resolve + ( special || deferred.resolveWith )( that, args ); + } + }, + + // Only normal processors (resolve) catch and reject exceptions + process = special ? + mightThrow : + function() { + try { + mightThrow(); + } catch ( e ) { + + if ( jQuery.Deferred.exceptionHook ) { + jQuery.Deferred.exceptionHook( e, + process.error ); + } + + // Support: Promises/A+ section 2.3.3.3.4.1 + // https://promisesaplus.com/#point-61 + // Ignore post-resolution exceptions + if ( depth + 1 >= maxDepth ) { + + // Only substitute handlers pass on context + // and multiple values (non-spec behavior) + if ( handler !== Thrower ) { + that = undefined; + args = [ e ]; + } + + deferred.rejectWith( that, args ); + } + } + }; + + // Support: Promises/A+ section 2.3.3.3.1 + // https://promisesaplus.com/#point-57 + // Re-resolve promises immediately to dodge false rejection from + // subsequent errors + if ( depth ) { + process(); + } else { + + // Call an optional hook to record the error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = jQuery.Deferred.getStackHook(); + } + window.setTimeout( process ); + } + }; + } + + return jQuery.Deferred( function( newDefer ) { + + // progress_handlers.add( ... ) + tuples[ 0 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onProgress ) ? + onProgress : + Identity, + newDefer.notifyWith + ) + ); + + // fulfilled_handlers.add( ... ) + tuples[ 1 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onFulfilled ) ? + onFulfilled : + Identity + ) + ); + + // rejected_handlers.add( ... ) + tuples[ 2 ][ 3 ].add( + resolve( + 0, + newDefer, + isFunction( onRejected ) ? + onRejected : + Thrower + ) + ); + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 5 ]; + + // promise.progress = list.add + // promise.done = list.add + // promise.fail = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( + function() { + + // state = "resolved" (i.e., fulfilled) + // state = "rejected" + state = stateString; + }, + + // rejected_callbacks.disable + // fulfilled_callbacks.disable + tuples[ 3 - i ][ 2 ].disable, + + // rejected_handlers.disable + // fulfilled_handlers.disable + tuples[ 3 - i ][ 3 ].disable, + + // progress_callbacks.lock + tuples[ 0 ][ 2 ].lock, + + // progress_handlers.lock + tuples[ 0 ][ 3 ].lock + ); + } + + // progress_handlers.fire + // fulfilled_handlers.fire + // rejected_handlers.fire + list.add( tuple[ 3 ].fire ); + + // deferred.notify = function() { deferred.notifyWith(...) } + // deferred.resolve = function() { deferred.resolveWith(...) } + // deferred.reject = function() { deferred.rejectWith(...) } + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments ); + return this; + }; + + // deferred.notifyWith = list.fireWith + // deferred.resolveWith = list.fireWith + // deferred.rejectWith = list.fireWith + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( singleValue ) { + var + + // count of uncompleted subordinates + remaining = arguments.length, + + // count of unprocessed arguments + i = remaining, + + // subordinate fulfillment data + resolveContexts = Array( i ), + resolveValues = slice.call( arguments ), + + // the primary Deferred + primary = jQuery.Deferred(), + + // subordinate callback factory + updateFunc = function( i ) { + return function( value ) { + resolveContexts[ i ] = this; + resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( !( --remaining ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.promise(); + } +} ); + + +// These usually indicate a programmer mistake during development, +// warn about them ASAP rather than swallowing them by default. +var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; + +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { + + // Support: IE 8 - 9 only + // Console exists when dev tools are open, which can happen at any time + if ( window.console && window.console.warn && error && rerrorNames.test( error.name ) ) { + window.console.warn( "jQuery.Deferred exception: " + error.message, + error.stack, asyncError ); + } +}; + + + + +jQuery.readyException = function( error ) { + window.setTimeout( function() { + throw error; + } ); +}; + + + + +// The deferred used on DOM ready +var readyList = jQuery.Deferred(); + +jQuery.fn.ready = function( fn ) { + + readyList + .then( fn ) + + // Wrap jQuery.readyException in a function so that the lookup + // happens at the time of error handling instead of callback + // registration. + .catch( function( error ) { + jQuery.readyException( error ); + } ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See trac-6781 + readyWait: 1, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + } +} ); + +jQuery.ready.then = readyList.then; + +// The ready event handler and self cleanup method +function completed() { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + jQuery.ready(); +} + +// Catch cases where $(document).ready() is called +// after the browser event has already occurred. +// Support: IE <=9 - 10 only +// Older IE sometimes signals "interactive" too soon +if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + +} else { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); +} + + + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + len = elems.length, + bulk = key == null; + + // Sets many values + if ( toType( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, _key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < len; i++ ) { + fn( + elems[ i ], key, raw ? + value : + value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + if ( chainable ) { + return elems; + } + + // Gets + if ( bulk ) { + return fn.call( elems ); + } + + return len ? fn( elems[ 0 ], key ) : emptyGet; +}; + + +// Matches dashed string for camelizing +var rmsPrefix = /^-ms-/, + rdashAlpha = /-([a-z])/g; + +// Used by camelCase as callback to replace() +function fcamelCase( _all, letter ) { + return letter.toUpperCase(); +} + +// Convert dashed to camelCase; used by the css and data modules +// Support: IE <=9 - 11, Edge 12 - 15 +// Microsoft forgot to hump their vendor prefix (trac-9572) +function camelCase( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); +} +var acceptData = function( owner ) { + + // Accepts only: + // - Node + // - Node.ELEMENT_NODE + // - Node.DOCUMENT_NODE + // - Object + // - Any + return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType ); +}; + + + + +function Data() { + this.expando = jQuery.expando + Data.uid++; +} + +Data.uid = 1; + +Data.prototype = { + + cache: function( owner ) { + + // Check if the owner object already has a cache + var value = owner[ this.expando ]; + + // If not, create one + if ( !value ) { + value = {}; + + // We can accept data for non-element nodes in modern browsers, + // but we should not, see trac-8335. + // Always return an empty object. + if ( acceptData( owner ) ) { + + // If it is a node unlikely to be stringify-ed or looped over + // use plain assignment + if ( owner.nodeType ) { + owner[ this.expando ] = value; + + // Otherwise secure it in a non-enumerable property + // configurable must be true to allow the property to be + // deleted when data is removed + } else { + Object.defineProperty( owner, this.expando, { + value: value, + configurable: true + } ); + } + } + } + + return value; + }, + set: function( owner, data, value ) { + var prop, + cache = this.cache( owner ); + + // Handle: [ owner, key, value ] args + // Always use camelCase key (gh-2257) + if ( typeof data === "string" ) { + cache[ camelCase( data ) ] = value; + + // Handle: [ owner, { properties } ] args + } else { + + // Copy the properties one-by-one to the cache object + for ( prop in data ) { + cache[ camelCase( prop ) ] = data[ prop ]; + } + } + return cache; + }, + get: function( owner, key ) { + return key === undefined ? + this.cache( owner ) : + + // Always use camelCase key (gh-2257) + owner[ this.expando ] && owner[ this.expando ][ camelCase( key ) ]; + }, + access: function( owner, key, value ) { + + // In cases where either: + // + // 1. No key was specified + // 2. A string key was specified, but no value provided + // + // Take the "read" path and allow the get method to determine + // which value to return, respectively either: + // + // 1. The entire cache object + // 2. The data stored at the key + // + if ( key === undefined || + ( ( key && typeof key === "string" ) && value === undefined ) ) { + + return this.get( owner, key ); + } + + // When the key is not a string, or both a key and value + // are specified, set or extend (existing objects) with either: + // + // 1. An object of properties + // 2. A key and value + // + this.set( owner, key, value ); + + // Since the "set" path can have two possible entry points + // return the expected data based on which path was taken[*] + return value !== undefined ? value : key; + }, + remove: function( owner, key ) { + var i, + cache = owner[ this.expando ]; + + if ( cache === undefined ) { + return; + } + + if ( key !== undefined ) { + + // Support array or space separated string of keys + if ( Array.isArray( key ) ) { + + // If key is an array of keys... + // We always set camelCase keys, so remove that. + key = key.map( camelCase ); + } else { + key = camelCase( key ); + + // If a key with the spaces exists, use it. + // Otherwise, create an array by matching non-whitespace + key = key in cache ? + [ key ] : + ( key.match( rnothtmlwhite ) || [] ); + } + + i = key.length; + + while ( i-- ) { + delete cache[ key[ i ] ]; + } + } + + // Remove the expando if there's no more data + if ( key === undefined || jQuery.isEmptyObject( cache ) ) { + + // Support: Chrome <=35 - 45 + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted) + if ( owner.nodeType ) { + owner[ this.expando ] = undefined; + } else { + delete owner[ this.expando ]; + } + } + }, + hasData: function( owner ) { + var cache = owner[ this.expando ]; + return cache !== undefined && !jQuery.isEmptyObject( cache ); + } +}; +var dataPriv = new Data(); + +var dataUser = new Data(); + + + +// Implementation Summary +// +// 1. Enforce API surface and semantic compatibility with 1.9.x branch +// 2. Improve the module's maintainability by reducing the storage +// paths to a single mechanism. +// 3. Use the same single mechanism to support "private" and "user" data. +// 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData) +// 5. Avoid exposing implementation details on user objects (eg. expando properties) +// 6. Provide a clear path for implementation upgrade to WeakMap in 2014 + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /[A-Z]/g; + +function getData( data ) { + if ( data === "true" ) { + return true; + } + + if ( data === "false" ) { + return false; + } + + if ( data === "null" ) { + return null; + } + + // Only convert to a number if it doesn't change the string + if ( data === +data + "" ) { + return +data; + } + + if ( rbrace.test( data ) ) { + return JSON.parse( data ); + } + + return data; +} + +function dataAttr( elem, key, data ) { + var name; + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase(); + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = getData( data ); + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + dataUser.set( elem, key, data ); + } else { + data = undefined; + } + } + return data; +} + +jQuery.extend( { + hasData: function( elem ) { + return dataUser.hasData( elem ) || dataPriv.hasData( elem ); + }, + + data: function( elem, name, data ) { + return dataUser.access( elem, name, data ); + }, + + removeData: function( elem, name ) { + dataUser.remove( elem, name ); + }, + + // TODO: Now that all calls to _data and _removeData have been replaced + // with direct calls to dataPriv methods, these can be deprecated. + _data: function( elem, name, data ) { + return dataPriv.access( elem, name, data ); + }, + + _removeData: function( elem, name ) { + dataPriv.remove( elem, name ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = dataUser.get( elem ); + + if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE 11 only + // The attrs elements can be null (trac-14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + dataPriv.set( elem, "hasDataAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + dataUser.set( this, key ); + } ); + } + + return access( this, function( value ) { + var data; + + // The calling jQuery object (element matches) is not empty + // (and therefore has an element appears at this[ 0 ]) and the + // `value` parameter was not undefined. An empty jQuery object + // will result in `undefined` for elem = this[ 0 ] which will + // throw an exception if an attempt to read a data cache is made. + if ( elem && value === undefined ) { + + // Attempt to get data from the cache + // The key will always be camelCased in Data + data = dataUser.get( elem, key ); + if ( data !== undefined ) { + return data; + } + + // Attempt to "discover" the data in + // HTML5 custom data-* attrs + data = dataAttr( elem, key ); + if ( data !== undefined ) { + return data; + } + + // We tried really hard, but the data doesn't exist. + return; + } + + // Set the data... + this.each( function() { + + // We always store the camelCased key + dataUser.set( this, key, value ); + } ); + }, null, value, arguments.length > 1, null, true ); + }, + + removeData: function( key ) { + return this.each( function() { + dataUser.remove( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = dataPriv.get( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || Array.isArray( data ) ) { + queue = dataPriv.access( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // Clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // Not public - generate a queueHooks object, or return the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return dataPriv.get( elem, key ) || dataPriv.access( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + dataPriv.remove( elem, [ type + "queue", key ] ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // Ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = dataPriv.get( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var documentElement = document.documentElement; + + + + var isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ); + }, + composed = { composed: true }; + + // Support: IE 9 - 11+, Edge 12 - 18+, iOS 10.0 - 10.2 only + // Check attachment across shadow DOM boundaries when possible (gh-3504) + // Support: iOS 10.0-10.2 only + // Early iOS 10 versions support `attachShadow` but not `getRootNode`, + // leading to errors. We need to check for `getRootNode`. + if ( documentElement.getRootNode ) { + isAttached = function( elem ) { + return jQuery.contains( elem.ownerDocument, elem ) || + elem.getRootNode( composed ) === elem.ownerDocument; + }; + } +var isHiddenWithinTree = function( elem, el ) { + + // isHiddenWithinTree might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + + // Inline style trumps all + return elem.style.display === "none" || + elem.style.display === "" && + + // Otherwise, check computed style + // Support: Firefox <=43 - 45 + // Disconnected elements can have computed display: none, so first confirm that elem is + // in the document. + isAttached( elem ) && + + jQuery.css( elem, "display" ) === "none"; + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, scale, + maxIterations = 20, + currentValue = tween ? + function() { + return tween.cur(); + } : + function() { + return jQuery.css( elem, prop, "" ); + }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = elem.nodeType && + ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Support: Firefox <=54 + // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144) + initial = initial / 2; + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + while ( maxIterations-- ) { + + // Evaluate and update our best guess (doubling guesses that zero out). + // Finish if the scale equals or crosses 1 (making the old*new product non-positive). + jQuery.style( elem, prop, initialInUnit + unit ); + if ( ( 1 - scale ) * ( 1 - ( scale = currentValue() / initial || 0.5 ) ) <= 0 ) { + maxIterations = 0; + } + initialInUnit = initialInUnit / scale; + + } + + initialInUnit = initialInUnit * 2; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +var defaultDisplayMap = {}; + +function getDefaultDisplay( elem ) { + var temp, + doc = elem.ownerDocument, + nodeName = elem.nodeName, + display = defaultDisplayMap[ nodeName ]; + + if ( display ) { + return display; + } + + temp = doc.body.appendChild( doc.createElement( nodeName ) ); + display = jQuery.css( temp, "display" ); + + temp.parentNode.removeChild( temp ); + + if ( display === "none" ) { + display = "block"; + } + defaultDisplayMap[ nodeName ] = display; + + return display; +} + +function showHide( elements, show ) { + var display, elem, + values = [], + index = 0, + length = elements.length; + + // Determine new display value for elements that need to change + for ( ; index < length; index++ ) { + elem = elements[ index ]; + if ( !elem.style ) { + continue; + } + + display = elem.style.display; + if ( show ) { + + // Since we force visibility upon cascade-hidden elements, an immediate (and slow) + // check is required in this first loop unless we have a nonempty display value (either + // inline or about-to-be-restored) + if ( display === "none" ) { + values[ index ] = dataPriv.get( elem, "display" ) || null; + if ( !values[ index ] ) { + elem.style.display = ""; + } + } + if ( elem.style.display === "" && isHiddenWithinTree( elem ) ) { + values[ index ] = getDefaultDisplay( elem ); + } + } else { + if ( display !== "none" ) { + values[ index ] = "none"; + + // Remember what we're overwriting + dataPriv.set( elem, "display", display ); + } + } + } + + // Set the display of the elements in a second loop to avoid constant reflow + for ( index = 0; index < length; index++ ) { + if ( values[ index ] != null ) { + elements[ index ].style.display = values[ index ]; + } + } + + return elements; +} + +jQuery.fn.extend( { + show: function() { + return showHide( this, true ); + }, + hide: function() { + return showHide( this ); + }, + toggle: function( state ) { + if ( typeof state === "boolean" ) { + return state ? this.show() : this.hide(); + } + + return this.each( function() { + if ( isHiddenWithinTree( this ) ) { + jQuery( this ).show(); + } else { + jQuery( this ).hide(); + } + } ); + } +} ); +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([a-z][^\/\0>\x20\t\r\n\f]*)/i ); + +var rscriptType = ( /^$|^module$|\/(?:java|ecma)script/i ); + + + +( function() { + var fragment = document.createDocumentFragment(), + div = fragment.appendChild( document.createElement( "div" ) ), + input = document.createElement( "input" ); + + // Support: Android 4.0 - 4.3 only + // Check state lost if the name is set (trac-11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (trac-14901) + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Android <=4.1 only + // Older WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE <=11 only + // Make sure textarea (and checkbox) defaultValue is properly cloned + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // Support: IE <=9 only + // IE <=9 replaces "; + support.option = !!div.lastChild; +} )(); + + +// We have to close these tags to support XHTML (trac-13200) +var wrapMap = { + + // XHTML parsers do not magically insert elements in the + // same way that tag soup parsers do. So we cannot shorten + // this by omitting or other required elements. + thead: [ 1, "", "
" ], + col: [ 2, "", "
" ], + tr: [ 2, "", "
" ], + td: [ 3, "", "
" ], + + _default: [ 0, "", "" ] +}; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + +// Support: IE <=9 only +if ( !support.option ) { + wrapMap.optgroup = wrapMap.option = [ 1, "" ]; +} + + +function getAll( context, tag ) { + + // Support: IE <=9 - 11 only + // Use typeof to avoid zero-argument method invocation on host objects (trac-15151) + var ret; + + if ( typeof context.getElementsByTagName !== "undefined" ) { + ret = context.getElementsByTagName( tag || "*" ); + + } else if ( typeof context.querySelectorAll !== "undefined" ) { + ret = context.querySelectorAll( tag || "*" ); + + } else { + ret = []; + } + + if ( tag === undefined || tag && nodeName( context, tag ) ) { + return jQuery.merge( [ context ], ret ); + } + + return ret; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + dataPriv.set( + elems[ i ], + "globalEval", + !refElements || dataPriv.get( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/; + +function buildFragment( elems, context, scripts, selection, ignored ) { + var elem, tmp, tag, wrap, attached, j, + fragment = context.createDocumentFragment(), + nodes = [], + i = 0, + l = elems.length; + + for ( ; i < l; i++ ) { + elem = elems[ i ]; + + if ( elem || elem === 0 ) { + + // Add nodes directly + if ( toType( elem ) === "object" ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem ); + + // Convert non-html into a text node + } else if ( !rhtml.test( elem ) ) { + nodes.push( context.createTextNode( elem ) ); + + // Convert html into DOM nodes + } else { + tmp = tmp || fragment.appendChild( context.createElement( "div" ) ); + + // Deserialize a standard representation + tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase(); + wrap = wrapMap[ tag ] || wrapMap._default; + tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ]; + + // Descend through wrappers to the right content + j = wrap[ 0 ]; + while ( j-- ) { + tmp = tmp.lastChild; + } + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( nodes, tmp.childNodes ); + + // Remember the top-level container + tmp = fragment.firstChild; + + // Ensure the created nodes are orphaned (trac-12392) + tmp.textContent = ""; + } + } + } + + // Remove wrapper from fragment + fragment.textContent = ""; + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + continue; + } + + attached = isAttached( elem ); + + // Append to fragment + tmp = getAll( fragment.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( attached ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + return fragment; +} + + +var rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + + var handleObjIn, eventHandle, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.get( elem ); + + // Only attach events to objects that accept data + if ( !acceptData( elem ) ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Ensure that invalid selectors throw exceptions at attach time + // Evaluate against documentElement in case elem is a non-element node (e.g., document) + if ( selector ) { + jQuery.find.matchesSelector( documentElement, selector ); + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = Object.create( null ); + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ? + jQuery.event.dispatch.apply( elem, arguments ) : undefined; + }; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + + var j, origCount, tmp, + events, t, handleObj, + special, handlers, type, namespaces, origType, + elemData = dataPriv.hasData( elem ) && dataPriv.get( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnothtmlwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove data and the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + dataPriv.remove( elem, "handle events" ); + } + }, + + dispatch: function( nativeEvent ) { + + var i, j, ret, matched, handleObj, handlerQueue, + args = new Array( arguments.length ), + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( nativeEvent ), + + handlers = ( + dataPriv.get( this, "events" ) || Object.create( null ) + )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + + for ( i = 1; i < arguments.length; i++ ) { + args[ i ] = arguments[ i ]; + } + + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // If the event is namespaced, then each handler is only invoked if it is + // specially universal or its namespaces are a superset of the event's. + if ( !event.rnamespace || handleObj.namespace === false || + event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, handleObj, sel, matchedHandlers, matchedSelectors, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Find delegate handlers + if ( delegateCount && + + // Support: IE <=9 + // Black-hole SVG instance trees (trac-13180) + cur.nodeType && + + // Support: Firefox <=42 + // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861) + // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click + // Support: IE 11 only + // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343) + !( event.type === "click" && event.button >= 1 ) ) { + + for ( ; cur !== this; cur = cur.parentNode || this ) { + + // Don't check non-elements (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-11764) + if ( cur.nodeType === 1 && !( event.type === "click" && cur.disabled === true ) ) { + matchedHandlers = []; + matchedSelectors = {}; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (trac-13203) + sel = handleObj.selector + " "; + + if ( matchedSelectors[ sel ] === undefined ) { + matchedSelectors[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matchedSelectors[ sel ] ) { + matchedHandlers.push( handleObj ); + } + } + if ( matchedHandlers.length ) { + handlerQueue.push( { elem: cur, handlers: matchedHandlers } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + cur = this; + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: cur, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + addProp: function( name, hook ) { + Object.defineProperty( jQuery.Event.prototype, name, { + enumerable: true, + configurable: true, + + get: isFunction( hook ) ? + function() { + if ( this.originalEvent ) { + return hook( this.originalEvent ); + } + } : + function() { + if ( this.originalEvent ) { + return this.originalEvent[ name ]; + } + }, + + set: function( value ) { + Object.defineProperty( this, name, { + enumerable: true, + configurable: true, + writable: true, + value: value + } ); + } + } ); + }, + + fix: function( originalEvent ) { + return originalEvent[ jQuery.expando ] ? + originalEvent : + new jQuery.Event( originalEvent ); + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + click: { + + // Utilize native event to ensure correct state for checkable inputs + setup: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Claim the first handler + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + // dataPriv.set( el, "click", ... ) + leverageNative( el, "click", true ); + } + + // Return false to allow normal processing in the caller + return false; + }, + trigger: function( data ) { + + // For mutual compressibility with _default, replace `this` access with a local var. + // `|| data` is dead code meant only to preserve the variable through minification. + var el = this || data; + + // Force setup before triggering a click + if ( rcheckableType.test( el.type ) && + el.click && nodeName( el, "input" ) ) { + + leverageNative( el, "click" ); + } + + // Return non-false to allow normal event-path propagation + return true; + }, + + // For cross-browser consistency, suppress native .click() on links + // Also prevent it if we're currently inside a leveraged native-event stack + _default: function( event ) { + var target = event.target; + return rcheckableType.test( target.type ) && + target.click && nodeName( target, "input" ) && + dataPriv.get( target, "click" ) || + nodeName( target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + } +}; + +// Ensure the presence of an event listener that handles manually-triggered +// synthetic events by interrupting progress until reinvoked in response to +// *native* events that it fires directly, ensuring that state changes have +// already occurred before other listeners are invoked. +function leverageNative( el, type, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + if ( dataPriv.get( el, type ) === undefined ) { + jQuery.event.add( el, type, returnTrue ); + } + return; + } + + // Register the controller as a special universal handler for all event namespaces + dataPriv.set( el, type, false ); + jQuery.event.add( el, type, { + namespace: false, + handler: function( event ) { + var result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved ) { + + // Store arguments for use when handling the inner native event + // There will always be at least one argument (an event object), so this array + // will not be confused with a leftover capture object. + saved = slice.call( arguments ); + dataPriv.set( this, type, saved ); + + // Trigger the native event and capture its result + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // If this is an inner synthetic event for an event with a bubbling surrogate + // (focus or blur), assume that the surrogate already propagated from triggering + // the native event and prevent that from happening again here. + // This technically gets the ordering wrong w.r.t. to `.trigger()` (in which the + // bubbling surrogate propagates *after* the non-bubbling base), but that seems + // less bad than duplication. + } else if ( ( jQuery.event.special[ type ] || {} ).delegateType ) { + event.stopPropagation(); + } + + // If this is a native event triggered above, everything is now in order + // Fire an inner synthetic event with the original arguments + } else if ( saved ) { + + // ...and capture the result + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +jQuery.removeEvent = function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } +}; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: Android <=2.3 only + src.returnValue === false ? + returnTrue : + returnFalse; + + // Create target properties + // Support: Safari <=6 - 7 only + // Target should not be a text node (trac-504, trac-13143) + this.target = ( src.target && src.target.nodeType === 3 ) ? + src.target.parentNode : + src.target; + + this.currentTarget = src.currentTarget; + this.relatedTarget = src.relatedTarget; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || Date.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + isSimulated: false, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + + if ( e && !this.isSimulated ) { + e.preventDefault(); + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopPropagation(); + } + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && !this.isSimulated ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Includes all common event props including KeyEvent and MouseEvent specific props +jQuery.each( { + altKey: true, + bubbles: true, + cancelable: true, + changedTouches: true, + ctrlKey: true, + detail: true, + eventPhase: true, + metaKey: true, + pageX: true, + pageY: true, + shiftKey: true, + view: true, + "char": true, + code: true, + charCode: true, + key: true, + keyCode: true, + button: true, + buttons: true, + clientX: true, + clientY: true, + offsetX: true, + offsetY: true, + pointerId: true, + pointerType: true, + screenX: true, + screenY: true, + targetTouches: true, + toElement: true, + touches: true, + which: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + var attaches; + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // Return false to allow normal processing in the caller + return false; + } + }, + trigger: function() { + + // Force setup before trigger + leverageNative( this, type ); + + // Return non-false to allow normal event-path propagation + return true; + }, + + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; + + // Support: Firefox <=44 + // Firefox doesn't have focus(in | out) events + // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 + // + // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1 + // focus(in | out) events fire after focus & blur events, + // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order + // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; +} ); + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://bugs.chromium.org/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + } +} ); + + +var + + // Support: IE <=10 - 11, Edge 12 - 13 only + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g; + +// Prefer a tbody over its parent table for containing new rows +function manipulationTarget( elem, content ) { + if ( nodeName( elem, "table" ) && + nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ) { + + return jQuery( elem ).children( "tbody" )[ 0 ] || elem; + } + + return elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + if ( ( elem.type || "" ).slice( 0, 5 ) === "true/" ) { + elem.type = elem.type.slice( 5 ); + } else { + elem.removeAttribute( "type" ); + } + + return elem; +} + +function cloneCopyEvent( src, dest ) { + var i, l, type, pdataOld, udataOld, udataCur, events; + + if ( dest.nodeType !== 1 ) { + return; + } + + // 1. Copy private data: events, handlers, etc. + if ( dataPriv.hasData( src ) ) { + pdataOld = dataPriv.get( src ); + events = pdataOld.events; + + if ( events ) { + dataPriv.remove( dest, "handle events" ); + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + } + + // 2. Copy user data + if ( dataUser.hasData( src ) ) { + udataOld = dataUser.access( src ); + udataCur = jQuery.extend( {}, udataOld ); + + dataUser.set( dest, udataCur ); + } +} + +// Fix IE bugs, see support tests +function fixInput( src, dest ) { + var nodeName = dest.nodeName.toLowerCase(); + + // Fails to persist the checked state of a cloned checkbox or radio button. + if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + dest.checked = src.checked; + + // Fails to return the selected option to the default selected state when cloning options + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = flat( args ); + + var fragment, first, scripts, hasScripts, node, doc, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + valueIsFunction = isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( valueIsFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( valueIsFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (trac-8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android <=4.0 only, PhantomJS 1 only + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Re-enable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !dataPriv.access( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src && ( node.type || "" ).toLowerCase() !== "module" ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl && !node.noModule ) { + jQuery._evalUrl( node.src, { + nonce: node.nonce || node.getAttribute( "nonce" ) + }, doc ); + } + } else { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. + DOMEval( node.textContent.replace( rcleanScript, "" ), node, doc ); + } + } + } + } + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + nodes = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = nodes[ i ] ) != null; i++ ) { + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && isAttached( node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html; + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var i, l, srcElements, destElements, + clone = elem.cloneNode( true ), + inPage = isAttached( elem ); + + // Fix IE cloning issues + if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) && + !jQuery.isXMLDoc( elem ) ) { + + // We eschew jQuery#find here for performance reasons: + // https://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + fixInput( srcElements[ i ], destElements[ i ] ); + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0, l = srcElements.length; i < l; i++ ) { + cloneCopyEvent( srcElements[ i ], destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + // Return the cloned set + return clone; + }, + + cleanData: function( elems ) { + var data, elem, type, + special = jQuery.event.special, + i = 0; + + for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) { + if ( acceptData( elem ) ) { + if ( ( data = elem[ dataPriv.expando ] ) ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataPriv.expando ] = undefined; + } + if ( elem[ dataUser.expando ] ) { + + // Support: Chrome <=35 - 45+ + // Assign undefined instead of using delete, see Data#remove + elem[ dataUser.expando ] = undefined; + } + } + } + } +} ); + +jQuery.fn.extend( { + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().each( function() { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + this.textContent = value; + } + } ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + if ( elem.nodeType === 1 ) { + + // Prevent memory leaks + jQuery.cleanData( getAll( elem, false ) ); + + // Remove any remaining nodes + elem.textContent = ""; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined && elem.nodeType === 1 ) { + return elem.innerHTML; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + elem = this[ i ] || {}; + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1, + i = 0; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Support: Android <=4.0 only, PhantomJS 1 only + // .get() because push.apply(_, arraylike) throws on ancient WebKit + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); +var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" ); + +var rcustomProp = /^--/; + + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-14150) + // IE throws on elements created in popups + // FF meanwhile throws on frame elements through "defaultView.getComputedStyle" + var view = elem.ownerDocument.defaultView; + + if ( !view || !view.opener ) { + view = window; + } + + return view.getComputedStyle( elem ); + }; + +var swap = function( elem, options, callback ) { + var ret, name, + old = {}; + + // Remember the old values, and insert the new ones + for ( name in options ) { + old[ name ] = elem.style[ name ]; + elem.style[ name ] = options[ name ]; + } + + ret = callback.call( elem ); + + // Revert the old values + for ( name in options ) { + elem.style[ name ] = old[ name ]; + } + + return ret; +}; + + +var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" ); + + + +( function() { + + // Executing both pixelPosition & boxSizingReliable tests require only one layout + // so they're executed at the same time to save the second computation. + function computeStyleTests() { + + // This is a singleton, we need to execute it only once + if ( !div ) { + return; + } + + container.style.cssText = "position:absolute;left:-11111px;width:60px;" + + "margin-top:1px;padding:0;border:0"; + div.style.cssText = + "position:relative;display:block;box-sizing:border-box;overflow:scroll;" + + "margin:auto;border:1px;padding:1px;" + + "width:60%;top:1%"; + documentElement.appendChild( container ).appendChild( div ); + + var divStyle = window.getComputedStyle( div ); + pixelPositionVal = divStyle.top !== "1%"; + + // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44 + reliableMarginLeftVal = roundPixelMeasures( divStyle.marginLeft ) === 12; + + // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3 + // Some styles come back with percentage values, even though they shouldn't + div.style.right = "60%"; + pixelBoxStylesVal = roundPixelMeasures( divStyle.right ) === 36; + + // Support: IE 9 - 11 only + // Detect misreporting of content dimensions for box-sizing:border-box elements + boxSizingReliableVal = roundPixelMeasures( divStyle.width ) === 36; + + // Support: IE 9 only + // Detect overflow:scroll screwiness (gh-3699) + // Support: Chrome <=64 + // Don't get tricked when zoom affects offsetWidth (gh-4029) + div.style.position = "absolute"; + scrollboxSizeVal = roundPixelMeasures( div.offsetWidth / 3 ) === 12; + + documentElement.removeChild( container ); + + // Nullify the div so it wouldn't be stored in the memory and + // it will also be a sign that checks already performed + div = null; + } + + function roundPixelMeasures( measure ) { + return Math.round( parseFloat( measure ) ); + } + + var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal, + reliableTrDimensionsVal, reliableMarginLeftVal, + container = document.createElement( "div" ), + div = document.createElement( "div" ); + + // Finish early in limited (non-browser) environments + if ( !div.style ) { + return; + } + + // Support: IE <=9 - 11 only + // Style of cloned element affects source element cloned (trac-8908) + div.style.backgroundClip = "content-box"; + div.cloneNode( true ).style.backgroundClip = ""; + support.clearCloneStyle = div.style.backgroundClip === "content-box"; + + jQuery.extend( support, { + boxSizingReliable: function() { + computeStyleTests(); + return boxSizingReliableVal; + }, + pixelBoxStyles: function() { + computeStyleTests(); + return pixelBoxStylesVal; + }, + pixelPosition: function() { + computeStyleTests(); + return pixelPositionVal; + }, + reliableMarginLeft: function() { + computeStyleTests(); + return reliableMarginLeftVal; + }, + scrollboxSize: function() { + computeStyleTests(); + return scrollboxSizeVal; + }, + + // Support: IE 9 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Behavior in IE 9 is more subtle than in newer versions & it passes + // some versions of this test; make sure not to make it pass there! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + reliableTrDimensions: function() { + var table, tr, trChild, trStyle; + if ( reliableTrDimensionsVal == null ) { + table = document.createElement( "table" ); + tr = document.createElement( "tr" ); + trChild = document.createElement( "div" ); + + table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is `display: block` + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), + + // Support: Firefox 51+ + // Retrieving style before computed somehow + // fixes an issue with getting wrong values + // on detached elements + style = elem.style; + + computed = computed || getStyles( elem ); + + // getPropertyValue is needed for: + // .css('filter') (IE 9 only, trac-12537) + // .css('--customProperty) (gh-3144) + if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + + if ( ret === "" && !isAttached( elem ) ) { + ret = jQuery.style( elem, name ); + } + + // A tribute to the "awesome hack by Dean Edwards" + // Android Browser returns percentage for some values, + // but width seems to be reliably pixels. + // This is against the CSSOM draft spec: + // https://drafts.csswg.org/cssom/#resolved-values + if ( !support.pixelBoxStyles() && rnumnonpx.test( ret ) && rboxStyle.test( name ) ) { + + // Remember the original values + width = style.width; + minWidth = style.minWidth; + maxWidth = style.maxWidth; + + // Put in the new values to get a computed value out + style.minWidth = style.maxWidth = style.width = ret; + ret = computed.width; + + // Revert the changed values + style.width = width; + style.minWidth = minWidth; + style.maxWidth = maxWidth; + } + } + + return ret !== undefined ? + + // Support: IE <=9 - 11 only + // IE returns zIndex value as an integer. + ret + "" : + ret; +} + + +function addGetHookIf( conditionFn, hookFn ) { + + // Define the hook, we'll check on the first run if it's really needed. + return { + get: function() { + if ( conditionFn() ) { + + // Hook not needed (or it's not possible to use it due + // to missing dependency), remove it. + delete this.get; + return; + } + + // Hook needed; redefine it so that the support test is not executed again. + return ( this.get = hookFn ).apply( this, arguments ); + } + }; +} + + +var cssPrefixes = [ "Webkit", "Moz", "ms" ], + emptyStyle = document.createElement( "div" ).style, + vendorProps = {}; + +// Return a vendor-prefixed property or undefined +function vendorPropName( name ) { + + // Check for vendor prefixed names + var capName = name[ 0 ].toUpperCase() + name.slice( 1 ), + i = cssPrefixes.length; + + while ( i-- ) { + name = cssPrefixes[ i ] + capName; + if ( name in emptyStyle ) { + return name; + } + } +} + +// Return a potentially-mapped jQuery.cssProps or vendor prefixed property +function finalPropName( name ) { + var final = jQuery.cssProps[ name ] || vendorProps[ name ]; + + if ( final ) { + return final; + } + if ( name in emptyStyle ) { + return name; + } + return vendorProps[ name ] = vendorPropName( name ) || name; +} + + +var + + // Swappable if display is none or starts with table + // except "table", "table-cell", or "table-caption" + // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display + rdisplayswap = /^(none|table(?!-c[ea]).+)/, + cssShow = { position: "absolute", visibility: "hidden", display: "block" }, + cssNormalTransform = { + letterSpacing: "0", + fontWeight: "400" + }; + +function setPositiveNumber( _elem, value, subtract ) { + + // Any relative (+/-) values have already been + // normalized at this point + var matches = rcssNum.exec( value ); + return matches ? + + // Guard against undefined "subtract", e.g., when used as in cssHooks + Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) : + value; +} + +function boxModelAdjustment( elem, dimension, box, isBorderBox, styles, computedVal ) { + var i = dimension === "width" ? 1 : 0, + extra = 0, + delta = 0, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === "margin" ) { + marginDelta += jQuery.css( elem, box + cssExpand[ i ], true, styles ); + } + + // If we get here with a content-box, we're seeking "padding" or "border" or "margin" + if ( !isBorderBox ) { + + // Add padding + delta += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + + // For "border" or "margin", add border + if ( box !== "padding" ) { + delta += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + + // But still keep track of it otherwise + } else { + extra += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + + // If we get here with a border-box (content + padding + border), we're seeking "content" or + // "padding" or "margin" + } else { + + // For "content", subtract padding + if ( box === "content" ) { + delta -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles ); + } + + // For "content" or "padding", subtract border + if ( box !== "margin" ) { + delta -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles ); + } + } + } + + // Account for positive content-box scroll gutter when requested by providing computedVal + if ( !isBorderBox && computedVal >= 0 ) { + + // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border + // Assuming integer scroll gutter, subtract the rest and round down + delta += Math.max( 0, Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + computedVal - + delta - + extra - + 0.5 + + // If offsetWidth/offsetHeight is unknown, then we can't determine content-box scroll gutter + // Use an explicit zero to avoid NaN (gh-3964) + ) ) || 0; + } + + return delta + marginDelta; +} + +function getWidthOrHeight( elem, dimension, extra ) { + + // Start with computed style + var styles = getStyles( elem ), + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-4322). + // Fake content-box until we know it's needed to know the true value. + boxSizingNeeded = !support.boxSizingReliable() || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + valueIsBorderBox = isBorderBox, + + val = curCSS( elem, dimension, styles ), + offsetProp = "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ); + + // Support: Firefox <=54 + // Return a confounding non-pixel value or feign ignorance, as appropriate. + if ( rnumnonpx.test( val ) ) { + if ( !extra ) { + return val; + } + val = "auto"; + } + + + // Support: IE 9 - 11 only + // Use offsetWidth/offsetHeight for when box sizing is unreliable. + // In those cases, the computed value can be trusted to be border-box. + if ( ( !support.boxSizingReliable() && isBorderBox || + + // Support: IE 10 - 11+, Edge 15 - 18+ + // IE/Edge misreport `getComputedStyle` of table rows with width/height + // set in CSS while `offset*` properties report correct values. + // Interestingly, in some cases IE 9 doesn't suffer from this issue. + !support.reliableTrDimensions() && nodeName( elem, "tr" ) || + + // Fall back to offsetWidth/offsetHeight when value is "auto" + // This happens for inline elements with no explicit setting (gh-3571) + val === "auto" || + + // Support: Android <=4.1 - 4.3 only + // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602) + !parseFloat( val ) && jQuery.css( elem, "display", false, styles ) === "inline" ) && + + // Make sure the element is visible & connected + elem.getClientRects().length ) { + + isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box"; + + // Where available, offsetWidth/offsetHeight approximate border box dimensions. + // Where not available (e.g., SVG), assume unreliable box-sizing and interpret the + // retrieved value as a content box dimension. + valueIsBorderBox = offsetProp in elem; + if ( valueIsBorderBox ) { + val = elem[ offsetProp ]; + } + } + + // Normalize "" and auto + val = parseFloat( val ) || 0; + + // Adjust for the element's box model + return ( val + + boxModelAdjustment( + elem, + dimension, + extra || ( isBorderBox ? "border" : "content" ), + valueIsBorderBox, + styles, + + // Provide the current computed size to request scroll gutter calculation (gh-3589) + val + ) + ) + "px"; +} + +jQuery.extend( { + + // Add in style property hooks for overriding the default + // behavior of getting and setting a style property + cssHooks: { + opacity: { + get: function( elem, computed ) { + if ( computed ) { + + // We should always get a number back from opacity + var ret = curCSS( elem, "opacity" ); + return ret === "" ? "1" : ret; + } + } + } + }, + + // Don't automatically add "px" to these possibly-unitless properties + cssNumber: { + animationIterationCount: true, + aspectRatio: true, + borderImageSlice: true, + columnCount: true, + flexGrow: true, + flexShrink: true, + fontWeight: true, + gridArea: true, + gridColumn: true, + gridColumnEnd: true, + gridColumnStart: true, + gridRow: true, + gridRowEnd: true, + gridRowStart: true, + lineHeight: true, + opacity: true, + order: true, + orphans: true, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: true + }, + + // Add in properties whose names you wish to fix before + // setting or getting the value + cssProps: {}, + + // Get and set the style property on a DOM Node + style: function( elem, name, value, extra ) { + + // Don't set styles on text and comment nodes + if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) { + return; + } + + // Make sure that we're working with the right name + var ret, type, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ), + style = elem.style; + + // Make sure that we're working with the right name. We don't + // want to query the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Gets hook for the prefixed version, then unprefixed version + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // Check if we're setting a value + if ( value !== undefined ) { + type = typeof value; + + // Convert "+=" or "-=" to relative numbers (trac-7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (trac-7116) + if ( value == null || value !== value ) { + return; + } + + // If a number was passed in, add the unit (except for certain CSS properties) + // The isCustomProp check can be removed in jQuery 4.0 when we only auto-append + // "px" to a few hardcoded values. + if ( type === "number" && !isCustomProp ) { + value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" ); + } + + // background-* props affect original clone's values + if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) { + style[ name ] = "inherit"; + } + + // If a hook was provided, use that value, otherwise just set the specified value + if ( !hooks || !( "set" in hooks ) || + ( value = hooks.set( elem, value, extra ) ) !== undefined ) { + + if ( isCustomProp ) { + style.setProperty( name, value ); + } else { + style[ name ] = value; + } + } + + } else { + + // If a hook was provided get the non-computed value from there + if ( hooks && "get" in hooks && + ( ret = hooks.get( elem, false, extra ) ) !== undefined ) { + + return ret; + } + + // Otherwise just get the value from the style object + return style[ name ]; + } + }, + + css: function( elem, name, extra, styles ) { + var val, num, hooks, + origName = camelCase( name ), + isCustomProp = rcustomProp.test( name ); + + // Make sure that we're working with the right name. We don't + // want to modify the value if it is a CSS custom property + // since they are user-defined. + if ( !isCustomProp ) { + name = finalPropName( origName ); + } + + // Try prefixed name followed by the unprefixed name + hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ]; + + // If a hook was provided get the computed value from there + if ( hooks && "get" in hooks ) { + val = hooks.get( elem, true, extra ); + } + + // Otherwise, if a way to get the computed value exists, use that + if ( val === undefined ) { + val = curCSS( elem, name, styles ); + } + + // Convert "normal" to computed value + if ( val === "normal" && name in cssNormalTransform ) { + val = cssNormalTransform[ name ]; + } + + // Make numeric if forced or a qualifier was provided and val looks numeric + if ( extra === "" || extra ) { + num = parseFloat( val ); + return extra === true || isFinite( num ) ? num || 0 : val; + } + + return val; + } +} ); + +jQuery.each( [ "height", "width" ], function( _i, dimension ) { + jQuery.cssHooks[ dimension ] = { + get: function( elem, computed, extra ) { + if ( computed ) { + + // Certain elements can have dimension info if we invisibly show them + // but it must have a current display style that would benefit + return rdisplayswap.test( jQuery.css( elem, "display" ) ) && + + // Support: Safari 8+ + // Table columns in Safari have non-zero offsetWidth & zero + // getBoundingClientRect().width unless display is changed. + // Support: IE <=11 only + // Running getBoundingClientRect on a disconnected node + // in IE throws an error. + ( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ? + swap( elem, cssShow, function() { + return getWidthOrHeight( elem, dimension, extra ); + } ) : + getWidthOrHeight( elem, dimension, extra ); + } + }, + + set: function( elem, value, extra ) { + var matches, + styles = getStyles( elem ), + + // Only read styles.position if the test has a chance to fail + // to avoid forcing a reflow. + scrollboxSizeBuggy = !support.scrollboxSize() && + styles.position === "absolute", + + // To avoid forcing a reflow, only fetch boxSizing if we need it (gh-3991) + boxSizingNeeded = scrollboxSizeBuggy || extra, + isBorderBox = boxSizingNeeded && + jQuery.css( elem, "boxSizing", false, styles ) === "border-box", + subtract = extra ? + boxModelAdjustment( + elem, + dimension, + extra, + isBorderBox, + styles + ) : + 0; + + // Account for unreliable border-box dimensions by comparing offset* to computed and + // faking a content-box to get border and padding (gh-3699) + if ( isBorderBox && scrollboxSizeBuggy ) { + subtract -= Math.ceil( + elem[ "offset" + dimension[ 0 ].toUpperCase() + dimension.slice( 1 ) ] - + parseFloat( styles[ dimension ] ) - + boxModelAdjustment( elem, dimension, "border", false, styles ) - + 0.5 + ); + } + + // Convert to pixels if value adjustment is needed + if ( subtract && ( matches = rcssNum.exec( value ) ) && + ( matches[ 3 ] || "px" ) !== "px" ) { + + elem.style[ dimension ] = value; + value = jQuery.css( elem, dimension ); + } + + return setPositiveNumber( elem, value, subtract ); + } + }; +} ); + +jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft, + function( elem, computed ) { + if ( computed ) { + return ( parseFloat( curCSS( elem, "marginLeft" ) ) || + elem.getBoundingClientRect().left - + swap( elem, { marginLeft: 0 }, function() { + return elem.getBoundingClientRect().left; + } ) + ) + "px"; + } + } +); + +// These hooks are used by animate to expand properties +jQuery.each( { + margin: "", + padding: "", + border: "Width" +}, function( prefix, suffix ) { + jQuery.cssHooks[ prefix + suffix ] = { + expand: function( value ) { + var i = 0, + expanded = {}, + + // Assumes a single number if not a string + parts = typeof value === "string" ? value.split( " " ) : [ value ]; + + for ( ; i < 4; i++ ) { + expanded[ prefix + cssExpand[ i ] + suffix ] = + parts[ i ] || parts[ i - 2 ] || parts[ 0 ]; + } + + return expanded; + } + }; + + if ( prefix !== "margin" ) { + jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber; + } +} ); + +jQuery.fn.extend( { + css: function( name, value ) { + return access( this, function( elem, name, value ) { + var styles, len, + map = {}, + i = 0; + + if ( Array.isArray( name ) ) { + styles = getStyles( elem ); + len = name.length; + + for ( ; i < len; i++ ) { + map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles ); + } + + return map; + } + + return value !== undefined ? + jQuery.style( elem, name, value ) : + jQuery.css( elem, name ); + }, name, value, arguments.length > 1 ); + } +} ); + + +function Tween( elem, options, prop, end, easing ) { + return new Tween.prototype.init( elem, options, prop, end, easing ); +} +jQuery.Tween = Tween; + +Tween.prototype = { + constructor: Tween, + init: function( elem, options, prop, end, easing, unit ) { + this.elem = elem; + this.prop = prop; + this.easing = easing || jQuery.easing._default; + this.options = options; + this.start = this.now = this.cur(); + this.end = end; + this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" ); + }, + cur: function() { + var hooks = Tween.propHooks[ this.prop ]; + + return hooks && hooks.get ? + hooks.get( this ) : + Tween.propHooks._default.get( this ); + }, + run: function( percent ) { + var eased, + hooks = Tween.propHooks[ this.prop ]; + + if ( this.options.duration ) { + this.pos = eased = jQuery.easing[ this.easing ]( + percent, this.options.duration * percent, 0, 1, this.options.duration + ); + } else { + this.pos = eased = percent; + } + this.now = ( this.end - this.start ) * eased + this.start; + + if ( this.options.step ) { + this.options.step.call( this.elem, this.now, this ); + } + + if ( hooks && hooks.set ) { + hooks.set( this ); + } else { + Tween.propHooks._default.set( this ); + } + return this; + } +}; + +Tween.prototype.init.prototype = Tween.prototype; + +Tween.propHooks = { + _default: { + get: function( tween ) { + var result; + + // Use a property on the element directly when it is not a DOM element, + // or when there is no matching style property that exists. + if ( tween.elem.nodeType !== 1 || + tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) { + return tween.elem[ tween.prop ]; + } + + // Passing an empty string as a 3rd parameter to .css will automatically + // attempt a parseFloat and fallback to a string if the parse fails. + // Simple values such as "10px" are parsed to Float; + // complex values such as "rotate(1rad)" are returned as-is. + result = jQuery.css( tween.elem, tween.prop, "" ); + + // Empty strings, null, undefined and "auto" are converted to 0. + return !result || result === "auto" ? 0 : result; + }, + set: function( tween ) { + + // Use step hook for back compat. + // Use cssHook if its there. + // Use .style if available and use plain properties where available. + if ( jQuery.fx.step[ tween.prop ] ) { + jQuery.fx.step[ tween.prop ]( tween ); + } else if ( tween.elem.nodeType === 1 && ( + jQuery.cssHooks[ tween.prop ] || + tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) { + jQuery.style( tween.elem, tween.prop, tween.now + tween.unit ); + } else { + tween.elem[ tween.prop ] = tween.now; + } + } + } +}; + +// Support: IE <=9 only +// Panic based approach to setting things on disconnected nodes +Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = { + set: function( tween ) { + if ( tween.elem.nodeType && tween.elem.parentNode ) { + tween.elem[ tween.prop ] = tween.now; + } + } +}; + +jQuery.easing = { + linear: function( p ) { + return p; + }, + swing: function( p ) { + return 0.5 - Math.cos( p * Math.PI ) / 2; + }, + _default: "swing" +}; + +jQuery.fx = Tween.prototype.init; + +// Back compat <1.8 extension point +jQuery.fx.step = {}; + + + + +var + fxNow, inProgress, + rfxtypes = /^(?:toggle|show|hide)$/, + rrun = /queueHooks$/; + +function schedule() { + if ( inProgress ) { + if ( document.hidden === false && window.requestAnimationFrame ) { + window.requestAnimationFrame( schedule ); + } else { + window.setTimeout( schedule, jQuery.fx.interval ); + } + + jQuery.fx.tick(); + } +} + +// Animations created synchronously will run synchronously +function createFxNow() { + window.setTimeout( function() { + fxNow = undefined; + } ); + return ( fxNow = Date.now() ); +} + +// Generate parameters to create a standard animation +function genFx( type, includeWidth ) { + var which, + i = 0, + attrs = { height: type }; + + // If we include width, step value is 1 to do all cssExpand values, + // otherwise step value is 2 to skip over Left and Right + includeWidth = includeWidth ? 1 : 0; + for ( ; i < 4; i += 2 - includeWidth ) { + which = cssExpand[ i ]; + attrs[ "margin" + which ] = attrs[ "padding" + which ] = type; + } + + if ( includeWidth ) { + attrs.opacity = attrs.width = type; + } + + return attrs; +} + +function createTween( value, prop, animation ) { + var tween, + collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ), + index = 0, + length = collection.length; + for ( ; index < length; index++ ) { + if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) { + + // We're done with this property + return tween; + } + } +} + +function defaultPrefilter( elem, props, opts ) { + var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display, + isBox = "width" in props || "height" in props, + anim = this, + orig = {}, + style = elem.style, + hidden = elem.nodeType && isHiddenWithinTree( elem ), + dataShow = dataPriv.get( elem, "fxshow" ); + + // Queue-skipping animations hijack the fx hooks + if ( !opts.queue ) { + hooks = jQuery._queueHooks( elem, "fx" ); + if ( hooks.unqueued == null ) { + hooks.unqueued = 0; + oldfire = hooks.empty.fire; + hooks.empty.fire = function() { + if ( !hooks.unqueued ) { + oldfire(); + } + }; + } + hooks.unqueued++; + + anim.always( function() { + + // Ensure the complete handler is called before this completes + anim.always( function() { + hooks.unqueued--; + if ( !jQuery.queue( elem, "fx" ).length ) { + hooks.empty.fire(); + } + } ); + } ); + } + + // Detect show/hide animations + for ( prop in props ) { + value = props[ prop ]; + if ( rfxtypes.test( value ) ) { + delete props[ prop ]; + toggle = toggle || value === "toggle"; + if ( value === ( hidden ? "hide" : "show" ) ) { + + // Pretend to be hidden if this is a "show" and + // there is still data from a stopped show/hide + if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) { + hidden = true; + + // Ignore all other no-op show/hide data + } else { + continue; + } + } + orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop ); + } + } + + // Bail out if this is a no-op like .hide().hide() + propTween = !jQuery.isEmptyObject( props ); + if ( !propTween && jQuery.isEmptyObject( orig ) ) { + return; + } + + // Restrict "overflow" and "display" styles during box animations + if ( isBox && elem.nodeType === 1 ) { + + // Support: IE <=9 - 11, Edge 12 - 15 + // Record all 3 overflow attributes because IE does not infer the shorthand + // from identically-valued overflowX and overflowY and Edge just mirrors + // the overflowX value there. + opts.overflow = [ style.overflow, style.overflowX, style.overflowY ]; + + // Identify a display type, preferring old show/hide data over the CSS cascade + restoreDisplay = dataShow && dataShow.display; + if ( restoreDisplay == null ) { + restoreDisplay = dataPriv.get( elem, "display" ); + } + display = jQuery.css( elem, "display" ); + if ( display === "none" ) { + if ( restoreDisplay ) { + display = restoreDisplay; + } else { + + // Get nonempty value(s) by temporarily forcing visibility + showHide( [ elem ], true ); + restoreDisplay = elem.style.display || restoreDisplay; + display = jQuery.css( elem, "display" ); + showHide( [ elem ] ); + } + } + + // Animate inline elements as inline-block + if ( display === "inline" || display === "inline-block" && restoreDisplay != null ) { + if ( jQuery.css( elem, "float" ) === "none" ) { + + // Restore the original display value at the end of pure show/hide animations + if ( !propTween ) { + anim.done( function() { + style.display = restoreDisplay; + } ); + if ( restoreDisplay == null ) { + display = style.display; + restoreDisplay = display === "none" ? "" : display; + } + } + style.display = "inline-block"; + } + } + } + + if ( opts.overflow ) { + style.overflow = "hidden"; + anim.always( function() { + style.overflow = opts.overflow[ 0 ]; + style.overflowX = opts.overflow[ 1 ]; + style.overflowY = opts.overflow[ 2 ]; + } ); + } + + // Implement show/hide animations + propTween = false; + for ( prop in orig ) { + + // General show/hide setup for this element animation + if ( !propTween ) { + if ( dataShow ) { + if ( "hidden" in dataShow ) { + hidden = dataShow.hidden; + } + } else { + dataShow = dataPriv.access( elem, "fxshow", { display: restoreDisplay } ); + } + + // Store hidden/visible for toggle so `.stop().toggle()` "reverses" + if ( toggle ) { + dataShow.hidden = !hidden; + } + + // Show elements before animating them + if ( hidden ) { + showHide( [ elem ], true ); + } + + /* eslint-disable no-loop-func */ + + anim.done( function() { + + /* eslint-enable no-loop-func */ + + // The final step of a "hide" animation is actually hiding the element + if ( !hidden ) { + showHide( [ elem ] ); + } + dataPriv.remove( elem, "fxshow" ); + for ( prop in orig ) { + jQuery.style( elem, prop, orig[ prop ] ); + } + } ); + } + + // Per-property setup + propTween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim ); + if ( !( prop in dataShow ) ) { + dataShow[ prop ] = propTween.start; + if ( hidden ) { + propTween.end = propTween.start; + propTween.start = 0; + } + } + } +} + +function propFilter( props, specialEasing ) { + var index, name, easing, value, hooks; + + // camelCase, specialEasing and expand cssHook pass + for ( index in props ) { + name = camelCase( index ); + easing = specialEasing[ name ]; + value = props[ index ]; + if ( Array.isArray( value ) ) { + easing = value[ 1 ]; + value = props[ index ] = value[ 0 ]; + } + + if ( index !== name ) { + props[ name ] = value; + delete props[ index ]; + } + + hooks = jQuery.cssHooks[ name ]; + if ( hooks && "expand" in hooks ) { + value = hooks.expand( value ); + delete props[ name ]; + + // Not quite $.extend, this won't overwrite existing keys. + // Reusing 'index' because we have the correct "name" + for ( index in value ) { + if ( !( index in props ) ) { + props[ index ] = value[ index ]; + specialEasing[ index ] = easing; + } + } + } else { + specialEasing[ name ] = easing; + } + } +} + +function Animation( elem, properties, options ) { + var result, + stopped, + index = 0, + length = Animation.prefilters.length, + deferred = jQuery.Deferred().always( function() { + + // Don't match elem in the :animated selector + delete tick.elem; + } ), + tick = function() { + if ( stopped ) { + return false; + } + var currentTime = fxNow || createFxNow(), + remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ), + + // Support: Android 2.3 only + // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (trac-12497) + temp = remaining / animation.duration || 0, + percent = 1 - temp, + index = 0, + length = animation.tweens.length; + + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( percent ); + } + + deferred.notifyWith( elem, [ animation, percent, remaining ] ); + + // If there's more to do, yield + if ( percent < 1 && length ) { + return remaining; + } + + // If this was an empty animation, synthesize a final progress notification + if ( !length ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + } + + // Resolve the animation and report its conclusion + deferred.resolveWith( elem, [ animation ] ); + return false; + }, + animation = deferred.promise( { + elem: elem, + props: jQuery.extend( {}, properties ), + opts: jQuery.extend( true, { + specialEasing: {}, + easing: jQuery.easing._default + }, options ), + originalProperties: properties, + originalOptions: options, + startTime: fxNow || createFxNow(), + duration: options.duration, + tweens: [], + createTween: function( prop, end ) { + var tween = jQuery.Tween( elem, animation.opts, prop, end, + animation.opts.specialEasing[ prop ] || animation.opts.easing ); + animation.tweens.push( tween ); + return tween; + }, + stop: function( gotoEnd ) { + var index = 0, + + // If we are going to the end, we want to run all the tweens + // otherwise we skip this part + length = gotoEnd ? animation.tweens.length : 0; + if ( stopped ) { + return this; + } + stopped = true; + for ( ; index < length; index++ ) { + animation.tweens[ index ].run( 1 ); + } + + // Resolve when we played the last frame; otherwise, reject + if ( gotoEnd ) { + deferred.notifyWith( elem, [ animation, 1, 0 ] ); + deferred.resolveWith( elem, [ animation, gotoEnd ] ); + } else { + deferred.rejectWith( elem, [ animation, gotoEnd ] ); + } + return this; + } + } ), + props = animation.props; + + propFilter( props, animation.opts.specialEasing ); + + for ( ; index < length; index++ ) { + result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts ); + if ( result ) { + if ( isFunction( result.stop ) ) { + jQuery._queueHooks( animation.elem, animation.opts.queue ).stop = + result.stop.bind( result ); + } + return result; + } + } + + jQuery.map( props, createTween, animation ); + + if ( isFunction( animation.opts.start ) ) { + animation.opts.start.call( elem, animation ); + } + + // Attach callbacks from options + animation + .progress( animation.opts.progress ) + .done( animation.opts.done, animation.opts.complete ) + .fail( animation.opts.fail ) + .always( animation.opts.always ); + + jQuery.fx.timer( + jQuery.extend( tick, { + elem: elem, + anim: animation, + queue: animation.opts.queue + } ) + ); + + return animation; +} + +jQuery.Animation = jQuery.extend( Animation, { + + tweeners: { + "*": [ function( prop, value ) { + var tween = this.createTween( prop, value ); + adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween ); + return tween; + } ] + }, + + tweener: function( props, callback ) { + if ( isFunction( props ) ) { + callback = props; + props = [ "*" ]; + } else { + props = props.match( rnothtmlwhite ); + } + + var prop, + index = 0, + length = props.length; + + for ( ; index < length; index++ ) { + prop = props[ index ]; + Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || []; + Animation.tweeners[ prop ].unshift( callback ); + } + }, + + prefilters: [ defaultPrefilter ], + + prefilter: function( callback, prepend ) { + if ( prepend ) { + Animation.prefilters.unshift( callback ); + } else { + Animation.prefilters.push( callback ); + } + } +} ); + +jQuery.speed = function( speed, easing, fn ) { + var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : { + complete: fn || !fn && easing || + isFunction( speed ) && speed, + duration: speed, + easing: fn && easing || easing && !isFunction( easing ) && easing + }; + + // Go to the end state if fx are off + if ( jQuery.fx.off ) { + opt.duration = 0; + + } else { + if ( typeof opt.duration !== "number" ) { + if ( opt.duration in jQuery.fx.speeds ) { + opt.duration = jQuery.fx.speeds[ opt.duration ]; + + } else { + opt.duration = jQuery.fx.speeds._default; + } + } + } + + // Normalize opt.queue - true/undefined/null -> "fx" + if ( opt.queue == null || opt.queue === true ) { + opt.queue = "fx"; + } + + // Queueing + opt.old = opt.complete; + + opt.complete = function() { + if ( isFunction( opt.old ) ) { + opt.old.call( this ); + } + + if ( opt.queue ) { + jQuery.dequeue( this, opt.queue ); + } + }; + + return opt; +}; + +jQuery.fn.extend( { + fadeTo: function( speed, to, easing, callback ) { + + // Show any hidden elements after setting opacity to 0 + return this.filter( isHiddenWithinTree ).css( "opacity", 0 ).show() + + // Animate to the value specified + .end().animate( { opacity: to }, speed, easing, callback ); + }, + animate: function( prop, speed, easing, callback ) { + var empty = jQuery.isEmptyObject( prop ), + optall = jQuery.speed( speed, easing, callback ), + doAnimation = function() { + + // Operate on a copy of prop so per-property easing won't be lost + var anim = Animation( this, jQuery.extend( {}, prop ), optall ); + + // Empty animations, or finishing resolves immediately + if ( empty || dataPriv.get( this, "finish" ) ) { + anim.stop( true ); + } + }; + + doAnimation.finish = doAnimation; + + return empty || optall.queue === false ? + this.each( doAnimation ) : + this.queue( optall.queue, doAnimation ); + }, + stop: function( type, clearQueue, gotoEnd ) { + var stopQueue = function( hooks ) { + var stop = hooks.stop; + delete hooks.stop; + stop( gotoEnd ); + }; + + if ( typeof type !== "string" ) { + gotoEnd = clearQueue; + clearQueue = type; + type = undefined; + } + if ( clearQueue ) { + this.queue( type || "fx", [] ); + } + + return this.each( function() { + var dequeue = true, + index = type != null && type + "queueHooks", + timers = jQuery.timers, + data = dataPriv.get( this ); + + if ( index ) { + if ( data[ index ] && data[ index ].stop ) { + stopQueue( data[ index ] ); + } + } else { + for ( index in data ) { + if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) { + stopQueue( data[ index ] ); + } + } + } + + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && + ( type == null || timers[ index ].queue === type ) ) { + + timers[ index ].anim.stop( gotoEnd ); + dequeue = false; + timers.splice( index, 1 ); + } + } + + // Start the next in the queue if the last step wasn't forced. + // Timers currently will call their complete callbacks, which + // will dequeue but only if they were gotoEnd. + if ( dequeue || !gotoEnd ) { + jQuery.dequeue( this, type ); + } + } ); + }, + finish: function( type ) { + if ( type !== false ) { + type = type || "fx"; + } + return this.each( function() { + var index, + data = dataPriv.get( this ), + queue = data[ type + "queue" ], + hooks = data[ type + "queueHooks" ], + timers = jQuery.timers, + length = queue ? queue.length : 0; + + // Enable finishing flag on private data + data.finish = true; + + // Empty the queue first + jQuery.queue( this, type, [] ); + + if ( hooks && hooks.stop ) { + hooks.stop.call( this, true ); + } + + // Look for any active animations, and finish them + for ( index = timers.length; index--; ) { + if ( timers[ index ].elem === this && timers[ index ].queue === type ) { + timers[ index ].anim.stop( true ); + timers.splice( index, 1 ); + } + } + + // Look for any animations in the old queue and finish them + for ( index = 0; index < length; index++ ) { + if ( queue[ index ] && queue[ index ].finish ) { + queue[ index ].finish.call( this ); + } + } + + // Turn off finishing flag + delete data.finish; + } ); + } +} ); + +jQuery.each( [ "toggle", "show", "hide" ], function( _i, name ) { + var cssFn = jQuery.fn[ name ]; + jQuery.fn[ name ] = function( speed, easing, callback ) { + return speed == null || typeof speed === "boolean" ? + cssFn.apply( this, arguments ) : + this.animate( genFx( name, true ), speed, easing, callback ); + }; +} ); + +// Generate shortcuts for custom animations +jQuery.each( { + slideDown: genFx( "show" ), + slideUp: genFx( "hide" ), + slideToggle: genFx( "toggle" ), + fadeIn: { opacity: "show" }, + fadeOut: { opacity: "hide" }, + fadeToggle: { opacity: "toggle" } +}, function( name, props ) { + jQuery.fn[ name ] = function( speed, easing, callback ) { + return this.animate( props, speed, easing, callback ); + }; +} ); + +jQuery.timers = []; +jQuery.fx.tick = function() { + var timer, + i = 0, + timers = jQuery.timers; + + fxNow = Date.now(); + + for ( ; i < timers.length; i++ ) { + timer = timers[ i ]; + + // Run the timer and safely remove it when done (allowing for external removal) + if ( !timer() && timers[ i ] === timer ) { + timers.splice( i--, 1 ); + } + } + + if ( !timers.length ) { + jQuery.fx.stop(); + } + fxNow = undefined; +}; + +jQuery.fx.timer = function( timer ) { + jQuery.timers.push( timer ); + jQuery.fx.start(); +}; + +jQuery.fx.interval = 13; +jQuery.fx.start = function() { + if ( inProgress ) { + return; + } + + inProgress = true; + schedule(); +}; + +jQuery.fx.stop = function() { + inProgress = null; +}; + +jQuery.fx.speeds = { + slow: 600, + fast: 200, + + // Default speed + _default: 400 +}; + + +// Based off of the plugin by Clint Helfers, with permission. +jQuery.fn.delay = function( time, type ) { + time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time; + type = type || "fx"; + + return this.queue( type, function( next, hooks ) { + var timeout = window.setTimeout( next, time ); + hooks.stop = function() { + window.clearTimeout( timeout ); + }; + } ); +}; + + +( function() { + var input = document.createElement( "input" ), + select = document.createElement( "select" ), + opt = select.appendChild( document.createElement( "option" ) ); + + input.type = "checkbox"; + + // Support: Android <=4.3 only + // Default value for a checkbox should be "on" + support.checkOn = input.value !== ""; + + // Support: IE <=11 only + // Must access selectedIndex to make default options select + support.optSelected = opt.selected; + + // Support: IE <=11 only + // An input loses its value after becoming a radio + input = document.createElement( "input" ); + input.value = "t"; + input.type = "radio"; + support.radioValue = input.value === "t"; +} )(); + + +var boolHook, + attrHandle = jQuery.expr.attrHandle; + +jQuery.fn.extend( { + attr: function( name, value ) { + return access( this, jQuery.attr, name, value, arguments.length > 1 ); + }, + + removeAttr: function( name ) { + return this.each( function() { + jQuery.removeAttr( this, name ); + } ); + } +} ); + +jQuery.extend( { + attr: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set attributes on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + // Fallback to prop when attributes are not supported + if ( typeof elem.getAttribute === "undefined" ) { + return jQuery.prop( elem, name, value ); + } + + // Attribute hooks are determined by the lowercase version + // Grab necessary hook if one is defined + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + hooks = jQuery.attrHooks[ name.toLowerCase() ] || + ( jQuery.expr.match.bool.test( name ) ? boolHook : undefined ); + } + + if ( value !== undefined ) { + if ( value === null ) { + jQuery.removeAttr( elem, name ); + return; + } + + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + elem.setAttribute( name, value + "" ); + return value; + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + ret = jQuery.find.attr( elem, name ); + + // Non-existent attributes return null, we normalize to undefined + return ret == null ? undefined : ret; + }, + + attrHooks: { + type: { + set: function( elem, value ) { + if ( !support.radioValue && value === "radio" && + nodeName( elem, "input" ) ) { + var val = elem.value; + elem.setAttribute( "type", value ); + if ( val ) { + elem.value = val; + } + return value; + } + } + } + }, + + removeAttr: function( elem, value ) { + var name, + i = 0, + + // Attribute names can contain non-HTML whitespace characters + // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2 + attrNames = value && value.match( rnothtmlwhite ); + + if ( attrNames && elem.nodeType === 1 ) { + while ( ( name = attrNames[ i++ ] ) ) { + elem.removeAttribute( name ); + } + } + } +} ); + +// Hooks for boolean attributes +boolHook = { + set: function( elem, value, name ) { + if ( value === false ) { + + // Remove boolean attributes when set to false + jQuery.removeAttr( elem, name ); + } else { + elem.setAttribute( name, name ); + } + return name; + } +}; + +jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( _i, name ) { + var getter = attrHandle[ name ] || jQuery.find.attr; + + attrHandle[ name ] = function( elem, name, isXML ) { + var ret, handle, + lowercaseName = name.toLowerCase(); + + if ( !isXML ) { + + // Avoid an infinite loop by temporarily removing this function from the getter + handle = attrHandle[ lowercaseName ]; + attrHandle[ lowercaseName ] = ret; + ret = getter( elem, name, isXML ) != null ? + lowercaseName : + null; + attrHandle[ lowercaseName ] = handle; + } + return ret; + }; +} ); + + + + +var rfocusable = /^(?:input|select|textarea|button)$/i, + rclickable = /^(?:a|area)$/i; + +jQuery.fn.extend( { + prop: function( name, value ) { + return access( this, jQuery.prop, name, value, arguments.length > 1 ); + }, + + removeProp: function( name ) { + return this.each( function() { + delete this[ jQuery.propFix[ name ] || name ]; + } ); + } +} ); + +jQuery.extend( { + prop: function( elem, name, value ) { + var ret, hooks, + nType = elem.nodeType; + + // Don't get/set properties on text, comment and attribute nodes + if ( nType === 3 || nType === 8 || nType === 2 ) { + return; + } + + if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) { + + // Fix name and attach hooks + name = jQuery.propFix[ name ] || name; + hooks = jQuery.propHooks[ name ]; + } + + if ( value !== undefined ) { + if ( hooks && "set" in hooks && + ( ret = hooks.set( elem, value, name ) ) !== undefined ) { + return ret; + } + + return ( elem[ name ] = value ); + } + + if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) { + return ret; + } + + return elem[ name ]; + }, + + propHooks: { + tabIndex: { + get: function( elem ) { + + // Support: IE <=9 - 11 only + // elem.tabIndex doesn't always return the + // correct value when it hasn't been explicitly set + // Use proper attribute retrieval (trac-12072) + var tabindex = jQuery.find.attr( elem, "tabindex" ); + + if ( tabindex ) { + return parseInt( tabindex, 10 ); + } + + if ( + rfocusable.test( elem.nodeName ) || + rclickable.test( elem.nodeName ) && + elem.href + ) { + return 0; + } + + return -1; + } + } + }, + + propFix: { + "for": "htmlFor", + "class": "className" + } +} ); + +// Support: IE <=11 only +// Accessing the selectedIndex property +// forces the browser to respect setting selected +// on the option +// The getter ensures a default option is selected +// when in an optgroup +// eslint rule "no-unused-expressions" is disabled for this code +// since it considers such accessions noop +if ( !support.optSelected ) { + jQuery.propHooks.selected = { + get: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent && parent.parentNode ) { + parent.parentNode.selectedIndex; + } + return null; + }, + set: function( elem ) { + + /* eslint no-unused-expressions: "off" */ + + var parent = elem.parentNode; + if ( parent ) { + parent.selectedIndex; + + if ( parent.parentNode ) { + parent.parentNode.selectedIndex; + } + } + } + }; +} + +jQuery.each( [ + "tabIndex", + "readOnly", + "maxLength", + "cellSpacing", + "cellPadding", + "rowSpan", + "colSpan", + "useMap", + "frameBorder", + "contentEditable" +], function() { + jQuery.propFix[ this.toLowerCase() ] = this; +} ); + + + + + // Strip and collapse whitespace according to HTML spec + // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace + function stripAndCollapse( value ) { + var tokens = value.match( rnothtmlwhite ) || []; + return tokens.join( " " ); + } + + +function getClass( elem ) { + return elem.getAttribute && elem.getAttribute( "class" ) || ""; +} + +function classesToArray( value ) { + if ( Array.isArray( value ) ) { + return value; + } + if ( typeof value === "string" ) { + return value.match( rnothtmlwhite ) || []; + } + return []; +} + +jQuery.fn.extend( { + addClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + removeClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + + // This expression is here for better compressibility (see addClass) + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Remove *all* instances + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var classNames, className, i, self, + type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + + return this.each( function() { + if ( isValidValue ) { + + // Toggle individual class names + self = jQuery( this ); + + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Check each className given, space separated list + if ( self.hasClass( className ) ) { + self.removeClass( className ); + } else { + self.addClass( className ); + } + } + + // Toggle whole class name + } else if ( value === undefined || type === "boolean" ) { + className = getClass( this ); + if ( className ) { + + // Store className if set + dataPriv.set( this, "__className__", className ); + } + + // If the element has a class name or if we're passed `false`, + // then remove the whole classname (if there was one, the above saved it). + // Otherwise bring back whatever was previously saved (if anything), + // falling back to the empty string if nothing was stored. + if ( this.setAttribute ) { + this.setAttribute( "class", + className || value === false ? + "" : + dataPriv.get( this, "__className__" ) || "" + ); + } + } + } ); + }, + + hasClass: function( selector ) { + var className, elem, + i = 0; + + className = " " + selector + " "; + while ( ( elem = this[ i++ ] ) ) { + if ( elem.nodeType === 1 && + ( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) { + return true; + } + } + + return false; + } +} ); + + + + +var rreturn = /\r/g; + +jQuery.fn.extend( { + val: function( value ) { + var hooks, ret, valueIsFunction, + elem = this[ 0 ]; + + if ( !arguments.length ) { + if ( elem ) { + hooks = jQuery.valHooks[ elem.type ] || + jQuery.valHooks[ elem.nodeName.toLowerCase() ]; + + if ( hooks && + "get" in hooks && + ( ret = hooks.get( elem, "value" ) ) !== undefined + ) { + return ret; + } + + ret = elem.value; + + // Handle most common string cases + if ( typeof ret === "string" ) { + return ret.replace( rreturn, "" ); + } + + // Handle cases where value is null/undef or number + return ret == null ? "" : ret; + } + + return; + } + + valueIsFunction = isFunction( value ); + + return this.each( function( i ) { + var val; + + if ( this.nodeType !== 1 ) { + return; + } + + if ( valueIsFunction ) { + val = value.call( this, i, jQuery( this ).val() ); + } else { + val = value; + } + + // Treat null/undefined as ""; convert numbers to string + if ( val == null ) { + val = ""; + + } else if ( typeof val === "number" ) { + val += ""; + + } else if ( Array.isArray( val ) ) { + val = jQuery.map( val, function( value ) { + return value == null ? "" : value + ""; + } ); + } + + hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ]; + + // If set returns undefined, fall back to normal setting + if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) { + this.value = val; + } + } ); + } +} ); + +jQuery.extend( { + valHooks: { + option: { + get: function( elem ) { + + var val = jQuery.find.attr( elem, "value" ); + return val != null ? + val : + + // Support: IE <=10 - 11 only + // option.text throws exceptions (trac-14686, trac-14858) + // Strip and collapse whitespace + // https://html.spec.whatwg.org/#strip-and-collapse-whitespace + stripAndCollapse( jQuery.text( elem ) ); + } + }, + select: { + get: function( elem ) { + var value, option, i, + options = elem.options, + index = elem.selectedIndex, + one = elem.type === "select-one", + values = one ? null : [], + max = one ? index + 1 : options.length; + + if ( index < 0 ) { + i = max; + + } else { + i = one ? index : 0; + } + + // Loop through all the selected options + for ( ; i < max; i++ ) { + option = options[ i ]; + + // Support: IE <=9 only + // IE8-9 doesn't update selected after form reset (trac-2551) + if ( ( option.selected || i === index ) && + + // Don't return options that are disabled or in a disabled optgroup + !option.disabled && + ( !option.parentNode.disabled || + !nodeName( option.parentNode, "optgroup" ) ) ) { + + // Get the specific value for the option + value = jQuery( option ).val(); + + // We don't need an array for one selects + if ( one ) { + return value; + } + + // Multi-Selects return an array + values.push( value ); + } + } + + return values; + }, + + set: function( elem, value ) { + var optionSet, option, + options = elem.options, + values = jQuery.makeArray( value ), + i = options.length; + + while ( i-- ) { + option = options[ i ]; + + /* eslint-disable no-cond-assign */ + + if ( option.selected = + jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1 + ) { + optionSet = true; + } + + /* eslint-enable no-cond-assign */ + } + + // Force browsers to behave consistently when non-matching value is set + if ( !optionSet ) { + elem.selectedIndex = -1; + } + return values; + } + } + } +} ); + +// Radios and checkboxes getter/setter +jQuery.each( [ "radio", "checkbox" ], function() { + jQuery.valHooks[ this ] = { + set: function( elem, value ) { + if ( Array.isArray( value ) ) { + return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 ); + } + } + }; + if ( !support.checkOn ) { + jQuery.valHooks[ this ].get = function( elem ) { + return elem.getAttribute( "value" ) === null ? "on" : elem.value; + }; + } +} ); + + + + +// Return jQuery for attributes-only inclusion +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + if ( !data || typeof data !== "string" ) { + return null; + } + + // Support: IE 9 - 11 only + // IE throws on parseFromString with invalid input. + try { + xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" ); + } catch ( e ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + stopPropagationCallback = function( e ) { + e.stopPropagation(); + }; + +jQuery.extend( jQuery.event, { + + trigger: function( event, data, elem, onlyHandlers ) { + + var i, cur, tmp, bubbleType, ontype, handle, special, lastElement, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = lastElement = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-9724) + if ( !onlyHandlers && !special.noBubble && !isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + lastElement = cur; + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] && + dataPriv.get( cur, "handle" ); + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( ( !special._default || + special._default.apply( eventPath.pop(), data ) === false ) && + acceptData( elem ) ) { + + // Call a native DOM method on the target with the same name as the event. + // Don't do default actions on window, that's where global variables be (trac-6170) + if ( ontype && isFunction( elem[ type ] ) && !isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + + if ( event.isPropagationStopped() ) { + lastElement.addEventListener( type, stopPropagationCallback ); + } + + elem[ type ](); + + if ( event.isPropagationStopped() ) { + lastElement.removeEventListener( type, stopPropagationCallback ); + } + + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + // Piggyback on a donor event to simulate a different one + // Used only for `focus(in | out)` events + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + } + ); + + jQuery.event.trigger( e, null, elem ); + } + +} ); + +jQuery.fn.extend( { + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var + rbracket = /\[\]$/, + rCRLF = /\r?\n/g, + rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i, + rsubmittable = /^(?:input|select|textarea|keygen)/i; + +function buildParams( prefix, obj, traditional, add ) { + var name; + + if ( Array.isArray( obj ) ) { + + // Serialize array item. + jQuery.each( obj, function( i, v ) { + if ( traditional || rbracket.test( prefix ) ) { + + // Treat each array item as a scalar. + add( prefix, v ); + + } else { + + // Item is non-scalar (array or object), encode its numeric index. + buildParams( + prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]", + v, + traditional, + add + ); + } + } ); + + } else if ( !traditional && toType( obj ) === "object" ) { + + // Serialize object item. + for ( name in obj ) { + buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add ); + } + + } else { + + // Serialize scalar item. + add( prefix, obj ); + } +} + +// Serialize an array of form elements or a set of +// key/values into a query string +jQuery.param = function( a, traditional ) { + var prefix, + s = [], + add = function( key, valueOrFunction ) { + + // If value is a function, invoke it and use its return value + var value = isFunction( valueOrFunction ) ? + valueOrFunction() : + valueOrFunction; + + s[ s.length ] = encodeURIComponent( key ) + "=" + + encodeURIComponent( value == null ? "" : value ); + }; + + if ( a == null ) { + return ""; + } + + // If an array was passed in, assume that it is an array of form elements. + if ( Array.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) { + + // Serialize the form elements + jQuery.each( a, function() { + add( this.name, this.value ); + } ); + + } else { + + // If traditional, encode the "old" way (the way 1.3.2 or older + // did it), otherwise encode params recursively. + for ( prefix in a ) { + buildParams( prefix, a[ prefix ], traditional, add ); + } + } + + // Return the resulting serialization + return s.join( "&" ); +}; + +jQuery.fn.extend( { + serialize: function() { + return jQuery.param( this.serializeArray() ); + }, + serializeArray: function() { + return this.map( function() { + + // Can add propHook for "elements" to filter or add form elements + var elements = jQuery.prop( this, "elements" ); + return elements ? jQuery.makeArray( elements ) : this; + } ).filter( function() { + var type = this.type; + + // Use .is( ":disabled" ) so that fieldset[disabled] works + return this.name && !jQuery( this ).is( ":disabled" ) && + rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) && + ( this.checked || !rcheckableType.test( type ) ); + } ).map( function( _i, elem ) { + var val = jQuery( this ).val(); + + if ( val == null ) { + return null; + } + + if ( Array.isArray( val ) ) { + return jQuery.map( val, function( val ) { + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ); + } + + return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) }; + } ).get(); + } +} ); + + +var + r20 = /%20/g, + rhash = /#.*$/, + rantiCache = /([?&])_=[^&]*/, + rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg, + + // trac-7653, trac-8125, trac-8152: local protocol detection + rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, + rnoContent = /^(?:GET|HEAD)$/, + rprotocol = /^\/\//, + + /* Prefilters + * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example) + * 2) These are called: + * - BEFORE asking for a transport + * - AFTER param serialization (s.data is a string if s.processData is true) + * 3) key is the dataType + * 4) the catchall symbol "*" can be used + * 5) execution will start with transport dataType and THEN continue down to "*" if needed + */ + prefilters = {}, + + /* Transports bindings + * 1) key is the dataType + * 2) the catchall symbol "*" can be used + * 3) selection will start with transport dataType and THEN go to "*" if needed + */ + transports = {}, + + // Avoid comment-prolog char sequence (trac-10098); must appease lint and evade compression + allTypes = "*/".concat( "*" ), + + // Anchor tag for parsing the document origin + originAnchor = document.createElement( "a" ); + +originAnchor.href = location.href; + +// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport +function addToPrefiltersOrTransports( structure ) { + + // dataTypeExpression is optional and defaults to "*" + return function( dataTypeExpression, func ) { + + if ( typeof dataTypeExpression !== "string" ) { + func = dataTypeExpression; + dataTypeExpression = "*"; + } + + var dataType, + i = 0, + dataTypes = dataTypeExpression.toLowerCase().match( rnothtmlwhite ) || []; + + if ( isFunction( func ) ) { + + // For each dataType in the dataTypeExpression + while ( ( dataType = dataTypes[ i++ ] ) ) { + + // Prepend if requested + if ( dataType[ 0 ] === "+" ) { + dataType = dataType.slice( 1 ) || "*"; + ( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func ); + + // Otherwise append + } else { + ( structure[ dataType ] = structure[ dataType ] || [] ).push( func ); + } + } + } + }; +} + +// Base inspection function for prefilters and transports +function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) { + + var inspected = {}, + seekingTransport = ( structure === transports ); + + function inspect( dataType ) { + var selected; + inspected[ dataType ] = true; + jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) { + var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR ); + if ( typeof dataTypeOrTransport === "string" && + !seekingTransport && !inspected[ dataTypeOrTransport ] ) { + + options.dataTypes.unshift( dataTypeOrTransport ); + inspect( dataTypeOrTransport ); + return false; + } else if ( seekingTransport ) { + return !( selected = dataTypeOrTransport ); + } + } ); + return selected; + } + + return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" ); +} + +// A special extend for ajax options +// that takes "flat" options (not to be deep extended) +// Fixes trac-9887 +function ajaxExtend( target, src ) { + var key, deep, + flatOptions = jQuery.ajaxSettings.flatOptions || {}; + + for ( key in src ) { + if ( src[ key ] !== undefined ) { + ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ]; + } + } + if ( deep ) { + jQuery.extend( true, target, deep ); + } + + return target; +} + +/* Handles responses to an ajax request: + * - finds the right dataType (mediates between content-type and expected dataType) + * - returns the corresponding response + */ +function ajaxHandleResponses( s, jqXHR, responses ) { + + var ct, type, finalDataType, firstDataType, + contents = s.contents, + dataTypes = s.dataTypes; + + // Remove auto dataType and get content-type in the process + while ( dataTypes[ 0 ] === "*" ) { + dataTypes.shift(); + if ( ct === undefined ) { + ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" ); + } + } + + // Check if we're dealing with a known content-type + if ( ct ) { + for ( type in contents ) { + if ( contents[ type ] && contents[ type ].test( ct ) ) { + dataTypes.unshift( type ); + break; + } + } + } + + // Check to see if we have a response for the expected dataType + if ( dataTypes[ 0 ] in responses ) { + finalDataType = dataTypes[ 0 ]; + } else { + + // Try convertible dataTypes + for ( type in responses ) { + if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) { + finalDataType = type; + break; + } + if ( !firstDataType ) { + firstDataType = type; + } + } + + // Or just use first one + finalDataType = finalDataType || firstDataType; + } + + // If we found a dataType + // We add the dataType to the list if needed + // and return the corresponding response + if ( finalDataType ) { + if ( finalDataType !== dataTypes[ 0 ] ) { + dataTypes.unshift( finalDataType ); + } + return responses[ finalDataType ]; + } +} + +/* Chain conversions given the request and the original response + * Also sets the responseXXX fields on the jqXHR instance + */ +function ajaxConvert( s, response, jqXHR, isSuccess ) { + var conv2, current, conv, tmp, prev, + converters = {}, + + // Work with a copy of dataTypes in case we need to modify it for conversion + dataTypes = s.dataTypes.slice(); + + // Create converters map with lowercased keys + if ( dataTypes[ 1 ] ) { + for ( conv in s.converters ) { + converters[ conv.toLowerCase() ] = s.converters[ conv ]; + } + } + + current = dataTypes.shift(); + + // Convert to each sequential dataType + while ( current ) { + + if ( s.responseFields[ current ] ) { + jqXHR[ s.responseFields[ current ] ] = response; + } + + // Apply the dataFilter if provided + if ( !prev && isSuccess && s.dataFilter ) { + response = s.dataFilter( response, s.dataType ); + } + + prev = current; + current = dataTypes.shift(); + + if ( current ) { + + // There's only work to do if current dataType is non-auto + if ( current === "*" ) { + + current = prev; + + // Convert response if prev dataType is non-auto and differs from current + } else if ( prev !== "*" && prev !== current ) { + + // Seek a direct converter + conv = converters[ prev + " " + current ] || converters[ "* " + current ]; + + // If none found, seek a pair + if ( !conv ) { + for ( conv2 in converters ) { + + // If conv2 outputs current + tmp = conv2.split( " " ); + if ( tmp[ 1 ] === current ) { + + // If prev can be converted to accepted input + conv = converters[ prev + " " + tmp[ 0 ] ] || + converters[ "* " + tmp[ 0 ] ]; + if ( conv ) { + + // Condense equivalence converters + if ( conv === true ) { + conv = converters[ conv2 ]; + + // Otherwise, insert the intermediate dataType + } else if ( converters[ conv2 ] !== true ) { + current = tmp[ 0 ]; + dataTypes.unshift( tmp[ 1 ] ); + } + break; + } + } + } + } + + // Apply converter (if not an equivalence) + if ( conv !== true ) { + + // Unless errors are allowed to bubble, catch and return them + if ( conv && s.throws ) { + response = conv( response ); + } else { + try { + response = conv( response ); + } catch ( e ) { + return { + state: "parsererror", + error: conv ? e : "No conversion from " + prev + " to " + current + }; + } + } + } + } + } + } + + return { state: "success", data: response }; +} + +jQuery.extend( { + + // Counter for holding the number of active queries + active: 0, + + // Last-Modified header cache for next request + lastModified: {}, + etag: {}, + + ajaxSettings: { + url: location.href, + type: "GET", + isLocal: rlocalProtocol.test( location.protocol ), + global: true, + processData: true, + async: true, + contentType: "application/x-www-form-urlencoded; charset=UTF-8", + + /* + timeout: 0, + data: null, + dataType: null, + username: null, + password: null, + cache: null, + throws: false, + traditional: false, + headers: {}, + */ + + accepts: { + "*": allTypes, + text: "text/plain", + html: "text/html", + xml: "application/xml, text/xml", + json: "application/json, text/javascript" + }, + + contents: { + xml: /\bxml\b/, + html: /\bhtml/, + json: /\bjson\b/ + }, + + responseFields: { + xml: "responseXML", + text: "responseText", + json: "responseJSON" + }, + + // Data converters + // Keys separate source (or catchall "*") and destination types with a single space + converters: { + + // Convert anything to text + "* text": String, + + // Text to html (true = no transformation) + "text html": true, + + // Evaluate text as a json expression + "text json": JSON.parse, + + // Parse text as xml + "text xml": jQuery.parseXML + }, + + // For options that shouldn't be deep extended: + // you can add your own custom options here if + // and when you create one that shouldn't be + // deep extended (see ajaxExtend) + flatOptions: { + url: true, + context: true + } + }, + + // Creates a full fledged settings object into target + // with both ajaxSettings and settings fields. + // If target is omitted, writes into ajaxSettings. + ajaxSetup: function( target, settings ) { + return settings ? + + // Building a settings object + ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) : + + // Extending ajaxSettings + ajaxExtend( jQuery.ajaxSettings, target ); + }, + + ajaxPrefilter: addToPrefiltersOrTransports( prefilters ), + ajaxTransport: addToPrefiltersOrTransports( transports ), + + // Main method + ajax: function( url, options ) { + + // If url is an object, simulate pre-1.5 signature + if ( typeof url === "object" ) { + options = url; + url = undefined; + } + + // Force options to be an object + options = options || {}; + + var transport, + + // URL without anti-cache param + cacheURL, + + // Response headers + responseHeadersString, + responseHeaders, + + // timeout handle + timeoutTimer, + + // Url cleanup var + urlAnchor, + + // Request state (becomes false upon send and true upon completion) + completed, + + // To know if global events are to be dispatched + fireGlobals, + + // Loop variable + i, + + // uncached part of the url + uncached, + + // Create the final options object + s = jQuery.ajaxSetup( {}, options ), + + // Callbacks context + callbackContext = s.context || s, + + // Context for global events is callbackContext if it is a DOM node or jQuery collection + globalEventContext = s.context && + ( callbackContext.nodeType || callbackContext.jquery ) ? + jQuery( callbackContext ) : + jQuery.event, + + // Deferreds + deferred = jQuery.Deferred(), + completeDeferred = jQuery.Callbacks( "once memory" ), + + // Status-dependent callbacks + statusCode = s.statusCode || {}, + + // Headers (they are sent all at once) + requestHeaders = {}, + requestHeadersNames = {}, + + // Default abort message + strAbort = "canceled", + + // Fake xhr + jqXHR = { + readyState: 0, + + // Builds headers hashtable if needed + getResponseHeader: function( key ) { + var match; + if ( completed ) { + if ( !responseHeaders ) { + responseHeaders = {}; + while ( ( match = rheaders.exec( responseHeadersString ) ) ) { + responseHeaders[ match[ 1 ].toLowerCase() + " " ] = + ( responseHeaders[ match[ 1 ].toLowerCase() + " " ] || [] ) + .concat( match[ 2 ] ); + } + } + match = responseHeaders[ key.toLowerCase() + " " ]; + } + return match == null ? null : match.join( ", " ); + }, + + // Raw string + getAllResponseHeaders: function() { + return completed ? responseHeadersString : null; + }, + + // Caches the header + setRequestHeader: function( name, value ) { + if ( completed == null ) { + name = requestHeadersNames[ name.toLowerCase() ] = + requestHeadersNames[ name.toLowerCase() ] || name; + requestHeaders[ name ] = value; + } + return this; + }, + + // Overrides response content-type header + overrideMimeType: function( type ) { + if ( completed == null ) { + s.mimeType = type; + } + return this; + }, + + // Status-dependent callbacks + statusCode: function( map ) { + var code; + if ( map ) { + if ( completed ) { + + // Execute the appropriate callbacks + jqXHR.always( map[ jqXHR.status ] ); + } else { + + // Lazy-add the new callbacks in a way that preserves old ones + for ( code in map ) { + statusCode[ code ] = [ statusCode[ code ], map[ code ] ]; + } + } + } + return this; + }, + + // Cancel the request + abort: function( statusText ) { + var finalText = statusText || strAbort; + if ( transport ) { + transport.abort( finalText ); + } + done( 0, finalText ); + return this; + } + }; + + // Attach deferreds + deferred.promise( jqXHR ); + + // Add protocol if not provided (prefilters might expect it) + // Handle falsy url in the settings object (trac-10093: consistency with old signature) + // We also use the url parameter if available + s.url = ( ( url || s.url || location.href ) + "" ) + .replace( rprotocol, location.protocol + "//" ); + + // Alias method option to type as per ticket trac-12004 + s.type = options.method || options.type || s.method || s.type; + + // Extract dataTypes list + s.dataTypes = ( s.dataType || "*" ).toLowerCase().match( rnothtmlwhite ) || [ "" ]; + + // A cross-domain request is in order when the origin doesn't match the current origin. + if ( s.crossDomain == null ) { + urlAnchor = document.createElement( "a" ); + + // Support: IE <=8 - 11, Edge 12 - 15 + // IE throws exception on accessing the href property if url is malformed, + // e.g. http://example.com:80x/ + try { + urlAnchor.href = s.url; + + // Support: IE <=8 - 11 only + // Anchor's host property isn't correctly set when s.url is relative + urlAnchor.href = urlAnchor.href; + s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !== + urlAnchor.protocol + "//" + urlAnchor.host; + } catch ( e ) { + + // If there is an error parsing the URL, assume it is crossDomain, + // it can be rejected by the transport if it is invalid + s.crossDomain = true; + } + } + + // Convert data if not already a string + if ( s.data && s.processData && typeof s.data !== "string" ) { + s.data = jQuery.param( s.data, s.traditional ); + } + + // Apply prefilters + inspectPrefiltersOrTransports( prefilters, s, options, jqXHR ); + + // If request was aborted inside a prefilter, stop there + if ( completed ) { + return jqXHR; + } + + // We can fire global events as of now if asked to + // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (trac-15118) + fireGlobals = jQuery.event && s.global; + + // Watch for a new set of requests + if ( fireGlobals && jQuery.active++ === 0 ) { + jQuery.event.trigger( "ajaxStart" ); + } + + // Uppercase the type + s.type = s.type.toUpperCase(); + + // Determine if request has content + s.hasContent = !rnoContent.test( s.type ); + + // Save the URL in case we're toying with the If-Modified-Since + // and/or If-None-Match header later on + // Remove hash to simplify url manipulation + cacheURL = s.url.replace( rhash, "" ); + + // More options handling for requests with no content + if ( !s.hasContent ) { + + // Remember the hash so we can put it back + uncached = s.url.slice( cacheURL.length ); + + // If data is available and should be processed, append data to url + if ( s.data && ( s.processData || typeof s.data === "string" ) ) { + cacheURL += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data; + + // trac-9682: remove data so that it's not used in an eventual retry + delete s.data; + } + + // Add or update anti-cache param if needed + if ( s.cache === false ) { + cacheURL = cacheURL.replace( rantiCache, "$1" ); + uncached = ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + ( nonce.guid++ ) + + uncached; + } + + // Put hash and anti-cache on the URL that will be requested (gh-1732) + s.url = cacheURL + uncached; + + // Change '%20' to '+' if this is encoded form body content (gh-2658) + } else if ( s.data && s.processData && + ( s.contentType || "" ).indexOf( "application/x-www-form-urlencoded" ) === 0 ) { + s.data = s.data.replace( r20, "+" ); + } + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + if ( jQuery.lastModified[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] ); + } + if ( jQuery.etag[ cacheURL ] ) { + jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] ); + } + } + + // Set the correct header, if data is being sent + if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) { + jqXHR.setRequestHeader( "Content-Type", s.contentType ); + } + + // Set the Accepts header for the server, depending on the dataType + jqXHR.setRequestHeader( + "Accept", + s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ? + s.accepts[ s.dataTypes[ 0 ] ] + + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) : + s.accepts[ "*" ] + ); + + // Check for headers option + for ( i in s.headers ) { + jqXHR.setRequestHeader( i, s.headers[ i ] ); + } + + // Allow custom headers/mimetypes and early abort + if ( s.beforeSend && + ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || completed ) ) { + + // Abort if not done already and return + return jqXHR.abort(); + } + + // Aborting is no longer a cancellation + strAbort = "abort"; + + // Install callbacks on deferreds + completeDeferred.add( s.complete ); + jqXHR.done( s.success ); + jqXHR.fail( s.error ); + + // Get transport + transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR ); + + // If no transport, we auto-abort + if ( !transport ) { + done( -1, "No Transport" ); + } else { + jqXHR.readyState = 1; + + // Send global event + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] ); + } + + // If request was aborted inside ajaxSend, stop there + if ( completed ) { + return jqXHR; + } + + // Timeout + if ( s.async && s.timeout > 0 ) { + timeoutTimer = window.setTimeout( function() { + jqXHR.abort( "timeout" ); + }, s.timeout ); + } + + try { + completed = false; + transport.send( requestHeaders, done ); + } catch ( e ) { + + // Rethrow post-completion exceptions + if ( completed ) { + throw e; + } + + // Propagate others as results + done( -1, e ); + } + } + + // Callback for when everything is done + function done( status, nativeStatusText, responses, headers ) { + var isSuccess, success, error, response, modified, + statusText = nativeStatusText; + + // Ignore repeat invocations + if ( completed ) { + return; + } + + completed = true; + + // Clear timeout if it exists + if ( timeoutTimer ) { + window.clearTimeout( timeoutTimer ); + } + + // Dereference transport for early garbage collection + // (no matter how long the jqXHR object will be used) + transport = undefined; + + // Cache response headers + responseHeadersString = headers || ""; + + // Set readyState + jqXHR.readyState = status > 0 ? 4 : 0; + + // Determine if successful + isSuccess = status >= 200 && status < 300 || status === 304; + + // Get response data + if ( responses ) { + response = ajaxHandleResponses( s, jqXHR, responses ); + } + + // Use a noop converter for missing script but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + s.converters[ "text script" ] = function() {}; + } + + // Convert no matter what (that way responseXXX fields are always set) + response = ajaxConvert( s, response, jqXHR, isSuccess ); + + // If successful, handle type chaining + if ( isSuccess ) { + + // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode. + if ( s.ifModified ) { + modified = jqXHR.getResponseHeader( "Last-Modified" ); + if ( modified ) { + jQuery.lastModified[ cacheURL ] = modified; + } + modified = jqXHR.getResponseHeader( "etag" ); + if ( modified ) { + jQuery.etag[ cacheURL ] = modified; + } + } + + // if no content + if ( status === 204 || s.type === "HEAD" ) { + statusText = "nocontent"; + + // if not modified + } else if ( status === 304 ) { + statusText = "notmodified"; + + // If we have data, let's convert it + } else { + statusText = response.state; + success = response.data; + error = response.error; + isSuccess = !error; + } + } else { + + // Extract error from statusText and normalize for non-aborts + error = statusText; + if ( status || !statusText ) { + statusText = "error"; + if ( status < 0 ) { + status = 0; + } + } + } + + // Set data for the fake xhr object + jqXHR.status = status; + jqXHR.statusText = ( nativeStatusText || statusText ) + ""; + + // Success/Error + if ( isSuccess ) { + deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] ); + } else { + deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] ); + } + + // Status-dependent callbacks + jqXHR.statusCode( statusCode ); + statusCode = undefined; + + if ( fireGlobals ) { + globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError", + [ jqXHR, s, isSuccess ? success : error ] ); + } + + // Complete + completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] ); + + if ( fireGlobals ) { + globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] ); + + // Handle the global AJAX counter + if ( !( --jQuery.active ) ) { + jQuery.event.trigger( "ajaxStop" ); + } + } + } + + return jqXHR; + }, + + getJSON: function( url, data, callback ) { + return jQuery.get( url, data, callback, "json" ); + }, + + getScript: function( url, callback ) { + return jQuery.get( url, undefined, callback, "script" ); + } +} ); + +jQuery.each( [ "get", "post" ], function( _i, method ) { + jQuery[ method ] = function( url, data, callback, type ) { + + // Shift arguments if data argument was omitted + if ( isFunction( data ) ) { + type = type || callback; + callback = data; + data = undefined; + } + + // The url can be an options object (which then must have .url) + return jQuery.ajax( jQuery.extend( { + url: url, + type: method, + dataType: type, + data: data, + success: callback + }, jQuery.isPlainObject( url ) && url ) ); + }; +} ); + +jQuery.ajaxPrefilter( function( s ) { + var i; + for ( i in s.headers ) { + if ( i.toLowerCase() === "content-type" ) { + s.contentType = s.headers[ i ] || ""; + } + } +} ); + + +jQuery._evalUrl = function( url, options, doc ) { + return jQuery.ajax( { + url: url, + + // Make this explicit, since user can override this through ajaxSetup (trac-11264) + type: "GET", + dataType: "script", + cache: true, + async: false, + global: false, + + // Only evaluate the response if it is successful (gh-4126) + // dataFilter is not invoked for failure responses, so using it instead + // of the default converter is kludgy but it works. + converters: { + "text script": function() {} + }, + dataFilter: function( response ) { + jQuery.globalEval( response, options, doc ); + } + } ); +}; + + +jQuery.fn.extend( { + wrapAll: function( html ) { + var wrap; + + if ( this[ 0 ] ) { + if ( isFunction( html ) ) { + html = html.call( this[ 0 ] ); + } + + // The elements to wrap the target around + wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true ); + + if ( this[ 0 ].parentNode ) { + wrap.insertBefore( this[ 0 ] ); + } + + wrap.map( function() { + var elem = this; + + while ( elem.firstElementChild ) { + elem = elem.firstElementChild; + } + + return elem; + } ).append( this ); + } + + return this; + }, + + wrapInner: function( html ) { + if ( isFunction( html ) ) { + return this.each( function( i ) { + jQuery( this ).wrapInner( html.call( this, i ) ); + } ); + } + + return this.each( function() { + var self = jQuery( this ), + contents = self.contents(); + + if ( contents.length ) { + contents.wrapAll( html ); + + } else { + self.append( html ); + } + } ); + }, + + wrap: function( html ) { + var htmlIsFunction = isFunction( html ); + + return this.each( function( i ) { + jQuery( this ).wrapAll( htmlIsFunction ? html.call( this, i ) : html ); + } ); + }, + + unwrap: function( selector ) { + this.parent( selector ).not( "body" ).each( function() { + jQuery( this ).replaceWith( this.childNodes ); + } ); + return this; + } +} ); + + +jQuery.expr.pseudos.hidden = function( elem ) { + return !jQuery.expr.pseudos.visible( elem ); +}; +jQuery.expr.pseudos.visible = function( elem ) { + return !!( elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length ); +}; + + + + +jQuery.ajaxSettings.xhr = function() { + try { + return new window.XMLHttpRequest(); + } catch ( e ) {} +}; + +var xhrSuccessStatus = { + + // File protocol always yields status code 0, assume 200 + 0: 200, + + // Support: IE <=9 only + // trac-1450: sometimes IE returns 1223 when it should be 204 + 1223: 204 + }, + xhrSupported = jQuery.ajaxSettings.xhr(); + +support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported ); +support.ajax = xhrSupported = !!xhrSupported; + +jQuery.ajaxTransport( function( options ) { + var callback, errorCallback; + + // Cross domain only allowed if supported through XMLHttpRequest + if ( support.cors || xhrSupported && !options.crossDomain ) { + return { + send: function( headers, complete ) { + var i, + xhr = options.xhr(); + + xhr.open( + options.type, + options.url, + options.async, + options.username, + options.password + ); + + // Apply custom fields if provided + if ( options.xhrFields ) { + for ( i in options.xhrFields ) { + xhr[ i ] = options.xhrFields[ i ]; + } + } + + // Override mime type if needed + if ( options.mimeType && xhr.overrideMimeType ) { + xhr.overrideMimeType( options.mimeType ); + } + + // X-Requested-With header + // For cross-domain requests, seeing as conditions for a preflight are + // akin to a jigsaw puzzle, we simply never set it to be sure. + // (it can always be set on a per-request basis or even using ajaxSetup) + // For same-domain requests, won't change header if already provided. + if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) { + headers[ "X-Requested-With" ] = "XMLHttpRequest"; + } + + // Set headers + for ( i in headers ) { + xhr.setRequestHeader( i, headers[ i ] ); + } + + // Callback + callback = function( type ) { + return function() { + if ( callback ) { + callback = errorCallback = xhr.onload = + xhr.onerror = xhr.onabort = xhr.ontimeout = + xhr.onreadystatechange = null; + + if ( type === "abort" ) { + xhr.abort(); + } else if ( type === "error" ) { + + // Support: IE <=9 only + // On a manual native abort, IE9 throws + // errors on any property access that is not readyState + if ( typeof xhr.status !== "number" ) { + complete( 0, "error" ); + } else { + complete( + + // File: protocol always yields status 0; see trac-8605, trac-14207 + xhr.status, + xhr.statusText + ); + } + } else { + complete( + xhrSuccessStatus[ xhr.status ] || xhr.status, + xhr.statusText, + + // Support: IE <=9 only + // IE9 has no XHR2 but throws on binary (trac-11426) + // For XHR2 non-text, let the caller handle it (gh-2498) + ( xhr.responseType || "text" ) !== "text" || + typeof xhr.responseText !== "string" ? + { binary: xhr.response } : + { text: xhr.responseText }, + xhr.getAllResponseHeaders() + ); + } + } + }; + }; + + // Listen to events + xhr.onload = callback(); + errorCallback = xhr.onerror = xhr.ontimeout = callback( "error" ); + + // Support: IE 9 only + // Use onreadystatechange to replace onabort + // to handle uncaught aborts + if ( xhr.onabort !== undefined ) { + xhr.onabort = errorCallback; + } else { + xhr.onreadystatechange = function() { + + // Check readyState before timeout as it changes + if ( xhr.readyState === 4 ) { + + // Allow onerror to be called first, + // but that will not handle a native abort + // Also, save errorCallback to a variable + // as xhr.onerror cannot be accessed + window.setTimeout( function() { + if ( callback ) { + errorCallback(); + } + } ); + } + }; + } + + // Create the abort callback + callback = callback( "abort" ); + + try { + + // Do send the request (this may raise an exception) + xhr.send( options.hasContent && options.data || null ); + } catch ( e ) { + + // trac-14683: Only rethrow if this hasn't been notified as an error yet + if ( callback ) { + throw e; + } + } + }, + + abort: function() { + if ( callback ) { + callback(); + } + } + }; + } +} ); + + + + +// Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432) +jQuery.ajaxPrefilter( function( s ) { + if ( s.crossDomain ) { + s.contents.script = false; + } +} ); + +// Install script dataType +jQuery.ajaxSetup( { + accepts: { + script: "text/javascript, application/javascript, " + + "application/ecmascript, application/x-ecmascript" + }, + contents: { + script: /\b(?:java|ecma)script\b/ + }, + converters: { + "text script": function( text ) { + jQuery.globalEval( text ); + return text; + } + } +} ); + +// Handle cache's special case and crossDomain +jQuery.ajaxPrefilter( "script", function( s ) { + if ( s.cache === undefined ) { + s.cache = false; + } + if ( s.crossDomain ) { + s.type = "GET"; + } +} ); + +// Bind script tag hack transport +jQuery.ajaxTransport( "script", function( s ) { + + // This transport only deals with cross domain or forced-by-attrs requests + if ( s.crossDomain || s.scriptAttrs ) { + var script, callback; + return { + send: function( _, complete ) { + script = jQuery( " + + + + diff --git a/src/lib/jquery-ui/jquery-ui.css b/src/lib/jquery-ui/jquery-ui.css new file mode 100644 index 0000000..1222fa2 --- /dev/null +++ b/src/lib/jquery-ui/jquery-ui.css @@ -0,0 +1,1315 @@ +/*! jQuery UI - v1.13.3 - 2024-06-12 +* https://jqueryui.com +* Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css +* To view and modify this theme, visit https://jqueryui.com/themeroller/?ffDefault=Arial%2CHelvetica%2Csans-serif&fsDefault=1em&fwDefault=normal&cornerRadius=3px&bgColorHeader=e9e9e9&bgTextureHeader=flat&borderColorHeader=dddddd&fcHeader=333333&iconColorHeader=444444&bgColorContent=ffffff&bgTextureContent=flat&borderColorContent=dddddd&fcContent=333333&iconColorContent=444444&bgColorDefault=f6f6f6&bgTextureDefault=flat&borderColorDefault=c5c5c5&fcDefault=454545&iconColorDefault=777777&bgColorHover=ededed&bgTextureHover=flat&borderColorHover=cccccc&fcHover=2b2b2b&iconColorHover=555555&bgColorActive=007fff&bgTextureActive=flat&borderColorActive=003eff&fcActive=ffffff&iconColorActive=ffffff&bgColorHighlight=fffa90&bgTextureHighlight=flat&borderColorHighlight=dad55e&fcHighlight=777620&iconColorHighlight=777620&bgColorError=fddfdf&bgTextureError=flat&borderColorError=f1a899&fcError=5f3f3f&iconColorError=cc0000&bgColorOverlay=aaaaaa&bgTextureOverlay=flat&bgImgOpacityOverlay=0&opacityOverlay=30&bgColorShadow=666666&bgTextureShadow=flat&bgImgOpacityShadow=0&opacityShadow=30&thicknessShadow=5px&offsetTopShadow=0px&offsetLeftShadow=0px&cornerRadiusShadow=8px +* Copyright OpenJS Foundation and other contributors; Licensed MIT */ + +.ui-draggable-handle { + -ms-touch-action: none; + touch-action: none; +} +/* Layout helpers +----------------------------------*/ +.ui-helper-hidden { + display: none; +} +.ui-helper-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} +.ui-helper-reset { + margin: 0; + padding: 0; + border: 0; + outline: 0; + line-height: 1.3; + text-decoration: none; + font-size: 100%; + list-style: none; +} +.ui-helper-clearfix:before, +.ui-helper-clearfix:after { + content: ""; + display: table; + border-collapse: collapse; +} +.ui-helper-clearfix:after { + clear: both; +} +.ui-helper-zfix { + width: 100%; + height: 100%; + top: 0; + left: 0; + position: absolute; + opacity: 0; + -ms-filter: "alpha(opacity=0)"; /* support: IE8 */ +} + +.ui-front { + z-index: 100; +} + + +/* Interaction Cues +----------------------------------*/ +.ui-state-disabled { + cursor: default !important; + pointer-events: none; +} + + +/* Icons +----------------------------------*/ +.ui-icon { + display: inline-block; + vertical-align: middle; + margin-top: -.25em; + position: relative; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; +} + +.ui-widget-icon-block { + left: 50%; + margin-left: -8px; + display: block; +} + +/* Misc visuals +----------------------------------*/ + +/* Overlays */ +.ui-widget-overlay { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; +} +.ui-resizable { + position: relative; +} +.ui-resizable-handle { + position: absolute; + font-size: 0.1px; + display: block; + -ms-touch-action: none; + touch-action: none; +} +.ui-resizable-disabled .ui-resizable-handle, +.ui-resizable-autohide .ui-resizable-handle { + display: none; +} +.ui-resizable-n { + cursor: n-resize; + height: 7px; + width: 100%; + top: -5px; + left: 0; +} +.ui-resizable-s { + cursor: s-resize; + height: 7px; + width: 100%; + bottom: -5px; + left: 0; +} +.ui-resizable-e { + cursor: e-resize; + width: 7px; + right: -5px; + top: 0; + height: 100%; +} +.ui-resizable-w { + cursor: w-resize; + width: 7px; + left: -5px; + top: 0; + height: 100%; +} +.ui-resizable-se { + cursor: se-resize; + width: 12px; + height: 12px; + right: 1px; + bottom: 1px; +} +.ui-resizable-sw { + cursor: sw-resize; + width: 9px; + height: 9px; + left: -5px; + bottom: -5px; +} +.ui-resizable-nw { + cursor: nw-resize; + width: 9px; + height: 9px; + left: -5px; + top: -5px; +} +.ui-resizable-ne { + cursor: ne-resize; + width: 9px; + height: 9px; + right: -5px; + top: -5px; +} +.ui-selectable { + -ms-touch-action: none; + touch-action: none; +} +.ui-selectable-helper { + position: absolute; + z-index: 100; + border: 1px dotted black; +} +.ui-sortable-handle { + -ms-touch-action: none; + touch-action: none; +} +.ui-accordion .ui-accordion-header { + display: block; + cursor: pointer; + position: relative; + margin: 2px 0 0 0; + padding: .5em .5em .5em .7em; + font-size: 100%; +} +.ui-accordion .ui-accordion-content { + padding: 1em 2.2em; + border-top: 0; + overflow: auto; +} +.ui-autocomplete { + position: absolute; + top: 0; + left: 0; + cursor: default; +} +.ui-menu { + list-style: none; + padding: 0; + margin: 0; + display: block; + outline: 0; +} +.ui-menu .ui-menu { + position: absolute; +} +.ui-menu .ui-menu-item { + margin: 0; + cursor: pointer; + /* support: IE10, see #8844 */ + list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); +} +.ui-menu .ui-menu-item-wrapper { + position: relative; + padding: 3px 1em 3px .4em; +} +.ui-menu .ui-menu-divider { + margin: 5px 0; + height: 0; + font-size: 0; + line-height: 0; + border-width: 1px 0 0 0; +} +.ui-menu .ui-state-focus, +.ui-menu .ui-state-active { + margin: -1px; +} + +/* icon support */ +.ui-menu-icons { + position: relative; +} +.ui-menu-icons .ui-menu-item-wrapper { + padding-left: 2em; +} + +/* left-aligned */ +.ui-menu .ui-icon { + position: absolute; + top: 0; + bottom: 0; + left: .2em; + margin: auto 0; +} + +/* right-aligned */ +.ui-menu .ui-menu-icon { + left: auto; + right: 0; +} +.ui-button { + padding: .4em 1em; + display: inline-block; + position: relative; + line-height: normal; + margin-right: .1em; + cursor: pointer; + vertical-align: middle; + text-align: center; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + /* Support: IE <= 11 */ + overflow: visible; +} + +.ui-button, +.ui-button:link, +.ui-button:visited, +.ui-button:hover, +.ui-button:active { + text-decoration: none; +} + +/* to make room for the icon, a width needs to be set here */ +.ui-button-icon-only { + width: 2em; + box-sizing: border-box; + text-indent: -9999px; + white-space: nowrap; +} + +/* no icon support for input elements */ +input.ui-button.ui-button-icon-only { + text-indent: 0; +} + +/* button icon element(s) */ +.ui-button-icon-only .ui-icon { + position: absolute; + top: 50%; + left: 50%; + margin-top: -8px; + margin-left: -8px; +} + +.ui-button.ui-icon-notext .ui-icon { + padding: 0; + width: 2.1em; + height: 2.1em; + text-indent: -9999px; + white-space: nowrap; + +} + +input.ui-button.ui-icon-notext .ui-icon { + width: auto; + height: auto; + text-indent: 0; + white-space: normal; + padding: .4em 1em; +} + +/* workarounds */ +/* Support: Firefox 5 - 40 */ +input.ui-button::-moz-focus-inner, +button.ui-button::-moz-focus-inner { + border: 0; + padding: 0; +} +.ui-controlgroup { + vertical-align: middle; + display: inline-block; +} +.ui-controlgroup > .ui-controlgroup-item { + float: left; + margin-left: 0; + margin-right: 0; +} +.ui-controlgroup > .ui-controlgroup-item:focus, +.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus { + z-index: 9999; +} +.ui-controlgroup-vertical > .ui-controlgroup-item { + display: block; + float: none; + width: 100%; + margin-top: 0; + margin-bottom: 0; + text-align: left; +} +.ui-controlgroup-vertical .ui-controlgroup-item { + box-sizing: border-box; +} +.ui-controlgroup .ui-controlgroup-label { + padding: .4em 1em; +} +.ui-controlgroup .ui-controlgroup-label span { + font-size: 80%; +} +.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item { + border-left: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item { + border-top: none; +} +.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content { + border-right: none; +} +.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content { + border-bottom: none; +} + +/* Spinner specific style fixes */ +.ui-controlgroup-vertical .ui-spinner-input { + + /* Support: IE8 only, Android < 4.4 only */ + width: 75%; + width: calc( 100% - 2.4em ); +} +.ui-controlgroup-vertical .ui-spinner .ui-spinner-up { + border-top-style: solid; +} + +.ui-checkboxradio-label .ui-icon-background { + box-shadow: inset 1px 1px 1px #ccc; + border-radius: .12em; + border: none; +} +.ui-checkboxradio-radio-label .ui-icon-background { + width: 16px; + height: 16px; + border-radius: 1em; + overflow: visible; + border: none; +} +.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon, +.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon { + background-image: none; + width: 8px; + height: 8px; + border-width: 4px; + border-style: solid; +} +.ui-checkboxradio-disabled { + pointer-events: none; +} +.ui-datepicker { + width: 17em; + padding: .2em .2em 0; + display: none; +} +.ui-datepicker .ui-datepicker-header { + position: relative; + padding: .2em 0; +} +.ui-datepicker .ui-datepicker-prev, +.ui-datepicker .ui-datepicker-next { + position: absolute; + top: 2px; + width: 1.8em; + height: 1.8em; +} +.ui-datepicker .ui-datepicker-prev-hover, +.ui-datepicker .ui-datepicker-next-hover { + top: 1px; +} +.ui-datepicker .ui-datepicker-prev { + left: 2px; +} +.ui-datepicker .ui-datepicker-next { + right: 2px; +} +.ui-datepicker .ui-datepicker-prev-hover { + left: 1px; +} +.ui-datepicker .ui-datepicker-next-hover { + right: 1px; +} +.ui-datepicker .ui-datepicker-prev span, +.ui-datepicker .ui-datepicker-next span { + display: block; + position: absolute; + left: 50%; + margin-left: -8px; + top: 50%; + margin-top: -8px; +} +.ui-datepicker .ui-datepicker-title { + margin: 0 2.3em; + line-height: 1.8em; + text-align: center; +} +.ui-datepicker .ui-datepicker-title select { + font-size: 1em; + margin: 1px 0; +} +.ui-datepicker select.ui-datepicker-month, +.ui-datepicker select.ui-datepicker-year { + width: 45%; +} +.ui-datepicker table { + width: 100%; + font-size: .9em; + border-collapse: collapse; + margin: 0 0 .4em; +} +.ui-datepicker th { + padding: .7em .3em; + text-align: center; + font-weight: bold; + border: 0; +} +.ui-datepicker td { + border: 0; + padding: 1px; +} +.ui-datepicker td span, +.ui-datepicker td a { + display: block; + padding: .2em; + text-align: right; + text-decoration: none; +} +.ui-datepicker .ui-datepicker-buttonpane { + background-image: none; + margin: .7em 0 0 0; + padding: 0 .2em; + border-left: 0; + border-right: 0; + border-bottom: 0; +} +.ui-datepicker .ui-datepicker-buttonpane button { + float: right; + margin: .5em .2em .4em; + cursor: pointer; + padding: .2em .6em .3em .6em; + width: auto; + overflow: visible; +} +.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { + float: left; +} + +/* with multiple calendars */ +.ui-datepicker.ui-datepicker-multi { + width: auto; +} +.ui-datepicker-multi .ui-datepicker-group { + float: left; +} +.ui-datepicker-multi .ui-datepicker-group table { + width: 95%; + margin: 0 auto .4em; +} +.ui-datepicker-multi-2 .ui-datepicker-group { + width: 50%; +} +.ui-datepicker-multi-3 .ui-datepicker-group { + width: 33.3%; +} +.ui-datepicker-multi-4 .ui-datepicker-group { + width: 25%; +} +.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { + border-left-width: 0; +} +.ui-datepicker-multi .ui-datepicker-buttonpane { + clear: left; +} +.ui-datepicker-row-break { + clear: both; + width: 100%; + font-size: 0; +} + +/* RTL support */ +.ui-datepicker-rtl { + direction: rtl; +} +.ui-datepicker-rtl .ui-datepicker-prev { + right: 2px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next { + left: 2px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-prev:hover { + right: 1px; + left: auto; +} +.ui-datepicker-rtl .ui-datepicker-next:hover { + left: 1px; + right: auto; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane { + clear: right; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button { + float: left; +} +.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, +.ui-datepicker-rtl .ui-datepicker-group { + float: right; +} +.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, +.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { + border-right-width: 0; + border-left-width: 1px; +} + +/* Icons */ +.ui-datepicker .ui-icon { + display: block; + text-indent: -99999px; + overflow: hidden; + background-repeat: no-repeat; + left: .5em; + top: .3em; +} +.ui-dialog { + position: absolute; + top: 0; + left: 0; + padding: .2em; + outline: 0; +} +.ui-dialog .ui-dialog-titlebar { + padding: .4em 1em; + position: relative; +} +.ui-dialog .ui-dialog-title { + float: left; + margin: .1em 0; + white-space: nowrap; + width: 90%; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-dialog .ui-dialog-titlebar-close { + position: absolute; + right: .3em; + top: 50%; + width: 20px; + margin: -10px 0 0 0; + padding: 1px; + height: 20px; +} +.ui-dialog .ui-dialog-content { + position: relative; + border: 0; + padding: .5em 1em; + background: none; + overflow: auto; +} +.ui-dialog .ui-dialog-buttonpane { + text-align: left; + border-width: 1px 0 0 0; + background-image: none; + margin-top: .5em; + padding: .3em 1em .5em .4em; +} +.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { + float: right; +} +.ui-dialog .ui-dialog-buttonpane button { + margin: .5em .4em .5em 0; + cursor: pointer; +} +.ui-dialog .ui-resizable-n { + height: 2px; + top: 0; +} +.ui-dialog .ui-resizable-e { + width: 2px; + right: 0; +} +.ui-dialog .ui-resizable-s { + height: 2px; + bottom: 0; +} +.ui-dialog .ui-resizable-w { + width: 2px; + left: 0; +} +.ui-dialog .ui-resizable-se, +.ui-dialog .ui-resizable-sw, +.ui-dialog .ui-resizable-ne, +.ui-dialog .ui-resizable-nw { + width: 7px; + height: 7px; +} +.ui-dialog .ui-resizable-se { + right: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-sw { + left: 0; + bottom: 0; +} +.ui-dialog .ui-resizable-ne { + right: 0; + top: 0; +} +.ui-dialog .ui-resizable-nw { + left: 0; + top: 0; +} +.ui-draggable .ui-dialog-titlebar { + cursor: move; +} +.ui-progressbar { + height: 2em; + text-align: left; + overflow: hidden; +} +.ui-progressbar .ui-progressbar-value { + margin: -1px; + height: 100%; +} +.ui-progressbar .ui-progressbar-overlay { + background: url("data:image/gif;base64,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"); + height: 100%; + -ms-filter: "alpha(opacity=25)"; /* support: IE8 */ + opacity: 0.25; +} +.ui-progressbar-indeterminate .ui-progressbar-value { + background-image: none; +} +.ui-selectmenu-menu { + padding: 0; + margin: 0; + position: absolute; + top: 0; + left: 0; + display: none; +} +.ui-selectmenu-menu .ui-menu { + overflow: auto; + overflow-x: hidden; + padding-bottom: 1px; +} +.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { + font-size: 1em; + font-weight: bold; + line-height: 1.5; + padding: 2px 0.4em; + margin: 0.5em 0 0 0; + height: auto; + border: 0; +} +.ui-selectmenu-open { + display: block; +} +.ui-selectmenu-text { + display: block; + margin-right: 20px; + overflow: hidden; + text-overflow: ellipsis; +} +.ui-selectmenu-button.ui-button { + text-align: left; + white-space: nowrap; + width: 14em; +} +.ui-selectmenu-icon.ui-icon { + float: right; + margin-top: 0; +} +.ui-slider { + position: relative; + text-align: left; +} +.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.2em; + height: 1.2em; + cursor: pointer; + -ms-touch-action: none; + touch-action: none; +} +.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +/* support: IE8 - See #6727 */ +.ui-slider.ui-state-disabled .ui-slider-handle, +.ui-slider.ui-state-disabled .ui-slider-range { + filter: inherit; +} + +.ui-slider-horizontal { + height: .8em; +} +.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} +.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; +} +.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} +.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +.ui-slider-vertical { + width: .8em; + height: 100px; +} +.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} +.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} +.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} +.ui-slider-vertical .ui-slider-range-max { + top: 0; +} +.ui-spinner { + position: relative; + display: inline-block; + overflow: hidden; + padding: 0; + vertical-align: middle; +} +.ui-spinner-input { + border: none; + background: none; + color: inherit; + padding: .222em 0; + margin: .2em 0; + vertical-align: middle; + margin-left: .4em; + margin-right: 2em; +} +.ui-spinner-button { + width: 1.6em; + height: 50%; + font-size: .5em; + padding: 0; + margin: 0; + text-align: center; + position: absolute; + cursor: default; + display: block; + overflow: hidden; + right: 0; +} +/* more specificity required here to override default borders */ +.ui-spinner a.ui-spinner-button { + border-top-style: none; + border-bottom-style: none; + border-right-style: none; +} +.ui-spinner-up { + top: 0; +} +.ui-spinner-down { + bottom: 0; +} +.ui-tabs { + position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ + padding: .2em; +} +.ui-tabs .ui-tabs-nav { + margin: 0; + padding: .2em .2em 0; +} +.ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 0; + margin: 1px .2em 0 0; + border-bottom-width: 0; + padding: 0; + white-space: nowrap; +} +.ui-tabs .ui-tabs-nav .ui-tabs-anchor { + float: left; + padding: .5em 1em; + text-decoration: none; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active { + margin-bottom: -1px; + padding-bottom: 1px; +} +.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, +.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { + cursor: text; +} +.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { + cursor: pointer; +} +.ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} +.ui-tooltip { + padding: 8px; + position: absolute; + z-index: 9999; + max-width: 300px; +} +body .ui-tooltip { + border-width: 2px; +} + +/* Component containers +----------------------------------*/ +.ui-widget { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget .ui-widget { + font-size: 1em; +} +.ui-widget input, +.ui-widget select, +.ui-widget textarea, +.ui-widget button { + font-family: Arial,Helvetica,sans-serif; + font-size: 1em; +} +.ui-widget.ui-widget-content { + border: 1px solid #c5c5c5; +} +.ui-widget-content { + border: 1px solid #dddddd; + background: #ffffff; + color: #333333; +} +.ui-widget-content a { + color: #333333; +} +.ui-widget-header { + border: 1px solid #dddddd; + background: #e9e9e9; + color: #333333; + font-weight: bold; +} +.ui-widget-header a { + color: #333333; +} + +/* Interaction states +----------------------------------*/ +.ui-state-default, +.ui-widget-content .ui-state-default, +.ui-widget-header .ui-state-default, +.ui-button, + +/* We use html here because we need a greater specificity to make sure disabled +works properly when clicked or hovered */ +html .ui-button.ui-state-disabled:hover, +html .ui-button.ui-state-disabled:active { + border: 1px solid #c5c5c5; + background: #f6f6f6; + font-weight: normal; + color: #454545; +} +.ui-state-default a, +.ui-state-default a:link, +.ui-state-default a:visited, +a.ui-button, +a:link.ui-button, +a:visited.ui-button, +.ui-button { + color: #454545; + text-decoration: none; +} +.ui-state-hover, +.ui-widget-content .ui-state-hover, +.ui-widget-header .ui-state-hover, +.ui-state-focus, +.ui-widget-content .ui-state-focus, +.ui-widget-header .ui-state-focus, +.ui-button:hover, +.ui-button:focus { + border: 1px solid #cccccc; + background: #ededed; + font-weight: normal; + color: #2b2b2b; +} +.ui-state-hover a, +.ui-state-hover a:hover, +.ui-state-hover a:link, +.ui-state-hover a:visited, +.ui-state-focus a, +.ui-state-focus a:hover, +.ui-state-focus a:link, +.ui-state-focus a:visited, +a.ui-button:hover, +a.ui-button:focus { + color: #2b2b2b; + text-decoration: none; +} + +.ui-visual-focus { + box-shadow: 0 0 3px 1px rgb(94, 158, 214); +} +.ui-state-active, +.ui-widget-content .ui-state-active, +.ui-widget-header .ui-state-active, +a.ui-button:active, +.ui-button:active, +.ui-button.ui-state-active:hover { + border: 1px solid #003eff; + background: #007fff; + font-weight: normal; + color: #ffffff; +} +.ui-icon-background, +.ui-state-active .ui-icon-background { + border: #003eff; + background-color: #ffffff; +} +.ui-state-active a, +.ui-state-active a:link, +.ui-state-active a:visited { + color: #ffffff; + text-decoration: none; +} + +/* Interaction Cues +----------------------------------*/ +.ui-state-highlight, +.ui-widget-content .ui-state-highlight, +.ui-widget-header .ui-state-highlight { + border: 1px solid #dad55e; + background: #fffa90; + color: #777620; +} +.ui-state-checked { + border: 1px solid #dad55e; + background: #fffa90; +} +.ui-state-highlight a, +.ui-widget-content .ui-state-highlight a, +.ui-widget-header .ui-state-highlight a { + color: #777620; +} +.ui-state-error, +.ui-widget-content .ui-state-error, +.ui-widget-header .ui-state-error { + border: 1px solid #f1a899; + background: #fddfdf; + color: #5f3f3f; +} +.ui-state-error a, +.ui-widget-content .ui-state-error a, +.ui-widget-header .ui-state-error a { + color: #5f3f3f; +} +.ui-state-error-text, +.ui-widget-content .ui-state-error-text, +.ui-widget-header .ui-state-error-text { + color: #5f3f3f; +} +.ui-priority-primary, +.ui-widget-content .ui-priority-primary, +.ui-widget-header .ui-priority-primary { + font-weight: bold; +} +.ui-priority-secondary, +.ui-widget-content .ui-priority-secondary, +.ui-widget-header .ui-priority-secondary { + opacity: .7; + -ms-filter: "alpha(opacity=70)"; /* support: IE8 */ + font-weight: normal; +} +.ui-state-disabled, +.ui-widget-content .ui-state-disabled, +.ui-widget-header .ui-state-disabled { + opacity: .35; + -ms-filter: "alpha(opacity=35)"; /* support: IE8 */ + background-image: none; +} +.ui-state-disabled .ui-icon { + -ms-filter: "alpha(opacity=35)"; /* support: IE8 - See #6059 */ +} + +/* Icons +----------------------------------*/ + +/* states and images */ +.ui-icon { + width: 16px; + height: 16px; +} +.ui-icon, +.ui-widget-content .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-widget-header .ui-icon { + background-image: url("images/ui-icons_444444_256x240.png"); +} +.ui-state-hover .ui-icon, +.ui-state-focus .ui-icon, +.ui-button:hover .ui-icon, +.ui-button:focus .ui-icon { + background-image: url("images/ui-icons_555555_256x240.png"); +} +.ui-state-active .ui-icon, +.ui-button:active .ui-icon { + background-image: url("images/ui-icons_ffffff_256x240.png"); +} +.ui-state-highlight .ui-icon, +.ui-button .ui-state-highlight.ui-icon { + background-image: url("images/ui-icons_777620_256x240.png"); +} +.ui-state-error .ui-icon, +.ui-state-error-text .ui-icon { + background-image: url("images/ui-icons_cc0000_256x240.png"); +} +.ui-button .ui-icon { + background-image: url("images/ui-icons_777777_256x240.png"); +} + +/* positioning */ +/* Three classes needed to override `.ui-button:hover .ui-icon` */ +.ui-icon-blank.ui-icon-blank.ui-icon-blank { + background-image: none; +} +.ui-icon-caret-1-n { background-position: 0 0; } +.ui-icon-caret-1-ne { background-position: -16px 0; } +.ui-icon-caret-1-e { background-position: -32px 0; } +.ui-icon-caret-1-se { background-position: -48px 0; } +.ui-icon-caret-1-s { background-position: -65px 0; } +.ui-icon-caret-1-sw { background-position: -80px 0; } +.ui-icon-caret-1-w { background-position: -96px 0; } +.ui-icon-caret-1-nw { background-position: -112px 0; } +.ui-icon-caret-2-n-s { background-position: -128px 0; } +.ui-icon-caret-2-e-w { background-position: -144px 0; } +.ui-icon-triangle-1-n { background-position: 0 -16px; } +.ui-icon-triangle-1-ne { background-position: -16px -16px; } +.ui-icon-triangle-1-e { background-position: -32px -16px; } +.ui-icon-triangle-1-se { background-position: -48px -16px; } +.ui-icon-triangle-1-s { background-position: -65px -16px; } +.ui-icon-triangle-1-sw { background-position: -80px -16px; } +.ui-icon-triangle-1-w { background-position: -96px -16px; } +.ui-icon-triangle-1-nw { background-position: -112px -16px; } +.ui-icon-triangle-2-n-s { background-position: -128px -16px; } +.ui-icon-triangle-2-e-w { background-position: -144px -16px; } +.ui-icon-arrow-1-n { background-position: 0 -32px; } +.ui-icon-arrow-1-ne { background-position: -16px -32px; } +.ui-icon-arrow-1-e { background-position: -32px -32px; } +.ui-icon-arrow-1-se { background-position: -48px -32px; } +.ui-icon-arrow-1-s { background-position: -65px -32px; } +.ui-icon-arrow-1-sw { background-position: -80px -32px; } +.ui-icon-arrow-1-w { background-position: -96px -32px; } +.ui-icon-arrow-1-nw { background-position: -112px -32px; } +.ui-icon-arrow-2-n-s { background-position: -128px -32px; } +.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } +.ui-icon-arrow-2-e-w { background-position: -160px -32px; } +.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } +.ui-icon-arrowstop-1-n { background-position: -192px -32px; } +.ui-icon-arrowstop-1-e { background-position: -208px -32px; } +.ui-icon-arrowstop-1-s { background-position: -224px -32px; } +.ui-icon-arrowstop-1-w { background-position: -240px -32px; } +.ui-icon-arrowthick-1-n { background-position: 1px -48px; } +.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } +.ui-icon-arrowthick-1-e { background-position: -32px -48px; } +.ui-icon-arrowthick-1-se { background-position: -48px -48px; } +.ui-icon-arrowthick-1-s { background-position: -64px -48px; } +.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } +.ui-icon-arrowthick-1-w { background-position: -96px -48px; } +.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } +.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } +.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } +.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } +.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } +.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } +.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } +.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } +.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } +.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } +.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } +.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } +.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } +.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } +.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } +.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } +.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } +.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } +.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } +.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } +.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } +.ui-icon-arrow-4 { background-position: 0 -80px; } +.ui-icon-arrow-4-diag { background-position: -16px -80px; } +.ui-icon-extlink { background-position: -32px -80px; } +.ui-icon-newwin { background-position: -48px -80px; } +.ui-icon-refresh { background-position: -64px -80px; } +.ui-icon-shuffle { background-position: -80px -80px; } +.ui-icon-transfer-e-w { background-position: -96px -80px; } +.ui-icon-transferthick-e-w { background-position: -112px -80px; } +.ui-icon-folder-collapsed { background-position: 0 -96px; } +.ui-icon-folder-open { background-position: -16px -96px; } +.ui-icon-document { background-position: -32px -96px; } +.ui-icon-document-b { background-position: -48px -96px; } +.ui-icon-note { background-position: -64px -96px; } +.ui-icon-mail-closed { background-position: -80px -96px; } +.ui-icon-mail-open { background-position: -96px -96px; } +.ui-icon-suitcase { background-position: -112px -96px; } +.ui-icon-comment { background-position: -128px -96px; } +.ui-icon-person { background-position: -144px -96px; } +.ui-icon-print { background-position: -160px -96px; } +.ui-icon-trash { background-position: -176px -96px; } +.ui-icon-locked { background-position: -192px -96px; } +.ui-icon-unlocked { background-position: -208px -96px; } +.ui-icon-bookmark { background-position: -224px -96px; } +.ui-icon-tag { background-position: -240px -96px; } +.ui-icon-home { background-position: 0 -112px; } +.ui-icon-flag { background-position: -16px -112px; } +.ui-icon-calendar { background-position: -32px -112px; } +.ui-icon-cart { background-position: -48px -112px; } +.ui-icon-pencil { background-position: -64px -112px; } +.ui-icon-clock { background-position: -80px -112px; } +.ui-icon-disk { background-position: -96px -112px; } +.ui-icon-calculator { background-position: -112px -112px; } +.ui-icon-zoomin { background-position: -128px -112px; } +.ui-icon-zoomout { background-position: -144px -112px; } +.ui-icon-search { background-position: -160px -112px; } +.ui-icon-wrench { background-position: -176px -112px; } +.ui-icon-gear { background-position: -192px -112px; } +.ui-icon-heart { background-position: -208px -112px; } +.ui-icon-star { background-position: -224px -112px; } +.ui-icon-link { background-position: -240px -112px; } +.ui-icon-cancel { background-position: 0 -128px; } +.ui-icon-plus { background-position: -16px -128px; } +.ui-icon-plusthick { background-position: -32px -128px; } +.ui-icon-minus { background-position: -48px -128px; } +.ui-icon-minusthick { background-position: -64px -128px; } +.ui-icon-close { background-position: -80px -128px; } +.ui-icon-closethick { background-position: -96px -128px; } +.ui-icon-key { background-position: -112px -128px; } +.ui-icon-lightbulb { background-position: -128px -128px; } +.ui-icon-scissors { background-position: -144px -128px; } +.ui-icon-clipboard { background-position: -160px -128px; } +.ui-icon-copy { background-position: -176px -128px; } +.ui-icon-contact { background-position: -192px -128px; } +.ui-icon-image { background-position: -208px -128px; } +.ui-icon-video { background-position: -224px -128px; } +.ui-icon-script { background-position: -240px -128px; } +.ui-icon-alert { background-position: 0 -144px; } +.ui-icon-info { background-position: -16px -144px; } +.ui-icon-notice { background-position: -32px -144px; } +.ui-icon-help { background-position: -48px -144px; } +.ui-icon-check { background-position: -64px -144px; } +.ui-icon-bullet { background-position: -80px -144px; } +.ui-icon-radio-on { background-position: -96px -144px; } +.ui-icon-radio-off { background-position: -112px -144px; } +.ui-icon-pin-w { background-position: -128px -144px; } +.ui-icon-pin-s { background-position: -144px -144px; } +.ui-icon-play { background-position: 0 -160px; } +.ui-icon-pause { background-position: -16px -160px; } +.ui-icon-seek-next { background-position: -32px -160px; } +.ui-icon-seek-prev { background-position: -48px -160px; } +.ui-icon-seek-end { background-position: -64px -160px; } +.ui-icon-seek-start { background-position: -80px -160px; } +/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ +.ui-icon-seek-first { background-position: -80px -160px; } +.ui-icon-stop { background-position: -96px -160px; } +.ui-icon-eject { background-position: -112px -160px; } +.ui-icon-volume-off { background-position: -128px -160px; } +.ui-icon-volume-on { background-position: -144px -160px; } +.ui-icon-power { background-position: 0 -176px; } +.ui-icon-signal-diag { background-position: -16px -176px; } +.ui-icon-signal { background-position: -32px -176px; } +.ui-icon-battery-0 { background-position: -48px -176px; } +.ui-icon-battery-1 { background-position: -64px -176px; } +.ui-icon-battery-2 { background-position: -80px -176px; } +.ui-icon-battery-3 { background-position: -96px -176px; } +.ui-icon-circle-plus { background-position: 0 -192px; } +.ui-icon-circle-minus { background-position: -16px -192px; } +.ui-icon-circle-close { background-position: -32px -192px; } +.ui-icon-circle-triangle-e { background-position: -48px -192px; } +.ui-icon-circle-triangle-s { background-position: -64px -192px; } +.ui-icon-circle-triangle-w { background-position: -80px -192px; } +.ui-icon-circle-triangle-n { background-position: -96px -192px; } +.ui-icon-circle-arrow-e { background-position: -112px -192px; } +.ui-icon-circle-arrow-s { background-position: -128px -192px; } +.ui-icon-circle-arrow-w { background-position: -144px -192px; } +.ui-icon-circle-arrow-n { background-position: -160px -192px; } +.ui-icon-circle-zoomin { background-position: -176px -192px; } +.ui-icon-circle-zoomout { background-position: -192px -192px; } +.ui-icon-circle-check { background-position: -208px -192px; } +.ui-icon-circlesmall-plus { background-position: 0 -208px; } +.ui-icon-circlesmall-minus { background-position: -16px -208px; } +.ui-icon-circlesmall-close { background-position: -32px -208px; } +.ui-icon-squaresmall-plus { background-position: -48px -208px; } +.ui-icon-squaresmall-minus { background-position: -64px -208px; } +.ui-icon-squaresmall-close { background-position: -80px -208px; } +.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } +.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } +.ui-icon-grip-solid-vertical { background-position: -32px -224px; } +.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } +.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } +.ui-icon-grip-diagonal-se { background-position: -80px -224px; } + + +/* Misc visuals +----------------------------------*/ + +/* Corner radius */ +.ui-corner-all, +.ui-corner-top, +.ui-corner-left, +.ui-corner-tl { + border-top-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-top, +.ui-corner-right, +.ui-corner-tr { + border-top-right-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-left, +.ui-corner-bl { + border-bottom-left-radius: 3px; +} +.ui-corner-all, +.ui-corner-bottom, +.ui-corner-right, +.ui-corner-br { + border-bottom-right-radius: 3px; +} + +/* Overlays */ +.ui-widget-overlay { + background: #aaaaaa; + opacity: .3; + -ms-filter: "alpha(opacity=30)"; /* support: IE8 */ +} +.ui-widget-shadow { + -webkit-box-shadow: 0px 0px 5px #666666; + box-shadow: 0px 0px 5px #666666; +} diff --git a/src/lib/jquery-ui/jquery-ui.js b/src/lib/jquery-ui/jquery-ui.js new file mode 100644 index 0000000..5f80d28 --- /dev/null +++ b/src/lib/jquery-ui/jquery-ui.js @@ -0,0 +1,19070 @@ +/*! jQuery UI - v1.13.3 - 2024-06-12 +* https://jqueryui.com +* Includes: widget.js, position.js, data.js, disable-selection.js, focusable.js, form-reset-mixin.js, jquery-patch.js, keycode.js, labels.js, scroll-parent.js, tabbable.js, unique-id.js, widgets/draggable.js, widgets/droppable.js, widgets/resizable.js, widgets/selectable.js, widgets/sortable.js, widgets/accordion.js, widgets/autocomplete.js, widgets/button.js, widgets/checkboxradio.js, widgets/controlgroup.js, widgets/datepicker.js, widgets/dialog.js, widgets/menu.js, widgets/mouse.js, widgets/progressbar.js, widgets/selectmenu.js, widgets/slider.js, widgets/spinner.js, widgets/tabs.js, widgets/tooltip.js, effect.js, effects/effect-blind.js, effects/effect-bounce.js, effects/effect-clip.js, effects/effect-drop.js, effects/effect-explode.js, effects/effect-fade.js, effects/effect-fold.js, effects/effect-highlight.js, effects/effect-puff.js, effects/effect-pulsate.js, effects/effect-scale.js, effects/effect-shake.js, effects/effect-size.js, effects/effect-slide.js, effects/effect-transfer.js +* Copyright OpenJS Foundation and other contributors; Licensed MIT */ + +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +} )( function( $ ) { +"use strict"; + +$.ui = $.ui || {}; + +var version = $.ui.version = "1.13.3"; + + +/*! + * jQuery UI Widget 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: Widget +//>>group: Core +//>>description: Provides a factory for creating stateful widgets with a common API. +//>>docs: https://api.jqueryui.com/jQuery.widget/ +//>>demos: https://jqueryui.com/widget/ + + +var widgetUuid = 0; +var widgetHasOwnProperty = Array.prototype.hasOwnProperty; +var widgetSlice = Array.prototype.slice; + +$.cleanData = ( function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; ( elem = elems[ i ] ) != null; i++ ) { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + } + orig( elems ); + }; +} )( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var existingConstructor, constructor, basePrototype; + + // ProxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + var proxiedPrototype = {}; + + var namespace = name.split( "." )[ 0 ]; + name = name.split( "." )[ 1 ]; + var fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + if ( Array.isArray( prototype ) ) { + prototype = $.extend.apply( null, [ {} ].concat( prototype ) ); + } + + // Create selector for plugin + $.expr.pseudos[ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + + // Allow instantiation without "new" keyword + if ( !this || !this._createWidget ) { + return new constructor( options, element ); + } + + // Allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + + // Extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + + // Copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + + // Track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + } ); + + basePrototype = new base(); + + // We need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( typeof value !== "function" ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = ( function() { + function _super() { + return base.prototype[ prop ].apply( this, arguments ); + } + + function _superApply( args ) { + return base.prototype[ prop ].apply( this, args ); + } + + return function() { + var __super = this._super; + var __superApply = this._superApply; + var returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + } )(); + } ); + constructor.prototype = $.widget.extend( basePrototype, { + + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? ( basePrototype.widgetEventPrefix || name ) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + } ); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // Redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, + child._proto ); + } ); + + // Remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widgetSlice.call( arguments, 1 ); + var inputIndex = 0; + var inputLength = input.length; + var key; + var value; + + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( widgetHasOwnProperty.call( input[ inputIndex ], key ) && value !== undefined ) { + + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string"; + var args = widgetSlice.call( arguments, 1 ); + var returnValue = this; + + if ( isMethodCall ) { + + // If this is an empty collection, we need to have the instance method + // return undefined instead of the jQuery instance + if ( !this.length && options === "instance" ) { + returnValue = undefined; + } else { + this.each( function() { + var methodValue; + var instance = $.data( this, fullName ); + + if ( options === "instance" ) { + returnValue = instance; + return false; + } + + if ( !instance ) { + return $.error( "cannot call methods on " + name + + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + + if ( typeof instance[ options ] !== "function" || + options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + + " widget instance" ); + } + + methodValue = instance[ options ].apply( instance, args ); + + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + } ); + } + } else { + + // Allow multiple hashes to be passed on init + if ( args.length ) { + options = $.widget.extend.apply( null, [ options ].concat( args ) ); + } + + this.each( function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + } ); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + + options: { + classes: {}, + disabled: false, + + // Callbacks + create: null + }, + + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widgetUuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + this.classesElementLookup = {}; + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + } ); + this.document = $( element.style ? + + // Element within the document + element.ownerDocument : + + // Element is window or document + element.document || element ); + this.window = $( this.document[ 0 ].defaultView || this.document[ 0 ].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + + if ( this.options.disabled ) { + this._setOptionDisabled( this.options.disabled ); + } + + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + + _getCreateOptions: function() { + return {}; + }, + + _getCreateEventData: $.noop, + + _create: $.noop, + + _init: $.noop, + + destroy: function() { + var that = this; + + this._destroy(); + $.each( this.classesElementLookup, function( key, value ) { + that._removeClass( value, key ); + } ); + + // We can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .off( this.eventNamespace ) + .removeData( this.widgetFullName ); + this.widget() + .off( this.eventNamespace ) + .removeAttr( "aria-disabled" ); + + // Clean up events and states + this.bindings.off( this.eventNamespace ); + }, + + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key; + var parts; + var curOption; + var i; + + if ( arguments.length === 0 ) { + + // Don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + + // Handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + + _setOption: function( key, value ) { + if ( key === "classes" ) { + this._setOptionClasses( value ); + } + + this.options[ key ] = value; + + if ( key === "disabled" ) { + this._setOptionDisabled( value ); + } + + return this; + }, + + _setOptionClasses: function( value ) { + var classKey, elements, currentElements; + + for ( classKey in value ) { + currentElements = this.classesElementLookup[ classKey ]; + if ( value[ classKey ] === this.options.classes[ classKey ] || + !currentElements || + !currentElements.length ) { + continue; + } + + // We are doing this to create a new jQuery object because the _removeClass() call + // on the next line is going to destroy the reference to the current elements being + // tracked. We need to save a copy of this collection so that we can add the new classes + // below. + elements = $( currentElements.get() ); + this._removeClass( currentElements, classKey ); + + // We don't use _addClass() here, because that uses this.options.classes + // for generating the string of classes. We want to use the value passed in from + // _setOption(), this is the new value of the classes option which was passed to + // _setOption(). We pass this value directly to _classes(). + elements.addClass( this._classes( { + element: elements, + keys: classKey, + classes: value, + add: true + } ) ); + } + }, + + _setOptionDisabled: function( value ) { + this._toggleClass( this.widget(), this.widgetFullName + "-disabled", null, !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this._removeClass( this.hoverable, null, "ui-state-hover" ); + this._removeClass( this.focusable, null, "ui-state-focus" ); + } + }, + + enable: function() { + return this._setOptions( { disabled: false } ); + }, + + disable: function() { + return this._setOptions( { disabled: true } ); + }, + + _classes: function( options ) { + var full = []; + var that = this; + + options = $.extend( { + element: this.element, + classes: this.options.classes || {} + }, options ); + + function bindRemoveEvent() { + var nodesToBind = []; + + options.element.each( function( _, element ) { + var isTracked = $.map( that.classesElementLookup, function( elements ) { + return elements; + } ) + .some( function( elements ) { + return elements.is( element ); + } ); + + if ( !isTracked ) { + nodesToBind.push( element ); + } + } ); + + that._on( $( nodesToBind ), { + remove: "_untrackClassesElement" + } ); + } + + function processClassString( classes, checkOption ) { + var current, i; + for ( i = 0; i < classes.length; i++ ) { + current = that.classesElementLookup[ classes[ i ] ] || $(); + if ( options.add ) { + bindRemoveEvent(); + current = $( $.uniqueSort( current.get().concat( options.element.get() ) ) ); + } else { + current = $( current.not( options.element ).get() ); + } + that.classesElementLookup[ classes[ i ] ] = current; + full.push( classes[ i ] ); + if ( checkOption && options.classes[ classes[ i ] ] ) { + full.push( options.classes[ classes[ i ] ] ); + } + } + } + + if ( options.keys ) { + processClassString( options.keys.match( /\S+/g ) || [], true ); + } + if ( options.extra ) { + processClassString( options.extra.match( /\S+/g ) || [] ); + } + + return full.join( " " ); + }, + + _untrackClassesElement: function( event ) { + var that = this; + $.each( that.classesElementLookup, function( key, value ) { + if ( $.inArray( event.target, value ) !== -1 ) { + that.classesElementLookup[ key ] = $( value.not( event.target ).get() ); + } + } ); + + this._off( $( event.target ) ); + }, + + _removeClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, false ); + }, + + _addClass: function( element, keys, extra ) { + return this._toggleClass( element, keys, extra, true ); + }, + + _toggleClass: function( element, keys, extra, add ) { + add = ( typeof add === "boolean" ) ? add : extra; + var shift = ( typeof element === "string" || element === null ), + options = { + extra: shift ? keys : extra, + keys: shift ? element : keys, + element: shift ? this.element : element, + add: add + }; + options.element.toggleClass( this._classes( options ), add ); + return this; + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement; + var instance = this; + + // No suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // No element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + + // Allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // Copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ); + var eventName = match[ 1 ] + instance.eventNamespace; + var selector = match[ 2 ]; + + if ( selector ) { + delegateElement.on( eventName, selector, handlerProxy ); + } else { + element.on( eventName, handlerProxy ); + } + } ); + }, + + _off: function( element, eventName ) { + eventName = ( eventName || "" ).split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.off( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-hover" ); + }, + mouseleave: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-hover" ); + } + } ); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + this._addClass( $( event.currentTarget ), null, "ui-state-focus" ); + }, + focusout: function( event ) { + this._removeClass( $( event.currentTarget ), null, "ui-state-focus" ); + } + } ); + }, + + _trigger: function( type, event, data ) { + var prop, orig; + var callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + + // The original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // Copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( typeof callback === "function" && + callback.apply( this.element[ 0 ], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + + var hasOptions; + var effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } else if ( options === true ) { + options = {}; + } + + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + + if ( options.delay ) { + element.delay( options.delay ); + } + + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue( function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + } ); + } + }; +} ); + +var widget = $.widget; + + +/*! + * jQuery UI Position 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + * + * https://api.jqueryui.com/position/ + */ + +//>>label: Position +//>>group: Core +//>>description: Positions elements relative to other elements. +//>>docs: https://api.jqueryui.com/position/ +//>>demos: https://jqueryui.com/position/ + + +( function() { +var cachedScrollbarWidth, + max = Math.max, + abs = Math.abs, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function isWindow( obj ) { + return obj != null && obj === obj.window; +} + +function getDimensions( elem ) { + var raw = elem[ 0 ]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
" + + "
" ), + innerDiv = div.children()[ 0 ]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[ 0 ].clientWidth; + } + + div.remove(); + + return ( cachedScrollbarWidth = w1 - w2 ); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[ 0 ].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[ 0 ].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isElemWindow = isWindow( withinElement[ 0 ] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9, + hasOffset = !isElemWindow && !isDocument; + return { + element: withinElement, + isWindow: isElemWindow, + isDocument: isDocument, + offset: hasOffset ? $( element ).offset() : { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + width: withinElement.outerWidth(), + height: withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // Make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + + // Make sure string options are treated as CSS selectors + target = typeof options.of === "string" ? + $( document ).find( options.of ) : + $( options.of ), + + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[ 0 ].preventDefault ) { + + // Force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + + // Clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // Force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1 ) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // Calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // Reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + } ); + + // Normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each( function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + } ); + } + } ); + + if ( options.using ) { + + // Adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + } ); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // Element is wider than within + if ( data.collisionWidth > outerWidth ) { + + // Element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - + withinOffset; + position.left += overLeft - newOverRight; + + // Element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + + // Element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + + // Too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + + // Too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + + // Adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // Element is taller than within + if ( data.collisionHeight > outerHeight ) { + + // Element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - + withinOffset; + position.top += overTop - newOverBottom; + + // Element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + + // Element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + + // Too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + + // Too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + + // Adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - + outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - + outerHeight - withinOffset; + if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + + offset - offsetTop; + if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +} )(); + +var position = $.ui.position; + + +/*! + * jQuery UI :data 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: :data Selector +//>>group: Core +//>>description: Selects elements which have data stored under the specified key. +//>>docs: https://api.jqueryui.com/data-selector/ + + +var data = $.extend( $.expr.pseudos, { + data: $.expr.createPseudo ? + $.expr.createPseudo( function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + } ) : + + // Support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + } +} ); + +/*! + * jQuery UI Disable Selection 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: disableSelection +//>>group: Core +//>>description: Disable selection of text content within the set of matched elements. +//>>docs: https://api.jqueryui.com/disableSelection/ + +// This file is deprecated + +var disableSelection = $.fn.extend( { + disableSelection: ( function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.on( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + } ); + }; + } )(), + + enableSelection: function() { + return this.off( ".ui-disableSelection" ); + } +} ); + + +/*! + * jQuery UI Focusable 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: :focusable Selector +//>>group: Core +//>>description: Selects elements which can be focused. +//>>docs: https://api.jqueryui.com/focusable-selector/ + + +// Selectors +$.ui.focusable = function( element, hasTabindex ) { + var map, mapName, img, focusableIfVisible, fieldset, + nodeName = element.nodeName.toLowerCase(); + + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" ); + return img.length > 0 && img.is( ":visible" ); + } + + if ( /^(input|select|textarea|button|object)$/.test( nodeName ) ) { + focusableIfVisible = !element.disabled; + + if ( focusableIfVisible ) { + + // Form controls within a disabled fieldset are disabled. + // However, controls within the fieldset's legend do not get disabled. + // Since controls generally aren't placed inside legends, we skip + // this portion of the check. + fieldset = $( element ).closest( "fieldset" )[ 0 ]; + if ( fieldset ) { + focusableIfVisible = !fieldset.disabled; + } + } + } else if ( "a" === nodeName ) { + focusableIfVisible = element.href || hasTabindex; + } else { + focusableIfVisible = hasTabindex; + } + + return focusableIfVisible && $( element ).is( ":visible" ) && visible( $( element ) ); +}; + +// Support: IE 8 only +// IE 8 doesn't resolve inherit to visible/hidden for computed values +function visible( element ) { + var visibility = element.css( "visibility" ); + while ( visibility === "inherit" ) { + element = element.parent(); + visibility = element.css( "visibility" ); + } + return visibility === "visible"; +} + +$.extend( $.expr.pseudos, { + focusable: function( element ) { + return $.ui.focusable( element, $.attr( element, "tabindex" ) != null ); + } +} ); + +var focusable = $.ui.focusable; + + + +// Support: IE8 Only +// IE8 does not support the form attribute and when it is supplied. It overwrites the form prop +// with a string, so we need to find the proper form. +var form = $.fn._form = function() { + return typeof this[ 0 ].form === "string" ? this.closest( "form" ) : $( this[ 0 ].form ); +}; + + +/*! + * jQuery UI Form Reset Mixin 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: Form Reset Mixin +//>>group: Core +//>>description: Refresh input widgets when their form is reset +//>>docs: https://api.jqueryui.com/form-reset-mixin/ + + +var formResetMixin = $.ui.formResetMixin = { + _formResetHandler: function() { + var form = $( this ); + + // Wait for the form reset to actually happen before refreshing + setTimeout( function() { + var instances = form.data( "ui-form-reset-instances" ); + $.each( instances, function() { + this.refresh(); + } ); + } ); + }, + + _bindFormResetHandler: function() { + this.form = this.element._form(); + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ) || []; + if ( !instances.length ) { + + // We don't use _on() here because we use a single event handler per form + this.form.on( "reset.ui-form-reset", this._formResetHandler ); + } + instances.push( this ); + this.form.data( "ui-form-reset-instances", instances ); + }, + + _unbindFormResetHandler: function() { + if ( !this.form.length ) { + return; + } + + var instances = this.form.data( "ui-form-reset-instances" ); + instances.splice( $.inArray( this, instances ), 1 ); + if ( instances.length ) { + this.form.data( "ui-form-reset-instances", instances ); + } else { + this.form + .removeData( "ui-form-reset-instances" ) + .off( "reset.ui-form-reset" ); + } + } +}; + + +/*! + * jQuery UI Support for jQuery core 1.8.x and newer 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + * + */ + +//>>label: jQuery 1.8+ Support +//>>group: Core +//>>description: Support version 1.8.x and newer of jQuery core + + +// Support: jQuery 1.9.x or older +// $.expr[ ":" ] is deprecated. +if ( !$.expr.pseudos ) { + $.expr.pseudos = $.expr[ ":" ]; +} + +// Support: jQuery 1.11.x or older +// $.unique has been renamed to $.uniqueSort +if ( !$.uniqueSort ) { + $.uniqueSort = $.unique; +} + +// Support: jQuery 2.2.x or older. +// This method has been defined in jQuery 3.0.0. +// Code from https://github.com/jquery/jquery/blob/e539bac79e666bba95bba86d690b4e609dca2286/src/selector/escapeSelector.js +if ( !$.escapeSelector ) { + + // CSS string/identifier serialization + // https://drafts.csswg.org/cssom/#common-serializing-idioms + var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + + var fcssescape = function( ch, asCodePoint ) { + if ( asCodePoint ) { + + // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER + if ( ch === "\0" ) { + return "\uFFFD"; + } + + // Control characters and (dependent upon position) numbers get escaped as code points + return ch.slice( 0, -1 ) + "\\" + ch.charCodeAt( ch.length - 1 ).toString( 16 ) + " "; + } + + // Other potentially-special ASCII characters get backslash-escaped + return "\\" + ch; + }; + + $.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); + }; +} + +// Support: jQuery 3.4.x or older +// These methods have been defined in jQuery 3.5.0. +if ( !$.fn.even || !$.fn.odd ) { + $.fn.extend( { + even: function() { + return this.filter( function( i ) { + return i % 2 === 0; + } ); + }, + odd: function() { + return this.filter( function( i ) { + return i % 2 === 1; + } ); + } + } ); +} + +; +/*! + * jQuery UI Keycode 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: Keycode +//>>group: Core +//>>description: Provide keycodes as keynames +//>>docs: https://api.jqueryui.com/jQuery.ui.keyCode/ + + +var keycode = $.ui.keyCode = { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 +}; + + +/*! + * jQuery UI Labels 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: labels +//>>group: Core +//>>description: Find all the labels associated with a given input +//>>docs: https://api.jqueryui.com/labels/ + + +var labels = $.fn.labels = function() { + var ancestor, selector, id, labels, ancestors; + + if ( !this.length ) { + return this.pushStack( [] ); + } + + // Check control.labels first + if ( this[ 0 ].labels && this[ 0 ].labels.length ) { + return this.pushStack( this[ 0 ].labels ); + } + + // Support: IE <= 11, FF <= 37, Android <= 2.3 only + // Above browsers do not support control.labels. Everything below is to support them + // as well as document fragments. control.labels does not work on document fragments + labels = this.eq( 0 ).parents( "label" ); + + // Look for the label based on the id + id = this.attr( "id" ); + if ( id ) { + + // We don't search against the document in case the element + // is disconnected from the DOM + ancestor = this.eq( 0 ).parents().last(); + + // Get a full set of top level ancestors + ancestors = ancestor.add( ancestor.length ? ancestor.siblings() : this.siblings() ); + + // Create a selector for the label based on the id + selector = "label[for='" + $.escapeSelector( id ) + "']"; + + labels = labels.add( ancestors.find( selector ).addBack( selector ) ); + + } + + // Return whatever we have found for labels + return this.pushStack( labels ); +}; + + +/*! + * jQuery UI Scroll Parent 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: scrollParent +//>>group: Core +//>>description: Get the closest ancestor element that is scrollable. +//>>docs: https://api.jqueryui.com/scrollParent/ + + +var scrollParent = $.fn.scrollParent = function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + + parent.css( "overflow-x" ) ); + } ).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? + $( this[ 0 ].ownerDocument || document ) : + scrollParent; +}; + + +/*! + * jQuery UI Tabbable 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: :tabbable Selector +//>>group: Core +//>>description: Selects elements which can be tabbed to. +//>>docs: https://api.jqueryui.com/tabbable-selector/ + + +var tabbable = $.extend( $.expr.pseudos, { + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + hasTabindex = tabIndex != null; + return ( !hasTabindex || tabIndex >= 0 ) && $.ui.focusable( element, hasTabindex ); + } +} ); + + +/*! + * jQuery UI Unique ID 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: uniqueId +//>>group: Core +//>>description: Functions to generate and remove uniqueId's +//>>docs: https://api.jqueryui.com/uniqueId/ + + +var uniqueId = $.fn.extend( { + uniqueId: ( function() { + var uuid = 0; + + return function() { + return this.each( function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + } ); + }; + } )(), + + removeUniqueId: function() { + return this.each( function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + } ); + } +} ); + + + +// This file is deprecated +var ie = $.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +/*! + * jQuery UI Mouse 1.13.3 + * https://jqueryui.com + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license. + * https://jquery.org/license + */ + +//>>label: Mouse +//>>group: Widgets +//>>description: Abstracts mouse-based interactions to assist in creating certain widgets. +//>>docs: https://api.jqueryui.com/mouse/ + + +var mouseHandled = false; +$( document ).on( "mouseup", function() { + mouseHandled = false; +} ); + +var widgetsMouse = $.widget( "ui.mouse", { + version: "1.13.3", + options: { + cancel: "input, textarea, button, select, option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .on( "mousedown." + this.widgetName, function( event ) { + return that._mouseDown( event ); + } ) + .on( "click." + this.widgetName, function( event ) { + if ( true === $.data( event.target, that.widgetName + ".preventClickEvent" ) ) { + $.removeData( event.target, that.widgetName + ".preventClickEvent" ); + event.stopImmediatePropagation(); + return false; + } + } ); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.off( "." + this.widgetName ); + if ( this._mouseMoveDelegate ) { + this.document + .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); + } + }, + + _mouseDown: function( event ) { + + // don't let more than one widget handle mouseStart + if ( mouseHandled ) { + return; + } + + this._mouseMoved = false; + + // We may have missed mouseup (out of window) + if ( this._mouseStarted ) { + this._mouseUp( event ); + } + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = ( event.which === 1 ), + + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = ( typeof this.options.cancel === "string" && event.target.nodeName ? + $( event.target ).closest( this.options.cancel ).length : false ); + if ( !btnIsLeft || elIsCancel || !this._mouseCapture( event ) ) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if ( !this.mouseDelayMet ) { + this._mouseDelayTimer = setTimeout( function() { + that.mouseDelayMet = true; + }, this.options.delay ); + } + + if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { + this._mouseStarted = ( this._mouseStart( event ) !== false ); + if ( !this._mouseStarted ) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if ( true === $.data( event.target, this.widgetName + ".preventClickEvent" ) ) { + $.removeData( event.target, this.widgetName + ".preventClickEvent" ); + } + + // These delegates are required to keep context + this._mouseMoveDelegate = function( event ) { + return that._mouseMove( event ); + }; + this._mouseUpDelegate = function( event ) { + return that._mouseUp( event ); + }; + + this.document + .on( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .on( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function( event ) { + + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if ( this._mouseMoved ) { + + // IE mouseup check - mouseup happened when mouse was out of window + if ( $.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && + !event.button ) { + return this._mouseUp( event ); + + // Iframe mouseup check - mouseup occurred in another document + } else if ( !event.which ) { + + // Support: Safari <=8 - 9 + // Safari sets which to 0 if you press any of the following keys + // during a drag (#14461) + if ( event.originalEvent.altKey || event.originalEvent.ctrlKey || + event.originalEvent.metaKey || event.originalEvent.shiftKey ) { + this.ignoreMissingWhich = true; + } else if ( !this.ignoreMissingWhich ) { + return this._mouseUp( event ); + } + } + } + + if ( event.which || event.button ) { + this._mouseMoved = true; + } + + if ( this._mouseStarted ) { + this._mouseDrag( event ); + return event.preventDefault(); + } + + if ( this._mouseDistanceMet( event ) && this._mouseDelayMet( event ) ) { + this._mouseStarted = + ( this._mouseStart( this._mouseDownEvent, event ) !== false ); + if ( this._mouseStarted ) { + this._mouseDrag( event ); + } else { + this._mouseUp( event ); + } + } + + return !this._mouseStarted; + }, + + _mouseUp: function( event ) { + this.document + .off( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .off( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + if ( this._mouseStarted ) { + this._mouseStarted = false; + + if ( event.target === this._mouseDownEvent.target ) { + $.data( event.target, this.widgetName + ".preventClickEvent", true ); + } + + this._mouseStop( event ); + } + + if ( this._mouseDelayTimer ) { + clearTimeout( this._mouseDelayTimer ); + delete this._mouseDelayTimer; + } + + this.ignoreMissingWhich = false; + mouseHandled = false; + event.preventDefault(); + }, + + _mouseDistanceMet: function( event ) { + return ( Math.max( + Math.abs( this._mouseDownEvent.pageX - event.pageX ), + Math.abs( this._mouseDownEvent.pageY - event.pageY ) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function( /* event */ ) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function( /* event */ ) {}, + _mouseDrag: function( /* event */ ) {}, + _mouseStop: function( /* event */ ) {}, + _mouseCapture: function( /* event */ ) { + return true; + } +} ); + + + +// $.ui.plugin is deprecated. Use $.widget() extensions instead. +var plugin = $.ui.plugin = { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args, allowDisconnected ) { + var i, + set = instance.plugins[ name ]; + + if ( !set ) { + return; + } + + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || + instance.element[ 0 ].parentNode.nodeType === 11 ) ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } +}; + + + +var safeActiveElement = $.ui.safeActiveElement = function( document ) { + var activeElement; + + // Support: IE 9 only + // IE9 throws an "Unspecified error" accessing document.activeElement from an