From cea45503eb8650dac90e5ad2bac08a27e33de9ab Mon Sep 17 00:00:00 2001 From: kelvinsuen Date: Fri, 13 Jun 2025 17:10:26 +0800 Subject: [PATCH] init commit --- .env | 2 + .env-cmdrc | 42 + .eslintrc | 91 + .gitignore | 111 + .prettierrc | 8 + CODE_OF_CONDUCT.md | 128 + LICENSE | 21 + README.md | 13 + jsconfig.json | 12 + package-lock.json | 23581 ++++++++++++++++ package.json | 130 + public/favicon.svg | 16 + public/index.html | 72 + src/App.js | 88 + src/App.test.js | 9 + src/assets/images/auth/AuthBackground.js | 69 + src/assets/images/display/celebration.png | Bin 0 -> 199092 bytes src/assets/images/display/doc.png | Bin 0 -> 858 bytes src/assets/images/icons/facebook.svg | 3 + src/assets/images/icons/google.svg | 6 + src/assets/images/icons/twitter.svg | 3 + src/assets/images/users/avatar-1.png | Bin 0 -> 9490 bytes src/assets/images/users/avatar-2.png | Bin 0 -> 9589 bytes src/assets/images/users/avatar-3.png | Bin 0 -> 7112 bytes src/assets/images/users/avatar-4.png | Bin 0 -> 9192 bytes src/assets/images/users/avatar-group.png | Bin 0 -> 8828 bytes src/assets/images/users/empty-avatar.png | Bin 0 -> 36073 bytes src/assets/style/imageOverlay.css | 39 + src/assets/style/rankStyle.css | 125 + src/assets/third-party/apex-chart.css | 4 + src/assets/third-party/scrmhub.css | 75 + src/auth/index.js | 190 + src/auth/jwt/coreUseJwt.js | 11 + src/auth/jwt/jwtDefaultConfig.js | 15 + src/auth/jwt/jwtService.js | 111 + src/auth/jwt/useJwt.js | 7 + src/auth/jwtApplicationConfig.js | 17 + src/auth/jwtConfig.js | 17 + src/auth/utils.js | 33 + src/components/@extended/AnimateButton.js | 29 + src/components/@extended/Breadcrumbs.js | 106 + src/components/@extended/Dot.js | 48 + src/components/@extended/Transitions.js | 62 + src/components/AbilityProvider.js | 17 + src/components/AutoLogoutProvider.js | 149 + src/components/I18nProvider.js | 49 + src/components/Loadable.js | 15 + src/components/Loader.js | 25 + src/components/Logo/Logo.js | 49 + src/components/Logo/index.js | 36 + src/components/MainCard.js | 105 + src/components/RefreshTokenProvider.js | 70 + src/components/ScrollTop.js | 27 + src/components/UploadProvider.js | 46 + src/components/cards/AuthFooter.js | 61 + .../cards/statistics/AnalyticEcommerce.js | 70 + src/components/third-party/Highlighter.js | 65 + src/components/third-party/SimpleBar.js | 62 + src/config.js | 19 + src/index.js | 52 + .../Drawer/DrawerContent/NavCard.js | 32 + .../DrawerContent/Navigation/NavGroup.js | 97 + .../DrawerContent/Navigation/NavItem.js | 148 + .../Drawer/DrawerContent/Navigation/index.js | 54 + .../MainLayout/Drawer/DrawerContent/index.js | 21 + .../Drawer/DrawerHeader/DrawerHeaderStyled.js | 15 + .../MainLayout/Drawer/DrawerHeader/index.js | 38 + .../MainLayout/Drawer/MiniDrawerStyled.js | 47 + src/layout/MainLayout/Drawer/index.js | 66 + src/layout/MainLayout/Header/AppBarStyled.js | 26 + .../Header/HeaderContent/LocaleSelector.js | 142 + .../Header/HeaderContent/MobileSection.js | 102 + .../Header/HeaderContent/Notification.js | 279 + .../Profile/ChangePasswordWindow.js | 304 + .../HeaderContent/Profile/ProfileTab.js | 146 + .../HeaderContent/Profile/SettingTab.js | 56 + .../Header/HeaderContent/Profile/index.js | 169 + .../MainLayout/Header/HeaderContent/Search.js | 139 + .../MainLayout/Header/HeaderContent/index.js | 30 + src/layout/MainLayout/Header/index.js | 69 + src/layout/MainLayout/index.js | 60 + src/layout/MinimalLayout/index.js | 11 + src/menu-items/appreciation.js | 39 + src/menu-items/award.js | 51 + src/menu-items/client.js | 33 + src/menu-items/dashboard.js | 61 + src/menu-items/index.js | 19 + src/menu-items/misc.js | 29 + src/menu-items/pages.js | 36 + src/menu-items/setting.js | 164 + src/menu-items/support.js | 36 + src/menu-items/utilities.js | 60 + src/pages/authentication/AuthCard.js | 34 + src/pages/authentication/AuthWrapper.js | 51 + src/pages/authentication/Login.js | 30 + src/pages/authentication/Register.js | 30 + .../authentication/auth-forms/AuthLogin.js | 282 + .../authentication/auth-forms/AuthRegister.js | 263 + .../auth-forms/FirebaseSocial.js | 66 + .../ClientMaintainPage/ApplicationTable.js | 122 + .../client/ClientMaintainPage/ClientForm.js | 1109 + src/pages/client/ClientMaintainPage/index.js | 247 + .../ClientSearchPage/ClientSearchForm.js | 491 + .../client/ClientSearchPage/ClientTable.js | 207 + src/pages/client/ClientSearchPage/index.js | 136 + src/pages/components-overview/AntIcons.js | 24 + src/pages/components-overview/Color.js | 141 + .../components-overview/ComponentSkeleton.js | 59 + src/pages/components-overview/Shadow.js | 152 + src/pages/components-overview/Typography.js | 252 + src/pages/dashboard/IncomeAreaChart.js | 121 + src/pages/dashboard/MonthlyBarChart.js | 85 + src/pages/dashboard/OrdersTable.js | 224 + src/pages/dashboard/ReportAreaChart.js | 105 + src/pages/dashboard/SalesColumnChart.js | 148 + src/pages/dashboard/index.js | 344 + src/pages/extra-pages/ErrorPage.js | 46 + src/pages/extra-pages/LoadingComponent.js | 17 + src/pages/extra-pages/LogoutPage.js | 27 + src/pages/extra-pages/SamplePage.js | 20 + src/pages/extra-pages/TabTestPage.js | 0 .../AdvanceSearchForm.js | 141 + src/pages/lionerAdvanceSearchPage/index.js | 218 + .../ApplicationSearchForm.js | 644 + .../ApplicationTable.js | 117 + .../lionerApplicationSearchPage/index.js | 199 + .../AppreciationSearchForm.js | 769 + .../AppreciationTable.js | 183 + .../ImportResultWindow.js | 200 + .../ValidateResultTable.js | 135 + .../lionerAppreciationSearchPage/index.js | 141 + .../AuditLogDetailWindow.js | 191 + .../AuditLogSearchForm.js | 254 + .../lionerAuditTrailPage/AuditLogTable.js | 152 + src/pages/lionerAuditTrailPage/index.js | 102 + .../lionerAwardSearchPage/AwardSearchForm.js | 1135 + src/pages/lionerAwardSearchPage/AwardTable.js | 139 + src/pages/lionerAwardSearchPage/index.js | 246 + .../AppreciationCategoryIndex.js | 97 + .../AppreciationCategorySearchForm.js | 77 + .../AppreciationCategoryTable.js | 344 + .../lionerCategoryPage/CategorySearchForm.js | 89 + src/pages/lionerCategoryPage/CategoryTable.js | 361 + .../lionerCategoryPage/LIONERCategoryIndex.js | 97 + src/pages/lionerCategoryPage/index.js | 86 + .../ClientDepartmentSearchForm.js | 84 + .../ClientDepartmentTable.js | 342 + src/pages/lionerClientDepartmentPage/index.js | 95 + .../lionerDivisionEdit/DivisionInfoCard.js | 159 + .../lionerDivisionEdit/SubDivisionTable.js | 243 + src/pages/lionerDivisionEdit/index.js | 318 + .../DivisionSearchForm.js | 137 + .../lionerDivisionSearch/DivisionTable.js | 197 + .../LIONERDivisionIndex.js | 96 + .../lionerDivisionSearch/SBUDivisionIndex.js | 97 + .../SBUDivisionSearchForm.js | 77 + .../lionerDivisionSearch/SBUDivisionTable.js | 344 + src/pages/lionerDivisionSearch/index.js | 86 + src/pages/lionerEmailConfig/index.js | 318 + .../lionerEventSearchPage/EventSearchForm.js | 610 + src/pages/lionerEventSearchPage/EventTable.js | 130 + src/pages/lionerEventSearchPage/index.js | 231 + .../AppreciationGenerateForm.js | 207 + .../SummaryGenerateForm.js | 148 + src/pages/lionerGenerateReportPage/index.js | 94 + .../lionerLoginLog/LoginLogSearchForm.js | 181 + src/pages/lionerLoginLog/LoginLogTable.js | 82 + src/pages/lionerLoginLog/index.js | 94 + .../ApplicationForm.js | 662 + .../AwardTable.js | 143 + .../ExternalRefGrid.js | 301 + .../FilePreviewGrid.js | 227 + .../FileRefCard.js | 84 + .../FileUploadCard.js | 12 + .../lionerMaintainApplicationPage/TabConst.js | 10 + .../lionerMaintainApplicationPage/index.js | 649 + .../AppreciationForm.js | 887 + .../ExternalRefGrid.js | 304 + .../FilePreviewGrid.js | 230 + .../FileRefCard.js | 74 + .../FileUploadCard.js | 12 + .../lionerMaintainAppreciationPage/index.js | 401 + .../lionerMaintainAwardPage/AwardForm.js | 803 + .../ExternalRefGrid.js | 304 + .../FilePreviewGrid.js | 230 + .../lionerMaintainAwardPage/FileRefCard.js | 82 + .../lionerMaintainAwardPage/FileUploadCard.js | 12 + src/pages/lionerMaintainAwardPage/TabConst.js | 10 + src/pages/lionerMaintainAwardPage/index.js | 610 + .../ApplicationTable.js | 122 + .../lionerMaintainEventPage/EventForm.js | 1420 + src/pages/lionerMaintainEventPage/index.js | 247 + .../ApplicationTemplateForm.js | 437 + .../AwardTemplateForm.js | 737 + .../EventTemplateForm.js | 423 + .../lionerMaintainSearchTemplatePage/index.js | 348 + src/pages/lionerManualButtonPage/index.js | 195 + src/pages/lionerPasswordPolicyPage/index.js | 452 + .../ChannelSearchForm.js | 84 + .../ChannelTable.js | 338 + src/pages/lionerPromotionChannelPage/index.js | 95 + src/pages/lionerReminderPage/InnerInnerTab.js | 66 + src/pages/lionerReminderPage/InnerTab.js | 110 + src/pages/lionerReminderPage/ReminderTable.js | 215 + src/pages/lionerReminderPage/TabConst.js | 0 .../lionerReminderPage/ThreeLayerTabPage.js | 76 + src/pages/lionerReminderPage/index.js | 88 + .../lionerSearchPanel/DummyComboRecord.js | 66 + .../lionerSearchPanel/TemplateSearchForm.js | 136 + src/pages/lionerSearchPanel/TemplateTable.js | 152 + src/pages/lionerSearchPanel/index.js | 105 + .../TemplateSettingSection.js | 315 + src/pages/lionerSettingPage/index.js | 501 + src/pages/lionerTagPage/TagSearchForm.js | 79 + src/pages/lionerTagPage/TagTable.js | 345 + src/pages/lionerTagPage/index.js | 95 + .../lionerUserDetailPage/UserAuthTable.js | 87 + .../lionerUserDetailPage/UserAuthorityCard.js | 59 + .../lionerUserDetailPage/UserGroupCard.js | 58 + .../lionerUserDetailPage/UserGroupTable.js | 83 + .../UserInformationCard.js | 652 + src/pages/lionerUserDetailPage/index.js | 293 + .../GroupAuthCard.js | 65 + .../GroupAuthTable.js | 86 + .../lionerUserGroupDetailPage/UserAddCard.js | 144 + .../lionerUserGroupDetailPage/UserAddTable.js | 117 + .../UserGroupInfoCard.js | 170 + src/pages/lionerUserGroupDetailPage/index.js | 267 + .../UserGroupSearchForm.js | 110 + .../UserGroupTable.js | 89 + src/pages/lionerUserGroupSearchPage/index.js | 96 + .../lionerUserSearchPage/UserSearchForm.js | 276 + src/pages/lionerUserSearchPage/UserTable.js | 167 + src/pages/lionerUserSearchPage/index.js | 95 + .../lionerdashboard/CardBarchartContent.js | 97 + .../CardHorizontalBarchartContent.js | 93 + .../lionerdashboard/CardSummaryContent.js | 131 + src/pages/lionerdashboard/DummyRecord.js | 233 + src/pages/lionerdashboard/RankingCard.js | 86 + .../lionerdashboard/RankingColumnChart.js | 223 + .../RankingHorizontalBarChart.js | 255 + src/pages/lionerdashboard/RankingPieChart.js | 102 + src/pages/lionerdashboard/RankingTable.js | 233 + src/pages/lionerdashboard/TestTable.js | 54 + src/pages/lionerdashboard/ThreeInOneCard.js | 260 + src/pages/lionerdashboard/index copy.js | 313 + src/pages/lionerdashboard/index.js | 220 + src/react-app-env.d.js | 1 + src/reportWebVitals.js | 13 + src/routes/AppreciationRoute.js | 68 + src/routes/AwardRoutes.js | 116 + src/routes/ClientRoutes.js | 47 + src/routes/LoginRoutes.js | 33 + src/routes/MainRoutes.js | 89 + src/routes/SettingRoutes.js | 205 + src/routes/index.js | 49 + src/setupTests.js | 5 + src/store/index.js | 15 + src/store/reducers/actions.js | 4 + src/store/reducers/index.js | 11 + src/store/reducers/menu.js | 39 + src/themes/colorConst.js | 290 + src/themes/index.js | 64 + src/themes/overrides/Badge.js | 15 + src/themes/overrides/Button.js | 28 + src/themes/overrides/CardContent.js | 16 + src/themes/overrides/Checkbox.js | 13 + src/themes/overrides/Chip.js | 40 + src/themes/overrides/IconButton.js | 28 + src/themes/overrides/InputLabel.js | 25 + src/themes/overrides/LinearProgress.js | 17 + src/themes/overrides/Link.js | 11 + src/themes/overrides/ListItemIcon.js | 13 + src/themes/overrides/OutlinedInput.js | 44 + src/themes/overrides/Tab.js | 14 + src/themes/overrides/TableCell.js | 20 + src/themes/overrides/Tabs.js | 13 + src/themes/overrides/Typography.js | 13 + src/themes/overrides/index.js | 41 + src/themes/page-misc.scss | 37 + src/themes/palette.js | 60 + src/themes/shadows.js | 13 + src/themes/theme/index.js | 92 + src/themes/themeConst.js | 408 + src/themes/typography.js | 94 + src/translations/en.json | 9 + src/translations/zh-CN.json | 9 + src/translations/zh-HK.json | 9 + src/utils/ApiPathConst.js | 138 + src/utils/ComboConst.js | 117 + src/utils/CommonFunction.js | 1005 + src/utils/CustomAxios.js | 10 + src/utils/SettingConst.js | 27 + src/utils/SyntaxHighlight.js | 19 + src/utils/UserAbilityUtils.js | 22 + src/utils/Utils.js | 98 + src/utils/context/Can.js | 11 + src/utils/password-strength.js | 29 + src/utils/videoThumbnails.js | 422 + yarn.lock | 11720 ++++++++ 300 files changed, 78367 insertions(+) create mode 100644 .env create mode 100644 .env-cmdrc create mode 100644 .eslintrc create mode 100644 .gitignore create mode 100644 .prettierrc create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 jsconfig.json create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/favicon.svg create mode 100644 public/index.html create mode 100644 src/App.js create mode 100644 src/App.test.js create mode 100644 src/assets/images/auth/AuthBackground.js create mode 100644 src/assets/images/display/celebration.png create mode 100644 src/assets/images/display/doc.png create mode 100644 src/assets/images/icons/facebook.svg create mode 100644 src/assets/images/icons/google.svg create mode 100644 src/assets/images/icons/twitter.svg create mode 100644 src/assets/images/users/avatar-1.png create mode 100644 src/assets/images/users/avatar-2.png create mode 100644 src/assets/images/users/avatar-3.png create mode 100644 src/assets/images/users/avatar-4.png create mode 100644 src/assets/images/users/avatar-group.png create mode 100644 src/assets/images/users/empty-avatar.png create mode 100644 src/assets/style/imageOverlay.css create mode 100644 src/assets/style/rankStyle.css create mode 100644 src/assets/third-party/apex-chart.css create mode 100644 src/assets/third-party/scrmhub.css create mode 100644 src/auth/index.js create mode 100644 src/auth/jwt/coreUseJwt.js create mode 100644 src/auth/jwt/jwtDefaultConfig.js create mode 100644 src/auth/jwt/jwtService.js create mode 100644 src/auth/jwt/useJwt.js create mode 100644 src/auth/jwtApplicationConfig.js create mode 100644 src/auth/jwtConfig.js create mode 100644 src/auth/utils.js create mode 100644 src/components/@extended/AnimateButton.js create mode 100644 src/components/@extended/Breadcrumbs.js create mode 100644 src/components/@extended/Dot.js create mode 100644 src/components/@extended/Transitions.js create mode 100644 src/components/AbilityProvider.js create mode 100644 src/components/AutoLogoutProvider.js create mode 100644 src/components/I18nProvider.js create mode 100644 src/components/Loadable.js create mode 100644 src/components/Loader.js create mode 100644 src/components/Logo/Logo.js create mode 100644 src/components/Logo/index.js create mode 100644 src/components/MainCard.js create mode 100644 src/components/RefreshTokenProvider.js create mode 100644 src/components/ScrollTop.js create mode 100644 src/components/UploadProvider.js create mode 100644 src/components/cards/AuthFooter.js create mode 100644 src/components/cards/statistics/AnalyticEcommerce.js create mode 100644 src/components/third-party/Highlighter.js create mode 100644 src/components/third-party/SimpleBar.js create mode 100644 src/config.js create mode 100644 src/index.js create mode 100644 src/layout/MainLayout/Drawer/DrawerContent/NavCard.js create mode 100644 src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavGroup.js create mode 100644 src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.js create mode 100644 src/layout/MainLayout/Drawer/DrawerContent/Navigation/index.js create mode 100644 src/layout/MainLayout/Drawer/DrawerContent/index.js create mode 100644 src/layout/MainLayout/Drawer/DrawerHeader/DrawerHeaderStyled.js create mode 100644 src/layout/MainLayout/Drawer/DrawerHeader/index.js create mode 100644 src/layout/MainLayout/Drawer/MiniDrawerStyled.js create mode 100644 src/layout/MainLayout/Drawer/index.js create mode 100644 src/layout/MainLayout/Header/AppBarStyled.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/MobileSection.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/Notification.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/Profile/ChangePasswordWindow.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/Profile/ProfileTab.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/Profile/SettingTab.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/Profile/index.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/Search.js create mode 100644 src/layout/MainLayout/Header/HeaderContent/index.js create mode 100644 src/layout/MainLayout/Header/index.js create mode 100644 src/layout/MainLayout/index.js create mode 100644 src/layout/MinimalLayout/index.js create mode 100644 src/menu-items/appreciation.js create mode 100644 src/menu-items/award.js create mode 100644 src/menu-items/client.js create mode 100644 src/menu-items/dashboard.js create mode 100644 src/menu-items/index.js create mode 100644 src/menu-items/misc.js create mode 100644 src/menu-items/pages.js create mode 100644 src/menu-items/setting.js create mode 100644 src/menu-items/support.js create mode 100644 src/menu-items/utilities.js create mode 100644 src/pages/authentication/AuthCard.js create mode 100644 src/pages/authentication/AuthWrapper.js create mode 100644 src/pages/authentication/Login.js create mode 100644 src/pages/authentication/Register.js create mode 100644 src/pages/authentication/auth-forms/AuthLogin.js create mode 100644 src/pages/authentication/auth-forms/AuthRegister.js create mode 100644 src/pages/authentication/auth-forms/FirebaseSocial.js create mode 100644 src/pages/client/ClientMaintainPage/ApplicationTable.js create mode 100644 src/pages/client/ClientMaintainPage/ClientForm.js create mode 100644 src/pages/client/ClientMaintainPage/index.js create mode 100644 src/pages/client/ClientSearchPage/ClientSearchForm.js create mode 100644 src/pages/client/ClientSearchPage/ClientTable.js create mode 100644 src/pages/client/ClientSearchPage/index.js create mode 100644 src/pages/components-overview/AntIcons.js create mode 100644 src/pages/components-overview/Color.js create mode 100644 src/pages/components-overview/ComponentSkeleton.js create mode 100644 src/pages/components-overview/Shadow.js create mode 100644 src/pages/components-overview/Typography.js create mode 100644 src/pages/dashboard/IncomeAreaChart.js create mode 100644 src/pages/dashboard/MonthlyBarChart.js create mode 100644 src/pages/dashboard/OrdersTable.js create mode 100644 src/pages/dashboard/ReportAreaChart.js create mode 100644 src/pages/dashboard/SalesColumnChart.js create mode 100644 src/pages/dashboard/index.js create mode 100644 src/pages/extra-pages/ErrorPage.js create mode 100644 src/pages/extra-pages/LoadingComponent.js create mode 100644 src/pages/extra-pages/LogoutPage.js create mode 100644 src/pages/extra-pages/SamplePage.js create mode 100644 src/pages/extra-pages/TabTestPage.js create mode 100644 src/pages/lionerAdvanceSearchPage/AdvanceSearchForm.js create mode 100644 src/pages/lionerAdvanceSearchPage/index.js create mode 100644 src/pages/lionerApplicationSearchPage/ApplicationSearchForm.js create mode 100644 src/pages/lionerApplicationSearchPage/ApplicationTable.js create mode 100644 src/pages/lionerApplicationSearchPage/index.js create mode 100644 src/pages/lionerAppreciationSearchPage/AppreciationSearchForm.js create mode 100644 src/pages/lionerAppreciationSearchPage/AppreciationTable.js create mode 100644 src/pages/lionerAppreciationSearchPage/ImportResultWindow.js create mode 100644 src/pages/lionerAppreciationSearchPage/ValidateResultTable.js create mode 100644 src/pages/lionerAppreciationSearchPage/index.js create mode 100644 src/pages/lionerAuditTrailPage/AuditLogDetailWindow.js create mode 100644 src/pages/lionerAuditTrailPage/AuditLogSearchForm.js create mode 100644 src/pages/lionerAuditTrailPage/AuditLogTable.js create mode 100644 src/pages/lionerAuditTrailPage/index.js create mode 100644 src/pages/lionerAwardSearchPage/AwardSearchForm.js create mode 100644 src/pages/lionerAwardSearchPage/AwardTable.js create mode 100644 src/pages/lionerAwardSearchPage/index.js create mode 100644 src/pages/lionerCategoryPage/AppreciationCategoryIndex.js create mode 100644 src/pages/lionerCategoryPage/AppreciationCategorySearchForm.js create mode 100644 src/pages/lionerCategoryPage/AppreciationCategoryTable.js create mode 100644 src/pages/lionerCategoryPage/CategorySearchForm.js create mode 100644 src/pages/lionerCategoryPage/CategoryTable.js create mode 100644 src/pages/lionerCategoryPage/LIONERCategoryIndex.js create mode 100644 src/pages/lionerCategoryPage/index.js create mode 100644 src/pages/lionerClientDepartmentPage/ClientDepartmentSearchForm.js create mode 100644 src/pages/lionerClientDepartmentPage/ClientDepartmentTable.js create mode 100644 src/pages/lionerClientDepartmentPage/index.js create mode 100644 src/pages/lionerDivisionEdit/DivisionInfoCard.js create mode 100644 src/pages/lionerDivisionEdit/SubDivisionTable.js create mode 100644 src/pages/lionerDivisionEdit/index.js create mode 100644 src/pages/lionerDivisionSearch/DivisionSearchForm.js create mode 100644 src/pages/lionerDivisionSearch/DivisionTable.js create mode 100644 src/pages/lionerDivisionSearch/LIONERDivisionIndex.js create mode 100644 src/pages/lionerDivisionSearch/SBUDivisionIndex.js create mode 100644 src/pages/lionerDivisionSearch/SBUDivisionSearchForm.js create mode 100644 src/pages/lionerDivisionSearch/SBUDivisionTable.js create mode 100644 src/pages/lionerDivisionSearch/index.js create mode 100644 src/pages/lionerEmailConfig/index.js create mode 100644 src/pages/lionerEventSearchPage/EventSearchForm.js create mode 100644 src/pages/lionerEventSearchPage/EventTable.js create mode 100644 src/pages/lionerEventSearchPage/index.js create mode 100644 src/pages/lionerGenerateReportPage/AppreciationGenerateForm.js create mode 100644 src/pages/lionerGenerateReportPage/SummaryGenerateForm.js create mode 100644 src/pages/lionerGenerateReportPage/index.js create mode 100644 src/pages/lionerLoginLog/LoginLogSearchForm.js create mode 100644 src/pages/lionerLoginLog/LoginLogTable.js create mode 100644 src/pages/lionerLoginLog/index.js create mode 100644 src/pages/lionerMaintainApplicationPage/ApplicationForm.js create mode 100644 src/pages/lionerMaintainApplicationPage/AwardTable.js create mode 100644 src/pages/lionerMaintainApplicationPage/ExternalRefGrid.js create mode 100644 src/pages/lionerMaintainApplicationPage/FilePreviewGrid.js create mode 100644 src/pages/lionerMaintainApplicationPage/FileRefCard.js create mode 100644 src/pages/lionerMaintainApplicationPage/FileUploadCard.js create mode 100644 src/pages/lionerMaintainApplicationPage/TabConst.js create mode 100644 src/pages/lionerMaintainApplicationPage/index.js create mode 100644 src/pages/lionerMaintainAppreciationPage/AppreciationForm.js create mode 100644 src/pages/lionerMaintainAppreciationPage/ExternalRefGrid.js create mode 100644 src/pages/lionerMaintainAppreciationPage/FilePreviewGrid.js create mode 100644 src/pages/lionerMaintainAppreciationPage/FileRefCard.js create mode 100644 src/pages/lionerMaintainAppreciationPage/FileUploadCard.js create mode 100644 src/pages/lionerMaintainAppreciationPage/index.js create mode 100644 src/pages/lionerMaintainAwardPage/AwardForm.js create mode 100644 src/pages/lionerMaintainAwardPage/ExternalRefGrid.js create mode 100644 src/pages/lionerMaintainAwardPage/FilePreviewGrid.js create mode 100644 src/pages/lionerMaintainAwardPage/FileRefCard.js create mode 100644 src/pages/lionerMaintainAwardPage/FileUploadCard.js create mode 100644 src/pages/lionerMaintainAwardPage/TabConst.js create mode 100644 src/pages/lionerMaintainAwardPage/index.js create mode 100644 src/pages/lionerMaintainEventPage/ApplicationTable.js create mode 100644 src/pages/lionerMaintainEventPage/EventForm.js create mode 100644 src/pages/lionerMaintainEventPage/index.js create mode 100644 src/pages/lionerMaintainSearchTemplatePage/ApplicationTemplateForm.js create mode 100644 src/pages/lionerMaintainSearchTemplatePage/AwardTemplateForm.js create mode 100644 src/pages/lionerMaintainSearchTemplatePage/EventTemplateForm.js create mode 100644 src/pages/lionerMaintainSearchTemplatePage/index.js create mode 100644 src/pages/lionerManualButtonPage/index.js create mode 100644 src/pages/lionerPasswordPolicyPage/index.js create mode 100644 src/pages/lionerPromotionChannelPage/ChannelSearchForm.js create mode 100644 src/pages/lionerPromotionChannelPage/ChannelTable.js create mode 100644 src/pages/lionerPromotionChannelPage/index.js create mode 100644 src/pages/lionerReminderPage/InnerInnerTab.js create mode 100644 src/pages/lionerReminderPage/InnerTab.js create mode 100644 src/pages/lionerReminderPage/ReminderTable.js create mode 100644 src/pages/lionerReminderPage/TabConst.js create mode 100644 src/pages/lionerReminderPage/ThreeLayerTabPage.js create mode 100644 src/pages/lionerReminderPage/index.js create mode 100644 src/pages/lionerSearchPanel/DummyComboRecord.js create mode 100644 src/pages/lionerSearchPanel/TemplateSearchForm.js create mode 100644 src/pages/lionerSearchPanel/TemplateTable.js create mode 100644 src/pages/lionerSearchPanel/index.js create mode 100644 src/pages/lionerSettingPage/TemplateSettingSection.js create mode 100644 src/pages/lionerSettingPage/index.js create mode 100644 src/pages/lionerTagPage/TagSearchForm.js create mode 100644 src/pages/lionerTagPage/TagTable.js create mode 100644 src/pages/lionerTagPage/index.js create mode 100644 src/pages/lionerUserDetailPage/UserAuthTable.js create mode 100644 src/pages/lionerUserDetailPage/UserAuthorityCard.js create mode 100644 src/pages/lionerUserDetailPage/UserGroupCard.js create mode 100644 src/pages/lionerUserDetailPage/UserGroupTable.js create mode 100644 src/pages/lionerUserDetailPage/UserInformationCard.js create mode 100644 src/pages/lionerUserDetailPage/index.js create mode 100644 src/pages/lionerUserGroupDetailPage/GroupAuthCard.js create mode 100644 src/pages/lionerUserGroupDetailPage/GroupAuthTable.js create mode 100644 src/pages/lionerUserGroupDetailPage/UserAddCard.js create mode 100644 src/pages/lionerUserGroupDetailPage/UserAddTable.js create mode 100644 src/pages/lionerUserGroupDetailPage/UserGroupInfoCard.js create mode 100644 src/pages/lionerUserGroupDetailPage/index.js create mode 100644 src/pages/lionerUserGroupSearchPage/UserGroupSearchForm.js create mode 100644 src/pages/lionerUserGroupSearchPage/UserGroupTable.js create mode 100644 src/pages/lionerUserGroupSearchPage/index.js create mode 100644 src/pages/lionerUserSearchPage/UserSearchForm.js create mode 100644 src/pages/lionerUserSearchPage/UserTable.js create mode 100644 src/pages/lionerUserSearchPage/index.js create mode 100644 src/pages/lionerdashboard/CardBarchartContent.js create mode 100644 src/pages/lionerdashboard/CardHorizontalBarchartContent.js create mode 100644 src/pages/lionerdashboard/CardSummaryContent.js create mode 100644 src/pages/lionerdashboard/DummyRecord.js create mode 100644 src/pages/lionerdashboard/RankingCard.js create mode 100644 src/pages/lionerdashboard/RankingColumnChart.js create mode 100644 src/pages/lionerdashboard/RankingHorizontalBarChart.js create mode 100644 src/pages/lionerdashboard/RankingPieChart.js create mode 100644 src/pages/lionerdashboard/RankingTable.js create mode 100644 src/pages/lionerdashboard/TestTable.js create mode 100644 src/pages/lionerdashboard/ThreeInOneCard.js create mode 100644 src/pages/lionerdashboard/index copy.js create mode 100644 src/pages/lionerdashboard/index.js create mode 100644 src/react-app-env.d.js create mode 100644 src/reportWebVitals.js create mode 100644 src/routes/AppreciationRoute.js create mode 100644 src/routes/AwardRoutes.js create mode 100644 src/routes/ClientRoutes.js create mode 100644 src/routes/LoginRoutes.js create mode 100644 src/routes/MainRoutes.js create mode 100644 src/routes/SettingRoutes.js create mode 100644 src/routes/index.js create mode 100644 src/setupTests.js create mode 100644 src/store/index.js create mode 100644 src/store/reducers/actions.js create mode 100644 src/store/reducers/index.js create mode 100644 src/store/reducers/menu.js create mode 100644 src/themes/colorConst.js create mode 100644 src/themes/index.js create mode 100644 src/themes/overrides/Badge.js create mode 100644 src/themes/overrides/Button.js create mode 100644 src/themes/overrides/CardContent.js create mode 100644 src/themes/overrides/Checkbox.js create mode 100644 src/themes/overrides/Chip.js create mode 100644 src/themes/overrides/IconButton.js create mode 100644 src/themes/overrides/InputLabel.js create mode 100644 src/themes/overrides/LinearProgress.js create mode 100644 src/themes/overrides/Link.js create mode 100644 src/themes/overrides/ListItemIcon.js create mode 100644 src/themes/overrides/OutlinedInput.js create mode 100644 src/themes/overrides/Tab.js create mode 100644 src/themes/overrides/TableCell.js create mode 100644 src/themes/overrides/Tabs.js create mode 100644 src/themes/overrides/Typography.js create mode 100644 src/themes/overrides/index.js create mode 100644 src/themes/page-misc.scss create mode 100644 src/themes/palette.js create mode 100644 src/themes/shadows.js create mode 100644 src/themes/theme/index.js create mode 100644 src/themes/themeConst.js create mode 100644 src/themes/typography.js create mode 100644 src/translations/en.json create mode 100644 src/translations/zh-CN.json create mode 100644 src/translations/zh-HK.json create mode 100644 src/utils/ApiPathConst.js create mode 100644 src/utils/ComboConst.js create mode 100644 src/utils/CommonFunction.js create mode 100644 src/utils/CustomAxios.js create mode 100644 src/utils/SettingConst.js create mode 100644 src/utils/SyntaxHighlight.js create mode 100644 src/utils/UserAbilityUtils.js create mode 100644 src/utils/Utils.js create mode 100644 src/utils/context/Can.js create mode 100644 src/utils/password-strength.js create mode 100644 src/utils/videoThumbnails.js create mode 100644 yarn.lock diff --git a/.env b/.env new file mode 100644 index 0000000..56c857e --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +REACT_APP_VERSION = v1.0.1 +GENERATE_SOURCEMAP = false diff --git a/.env-cmdrc b/.env-cmdrc new file mode 100644 index 0000000..d4b8fa2 --- /dev/null +++ b/.env-cmdrc @@ -0,0 +1,42 @@ +{ + "development": { + "REACT_APP_ENV": "development", + "REACT_APP_URL": "http://localhost:3000/", + "REACT_APP_BACKEND_PROTOCOL": "http", + "REACT_APP_BACKEND_HOST": "localhost", + "REACT_APP_BACKEND_PORT": "8090", + "REACT_APP_BACKEND_API_PATH": "/api" + }, + "2fi-uat": { + "REACT_APP_ENV": "2fi-uat", + "REACT_APP_URL": "http://192.168.1.82:80/", + "REACT_APP_BACKEND_PROTOCOL": "http", + "REACT_APP_BACKEND_HOST": "192.168.1.82", + "REACT_APP_BACKEND_PORT": "80", + "REACT_APP_BACKEND_API_PATH": "/api" + }, + "2fi-production": { + "REACT_APP_ENV": "2fi-production", + "REACT_APP_URL": "http://192.168.1.80:80/", + "REACT_APP_BACKEND_PROTOCOL": "http", + "REACT_APP_BACKEND_HOST": "192.168.1.80", + "REACT_APP_BACKEND_PORT": "80", + "REACT_APP_BACKEND_API_PATH": "/api" + }, + "emsd-uat": { + "REACT_APP_ENV": "emsd-uat", + "REACT_APP_URL": "https://ccsdawardrs-uat.emsd.hksarg/", + "REACT_APP_BACKEND_PROTOCOL": "https", + "REACT_APP_BACKEND_HOST": "ccsdawardrs-uat.emsd.hksarg", + "REACT_APP_BACKEND_PORT": "443", + "REACT_APP_BACKEND_API_PATH": "/api" + }, + "emsd-production": { + "REACT_APP_ENV": "emsd-production", + "REACT_APP_URL": "https://ccsdawardrs.emsd.hksarg/", + "REACT_APP_BACKEND_PROTOCOL": "https", + "REACT_APP_BACKEND_HOST": "ccsdawardrs.emsd.hksarg", + "REACT_APP_BACKEND_PORT": "443", + "REACT_APP_BACKEND_API_PATH": "/api" + } +} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..c8e9b84 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,91 @@ +{ + "root": true, + "env": { + "browser": true, + "es2021": true + }, + "extends": [ + "prettier", + "plugin:react/jsx-runtime", + "plugin:jsx-a11y/recommended", + "plugin:react-hooks/recommended", + "eslint:recommended", + "plugin:react/recommended" + ], + "settings": { + "react": { + "createClass": "createReactClass", // Regex for Component Factory to use, + // default to "createReactClass" + "pragma": "React", // Pragma to use, default to "React" + "fragment": "Fragment", // Fragment to use (may be a property of ), default to "Fragment" + "version": "detect", // React version. "detect" automatically picks the version you have installed. + // You can also use `16.0`, `16.3`, etc, if you want to override the detected value. + // It will default to "latest" and warn if missing, and to "detect" in the future + "flowVersion": "0.53" // Flow version + }, + "import/resolver": { + "node": { + "moduleDirectory": ["node_modules", "src/"] + } + } + }, + "parser": "@babel/eslint-parser", + "parserOptions": { + "ecmaFeatures": { + "experimentalObjectRestSpread": true, + "impliedStrict": true, + "jsx": true + }, + "ecmaVersion": 12 + }, + "plugins": ["prettier", "react", "react-hooks"], + "rules": { + "no-debugger": "error", + "react/jsx-uses-react": "error", + "react/jsx-uses-vars": "error", + "react/react-in-jsx-scope": "off", + "no-undef": "off", + "react/display-name": "off", + "react/jsx-filename-extension": "off", + "no-param-reassign": "off", + "react/prop-types": 1, + "react/require-default-props": "off", + "react/no-array-index-key": "off", + "react/jsx-props-no-spreading": "off", + "react/forbid-prop-types": "off", + "import/order": "off", + "import/no-cycle": "off", + "no-console": "off", + "jsx-a11y/anchor-is-valid": "off", + "prefer-destructuring": "off", + "no-shadow": "off", + "import/no-named-as-default": "off", + "import/no-extraneous-dependencies": "off", + "jsx-a11y/no-autofocus": "off", + "no-restricted-imports": [ + "off", + { + "patterns": ["@mui/*/*/*", "!@mui/material/test-utils/*"] + } + ], + "no-unused-vars": [ + // "error", + "off", + { + "ignoreRestSiblings": false + } + ], + "prettier/prettier": [ + "off", + { + "bracketSpacing": true, + "printWidth": 140, + "singleQuote": true, + "trailingComma": "none", + "tabWidth": 2, + "useTabs": false, + "endOfLine": "auto" + } + ] + } +} diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f9b01e --- /dev/null +++ b/.gitignore @@ -0,0 +1,111 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# TypeScript v1 declaration files +typings/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity +.idea + +# dotenv environment variables file +# .env +.env.test + +# parcel-bundler cache (https://parceljs.org/) +.cache + +# Next.js build output +.next + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and *not* Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Backup file +*.bak + +#output +build diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..d5fba07 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "bracketSpacing": true, + "printWidth": 140, + "singleQuote": true, + "trailingComma": "none", + "tabWidth": 2, + "useTabs": false +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..e56548a --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,128 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, religion, or sexual identity +and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +- Focusing on what is best not just for us as individuals, but for the + overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or + advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others' private information, such as a physical or email + address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +codedthemes@gmail.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series +of actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or +permanent ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within +the community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.0, available at +https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. + +Community Impact Guidelines were inspired by [Mozilla's code of conduct +enforcement ladder](https://github.com/mozilla/diversity). + +[homepage]: https://www.contributor-covenant.org + +For answers to common questions about this code of conduct, see the FAQ at +https://www.contributor-covenant.org/faq. Translations are available at +https://www.contributor-covenant.org/translations. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9e77a41 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 CodedThemes + +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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..4837f3f --- /dev/null +++ b/README.md @@ -0,0 +1,13 @@ +# 2Fi LIONER Frontend Setup + +## 1. Install NPM Modules + - Run the following command in terminal + ``` + npm install + ``` + +## 2. Run the application + - Start the application by the following command: + ``` + npm start + ``` \ No newline at end of file diff --git a/jsconfig.json b/jsconfig.json new file mode 100644 index 0000000..2f8cdab --- /dev/null +++ b/jsconfig.json @@ -0,0 +1,12 @@ +{ + "compilerOptions": { + "target": "esnext", + "module": "esnext", + "baseUrl": "src", + "paths": { + "@assets/*": ["assets/*"] + } + }, + "include": ["src/**/*"], + "exclude": ["node_modules"] +} diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..392fc0c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,23581 @@ +{ + "name": "ars-react", + "version": "1.1.2", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ars-react", + "version": "1.1.2", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.7.0", + "@casl/ability": "^6.5.0", + "@casl/react": "^3.1.0", + "@emotion/cache": "^11.10.3", + "@emotion/react": "^11.10.4", + "@emotion/styled": "^11.10.4", + "@mantine/core": "^7.0.2", + "@material-ui/pickers": "^3.3.10", + "@mui/icons-material": "^5.14.1", + "@mui/lab": "^5.0.0-alpha.139", + "@mui/material": "^5.14.11", + "@mui/styles": "^5.14.15", + "@mui/system": "^5.14.11", + "@mui/x-data-grid": "^6.11.1", + "@reduxjs/toolkit": "^1.8.5", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "@uppy/core": "^3.5.0", + "@uppy/dashboard": "^3.5.2", + "@uppy/drag-drop": "^3.0.3", + "@uppy/file-input": "^3.0.3", + "@uppy/progress-bar": "^3.0.3", + "@uppy/react": "^3.1.3", + "@uppy/thumbnail-generator": "^3.0.4", + "@uppy/tus": "^3.2.0", + "@uppy/webcam": "^3.3.2", + "@uppy/xhr-upload": "^3.4.0", + "apexcharts": "^3.37.3", + "axios": "^1.4.0", + "buffer": "^6.0.3", + "date-fns": "^2.30.0", + "dayjs": "^1.11.10", + "env-cmd": "^10.1.0", + "formik": "^2.2.9", + "framer-motion": "^7.3.6", + "history": "^5.3.0", + "i18next": "^23.5.1", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "mui-file-input": "^3.0.2", + "mui-image": "^1.0.7", + "prop-types": "^15.8.1", + "react": "^18.2.0", + "react-apexcharts": "^1.4.0", + "react-copy-to-clipboard": "^5.1.0", + "react-device-detect": "^2.2.2", + "react-dom": "^18.2.0", + "react-draggable": "^4.4.5", + "react-element-to-jsx-string": "^15.0.0", + "react-hook-form": "^7.45.4", + "react-i18next": "^13.2.2", + "react-idle-timer": "^5.7.2", + "react-intl": "^6.4.7", + "react-number-format": "^4.9.4", + "react-perfect-scrollbar": "^1.5.8", + "react-redux": "^8.0.4", + "react-router": "^6.4.1", + "react-router-dom": "^6.4.1", + "react-scripts": "^5.0.1", + "react-syntax-highlighter": "^15.5.0", + "react-toastify": "^9.1.3", + "react-window": "^1.8.7", + "redux": "^4.2.0", + "simplebar": "^5.3.8", + "simplebar-react": "^2.4.1", + "stream": "0.0.2", + "timers": "^0.1.1", + "typescript": "4.8.3", + "web-vitals": "^3.0.2", + "xlsx": "^0.18.5", + "xml2js": "^0.6.2", + "yup": "^0.32.11" + }, + "devDependencies": { + "@babel/core": "^7.21.4", + "@babel/eslint-parser": "^7.21.3", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@mui/core": "^5.0.0-alpha.54", + "@mui/x-date-pickers": "^6.18.0", + "eslint": "^8.38.0", + "eslint-config-prettier": "^8.8.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "prettier": "^2.8.7" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@adobe/css-tools": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + }, + "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==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "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": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz", + "integrity": "sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg==", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1", + "@babel/runtime": "^7.11.2", + "classnames": "^2.2.6", + "rc-util": "^5.9.4" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": ">=16.0.0", + "react-dom": ">=16.0.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz", + "integrity": "sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw==" + }, + "node_modules/@apideck/better-ajv-errors": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz", + "integrity": "sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA==", + "dependencies": { + "json-schema": "^0.4.0", + "jsonpointer": "^5.0.0", + "leven": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "ajv": ">=8" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz", + "integrity": "sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==", + "dependencies": { + "@babel/highlight": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz", + "integrity": "sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz", + "integrity": "sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz", + "integrity": "sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg==", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "eslint-visitor-keys": "^2.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": ">=7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/@babel/eslint-parser/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/eslint-parser/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@babel/generator": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz", + "integrity": "sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ==", + "dependencies": { + "@babel/types": "^7.22.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz", + "integrity": "sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz", + "integrity": "sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-validator-option": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz", + "integrity": "sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz", + "integrity": "sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "regexpu-core": "^5.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz", + "integrity": "sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz", + "integrity": "sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz", + "integrity": "sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz", + "integrity": "sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz", + "integrity": "sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz", + "integrity": "sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz", + "integrity": "sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-wrap-function": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz", + "integrity": "sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", + "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz", + "integrity": "sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz", + "integrity": "sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw==", + "dependencies": { + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz", + "integrity": "sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA==", + "dependencies": { + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.6", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz", + "integrity": "sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz", + "integrity": "sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz", + "integrity": "sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz", + "integrity": "sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz", + "integrity": "sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/plugin-syntax-decorators": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", + "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-nullish-coalescing-operator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", + "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-numeric-separator instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.18.6", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.21.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", + "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-optional-chaining instead.", + "dependencies": { + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", + "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz", + "integrity": "sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-property-in-object instead.", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.21.0", + "@babel/helper-plugin-utils": "^7.20.2", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", + "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-unicode-property-regex instead.", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-bigint": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", + "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz", + "integrity": "sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-flow": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz", + "integrity": "sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz", + "integrity": "sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz", + "integrity": "sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz", + "integrity": "sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz", + "integrity": "sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz", + "integrity": "sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz", + "integrity": "sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz", + "integrity": "sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz", + "integrity": "sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz", + "integrity": "sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz", + "integrity": "sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz", + "integrity": "sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz", + "integrity": "sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz", + "integrity": "sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz", + "integrity": "sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz", + "integrity": "sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz", + "integrity": "sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-flow-strip-types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz", + "integrity": "sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz", + "integrity": "sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz", + "integrity": "sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz", + "integrity": "sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz", + "integrity": "sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz", + "integrity": "sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz", + "integrity": "sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz", + "integrity": "sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz", + "integrity": "sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz", + "integrity": "sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ==", + "dependencies": { + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz", + "integrity": "sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==", + "dependencies": { + "@babel/helper-module-transforms": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz", + "integrity": "sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz", + "integrity": "sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz", + "integrity": "sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz", + "integrity": "sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ==", + "dependencies": { + "@babel/compat-data": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz", + "integrity": "sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz", + "integrity": "sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz", + "integrity": "sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz", + "integrity": "sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz", + "integrity": "sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz", + "integrity": "sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz", + "integrity": "sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz", + "integrity": "sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz", + "integrity": "sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz", + "integrity": "sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz", + "integrity": "sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", + "integrity": "sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz", + "integrity": "sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz", + "integrity": "sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz", + "integrity": "sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz", + "integrity": "sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz", + "integrity": "sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz", + "integrity": "sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz", + "integrity": "sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz", + "integrity": "sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz", + "integrity": "sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz", + "integrity": "sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz", + "integrity": "sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz", + "integrity": "sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz", + "integrity": "sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.22.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.7.tgz", + "integrity": "sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.22.5", + "@nicolo-ribaudo/semver-v6": "^6.3.3", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz", + "integrity": "sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-transform-react-display-name": "^7.22.5", + "@babel/plugin-transform-react-jsx": "^7.22.5", + "@babel/plugin-transform-react-jsx-development": "^7.22.5", + "@babel/plugin-transform-react-pure-annotations": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz", + "integrity": "sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" + }, + "node_modules/@babel/runtime": { + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.22.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz", + "integrity": "sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw==", + "dependencies": { + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.7", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/types": "^7.22.5", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz", + "integrity": "sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@base2/pretty-print-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz", + "integrity": "sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA==" + }, + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==" + }, + "node_modules/@casl/ability": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@casl/ability/-/ability-6.5.0.tgz", + "integrity": "sha512-3guc94ugr5ylZQIpJTLz0CDfwNi0mxKVECj1vJUPAvs+Lwunh/dcuUjwzc4MHM9D8JOYX0XUZMEPedpB3vIbOw==", + "dependencies": { + "@ucast/mongo2js": "^1.3.0" + }, + "funding": { + "url": "https://github.com/stalniy/casl/blob/master/BACKERS.md" + } + }, + "node_modules/@casl/react": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@casl/react/-/react-3.1.0.tgz", + "integrity": "sha512-p4Xmex1Slxz/G0cBtZik+xyOkeOynBUe0UrMFTai6aYkYOb4NyUy3w+9rtnedjcuKijiow2HKJQjnSurLxdc/g==", + "peerDependencies": { + "@casl/ability": "^3.0.0 || ^4.0.0 || ^5.1.0 || ^6.0.0", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@csstools/normalize.css": { + "version": "12.0.0", + "resolved": "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz", + "integrity": "sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg==" + }, + "node_modules/@csstools/postcss-cascade-layers": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz", + "integrity": "sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.2", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-color-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz", + "integrity": "sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-font-format-keywords": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz", + "integrity": "sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-hwb-function": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz", + "integrity": "sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-ic-unit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz", + "integrity": "sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-is-pseudo-class": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz", + "integrity": "sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-nested-calc": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz", + "integrity": "sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-normalize-display-values": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz", + "integrity": "sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-oklab-function": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz", + "integrity": "sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@csstools/postcss-stepped-value-functions": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz", + "integrity": "sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-text-decoration-shorthand": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz", + "integrity": "sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-trigonometric-functions": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz", + "integrity": "sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/postcss-unset-value": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz", + "integrity": "sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", + "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.10" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz", + "integrity": "sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@date-io/core": { + "version": "1.3.13", + "resolved": "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz", + "integrity": "sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA==" + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "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/is-prop-valid": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz", + "integrity": "sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw==", + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "node_modules/@emotion/react": { + "version": "11.11.1", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz", + "integrity": "sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz", + "integrity": "sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA==", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "node_modules/@emotion/styled": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", + "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.1", + "@emotion/serialize": "^1.1.2", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "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/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.24.8", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.24.8.tgz", + "integrity": "sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA==", + "dependencies": { + "@floating-ui/react-dom": "^2.0.1", + "aria-hidden": "^1.2.3", + "tabbable": "^6.0.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz", + "integrity": "sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ==", + "dependencies": { + "@floating-ui/dom": "^1.5.1" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz", + "integrity": "sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA==" + }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz", + "integrity": "sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg==", + "dependencies": { + "@formatjs/intl-localematcher": "0.4.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz", + "integrity": "sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.2.tgz", + "integrity": "sha512-nF/Iww7sc5h+1MBCDRm68qpHTCG4xvGzYs/x9HFcDETSGScaJ1Fcadk5U/NXjXeCtzD+DhN4BAwKFVclHfKMdA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/icu-skeleton-parser": "1.6.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.2.tgz", + "integrity": "sha512-VtB9Slo4ZL6QgtDFJ8Injvscf0xiDd4bIV93SOJTBjUF4xe2nAWOoSjLEtqIG+hlIs1sNrVKAaFo3nuTI4r5ZA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/@formatjs/intl/-/intl-2.9.3.tgz", + "integrity": "sha512-hclPdyCF1zk2XmhgdXfl5Sd30QEdRBnIijH7Vc1AWz2K0/saVRrxuL3UYn+m3xEyfOa4yDbTWVbmXDL0XEzlsQ==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.6.2", + "@formatjs/intl-displaynames": "6.5.2", + "@formatjs/intl-listformat": "7.4.2", + "intl-messageformat": "10.5.3", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@formatjs/intl-displaynames": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.5.2.tgz", + "integrity": "sha512-uC2VBlz+WydGTDDpJwMTQuPH3CUpTricr91WH1QMfz5oEHg2sB7mUERcZONE/lu8MOe1jREIx4vBciZEVTqkmA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/intl-localematcher": "0.4.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-listformat": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.2.tgz", + "integrity": "sha512-+6bSVudEQkf12Hh7kuKt8Xv/MyFlqdwA4V4NLnTZW8uYdF9RxlOELDD0rPaOc2++TMKIzI5o6XXwHPvpL6VrPA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/intl-localematcher": "0.4.2", + "tslib": "^2.4.0" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz", + "integrity": "sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "deprecated": "Use @eslint/config-array instead", + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "deprecated": "Use @eslint/object-schema instead" + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz", + "integrity": "sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/console/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/console/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/console/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/console/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/console/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/console/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@jest/console/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz", + "integrity": "sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/reporters": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "jest-changed-files": "^27.5.1", + "jest-config": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-resolve-dependencies": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "jest-watcher": "^27.5.1", + "micromatch": "^4.0.4", + "rimraf": "^3.0.0", + "slash": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/core/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/core/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/core/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/core/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/core/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/core/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/core/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@jest/core/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz", + "integrity": "sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==", + "dependencies": { + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/environment/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/environment/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/environment/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/environment/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/environment/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/environment/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/expect-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz", + "integrity": "sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw==", + "dependencies": { + "jest-get-type": "^29.4.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/fake-timers": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz", + "integrity": "sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "@sinonjs/fake-timers": "^8.0.1", + "@types/node": "*", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/fake-timers/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/fake-timers/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/fake-timers/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/fake-timers/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@jest/fake-timers/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz", + "integrity": "sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/types": "^27.5.1", + "expect": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/globals/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/globals/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/globals/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/globals/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/globals/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/globals/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@jest/globals/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz", + "integrity": "sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==", + "dependencies": { + "@bcoe/v8-coverage": "^0.2.3", + "@jest/console": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "collect-v8-coverage": "^1.0.0", + "exit": "^0.1.2", + "glob": "^7.1.2", + "graceful-fs": "^4.2.9", + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.1.3", + "jest-haste-map": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "slash": "^3.0.0", + "source-map": "^0.6.0", + "string-length": "^4.0.1", + "terminal-link": "^2.0.0", + "v8-to-istanbul": "^8.1.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/@jest/reporters/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/reporters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/reporters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/reporters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/reporters/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/reporters/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/reporters/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/reporters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz", + "integrity": "sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ==", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/source-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz", + "integrity": "sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==", + "dependencies": { + "callsites": "^3.0.0", + "graceful-fs": "^4.2.9", + "source-map": "^0.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/source-map/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/test-result": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz", + "integrity": "sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/test-result/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/test-result/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/test-result/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/test-result/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-result/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/test-sequencer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz", + "integrity": "sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-runtime": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz", + "integrity": "sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==", + "dependencies": { + "@babel/core": "^7.1.0", + "@jest/types": "^27.5.1", + "babel-plugin-istanbul": "^6.1.1", + "chalk": "^4.0.0", + "convert-source-map": "^1.4.0", + "fast-json-stable-stringify": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-util": "^27.5.1", + "micromatch": "^4.0.4", + "pirates": "^4.0.4", + "slash": "^3.0.0", + "source-map": "^0.6.1", + "write-file-atomic": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@jest/transform/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/transform/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/transform/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/transform/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/transform/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@jest/transform/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@jest/transform/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz", + "integrity": "sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@jest/types/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@jest/types/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@jest/types/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@jest/types/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "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==", + "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==", + "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.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "dependencies": { + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" + } + }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, + "node_modules/@juggle/resize-observer": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", + "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@mantine/core": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@mantine/core/-/core-7.0.2.tgz", + "integrity": "sha512-aJodq48NE4FAgpzimPtT0Izr/dqhXkBwCDOYxgTTe+LpNwTzEJqBfZeysB2B3Aobr7MaEWPvvyUi3Uu9qL5y0g==", + "dependencies": { + "@floating-ui/react": "^0.24.8", + "clsx": "2.0.0", + "react-number-format": "^5.2.2", + "react-remove-scroll": "^2.5.6", + "react-textarea-autosize": "8.5.2", + "type-fest": "^3.13.1" + }, + "peerDependencies": { + "@mantine/hooks": "7.0.2", + "react": "^18.2.0", + "react-dom": "^18.2.0" + } + }, + "node_modules/@mantine/core/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mantine/core/node_modules/react-number-format": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.1.tgz", + "integrity": "sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mantine/core/node_modules/type-fest": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@material-ui/pickers": { + "version": "3.3.10", + "resolved": "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.10.tgz", + "integrity": "sha512-hS4pxwn1ZGXVkmgD4tpFpaumUaAg2ZzbTrxltfC5yPw4BJV+mGkfnQOB4VpWEYZw2jv65Z0wLwDE/piQiPPZ3w==", + "deprecated": "This package no longer supported. It has been relaced by @mui/x-date-pickers", + "dependencies": { + "@babel/runtime": "^7.6.0", + "@date-io/core": "1.x", + "@types/styled-jsx": "^2.2.8", + "clsx": "^1.0.2", + "react-transition-group": "^4.0.0", + "rifm": "^0.7.0" + }, + "peerDependencies": { + "@date-io/core": "^1.3.6", + "@material-ui/core": "^4.0.0", + "prop-types": "^15.6.0", + "react": "^16.8.0 || ^17.0.0", + "react-dom": "^16.8.0 || ^17.0.0" + } + }, + "node_modules/@motionone/animation": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz", + "integrity": "sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ==", + "dependencies": { + "@motionone/easing": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/dom": { + "version": "10.16.2", + "resolved": "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz", + "integrity": "sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg==", + "dependencies": { + "@motionone/animation": "^10.15.1", + "@motionone/generators": "^10.15.1", + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/easing": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz", + "integrity": "sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw==", + "dependencies": { + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/generators": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz", + "integrity": "sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ==", + "dependencies": { + "@motionone/types": "^10.15.1", + "@motionone/utils": "^10.15.1", + "tslib": "^2.3.1" + } + }, + "node_modules/@motionone/types": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz", + "integrity": "sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA==" + }, + "node_modules/@motionone/utils": { + "version": "10.15.1", + "resolved": "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz", + "integrity": "sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw==", + "dependencies": { + "@motionone/types": "^10.15.1", + "hey-listen": "^1.0.8", + "tslib": "^2.3.1" + } + }, + "node_modules/@mui/base": { + "version": "5.0.0-beta.17", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz", + "integrity": "sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.11", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/@babel/runtime": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/base/node_modules/@mui/utils": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", + "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/base/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/base/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/@mui/core": { + "version": "5.0.0-alpha.54", + "resolved": "https://registry.npmjs.org/@mui/core/-/core-5.0.0-alpha.54.tgz", + "integrity": "sha512-8TxdHqDdSb6wjhsnpE5n7qtkFKDG3PUSlVY0gR3VcdsHXscUY13l3VbMQW1brI4D/R9zx5VYmxIHWaHFgw4RtA==", + "deprecated": "You can now upgrade to @mui/base. See https://github.com/mui/material-ui/releases/tag/v5.1.1", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.16.0", + "@emotion/is-prop-valid": "^1.1.0", + "@mui/utils": "^5.1.0", + "@popperjs/core": "^2.4.4", + "clsx": "^1.1.1", + "prop-types": "^15.7.2", + "react-is": "^17.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8.6 || ^17.0.0", + "react": "^17.0.2", + "react-dom": "^17.0.2" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz", + "integrity": "sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/core/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", + "dev": true + }, + "node_modules/@mui/icons-material": { + "version": "5.14.3", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz", + "integrity": "sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw==", + "dependencies": { + "@babel/runtime": "^7.22.6" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab": { + "version": "5.0.0-alpha.139", + "resolved": "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.139.tgz", + "integrity": "sha512-YlKKELtGZEpd3Hj9cUo6ekwB6RSDzGBw+LlaCBntudhVb4aRn5mQYFej3BYn6fOYz5335jkTgvBt0sEwlSo4qA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/base": "5.0.0-beta.10", + "@mui/system": "^5.14.4", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.4", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/base": { + "version": "5.0.0-beta.10", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.10.tgz", + "integrity": "sha512-moTAhGwFfQffj7hsu61FnqcGqVcd53A1CrOhnskM9TF0Uh2rnLDMCuar4JRUWWpaJofAfQEbQBBFPadFQLI4PA==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@emotion/is-prop-valid": "^1.2.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.4", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/private-theming": { + "version": "5.14.4", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.4.tgz", + "integrity": "sha512-ISXsHDiQ3z1XA4IuKn+iXDWvDjcz/UcQBiFZqtdoIsEBt8CB7wgdQf3LwcwqO81dl5ofg/vNQBEnXuKfZHrnYA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/utils": "^5.14.4", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/system": { + "version": "5.14.4", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.4.tgz", + "integrity": "sha512-oPgfWS97QNfHcDBapdkZIs4G5i85BJt69Hp6wbXF6s7vi3Evcmhdk8AbCRW6n0sX4vTj8oe0mh0RIm1G2A1KDA==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@mui/private-theming": "^5.14.4", + "@mui/styled-engine": "^5.13.2", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.4", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/lab/node_modules/@mui/utils": { + "version": "5.14.4", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.4.tgz", + "integrity": "sha512-4ANV0txPD3x0IcTCSEHKDWnsutg1K3m6Vz5IckkbLXVYu17oOZCVUdOKsb/txUmaCd0v0PmSRe5PW+Mlvns5dQ==", + "dependencies": { + "@babel/runtime": "^7.22.6", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/lab/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/lab/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/material": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.14.11.tgz", + "integrity": "sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@mui/base": "5.0.0-beta.17", + "@mui/core-downloads-tracker": "^5.14.11", + "@mui/system": "^5.14.11", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.11", + "@types/react-transition-group": "^4.4.6", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/@babel/runtime": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/material/node_modules/@mui/utils": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", + "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/material/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/@mui/private-theming": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.11.tgz", + "integrity": "sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@mui/utils": "^5.14.11", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming/node_modules/@babel/runtime": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/private-theming/node_modules/@mui/utils": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", + "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/private-theming/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/private-theming/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/@mui/styled-engine": { + "version": "5.13.2", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz", + "integrity": "sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw==", + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/styles": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/styles/-/styles-5.14.15.tgz", + "integrity": "sha512-ljjnL5HMGM5jhL/8ij4HPu65DsvIg2yDwHP58sNcS87FR+niI+UVxgV/3a/HJWC6qPyBO5LBHW3uahmCobr5Rw==", + "deprecated": "Deprecated, check the migration instruction in https://mui.com/material-ui/migration/migrating-from-jss/", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@emotion/hash": "^0.9.1", + "@mui/private-theming": "^5.14.15", + "@mui/types": "^7.2.7", + "@mui/utils": "^5.14.15", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "hoist-non-react-statics": "^3.3.2", + "jss": "^10.10.0", + "jss-plugin-camel-case": "^10.10.0", + "jss-plugin-default-unit": "^10.10.0", + "jss-plugin-global": "^10.10.0", + "jss-plugin-nested": "^10.10.0", + "jss-plugin-props-sort": "^10.10.0", + "jss-plugin-rule-value-function": "^10.10.0", + "jss-plugin-vendor-prefixer": "^10.10.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styles/node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/styles/node_modules/@mui/private-theming": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.15.tgz", + "integrity": "sha512-V2Xh+Tu6A07NoSpup0P9m29GwvNMYl5DegsGWqlOTJyAV7cuuVjmVPqxgvL8xBng4R85xqIQJRMjtYYktoPNuQ==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/utils": "^5.14.15", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styles/node_modules/@mui/types": { + "version": "7.2.7", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.7.tgz", + "integrity": "sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ==", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styles/node_modules/@mui/utils": { + "version": "5.14.15", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.15.tgz", + "integrity": "sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A==", + "dependencies": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.8", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styles/node_modules/@types/prop-types": { + "version": "15.7.9", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz", + "integrity": "sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g==" + }, + "node_modules/@mui/styles/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/styles/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/styles/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/@mui/system": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.14.11.tgz", + "integrity": "sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@mui/private-theming": "^5.14.11", + "@mui/styled-engine": "^5.14.11", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.14.11", + "clsx": "^2.0.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@babel/runtime": { + "version": "7.23.1", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz", + "integrity": "sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/system/node_modules/@mui/styled-engine": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.11.tgz", + "integrity": "sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@emotion/cache": "^11.11.0", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/@mui/utils": { + "version": "5.14.11", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz", + "integrity": "sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q==", + "dependencies": { + "@babel/runtime": "^7.22.15", + "@types/prop-types": "^15.7.5", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/system/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/system/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/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.13.7", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.13.7.tgz", + "integrity": "sha512-/3BLptG/q0u36eYED7Nhf4fKXmcKb6LjjT7ZMwhZIZSdSxVqDqSTmATW3a56n3KEPQUXCU9TpxAfCBQhs6brVA==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.22.5", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@mui/x-data-grid": { + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-6.12.0.tgz", + "integrity": "sha512-ZuQ8Uq/dF6gjrE/qU6VvP3tgy9n78DdCMD6hbXy/uDIoddJ4J8hSn9S6flnFnFQbRZzF/Q/pPWXZTR4oeg8NQg==", + "dependencies": { + "@babel/runtime": "^7.22.11", + "@mui/utils": "^5.14.5", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "reselect": "^4.1.8" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.4.1", + "@mui/system": "^5.4.1", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-data-grid/node_modules/@babel/runtime": { + "version": "7.22.11", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz", + "integrity": "sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/x-data-grid/node_modules/@mui/utils": { + "version": "5.14.6", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.6.tgz", + "integrity": "sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA==", + "dependencies": { + "@babel/runtime": "^7.22.10", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^18.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/x-data-grid/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/x-data-grid/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/@mui/x-data-grid/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/@mui/x-date-pickers": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.0.tgz", + "integrity": "sha512-y4UlkHQXiNRfb6FWQ/GWir0sZ+9kL+GEEZssG+XWP3KJ+d3lONRteusl4AJkYJBdIAOh+5LnMV9RAQKq9Sl7yw==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "@mui/base": "^5.0.0-beta.22", + "@mui/utils": "^5.14.16", + "@types/react-transition-group": "^4.4.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.8.6", + "@mui/system": "^5.8.0", + "date-fns": "^2.25.0", + "date-fns-jalali": "^2.13.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers/node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@mui/x-date-pickers/node_modules/@mui/base": { + "version": "5.0.0-beta.23", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.23.tgz", + "integrity": "sha512-9L8SQUGAWtd/Qi7Qem26+oSSgpY7f2iQTuvcz/rsGpyZjSomMMO6lwYeQSA0CpWM7+aN7eGoSY/WV6wxJiIxXw==", + "deprecated": "This package has been replaced by @base-ui-components/react", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "@floating-ui/react-dom": "^2.0.2", + "@mui/types": "^7.2.8", + "@mui/utils": "^5.14.17", + "@popperjs/core": "^2.11.8", + "clsx": "^2.0.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers/node_modules/@mui/types": { + "version": "7.2.8", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz", + "integrity": "sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ==", + "dev": true, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers/node_modules/@mui/utils": { + "version": "5.14.17", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.14.17.tgz", + "integrity": "sha512-yxnWgSS4J6DMFPw2Dof85yBkG02VTbEiqsikymMsnZnXDurtVGTIhlNuV24GTmFTuJMzEyTTU9UF+O7zaL8LEQ==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.23.2", + "@types/prop-types": "^15.7.9", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-date-pickers/node_modules/@types/prop-types": { + "version": "15.7.10", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz", + "integrity": "sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A==", + "dev": true + }, + "node_modules/@mui/x-date-pickers/node_modules/@types/react-transition-group": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz", + "integrity": "sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@mui/x-date-pickers/node_modules/clsx": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz", + "integrity": "sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/x-date-pickers/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, + "node_modules/@mui/x-date-pickers/node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", + "dev": true + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/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==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "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==", + "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==", + "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==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin": { + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "dependencies": { + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", + "core-js-pure": "^3.23.3", + "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", + "html-entities": "^2.1.0", + "loader-utils": "^2.0.4", + "schema-utils": "^3.0.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "@types/webpack": "4.x || 5.x", + "react-refresh": ">=0.10.0 <1.0.0", + "sockjs-client": "^1.4.0", + "type-fest": ">=0.17.0 <4.0.0", + "webpack": ">=4.43.0 <6.0.0", + "webpack-dev-server": "3.x || 4.x", + "webpack-hot-middleware": "2.x", + "webpack-plugin-serve": "0.x || 1.x" + }, + "peerDependenciesMeta": { + "@types/webpack": { + "optional": true + }, + "sockjs-client": { + "optional": true + }, + "type-fest": { + "optional": true + }, + "webpack-dev-server": { + "optional": true + }, + "webpack-hot-middleware": { + "optional": true + }, + "webpack-plugin-serve": { + "optional": true + } + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@reduxjs/toolkit": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz", + "integrity": "sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ==", + "dependencies": { + "immer": "^9.0.21", + "redux": "^4.2.1", + "redux-thunk": "^2.4.2", + "reselect": "^4.1.8" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17.0.0 || ^18", + "react-redux": "^7.2.1 || ^8.0.2" + }, + "peerDependenciesMeta": { + "react": { + "optional": true + }, + "react-redux": { + "optional": true + } + } + }, + "node_modules/@remix-run/router": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz", + "integrity": "sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ==", + "engines": { + "node": ">=14" + } + }, + "node_modules/@rollup/plugin-babel": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz", + "integrity": "sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q==", + "dependencies": { + "@babel/helper-module-imports": "^7.10.4", + "@rollup/pluginutils": "^3.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "@types/babel__core": "^7.1.9", + "rollup": "^1.20.0||^2.0.0" + }, + "peerDependenciesMeta": { + "@types/babel__core": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-node-resolve": { + "version": "11.2.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz", + "integrity": "sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "@types/resolve": "1.17.1", + "builtin-modules": "^3.1.0", + "deepmerge": "^4.2.2", + "is-module": "^1.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/plugin-node-resolve/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@rollup/plugin-replace": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz", + "integrity": "sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg==", + "dependencies": { + "@rollup/pluginutils": "^3.1.0", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "rollup": "^1.20.0 || ^2.0.0" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz", + "integrity": "sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg==", + "dependencies": { + "@types/estree": "0.0.39", + "estree-walker": "^1.0.1", + "picomatch": "^2.2.2" + }, + "engines": { + "node": ">= 8.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0" + } + }, + "node_modules/@rollup/pluginutils/node_modules/@types/estree": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz", + "integrity": "sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw==" + }, + "node_modules/@rushstack/eslint-patch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz", + "integrity": "sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw==" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==" + }, + "node_modules/@sinonjs/commons": { + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz", + "integrity": "sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==", + "dependencies": { + "type-detect": "4.0.8" + } + }, + "node_modules/@sinonjs/fake-timers": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz", + "integrity": "sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==", + "dependencies": { + "@sinonjs/commons": "^1.7.0" + } + }, + "node_modules/@surma/rollup-plugin-off-main-thread": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz", + "integrity": "sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ==", + "dependencies": { + "ejs": "^3.1.6", + "json5": "^2.2.0", + "magic-string": "^0.25.0", + "string.prototype.matchall": "^4.0.6" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz", + "integrity": "sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz", + "integrity": "sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz", + "integrity": "sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz", + "integrity": "sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz", + "integrity": "sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz", + "integrity": "sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz", + "integrity": "sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz", + "integrity": "sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig==", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-attribute": "^5.4.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "^5.0.1", + "@svgr/babel-plugin-replace-jsx-attribute-value": "^5.0.1", + "@svgr/babel-plugin-svg-dynamic-title": "^5.4.0", + "@svgr/babel-plugin-svg-em-dimensions": "^5.4.0", + "@svgr/babel-plugin-transform-react-native-svg": "^5.4.0", + "@svgr/babel-plugin-transform-svg-component": "^5.5.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/core": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz", + "integrity": "sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ==", + "dependencies": { + "@svgr/plugin-jsx": "^5.5.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz", + "integrity": "sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ==", + "dependencies": { + "@babel/types": "^7.12.6" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz", + "integrity": "sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA==", + "dependencies": { + "@babel/core": "^7.12.3", + "@svgr/babel-preset": "^5.5.0", + "@svgr/hast-util-to-babel-ast": "^5.5.0", + "svg-parser": "^2.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz", + "integrity": "sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "deepmerge": "^4.2.2", + "svgo": "^1.2.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-svgo/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@svgr/webpack": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz", + "integrity": "sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/plugin-transform-react-constant-elements": "^7.12.1", + "@babel/preset-env": "^7.12.1", + "@babel/preset-react": "^7.12.5", + "@svgr/core": "^5.5.0", + "@svgr/plugin-jsx": "^5.5.0", + "@svgr/plugin-svgo": "^5.5.0", + "loader-utils": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@testing-library/dom": { + "version": "8.20.1", + "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz", + "integrity": "sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "@babel/runtime": "^7.12.5", + "@types/aria-query": "^5.0.1", + "aria-query": "5.1.3", + "chalk": "^4.1.0", + "dom-accessibility-api": "^0.5.9", + "lz-string": "^1.5.0", + "pretty-format": "^27.0.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@testing-library/dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/aria-query": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", + "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "dependencies": { + "deep-equal": "^2.0.5" + } + }, + "node_modules/@testing-library/dom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@testing-library/dom/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/@testing-library/dom/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/dom/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/@testing-library/dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom": { + "version": "5.16.5", + "resolved": "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz", + "integrity": "sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA==", + "dependencies": { + "@adobe/css-tools": "^4.0.1", + "@babel/runtime": "^7.9.2", + "@types/testing-library__jest-dom": "^5.9.1", + "aria-query": "^5.0.0", + "chalk": "^3.0.0", + "css.escape": "^1.5.1", + "dom-accessibility-api": "^0.5.6", + "lodash": "^4.17.15", + "redent": "^3.0.0" + }, + "engines": { + "node": ">=8", + "npm": ">=6", + "yarn": ">=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/@testing-library/jest-dom/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/jest-dom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@testing-library/react": { + "version": "13.4.0", + "resolved": "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz", + "integrity": "sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "@testing-library/dom": "^8.5.0", + "@types/react-dom": "^18.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@testing-library/user-event": { + "version": "14.4.3", + "resolved": "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz", + "integrity": "sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q==", + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "@testing-library/dom": ">=7.21.4" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/@transloadit/prettier-bytes": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz", + "integrity": "sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA==" + }, + "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==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/aria-query": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz", + "integrity": "sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q==" + }, + "node_modules/@types/babel__core": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz", + "integrity": "sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw==", + "dependencies": { + "@babel/parser": "^7.20.7", + "@babel/types": "^7.20.7", + "@types/babel__generator": "*", + "@types/babel__template": "*", + "@types/babel__traverse": "*" + } + }, + "node_modules/@types/babel__generator": { + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", + "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", + "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.20.1", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz", + "integrity": "sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg==", + "dependencies": { + "@babel/types": "^7.20.7" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz", + "integrity": "sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig==", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.40.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz", + "integrity": "sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ==", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + }, + "node_modules/@types/express": { + "version": "4.17.17", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz", + "integrity": "sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.35", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz", + "integrity": "sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg==", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/graceful-fs": { + "version": "4.1.6", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", + "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/hast": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz", + "integrity": "sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g==", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/hoist-non-react-statics": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", + "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", + "dependencies": { + "@types/react": "*", + "hoist-non-react-statics": "^3.3.0" + } + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" + }, + "node_modules/@types/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ==" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.11", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz", + "integrity": "sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/jest": { + "version": "29.5.2", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz", + "integrity": "sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg==", + "dependencies": { + "expect": "^29.0.0", + "pretty-format": "^29.0.0" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==" + }, + "node_modules/@types/lodash": { + "version": "4.14.195", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz", + "integrity": "sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg==" + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" + }, + "node_modules/@types/node": { + "version": "20.4.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.0.tgz", + "integrity": "sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g==" + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" + }, + "node_modules/@types/prettier": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==" + }, + "node_modules/@types/prop-types": { + "version": "15.7.5", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + }, + "node_modules/@types/q": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz", + "integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==" + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" + }, + "node_modules/@types/react": { + "version": "18.2.14", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz", + "integrity": "sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g==", + "dependencies": { + "@types/prop-types": "*", + "@types/scheduler": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz", + "integrity": "sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-is": { + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz", + "integrity": "sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.6", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz", + "integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/resolve": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz", + "integrity": "sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" + }, + "node_modules/@types/scheduler": { + "version": "0.16.3", + "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz", + "integrity": "sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ==" + }, + "node_modules/@types/semver": { + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==" + }, + "node_modules/@types/send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz", + "integrity": "sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q==", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz", + "integrity": "sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw==", + "dependencies": { + "@types/http-errors": "*", + "@types/mime": "*", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==" + }, + "node_modules/@types/styled-jsx": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/@types/styled-jsx/-/styled-jsx-2.2.9.tgz", + "integrity": "sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw==", + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/testing-library__jest-dom": { + "version": "5.14.7", + "resolved": "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.7.tgz", + "integrity": "sha512-PFDoAbR9y8pD9+41oM1Yy0nVCkaRPlklmDZoPCXhNpR0ZO13HAYWqdNEjLtvIiveBmfB/+jdvmuOVeOXehKOaA==", + "dependencies": { + "@types/jest": "*" + } + }, + "node_modules/@types/trusted-types": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz", + "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" + }, + "node_modules/@types/unist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz", + "integrity": "sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w==" + }, + "node_modules/@types/use-sync-external-store": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz", + "integrity": "sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==" + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.24", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", + "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==" + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz", + "integrity": "sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g==", + "dependencies": { + "@eslint-community/regexpp": "^4.4.0", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/type-utils": "5.61.0", + "@typescript-eslint/utils": "5.61.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/experimental-utils": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.61.0.tgz", + "integrity": "sha512-r4RTnwTcaRRVUyKb7JO4DiOGmcMCat+uNs6HqJBfX7K2nlq5TagYZShhbhAw7hFT3bHaYgxMw6pKP0fhu05VMA==", + "dependencies": { + "@typescript-eslint/utils": "5.61.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz", + "integrity": "sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg==", + "dependencies": { + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz", + "integrity": "sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw==", + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz", + "integrity": "sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg==", + "dependencies": { + "@typescript-eslint/typescript-estree": "5.61.0", + "@typescript-eslint/utils": "5.61.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz", + "integrity": "sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz", + "integrity": "sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw==", + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/visitor-keys": "5.61.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz", + "integrity": "sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.61.0", + "@typescript-eslint/types": "5.61.0", + "@typescript-eslint/typescript-estree": "5.61.0", + "eslint-scope": "^5.1.1", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.61.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz", + "integrity": "sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg==", + "dependencies": { + "@typescript-eslint/types": "5.61.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ucast/core": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/@ucast/core/-/core-1.10.2.tgz", + "integrity": "sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g==" + }, + "node_modules/@ucast/js": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@ucast/js/-/js-3.0.3.tgz", + "integrity": "sha512-jBBqt57T5WagkAjqfCIIE5UYVdaXYgGkOFYv2+kjq2AVpZ2RIbwCo/TujJpDlwTVluUI+WpnRpoGU2tSGlEvFQ==", + "dependencies": { + "@ucast/core": "^1.0.0" + } + }, + "node_modules/@ucast/mongo": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/@ucast/mongo/-/mongo-2.4.3.tgz", + "integrity": "sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA==", + "dependencies": { + "@ucast/core": "^1.4.1" + } + }, + "node_modules/@ucast/mongo2js": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@ucast/mongo2js/-/mongo2js-1.3.4.tgz", + "integrity": "sha512-ahazOr1HtelA5AC1KZ9x0UwPMqqimvfmtSm/PRRSeKKeE5G2SCqTgwiNzO7i9jS8zA3dzXpKVPpXMkcYLnyItA==", + "dependencies": { + "@ucast/core": "^1.6.1", + "@ucast/js": "^3.0.0", + "@ucast/mongo": "^2.4.0" + } + }, + "node_modules/@uppy/companion-client": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.4.0.tgz", + "integrity": "sha512-mGm3I/VdlaXvvYnbkidQDk3ttPY7VjvRwoHdXaAOHsIwPZBFUlCRggw84TQN9NejiasqTK/U7xvARDunjVhGBA==", + "dependencies": { + "@uppy/utils": "^5.5.0", + "namespace-emitter": "^2.0.1" + } + }, + "node_modules/@uppy/core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@uppy/core/-/core-3.5.0.tgz", + "integrity": "sha512-Ujm3VrFkqCNnsqvjZL1RQhIdccbjUxfLJW6EhirYcOLr1kCUjhgKSE/iOJnC2eadohHwOWFTx+X8e9bhH6HT7g==", + "dependencies": { + "@transloadit/prettier-bytes": "0.0.9", + "@uppy/store-default": "^3.0.3", + "@uppy/utils": "^5.5.0", + "lodash": "^4.17.21", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^4.0.0", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/core/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@uppy/dashboard": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.5.2.tgz", + "integrity": "sha512-6CWhqqm93Uo2QpwYrDRCVrpxStCCK359Wr8CvaOi14BJrcE8JyPczXbrzHMzbjKt2Rz8G3TzQUa1r9nZkylrGQ==", + "dependencies": { + "@transloadit/prettier-bytes": "0.0.7", + "@uppy/informer": "^3.0.3", + "@uppy/provider-views": "^3.5.0", + "@uppy/status-bar": "^3.2.4", + "@uppy/thumbnail-generator": "^3.0.4", + "@uppy/utils": "^5.5.0", + "classnames": "^2.2.6", + "is-shallow-equal": "^1.0.1", + "lodash": "^4.17.21", + "memoize-one": "^6.0.0", + "nanoid": "^4.0.0", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.5.0" + } + }, + "node_modules/@uppy/dashboard/node_modules/@transloadit/prettier-bytes": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", + "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" + }, + "node_modules/@uppy/dashboard/node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/@uppy/dashboard/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@uppy/drag-drop": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-3.0.3.tgz", + "integrity": "sha512-0bCgQKxg+9vkxQipTgrX9yQIuK9a0hZrkipm1+Ynq6jTeig49b7II1bWYnoKdiYhi6nRE4UnDJf4z09yCAU7rA==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/file-input": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@uppy/file-input/-/file-input-3.0.3.tgz", + "integrity": "sha512-tYmbQIWjNPnKFFzBmZcNHFyMkfPAPSOrse+3qnmSWYzGKWaZfKP1zM0MiABZO/AH5X6hhLIQDRY8TsyiPfmJ9w==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/informer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@uppy/informer/-/informer-3.0.3.tgz", + "integrity": "sha512-jMMlZ0bCJ2ruJJ0LMl7pJrM/b0e9vjVEHvYYdQghnRSRDSMONcTJXEqNZ0Lu4x7OZR1SGvqqchFk7n3vAsuERw==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/progress-bar": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-3.0.3.tgz", + "integrity": "sha512-s0iRCnDQ5zcyk8ZyTF46W7Kkf9S1hH1oj2+GBYDdFzc72tgrx49arHs3YobkH7X9whhc/qTskLe32cyC9oe6ZQ==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/provider-views": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.5.0.tgz", + "integrity": "sha512-xSp5xQ6NsPLS2XJdsdBQCLgQELEd0BvVM2R34/XFyGTSqeA4NJKHfM6kSKwjW/jkj26CyFN5nth6CGeNaaKQ+w==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "classnames": "^2.2.6", + "nanoid": "^4.0.0", + "p-queue": "^7.3.4", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/provider-views/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@uppy/react": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/@uppy/react/-/react-3.1.3.tgz", + "integrity": "sha512-nzSpJ2PZ3lGp0wwGAxlvyIemUKE1HIITzLA9h6sUJLrweVndbXcZzxGvLm2M09l3lAE8LeybRo5Pnsn8adaH+w==", + "dependencies": { + "@uppy/utils": "^5.4.1", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "@uppy/core": "^3.3.1", + "@uppy/dashboard": "^3.4.2", + "@uppy/drag-drop": "^3.0.2", + "@uppy/file-input": "^3.0.2", + "@uppy/progress-bar": "^3.0.2", + "@uppy/status-bar": "^3.2.2", + "react": "^16.0.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@uppy/dashboard": { + "optional": true + }, + "@uppy/drag-drop": { + "optional": true + }, + "@uppy/file-input": { + "optional": true + }, + "@uppy/progress-bar": { + "optional": true + }, + "@uppy/status-bar": { + "optional": true + } + } + }, + "node_modules/@uppy/status-bar": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.2.4.tgz", + "integrity": "sha512-WuK0LRmz7H7iBDV0VO+iUNoXmhbyeCEAWzslX0nqhkGuMchIQprVwd80ZegACySajqcpV1RDNxdhmgtCbRn8wA==", + "dependencies": { + "@transloadit/prettier-bytes": "0.0.9", + "@uppy/utils": "^5.4.3", + "classnames": "^2.2.6", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/store-default": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.0.3.tgz", + "integrity": "sha512-/zlvQNj4HjkthI+7dNdj/8mOlTg1Zb1gJ/ZsOxof0g3xXD+OAwm7asRnOwpfj2dos+lExdW/zMn8XsRGsuvb6Q==" + }, + "node_modules/@uppy/thumbnail-generator": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.0.4.tgz", + "integrity": "sha512-f7E+4F6UWunX3jnV3wfL+k5zQaukKmD1z2qYbmRg5OuE9CxDJrNdAVk14KDAi79seejPJa6VVfCgGjTlIGLaRA==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "exifr": "^7.0.0" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/tus": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@uppy/tus/-/tus-3.2.0.tgz", + "integrity": "sha512-bKZhcxTV9S7GMKqluV2TCI79zWoDxxFNkU4UzQH9T0jXZboqxcvFt09DXA6+/2J9nYQK5REldCg3Ll7MUHJOQQ==", + "dependencies": { + "@uppy/companion-client": "^3.4.0", + "@uppy/utils": "^5.5.0", + "tus-js-client": "^3.0.0" + }, + "peerDependencies": { + "@uppy/core": "^3.5.0" + } + }, + "node_modules/@uppy/utils": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/@uppy/utils/-/utils-5.5.0.tgz", + "integrity": "sha512-hNeYEbihSq/dKK7CZ3euvv3pN2NAO0z1x2FFoZsTajSxY4f7PPOZJoltvOQEKx1vFljhLvOY33s3KNlvXjogqg==", + "dependencies": { + "lodash": "^4.17.21", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/webcam": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/@uppy/webcam/-/webcam-3.3.2.tgz", + "integrity": "sha512-3veSmmrU6wZnS1MquJk/jlqa16WIn/epad6j4u6awJDHLbNiU9fbgjaZBEcPF5loC1bXTJBQ9GUSy8OQYPE0GA==", + "dependencies": { + "@uppy/utils": "^5.4.3", + "is-mobile": "^3.1.1", + "preact": "^10.5.13" + }, + "peerDependencies": { + "@uppy/core": "^3.4.0" + } + }, + "node_modules/@uppy/xhr-upload": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-3.4.0.tgz", + "integrity": "sha512-JfJWYkV4NCkeDgS80XpSZwV6D7ssVgTeVckE/h96Sg+ehc7kXCb1aqurzOLZJJmuRiZZzcLpZEMRXYSu1tIPRQ==", + "dependencies": { + "@uppy/companion-client": "^3.4.0", + "@uppy/utils": "^5.5.0", + "nanoid": "^4.0.0" + }, + "peerDependencies": { + "@uppy/core": "^3.5.0" + } + }, + "node_modules/@uppy/xhr-upload/node_modules/nanoid": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz", + "integrity": "sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "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==", + "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==" + }, + "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==" + }, + "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==" + }, + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "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==" + }, + "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==", + "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==", + "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==", + "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==", + "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==", + "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==" + }, + "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==" + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead" + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "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==", + "deprecated": "package has been renamed to acorn-import-attributes", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-formats/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "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==", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "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==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/apexcharts": { + "version": "3.41.0", + "resolved": "https://registry.npmjs.org/apexcharts/-/apexcharts-3.41.0.tgz", + "integrity": "sha512-FJXA7NVjxs1q+ptR3b1I+pN8K/gWuXn+qLZjFz8EHvJOokdgcuwa/HSe5aC465HW/LWnrjWLSTsOQejQbQ42hQ==", + "dependencies": { + "svg.draggable.js": "^2.2.2", + "svg.easing.js": "^2.0.0", + "svg.filter.js": "^2.0.2", + "svg.pathmorphing.js": "^0.1.3", + "svg.resize.js": "^1.4.3", + "svg.select.js": "^3.0.1" + } + }, + "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==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/aria-hidden": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz", + "integrity": "sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.reduce": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz", + "integrity": "sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-array-method-boxes-properly": "^1.0.0", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==" + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" + }, + "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/at-least-node": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", + "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "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/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/axe-core": { + "version": "4.7.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", + "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/axios": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/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/axobject-query": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz", + "integrity": "sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/babel-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", + "integrity": "sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==", + "dependencies": { + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__core": "^7.1.14", + "babel-plugin-istanbul": "^6.1.1", + "babel-preset-jest": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.8.0" + } + }, + "node_modules/babel-jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-jest/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/babel-jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/babel-jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/babel-jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/babel-jest/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-loader": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", + "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^2.0.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-jest-hoist": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz", + "integrity": "sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==", + "dependencies": { + "@babel/template": "^7.3.3", + "@babel/types": "^7.3.3", + "@types/babel__core": "^7.0.0", + "@types/babel__traverse": "^7.0.6" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-named-asset-import": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz", + "integrity": "sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q==", + "peerDependencies": { + "@babel/core": "^7.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz", + "integrity": "sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA==", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.1", + "@nicolo-ribaudo/semver-v6": "^6.3.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/@nicolo-ribaudo/semver-v6": { + "version": "6.3.3", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz", + "integrity": "sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz", + "integrity": "sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.1", + "core-js-compat": "^3.31.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz", + "integrity": "sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw==", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.4.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-transform-react-remove-prop-types": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz", + "integrity": "sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA==" + }, + "node_modules/babel-preset-current-node-syntax": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", + "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", + "dependencies": { + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-bigint": "^7.8.3", + "@babel/plugin-syntax-class-properties": "^7.8.3", + "@babel/plugin-syntax-import-meta": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.8.3", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-top-level-await": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz", + "integrity": "sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==", + "dependencies": { + "babel-plugin-jest-hoist": "^27.5.1", + "babel-preset-current-node-syntax": "^1.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/babel-preset-react-app": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz", + "integrity": "sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.4", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-transform-flow-strip-types": "^7.16.0", + "@babel/plugin-transform-react-display-name": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.16.4", + "@babel/preset-env": "^7.16.4", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.16.0", + "@babel/runtime": "^7.16.3", + "babel-plugin-macros": "^3.1.0", + "babel-plugin-transform-react-remove-prop-types": "^0.4.24" + } + }, + "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==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "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/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/bfj": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz", + "integrity": "sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw==", + "dependencies": { + "bluebird": "^3.5.5", + "check-types": "^11.1.1", + "hoopy": "^0.1.4", + "tryer": "^1.0.1" + }, + "engines": { + "node": ">= 8.0.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==", + "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==", + "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==" + }, + "node_modules/body-parser": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/bonjour-service": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz", + "integrity": "sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg==", + "dependencies": { + "array-flatten": "^2.1.2", + "dns-equal": "^1.0.0", + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "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==" + }, + "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==", + "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==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browserslist": { + "version": "4.21.9", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz", + "integrity": "sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg==", + "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.30001503", + "electron-to-chromium": "^1.4.431", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bser": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", + "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", + "dependencies": { + "node-int64": "^0.4.0" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "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": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "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==" + }, + "node_modules/builtin-modules": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz", + "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/can-use-dom": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", + "integrity": "sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ==" + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz", + "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001513", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz", + "integrity": "sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww==", + "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/case-sensitive-paths-webpack-plugin": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz", + "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk/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==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", + "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz", + "integrity": "sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz", + "integrity": "sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz", + "integrity": "sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/check-types": { + "version": "11.2.2", + "resolved": "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz", + "integrity": "sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "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==", + "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==", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", + "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } + }, + "node_modules/cjs-module-lexer": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==" + }, + "node_modules/classnames": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz", + "integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw==" + }, + "node_modules/clean-css": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz", + "integrity": "sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clsx": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz", + "integrity": "sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/coa": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz", + "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==", + "dependencies": { + "@types/q": "^1.5.1", + "chalk": "^2.4.1", + "q": "^1.1.2" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/collect-v8-coverage": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==" + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==" + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + }, + "node_modules/combine-errors": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz", + "integrity": "sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q==", + "dependencies": { + "custom-error-instance": "2.1.1", + "lodash.uniqby": "4.5.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/comma-separated-tokens": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz", + "integrity": "sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "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==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/confusing-browser-globals": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", + "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==" + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz", + "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/core-js": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz", + "integrity": "sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz", + "integrity": "sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA==", + "dependencies": { + "browserslist": "^4.21.9" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.31.1", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz", + "integrity": "sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-declaration-sorter": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz", + "integrity": "sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew==", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.21", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.3", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.3.8" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz", + "integrity": "sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q==", + "dependencies": { + "cssnano": "^5.0.6", + "jest-worker": "^27.0.2", + "postcss": "^8.3.5", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/css-minimizer-webpack-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz", + "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^3.2.1", + "domutils": "^1.7.0", + "nth-check": "^1.0.2" + } + }, + "node_modules/css-select-base-adapter": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz", + "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==" + }, + "node_modules/css-tree": { + "version": "1.0.0-alpha.37", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz", + "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==", + "dependencies": { + "mdn-data": "2.0.4", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-tree/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-vendor": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz", + "integrity": "sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ==", + "dependencies": { + "@babel/runtime": "^7.8.3", + "is-in-browser": "^1.0.2" + } + }, + "node_modules/css-what": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz", + "integrity": "sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css.escape": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", + "integrity": "sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==" + }, + "node_modules/cssdb": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz", + "integrity": "sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + } + ] + }, + "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==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "5.1.15", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz", + "integrity": "sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw==", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-preset-default": { + "version": "5.2.14", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz", + "integrity": "sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A==", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/cssnano-utils": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz", + "integrity": "sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/csso": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", + "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/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==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/csso/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==" + }, + "node_modules/csso/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "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/custom-error-instance": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz", + "integrity": "sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg==" + }, + "node_modules/damerau-levenshtein": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", + "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==" + }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=0.11" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/date-fns" + } + }, + "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==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==" + }, + "node_modules/dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==" + }, + "node_modules/deep-equal": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz", + "integrity": "sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.0", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz", + "integrity": "sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" + }, + "node_modules/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz", + "integrity": "sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q==", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/diff-sequences": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz", + "integrity": "sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" + }, + "node_modules/dns-packet": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz", + "integrity": "sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ==", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom-accessibility-api": { + "version": "0.5.16", + "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", + "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==" + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", + "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, + "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==", + "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==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domelementtype": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz", + "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==" + }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domhandler/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domutils": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz", + "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==", + "dependencies": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", + "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "engines": { + "node": ">=10" + } + }, + "node_modules/dotenv-expand": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", + "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.453", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.453.tgz", + "integrity": "sha512-BU8UtQz6CB3T7RIGhId4BjmjJVXQDujb0+amGL8jpcluFJr6lwspBOvkUbnttfpZCm4zFMHmjrX1QrdPWBBMjQ==" + }, + "node_modules/emitter-component": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz", + "integrity": "sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ==" + }, + "node_modules/emittery": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", + "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-cmd": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz", + "integrity": "sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA==", + "dependencies": { + "commander": "^4.0.0", + "cross-spawn": "^7.0.0" + }, + "bin": { + "env-cmd": "bin/env-cmd.js" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/env-cmd/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/error-stack-parser": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz", + "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==", + "dependencies": { + "stackframe": "^1.3.4" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", + "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==" + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/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==", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-prettier": { + "version": "8.8.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", + "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-config-react-app": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz", + "integrity": "sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA==", + "dependencies": { + "@babel/core": "^7.16.0", + "@babel/eslint-parser": "^7.16.3", + "@rushstack/eslint-patch": "^1.1.0", + "@typescript-eslint/eslint-plugin": "^5.5.0", + "@typescript-eslint/parser": "^5.5.0", + "babel-preset-react-app": "^10.0.1", + "confusing-browser-globals": "^1.0.11", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.25.3", + "eslint-plugin-jest": "^25.3.0", + "eslint-plugin-jsx-a11y": "^6.5.1", + "eslint-plugin-react": "^7.27.1", + "eslint-plugin-react-hooks": "^4.3.0", + "eslint-plugin-testing-library": "^5.0.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-flowtype": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz", + "integrity": "sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ==", + "dependencies": { + "lodash": "^4.17.21", + "string-natural-compare": "^3.0.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@babel/plugin-syntax-flow": "^7.14.5", + "@babel/plugin-transform-react-jsx": "^7.14.9", + "eslint": "^8.1.0" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-jest": { + "version": "25.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz", + "integrity": "sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ==", + "dependencies": { + "@typescript-eslint/experimental-utils": "^5.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/eslint-plugin": "^4.0.0 || ^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "jest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-jsx-a11y": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", + "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", + "dependencies": { + "@babel/runtime": "^7.20.7", + "aria-query": "^5.1.3", + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "ast-types-flow": "^0.0.7", + "axe-core": "^4.6.2", + "axobject-query": "^3.1.1", + "damerau-levenshtein": "^1.0.8", + "emoji-regex": "^9.2.2", + "has": "^1.0.3", + "jsx-ast-utils": "^3.3.3", + "language-tags": "=1.0.5", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=4.0" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz", + "integrity": "sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": ">=7.28.0", + "prettier": ">=2.0.0" + }, + "peerDependenciesMeta": { + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", + "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dependencies": { + "is-core-module": "^2.9.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/eslint-plugin-react/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-testing-library": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz", + "integrity": "sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q==", + "dependencies": { + "@typescript-eslint/utils": "^5.58.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0", + "npm": ">=6" + }, + "peerDependencies": { + "eslint": "^7.5.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-webpack-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz", + "integrity": "sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w==", + "dependencies": { + "@types/eslint": "^7.29.0 || ^8.4.1", + "jest-worker": "^28.0.2", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/eslint-webpack-plugin/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/jest-worker": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz", + "integrity": "sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/eslint-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/eslint-webpack-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/eslint-webpack-plugin/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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==", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz", + "integrity": "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/exifr": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz", + "integrity": "sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw==" + }, + "node_modules/exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/expect": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz", + "integrity": "sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g==", + "dependencies": { + "@jest/expect-utils": "^29.6.1", + "@types/node": "*", + "jest-get-type": "^29.4.3", + "jest-matcher-utils": "^29.6.1", + "jest-message-util": "^29.6.1", + "jest-util": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/express": { + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "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==" + }, + "node_modules/fast-diff": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz", + "integrity": "sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==", + "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==", + "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==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "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==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz", + "integrity": "sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA==", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/fb-watchman": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", + "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", + "dependencies": { + "bser": "2.1.1" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz", + "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/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==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "resolved": "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz", + "integrity": "sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "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==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz", + "integrity": "sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ==", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz", + "integrity": "sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg==", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz", + "integrity": "sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A==", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/format": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/format/-/format-0.2.2.tgz", + "integrity": "sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/formik": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/formik/-/formik-2.4.2.tgz", + "integrity": "sha512-C6nx0hifW2uENP3M6HpPmnAE6HFWCcd8/sqBZEOHZY6lpHJ5qehsfAy43ktpFLEmkBmhiZDei726utcUB9leqg==", + "funding": [ + { + "type": "individual", + "url": "https://opencollective.com/formik" + } + ], + "dependencies": { + "deepmerge": "^2.1.1", + "hoist-non-react-statics": "^3.3.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "react-fast-compare": "^2.0.1", + "tiny-warning": "^1.0.2", + "tslib": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/framer-motion": { + "version": "7.10.3", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-7.10.3.tgz", + "integrity": "sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w==", + "dependencies": { + "@motionone/dom": "^10.15.3", + "hey-listen": "^1.0.8", + "tslib": "2.4.0" + }, + "optionalDependencies": { + "@emotion/is-prop-valid": "^0.8.2" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/framer-motion/node_modules/@emotion/is-prop-valid": { + "version": "0.8.8", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz", + "integrity": "sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA==", + "optional": true, + "dependencies": { + "@emotion/memoize": "0.7.4" + } + }, + "node_modules/framer-motion/node_modules/@emotion/memoize": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz", + "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", + "optional": true + }, + "node_modules/framer-motion/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "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==", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz", + "integrity": "sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ==" + }, + "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==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz", + "integrity": "sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g==" + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/get-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "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==", + "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==" + }, + "node_modules/global-modules": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", + "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", + "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==" + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz", + "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" + }, + "node_modules/harmony-reflect": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz", + "integrity": "sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz", + "integrity": "sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz", + "integrity": "sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w==", + "dependencies": { + "@types/hast": "^2.0.0", + "comma-separated-tokens": "^1.0.0", + "hast-util-parse-selector": "^2.0.0", + "property-information": "^5.0.0", + "space-separated-tokens": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "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==", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hey-listen": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz", + "integrity": "sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==" + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/history": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/history/-/history-5.3.0.tgz", + "integrity": "sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ==", + "dependencies": { + "@babel/runtime": "^7.7.6" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hoopy": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz", + "integrity": "sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ==", + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/html-entities": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", + "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ] + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==" + }, + "node_modules/html-minifier-terser": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", + "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-parse-stringify": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz", + "integrity": "sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg==", + "dependencies": { + "void-elements": "3.1.0" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz", + "integrity": "sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg==", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "webpack": "^5.20.0" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/htmlparser2/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==", + "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/htmlparser2/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/htmlparser2/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/hyphenate-style-name": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz", + "integrity": "sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==" + }, + "node_modules/i18next": { + "version": "23.5.1", + "resolved": "https://registry.npmjs.org/i18next/-/i18next-23.5.1.tgz", + "integrity": "sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg==", + "funding": [ + { + "type": "individual", + "url": "https://locize.com" + }, + { + "type": "individual", + "url": "https://locize.com/i18next.html" + }, + { + "type": "individual", + "url": "https://www.i18next.com/how-to/faq#i18next-is-awesome.-how-can-i-support-the-project" + } + ], + "dependencies": { + "@babel/runtime": "^7.22.5" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/idb": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz", + "integrity": "sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ==" + }, + "node_modules/identity-obj-proxy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz", + "integrity": "sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA==", + "dependencies": { + "harmony-reflect": "^1.4.6" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "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/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-local": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", + "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "dependencies": { + "pkg-dir": "^4.2.0", + "resolve-cwd": "^3.0.0" + }, + "bin": { + "import-local-fixture": "fixtures/cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "engines": { + "node": ">=8" + } + }, + "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==", + "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", + "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==" + }, + "node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/intl-messageformat": { + "version": "10.5.3", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.3.tgz", + "integrity": "sha512-TzKn1uhJBMyuKTO4zUX47SU+d66fu1W9tVzIiZrQ6hBqQQeYscBMIzKL/qEXnFbJrH9uU5VV3+T5fWib4SIcKA==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/fast-memoize": "2.2.0", + "@formatjs/icu-messageformat-parser": "2.6.2", + "tslib": "^2.4.0" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", + "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz", + "integrity": "sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz", + "integrity": "sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==", + "dependencies": { + "is-alphabetical": "^1.0.0", + "is-decimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz", + "integrity": "sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", + "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", + "engines": { + "node": ">=6" + } + }, + "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==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz", + "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-in-browser": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", + "integrity": "sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g==" + }, + "node_modules/is-map": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", + "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-mobile": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/is-mobile/-/is-mobile-3.1.1.tgz", + "integrity": "sha512-RRoXXR2HNFxNkUnxtaBdGBXtFlUMFa06S0NUKf/LCF+MuGLu13gi9iBCkoEmc6+rpXuwi5Mso5V8Zf7mNynMBQ==" + }, + "node_modules/is-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz", + "integrity": "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g==" + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz", + "integrity": "sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz", + "integrity": "sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-set": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", + "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shallow-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz", + "integrity": "sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ==" + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakmap": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", + "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", + "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", + "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", + "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake": { + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jake/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", + "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", + "dependencies": { + "@jest/core": "^27.5.1", + "import-local": "^3.0.2", + "jest-cli": "^27.5.1" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest-changed-files": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz", + "integrity": "sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==", + "dependencies": { + "@jest/types": "^27.5.1", + "execa": "^5.0.0", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-changed-files/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-changed-files/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-changed-files/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-changed-files/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-changed-files/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz", + "integrity": "sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "dedent": "^0.7.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-circus/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-circus/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-circus/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-circus/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-circus/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-circus/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-circus/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz", + "integrity": "sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==", + "dependencies": { + "@babel/core": "^7.8.0", + "@jest/test-sequencer": "^27.5.1", + "@jest/types": "^27.5.1", + "babel-jest": "^27.5.1", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "deepmerge": "^4.2.2", + "glob": "^7.1.1", + "graceful-fs": "^4.2.9", + "jest-circus": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-jasmine2": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runner": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "micromatch": "^4.0.4", + "parse-json": "^5.2.0", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "ts-node": { + "optional": true + } + } + }, + "node_modules/jest-config/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-config/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-config/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-config/node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-config/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-config/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-config/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-config/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-config/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz", + "integrity": "sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.4.3", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-diff/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-diff/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-diff/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-diff/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-diff/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-docblock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz", + "integrity": "sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==", + "dependencies": { + "detect-newline": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz", + "integrity": "sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-each/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-each/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-each/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-each/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-each/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-each/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-each/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz", + "integrity": "sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1", + "jsdom": "^16.6.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-jsdom/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-environment-jsdom/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-jsdom/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-jsdom/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz", + "integrity": "sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "jest-mock": "^27.5.1", + "jest-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-environment-node/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-environment-node/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-environment-node/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-environment-node/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-environment-node/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-get-type": { + "version": "29.4.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz", + "integrity": "sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg==", + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-haste-map": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz", + "integrity": "sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/graceful-fs": "^4.1.2", + "@types/node": "*", + "anymatch": "^3.0.3", + "fb-watchman": "^2.0.0", + "graceful-fs": "^4.2.9", + "jest-regex-util": "^27.5.1", + "jest-serializer": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "micromatch": "^4.0.4", + "walker": "^1.0.7" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + } + }, + "node_modules/jest-haste-map/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-haste-map/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-haste-map/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-haste-map/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-haste-map/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-haste-map/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz", + "integrity": "sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "co": "^4.6.0", + "expect": "^27.5.1", + "is-generator-fn": "^2.0.0", + "jest-each": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "pretty-format": "^27.5.1", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-jasmine2/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-jasmine2/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-jasmine2/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-jasmine2/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-jasmine2/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-leak-detector": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz", + "integrity": "sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==", + "dependencies": { + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-leak-detector/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-leak-detector/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-matcher-utils": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz", + "integrity": "sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.6.1", + "jest-get-type": "^29.4.3", + "pretty-format": "^29.6.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-matcher-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-matcher-utils/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-matcher-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz", + "integrity": "sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.6.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.6.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-message-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-message-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-message-util/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-message-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz", + "integrity": "sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-mock/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-mock/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-mock/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-mock/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-mock/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-mock/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-pnp-resolver": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", + "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", + "engines": { + "node": ">=6" + }, + "peerDependencies": { + "jest-resolve": "*" + }, + "peerDependenciesMeta": { + "jest-resolve": { + "optional": true + } + } + }, + "node_modules/jest-regex-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz", + "integrity": "sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz", + "integrity": "sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==", + "dependencies": { + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-pnp-resolver": "^1.2.2", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "resolve": "^1.20.0", + "resolve.exports": "^1.1.0", + "slash": "^3.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz", + "integrity": "sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-snapshot": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-resolve-dependencies/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve-dependencies/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-resolve/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-resolve/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-resolve/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-resolve/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-resolve/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-resolve/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz", + "integrity": "sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==", + "dependencies": { + "@jest/console": "^27.5.1", + "@jest/environment": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "emittery": "^0.8.1", + "graceful-fs": "^4.2.9", + "jest-docblock": "^27.5.1", + "jest-environment-jsdom": "^27.5.1", + "jest-environment-node": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-leak-detector": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-runtime": "^27.5.1", + "jest-util": "^27.5.1", + "jest-worker": "^27.5.1", + "source-map-support": "^0.5.6", + "throat": "^6.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runner/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runner/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-runner/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runner/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runner/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runner/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-runner/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz", + "integrity": "sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==", + "dependencies": { + "@jest/environment": "^27.5.1", + "@jest/fake-timers": "^27.5.1", + "@jest/globals": "^27.5.1", + "@jest/source-map": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "cjs-module-lexer": "^1.0.0", + "collect-v8-coverage": "^1.0.0", + "execa": "^5.0.0", + "glob": "^7.1.3", + "graceful-fs": "^4.2.9", + "jest-haste-map": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-mock": "^27.5.1", + "jest-regex-util": "^27.5.1", + "jest-resolve": "^27.5.1", + "jest-snapshot": "^27.5.1", + "jest-util": "^27.5.1", + "slash": "^3.0.0", + "strip-bom": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-runtime/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-runtime/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-runtime/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-runtime/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-runtime/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-runtime/node_modules/strip-bom": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", + "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-runtime/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-serializer": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz", + "integrity": "sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==", + "dependencies": { + "@types/node": "*", + "graceful-fs": "^4.2.9" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz", + "integrity": "sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==", + "dependencies": { + "@babel/core": "^7.7.2", + "@babel/generator": "^7.7.2", + "@babel/plugin-syntax-typescript": "^7.7.2", + "@babel/traverse": "^7.7.2", + "@babel/types": "^7.0.0", + "@jest/transform": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/babel__traverse": "^7.0.4", + "@types/prettier": "^2.1.5", + "babel-preset-current-node-syntax": "^1.0.0", + "chalk": "^4.0.0", + "expect": "^27.5.1", + "graceful-fs": "^4.2.9", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-haste-map": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1", + "jest-util": "^27.5.1", + "natural-compare": "^1.4.0", + "pretty-format": "^27.5.1", + "semver": "^7.3.2" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-snapshot/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-snapshot/node_modules/diff-sequences": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz", + "integrity": "sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/expect": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz", + "integrity": "sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==", + "dependencies": { + "@jest/types": "^27.5.1", + "jest-get-type": "^27.5.1", + "jest-matcher-utils": "^27.5.1", + "jest-message-util": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-snapshot/node_modules/jest-diff": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz", + "integrity": "sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==", + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-matcher-utils": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz", + "integrity": "sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==", + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^27.5.1", + "jest-get-type": "^27.5.1", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-message-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz", + "integrity": "sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^27.5.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^27.5.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-snapshot/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-snapshot/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-snapshot/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz", + "integrity": "sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg==", + "dependencies": { + "@jest/types": "^29.6.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-util/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-util/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-util/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-util/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz", + "integrity": "sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==", + "dependencies": { + "@jest/types": "^27.5.1", + "camelcase": "^6.2.0", + "chalk": "^4.0.0", + "jest-get-type": "^27.5.1", + "leven": "^3.1.0", + "pretty-format": "^27.5.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-validate/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-validate/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-validate/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-validate/node_modules/jest-get-type": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz", + "integrity": "sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==", + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz", + "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", + "dependencies": { + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^17.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-validate/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-validate/node_modules/react-is": { + "version": "17.0.2", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", + "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==" + }, + "node_modules/jest-validate/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz", + "integrity": "sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw==", + "dependencies": { + "ansi-escapes": "^4.3.1", + "chalk": "^4.0.0", + "jest-regex-util": "^28.0.0", + "jest-watcher": "^28.0.0", + "slash": "^4.0.0", + "string-length": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "jest": "^27.0.0 || ^28.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz", + "integrity": "sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "jest-message-util": "^28.1.3", + "jest-util": "^28.1.3", + "slash": "^3.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/console/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/schemas": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz", + "integrity": "sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg==", + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/test-result": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz", + "integrity": "sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg==", + "dependencies": { + "@jest/console": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "collect-v8-coverage": "^1.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@jest/types": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz", + "integrity": "sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, + "node_modules/jest-watch-typeahead/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-watch-typeahead/node_modules/emittery": { + "version": "0.10.2", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz", + "integrity": "sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sindresorhus/emittery?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz", + "integrity": "sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g==", + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^28.1.3", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^28.1.3", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-message-util/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-regex-util": { + "version": "28.0.2", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz", + "integrity": "sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw==", + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-util": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz", + "integrity": "sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ==", + "dependencies": { + "@jest/types": "^28.1.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz", + "integrity": "sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g==", + "dependencies": { + "@jest/test-result": "^28.1.3", + "@jest/types": "^28.1.3", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "emittery": "^0.10.2", + "jest-util": "^28.1.3", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jest-watch-typeahead/node_modules/jest-watcher/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format": { + "version": "28.1.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz", + "integrity": "sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q==", + "dependencies": { + "@jest/schemas": "^28.1.3", + "ansi-regex": "^5.0.1", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || ^16.10.0 || >=17.0.0" + } + }, + "node_modules/jest-watch-typeahead/node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/jest-watch-typeahead/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz", + "integrity": "sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow==", + "dependencies": { + "char-regex": "^2.0.0", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/jest-watch-typeahead/node_modules/string-length/node_modules/char-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz", + "integrity": "sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw==", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/jest-watch-typeahead/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz", + "integrity": "sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==", + "dependencies": { + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "@types/node": "*", + "ansi-escapes": "^4.2.1", + "chalk": "^4.0.0", + "jest-util": "^27.5.1", + "string-length": "^4.0.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest-watcher/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest-watcher/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest-watcher/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest-watcher/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-watcher/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest-watcher/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/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==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jest/node_modules/@jest/types": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz", + "integrity": "sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^16.0.0", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest/node_modules/@types/yargs": { + "version": "16.0.5", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", + "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/jest/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jest/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jest/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jest/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/jest/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/jest/node_modules/jest-cli": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz", + "integrity": "sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==", + "dependencies": { + "@jest/core": "^27.5.1", + "@jest/test-result": "^27.5.1", + "@jest/types": "^27.5.1", + "chalk": "^4.0.0", + "exit": "^0.1.2", + "graceful-fs": "^4.2.9", + "import-local": "^3.0.2", + "jest-config": "^27.5.1", + "jest-util": "^27.5.1", + "jest-validate": "^27.5.1", + "prompts": "^2.0.1", + "yargs": "^16.2.0" + }, + "bin": { + "jest": "bin/jest.js" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + }, + "peerDependencies": { + "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" + }, + "peerDependenciesMeta": { + "node-notifier": { + "optional": true + } + } + }, + "node_modules/jest/node_modules/jest-util": { + "version": "27.5.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz", + "integrity": "sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==", + "dependencies": { + "@jest/types": "^27.5.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0" + } + }, + "node_modules/jest/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jiti": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz", + "integrity": "sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-base64": { + "version": "3.7.5", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz", + "integrity": "sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==" + }, + "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/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "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==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "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==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpointer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz", + "integrity": "sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jss": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz", + "integrity": "sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "csstype": "^3.0.2", + "is-in-browser": "^1.1.3", + "tiny-warning": "^1.0.2" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/jss" + } + }, + "node_modules/jss-plugin-camel-case": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz", + "integrity": "sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "hyphenate-style-name": "^1.0.3", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-default-unit": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz", + "integrity": "sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-global": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz", + "integrity": "sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-nested": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz", + "integrity": "sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-props-sort": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz", + "integrity": "sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0" + } + }, + "node_modules/jss-plugin-rule-value-function": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz", + "integrity": "sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "jss": "10.10.0", + "tiny-warning": "^1.0.2" + } + }, + "node_modules/jss-plugin-vendor-prefixer": { + "version": "10.10.0", + "resolved": "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz", + "integrity": "sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "css-vendor": "^2.0.8", + "jss": "10.10.0" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/jwt-decode": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz", + "integrity": "sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A==" + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", + "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", + "engines": { + "node": ">=6" + } + }, + "node_modules/klona": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz", + "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/language-subtag-registry": { + "version": "0.3.22", + "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", + "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==" + }, + "node_modules/language-tags": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", + "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", + "dependencies": { + "language-subtag-registry": "~0.3.2" + } + }, + "node_modules/launch-editor": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz", + "integrity": "sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ==", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.7.3" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "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==" + }, + "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==", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz", + "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/lodash._baseiteratee": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz", + "integrity": "sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ==", + "dependencies": { + "lodash._stringtopath": "~4.8.0" + } + }, + "node_modules/lodash._basetostring": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz", + "integrity": "sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw==" + }, + "node_modules/lodash._baseuniq": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz", + "integrity": "sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A==", + "dependencies": { + "lodash._createset": "~4.0.0", + "lodash._root": "~3.0.0" + } + }, + "node_modules/lodash._createset": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz", + "integrity": "sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA==" + }, + "node_modules/lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ==" + }, + "node_modules/lodash._stringtopath": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz", + "integrity": "sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ==", + "dependencies": { + "lodash._basetostring": "~4.12.0" + } + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", + "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" + }, + "node_modules/lodash.sortby": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz", + "integrity": "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==" + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/lodash.uniqby": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz", + "integrity": "sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ==", + "dependencies": { + "lodash._baseiteratee": "~4.7.0", + "lodash._baseuniq": "~4.6.0" + } + }, + "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/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowlight": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz", + "integrity": "sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw==", + "dependencies": { + "fault": "^1.0.0", + "highlight.js": "~10.7.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/lz-string": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz", + "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", + "bin": { + "lz-string": "bin/bin.js" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/makeerror": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", + "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", + "dependencies": { + "tmpl": "1.0.5" + } + }, + "node_modules/mdn-data": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", + "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz", + "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/memoize-one": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz", + "integrity": "sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "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==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "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-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "dependencies": { + "wildcard": "^1.1.0" + } + }, + "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/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "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==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moment": { + "version": "2.29.4", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz", + "integrity": "sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==", + "engines": { + "node": "*" + } + }, + "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==" + }, + "node_modules/mui-file-input": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/mui-file-input/-/mui-file-input-3.0.2.tgz", + "integrity": "sha512-58Jp3+f5MUXjhZjlLfYFOEOBICnLoFC4x0G1+y411JsGBjZQ1lgICv7KQVgP5aF+IRvhJ1vfI6KpbnmqwRKXoA==", + "dependencies": { + "pretty-bytes": "^6.1.1" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/icons-material": "^5.0.0", + "@mui/material": "^5.0.0", + "@types/react": "^18.0.0", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/mui-file-input/node_modules/pretty-bytes": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz", + "integrity": "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mui-image": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/mui-image/-/mui-image-1.0.7.tgz", + "integrity": "sha512-U79TWMKMfMC1ZiGnv/M+SaVJeUpubEjXOdy7w53RsvidUAMZ+4nW+QmDG9yg5fgWeYy6YJgLHyI9BHSDw76iIg==", + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "@mui/material": "^5.0.1", + "prop-types": "^15.7.2", + "react": "^17.0.2 || ^18.0.0" + } + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", + "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" + }, + "node_modules/nanoclone": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz", + "integrity": "sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "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/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==" + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "engines": { + "node": ">= 0.6" + } + }, + "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==" + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-int64": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", + "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz", + "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==", + "dependencies": { + "boolbase": "~1.0.0" + } + }, + "node_modules/nwsapi": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==" + }, + "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==", + "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==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.getownpropertydescriptors": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz", + "integrity": "sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ==", + "dependencies": { + "array.prototype.reduce": "^1.0.5", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.21.2", + "safe-array-concat": "^1.0.0" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "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==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz", + "integrity": "sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA==", + "dependencies": { + "eventemitter3": "^5.0.1", + "p-timeout": "^5.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-queue/node_modules/eventemitter3": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", + "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==" + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", + "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz", + "integrity": "sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==", + "dependencies": { + "character-entities": "^1.0.0", + "character-entities-legacy": "^1.0.0", + "character-reference-invalid": "^1.0.0", + "is-alphanumerical": "^1.0.0", + "is-decimal": "^1.0.0", + "is-hexadecimal": "^1.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "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==" + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/perfect-scrollbar": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz", + "integrity": "sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g==" + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "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==", + "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==", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-dir/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-dir/node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.25", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz", + "integrity": "sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw==", + "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-attribute-case-insensitive": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz", + "integrity": "sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-browser-comments": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz", + "integrity": "sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg==", + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "browserslist": ">=4", + "postcss": ">=8" + } + }, + "node_modules/postcss-calc": { + "version": "8.2.4", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz", + "integrity": "sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-clamp": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz", + "integrity": "sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": ">=7.6.0" + }, + "peerDependencies": { + "postcss": "^8.4.6" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz", + "integrity": "sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz", + "integrity": "sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz", + "integrity": "sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-colormin": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz", + "integrity": "sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-convert-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz", + "integrity": "sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz", + "integrity": "sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz", + "integrity": "sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz", + "integrity": "sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz", + "integrity": "sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-discard-comments": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz", + "integrity": "sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz", + "integrity": "sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-empty": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz", + "integrity": "sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz", + "integrity": "sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz", + "integrity": "sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-flexbugs-fixes": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz", + "integrity": "sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ==", + "peerDependencies": { + "postcss": "^8.1.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz", + "integrity": "sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz", + "integrity": "sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "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==", + "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-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "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==", + "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-lab-function": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz", + "integrity": "sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w==", + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "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/yaml": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz", + "integrity": "sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz", + "integrity": "sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-merge-rules": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz", + "integrity": "sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz", + "integrity": "sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz", + "integrity": "sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-params": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz", + "integrity": "sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw==", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz", + "integrity": "sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz", + "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "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==", + "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-nesting": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz", + "integrity": "sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA==", + "dependencies": { + "@csstools/selector-specificity": "^2.0.0", + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-normalize": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz", + "integrity": "sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA==", + "dependencies": { + "@csstools/normalize.css": "*", + "postcss-browser-comments": "^4", + "sanitize.css": "*" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "browserslist": ">= 4", + "postcss": ">= 8" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz", + "integrity": "sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz", + "integrity": "sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz", + "integrity": "sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz", + "integrity": "sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-string": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz", + "integrity": "sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz", + "integrity": "sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz", + "integrity": "sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz", + "integrity": "sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz", + "integrity": "sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-opacity-percentage": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz", + "integrity": "sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A==", + "funding": [ + { + "type": "kofi", + "url": "https://ko-fi.com/mrcgrtz" + }, + { + "type": "liberapay", + "url": "https://liberapay.com/mrcgrtz" + } + ], + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-ordered-values": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz", + "integrity": "sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz", + "integrity": "sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.5", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz", + "integrity": "sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz", + "integrity": "sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag==", + "dependencies": { + "@csstools/postcss-cascade-layers": "^1.1.1", + "@csstools/postcss-color-function": "^1.1.1", + "@csstools/postcss-font-format-keywords": "^1.0.1", + "@csstools/postcss-hwb-function": "^1.0.2", + "@csstools/postcss-ic-unit": "^1.0.1", + "@csstools/postcss-is-pseudo-class": "^2.0.7", + "@csstools/postcss-nested-calc": "^1.0.0", + "@csstools/postcss-normalize-display-values": "^1.0.1", + "@csstools/postcss-oklab-function": "^1.1.1", + "@csstools/postcss-progressive-custom-properties": "^1.3.0", + "@csstools/postcss-stepped-value-functions": "^1.0.1", + "@csstools/postcss-text-decoration-shorthand": "^1.0.0", + "@csstools/postcss-trigonometric-functions": "^1.0.2", + "@csstools/postcss-unset-value": "^1.0.2", + "autoprefixer": "^10.4.13", + "browserslist": "^4.21.4", + "css-blank-pseudo": "^3.0.3", + "css-has-pseudo": "^3.0.4", + "css-prefers-color-scheme": "^6.0.3", + "cssdb": "^7.1.0", + "postcss-attribute-case-insensitive": "^5.0.2", + "postcss-clamp": "^4.1.0", + "postcss-color-functional-notation": "^4.2.4", + "postcss-color-hex-alpha": "^8.0.4", + "postcss-color-rebeccapurple": "^7.1.1", + "postcss-custom-media": "^8.0.2", + "postcss-custom-properties": "^12.1.10", + "postcss-custom-selectors": "^6.0.3", + "postcss-dir-pseudo-class": "^6.0.5", + "postcss-double-position-gradients": "^3.1.2", + "postcss-env-function": "^4.0.6", + "postcss-focus-visible": "^6.0.4", + "postcss-focus-within": "^5.0.4", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.5", + "postcss-image-set-function": "^4.0.7", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.2.1", + "postcss-logical": "^5.0.4", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.2.0", + "postcss-opacity-percentage": "^1.1.2", + "postcss-overflow-shorthand": "^3.0.4", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.5", + "postcss-pseudo-class-any-link": "^7.1.6", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz", + "integrity": "sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz", + "integrity": "sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg==", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz", + "integrity": "sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz", + "integrity": "sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.2" + } + }, + "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==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-svgo": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz", + "integrity": "sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/postcss-svgo/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==", + "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/postcss-svgo/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==", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/postcss-svgo/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==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/postcss-svgo/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==", + "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/postcss-svgo/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/postcss-svgo/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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/postcss-svgo/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==" + }, + "node_modules/postcss-svgo/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==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/postcss-svgo/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/postcss-svgo/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==", + "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/postcss-unique-selectors": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz", + "integrity": "sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "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==" + }, + "node_modules/preact": { + "version": "10.17.1", + "resolved": "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz", + "integrity": "sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/preact" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-linter-helpers": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", + "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "dev": true, + "dependencies": { + "fast-diff": "^1.1.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", + "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-format": { + "version": "29.6.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz", + "integrity": "sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog==", + "dependencies": { + "@jest/schemas": "^29.6.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/pretty-format/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, + "node_modules/prompts": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", + "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/proper-lockfile": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz", + "integrity": "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==", + "dependencies": { + "graceful-fs": "^4.2.4", + "retry": "^0.12.0", + "signal-exit": "^3.0.2" + } + }, + "node_modules/proper-lockfile/node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/property-expr": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz", + "integrity": "sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA==" + }, + "node_modules/property-information": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz", + "integrity": "sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA==", + "dependencies": { + "xtend": "^4.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "engines": { + "node": ">= 0.10" + } + }, + "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/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "deprecated": "You or someone you depend on is using Q, the JavaScript Promise library that gave JavaScript developers strong feelings about promises. They can almost certainly migrate to the native JavaScript promise now. Thank you literally everyone for joining me in this bet against the odds. Be excellent to each other.\n\n(For a CapTP with native promises, see @endo/eventual-send and @endo/captp)", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==" + }, + "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==", + "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/raf": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz", + "integrity": "sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA==", + "dependencies": { + "performance-now": "^2.1.0" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc-util": { + "version": "5.34.1", + "resolved": "https://registry.npmjs.org/rc-util/-/rc-util-5.34.1.tgz", + "integrity": "sha512-SqiUT8Ssgh5C+hu4y887xwCrMNcxLm6ScOo8AFlWYYF3z9uNNiPpwwSjvicqOlWd79rNw1g44rnP7tz9MrO1ZQ==", + "dependencies": { + "@babel/runtime": "^7.18.3", + "react-is": "^16.12.0" + }, + "peerDependencies": { + "react": ">=16.9.0", + "react-dom": ">=16.9.0" + } + }, + "node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-apexcharts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz", + "integrity": "sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q==", + "dependencies": { + "prop-types": "^15.5.7" + }, + "peerDependencies": { + "apexcharts": "^3.18.0", + "react": ">=0.13" + } + }, + "node_modules/react-app-polyfill": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz", + "integrity": "sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w==", + "dependencies": { + "core-js": "^3.19.2", + "object-assign": "^4.1.1", + "promise": "^8.1.0", + "raf": "^3.4.1", + "regenerator-runtime": "^0.13.9", + "whatwg-fetch": "^3.6.2" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-copy-to-clipboard": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz", + "integrity": "sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A==", + "dependencies": { + "copy-to-clipboard": "^3.3.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": "^15.3.0 || 16 || 17 || 18" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz", + "integrity": "sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ==", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/react-dev-utils/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/react-dev-utils/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/react-dev-utils/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz", + "integrity": "sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/react-device-detect": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.2.3.tgz", + "integrity": "sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw==", + "dependencies": { + "ua-parser-js": "^1.0.33" + }, + "peerDependencies": { + "react": ">= 0.14.0", + "react-dom": ">= 0.14.0" + } + }, + "node_modules/react-dom": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz", + "integrity": "sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.0" + }, + "peerDependencies": { + "react": "^18.2.0" + } + }, + "node_modules/react-draggable": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz", + "integrity": "sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g==", + "dependencies": { + "clsx": "^1.1.1", + "prop-types": "^15.8.1" + }, + "peerDependencies": { + "react": ">= 16.3.0", + "react-dom": ">= 16.3.0" + } + }, + "node_modules/react-element-to-jsx-string": { + "version": "15.0.0", + "resolved": "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz", + "integrity": "sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ==", + "dependencies": { + "@base2/pretty-print-object": "1.0.1", + "is-plain-object": "5.0.0", + "react-is": "18.1.0" + }, + "peerDependencies": { + "react": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", + "react-dom": "^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0" + } + }, + "node_modules/react-element-to-jsx-string/node_modules/react-is": { + "version": "18.1.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz", + "integrity": "sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg==" + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz", + "integrity": "sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg==" + }, + "node_modules/react-fast-compare": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz", + "integrity": "sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw==" + }, + "node_modules/react-hook-form": { + "version": "7.45.4", + "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.4.tgz", + "integrity": "sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ==", + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/react-hook-form" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17 || ^18" + } + }, + "node_modules/react-i18next": { + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/react-i18next/-/react-i18next-13.2.2.tgz", + "integrity": "sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ==", + "dependencies": { + "@babel/runtime": "^7.22.5", + "html-parse-stringify": "^3.0.1" + }, + "peerDependencies": { + "i18next": ">= 23.2.3", + "react": ">= 16.8.0" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + } + } + }, + "node_modules/react-idle-timer": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/react-idle-timer/-/react-idle-timer-5.7.2.tgz", + "integrity": "sha512-+BaPfc7XEUU5JFkwZCx6fO1bLVK+RBlFH+iY4X34urvIzZiZINP6v2orePx3E6pAztJGE7t4DzvL7if2SL/0GQ==", + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-intl": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/react-intl/-/react-intl-6.4.7.tgz", + "integrity": "sha512-0hnOHAZhxTFqD1hGTxrF40qNyZJPPYiGhWIIxIz0Udz+3e3c7sdN80qlxArR+AbJ+jb5ALXZkJYH20+GPFCM0Q==", + "dependencies": { + "@formatjs/ecma402-abstract": "1.17.2", + "@formatjs/icu-messageformat-parser": "2.6.2", + "@formatjs/intl": "2.9.3", + "@formatjs/intl-displaynames": "6.5.2", + "@formatjs/intl-listformat": "7.4.2", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/react": "16 || 17 || 18", + "hoist-non-react-statics": "^3.3.2", + "intl-messageformat": "10.5.3", + "tslib": "^2.4.0" + }, + "peerDependencies": { + "react": "^16.6.0 || 17 || 18", + "typescript": "^4.7 || 5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-number-format": { + "version": "4.9.4", + "resolved": "https://registry.npmjs.org/react-number-format/-/react-number-format-4.9.4.tgz", + "integrity": "sha512-Gq20Z3ugqPLFgeaidnx5on9cNpbQZntPN3QgNAL/WJrNNlQnNznY0LCx7g8xtssmRBw0/hw+SCqw6zAcajooiA==", + "dependencies": { + "prop-types": "^15.7.2" + }, + "peerDependencies": { + "react": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-perfect-scrollbar": { + "version": "1.5.8", + "resolved": "https://registry.npmjs.org/react-perfect-scrollbar/-/react-perfect-scrollbar-1.5.8.tgz", + "integrity": "sha512-bQ46m70gp/HJtiBOF3gRzBISSZn8FFGNxznTdmTG8AAwpxG1bJCyn7shrgjEvGSQ5FJEafVEiosY+ccER11OSA==", + "dependencies": { + "perfect-scrollbar": "^1.5.0", + "prop-types": "^15.6.1" + }, + "peerDependencies": { + "react": ">=16.3.3", + "react-dom": ">=16.3.3" + } + }, + "node_modules/react-redux": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz", + "integrity": "sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA==", + "dependencies": { + "@babel/runtime": "^7.12.1", + "@types/hoist-non-react-statics": "^3.3.1", + "@types/use-sync-external-store": "^0.0.3", + "hoist-non-react-statics": "^3.3.2", + "react-is": "^18.0.0", + "use-sync-external-store": "^1.0.0" + }, + "peerDependencies": { + "@types/react": "^16.8 || ^17.0 || ^18.0", + "@types/react-dom": "^16.8 || ^17.0 || ^18.0", + "react": "^16.8 || ^17.0 || ^18.0", + "react-dom": "^16.8 || ^17.0 || ^18.0", + "react-native": ">=0.59", + "redux": "^4 || ^5.0.0-beta.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "@types/react-dom": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "react-native": { + "optional": true + }, + "redux": { + "optional": true + } + } + }, + "node_modules/react-redux/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" + }, + "node_modules/react-refresh": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", + "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz", + "integrity": "sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.4", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz", + "integrity": "sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz", + "integrity": "sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g==", + "dependencies": { + "@remix-run/router": "1.7.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz", + "integrity": "sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw==", + "dependencies": { + "@remix-run/router": "1.7.1", + "react-router": "6.14.1" + }, + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-scripts": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz", + "integrity": "sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ==", + "dependencies": { + "@babel/core": "^7.16.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.3", + "@svgr/webpack": "^5.5.0", + "babel-jest": "^27.4.2", + "babel-loader": "^8.2.3", + "babel-plugin-named-asset-import": "^0.3.8", + "babel-preset-react-app": "^10.0.1", + "bfj": "^7.0.2", + "browserslist": "^4.18.1", + "camelcase": "^6.2.1", + "case-sensitive-paths-webpack-plugin": "^2.4.0", + "css-loader": "^6.5.1", + "css-minimizer-webpack-plugin": "^3.2.0", + "dotenv": "^10.0.0", + "dotenv-expand": "^5.1.0", + "eslint": "^8.3.0", + "eslint-config-react-app": "^7.0.1", + "eslint-webpack-plugin": "^3.1.1", + "file-loader": "^6.2.0", + "fs-extra": "^10.0.0", + "html-webpack-plugin": "^5.5.0", + "identity-obj-proxy": "^3.0.0", + "jest": "^27.4.3", + "jest-resolve": "^27.4.2", + "jest-watch-typeahead": "^1.0.0", + "mini-css-extract-plugin": "^2.4.5", + "postcss": "^8.4.4", + "postcss-flexbugs-fixes": "^5.0.2", + "postcss-loader": "^6.2.1", + "postcss-normalize": "^10.0.1", + "postcss-preset-env": "^7.0.1", + "prompts": "^2.4.2", + "react-app-polyfill": "^3.0.0", + "react-dev-utils": "^12.0.1", + "react-refresh": "^0.11.0", + "resolve": "^1.20.0", + "resolve-url-loader": "^4.0.0", + "sass-loader": "^12.3.0", + "semver": "^7.3.5", + "source-map-loader": "^3.0.0", + "style-loader": "^3.3.1", + "tailwindcss": "^3.0.2", + "terser-webpack-plugin": "^5.2.5", + "webpack": "^5.64.4", + "webpack-dev-server": "^4.6.0", + "webpack-manifest-plugin": "^4.0.2", + "workbox-webpack-plugin": "^6.4.1" + }, + "bin": { + "react-scripts": "bin/react-scripts.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "fsevents": "^2.3.2" + }, + "peerDependencies": { + "react": ">= 16", + "typescript": "^3.2.1 || ^4" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-syntax-highlighter": { + "version": "15.5.0", + "resolved": "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz", + "integrity": "sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg==", + "dependencies": { + "@babel/runtime": "^7.3.1", + "highlight.js": "^10.4.1", + "lowlight": "^1.17.0", + "prismjs": "^1.27.0", + "refractor": "^3.6.0" + }, + "peerDependencies": { + "react": ">= 0.14.0" + } + }, + "node_modules/react-textarea-autosize": { + "version": "8.5.2", + "resolved": "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz", + "integrity": "sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg==", + "dependencies": { + "@babel/runtime": "^7.20.13", + "use-composed-ref": "^1.3.0", + "use-latest": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-toastify": { + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz", + "integrity": "sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg==", + "dependencies": { + "clsx": "^1.1.1" + }, + "peerDependencies": { + "react": ">=16", + "react-dom": ">=16" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, + "node_modules/react-window": { + "version": "1.8.9", + "resolved": "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz", + "integrity": "sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "memoize-one": ">=3.1.1 <6" + }, + "engines": { + "node": ">8.0.0" + }, + "peerDependencies": { + "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.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==", + "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==", + "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==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz", + "integrity": "sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA==", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/redux": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz", + "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==", + "dependencies": { + "@babel/runtime": "^7.9.2" + } + }, + "node_modules/redux-thunk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz", + "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", + "peerDependencies": { + "redux": "^4" + } + }, + "node_modules/refractor": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz", + "integrity": "sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA==", + "dependencies": { + "hastscript": "^6.0.0", + "parse-entities": "^2.0.0", + "prismjs": "~1.27.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/refractor/node_modules/prismjs": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz", + "integrity": "sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", + "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.11", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", + "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + }, + "node_modules/regenerator-transform": { + "version": "0.15.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", + "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", + "integrity": "sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", + "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/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==", + "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/renderkid/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==", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/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==", + "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/renderkid/node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "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/renderkid/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==", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/reselect": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz", + "integrity": "sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ==" + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dependencies": { + "is-core-module": "^2.11.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-cwd": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", + "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", + "dependencies": { + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-cwd/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=8.9" + }, + "peerDependencies": { + "rework": "1.0.1", + "rework-visit": "1.0.0" + }, + "peerDependenciesMeta": { + "rework": { + "optional": true + }, + "rework-visit": { + "optional": true + } + } + }, + "node_modules/resolve-url-loader/node_modules/picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==" + }, + "node_modules/resolve-url-loader/node_modules/postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dependencies": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/resolve-url-loader/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve.exports": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz", + "integrity": "sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rifm": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz", + "integrity": "sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ==", + "dependencies": { + "@babel/runtime": "^7.3.1" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "deprecated": "Rimraf versions prior to v4 are no longer supported", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=10.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/rollup-plugin-terser": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz", + "integrity": "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ==", + "deprecated": "This package has been deprecated and is no longer maintained. Please use @rollup/plugin-terser", + "dependencies": { + "@babel/code-frame": "^7.10.4", + "jest-worker": "^26.2.1", + "serialize-javascript": "^4.0.0", + "terser": "^5.0.0" + }, + "peerDependencies": { + "rollup": "^2.0.0" + } + }, + "node_modules/rollup-plugin-terser/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/rollup-plugin-terser/node_modules/jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/rollup-plugin-terser/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "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-array-concat": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz", + "integrity": "sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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==", + "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-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sanitize.css": { + "version": "13.0.0", + "resolved": "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz", + "integrity": "sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA==" + }, + "node_modules/sass-loader": { + "version": "12.6.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", + "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.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", + "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/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "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==", + "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/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" + }, + "node_modules/selfsigned": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz", + "integrity": "sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==", + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "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==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" + }, + "node_modules/simplebar": { + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz", + "integrity": "sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag==", + "dependencies": { + "@juggle/resize-observer": "^3.3.1", + "can-use-dom": "^0.1.0", + "core-js": "^3.0.1", + "lodash.debounce": "^4.0.8", + "lodash.memoize": "^4.1.2", + "lodash.throttle": "^4.1.1" + } + }, + "node_modules/simplebar-react": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz", + "integrity": "sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg==", + "dependencies": { + "prop-types": "^15.6.1", + "simplebar": "^5.3.9" + }, + "peerDependencies": { + "react": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", + "react-dom": "^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==" + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/source-list-map": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", + "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==" + }, + "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==", + "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-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz", + "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==", + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.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==", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/space-separated-tokens": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz", + "integrity": "sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "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" + }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/stackframe": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz", + "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==" + }, + "node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/stream": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz", + "integrity": "sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g==", + "dependencies": { + "emitter-component": "^1.1.1" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-length": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", + "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", + "dependencies": { + "char-regex": "^1.0.2", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/string-natural-compare": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz", + "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz", + "integrity": "sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw==", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz", + "integrity": "sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw==", + "engines": { + "node": ">=10" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-loader": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz", + "integrity": "sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw==", + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/stylehacks": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz", + "integrity": "sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw==", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + }, + "node_modules/sucrase": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", + "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/sucrase/node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "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/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-hyperlinks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", + "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/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==", + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" + }, + "node_modules/svg.draggable.js": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz", + "integrity": "sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw==", + "dependencies": { + "svg.js": "^2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.easing.js": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz", + "integrity": "sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA==", + "dependencies": { + "svg.js": ">=2.3.x" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.filter.js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz", + "integrity": "sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.js": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz", + "integrity": "sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA==" + }, + "node_modules/svg.pathmorphing.js": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz", + "integrity": "sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww==", + "dependencies": { + "svg.js": "^2.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz", + "integrity": "sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw==", + "dependencies": { + "svg.js": "^2.6.5", + "svg.select.js": "^2.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.resize.js/node_modules/svg.select.js": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz", + "integrity": "sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ==", + "dependencies": { + "svg.js": "^2.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svg.select.js": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz", + "integrity": "sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw==", + "dependencies": { + "svg.js": "^2.6.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/svgo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz", + "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==", + "deprecated": "This SVGO version is no longer supported. Upgrade to v2.x.x.", + "dependencies": { + "chalk": "^2.4.1", + "coa": "^2.0.2", + "css-select": "^2.0.0", + "css-select-base-adapter": "^0.1.1", + "css-tree": "1.0.0-alpha.37", + "csso": "^4.0.2", + "js-yaml": "^3.13.1", + "mkdirp": "~0.5.1", + "object.values": "^1.1.0", + "sax": "~1.2.4", + "stable": "^0.1.8", + "unquote": "~1.1.1", + "util.promisify": "~1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwindcss": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", + "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.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "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", + "postcss-value-parser": "^4.2.0", + "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==", + "engines": { + "node": ">=6" + } + }, + "node_modules/temp-dir": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", + "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/tempy": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz", + "integrity": "sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw==", + "dependencies": { + "is-stream": "^2.0.0", + "temp-dir": "^2.0.0", + "type-fest": "^0.16.0", + "unique-string": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tempy/node_modules/type-fest": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", + "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terminal-link": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz", + "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==", + "dependencies": { + "ansi-escapes": "^4.2.1", + "supports-hyperlinks": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/terser": { + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz", + "integrity": "sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w==", + "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==", + "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==" + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "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==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/throat": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz", + "integrity": "sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==" + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" + }, + "node_modules/timers": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/timers/-/timers-0.1.1.tgz", + "integrity": "sha512-pkJC8uIP/gxDHxNQUBUbjHyl6oZfT+ofn7tbaHW+CFIUjI+Q2MBbHcx1JSBQfhDaTcO9bNg328q0i7Vk5PismQ==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/tmpl": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", + "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "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==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "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/tough-cookie": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.2.0", + "url-parse": "^1.5.3" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tough-cookie/node_modules/universalify": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", + "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tryer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz", + "integrity": "sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA==" + }, + "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==" + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tsconfig-paths/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==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/tslib": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz", + "integrity": "sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/tus-js-client": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/tus-js-client/-/tus-js-client-3.1.1.tgz", + "integrity": "sha512-SZzWP62jEFLmROSRZx+uoGLKqsYWMGK/m+PiNehPVWbCm7/S9zRIMaDxiaOcKdMnFno4luaqP5E+Y1iXXPjP0A==", + "dependencies": { + "buffer-from": "^1.1.2", + "combine-errors": "^3.0.3", + "is-stream": "^2.0.0", + "js-base64": "^3.7.2", + "lodash.throttle": "^4.1.1", + "proper-lockfile": "^4.1.2", + "url-parse": "^1.5.7" + } + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "engines": { + "node": ">=4" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "4.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz", + "integrity": "sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig==", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.35", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz", + "integrity": "sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz", + "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg==" + }, + "node_modules/upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "engines": { + "node": ">=4", + "yarn": "*" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "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==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/url-parse": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", + "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", + "dependencies": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz", + "integrity": "sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-composed-ref": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz", + "integrity": "sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-latest": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz", + "integrity": "sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw==", + "dependencies": { + "use-isomorphic-layout-effect": "^1.1.1" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.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==" + }, + "node_modules/util.promisify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", + "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", + "dependencies": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.2", + "has-symbols": "^1.0.1", + "object.getownpropertydescriptors": "^2.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/utila": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/v8-to-istanbul": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz", + "integrity": "sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==", + "dependencies": { + "@types/istanbul-lib-coverage": "^2.0.1", + "convert-source-map": "^1.6.0", + "source-map": "^0.7.3" + }, + "engines": { + "node": ">=10.12.0" + } + }, + "node_modules/v8-to-istanbul/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "engines": { + "node": ">= 8" + } + }, + "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==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz", + "integrity": "sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/walker": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", + "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", + "dependencies": { + "makeerror": "1.0.12" + } + }, + "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==", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-vitals": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.3.2.tgz", + "integrity": "sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q==" + }, + "node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "engines": { + "node": ">=10.4" + } + }, + "node_modules/webpack": { + "version": "5.88.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz", + "integrity": "sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ==", + "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-dev-middleware": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-middleware/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.1", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack-dev-server/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz", + "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-manifest-plugin": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz", + "integrity": "sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow==", + "dependencies": { + "tapable": "^2.0.0", + "webpack-sources": "^2.2.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "peerDependencies": { + "webpack": "^4.44.2 || ^5.47.0" + } + }, + "node_modules/webpack-manifest-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/webpack-manifest-plugin/node_modules/webpack-sources": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz", + "integrity": "sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==", + "dependencies": { + "source-list-map": "^2.0.1", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "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==", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/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==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/webpack/node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-fetch": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz", + "integrity": "sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA==" + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==" + }, + "node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-collection": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", + "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", + "dependencies": { + "is-map": "^2.0.1", + "is-set": "^2.0.1", + "is-weakmap": "^2.0.1", + "is-weakset": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.9", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", + "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/workbox-background-sync": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz", + "integrity": "sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-broadcast-update": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz", + "integrity": "sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-build": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz", + "integrity": "sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ==", + "dependencies": { + "@apideck/better-ajv-errors": "^0.3.1", + "@babel/core": "^7.11.1", + "@babel/preset-env": "^7.11.0", + "@babel/runtime": "^7.11.2", + "@rollup/plugin-babel": "^5.2.0", + "@rollup/plugin-node-resolve": "^11.2.1", + "@rollup/plugin-replace": "^2.4.1", + "@surma/rollup-plugin-off-main-thread": "^2.2.3", + "ajv": "^8.6.0", + "common-tags": "^1.8.0", + "fast-json-stable-stringify": "^2.1.0", + "fs-extra": "^9.0.1", + "glob": "^7.1.6", + "lodash": "^4.17.20", + "pretty-bytes": "^5.3.0", + "rollup": "^2.43.1", + "rollup-plugin-terser": "^7.0.0", + "source-map": "^0.8.0-beta.0", + "stringify-object": "^3.3.0", + "strip-comments": "^2.0.1", + "tempy": "^0.6.0", + "upath": "^1.2.0", + "workbox-background-sync": "6.6.0", + "workbox-broadcast-update": "6.6.0", + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-google-analytics": "6.6.0", + "workbox-navigation-preload": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-range-requests": "6.6.0", + "workbox-recipes": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0", + "workbox-streams": "6.6.0", + "workbox-sw": "6.6.0", + "workbox-window": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/workbox-build/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/workbox-build/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/workbox-build/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "node_modules/workbox-build/node_modules/source-map": { + "version": "0.8.0-beta.0", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz", + "integrity": "sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==", + "dependencies": { + "whatwg-url": "^7.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/workbox-build/node_modules/tr46": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz", + "integrity": "sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/workbox-build/node_modules/webidl-conversions": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz", + "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==" + }, + "node_modules/workbox-build/node_modules/whatwg-url": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz", + "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==", + "dependencies": { + "lodash.sortby": "^4.7.0", + "tr46": "^1.0.1", + "webidl-conversions": "^4.0.2" + } + }, + "node_modules/workbox-cacheable-response": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz", + "integrity": "sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw==", + "deprecated": "workbox-background-sync@6.6.0", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-core": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz", + "integrity": "sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ==" + }, + "node_modules/workbox-expiration": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz", + "integrity": "sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw==", + "dependencies": { + "idb": "^7.0.1", + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-google-analytics": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz", + "integrity": "sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q==", + "deprecated": "It is not compatible with newer versions of GA starting with v4, as long as you are using GAv3 it should be ok, but the package is not longer being maintained", + "dependencies": { + "workbox-background-sync": "6.6.0", + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-navigation-preload": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz", + "integrity": "sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-precaching": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz", + "integrity": "sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-range-requests": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz", + "integrity": "sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-recipes": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz", + "integrity": "sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A==", + "dependencies": { + "workbox-cacheable-response": "6.6.0", + "workbox-core": "6.6.0", + "workbox-expiration": "6.6.0", + "workbox-precaching": "6.6.0", + "workbox-routing": "6.6.0", + "workbox-strategies": "6.6.0" + } + }, + "node_modules/workbox-routing": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz", + "integrity": "sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-strategies": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz", + "integrity": "sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ==", + "dependencies": { + "workbox-core": "6.6.0" + } + }, + "node_modules/workbox-streams": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz", + "integrity": "sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg==", + "dependencies": { + "workbox-core": "6.6.0", + "workbox-routing": "6.6.0" + } + }, + "node_modules/workbox-sw": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz", + "integrity": "sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ==" + }, + "node_modules/workbox-webpack-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz", + "integrity": "sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A==", + "dependencies": { + "fast-json-stable-stringify": "^2.1.0", + "pretty-bytes": "^5.4.1", + "upath": "^1.2.0", + "webpack-sources": "^1.4.3", + "workbox-build": "6.6.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "webpack": "^4.4.0 || ^5.9.0" + } + }, + "node_modules/workbox-webpack-plugin/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==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/workbox-webpack-plugin/node_modules/webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dependencies": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + } + }, + "node_modules/workbox-window": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz", + "integrity": "sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw==", + "dependencies": { + "@types/trusted-types": "^2.0.2", + "workbox-core": "6.6.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "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==" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==" + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yup": { + "version": "0.32.11", + "resolved": "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz", + "integrity": "sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "@types/lodash": "^4.14.175", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "nanoclone": "^0.2.1", + "property-expr": "^2.0.4", + "toposort": "^2.0.2" + }, + "engines": { + "node": ">=10" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..a065f4b --- /dev/null +++ b/package.json @@ -0,0 +1,130 @@ +{ + "name": "ars-react", + "version": "1.1.2", + "private": true, + "homepage": "", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons": "^4.7.0", + "@casl/ability": "^6.5.0", + "@casl/react": "^3.1.0", + "@emotion/cache": "^11.10.3", + "@emotion/react": "^11.10.4", + "@emotion/styled": "^11.10.4", + "@mantine/core": "^7.0.2", + "@material-ui/pickers": "^3.3.10", + "@mui/icons-material": "^5.14.1", + "@mui/lab": "^5.0.0-alpha.139", + "@mui/material": "^5.14.11", + "@mui/styles": "^5.14.15", + "@mui/system": "^5.14.11", + "@mui/x-data-grid": "^6.11.1", + "@reduxjs/toolkit": "^1.8.5", + "@testing-library/jest-dom": "^5.16.5", + "@testing-library/react": "^13.4.0", + "@testing-library/user-event": "^14.4.3", + "@uppy/core": "^3.5.0", + "@uppy/dashboard": "^3.5.2", + "@uppy/drag-drop": "^3.0.3", + "@uppy/file-input": "^3.0.3", + "@uppy/progress-bar": "^3.0.3", + "@uppy/react": "^3.1.3", + "@uppy/thumbnail-generator": "^3.0.4", + "@uppy/tus": "^3.2.0", + "@uppy/webcam": "^3.3.2", + "@uppy/xhr-upload": "^3.4.0", + "apexcharts": "^3.37.3", + "axios": "^1.4.0", + "buffer": "^6.0.3", + "date-fns": "^2.30.0", + "dayjs": "^1.11.10", + "env-cmd": "^10.1.0", + "formik": "^2.2.9", + "framer-motion": "^7.3.6", + "history": "^5.3.0", + "i18next": "^23.5.1", + "jwt-decode": "^3.1.2", + "lodash": "^4.17.21", + "moment": "^2.29.4", + "mui-file-input": "^3.0.2", + "mui-image": "^1.0.7", + "prop-types": "^15.8.1", + "react": "^18.2.0", + "react-apexcharts": "^1.4.0", + "react-copy-to-clipboard": "^5.1.0", + "react-device-detect": "^2.2.2", + "react-dom": "^18.2.0", + "react-draggable": "^4.4.5", + "react-element-to-jsx-string": "^15.0.0", + "react-hook-form": "^7.45.4", + "react-i18next": "^13.2.2", + "react-idle-timer": "^5.7.2", + "react-intl": "^6.4.7", + "react-number-format": "^4.9.4", + "react-perfect-scrollbar": "^1.5.8", + "react-redux": "^8.0.4", + "react-router": "^6.4.1", + "react-router-dom": "^6.4.1", + "react-scripts": "^5.0.1", + "react-syntax-highlighter": "^15.5.0", + "react-toastify": "^9.1.3", + "react-window": "^1.8.7", + "redux": "^4.2.0", + "simplebar": "^5.3.8", + "simplebar-react": "^2.4.1", + "stream": "0.0.2", + "timers": "^0.1.1", + "typescript": "4.8.3", + "web-vitals": "^3.0.2", + "xlsx": "^0.18.5", + "xml2js": "^0.6.2", + "yup": "^0.32.11" + }, + "scripts": { + "start": "env-cmd --environments development react-scripts start", + "production": "env-cmd --production production react-scripts start", + "build": "react-scripts build", + "test": "react-scripts test", + "eject": "react-scripts eject" + }, + "eslintConfig": { + "extends": [ + "react-app", + "react-app/jest" + ] + }, + "babel": { + "presets": [ + "@babel/preset-react" + ] + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/core": "^7.21.4", + "@babel/eslint-parser": "^7.21.3", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@mui/core": "^5.0.0-alpha.54", + "@mui/x-date-pickers": "^6.18.0", + "eslint": "^8.38.0", + "eslint-config-prettier": "^8.8.0", + "eslint-config-react-app": "^7.0.1", + "eslint-plugin-flowtype": "^8.0.3", + "eslint-plugin-import": "^2.27.5", + "eslint-plugin-jsx-a11y": "^6.7.1", + "eslint-plugin-prettier": "^4.2.1", + "eslint-plugin-react": "^7.32.2", + "eslint-plugin-react-hooks": "^4.6.0", + "prettier": "^2.8.7" + } +} diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..3caf057 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/public/index.html b/public/index.html new file mode 100644 index 0000000..21fdc70 --- /dev/null +++ b/public/index.html @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Lioner System + + + + + +
+ + + diff --git a/src/App.js b/src/App.js new file mode 100644 index 0000000..278d19e --- /dev/null +++ b/src/App.js @@ -0,0 +1,88 @@ +// project import +import Routes from 'routes'; +import ThemeCustomization from 'themes'; +import ScrollTop from 'components/ScrollTop'; +import {ToastContainer} from "react-toastify"; +import React from "react"; +import 'react-toastify/dist/ReactToastify.css'; +import {useEffect} from "react"; +import {useDispatch} from "react-redux"; +import { + SetupAxiosInterceptors +} from "./auth"; +import { useNavigate } from 'react-router-dom'; +//import {isUserLoggedIn} from 'utils/Utils'; +//import {DefaultRoute} from 'routes/index' +// ==============================|| APP - THEME, ROUTER, LOCAL ||============================== // + +const App = () => { + const dispatch = useDispatch(); + const navigate = useNavigate(); + + // useEffect(() => { + // const handleBeforeUnload = () => { + // let url = new URL(window.location.href); + // let pathname = url.pathname; + // const lastPath = localStorage.getItem('lastVisitedPath'); + // if ( + // pathname !== '/login' && + // pathname !== '/lionerDashboard' && + // pathname !== lastPath && + // !isRefresh.current && isUserClick.current) { + // //for all page auto logout + // dispatch(handleLogoutFunction()); + // window.location.reload(); + // } + // else if (!isRefresh.current && !isUserClick.current) { + // //for dashboard and login page auto logout + // dispatch(handleLogoutFunction()); + // window.location.reload(); + // } + // }; + + // const handleRefresh = () => { + // let url = new URL(window.location.href); + // let pathname = url.pathname; + // if(pathname !== '/lionerDashboard'){ + // //skip checking for unload dashboard + // isUserClick.current = true; + // } + // if (event.key === 'F5' || + // (event.ctrlKey && event.key === 'r') || + // (event.ctrlKey && event.shiftKey && event.key === 'R') + // ) { + // // User pressed F5 or Ctrl+R, do not trigger logout + // isRefresh.current = true; + // } + // }; + + + // window.addEventListener('beforeunload', handleBeforeUnload); + // window.addEventListener('keydown', handleRefresh); + + // return () => { + // window.removeEventListener('beforeunload', handleBeforeUnload); + // window.removeEventListener('keydown', handleRefresh); + // }; + // }, [dispatch]); + + useEffect(() => { + let url = new URL(window.location.href); + let pathname = url.pathname; + if (pathname !== '/login'){ + SetupAxiosInterceptors(dispatch, navigate); + } + }, []) + + return ( + + + + + + + + ); +}; + +export default App; diff --git a/src/App.test.js b/src/App.test.js new file mode 100644 index 0000000..2a68616 --- /dev/null +++ b/src/App.test.js @@ -0,0 +1,9 @@ +import React from 'react'; +import { render, screen } from '@testing-library/react'; +import App from './App'; + +test('renders learn react link', () => { + render(); + const linkElement = screen.getByText(/learn react/i); + expect(linkElement).toBeInTheDocument(); +}); diff --git a/src/assets/images/auth/AuthBackground.js b/src/assets/images/auth/AuthBackground.js new file mode 100644 index 0000000..85b78c7 --- /dev/null +++ b/src/assets/images/auth/AuthBackground.js @@ -0,0 +1,69 @@ +// material-ui +// import { useTheme } from '@mui/material/styles'; +import { Box } from '@mui/material'; + +// ==============================|| AUTH BLUR BACK SVG ||============================== // + +const AuthBackground = () => { + // const theme = useTheme(); + return ( + + + ` + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ` + + + ); + // return ( + // + // + // ` + // + // ` + // + // + // ); +}; + +export default AuthBackground; diff --git a/src/assets/images/display/celebration.png b/src/assets/images/display/celebration.png new file mode 100644 index 0000000000000000000000000000000000000000..bb6be14d7479357d7c8e45f9ef41f3d85b1012d6 GIT binary patch literal 199092 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�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 XE^V328gV}W(4?mHQnCD*N$~#x{6w4L literal 0 HcmV?d00001 diff --git a/src/assets/images/display/doc.png b/src/assets/images/display/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..bcb7536a67b680ae7be79d3bc9bdb371afe99161 GIT binary patch literal 858 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I3?%1nZ+ru!6p}rHd>I(3)EF2VS{N990fib~ zFff!FFfhDIU|_JC!N4G1FlSew4N$^6z$e5NNOQ7sQjY%r|F4lH9{@B?yd=mkn1R7| z=U21qtcxYD{eFC3!A9<;X!zN4B9D&9tpzG!O!9Vjk(iy?DhIN@z$3Dlf$=~W2s7?& zvwsZ~WH0gbb!C6f&C6`bYS+Hr3aH1$)5S3);_%xUH-(xEcw9T9BA4VS{rqn)nj#sc z;n``tBKcmziN+^!CW;(P3>I_sPxPGrc}0!oGebalUX^%wD)XTe>hgwMx(;&`?ggFg z`qDPzh?v6Vj?B1}9*s{Tf$7=|u?*T=Zc3#f30QM;%o9}14BrEDfe|zAER@BAMl?z zaN?t0Bb$Kl5{4x`Dh)N_brKH$=j1TQeA<{=BH59vvb=R?*fi!Nsvfg7rhRyb7 zdie3grC*Zwt&FLbIp*AaBJEpuo9f>frM@|Q@Astt6k1#Vh&5ynQ}^@_vGW<{U34PX!pm$*ihIF^=V%AKpDzcd76w(2bV_1Ls#S7PDv)9@ zGB7gMH8j*UG!8K^wlX!dGBwvWFt9Q(NIl&TN=^t3x%nxXX_dG&h)gqY0BX>H+fb63 zn_66wm|K9Z$K1-m6kVhi1Q + + diff --git a/src/assets/images/icons/google.svg b/src/assets/images/icons/google.svg new file mode 100644 index 0000000..bd30fd9 --- /dev/null +++ b/src/assets/images/icons/google.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/assets/images/icons/twitter.svg b/src/assets/images/icons/twitter.svg new file mode 100644 index 0000000..f868d36 --- /dev/null +++ b/src/assets/images/icons/twitter.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/assets/images/users/avatar-1.png b/src/assets/images/users/avatar-1.png new file mode 100644 index 0000000000000000000000000000000000000000..6f833448665d1cef05a78d3b555f11f69fc21185 GIT binary patch literal 9490 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%0DB6ybzzRY9z3qNSHg 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 yF^Cmekri2y6($4Vv(8v0000;>=u literal 0 HcmV?d00001 diff --git a/src/assets/images/users/empty-avatar.png b/src/assets/images/users/empty-avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..b398aa2a458da8cfbda422025510d22e9e664d64 GIT binary patch literal 36073 zcmdSBcTkjBv@hCZkZ1xVj}jCRP@<$3!~h6LjuI5fQF3ZP6jU&Q!jK&ikc=WZbPEE* zU=t-aO*bex=hWT2{e8@N@6@S#?mhp#x>ZwX`R%mU`mNszdk@d<=-*^L#&ZmTK(K1x z(lSCI=)hm;5RBB|kCa%K_XtEnxwe*uN$}_*{+W^WP}c0k0j2vm2eo#XySu#r>u{Tb zeM~9~H?!R0@flVxro<#A-_gKHst&sW^Zfn5T)#TJ>(W-ed&%K`q++8wST&*XaOM^G z6G6oSeo%9RAG9*y2ctds!GQrkgrcYrh^q)11R@GS|DXT%Kbi7hCjTF%{IB-=@2C8? zNBmz-`QJx*6}z%Ur~}A+g}s>F%dnRFeB{aMH*RReP!0BKt0*GZ&8^ zbMM$a@DG*ceYRGa*0z~;mev+`?QC!sR$*Tonkwr)H#U)fcWmHir0tqiRh89Mkm&HC zxxfS8%QXipj(-jY9b$zovmS&bPQ@tI5{#<6S)h2LK0Hd^c)2X}Y-Q(R{LV_nWR+n1 zidP+1ig~;9OjsG4ATsQ8)mE^tXHMf+zN%@bdF-5!c-)Hup|rw*d^f`aGilS74lA;) z>uxsb?(m<-c>5#GyvciqS4hmL!+71D$hdht;UkYenNl_-BtG=vA%|Yv3%3gVpLQ8Q zfRL}1pBpPG>JRsKHy26ko-=j01u<8%26Q7q`DOoNH$%zFVSdv#I~@8@iL*=Orpk23 zJ^Y#JiNNK(srr~-zcTUUt&(=2yOJll@8wlaDu_C{p?}aOy(>R8w&Uz4>Sp@EEcc4_ z!JXl(!x;WXxDGKGr)JMvyW>@b^;LU*`ncTgRf@(&(;aJ$ixjRzdlwB?!3YNx-< z>Bj>%>MvC*RX0=t4Oec2uMk&%lRo%G$lmJHNE8VQi9{QQ_b=E5h3V_j0HoQEZ3nL? z1ozjw*RAxcqUW~9ZJN}Slq1%|gM2;Dd0>I)4=>i?yvUyI0m>dfv`QQbCoYnf$Tt3x#?Yvo7-Ml*&JWmY+7NXpGooFVY4ms@`@{|t-tV3OZ1Qa ziSC;A147x!!zyHW(34%%*29_`;&?(^Ky^_6f|zC2cw;+mE-+}v z?jn0oDA!70sC#aGQNtl_oUfO+f!#TBm%?6tqVk`XE5j4nL9qtXQVhNi4=Fy890Y@; z?N{d^SEG2YQJTID^Ri^mTpULWe(%_8#myWXEVT|yY#@USrbp+AWLp0CEu-A zOXNJm3xcBfOic1sGL=e;?AG)uc_P)SC+)5kZY&~TcrI{d{7hGpB$@D14Z_cE`*I_C zEdBJ}z!vt~LefA<`@pBWY#%z@lme_e* z$eVRG?q500vKAMcmTU-1Ok6R-z6OxGF$VmNJNb^klrF4)7&3TC$SCth7RZenSMHmX z*gmsrNpJiR^pSRH;;<>Nxo!2yM7er>L)Fgw*1(ot7ME-CVW7eAoD0OmNYi~bRAj@> zWMM_+M#B}fl4U_k;l$x~SnF>_=T)D2O10XAU7q{EjWAbo@5GvGBu9QwMb6z5^dJh$ zQ08z;Tm6!q>yw3kjXU%28*7wLD~Lu4PV-d-tZ=vah`7C54%{kwu|1uXnY0nF!8a4h z@-k442NEDScSY!oe)aSI&Dq}`t`QZZE_z+GQ$ls_!q!c{vcDas^WQBTwBFD)$X>Zi z@Q=$!crZeE<)+D8_VJU}Pim-XY?^Bd4&lH`jiU)+k*(%uC>bK*LE1_g&#c_7Uv*1K ztvEl}qK|PGfxO24RCRdVRQi-_vYqW+Pmh(KX%%P_YV+{D{#c(P6W07kE?yx^Qxm=R zuZ1nuZyB+|bL8rFC>IH;()7L${U6qq*BP?$CI$7E_)7~CI7$b^iX4X1a3gs1yv(Bv%d$xGRT$LO8Mxal;i>hOUim6WLagMA{w6cco0e%NNe!U^)^zc}h`X;hc zhqpH&uv9Tyl~wIkNad?73qisCikv^crc*EVQ!QC!=u$($)AW@6#n)^_u9XUj7F<60Kp z9)cL*1L~I?_W9%@>7lRZeQ`$JfzW~LcBr26+0d|wk@3#@YrU!0dLgH1vfAIK_ca@9 ziU?|~+p95Q)vc^MV@?`Ak;TS)@|}!_bc3q0PU7P7+C_Fzh+}uX=hCNJ^{T74HZ4Wm zlvjVmxDqGO$t@GJm9@D8Ns0jJ?XG#zRG=CQ_uUUXh>-)PT)(&SpyY~*C6m*<-dtx( z#wmcal));gQsod|oZ$B%N*SyVXPqyS+7&TF?Y(1@-|_WLeJKnmMR24}2fzDaGk874 zPUia`pp{A4yy%ucx?PhWgfjMsph`SVfVlS)=LF9&N zhW|S*^UQ^*o7TB*CTwSuO1V2&N)^Rc+O*KBsycl?T8~EFstAAmQKkMsb|!ru0{pt(>FN~o%qQ=*p1CP4 zJv)bD8<<{nlrNUEsxMiyd9J+F+9&G4FVJ2l$13IWfBXL^@2O=2Ex>h|c_(8Mz_jyx&o# zkaF2KhyBb>iOr-qxO;u!G2;!Trwlk2Pnh{cY|K?Cb=+(JiwYXGI_#G=)xB-2Kky+H z(h4;f ztilP}9DIY3+;hL1EGa#1bN9L*bJDw>Yd2R1#O~|S_4adxX{T)&A8m?s{8c@)!a6A_ zz0GE8FvL40^l5mc){R+Ow9(&5H7t zFPgWvbKxnNG7g|RqRJ9EFJ!ICuiw@xwU~C`hIIxeNQq62Uu&xT^TE1M=Xw)Y zBFrO{z7-+tdP`DL>L+>C?c&?SdU+qeK*(6JMd`R0rDy$%bqhC{pshVwq{*DE6^$vm z@6}be7yG11j3?i{ul)KjLblp(#|ho?YswFmOkw+)f-)u=yu~aOZfS*N45S z4lA&ZDxd6@Q-M`vRdx3C^&tyMXiQ`g!S)T8*bGN&Y(XsXe!KOewNTC~pNq@VHdp}G z(3~#XH*Jf)qj`S692G#9U_xUsls@&|*Z*Pi)b$~69_U0Tw{R=Ky~QN{(nZTW7dLb- z%307_OEL z=a=gy{D(cucC?uLmUF#yobzAukk=4j?PKHPi}XuIq}T-yPP5C18qgY;wJgnaSNu?i z-O2(@mg_d?mUjLy=s(=UBICrWYRIaXz4$T6`7gEOEWo8ullx0s6%9%#KXrb&yal}- zl!MJq^pHYzl4J!tJirJ)4qy}WtN-EfpU={isoJWeoy8=+^|d)6wGVvn333C#kUX|< z-Oou=3pv2EwJw51#%^9?=M8oUIQKG+by1N68gpALJ1z{}Ze024MCDg1(ka$4K84lE z`5PII+tI)sG2Lf7<8zYw9ms>$%jD+n0ZipS*yOT@{SN#&c!eBz;F>I$ovHWaMQU9b zdUXTO(1c^K4f*=+V`^;=P^o?KLXgtN-iL5=^fqcjOr4p()XOVB#6b!IEH`dnO$~j1 zC>?ytCop&!m^D|Hw2w1Ds{Un;Zj_Vmk{;I|N`DZB#*l$Ah`rlg5i|#xwBY-FLv-WB z_)6=*!0n%DRXfb2f@m@EiRmO~%S)=v5lajwfqV(1aqqOdO^t;Lqf_N`jdsMC1I&xS z0v>hLKB+01>_p9IA9cKxpoA?g^>%v^c;#vFR`jbCn(oI2wu=u!CN4t;@LNoNJF=oipaCZ$lNlw0CdyE{Y%F~Ol=h;#nR_pvsE4+Tw+1WL# zo&~bk4ee^=tv-*bUch8`(3t$4Xpm8FP5U>7p!O8>WSt@A!#w3fEwg`V7!Iw=K}Abn z<~v1jvAaw7&I8#pL6f|_F}Xc5PSKJ#L1R+H84N*`lWn;EMv0jfY#`u64h##iT@(~} zC%)yD<9UId6kpMkR0%Rb&)0cmrS1A-&?pzcO1|sUdRG!aqOcH5Bq;ibScH7d{8-x# zoAcVK{E=2uXHmBTJ7SUC>R`WfOM5g7>tG9z0uCuQzLz&=Qw^mJ&!o@#6bo3|>AEj| zOO_d0Ja$~@Wko|{gVp8TW4mduXsUH9XLlD>vCP+C@n~xH!**tS+qO@>5}+bX`V!r8 z0tU{gC;Z;wgn-zyzqDPUN{9%Mab4lsRbaI#ya7sj4b@q8)dX6wJj#O1)~*g3D9P?^ z>NJE>81M7bW@g;SAO)cAkl7}GpPyniay$*$ z!WF0Nl{kvH#PF!aA;==(8~b`+7C~KZaMl$`cJ(0hRH?7YD7tc~7 z(V>Z@0c5MFg`@9wY)JM=C2eb62@pni&jkNj_#*Ja)0g^PeKzn8hd#R@3v(6qMQF|u zObebit3c5mJF<}Ol_831gd73=iLkiUVOd}mw8h089n(|k0@^27zjWA`%d!`J)o`>PPSETjFGg1oQv~*(_4IY=?(B(~c^>sf9 zyc z?VOlV!s>TP=TXOHN3V_00!B@J01iYwoK20%-lSg>(*H2h`j8_vf-WJ>?S9~w6HVa} zj%VeBqR1Bzq|fB^)2&G}^&sN`+h!<4JI`aw<-_^~DUlm{l?=2pQTzM?sHX58ue$LJ z-`z9Z=$M{&`@r98pY=dNEN{r5BHY!p!laVSoG>F-{BXFYrfywQ2J*D+C4!tZFsG<{ zK#`-pjbgN}#@F(?tdEw}D=C6NAIPGE5%aB)z4{UJs>tZi@|LXZw%LEi(g9Uw2OWSq zFJF3FmBgIT_;8p7=ZDwu;NgUpz2Tc?dzZlCY&Ve3*^a3Ze4Le8O#3Rx)-lh43b=*X zTc_5(w&W3WO!sBhqTZ}hMJYnSq+CA+Qsgr>WPXT3Muh35gJZj?c@CyIxs@;EIwKe% zqgT|VN4!&*;p)_I)MFvp^q0GBbh=b+Oy76L#QO<9e?gl2(ZmQTDu&2!6O!h{D1tC<`vIIw=L#>Owar!U_ zb@#-Y*r0IJ0(ZAesB>1Mm9lJa#>|5^E&?mCSsnr23z&wyApk z3@3FCXkzseprg+xyySpkI~}^Y^wi#ycIv z!3$6IrKOVO{5W_ZfxeJI;n~|U;)q?8h(dZ(cPG2`HqYNka~^8qf|ie4B2a|%`?i~P zK$r}oQg0 zy6m1JY|P6zbR#Om$(bv~*vXD6yh9J9)K(E+Gx412B9LII8{L*>#U82;DQAfBCcH}z zduoDl&yqGr8R)>W>}bH)^)+>%Z|>IekdxS{5G__Tk+YO37X-_mBh(oWIvId(fn8G4 z3Ka7futf{$6rpVmhz(-~U;V1iOrLvi==t@cBNYWJ>LU`oxoK%OW*f%N1g*cn?QN(U zy6*AigheYgDIL*-qh(72WHK(KA8rYuTxg+sNU(IEj$AH}sF@xL*SWrD&bL;>H@AZIU!5(yVa6U_3+2 zb@jMsNJ>!v->4NTpb%-JN6Ug5g0x7k)POta@>{8;;D@0SQTaFrk zr4*r2H_?O!SdmC|MtBa_r6=!Znv?uM0%JZx3tCDb_Y$#`iUMx58s!-BxuPEFN;-`h zk_~4skRK9c35^+!gW@Q=Cd{nES?L9e7cHooK+BRmF!5&RH6-#Kufx0$6hN41k#!+; zINrF&SVIo|CHZ4&H=HlsKsfI;&$pSBER$q0=8C7aK#A^~Rttkf&<3rYjIIs0X5-~7 zK-fi|thr)c7z<)bpXyF8WD@pd$Gu<9(xMW!Na|g)l|QgQtra73U_!aJMZe}lGIbx^ zm5B1rH(}keZ4`Lf{O}m$VMv_}r<-E=BEQNIO{wK-NYf(e;?n$D1_)!TzoZb(A)ohM z>P<@Gx{x&CvhP00-}Sa_S`gMQga^>Dfcz#v(WOgY<&b6d1>suSp9N~Th<8pQHxZC3 zRTjql`x}A-g5?aE642DUgW$5Jjii~FO2-N;A?UD6TKOmR%2R50C!i>m~>Ipm5G#SJ6_&r*9x&QU7`qb}WAtoiRDg^*b$KMtm)7gS%oLDf`Y zBtNDSoSBzu427rNwwdfOG6;_Zo40Olz$3jK!cc`~c2>9_@y%k8PY?zJs?ASTzY;)Z z7KTu`hzx%|v(oU}2KnL2DG(y5np*Z|rYHOShat0gaBj{OSi%b@&t$L6Anh753$G8p zM(bF)+-k944n7=4YQbkH3V(*E%XBA#j%qMZ9h$&{8@ zy7QP<8Fc(w?cP%N(%~3oRvnqN3$D2MKG{VHhO-8LF(VA4tWLECRL^YC0!@@fQYlGz z1#R0V7ydOMhIz$GoGb6mu$ycBd?d4IpQ@dOWp?2}%XR~_x;$Vgsc}&!4af?-8Ik&+ z;aX%^bfU6Yg-QT(|JJvDJXyFi6F!%@`eDX&E64!t#5H;@AD$s<{CMPbQBo}RiUp+3 z(L_mbGXrXh^H3W9uqPN-8^{U;IXh!-jvWTy+;Nbjl_*gObjcHE4j5c*Yhc@ziRxE? zfMcxTSj)6}_3_f4QAyKR%6aq_H^kgc<8(w))$sVp#esP#1dS?RzeCQY>YhfG{9o=6 zHjZtT@FyoM;wsPG2xKkYPSSjmU;b-0!Gj{1f4_aobg6Brs5I<=k7+pCjPMIffb zZg#p0DQ1cCf2eTjq?J3hYB559?a@nc-!Lh;^^F>=X#V=hLqR(`t9pz!*rJT;=2B{C z5m$RD6{N2sTAx813#m9(X1yqeJsux_()3w(XEjX2B6lNcwIda6m8w)D{4 zLa-Z&xPfk7QI{T4zqDRWP#W4oH%7@zs`&O3R%xJ^9zEjp;`iIZ{-J4(wMVu#pUJLo z6xNm=w|%#ux1bxvK;l^?Im(ZP?w?)bfkG|i0fOLPp^8*e-g_WgPG(+x&!7?aVtdl< z9tQ+(N~JJX02wh&XCD=ZVy(HNV(h)SZ%YF~G?I}BN<3)aaAOVsP}G_Hf>&ISxh#OG ze+B1_7iyU$BiQeP8W|UsI(;-LB|ho*=Hx^1r;-v>0u;VtU}(TpHH}NbOpv$PDN{*c zWI5u7J)7B2P?CGA48}Ds*70Jh@GnpkJ z&N&vE5s<C_ib7)4kHTKz*+m1gQ^5CPV$o3wuHDF>&e$*!?HV>l#t_y?m8DXiKi>YDc}P zqgUPO^!M@cPh^5;uah=}w517m%|Dp68lA8|HDhnuEY=;AB)MZq1Mne6t<7S**(U{3MO{y5mJkOr6H(}6V=mmG58u#GzA)Art5&Xz&H}T_j zVT=pCPf1gx&)d9I4VaE^{=XXD7Mg_=9D+JhFll4kJ25N6?lzNs)EhRURfKCqQSf0A zoc*=4-n{BO0-DwZR`_El>>X)>y$T0G|5&&GM?NbM;*bv$vbNc3s||3lYK-ygcQ}`3 zx43;k4>PGCO-=A2D&pW71VXaNM=QT=Ku52V+y#}OU?>;0f!hJKds1Z`u{C2n=4NtPL$hmA?LW}-6JSG2OeS^2L;Jrr?kL<`x-dl z_^FF%Z~SJjoFERZcpUU0`?>02Pzo{;K{Y=0-l2n0hQ4__957cXsrdYnKILxpZFE)} z%b$Bs)g~MTTD9OB5Ip{&gGp4GYT-Aw78ttCnV|-x4`C)_O@peax8+KuD0*C(SvGA@1c>ngjzx+>4RicS_n3(~uLSAfy688{Jd| z2yh(qX5b*c$V%U+v8c-c2n7kO5Wke)E#_`GT;)T{&CqWs;eieEsymW})@O}E-rr6# zsuZZ2DdC}NyDH)~zyrd^mXLmF#3HmqK7tYeF0LK*0Dkol-JmIQKzQanmxq9ff8{#W+z+N0p<(J@{J_pZd__Iz2?Ufl*JZs6@f0gQ$0Ee4PX zUI&LVMRfms**y*;i}aV`?9Q*6${IO-1qfVHRHRP-t<_Dr&La~r5^IJ8!OI0Y8O)z_ zs|&ySf3U%(;lto<(ctY3i+$0Js7uF)F*zrXPC>n!H&oVr5lD22nP?t&a~bxl7{s!F z*u-M9f8zsyf*VveIFK#Y(LjQ;gBiS4)A{GX?l-7ZPcAko-`>!KXDO03NXz@8E?s5- z*-CVvuKFDG+9?$lXN8JS4BVAfPGs2u7fdHqoTPizLW3>hHqo5M~ zK^^QI1j5kE6@JKr$EX5ndF;oicUvh%_2+uv@w*X>gZ1@)Sb))svG)AjkDye6ow~-a zUzUysa|-I(B}9UV9=0{|WUlVU}eMJ+k?7kXf{ zpc#D1kS<-)>@+p<&I61x3RK}f;YTzN*8j{-9Lmp6JqI&s1&R;ERv>0D>$gJw%tl{Y zs3H-3n)J2t>*do5nm{=UE3nn*xbYhw5UZ?|J0G|486vP1Dw|Uvqn9wf1`VL%Q*b8S1<&+` zQy`a&RHn}40+nO3+g1?@wtZCm`+%d31xfSkse6 z(q?Fgb#xK`5ikDrbvRt~{W$XVr~QkwzrT7gaNFOe4sJ35MVpu7bq87~&r)Y03PEfs-tQ@y`d3^aYj&{tR5mq{KL#J#!pJM50uRTOsab(PsH#{N zc_SmUW&oK0e)pzQecBH))f1JHe8BsUuH0Z}C0z$qys%~E2q(B3aR8|ZfcW%L!-Ftw zpX(}DuVn0P1va~eVCbFbu*`7cCqOZabUo1tytrs zP3tM4W4H~@mx!EFKDqJ0(iJDZ{Wd7nc&lKn4YKvjAa&1!n=(<4&0iKr$5&Rw%Sqcd zgzt6U25Pv02aN6A-CnTK4XM)t;cQ6(Px?|^!NmQU?3T90f2X@XyWOj#K>oiBMlbq@2CVbxJ2oD{Cu@$e}4YI$=6d4)Q- zJ1DQ80$m=4Rq6i9#+Vj4X=TN`@CcG=wcyS#4R;4uWsk=tS0rvh$w5wqqGj??=44~` z8(e`KSJqvzK%Dawf7&G_l_Y!`X8c`wkaCrQtHmVXq~8UpO8-qymq6b3@4;t6J~wWJ z*U)%?xSjTBdJ()#>y{eZ3 z)ufz?@)ZdNu>MD|KB)a?S`YMx=pZ5{#b}(cvkmyCvhK7nW|n?cOWp<-YSa+vO%3%% zDTZ)vF6v?OAsJ*zPsQna;~QyS!KN_If1mXAb2)h4XQe@%@aZ83e|BcO>)_g5$YT!w z(5?Wz7o&^EaDJR`5IHW&PnGed$6-b=0UeO8Ws0N7D$wQmv}aau9UDp`C=Z>dq6@qR zS#Rm@e+Hh8eW78Ic|Ma3-lw{2r|o@$uyK+q!*OqK%Jhndg%)+fZ{Ax2E*l;ClCZOB zgGac_dEljCKIq)1Wh(;lxn(3hEAONA=brKo!AWGM|mb0 zD=KjNI#eaVwGtUX1?RZAicb%GRZl92gM={Qtr3SBF3c77_NJ>xj#Tan=4s|Vn%yK_ z);AKo42cy8vgJ$!l>cU@zr07-F>ZUu z8&?%ml277b{`r6q5T1jTX>!h8C#v_)DAU5&bc4V?xs5*{Gp1m{{H+DQ`2K();B8lX z(heTf?a#0NO$!yQ;i(H=(h^==W{NtMp~IlnWKa9HrEPBtr;&IRb=qfh@*dK46cq&f3Pz`g$!xUeJ95o{l|7D0 zdbhvbwLuy@LTslV@vFLuHybC0(FRd^J+3|f^AWIu66LJ%qu|!a#g}OnL!$&ijv4l` z6u;&_57-9vq&={}t1#jxi5kbO{Lr_Dwr%Rxu7 zVMec`$YZS&y}uJqU+w$8EI`WsW+&Th+myjbytL*bgP4x6G1J5 zAk82a8MM#F1_eDxI@g0Jx2M5unQ2rX92{thkC!8$ZO_nZaJN3IAG?ssCL)87>^bIA z{n$e|`;K?d0-QQ_*0~;t@6#RuV;;z7+5fhZ~W#cFO;hK{)!}Lte1U9fZ_iaYRB%64OIs+%i~sq_i3Z5)ebWvF0P}d<1!+TL_^YL+Qs^l zJuQA;7Dfc)HoCXW3Y-E46;0FDx8XIUo7tPsYbS(n9AkfvSWQ024p^Aov|;SnbB44R zd_nVXa5MA4Aw59gDizUl)+^^;tuev*5SF}Q_`+U7-`SqM^6xg% zPbXbDl3A^PosvT|v{Gg=8?XIkw2g$Z?apCz5dfbxUCa;>{6M7t3|{Yp)~XXMeVN}e zt4tePX;W5!L78KSvOJIBtts1P%8~TBY8D#YZ5@tH%%lDx0(4R4%YrvfyK*>?i&xYhryaAAi#b5uCYSZBmhJ zuJ|CWixd@f7M5KN#c{*;-e9_Eym1d=ReYh$ZLp&?m*ZhGjswC-!xyc>%(6ILo}zLD zvDFmdXWroygW(U}qpy?;E|<7pcFM;w7$bt`Ho5_N2qVXJ*63mByiKV)r*+CqD$Yk! z5uebM2arAgyd|Hy*KmM9)U|y_@kBWUFkCl0KCMhZRD$EF^7!RJQ~RG-XX`V z&IkAgRGO3=2c9bOmbJe3uHNI{dJK^2#`jP8bMF~C%BM)=U8ARuaz-9DeB{mNO3}>y z7r2TFTQpm*mr-hxvx|?w0JBT{MdRDG6!0<}aFFxqLC1M>N%IP|EHgj@r{(UuuM~Zx z&_PIPeRFFBHzq#MX;6e%wein4{G4$xC;1;Auh3=Q3IXmQ=OJK0MXb$>jF+#kZ+dg9 zm6sJ#x1$&fM*GNpNA<(K!+&veDb?% zz(28&r6NDRPj@y~e1v-iGcf-<%+35603b_F1cib}KWJGS#VZ|0{aw!lqxYl+_Y*_M zL7Zvl)L&o(iX0Xms6l3i5VBH8%cl8PUrbKLBPX9@JP69*X4%x}mf0z0sB<#JlBiwR`+PmATL7EVinUhx31UpM?)D zrArj*@pz>TG-Zta;I+&zV0=go!Cpo5?Y z1%b~0lwQwp^Irzn5H?y8;4`GA!FVs&^}EL!{@9d;G!xFTp%TqnX876WGKe6J2RpNy z8B;LIRzHhIo7P48Cli={7)v7@|A}3yGJB-7*77t6yx#@VD3N52<@{Y(-6@)cLA)M7 z)8SRGp#MGND|2e+AZo$vyOIw?WPn@VIUKbO6M2)k5BrU}6BD0EvwM(EtR6l6>PQN5 zsJIgsedqbVU#Er3@67ED=>6riw#ZDB6+}t#1lHG!zMU+gf&ixO#l-jcSt54XZKRwv zD~2jur_NaV%r@5k6m!P`H7wNZ35&vobPdC5e~?G)W^9#t1r8ltez0>I{`!(-%o2b8 z3oA1wzc^ANR)vSquBjhljDTE+U7GWuYO0we;5SuPnq3=nLDw6RhgWkKn_&7kFsAM_ zSqfK^bfFiKiR#XAtBoCEY3^aaKh6x}u!6Dqe8Rn=5h-4_?(Yb7U2;)6c(bXQYn-h} z4J*wg3Bq`txXW#7nq9v7GB>lLdeO(5K&e#l_s3@}s>0H*w}{fv?5@_A{gWrl{bD2n zcAf0Yh#6dYY>sxTJuhd}EA)X|gtN2?>Bj;RmTL5bMQ$NF5~CoA5DeQf#d`iA2_@W1 zK8igvQ*oaK+wz7okV4d$_M*s?LJ;}R)R#erjyj=qN?h#<`uwa%3-#(mUm5N^Z(w7; z-p6}K`V!h~xy3j#UwYb|^9(nJ0T*Fr9Zo= z5hRL+OXbE^`TNhuc`yg+B#+=1mfW$vKipMdlkCtL@-a<(RUXlB0Z$BfYWHgIRCJY= z(r!t^pAB@09_Kcfd`t>QJRZ}pN+}{2oV@Sr>P&4EvcVSVjOo!SSi;jNXwn3~ipzHQ zy3a`q!b|AUS9cUQo$q9o@`EH#3&gl7*;>{>s`QBoc!~xYg@iw$#JTPyBRSv^69bNq zop3Iy@8vSu`)CJ8KBNj`rut^k&PGg+sx?h8dt7$rzJD7~E5r}T6wk*mPnO{?d;xMb zd!sReH6)$wN7|RyFQ<0N<=a-;#N6~jc$*(e%}pSb*(TbT3GbI#*tOYha1#;1c-nrFRp-ls08gc$*k?>(}yyAx3e_AeuhRw;M z4_=DqX7?{VIzN4y8&(y)TDj5OHbuiwk@c0cKSKH)N@8!oy+2j3m8q-|-l=*b?hVJD zrex+53xw@sr?3aI*5U6MuS`ARf)|Kw2E^P0xEKnKt3S5NHvHC1{~0|367HlX+sd+d za>=}$BBePs`F)S?M z0uP`}(OyYk_y`-Tu8)1+3V*3+(x#_Z?-(q4K4o@sCs65xksdiJMFVz3vH9p0rDrF5 zv9jgMuQ{UF)pp!R>z43rZJN3MN5<{G!k!^)G_CS^n3*+vF|+%H$8yTQVt-d#{e{1k zUVosgyhB4HC`(SW-B@d~(^rQnNIim`uTu`c7iuB|K1z_2S#VxbgzoTf5%9tY(%+aj zCUcZt?Z2E{t8P9-s9)W`=#n?I{DUMj-3HSHutD@YqnplL*IRyibg!mqF%rqk;ZiOj zEc4tLX%4a_ARsE-Z4|I5Oo}ghh|Oc5A9vpm;Gx61>S#ZkXaEc&jFki$?_|p;8K`M+fyk zd=$K4oXsT%sSH86Omm=dc3_q=?pDPtpDw^{v3bAS>skf=9(GhkDcO}r>v-9H2vG=9 z3`+(+{X}fZ@@S&d>*#1Y^dcxpoz2ZP#gW4QZu&~rCooJW4%kNC5kjD)o{t#w93I)5}XOt35_Fvz9<*2l0 zCHe9i4fE&q!uMw~x3Dt*G~K>_4V*P|8#v)W zvnqb>n}hIF%RsdTwjgC)!UEA?zqX)Im~7qiqp~FPJZEtOOoPNq?9E5k_)1L_U)o#h zhA}<#=}t9u^lNd}oIg8Ju!jee-w=g3FY7x-?zkIvdNEBa$*qpHXYtZu%XvFn>Yv?V z`B&q4kItL1v(IoTn$~w+{DzS&v|3K|+E%D;K7WEQ3}!rghnLs#e|7wH4`NPp@ZsYL zetEz9LH`vc<>LkG73ruW)&s31Uzg+U9ixL?iB1pscy^_a)wzaZaTDiFFSKXDN3y`M zWbnr&i-VK)c$R%i|ISU!=0tDY@5aBN{OD#gyB%R`4I|jX1jWttZd}iKX&fNMMIXP) zsDL3D{lpe7@n_z>RiOD&4R)zj{g>A|wf-jOBt4%vHIhI_%A7QpwZd1{cii?_gadn2 zkU3qa9RJJZb*x3+@=w+eY^z~&)o)ko_d|oz7|&EJ9gW(trfb*qSc$+2tQ9qf*a+&Yh^GAB$ zReEgXaH`DHlgpjcR7U;adzrCaA4}1A9Yw)p?ixpHf7B6MU>J%XnTGmC+#iTE`S#sD zTwSC^Ds_9h3&nk1^MWnkktbtJeRyv4f?zx1zb^i#)?ntm63hl#x&n_tVR~z=|;kVgd>Z5Lh3wZD=g234PH@}1E z1hcZ-_0>A*^)o*{epRSTk67|p5qxZT)+CMWIg_ml zyU5=u_dCw(2Q~?qN_t;F9@k@O3*+0t=9E=@OfOlUUtQMEm8^%rolS?ptYkh-c2&;0 zZGM2uO}i`SL4A6BD0Sxf9A`kkmt^+cyCRxSou#`&tUx4nIz$xm`8VIQA9cKM{tEOi zdH*2h8!}$r{!M#Cid@U86@!@bXAVtm+K=~o zi`2j(xI$TT6g{&;2Mc(Z%bI2P?l;3k*Ehp~?REKHflJ)+<-cn!Dn{{@xQSbZa{9D~ z_D4vP{Z15mo~t7!8|mquf3KEqQ0v!{72%5mmw*3)KWN52F?#lzbna-~Zpr8ObARrl z>eOF-laIgF8;m`8p(9^(r=p?jA5eK_IHs4P^h;=9idBu|%_ti-4N4l>AI$O!)BQpJ z%hZbS!AagcbY@8L+1p2Y=0{2hfRxapWH#4=_a7u6|8|af_AU6$taYK~b-Y`ExwIF9 zc2mY!{?^eE%CaBlXfYP#$wr19UiDkh9gw6S8jICF(dOq7EX8A1R2@k66ncBY$d`Bq zK1PEBeHTU6`pvt%9ofho;vGMb0ZFEIb#v2@a%R){&-Y-Bu(r!3Ac@vgFReYhPYr9D z&MhWaCq`xrsqAZ=`N)Zr)mn`Hm$!M7X(!pJWUi`ukRZU)Zn>HJ@1dBj85ss|duvn|hx)Co?xK{9+1W3ZNFT9E_(>$=Bc(SZJ=3$OFSQlU zH7_1Hz1>)|Pn5|rYofzTrt1Si0)0=nK6@*!LtD#rBuW|gV)rANmnT!zZ;bGZOnt9W8yrfHP|NJ7qK=-4o=L2o1U|q0t#W-vH$#|jP zKOBiiDuWJ@5w=V8v0l4R`i)F(l7oSYdsT|w-r#L)LD^PN8JhKjlA$>3hhUUbR;198 ziD}x1uCECK#eG`OzqvHjHhRmaRJ`l0Gp$sOeT=+4n|XL8nRO@L$)&1#%o=$G&C;xN z{PG*|_v=R{&laJdnGoZ=9C3>*RM*f5QZ7@^GK&fw`FL&;)s1lGG{eFX{je$GZx7Yf zf8JGxx`d*N4NDnZJjfPPWPVwJLmyZ?v0(DxP0f5ajRB;-Mz`#MNx<8 z$6N=TpodsBUqV@?3{*!8UZ1;GwY}&%0e&3}D957g#3qCVPjDLP#jNfw-g{8u9a{3p z>6CxPevL|+)o#fN@0P!JuDDm3D=bRCvub^qF3|{j#WD51l8;}D^RB(Pr+I`H4B_cF z)au8R$@3Ejj+{35aj)fY`9`OXa^{gw<+5mlV0HiJDVd7_yc_#!XtZK_f9de@`uu+H zTW>54m&!1OAV>%LyE7T(uP<}nli^!gj3@~Tty{Wi>JF0c-<3X1(FLv# zZ|_^CjSDUmPbW26j#$g<#Ci^-gr!@9`xOuhQ@uBwnvUQ|6w$vqQ=jwXA8$h*0zR8C z1}gH#z-o`-J>f!aS(1mIH&)y!+rT=A7X;ObxeOD*MRocmR}(#KaecoR@>8`b~yI(x&eTS$c# z-$cb0aeYUQ8;UW#LrMLWl)#7w1DjU49zniUclKx0S_~xa{mPL{Q9zMi-d6pHmgrpIwYFpLE-PJjuDEq8&GrZ)I|D3n2I&(@Xp;+MO60TGJFyxs>Ua^?b(oyMY0tbZDi@q00u-cu2kVKRA5IH|xub z&*w&81eT!#eEb6gRJaZDG`I`mR&;XLUZvXp$5!lj*pTBzZ#|RDM($QV<1kE2SQc~U zG6(6aJ2^AZ8}A;(QU*#)k&^9Pqjav;4a<8=?6S_b{6p4l@tGEsy&}@K%8xMo!@wUn zo4y2q*pBjm{AIb6^#7-^HxGxh>jTGcEmR08Yw=W~LR7Z0J$gzH6;XD^QrY)?9ZIFF zPh`n9AtZZaA8V4zmYv2}l6^N>hB1DhTkrRJf8X!*zSs56A6>5Q`#$G<_Vt`2oGom# z1tqoX78BBeDf|z*Jx{#(M^*L6sV{Bu9v4Q%_U}kiZ6k9%9KxXW@yhs-B@fsEb#$nW zIzl3K&kg^aHS^hiO=w^HE*x)^ALrixStyts)_IL|cCtV0V?(7`Zk$>}Gso@iUqV)t ztf4*MKegdf%*yp%Y^F7dPMi1Kov88tQqYufM{4%nnC^-;p|qqL0&ib$Cl?plqhUgz zY}t=@F0iPkUjdA04B~Kf|3|ch!ageAapG!-*i0u|^%1(03A2z3E?Jw}EXQXXz zj;z~@^9&tq1h!l$9a)(hUS1_Ow6yehxAc##G<3I&wUlNP>sCtZT1-4;kNWY31*H*2 zJTFw#@T&`YboSrp*rRdy)bpGC9Sba0)iIYs#;$z2qO2mf{ZF!QpCa^nveNCWW|3)W zUF8a``{A^BFodN)1XQoSd?vu=6+}I4W2vRx(b}S;wY?zwbI6~zJ56RknPW|QBF4(~ z_s0d|OP-e*GpiN72E*XusAWZW%-(;*>Rfgc*V!4D0~;P)T@6OAR&A1GDy2d)$P z11A#wfoFtJeWG4%`y`K8tWJEGd_HS{S*%~B>;``f4MOj}T4lMHtGIno=`g*<(W_2e zLK-I`uL@|M()^NmJL?~3n&_3!GO<*F^uMnrKGS`M8{)dby}ka)aP_Yf$J4GVKVMIu zC6X8Z@o%Fnt!=fZn2Ssva{kj*B1pU)Lt>ygb)fN=*uX*;;sz+62;U>=DB{WA;mYc+hcd`FKZ zCLY5X8yb=fNmv3mlS9xbu%X}HOxw%R*X>U=RYXV-H`%*qIsK@~N19r&wzR01w}dt?;i!km#uD4e`v|Cx z^h0S*)GIeX2fBKX2aiDN&r)F0*`A)PsDrs-&`_@O@!<&(PGu`~p_~ zvdra6mt_@U|6D~?)v@r#C@a=$8j+HH5nJx7IBSepTgaHW+N0B}X+ztcbiZ|>@fdOF zSE# zwE2+LnYOU>c&&H+pdNd2L_YT9ToK(|=r7$4%~AYe3H6ItD?R*{=F6B~N8V2n3){}) zHNhj2<29BvI%<1k&juxJye27lti?Z&B2?#1t+E*DKR3Reez!?MvESlM+v1VVc2Y&B zb!ml7RakBdX{)M!G%6&7oRDL{7d}5Ph|l7G3=WDaUV%c0m;OTLp%nUThbWruaC<=8 zA&*QYah8hqHV)~0#|f7L(-VT#ij{<#igF0G2V~{u7v|QaN@H|-6NKeUi_N@6Nm;SC zgoG7^H)5@OzHzu+%vRx7=k)o$a7u+-TG(U5;}xFkXZW;NyizgbtGbnYOk#G7tQd~5 zqWo7H=G?S)x3i5J$-1a&ObvKfj|6=p4s*x&5)%^*4UJfyrV*Y)>=*g*c_ND_W3)m^ zqn8^sdoa%b@W0&BL|vL&8ZYB{T*IxJZQM=%4>HNkkJ`7kKv%kZZLKW2y4W~)xsmKe zbaJT!`4rtj4mSvP7&q=&Y~pjbl9E^dn&|7b=;5tlZr01DrfHs&qfIp@+|PdLPnT-e zS78JOEh!A^4_i)u&Qiz6-DP;xGcGEIvcG6KuIS5o*6)Jn&3nJK{h-nhW}Mmt%`{DR z#eu$ll-xuLOamu_P&!{s$ms2{&40^l{BENo;(*8C5KZv;Rx18f{JB4+u=;}A@BhLw zeVMQPGr3JDmdT(kd(=C#w6dbQx)|^8>g?_&$rYZd&U=p%6n1{Q=XWGvQ%b0rawBW5 zjT~ol9^bZf&9|@SYvU!|%4~0K>oh-^LFVpCrQKWa!8TX;V^4D~ND6E(sFzUim(RUw ztvrvV+L-hy@{Z0|o>!13_}YdFVOdquI~F3`mO7cckEYV^Xz@0jXC_uEpI6x_@|l-p ztet+V52=0YCw1C-ZTM|zd3SS(dJC`7%#DWiDCO7_Yn>Np!y(6NEJL%mZ9?b9oe6}J zo*~HWlvf-ZP`79wOY&0h9HlgE32fis zh?4`H2$g@o%3fige$G~6YkGTwi}a@mx57&``&2z3qZ>^+n6MkG};$myC* ztD?NCZ8@7oU8g>b^snh`Pv>iQuYS$A(={g+UwAiHOSIRv2weL?We7hfXQ!=QrT5=k z8s!_MtTa5*1GxdCrto4)3`gVlxG;eyIGvc!z$er}=brQCjFN>Pq!}z)3>4lQtUKw= z-z%Px^yhG`CFTuZSibY?NRyv8)A1UHCJ4&FLm3=t2a7-FDEEreZ@lIkvp$h!b>jRE zG5B*wlhhZLBaS&-<{w%~oAid*R&L79zFW2`p7@!;W98B6OqNlnO&lM&!jr*kos+$R zGFbeOC+Hg- zhux{_1bFl<2|iy8oU|7AHPr2%>PhtOd8!qbN^5!)YuCK)D_XcJ^S3QFYw}dRRF$^N zAPYZ^<>{z62XM$#4*$Wa->dR$`nZW7ZQ+p2oZehJ4LW%WT%eIJ{nq|O`y%0tErw%a zPMqu41oCK;K_SJnCDZT5x@3hD415|nIZNx?Be3h+k5$k7Yb?sQ1Vu+h%qL-f56SD# z%Z`Pw9gNVC+Q4LHx5*CrUUTVLQt+7o+ zh9B$L=H*MKt(WfK@pou;KUM;bZ;>;s&OWZdZS)S&gPYluJp(2AE&IkB1ACLj4%uuc z@VA!SOu*nv3*9`uv9d>7sDEZ;sq&j0$Hmm&!F>Gf-N-g3fcWh(eVJsZePSU#L&+2C z);UCSaMNKf)%cvR*y1jEv5~RTThXv(?S_9A&#C$no;mOrK)=j5)KiUf6ZyYA`|M;iZ4bAJnf9@jInN8X?pJGX#I`Kn=U7Z-Ks~he&~lGy1|@}W!Y@_dgg!nxNb-|c zXo`^%^Eexm;9x5y9J5J~PTHmWkMp{JLON`$eRZQde!goaX?~-p^$TTet1IHk-+Ugb zA;Yn|5AH~&Z{N2~mkcPiQ5XF<_JH48_eIYm&Dez(@^d+072m~$k4uG8IqvMDU#wm( z7?H$ah7#8I{f;T#LAD(GCjv#n)O(r9*rbKycvfTld}#aPjTp zyF;nepAi|oK5|C;hwDR`Io&pIToX$OC+h3XIpC6vHpzw?ubxpPmuP3ZFlz zNOcQ$1`(!amsj0=)@tobnw~~URu$(=`T5=!6i0BcxsxN9+Y&~CO{KN9fsH`d>#@EI zTBxb8i0jovd81bLv=4c2tJR77B0o(e2Ib}K*Ltk&A&LZt#_vL>4J%WC`lofLkAJy9 zs~)B!G}T_O#oZ&<-_!SUa`PdIE@O}vm*D=Lq%?=n5rM$p_oRu$O$MFP(zVW4H~C+xj$Wlw4-va8A|y}^ zGA!D936f7Q^!j;)PK1tTJJi$Wv3}{9{g~?7eyslL@@tl17Ml^F{6ktzMjb7W%z5n7 zNCrfCIiAq@d&ehy-lWMf-C^8W7G~AQjG~~CpW!LHXzP+G$=;IEwsZN79&6A4){0lw_)sLiv!rXz3)}Ov(Pue+n9F?c zBdvW;dOzixH7=WIm%r-i#8%E(d(rrU+|bFYyOOR%8&@3U{xfGuS zk^{8_g2DR8ahg-9c+&61;F4Uzmp4Nmzr>4QCX`Lv*}e+X9{Iv!5lHl=tF#g|EF4I; z&b{AfZ}Y&#Vqt?Qt{Q23H!kGKjt=$b@ZK`{5k#)md3QHs+Wx|&s>)g0U)eqPhM;$} z-i|8=zpLQy&JW~M9grLB5vjMyv70l(45^tbxfd2tjfI*wEO%IEbl5QReq$p0nFS#{ zlp@?6j69}mxaP-NF$kl7siVSK+jCYKQ^nd+8^5zTS-Sja;u^tG{vqFEzfe;yt@g3B zeSLVbXmBc;89Jf1i9eh1k^vrNN)=}14f-W7tF2|5vJ)UIhAQ>x^t(LcNsC=;nF4pRKU>fx6q^$dc!U zEvIzH3+e3iXb(|@E=6J9Mf>cn$5eNZQXj|r(lPi4t$HfUWzDaI%n|;T&|eWN?dD$` zr-id2Ch&-Qb@NWjVM5wY3v=M-`Gv4iUmQMuod$(VJTYOdO2mbJ@lx;giKK!Q*_GDm zPhTinQU_C)Hy@Kp?UhbD2=kfs!Lu2!EQ%*lEMj{>0Z04F-^?;^U)%MXy~ox;K`7_a zO7UD$wnN|_!5u*o9Fz)?Z71_RD6j=(ehvyh612EA5+NlARVt>^!j}s!J+t)foJjJg zVH_ciG5&#cEJQ5~qnnKl>muPhU_N22Qj%%GwS7QqUH#VCb)G)kwZGyUe1~(*${%Bp z_0Gp^S#V?`mGdRL^BWFRXizgBVrg(S-~=^y6xK z6x-@vONwqq7Hu=r@D1(#4?bW#()^vscH<0I8?20!Usv3AFvVzJ8hq$H|B`%7#Z->n zq}oHT~uoCwDKZyCj7NzD5#r1ujCm%q06Q(VV|5168y=vgu;OU_gm9-2vjur_#1p{gMk zZH`U9vfh|&-~ajPW9THxts&!C5B_V4A+738W36fiy)lD$W4$R&3iL7K!t?a!D_Qd_ zo-8)Fj&D0$iTe${zwm~6ND{yBP}598D{@^txTaAP6!-N%%JJrY{?Z8O%AjIS!Sq?w>-32b`rAhg8<$m#zu)qeR1pda9Pm;eZ&zvShq~P{_H$jQP|FeiJxAFC^A1}$ycJA)Y zQeFJnjKAjh2B`a<`woSM5lIi0aPU@rja@%@?ks9eVKPBb6XVA#0xjFOGG8ZXW!slA z2WI|>tp7S+X8oYIawZ&#C)}h5qjk^ke%zU50nnVP`=H*a{R`z<6)A~jV>;0tO7yLJ zKVX!kn=(4}jB037e}D9qlZoF5W!MciQnzn1p=mY#zHtr9>cNP)@ny~K)4WoF)lh$n zsH-5J?wK`fu{Q4&G%|M(`afSB(<%H%GaWK!EhN8|)dTT$uf>pIeuppb`uCCm8Cz+c zQ_Znce{o&pLnXyTiQcdN@3(jNd0pgk>)ANcBx-5i?aZuijMVybvCvYvB}=Qz@zTjR zqqf5s$m3{B?67ERKJNOEOn6(qJ&$lzs{IkSJ1)~dF-YyjFb2Zjmb1KSAXyi=4rG}f zw+cjsxzc_nA=e|OkTr86R*euPDrWkP6I!)L>(r{=8l0*J!w-o7sJ{u&qd#?vzV-NUuoRpD z%vFoKHk7l%oHjW*J78Uc@9BMmz81wbOUq}rKezU*4%NQ2vXy9Z&sy_WgQ0iVW*8CA zAv;IEbPq4TsD@$cZHb-Y?J)kjvEn{5bK4K7mF0B8>J`E};=fbqaqX@~jwSmsR2zKT1zq1XG6TA}B4TEKJ4Eq1f~Nmrd# zwM-R50dl}jqyBQvU9JY7pzGi=St|3vxdLM6-KDbd)R_xzh559v^bS!?%* z5%UU#SfJu z;r`oEEg8ZHLR*QSgwR|(d}6aOL(Ue}LyS?_dfm@gzk#4zMb(RB$dPeW!kL=88Ym+*cYQM5UjLH%#KhK4tq`qfuso90g9^A%T z1j{}+mIYZn6j)brXGrn#bN1uQ*^#Iku6%d(^VQFzct(=l;c<&(FHJgRc(3|ZUJSwK z;%D`%jr+C4QTgDpNDe%$odq7QKB=4XUbPhk^uX7rMjg4`wAHQVHutM8CwS0lr{vqP zT(jdNctO)jRTn7-_!y zXXX*g*@}AZr?f5~9fEql-jWS|f*T3&@H$cPR5Y#naoQ*Qu9=Ki4o*8>k(soKXFn$u=2pclgYk- zy~S4{L*g$ksC|S)dH?J6y~uFAR-OIH{6{m56R}s`#hpcok1JdE;|l$R$u#)JoMaG= zAnUbS1@`Ve(n5D|zhB5(KjO7SfTn0$P3kVNrH9?_cuZfn@H!&$7KLfiDtL%E(uX!5 zz2dBaW@JRc;D}t>0g(Gz2B9~>KjMCHA_3~gdwoC?Uiqy1_d8T|_9cw{Y_txA53Yp54P5@X*76D){^#xPl|c>^%Ak?KW1&adg@JkCz8h zJ-?wRl^H|E?3m|l-MTV`8+jRe~%BG{ofZI8)t)!`aSp+z+8 z0!SH=WUR;{S09Ao=t)_e5@~}|;X>eWClsRiKDcVs@Vt-Wt$U%*V=uhob;Pz$i-asRy+=T_Z>O{eOyQ_`DoC& zgjPuRrQQ`e^c#R%5%Lqg)Pqm&5y}m}iJ;9{0Ta!&UPmh5ylSdiu^M*KKqYt3en<=2 z-&P~kz6$oDSm(UkEOtPlrdsRwY`w95``yRI^7A;|(yY6g2NPhjCcYr|5XtPCrfWNN zA>C^`p`}wA7*9O?(>NSZ;91MwS8nruQ3YmSv$J^Hl2aKd$B##EzJ23n*L zOw9qHWwZ^-aRJTS8kOPv?KXQ`wkI zP8n(^ef(M??*iRqh{#8$$+2QLMW($ccNX(0#W-3a(a2CsH1=K_f|xiRb|vPN26=c~ zIr|$eHGDn?M+MlNCuVw6&8=c=JS%$v>b;i_8l9gF9)nYA&PF@`bqFv+^V>LbrS*fO zmm9wJ8}Nv3Gt;cp`xhpngyUz}F8q{1bq&pFgBhPPG(t-1w&k?uaL9uhN3K6=ad)sA z59$}KlWU~|R$5@$QjJbFG}I9ZNRGACK`7=eZHRah$~sn0sCJuNqDJ1^&a5 z+40Ozf>hq=|GU5*)OW-4Q11Px z;4Lt3nKvdgq{-q3MJ7w?h(bV$wv%;G1L`(vs;`cngC^;m!?iR{jfuVb1 zLuYL^O6xTg4mFF`{eh76kVoR7?8oo>``6sQD4CFeE~b%tf1a-W7uWFC*1g-Y6(1uiRE03u2QNcnA{T^DDdSK8J*C)gyCMkp!^F z9jbhj06X^!U&0=Uqx)bz6b^+ZXs9Wk1`G9m`2d3WE}rc}#f)Ucn0DHjxn=ip08U7y zM(MPc_eHKLwWMh1mm2Oo8f5>{I;L}aK;17zpzSfL*33rm|4h$Lzq6G&(ll1Z3PZhn zF>JQlz5S`QUH9!vFB9O!2rNk>ex5(+u2r`nq<_ z0hztWPF(>6qZ=TmE4QIwrJikFeyUzUPJT2P9g0Qf7jFZ3CVT@`fC2HuZ?hXzZ-L`l zTn%#P9|7=*O;`);?Y2DG3p*??o+%5F1{7u*pFbOY`~n@pL;bC*uRqSn?n@Oh06dcXD(VJS>j_lA1mwLnyZ|t}*&H2^2w+O@(4&jM!}F`1x+^Kzbs5NFXMa zP>A*kBc95T9G-;D94~%~NT6T88M+ERzT{s`J>WG3OtjU4Yt>Ks`#y@{(hDo~r_~Iz@_md2UbSztEPVGI^RSBOHaW&Ix>v8uc}%^kH6s;1hz>z4Ct0rQ)mRO@!8Jf zz-1B&sm%iu>84sz7&h_m@rQtGOx9)L%6vRHQcv44UaXX!jR;mU{K`ym!rO?j7N1AU#h{kYxy(e#pcG*j(sv z;M$+AEnNzI$_NrNw3}1HWqX@Q=u9t(bTv&|^XC-`HMe5nVddIg@^CryOhMs!{I>$3 zk?KG(M?X@g+I5x(&41Jd>*~}-bYVX?OP6}QPvx>S*&|MUIpP^P(eNqTgK?S@F*zvp zkds%3`Kax7wTByjAA{&FF4}V6gbL=Szt3hGmI%k$BZx~1n@3ZN<3uMGbCW^AhOKr{ zXB8XLG?l=@&l#UmWsC$+DwqbI5u&xJl;PoNk)j9#m}o-CKZLrx)vA`oCOHRf+s!H7 zU0KR=`9arT`JoF5+DK9hnIox>X?NWQAYBM7hGCbB-@16Z!Yv)p0hSViJoV2Ts*Ib* ze$U_IbaH-U3_;>-ir;oxu7#_s`AZbE8No1FSiD(BgHCaNs`Q*=wNbS9E&n|b1)4V-rod8!6)6)wwO(AW@2fwxy zu&q&{w?!^E@SDH?(e;R+7rsYM26zdm)5fo7X8Ox{-{0g!hBb`n^XQ!h{4XDkXjGXd z!V-7q4`mAtpHnt1HD;ElFd~awyk%XXvD&yyFNH*b)+;bZK^~v{*N#E-VAWh2fm~ryaZKlPd#5xpJSot$T=&i5 z;;uM`3#;XQ+wQtn4Pl>$L08e7SSyS-m;5}X%Kp9(vHN7eD}R+3Tp~;S+PSe>oS@7+;On>C|f^ zbI$PAMDsk1J_eoAnf>#k67_4cvO2p9k3NPGBJ${sx2kolc{U+p@o#_T(=DzbbGg+J zsC3aI5Iz4@P9c|muA&aCEcHp?x9&d<61GB?)~7ENq_fKN=BDnUB>~~!XwHQ6r?6QQp$;fGmUCCr3XEF@GQ(g@OfJK}Pf+QO_^ zoS_kYPwhSv^IzRVzszI~5VrKY3b!B@a$~t778B@clYG?DyAblDLr{EI+$&kC;o*iE4d(ZQw?ktmOiQDPluGrue`m(LdXncM4=n#&93?4C=u@6 z1mwwSLXd&+2gA;+V)^pw7sUXB~QpA|!SplY4hLp{=o(?(w@T%a)$hg{| z{8zHs+?aM2cRUps=$Q24m6N_?Q`xp1!VUmor{*);(zPv@A#C=@2N5vcoLv8DeWC~$ z%q2Sr$G};yOz3@9!2#~byeWGbUYGd?bmq#xlwdTd)}-<-=ay5=y|_f%I$4F``~u!Giw zL+W9+(or$_1c50_vl9}#;&|n$iRP5$?;*~^u=fzT*ijpjZeB#$usdJn%E|+u-@>+r zOl>ArJyAAE+KZT!9K6D?6zgz3>p8H#{q!PvssA;H8&9D}1So6K?zikKxPwAp`p~7- zVAn5wS*GDvoLMiSm|?=uV=VUo4aOQ=hj;VQHRs>N(qQ=>DQuvp5%bkQT+6xP{>PVN z2SIYnS4SoUb@P-K~jIz}lUdP<*l`et9_>o$}qmQwK zDi=4_?|2XetoyP{%$RZYF|9{s{Zg9;kN`cMh|4WyJ_=ldR?|K(vpUzUNP(6LxL56u zlDJ)nIA=m_y7{{8Jz=qo>It@5>Og&sL#anIZ09rymmr3WnHO!(ohFNb9MtI6n1gtT zXTAfz)>nCN`%@1Tw!hnI_qfB(1E3ElPhG;cB6AZeRoe=i(+2&spxegp$WM2T&QA@W zP|;)#MaGBPs(I9D=QqEug4S}W*l%e4)F#99cmPG6Sd-?YeRF7GHs%;gvt&tP)mQ$` z0_V;G)>^8te{;2UoFD8zp*rl+2`sCsjC|8?DYujrfs7lsRDbWgfC9|m%(~&9X-fHi z9U-^j^TW@gYg@ccU69BTS!sb+7x4LlUlh%a^-j|vo-zrwEsns#$q7%NAmjYRnrln$ zJ{BqHZd8Ot6_3}ozqZLR^uAd_gl;zfH8x0xSi@Q0&VT)?$P2Jc;@yADizwb8`&#nE zAfHwp6q2gF*GyCR-~s?-IEC-=Am!I3Lj2PQ?79f~Sy_Uc39d=z$dRrr* z(viJi#`#Z#yl<@G7iBzKvvU#R2EGkJ(7yvrL-q@OdpK(4lvU76est>HJJFFN{*<47 zOrlxJ@ug4w$+pjguXl06tYXzU+ZHToz;ze)b(NEzTO;@E(FK3D-yRRT-WaXD^RO|E z%}qaPu)*=CU;#4D_GS6U)P{2T5x5BfOt9UqSf09`1Qtpc`q0UCJ425)M${ zmrj?SKy~$Km+hLh#>7v!f9{nsYptAaeY?OH^59o}$!DUzK!U-9+FVONa_I*dOS^r;DZ*#Hx+YTzr`@C+bg ze08BUbL)xsTkw&Gt=Y@E6=;R~b2z~jxHXMpj!F@9yojAg!5gvL7WA*&A_nKUf=3?Y zP3X1tfWxl@;dZ~h;w(Y|a7l#T(BcLgeB{OMnZj3z-9FyNNCzwUV+FmbVaiI~l-jErH93r)Q_jzG(c zZ7_!n&-E&-sI5US1a8Lf=$AUCy{DB-=$fgQ`NQG*qQR{q$KtJ-9bgTj{{V+9(Gs2x z4APFlodFpAEc#=@JTNXXp_YU#=T`8k);m1p_82igm+n=)HuicTIL8uT!hy)@e^XG9 zg>zW{yafwWOXgJXP1bqT2d6K=$yF$|9my+15wSP$ZR=C?Ja9)>O{<2U3-DNYS|gLs zBPi{QWu)Z+x@JSWZH~^Bu%WLl-)64E;GA%2Nz39&P{g(KD}0fNc``=v@-f3MER~_@ z3IweF=L2j^Wv9iA?RG^7y}yE7ou?FI}q zvR2i6T7<5di6>lWRD!u8WaaI>Vpx>%<-Mdi9sTy@X|hPu-U7t@Q>!A2zuY#V#@Onb zHp+f(VXbE13mn5`c%=Yi9OE#`N~No0N+B@xZHD{fP9+wi8C zv29frmp`CET6A(1C-EqPfO{{e$bW#9uDOcmR%D&!(Ulk*Qv>LwuVrQcy~y+NMq7{3 zZjRakJUImJ&;Uaj!=rQqLbh5_OAH(#(iZd={`Fq*HF?_ECI}0wyO`h*O#~@T8wf4& zA8L9}rJB7}0)I`0PB?@U*K?AL63JanX)We!uH{&RveTs_f9#6$xv18W)`?ebLdj6p zU{kyD_LwVYo0#&wOmuKJy0X(5`9lt|2^!yu#UbmIE9qEjZ2cHlbM%eZ$l)Sn9DDy- zVNnHbl_gztVGzJdh>k;KAXc1fx>5GO|Vz5o-lT8*c?h z6N+-*)&o`a6jsoBH_+2-&MW59UeSQ^dUBgFOT^b(JIrsduGC1<@8b?v=KJeV?Er~7 z(Yv4^(q#bGY=E;VT$&o;gTtqaGwLHQ(sYTXvD!O~Da+x$IcENAcFf#~LOKeppPTUJ z3$Ug&4NUq#kbc*5@20?%JKuK25o?gd2b9$XAGk393Gk8KOA4*wJ7%Fbj*>uX_j()4 zA8wm55aO22-1$~Ti}GH?PBh;8`@}WyT_Yu?@^Z9)s|}z1!>X+LRRcF&B7mXoT{eL_ zjTV8*19rL)whbqDrKx2T)!+L{w4d1(XFx#U6wJZie8v^=9bs6@Ro5a$_d zYpVQ=t)F60b>wr`>Kc*Yqjz4C;RfPjLzg%fqTc&%=g}s+VHN$+JbPPc(Y}Q+n%Fn& z(9OHgULTCoFlKidM+u=RdsKk;mY^oAmywLa`)&^x@O;z;+fZh#6KFL$ztnFMnX!Xf z>Ykj`IB;F^27=+_OPG0R59V#D!kmAVH*?<^Fsv;+OxG#DoPkbRN4(GtC-XXe24^Mf zA%^O#ye+&dE};hTRXF-212PtgPkI>GMCR0&`m2B zU6^5gL21u>1NMqb^VW`vh$&F3H{YrhGbFE%DmCPsM}(M(3a>m`(}F6!nME#m@D-eyempgFP`wiX6fw_m%c!m5zOF-l`qTeSB5Xjt|uO{-#-2sO=okOlj*0c5j^ zmGMB77Tmxc{+f*LYc)T2=^`#C>FYI|D1KvaR}W&u=}b4SXu0GQ;19iRq(~J2@olYg6R>z_W@JW^$b(x zrE~a>7%(qZJ|M)?DxJe!1bvErtKDPF5jzCBYXe~NOH;YPBee3CSWt$*v~a$)F(WZV zI9ny2x$zL>Js1U}eon3z@s#9>z~>3pPSTSi$;?mbl^9L1PJ3KwP75ySNA$EINocNB zzrHvr(87qaKrhQM)fq6Igkt*D5!X$1>$-VbtRXOV-Zp)Q<6T3nu@~)qS8(M+P&*gB znafJ=TJHf3n(38dwnrSciAT;aTc5HGB2`C&F)%+LK-dC_tRA>YHvF*9B(HeON2><* zT5`F@@Hq9p-vwi2^SOP$(WDZ;pPQ~(QtV%--fzYTMyUC{@<8sBxptZJ`#`gh_Un2r zQD#P>^gH*W+~?H&+Rs^m6`Zn}>W6m^^Lr@DXBET!w@7oDDy#n`In@iOj_-{eZ-AWP zjj%sa`s6S;3V+`!f{P7f;o6km7h{x9+0yCeaBB-<@+mrSeQs4v`zERz^=0A6{tah5 z&&QO#C?I{^cOX2OX(3!eQNdlSSG{gq#Zw{*nM(0dIz#(w*}Mjw3;yirYW{vNGA-Jj z7QXYLT!3({rPtgwCyLQ$hzh@3M&9hm;d2A%9|81u{@N`In<$Cy3-H~Z#Rf}5X0z=5 zC2b=OljEf76rWH4H^pnwe;9gtV@)9Bgt& zA7Xjd;p+5A^Kld4A;AE#r+P0O7O?M%PR#6sVV^j&LRg;ebsT7|$XnalyPz1e7e!fM zL21!#8!T-@loLR}!PPlqzZ!aGoG&tgOtAyDw-BtRjorfhgND0+0qli*e8 z0Nf258$iRs&0PQ2Unu(^`%K^;RAm3-C;#uq|Me5NM-V9a-v|0V_rE{?_h0{Y?*HE> zI}87xKlwMT|HCK$GlV-Y{zr`d*IE8M5&qLB{|h4iO|5_b^}o#WpXU3Iut2&2$oL { + return (dispatch) => { + dispatch({ + type: 'LOGIN', + data, + jwtApplicationConfig, + accessToken: data['accessToken'], + refreshToken: data['refreshToken'], + subDivisionId: data['subDivisionId'] + }); + + + // ** Add to user, accessToken & refreshToken to localStorage + localStorage.setItem('userData', JSON.stringify(data)); + localStorage.setItem('accessToken', data.accessToken); + localStorage.setItem('refreshToken', data.refreshToken); + localStorage.setItem('axiosToken', 'Bearer ' + data.accessToken); + localStorage.setItem('abilities', data.abilities); + localStorage.setItem('subDivisionId', data.subDivisionId); + localStorage.setItem('lotusNotesUser', data.lotusNotesUser); + //localStorage.setItem(config.storageUserRoleKeyName, JSON.stringify(data.role).slice(1).slice(0, -1)) + localStorage.setItem(refreshIntervalName, '60'); + // for demo only + localStorage.setItem(windowCount, '0'); + localStorage.setItem(predictProductionQty, '0'); + localStorage.setItem(predictUsageCount, '0'); + + localStorage.setItem('checkPasswordExpired', false); + + }; +}; + +// ** Handle User Logout +export const handleLogoutFunction = () => { + return (dispatch) => { + dispatch({ + type: 'LOGOUT', + accessToken: null, + refreshToken: null + }); + + // ** Remove user, accessToken & refreshToken from localStorage + localStorage.removeItem('userData'); + localStorage.removeItem('accessToken'); + localStorage.removeItem('refreshToken'); + localStorage.removeItem('abilities'); + localStorage.removeItem('lastVisitedPath'); + + //localStorage.removeItem(config.storageUserRoleKeyName) + localStorage.removeItem(refreshIntervalName); + localStorage.removeItem(windowCount); + localStorage.removeItem(predictProductionQty); + localStorage.removeItem(predictUsageCount); + }; +}; + +export const isLocalTokenValid = () => { + axios + .get(`${apiPath}/test`) + .then((response) => { + if (response.status === 200) { + return true; + } else { + return false; + } + }) + .catch((error) => { + console.log(error); + return false; + }); + return false; +}; + +export const isTokenValid = () => { + if (localStorage.getItem('accessToken') !== null && localStorage.getItem('accessToken') !== 'null') { + let isExpired = false; + const token = localStorage.getItem('accessToken'); + let decodedToken = jwt_decode(token); + let dateNow = new Date(); + + if (decodedToken.exp < dateNow.getTime()) isExpired = true; + return isExpired; + } else { + return false; + } +}; +// ** Handle axios token +export const SetupAxiosInterceptors = (dispatch, navigate) => { + let isRefreshToken= false; + //const { setIsUploading } = useContext(UploadContext); + + axios.interceptors.request.use( + (config) => { + // ** Get token from localStorage + const accessToken = localStorage.getItem('accessToken'); + + // ** If token is present add it to request's Authorization Header + if (isUserLoggedIn()) { + config.headers.Authorization = `${jwtApplicationConfig.tokenType} ${accessToken}`; + } + config.headers['X-Authorization'] = process.env.REACT_APP_API_KEY; + + return config; + }, + (error) => Promise.reject(error) + ); + + axios.interceptors.response.use( + (response) => { + //updateLastRequestTime(Date.now()); + return response; + }, + async (error) => { + // ** const { config, response: { status } } = error + //const {response} = error + // if (error.response.status === 401) { + // dispatch(handleLogoutFunction()); + // navigate('/login'); + // } + // + // // ** if (status === 401) { + // if (response.status === 401) { + // dispatch(handleLogoutFunction()); + // navigate('/login'); + // } + // + // if (response && response.status === 401) { + // dispatch(handleLogoutFunction()); + // navigate('/login'); + // } + + if (error.response.status === 401 && error.config.url !== apiPath + REFRESH_TOKEN) { + // Make a request to refresh the access token + const refreshToken = localStorage.getItem('refreshToken'); + if (isRefreshToken) { + return; + } + isRefreshToken = true; + return axios + .post(`${apiPath}${REFRESH_TOKEN}`, { + refreshToken: refreshToken // Replace with your refresh token + }) + .then((response) => { + if (response.status === 200) { + const newAccessToken = response.data.accessToken; + const newRefreshToken = response.data.refreshToken; + localStorage.setItem('accessToken', newAccessToken); + localStorage.setItem('refreshToken', newRefreshToken); + isRefreshToken = false; + window.location.reload(); + } + }) + .catch((refreshError) => { + dispatch(handleLogoutFunction()); + navigate('/login'); + isRefreshToken = false; + window.location.reload(); + throw refreshError; + }); + } else { + if (error.response.status === 401) { + await dispatch(handleLogoutFunction()); + await navigate('/login'); + await window.location.reload(); + } + + if (error.response.status === 500){ + //setIsUploading(false); + } + } + + return Promise.reject(error); + } + ); +}; diff --git a/src/auth/jwt/coreUseJwt.js b/src/auth/jwt/coreUseJwt.js new file mode 100644 index 0000000..30080f5 --- /dev/null +++ b/src/auth/jwt/coreUseJwt.js @@ -0,0 +1,11 @@ +// ** JWT Service Import +import JwtService from './jwtService' + +// ** Export Service as useJwt +export default function useJwt(jwtOverrideConfig) { + const jwt = new JwtService(jwtOverrideConfig) + + return { + jwt + } +} diff --git a/src/auth/jwt/jwtDefaultConfig.js b/src/auth/jwt/jwtDefaultConfig.js new file mode 100644 index 0000000..965f887 --- /dev/null +++ b/src/auth/jwt/jwtDefaultConfig.js @@ -0,0 +1,15 @@ +// ** Auth Endpoints +export default { + loginEndpoint: '/jwt/login', + registerEndpoint: '/jwt/register', + refreshEndpoint: '/jwt/refresh-token', + logoutEndpoint: '/jwt/logout', + + // ** This will be prefixed in authorization header with token + // ? e.g. Authorization: Bearer + tokenType: 'Bearer', + + // ** Value of this property will be used as key to store JWT token in storage + storageTokenKeyName: 'accessToken', + storageRefreshTokenKeyName: 'refreshToken' +} diff --git a/src/auth/jwt/jwtService.js b/src/auth/jwt/jwtService.js new file mode 100644 index 0000000..0df9dac --- /dev/null +++ b/src/auth/jwt/jwtService.js @@ -0,0 +1,111 @@ +import axios from 'axios' +import jwtDefaultConfig from './jwtDefaultConfig' + +export default class JwtService { + // ** jwtConfig <= Will be used by this service + jwtConfig = {...jwtDefaultConfig} + + // ** For Refreshing Token + isAlreadyFetchingAccessToken = false + + // ** For Refreshing Token + subscribers = [] + + constructor(jwtOverrideConfig) { + this.jwtConfig = {...this.jwtConfig, ...jwtOverrideConfig} + + // ** Request Interceptor + axios.interceptors.request.use( + config => { + // ** Get token from localStorage + const accessToken = this.getToken() + + // ** If token is present add it to request's Authorization Header + if (accessToken) { + // ** eslint-disable-next-line no-param-reassign + config.headers.Authorization = `${this.jwtConfig.tokenType} ${accessToken}` + } + + config.headers['X-Authorization'] = process.env.REACT_APP_API_KEY + + return config + }, + error => Promise.reject(error) + ) + + // ** Add request/response interceptor + axios.interceptors.response.use( + response => response, + error => { + // ** const { config, response: { status } } = error + const {config, response} = error + const originalRequest = config + + // ** if (status === 401) { + if (response && response.status === 401) { + if (!this.isAlreadyFetchingAccessToken) { + this.isAlreadyFetchingAccessToken = true + this.refreshToken().then(r => { + this.isAlreadyFetchingAccessToken = false + + // ** Update accessToken in localStorage + this.setToken(r.data.accessToken) + this.setRefreshToken(r.data.refreshToken) + + this.onAccessTokenFetched(r.data.accessToken) + }) + } + const retryOriginalRequest = new Promise(resolve => { + this.addSubscriber(accessToken => { + // ** Make sure to assign accessToken according to your response. + // ** Check: https://pixinvent.ticksy.com/ticket/2413870 + // ** Change Authorization header + originalRequest.headers.Authorization = `${this.jwtConfig.tokenType} ${accessToken}` + resolve(this.axios(originalRequest)) + }) + }) + return retryOriginalRequest + } + return Promise.reject(error) + } + ) + } + + onAccessTokenFetched(accessToken) { + this.subscribers = this.subscribers.filter(callback => callback(accessToken)) + } + + addSubscriber(callback) { + this.subscribers.push(callback) + } + + getToken() { + return localStorage.getItem(this.jwtConfig.storageTokenKeyName) + } + + getRefreshToken() { + return localStorage.getItem(this.jwtConfig.storageRefreshTokenKeyName) + } + + setToken(value) { + localStorage.setItem(this.jwtConfig.storageTokenKeyName, value) + } + + setRefreshToken(value) { + localStorage.setItem(this.jwtConfig.storageRefreshTokenKeyName, value) + } + + login(...args) { + return axios.post(this.jwtConfig.loginEndpoint, ...args) + } + + register(...args) { + return axios.post(this.jwtConfig.registerEndpoint, ...args) + } + + refreshToken() { + return axios.post(this.jwtConfig.refreshEndpoint, { + refreshToken: this.getRefreshToken() + }) + } +} diff --git a/src/auth/jwt/useJwt.js b/src/auth/jwt/useJwt.js new file mode 100644 index 0000000..e09481e --- /dev/null +++ b/src/auth/jwt/useJwt.js @@ -0,0 +1,7 @@ +// ** Core JWT Import +import createJwt from './coreUseJwt' +import jwtApplicationConfig from "../jwtApplicationConfig" + +const { jwt } = createJwt(jwtApplicationConfig) + +export default jwt diff --git a/src/auth/jwtApplicationConfig.js b/src/auth/jwtApplicationConfig.js new file mode 100644 index 0000000..a64b23d --- /dev/null +++ b/src/auth/jwtApplicationConfig.js @@ -0,0 +1,17 @@ +import {apiPath} from "./utils" + +export default { + loginEndpoint: `${apiPath}/login`, + registerEndpoint: `${apiPath}/register`, + refreshEndpoint: `${apiPath}/refresh/token`, + logoutEndpoint: `/jwt/logout`, + + // ** This will be prefixed in authorization header with token + // ? e.g. Authorization: Bearer + tokenType: 'Bearer', + + // ** Value of this property will be used as key to store JWT token in storage + storageTokenKeyName: 'accessToken', + storageRefreshTokenKeyName: 'refreshToken', + storageUserRoleKeyName: 'role' +} \ No newline at end of file diff --git a/src/auth/jwtConfig.js b/src/auth/jwtConfig.js new file mode 100644 index 0000000..a64b23d --- /dev/null +++ b/src/auth/jwtConfig.js @@ -0,0 +1,17 @@ +import {apiPath} from "./utils" + +export default { + loginEndpoint: `${apiPath}/login`, + registerEndpoint: `${apiPath}/register`, + refreshEndpoint: `${apiPath}/refresh/token`, + logoutEndpoint: `/jwt/logout`, + + // ** This will be prefixed in authorization header with token + // ? e.g. Authorization: Bearer + tokenType: 'Bearer', + + // ** Value of this property will be used as key to store JWT token in storage + storageTokenKeyName: 'accessToken', + storageRefreshTokenKeyName: 'refreshToken', + storageUserRoleKeyName: 'role' +} \ No newline at end of file diff --git a/src/auth/utils.js b/src/auth/utils.js new file mode 100644 index 0000000..143f099 --- /dev/null +++ b/src/auth/utils.js @@ -0,0 +1,33 @@ +import useJwt from 'auth/jwt/coreUseJwt' + +/** + * Return if user is logged in + * This is completely up to you and how you want to store the token in your frontend application + * e.g. If you are using cookies to store the application please update this function + */ +// eslint-disable-next-line arrow-body-style +export const hostname = process.env.REACT_APP_BACKEND_HOST +const hostPort = process.env.REACT_APP_BACKEND_PORT +export const hostPath = `${process.env.REACT_APP_BACKEND_PROTOCOL}://${hostname}:${hostPort}` +export const apiPath = `${hostPath}/api` + +export const isUserLoggedIn = () => { + return localStorage.getItem('userData') && localStorage.getItem(useJwt.jwtConfig.storageTokenKeyName) +} + +export const getUserData = () => JSON.parse(localStorage.getItem('userData')) + +/** + * This function is used for demo purpose route navigation + * In real app you won't need this function because your app will navigate to same route for each users regardless of ability + * Please note role field is just for showing purpose it's not used by anything in frontend + * We are checking role just for ease + * NOTE: If you have different pages to navigate based on user ability then this function can be useful. However, you need to update it. + * @param {String} userRole Role of user + */ +export const getHomeRouteForLoggedInUser = userRole => { + if (userRole === 'admin') return '/' + if (userRole === 'user') return '/' + if (userRole === 'client') return {name: 'access-control'} + return {name: 'auth-login'} +} diff --git a/src/components/@extended/AnimateButton.js b/src/components/@extended/AnimateButton.js new file mode 100644 index 0000000..0b82e86 --- /dev/null +++ b/src/components/@extended/AnimateButton.js @@ -0,0 +1,29 @@ +import PropTypes from 'prop-types'; + +// third-party +import { motion } from 'framer-motion'; + +// ==============================|| ANIMATION BUTTON ||============================== // + +export default function AnimateButton({ children, type }) { + switch (type) { + case 'rotate': // only available in paid version + case 'slide': // only available in paid version + case 'scale': // only available in paid version + default: + return ( + + {children} + + ); + } +} + +AnimateButton.propTypes = { + children: PropTypes.node, + type: PropTypes.oneOf(['slide', 'scale', 'rotate']) +}; + +AnimateButton.defaultProps = { + type: 'scale' +}; diff --git a/src/components/@extended/Breadcrumbs.js b/src/components/@extended/Breadcrumbs.js new file mode 100644 index 0000000..fec26bd --- /dev/null +++ b/src/components/@extended/Breadcrumbs.js @@ -0,0 +1,106 @@ +import PropTypes from 'prop-types'; +import { useEffect, useState } from 'react'; +import { Link, useLocation } from 'react-router-dom'; + +// material-ui +import MuiBreadcrumbs from '@mui/material/Breadcrumbs'; +import { Grid, Typography } from '@mui/material'; + +// project imports +import MainCard from '../MainCard'; + +// ==============================|| BREADCRUMBS ||============================== // + +const Breadcrumbs = ({ navigation, title, ...others }) => { + const location = useLocation(); + const [main, setMain] = useState(); + const [item, setItem] = useState(); + + // set active item state + const getCollapse = (menu) => { + if (menu.children) { + menu.children.filter((collapse) => { + if (collapse.type && collapse.type === 'collapse') { + getCollapse(collapse); + } else if (collapse.type && collapse.type === 'item') { + if (location.pathname === collapse.url) { + setMain(menu); + setItem(collapse); + } + } + return false; + }); + } + }; + + useEffect(() => { + navigation?.items?.map((menu) => { + if (menu.type && menu.type === 'group') { + getCollapse(menu); + } + return false; + }); + }); + + // only used for component demo breadcrumbs + if (location.pathname === '/breadcrumbs') { + location.pathname = '/dashboard/analytics'; + } + + let mainContent; + let itemContent; + let breadcrumbContent = ; + let itemTitle = ''; + + // collapse item + if (main && main.type === 'collapse') { + mainContent = ( + + {main.title} + + ); + } + + // items + if (item && item.type === 'item') { + itemTitle = item.title; + itemContent = ( + + {itemTitle} + + ); + + // main + if (item.breadcrumbs !== false) { + breadcrumbContent = ( + + + + + + Home + + {mainContent} + {itemContent} + + + {title && ( + + {item.title} + + )} + + + ); + } + } + + return breadcrumbContent; +}; + +Breadcrumbs.propTypes = { + navigation: PropTypes.object, + title: PropTypes.bool +}; + +export default Breadcrumbs; diff --git a/src/components/@extended/Dot.js b/src/components/@extended/Dot.js new file mode 100644 index 0000000..4272509 --- /dev/null +++ b/src/components/@extended/Dot.js @@ -0,0 +1,48 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Box } from '@mui/material'; + +const Dot = ({ color, size }) => { + const theme = useTheme(); + let main; + switch (color) { + case 'secondary': + main = theme.palette.secondary.main; + break; + case 'error': + main = theme.palette.error.main; + break; + case 'warning': + main = theme.palette.warning.main; + break; + case 'info': + main = theme.palette.info.main; + break; + case 'success': + main = theme.palette.success.main; + break; + case 'primary': + default: + main = theme.palette.primary.main; + } + + return ( + + ); +}; + +Dot.propTypes = { + color: PropTypes.string, + size: PropTypes.number +}; + +export default Dot; diff --git a/src/components/@extended/Transitions.js b/src/components/@extended/Transitions.js new file mode 100644 index 0000000..bdb03e9 --- /dev/null +++ b/src/components/@extended/Transitions.js @@ -0,0 +1,62 @@ +import PropTypes from 'prop-types'; +import { forwardRef } from 'react'; + +// material-ui +import { Fade, Box, Grow } from '@mui/material'; + +// ==============================|| TRANSITIONS ||============================== // + +const Transitions = forwardRef(({ children, position, type, ...others }, ref) => { + let positionSX = { + transformOrigin: '0 0 0' + }; + + switch (position) { + case 'top-right': + case 'top': + case 'bottom-left': + case 'bottom-right': + case 'bottom': + case 'top-left': + default: + positionSX = { + transformOrigin: '0 0 0' + }; + break; + } + + return ( + + {type === 'grow' && ( + + {children} + + )} + {type === 'fade' && ( + + {children} + + )} + + ); +}); + +Transitions.propTypes = { + children: PropTypes.node, + type: PropTypes.oneOf(['grow', 'fade', 'collapse', 'slide', 'zoom']), + position: PropTypes.oneOf(['top-left', 'top-right', 'top', 'bottom-left', 'bottom-right', 'bottom']) +}; + +Transitions.defaultProps = { + type: 'grow', + position: 'top-left' +}; + +export default Transitions; diff --git a/src/components/AbilityProvider.js b/src/components/AbilityProvider.js new file mode 100644 index 0000000..26f4795 --- /dev/null +++ b/src/components/AbilityProvider.js @@ -0,0 +1,17 @@ +import React, {createContext} from 'react'; +import {createUserAbility} from "../utils/UserAbilityUtils"; +import {getUserAuthList} from "../utils/CommonFunction"; + +const AbilityContext = createContext(); + +export const AbilityProvider = ({ children }) => { + const ability = createUserAbility(getUserAuthList()); + return ( + + {children} + + ); +}; + +export default AbilityContext; + diff --git a/src/components/AutoLogoutProvider.js b/src/components/AutoLogoutProvider.js new file mode 100644 index 0000000..42b1638 --- /dev/null +++ b/src/components/AutoLogoutProvider.js @@ -0,0 +1,149 @@ +import React, { createContext, useState, useEffect } from 'react'; +import {handleLogoutFunction} from "../auth"; +import {dispatch} from "../store"; +import {useNavigate} from "react-router-dom"; +import axios from "axios"; +import {apiPath, getUserData} from "../auth/utils"; +import {GET_IDLE_LOGOUT_TIME, GET_USER_PASSWORD_DURATION} from "../utils/ApiPathConst"; +import {isObjEmpty} from "../utils/Utils"; +import {useIdleTimer} from "react-idle-timer"; +import {LIONER_FORM_THEME} from "../themes/themeConst"; +import {ChangePasswordWindow} from "../layout/MainLayout/Header/HeaderContent/Profile/ChangePasswordWindow"; +import {ThemeProvider} from "@emotion/react"; + +const TimerContext = createContext(); + +const AutoLogoutProvider = ({ children }) => { + const [lastRequestTime, setLastRequestTime] = useState(Date.now()); + const navigate = useNavigate(); + const [logoutInterval, setLogoutInterval] = useState(30); + const [state, setState] = useState('Active'); + + const [isTempWindowOpen, setIsTempWindowOpen] = useState(false); + const [forceChangePassword, setForceChangePassword] = useState(false); + + useEffect(() => { + const userData = getUserData(); + const checked = localStorage.getItem("checkPasswordExpired"); + if(userData !== null){ + if(!userData.lotusNotesUser){ + //system user + if(checked === "false"){ + axios.get(`${apiPath}${GET_USER_PASSWORD_DURATION}`,{ + params:{ + id: userData.id + } + }) + .then((response) => { + if (response.status === 200) { + setForceChangePassword(response.data.expired); + if(!response.data.expired){ + localStorage.setItem("checkPasswordExpired",true); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + } + }, []); + + const onIdle = () => { + setLastRequestTime(Date.now()); + setState('Idle') + } + + const onActive = () => { + setLastRequestTime(Date.now()); + setState('Active') + } + + const { + getRemainingTime, + //getTabId, + isLastActiveTab, + } = useIdleTimer({ + onIdle, + onActive, + timeout: 10_000, + throttle: 500, + crossTab: true, + syncTimers: 200, + }) + + const lastActiveTab = isLastActiveTab() === null ? 'loading' : isLastActiveTab() + //const tabId = getTabId() === null ? 'loading' : getTabId().toString() + + useEffect(() => { + const userData = getUserData(); + if(!isObjEmpty(userData)){ + axios.get(`${apiPath}${GET_IDLE_LOGOUT_TIME}`, + ) + .then((response) => { + if (response.status === 200) { + setLastRequestTime(Date.now()); + setLogoutInterval(parseInt(response.data.data)); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + else{ + //navigate('/login'); + } + }, []); + + useEffect(() => { + const interval = setInterval(async () => { + const currentTime = Date.now(); + getRemainingTime(); + if(state !== "Active" && lastActiveTab){ + const timeElapsed = currentTime - lastRequestTime; + if (timeElapsed >= logoutInterval * 60 * 1000) { + await dispatch(handleLogoutFunction()); + await navigate('/login'); + await window.location.reload(); + } + } + }, 1000); // Check every second + + return () => { + clearInterval(interval); + }; + }, [lastRequestTime,logoutInterval]); + + useEffect(() => { + //if user data from parent are not null + if(forceChangePassword){ + setIsTempWindowOpen(true); + } + }, [forceChangePassword]); + + const handleTempClose = (event, reason) => { + if (reason && reason === "backdropClick") + return; + setIsTempWindowOpen(false); + }; + + return ( + + {children} + + + + + ); +}; + +export { TimerContext, AutoLogoutProvider }; \ No newline at end of file diff --git a/src/components/I18nProvider.js b/src/components/I18nProvider.js new file mode 100644 index 0000000..1966943 --- /dev/null +++ b/src/components/I18nProvider.js @@ -0,0 +1,49 @@ +import React, {useState, useEffect, createContext} from 'react'; +import { IntlProvider } from 'react-intl'; +import enMessages from '../translations/en.json'; +import cnMessages from '../translations/zh-CN.json'; +import hkMessages from '../translations/zh-HK.json'; + +const LocaleContext = createContext(); + +export const I18nProvider = ({ children }) => { + const systemMessages = { + "en": enMessages, + "zh": hkMessages, + "zh-HK": hkMessages, + "zh-CN": cnMessages + }; + + const [locale, setLocale] = useState('en'); // Default locale, you can change this as per your requirement + const [isAdvanceDisplay, setIsAdvanceDisplay] = useState(true); // Default locale, you can change this as per your requirement + + const [messages, setMessages] = useState(systemMessages[locale]); + + useEffect(() => { + if(localStorage.getItem('locale') === null){ + //no locale case + localStorage.setItem('locale','en'); + } + else{ + setLocale(localStorage.getItem('locale')); + } + }, []); + useEffect(() => { + // Load the messages for the selected locale + const fetchMessages = async () => { + setMessages(systemMessages[locale]); + }; + + fetchMessages(); + }, [locale]); + + return ( + + + {children} + + + ); +} + +export default LocaleContext; \ No newline at end of file diff --git a/src/components/Loadable.js b/src/components/Loadable.js new file mode 100644 index 0000000..eec9c64 --- /dev/null +++ b/src/components/Loadable.js @@ -0,0 +1,15 @@ +import { Suspense } from 'react'; + +// project import +import Loader from './Loader'; + +// ==============================|| LOADABLE - LAZY LOADING ||============================== // + +const Loadable = (Component) => (props) => + ( + }> + + + ); + +export default Loadable; diff --git a/src/components/Loader.js b/src/components/Loader.js new file mode 100644 index 0000000..d916a8a --- /dev/null +++ b/src/components/Loader.js @@ -0,0 +1,25 @@ +// material-ui +import { styled } from '@mui/material/styles'; +import LinearProgress from '@mui/material/LinearProgress'; + +// loader style +const LoaderWrapper = styled('div')(({ theme }) => ({ + position: 'fixed', + top: 0, + left: 0, + zIndex: 2001, + width: '100%', + '& > * + *': { + marginTop: theme.spacing(2) + } +})); + +// ==============================|| Loader ||============================== // + +const Loader = () => ( + + + +); + +export default Loader; diff --git a/src/components/Logo/Logo.js b/src/components/Logo/Logo.js new file mode 100644 index 0000000..19a06e3 --- /dev/null +++ b/src/components/Logo/Logo.js @@ -0,0 +1,49 @@ +// material-ui +import { useTheme } from '@mui/material/styles'; + +/** + * if you want to use image instead of uncomment following. + * + * import logoDark from 'assets/images/logo-dark.svg'; + * import logo from 'assets/images/logo.svg'; + * + */ + +// ==============================|| LOGO SVG ||============================== // + +const Logo = () => { + const theme = useTheme(); + + return ( + /** + * if you want to use image instead of svg uncomment following, and comment out element. + * + * Mantis + * + */ + <> + + + + + + + + + + + + + + + ); +}; + +export default Logo; diff --git a/src/components/Logo/index.js b/src/components/Logo/index.js new file mode 100644 index 0000000..4c6be92 --- /dev/null +++ b/src/components/Logo/index.js @@ -0,0 +1,36 @@ +import PropTypes from 'prop-types'; +//import { Link } from 'react-router-dom'; + +// material-ui +import { ButtonBase } from '@mui/material'; +//import { useDispatch, useSelector } from 'react-redux'; + +// project import +import Logo from './Logo'; +//import config from 'config'; +//import { activeItem } from 'store/reducers/menu'; + +// ==============================|| MAIN LOGO ||============================== // + +const LogoSection = ({ sx, /*to*/ }) => { + // const { defaultId } = useSelector((state) => state.menu); + // const dispatch = useDispatch(); + return ( + dispatch(activeItem({ openItem: [defaultId] }))} + //to={!to ? config.defaultPath : to} + sx={sx} + > + + + ); +}; + +LogoSection.propTypes = { + sx: PropTypes.object, + to: PropTypes.string +}; + +export default LogoSection; diff --git a/src/components/MainCard.js b/src/components/MainCard.js new file mode 100644 index 0000000..c129128 --- /dev/null +++ b/src/components/MainCard.js @@ -0,0 +1,105 @@ +import PropTypes from 'prop-types'; +import { forwardRef } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Card, CardContent, CardHeader, Divider, Typography } from '@mui/material'; + +// project import +import Highlighter from './third-party/Highlighter'; + +// header style +const headerSX = { + p: 2.5, + '& .MuiCardHeader-action': { m: '0px auto', alignSelf: 'center' } +}; + +// ==============================|| CUSTOM - MAIN CARD ||============================== // + +const MainCard = forwardRef( + ( + { + border = true, + boxShadow, + children, + content = true, + contentSX = {}, + darkTitle, + elevation, + secondary, + shadow, + sx = {}, + title, + titleClass, + codeHighlight, + ...others + }, + ref + ) => { + const theme = useTheme(); + boxShadow = theme.palette.mode === 'dark' ? boxShadow || true : boxShadow; + + return ( + + {/* card header and action */} + {!darkTitle && title && ( + + )} + {darkTitle && title && {title}} action={secondary} />} + + {/* card content */} + {content && {children}} + {!content && children} + + {/* card footer - clipboard & highlighter */} + {codeHighlight && ( + <> + + + {children} + + + )} + + ); + } +); + +MainCard.propTypes = { + border: PropTypes.bool, + boxShadow: PropTypes.any, + contentSX: PropTypes.object, + darkTitle: PropTypes.bool, + divider: PropTypes.bool, + elevation: PropTypes.number, + secondary: PropTypes.node, + shadow: PropTypes.string, + sx: PropTypes.object, + title: PropTypes.oneOfType([PropTypes.string, PropTypes.node]), + titleClass: PropTypes.string, + codeHighlight: PropTypes.bool, + content: PropTypes.bool, + children: PropTypes.node +}; + +export default MainCard; diff --git a/src/components/RefreshTokenProvider.js b/src/components/RefreshTokenProvider.js new file mode 100644 index 0000000..527861f --- /dev/null +++ b/src/components/RefreshTokenProvider.js @@ -0,0 +1,70 @@ +import { createContext, useEffect, useRef, useCallback } from 'react'; +import { apiPath } from '../auth/utils'; +import { REFRESH_TOKEN } from '../utils/ApiPathConst'; +import axios from 'axios'; + +const RefreshTokenContext = createContext(); + +const RefreshTokenProvider = ({ children }) => { + const token = useRef(localStorage.getItem('accessToken')); + const isRefresh = useRef(false); + + // handle Refresh Token Logic + const handleRefreshToken = useCallback(() => { + if (!isRefresh.current) { + const refreshToken = localStorage.getItem('refreshToken'); + isRefresh.current = true; + axios + .post(`${apiPath}${REFRESH_TOKEN}`, { + refreshToken: refreshToken + }) + .then((response) => { + if (response.status === 200) { + const newAccessToken = response.data.accessToken; + const newRefreshToken = response.data.refreshToken; + localStorage.setItem('accessToken', newAccessToken); + localStorage.setItem('refreshToken', newRefreshToken); + token.current = newAccessToken; + isRefresh.current = false; + } else { + token.current = null; + isRefresh.current = false; + } + }) + .catch((refreshError) => { + console.log('Failed to refresh token'); + console.log(refreshError) + token.current = null + isRefresh.current = false; + }); + } + }, []); + + // Function to check token expiry + const checkTokenExpiry = useCallback(() => { + // Check if token is present and its expiry time + if (token.current) { + const tokenExp = JSON.parse(atob(token.current.split('.')[1])).exp; + const currentTime = Math.floor(Date.now() / 1000); + const expiryTime = tokenExp - 30; // Refresh 30 seconds before expiry + // console.log("check refresh Token"); + // console.log(currentTime); + // console.log(expiryTime); + // console.log('accessToken: ' + localStorage.getItem('accessToken')); + // console.log('refreshToken: ' + localStorage.getItem('refreshToken')); + if (currentTime >= expiryTime) { + handleRefreshToken(); + } + } + }, [token]); + + // Start the timer on component mount + useEffect(() => { + const timer = setInterval(checkTokenExpiry, 10000); // Check every 10 second + return () => clearInterval(timer); // Cleanup timer on unmount + }, [checkTokenExpiry]); + + return {children}; +}; + +export { RefreshTokenContext, RefreshTokenProvider }; diff --git a/src/components/ScrollTop.js b/src/components/ScrollTop.js new file mode 100644 index 0000000..2e3cb24 --- /dev/null +++ b/src/components/ScrollTop.js @@ -0,0 +1,27 @@ +import PropTypes from 'prop-types'; +import { useEffect } from 'react'; +import { useLocation } from 'react-router-dom'; + +// ==============================|| NAVIGATION - SCROLL TO TOP ||============================== // + +const ScrollTop = ({ children }) => { + const location = useLocation(); + const { pathname } = location; + + + useEffect(() => { + window.scrollTo({ + top: 0, + left: 0, + behavior: 'smooth' + }); + }, [pathname]); + + return children || null; +}; + +ScrollTop.propTypes = { + children: PropTypes.node +}; + +export default ScrollTop; diff --git a/src/components/UploadProvider.js b/src/components/UploadProvider.js new file mode 100644 index 0000000..635d451 --- /dev/null +++ b/src/components/UploadProvider.js @@ -0,0 +1,46 @@ +import React, { createContext, useState } from 'react'; +import {CircularProgress} from "@mui/material"; + +const UploadContext = createContext(); + +export const UploadProvider = ({ children }) => { + const [isUploading, setIsUploading] = useState(false); + + return ( + + {children} + {isUploading && ( +

+
+ +
+
+ )} + + ); +}; + +export default UploadContext; \ No newline at end of file diff --git a/src/components/cards/AuthFooter.js b/src/components/cards/AuthFooter.js new file mode 100644 index 0000000..b90358e --- /dev/null +++ b/src/components/cards/AuthFooter.js @@ -0,0 +1,61 @@ +// material-ui +import { useMediaQuery, Container, Link, Typography, Stack } from '@mui/material'; + +// ==============================|| FOOTER - AUTHENTICATION ||============================== // + +const AuthFooter = () => { + const matchDownSM = useMediaQuery((theme) => theme.breakpoints.down('sm')); + + return ( + + + + © Mantis React Dashboard Template By  + + CodedThemes + + + + + + MUI Templates + + + Privacy Policy + + + Support + + + + + ); +}; + +export default AuthFooter; diff --git a/src/components/cards/statistics/AnalyticEcommerce.js b/src/components/cards/statistics/AnalyticEcommerce.js new file mode 100644 index 0000000..fa33f7c --- /dev/null +++ b/src/components/cards/statistics/AnalyticEcommerce.js @@ -0,0 +1,70 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { Box, Chip, Grid, Stack, Typography } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; + +// assets +import { RiseOutlined, FallOutlined } from '@ant-design/icons'; + +// ==============================|| STATISTICS - ECOMMERCE CARD ||============================== // + +const AnalyticEcommerce = ({ color, title, count, percentage, isLoss, extra }) => ( + + + + {title} + + + + + {count} + + + {percentage && ( + + + {!isLoss && } + {isLoss && } + + } + label={`${percentage}%`} + sx={{ ml: 1.25, pl: 1 }} + size="small" + /> + + )} + + + + + You made an extra{' '} + + {extra} + {' '} + this year + + + +); + +AnalyticEcommerce.propTypes = { + color: PropTypes.string, + title: PropTypes.string, + count: PropTypes.string, + percentage: PropTypes.number, + isLoss: PropTypes.bool, + extra: PropTypes.oneOfType([PropTypes.node, PropTypes.string]) +}; + +AnalyticEcommerce.defaultProps = { + color: 'primary' +}; + +export default AnalyticEcommerce; diff --git a/src/components/third-party/Highlighter.js b/src/components/third-party/Highlighter.js new file mode 100644 index 0000000..390f573 --- /dev/null +++ b/src/components/third-party/Highlighter.js @@ -0,0 +1,65 @@ +import PropTypes from 'prop-types'; +import { useState } from 'react'; + +// material-ui +import { Box, CardActions, Collapse, Divider, IconButton, Tooltip } from '@mui/material'; + +// third-party +import { CopyToClipboard } from 'react-copy-to-clipboard'; +import reactElementToJSXString from 'react-element-to-jsx-string'; + +// project import +import SyntaxHighlight from 'utils/SyntaxHighlight'; + +// assets +import { CodeOutlined, CopyOutlined } from '@ant-design/icons'; + +// ==============================|| CLIPBOARD & HIGHLIGHTER ||============================== // + +const Highlighter = ({ children }) => { + const [highlight, setHighlight] = useState(false); + + return ( + + + + + + + + + + + + + setHighlight(!highlight)} + > + + + + + + + {highlight && ( + + {reactElementToJSXString(children, { + showFunctions: true, + showDefaultProps: false, + maxInlineAttributesLineLength: 100 + })} + + )} + + + ); +}; + +Highlighter.propTypes = { + children: PropTypes.node +}; + +export default Highlighter; diff --git a/src/components/third-party/SimpleBar.js b/src/components/third-party/SimpleBar.js new file mode 100644 index 0000000..26c9ca7 --- /dev/null +++ b/src/components/third-party/SimpleBar.js @@ -0,0 +1,62 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { alpha, styled } from '@mui/material/styles'; +import { Box } from '@mui/material'; + +// third-party +import SimpleBar from 'simplebar-react'; +import { BrowserView, MobileView } from 'react-device-detect'; + +// root style +const RootStyle = styled(BrowserView)({ + flexGrow: 1, + height: '100%', + overflow: 'hidden' +}); + +// scroll bar wrapper +const SimpleBarStyle = styled(SimpleBar)(({ theme }) => ({ + maxHeight: '100%', + '& .simplebar-scrollbar': { + '&:before': { + backgroundColor: alpha(theme.palette.grey[500], 0.48) + }, + '&.simplebar-visible:before': { + opacity: 1 + } + }, + '& .simplebar-track.simplebar-vertical': { + width: 10 + }, + '& .simplebar-track.simplebar-horizontal .simplebar-scrollbar': { + height: 6 + }, + '& .simplebar-mask': { + zIndex: 'inherit' + } +})); + +// ==============================|| SIMPLE SCROLL BAR ||============================== // + +export default function SimpleBarScroll({ children, sx, ...other }) { + return ( + <> + + + {children} + + + + + {children} + + + + ); +} + +SimpleBarScroll.propTypes = { + children: PropTypes.node, + sx: PropTypes.object +}; diff --git a/src/config.js b/src/config.js new file mode 100644 index 0000000..80e01d8 --- /dev/null +++ b/src/config.js @@ -0,0 +1,19 @@ +// ==============================|| THEME CONFIG ||============================== // + +const config = { + defaultPath: '/lionerDashboard', + fontFamily: `'Public Sans', sans-serif`, + i18n: 'en', + miniDrawer: false, + container: true, + mode: 'light', + presetColor: 'default', + themeDirection: 'ltr' +}; + +export default config; +export const drawerWidth = 260; + +export const twitterColor = '#1DA1F2'; +export const facebookColor = '#3b5998'; +export const linkedInColor = '#0e76a8'; diff --git a/src/index.js b/src/index.js new file mode 100644 index 0000000..e02ce3c --- /dev/null +++ b/src/index.js @@ -0,0 +1,52 @@ +import React, {StrictMode} from 'react'; +import { createRoot } from 'react-dom/client'; +import { BrowserRouter } from 'react-router-dom'; + +// scroll bar +import 'simplebar/src/simplebar.css'; + +// third-party +import { Provider as ReduxProvider } from 'react-redux'; + +// apex-chart +import 'assets/third-party/apex-chart.css'; + +// project import +import App from './App'; +import { store } from 'store'; +import reportWebVitals from './reportWebVitals'; +import {UploadProvider} from "./components/UploadProvider"; +import {AbilityProvider} from "./components/AbilityProvider"; +import {I18nProvider} from "./components/I18nProvider"; +import {AutoLogoutProvider} from "./components/AutoLogoutProvider"; +import {RefreshTokenProvider} from "./components/RefreshTokenProvider"; +// ==============================|| MAIN - REACT DOM RENDER ||============================== // + +const container = document.getElementById('root'); +const root = createRoot(container); // createRoot(container!) if you use TypeScript +//const NotAuthorized = lazy(() => import('../views/NotAuthorized')) +//const Error = lazy(() => import('../views/Error')) +root.render( + + + + + + + + + + + + + + + + + +); + +// If you want to start measuring performance in your app, pass a function +// to log results (for example: reportWebVitals(console.log)) +// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals +reportWebVitals(); diff --git a/src/layout/MainLayout/Drawer/DrawerContent/NavCard.js b/src/layout/MainLayout/Drawer/DrawerContent/NavCard.js new file mode 100644 index 0000000..d9f6604 --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerContent/NavCard.js @@ -0,0 +1,32 @@ +// material-ui +import { Button, CardMedia, Link, Stack, Typography } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; + +// assets +import avatar from 'assets/images/users/avatar-group.png'; +import AnimateButton from 'components/@extended/AnimateButton'; + +// ==============================|| DRAWER CONTENT - NAVIGATION CARD ||============================== // + +const NavCard = () => ( + + + + + Mantis Pro + + Checkout pro features + + + + + + + +); + +export default NavCard; diff --git a/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavGroup.js b/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavGroup.js new file mode 100644 index 0000000..8082ab4 --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavGroup.js @@ -0,0 +1,97 @@ +import PropTypes from 'prop-types'; +import { useSelector } from 'react-redux'; + +// material-ui +import { Box, List, Typography } from '@mui/material'; + +// project import +import NavItem from './NavItem'; +import {useContext} from "react"; +import AbilityContext from "../../../../../components/AbilityProvider"; +import {LIONER_NAV_THEME} from "../../../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import {GENERAL_INFO_COLOR} from "../../../../../themes/colorConst"; + +// ==============================|| NAVIGATION - LIST GROUP ||============================== // + +const NavGroup = ({ item }) => { + const ability = useContext(AbilityContext); + const menu = useSelector((state) => state.menu); + const { drawerOpen } = menu; + let availableChildren = item.children.length; + + const navCollapse = item.children?.map((menuItem) => { + switch (menuItem.type) { + case 'collapse': + return ( + + collapse - only available in paid version + + ); + case 'item': + if(menuItem.ability !== undefined){ + if(ability.can(menuItem.ability[0], menuItem.ability[1])){ + return ; + } + else{ + availableChildren--; + return undefined; + } + } + else{ + return ; + } + default: + if(menuItem.ability !== undefined){ + if(ability.can(menuItem.ability[0], menuItem.ability[1])){ + return ( + + Fix - Group Collapse or Items + + ); + } + else{ + availableChildren--; + return undefined; + } + } + else{ + return ( + + Fix - Group Collapse or Items + + ); + } + } + }); + + return ( + 0 ? + + + + {item.title} + + + {/* only available in paid version */} + + : + undefined + ) + } + sx={{ mb: drawerOpen ? 1.5 : 0, py: 0, zIndex: 0 }} + > + {navCollapse} + + ); +}; + +NavGroup.propTypes = { + item: PropTypes.object +}; + +export default NavGroup; diff --git a/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.js b/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.js new file mode 100644 index 0000000..1937e90 --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerContent/Navigation/NavItem.js @@ -0,0 +1,148 @@ +import PropTypes from 'prop-types'; +import { forwardRef, useEffect } from 'react'; +import { Link, useLocation } from 'react-router-dom'; +import { useDispatch, useSelector } from 'react-redux'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Avatar, Chip, ListItemButton, ListItemIcon, ListItemText, Typography } from '@mui/material'; + +// project import +import { activeItem } from 'store/reducers/menu'; +import {LIONER_NAV_THEME} from "../../../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| NAVIGATION - LIST ITEM ||============================== // + +const NavItem = ({ item, level }) => { + const theme = useTheme(); + const dispatch = useDispatch(); + const { pathname } = useLocation(); + + const { drawerOpen, openItem } = useSelector((state) => state.menu); + + let itemTarget = '_self'; + if (item.target) { + itemTarget = '_blank'; + } + + let listItemProps = { component: forwardRef((props, ref) => ) }; + if (item?.external) { + listItemProps = { component: 'a', href: item.url, target: itemTarget }; + } + + const itemHandler = (id) => { + dispatch(activeItem({ openItem: [id] })); + }; + + const Icon = item.icon; + const itemIcon = item.icon ? : false; + + const isSelected = openItem.findIndex((id) => id === item.id) > -1; + // active menu item on page load + useEffect(() => { + if (pathname.includes(item.url)) { + dispatch(activeItem({ openItem: [item.id] })); + } + // eslint-disable-next-line + }, [pathname]); + + const textColor = 'text.primary'; + const iconSelectedColor = 'primary.main'; + + return ( + itemHandler(item.id)} + selected={isSelected} + sx={{ + zIndex: 1201, + mt:-0.25, mb:-0.25, + pl: drawerOpen ? `${level * 28}px` : 1.5, + py: !drawerOpen && level === 1 ? 1.25 : 1, + height: "40px", + ...(drawerOpen && { + '&:hover': { + bgcolor: 'primary.lighter' + }, + '&.Mui-selected': { + bgcolor: 'primary.lighter', + borderRight: `2px solid ${theme.palette.primary.main}`, + color: iconSelectedColor, + '&:hover': { + color: iconSelectedColor, + bgcolor: 'primary.lighter' + } + } + }), + ...(!drawerOpen && { + '&:hover': { + bgcolor: 'transparent' + }, + '&.Mui-selected': { + '&:hover': { + bgcolor: 'transparent' + }, + bgcolor: 'transparent' + } + }) + }} + > + {itemIcon && ( + + {itemIcon} + + )} + {(drawerOpen || (!drawerOpen && level !== 1)) && ( + + + {item.title} + + } + /> + + )} + {(drawerOpen || (!drawerOpen && level !== 1)) && item.chip && ( + {item.chip.avatar}} + /> + )} + + ); +}; + +NavItem.propTypes = { + item: PropTypes.object, + level: PropTypes.number +}; + +export default NavItem; diff --git a/src/layout/MainLayout/Drawer/DrawerContent/Navigation/index.js b/src/layout/MainLayout/Drawer/DrawerContent/Navigation/index.js new file mode 100644 index 0000000..5349774 --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerContent/Navigation/index.js @@ -0,0 +1,54 @@ +// material-ui +import { Box, Typography } from '@mui/material'; + +// project import +import NavGroup from './NavGroup'; +import menuItem from 'menu-items'; +import AbilityContext from "../../../../../components/AbilityProvider"; +import {useContext} from "react"; + +// ==============================|| DRAWER CONTENT - NAVIGATION ||============================== // + +const Navigation = () => { + const ability = useContext(AbilityContext); + const navGroups = menuItem.items.map((item) => { + switch (item.type) { + case 'group': + if(item.ability !== undefined){ + if(ability.can(item.ability[0], item.ability[1])){ + return ; + } + else{ + return undefined; + } + } + else{ + return ; + } + default: + if(item.ability !== undefined){ + if(ability.can(item.ability[0], item.ability[1])){ + return ( + + Fix - Navigation Group + + ); + } + else{ + return undefined; + } + } + else{ + return ( + + Fix - Navigation Group + + ); + } + } + }); + + return {navGroups}; +}; + +export default Navigation; diff --git a/src/layout/MainLayout/Drawer/DrawerContent/index.js b/src/layout/MainLayout/Drawer/DrawerContent/index.js new file mode 100644 index 0000000..a2f073d --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerContent/index.js @@ -0,0 +1,21 @@ +// project import +//import NavCard from './NavCard'; +import Navigation from './Navigation'; +import SimpleBar from 'components/third-party/SimpleBar'; + +// ==============================|| DRAWER CONTENT ||============================== // + +const DrawerContent = () => ( + + + +); + +export default DrawerContent; diff --git a/src/layout/MainLayout/Drawer/DrawerHeader/DrawerHeaderStyled.js b/src/layout/MainLayout/Drawer/DrawerHeader/DrawerHeaderStyled.js new file mode 100644 index 0000000..5c1b17a --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerHeader/DrawerHeaderStyled.js @@ -0,0 +1,15 @@ +// material-ui +import { styled } from '@mui/material/styles'; +import { Box } from '@mui/material'; + +// ==============================|| DRAWER HEADER - STYLED ||============================== // + +const DrawerHeaderStyled = styled(Box, { shouldForwardProp: (prop) => prop !== 'open' })(({ theme, open }) => ({ + ...theme.mixins.toolbar, + display: 'flex', + alignItems: 'center', + justifyContent: open ? 'flex-start' : 'center', + paddingLeft: theme.spacing(open ? 3 : 0) +})); + +export default DrawerHeaderStyled; diff --git a/src/layout/MainLayout/Drawer/DrawerHeader/index.js b/src/layout/MainLayout/Drawer/DrawerHeader/index.js new file mode 100644 index 0000000..a2f6ac6 --- /dev/null +++ b/src/layout/MainLayout/Drawer/DrawerHeader/index.js @@ -0,0 +1,38 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Stack, Chip } from '@mui/material'; + +// project import +import DrawerHeaderStyled from './DrawerHeaderStyled'; +import Logo from 'components/Logo'; + +// ==============================|| DRAWER HEADER ||============================== // + +const DrawerHeader = ({ open }) => { + const theme = useTheme(); + + return ( + // only available in paid version + + + + + + + ); +}; + +DrawerHeader.propTypes = { + open: PropTypes.bool +}; + +export default DrawerHeader; diff --git a/src/layout/MainLayout/Drawer/MiniDrawerStyled.js b/src/layout/MainLayout/Drawer/MiniDrawerStyled.js new file mode 100644 index 0000000..5bf2167 --- /dev/null +++ b/src/layout/MainLayout/Drawer/MiniDrawerStyled.js @@ -0,0 +1,47 @@ +// material-ui +import { styled } from '@mui/material/styles'; +import Drawer from '@mui/material/Drawer'; + +// project import +import { drawerWidth } from 'config'; + +const openedMixin = (theme) => ({ + width: drawerWidth, + borderRight: `1px solid ${theme.palette.divider}`, + transition: theme.transitions.create('width', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen + }), + overflowX: 'hidden', + boxShadow: 'none' +}); + +const closedMixin = (theme) => ({ + transition: theme.transitions.create('width', { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen + }), + overflowX: 'hidden', + width: 0, + borderRight: 'none', + boxShadow: theme.customShadows.z1 +}); + +// ==============================|| DRAWER - MINI STYLED ||============================== // + +const MiniDrawerStyled = styled(Drawer, { shouldForwardProp: (prop) => prop !== 'open' })(({ theme, open }) => ({ + width: drawerWidth, + flexShrink: 0, + whiteSpace: 'nowrap', + boxSizing: 'border-box', + ...(open && { + ...openedMixin(theme), + '& .MuiDrawer-paper': openedMixin(theme) + }), + ...(!open && { + ...closedMixin(theme), + '& .MuiDrawer-paper': closedMixin(theme) + }) +})); + +export default MiniDrawerStyled; diff --git a/src/layout/MainLayout/Drawer/index.js b/src/layout/MainLayout/Drawer/index.js new file mode 100644 index 0000000..5032de6 --- /dev/null +++ b/src/layout/MainLayout/Drawer/index.js @@ -0,0 +1,66 @@ +import PropTypes from 'prop-types'; +import { useMemo } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Box, Drawer, useMediaQuery } from '@mui/material'; + +// project import +import DrawerHeader from './DrawerHeader'; +import DrawerContent from './DrawerContent'; +import MiniDrawerStyled from './MiniDrawerStyled'; +import { drawerWidth } from 'config'; + +// ==============================|| MAIN LAYOUT - DRAWER ||============================== // + +const MainDrawer = ({ open, handleDrawerToggle, window }) => { + const theme = useTheme(); + const matchDownMD = useMediaQuery(theme.breakpoints.down('lg')); + + // responsive drawer container + const container = window !== undefined ? () => window().document.body : undefined; + + // header content + const drawerContent = useMemo(() => , []); + const drawerHeader = useMemo(() => , [open]); + + return ( + + {!matchDownMD ? ( + + {drawerHeader} + {drawerContent} + + ) : ( + + {open && drawerHeader} + {open && drawerContent} + + )} + + ); +}; + +MainDrawer.propTypes = { + open: PropTypes.bool, + handleDrawerToggle: PropTypes.func, + window: PropTypes.object +}; + +export default MainDrawer; diff --git a/src/layout/MainLayout/Header/AppBarStyled.js b/src/layout/MainLayout/Header/AppBarStyled.js new file mode 100644 index 0000000..a151407 --- /dev/null +++ b/src/layout/MainLayout/Header/AppBarStyled.js @@ -0,0 +1,26 @@ +// material-ui +import { styled } from '@mui/material/styles'; +import AppBar from '@mui/material/AppBar'; + +// project import +import { drawerWidth } from 'config'; + +// ==============================|| HEADER - APP BAR STYLED ||============================== // + +const AppBarStyled = styled(AppBar, { shouldForwardProp: (prop) => prop !== 'open' })(({ theme, open }) => ({ + zIndex: theme.zIndex.drawer + 1, + transition: theme.transitions.create(['width', 'margin'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.leavingScreen + }), + ...(open && { + marginLeft: drawerWidth, + width: `calc(100% - ${drawerWidth}px)`, + transition: theme.transitions.create(['width', 'margin'], { + easing: theme.transitions.easing.sharp, + duration: theme.transitions.duration.enteringScreen + }) + }) +})); + +export default AppBarStyled; diff --git a/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js b/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js new file mode 100644 index 0000000..9ab2445 --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/LocaleSelector.js @@ -0,0 +1,142 @@ +import {useContext, useRef, useState} from 'react'; +import ListItem from '@mui/material/ListItem'; +// material-ui +import { useTheme } from '@mui/material/styles'; +import { + Box, + ClickAwayListener, + IconButton, + List, + ListItemButton, + ListItemText, + Paper, + Popper, + useMediaQuery +} from '@mui/material'; + +import Transitions from 'components/@extended/Transitions'; +import LanguageIcon from '@mui/icons-material/Language'; +import {FormattedMessage} from "react-intl"; +import * as React from "react"; +import LocaleContext from "../../../../components/I18nProvider"; + +// ==============================|| HEADER CONTENT - NOTIFICATION ||============================== // + +const LocaleSelector = () => { + const theme = useTheme(); + const matchesXs = useMediaQuery(theme.breakpoints.down('md')); + const { setLocale } = useContext(LocaleContext); + + const anchorRef = useRef(null); + const [open, setOpen] = useState(false); + const handleToggle = () => { + setOpen((prevOpen) => !prevOpen); + }; + + + const handleClose = (event) => { + if (anchorRef.current && anchorRef.current.contains(event.target)) { + return; + } + setOpen(false); + }; + + const iconBackColorOpen = 'grey.300'; + const iconBackColor = 'grey.100'; + + return ( + + + + + + {({ TransitionProps }) => ( + + + + + + { + setLocale("en") + localStorage.setItem('locale','en'); + }} + > + + /> + + + + { + setLocale("zh-HK") + localStorage.setItem('locale','zh-HK'); + }} + > + + /> + + + + { + setLocale("zh-CN") + localStorage.setItem('locale','zh-CN'); + }} + > + + /> + + + + + + + )} + + + ); +}; + +export default LocaleSelector; diff --git a/src/layout/MainLayout/Header/HeaderContent/MobileSection.js b/src/layout/MainLayout/Header/HeaderContent/MobileSection.js new file mode 100644 index 0000000..106157d --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/MobileSection.js @@ -0,0 +1,102 @@ +import { useEffect, useRef, useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { AppBar, Box, ClickAwayListener, IconButton, Paper, Popper, Toolbar } from '@mui/material'; + +// project import +import Search from './Search'; +import Profile from './Profile'; +import Transitions from 'components/@extended/Transitions'; + +// assets +import { MoreOutlined } from '@ant-design/icons'; + +// ==============================|| HEADER CONTENT - MOBILE ||============================== // + +const MobileSection = () => { + const theme = useTheme(); + + const [open, setOpen] = useState(false); + const anchorRef = useRef(null); + + const handleToggle = () => { + setOpen((prevOpen) => !prevOpen); + }; + + const handleClose = (event) => { + if (anchorRef.current && anchorRef.current.contains(event.target)) { + return; + } + + setOpen(false); + }; + + const prevOpen = useRef(open); + useEffect(() => { + if (prevOpen.current === true && open === false) { + anchorRef.current.focus(); + } + + prevOpen.current = open; + }, [open]); + + return ( + <> + + + + + + + {({ TransitionProps }) => ( + + + + + + + + + + + + + )} + + + ); +}; + +export default MobileSection; diff --git a/src/layout/MainLayout/Header/HeaderContent/Notification.js b/src/layout/MainLayout/Header/HeaderContent/Notification.js new file mode 100644 index 0000000..de229c4 --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/Notification.js @@ -0,0 +1,279 @@ +import { useRef, useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { + Avatar, + Badge, + Box, + ClickAwayListener, + Divider, + IconButton, + List, + ListItemButton, + ListItemAvatar, + ListItemText, + ListItemSecondaryAction, + Paper, + Popper, + Typography, + useMediaQuery +} from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; +import Transitions from 'components/@extended/Transitions'; + +// assets +import { BellOutlined, CloseOutlined, GiftOutlined, MessageOutlined, SettingOutlined } from '@ant-design/icons'; + +// sx styles +const avatarSX = { + width: 36, + height: 36, + fontSize: '1rem' +}; + +const actionSX = { + mt: '6px', + ml: 1, + top: 'auto', + right: 'auto', + alignSelf: 'flex-start', + + transform: 'none' +}; + +// ==============================|| HEADER CONTENT - NOTIFICATION ||============================== // + +const Notification = () => { + const theme = useTheme(); + const matchesXs = useMediaQuery(theme.breakpoints.down('md')); + + const anchorRef = useRef(null); + const [open, setOpen] = useState(false); + const handleToggle = () => { + setOpen((prevOpen) => !prevOpen); + }; + + const handleClose = (event) => { + if (anchorRef.current && anchorRef.current.contains(event.target)) { + return; + } + setOpen(false); + }; + + const iconBackColorOpen = 'grey.300'; + const iconBackColor = 'grey.100'; + + return ( + + + + + + + + {({ TransitionProps }) => ( + + + + + + + } + > + + + + + + + + + It's{' '} + + Cristina danny's + {' '} + birthday today. + + } + secondary="2 min ago" + /> + + + 3:00 AM + + + + + + + + + + + + + Aida Burg + {' '} + commented your post. + + } + secondary="5 August" + /> + + + 6:00 PM + + + + + + + + + + + + Your Profile is Complete   + + 60% + {' '} + + } + secondary="7 hours ago" + /> + + + 2:45 PM + + + + + + + + C + + + + + Cristina Danny + {' '} + invited to join{' '} + + Meeting. + + + } + secondary="Daily scrum meeting time" + /> + + + 9:10 PM + + + + + + + View All + + } + /> + + + + + + + )} + + + ); +}; + +export default Notification; diff --git a/src/layout/MainLayout/Header/HeaderContent/Profile/ChangePasswordWindow.js b/src/layout/MainLayout/Header/HeaderContent/Profile/ChangePasswordWindow.js new file mode 100644 index 0000000..4004c2d --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/Profile/ChangePasswordWindow.js @@ -0,0 +1,304 @@ +import {useState} from "react"; +import Dialog from "@mui/material/Dialog"; +import DialogTitle from "@mui/material/DialogTitle"; +import DialogContent from "@mui/material/DialogContent"; +import {Button, FormControl, Grid, IconButton, InputAdornment, TextField, Typography, InputLabel} from "@mui/material"; +import {GENERAL_RED_COLOR} from "../../../../../themes/colorConst"; +import DialogActions from "@mui/material/DialogActions"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {isObjEmpty} from "../../../../../utils/Utils"; +import {CHANGE_PASSWORD_PATH} from "../../../../../utils/ApiPathConst"; +import axios from "axios"; +import {apiPath} from "../../../../../auth/utils"; +import {notifySaveSuccess} from "../../../../../utils/CommonFunction"; +import VisibilityOff from "@mui/icons-material/VisibilityOff"; +import Visibility from "@mui/icons-material/Visibility"; +import {LIONER_FORM_THEME} from "../../../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +export function ChangePasswordWindow({ + isWindowOpen, + title, + onNormalClose, + onConfirmClose, + isForce + }){ + + const [errors, setErrors] = useState({}); + const {reset, register, getValues} = useForm(); + const [showPassword, setShowPassword] = React.useState(false); + const [showPassword2, setShowPassword2] = React.useState(false); + const [showPassword3, setShowPassword3] = React.useState(false); + + const handleClickShowPassword = () => setShowPassword((show) => !show); + const handleMouseDownPassword = () => setShowPassword(!showPassword); + + const handleClickShowPassword2 = () => setShowPassword2((show) => !show); + const handleMouseDownPassword2 = () => setShowPassword2(!showPassword2); + + const handleClickShowPassword3 = () => setShowPassword3((show) => !show); + const handleMouseDownPassword3 = () => setShowPassword3(!showPassword3); + + function updatePassword(){ + const values = getValues(); + axios.patch(`${apiPath}${CHANGE_PASSWORD_PATH}`, + { + "password": values.oldPassword, + "newPassword": values.newPassword, + }) + .then((response) => { + if(response.status === 204){ + notifySaveSuccess(); + if(isForce){ + localStorage.setItem('checkPasswordExpired', true); + } + reset(); + onConfirmClose(); + } + }) + .catch(error => { + if (error.response.status === 422) { + const formErrors = {}; + if(error.response.data.error === "Incorrect existing password"){ + formErrors.oldPassword = error.response.data.error; + } + else{ + formErrors.confirmPassword = error.response.data.error; + } + setErrors(formErrors); + } + //console.log(error); + return true; + }); + } + + function validate(){ + const values = getValues(); + const formErrors = {}; + console.log(values); + if (isObjEmpty(values.oldPassword)) { + formErrors.oldPassword = 'Existing password must not be null'; + } + + if (isObjEmpty(values.newPassword)) { + formErrors.newPassword = 'New password must not be null'; + } + + if (isObjEmpty(values.confirmPassword)) { + formErrors.confirmPassword = 'Confirm password must not be null'; + } + + if(values.newPassword !== values.confirmPassword){ + formErrors.confirmPassword = 'Password not match'; + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0) { + updatePassword(); + } + } + + return ( + + + + + {title} + + + +
+ + + + { + isForce ? + +
+ + The password has expired. Please update your password before using the system. + +
+
+ : + undefined + } + + + Existing Password + + * + + + + + + {errors.oldPassword.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + InputProps={{ + endAdornment: ( + + + {showPassword ? : } + + + ) + }} + /> + + +
+ + + + + New Password + + * + + + + + + {errors.newPassword.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + InputProps={{ + endAdornment: ( + + + {showPassword2 ?: } + + + ) + }} + /> + + + + + + + + Confirm Password + + * + + + + + + {errors.confirmPassword.split("\n").map((line, index) => { + return ( +
+ {line} +
+ ) + })} + + ) : null + } + InputProps={{ + endAdornment: ( + + + {showPassword3 ? : } + + + ) + }} + /> +
+
+
+
+
+
+
+ + + + +
+
+ ) +} \ No newline at end of file diff --git a/src/layout/MainLayout/Header/HeaderContent/Profile/ProfileTab.js b/src/layout/MainLayout/Header/HeaderContent/Profile/ProfileTab.js new file mode 100644 index 0000000..672c66e --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/Profile/ProfileTab.js @@ -0,0 +1,146 @@ +import PropTypes from 'prop-types'; +import {useEffect, useState} from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { + Box, + List, + ListItemButton, + ListItemIcon, + ListItem, + ListItemText, + Typography, + ListItemSecondaryAction, + Switch +} from '@mui/material'; + +// assets +import SmsOutlinedIcon from '@mui/icons-material/SmsOutlined'; +import LockOutlinedIcon from '@mui/icons-material/LockOutlined'; +//import {POST_SEARCH_TEMPLATE_PATH, VALIDATE_TEMPLATE_NAME_PATH} from "../../../../../utils/ApiPathConst"; +import * as React from "react"; +import {ChangePasswordWindow} from "./ChangePasswordWindow"; +import axios from "axios"; +import {apiPath, getUserData} from "../../../../../auth/utils"; +import {GET_USER_REMINDER_FLAG, SET_USER_REMINDER_FLAG} from "../../../../../utils/ApiPathConst"; +import {notifySaveSuccess} from "../../../../../utils/CommonFunction"; +import {LIONER_FORM_THEME, LIONER_NAV_THEME} from "../../../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import {isObjEmpty} from "../../../../../utils/Utils"; +import {useNavigate} from "react-router-dom"; +//import axios from "axios"; +//import UploadContext from "../../../../../components/UploadProvider"; + +// ==============================|| HEADER PROFILE - PROFILE TAB ||============================== // + +const ProfileTab = () => { + // ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + const [isTempWindowOpen, setIsTempWindowOpen] = React.useState(false); + + //const { setIsUploading } = useContext(UploadContext); + + const handleTempClose = (event, reason) => { + console.log(reason); + //if (reason && reason === "backdropClick") + // return; + setIsTempWindowOpen(false); + }; + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + + const theme = useTheme(); + const navigate = useNavigate() + const [isReceiveNotification, setIsReceiveNotification] = useState(false); + const isLotusUser = localStorage.getItem('lotusNotesUser') === "true"; + + const [selectedIndex, setSelectedIndex] = useState(null); + const handleListItemClick = (event, index) => { + if(index === 0){ + setIsTempWindowOpen(true); + } + setSelectedIndex(index); + }; + + useEffect(() => { + //if state data are ready and assign to different field + const userData = getUserData(); + if(isObjEmpty(userData)){ + navigate('/login'); + } + axios.get(`${apiPath}${GET_USER_REMINDER_FLAG}/${userData.id}`) + .then((response) => { + if (response.status === 200) { + setIsReceiveNotification(response.data.isReminder); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + const handleSwitchToggle = () => { + updateIsReceiveNotification(!isReceiveNotification); + }; + + const updateIsReceiveNotification = (flag) =>{ + setIsReceiveNotification(flag); + const userData = getUserData(); + axios.post(`${apiPath}${SET_USER_REMINDER_FLAG}/${userData.id}/${flag}`) + .then((response) => { + if (response.status === 204) { + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + return ( + + + + Account Settings + + + { + isLotusUser ? + : + handleListItemClick(event, 0)}> + + + + + + } + handleListItemClick(event, 1)}> + + + + + + + + + + + + + + + ); +}; + +ProfileTab.propTypes = { + handleLogout: PropTypes.func +}; + +export default ProfileTab; diff --git a/src/layout/MainLayout/Header/HeaderContent/Profile/SettingTab.js b/src/layout/MainLayout/Header/HeaderContent/Profile/SettingTab.js new file mode 100644 index 0000000..d4c4738 --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/Profile/SettingTab.js @@ -0,0 +1,56 @@ +import { useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { List, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; + +// assets +import { CommentOutlined, LockOutlined, QuestionCircleOutlined, UserOutlined, UnorderedListOutlined } from '@ant-design/icons'; + +// ==============================|| HEADER PROFILE - SETTING TAB ||============================== // + +const SettingTab = () => { + const theme = useTheme(); + + const [selectedIndex, setSelectedIndex] = useState(0); + const handleListItemClick = (event, index) => { + setSelectedIndex(index); + }; + + return ( + + handleListItemClick(event, 0)}> + + + + + + handleListItemClick(event, 1)}> + + + + + + handleListItemClick(event, 2)}> + + + + + + handleListItemClick(event, 3)}> + + + + + + handleListItemClick(event, 4)}> + + + + + + + ); +}; + +export default SettingTab; diff --git a/src/layout/MainLayout/Header/HeaderContent/Profile/index.js b/src/layout/MainLayout/Header/HeaderContent/Profile/index.js new file mode 100644 index 0000000..e9e8c68 --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/Profile/index.js @@ -0,0 +1,169 @@ +import PropTypes from 'prop-types'; +import { useRef, useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { + Avatar, + Box, + ButtonBase, + CardContent, + ClickAwayListener, + Grid, + IconButton, + Paper, + Popper, + Stack, + Typography +} from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; +import Transitions from 'components/@extended/Transitions'; +import ProfileTab from './ProfileTab'; + +// assets +import defaultAvatar from 'assets/images/users/empty-avatar.png'; +import { LogoutOutlined} from '@ant-design/icons'; +import { handleLogoutFunction } from 'auth/index'; +import {useNavigate} from "react-router-dom"; +import {useDispatch} from "react-redux"; + +// tab panel wrapper +function TabPanel({ children, value, index, ...other }) { + return ( + + ); +} + +TabPanel.propTypes = { + children: PropTypes.node, + index: PropTypes.any.isRequired, + value: PropTypes.any.isRequired +}; + +// ==============================|| HEADER CONTENT - PROFILE ||============================== // + +const Profile = () => { + const theme = useTheme(); + const navigate = useNavigate() + const dispatch = useDispatch() + + const handleLogout = async () => { + //dispatch(handleLogoutFunction()); + await dispatch(handleLogoutFunction()); + navigate('/login'); + window.location.reload(); + + }; + + const userData = JSON.parse(localStorage.getItem("userData")); + + const anchorRef = useRef(null); + const [open, setOpen] = useState(false); + const handleToggle = () => { + setOpen((prevOpen) => !prevOpen); + }; + + const handleClose = (event) => { + if (anchorRef.current && anchorRef.current.contains(event.target)) { + return; + } + setOpen(false); + }; + + const iconBackColorOpen = 'grey.300'; + + return ( + + + + + {userData == null ? "" : userData.fullName} + + + + {({ TransitionProps }) => ( + + {open && ( + + + + + + + + {/**/} + + {userData == null ? "" : userData.fullName} + {/**/} + {/* UI/UX Designer*/} + {/**/} + + + + + + + + + + + {open && ( + <> + + + )} + + + + )} + + )} + + + ); +}; + +export default Profile; diff --git a/src/layout/MainLayout/Header/HeaderContent/Search.js b/src/layout/MainLayout/Header/HeaderContent/Search.js new file mode 100644 index 0000000..a5c1a21 --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/Search.js @@ -0,0 +1,139 @@ +// material-ui +import { + Box, Button, + FormControl, + TextField +} from '@mui/material'; + +// assets +import {MODULE_COMBO} from "../../../../utils/ComboConst"; +import Autocomplete from "@mui/material/Autocomplete"; +import * as React from "react"; +import {useContext, useEffect, useState} from "react"; +import {LIONER_BUTTON_THEME } from "../../../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {useForm} from "react-hook-form"; +import {useNavigate} from "react-router"; +import 'assets/style/rankStyle.css'; +import {LIONER_FORM_THEME} from "../../../../themes/themeConst"; +import {useLocation} from "react-router-dom"; +import {Grid} from "@mui/material"; +import LocaleContext from "../../../../components/I18nProvider"; + +// ==============================|| HEADER CONTENT - SEARCH ||============================== // + +const Search = () => { + const [selectedModule, setSelectedModule] = useState(null); + const { register, handleSubmit, setValue} = useForm() + const [errors, setErrors] = useState({}); + const navigate = useNavigate(); + const location = useLocation(); + const [isAdvanceSearch, setIsAdvanceSearch] = useState(false); + const { isAdvanceDisplay } = useContext(LocaleContext); + + + useEffect(()=>{ + const path = location.pathname.split('/')[1]; + if(path === "advance"){ + setIsAdvanceSearch(true); + } + else{ + setIsAdvanceSearch(false); + } + },[location]); + + + const onSubmit = (data) => { + const formErrors = {}; + + if (!data.keyword) { + formErrors.keyword = 'Keyword cannot be null'; + } + + if (selectedModule == null){ + formErrors.module = 'Module is required'; + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0) { + navigate(`/advance/${selectedModule.label}/${data.keyword}`); + setSelectedModule(null); + setValue("keyword",null); + } + }; + + return( + + + { + !isAdvanceDisplay? + : + +
+ + + + + + + + { + setSelectedModule(newValue); + }} + renderInput={(params) => + + } + /> + + + + + + +
+
+ } + + +
+ ); +}; + +export default Search; diff --git a/src/layout/MainLayout/Header/HeaderContent/index.js b/src/layout/MainLayout/Header/HeaderContent/index.js new file mode 100644 index 0000000..2763aeb --- /dev/null +++ b/src/layout/MainLayout/Header/HeaderContent/index.js @@ -0,0 +1,30 @@ +// material-ui +import { Box, useMediaQuery } from '@mui/material'; + +// project import +import Search from './Search'; +import Profile from './Profile'; +//import Notification from './Notification'; +import MobileSection from './MobileSection'; +//import LocaleSelector from "./LocaleSelector"; + +// ==============================|| HEADER - CONTENT ||============================== // + +const HeaderContent = () => { + const matchesXs = useMediaQuery((theme) => theme.breakpoints.down('md')); + + return ( + <> + {!matchesXs && } + {matchesXs && } + + {/**/} + + {/**/} + {!matchesXs && } + {matchesXs && } + + ); +}; + +export default HeaderContent; diff --git a/src/layout/MainLayout/Header/index.js b/src/layout/MainLayout/Header/index.js new file mode 100644 index 0000000..cfb65bf --- /dev/null +++ b/src/layout/MainLayout/Header/index.js @@ -0,0 +1,69 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { AppBar, IconButton, Toolbar, useMediaQuery } from '@mui/material'; + +// project import +import AppBarStyled from './AppBarStyled'; +import HeaderContent from './HeaderContent'; + +// assets +import { MenuFoldOutlined, MenuUnfoldOutlined } from '@ant-design/icons'; + +// ==============================|| MAIN LAYOUT - HEADER ||============================== // + +const Header = ({ open, handleDrawerToggle }) => { + const theme = useTheme(); + const matchDownMD = useMediaQuery(theme.breakpoints.down('lg')); + + const iconBackColor = 'grey.100'; + const iconBackColorOpen = 'grey.200'; + + // common header + const mainHeader = ( + + + {!open ? : } + + + + ); + + // app-bar params + const appBar = { + position: 'fixed', + color: 'inherit', + elevation: 0, + sx: { + borderBottom: `1px solid ${theme.palette.divider}` + // boxShadow: theme.customShadows.z1 + } + }; + + return ( + <> + {!matchDownMD ? ( + + {mainHeader} + + ) : ( + {mainHeader} + )} + + ); +}; + +Header.propTypes = { + open: PropTypes.bool, + handleDrawerToggle: PropTypes.func +}; + +export default Header; diff --git a/src/layout/MainLayout/index.js b/src/layout/MainLayout/index.js new file mode 100644 index 0000000..8551e3d --- /dev/null +++ b/src/layout/MainLayout/index.js @@ -0,0 +1,60 @@ +import { useEffect, useState } from 'react'; +import { Outlet } from 'react-router-dom'; +import { useDispatch, useSelector } from 'react-redux'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Box, Toolbar, useMediaQuery } from '@mui/material'; + +// project import +import Drawer from './Drawer'; +import Header from './Header'; +import navigation from 'menu-items'; +import Breadcrumbs from 'components/@extended/Breadcrumbs'; + +// types +import { openDrawer } from 'store/reducers/menu'; + +// ==============================|| MAIN LAYOUT ||============================== // + +const MainLayout = () => { + const theme = useTheme(); + const matchDownLG = useMediaQuery(theme.breakpoints.down('lg')); + const dispatch = useDispatch(); + + const { drawerOpen } = useSelector((state) => state.menu); + + // drawer toggler + const [open, setOpen] = useState(drawerOpen); + const handleDrawerToggle = () => { + setOpen(!open); + dispatch(openDrawer({ drawerOpen: !open })); + }; + + // set media wise responsive drawer + useEffect(() => { + setOpen(!matchDownLG); + dispatch(openDrawer({ drawerOpen: !matchDownLG })); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [matchDownLG]); + + useEffect(() => { + if (open !== drawerOpen) setOpen(drawerOpen); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [drawerOpen]); + + return ( + +
+ + + + + + + + ); +}; + +export default MainLayout; diff --git a/src/layout/MinimalLayout/index.js b/src/layout/MinimalLayout/index.js new file mode 100644 index 0000000..04bd24b --- /dev/null +++ b/src/layout/MinimalLayout/index.js @@ -0,0 +1,11 @@ +import { Outlet } from 'react-router-dom'; + +// ==============================|| MINIMAL LAYOUT ||============================== // + +const MinimalLayout = () => ( + <> + + +); + +export default MinimalLayout; diff --git a/src/menu-items/appreciation.js b/src/menu-items/appreciation.js new file mode 100644 index 0000000..d3581ee --- /dev/null +++ b/src/menu-items/appreciation.js @@ -0,0 +1,39 @@ +// assets +import ThumbUpOffAltIcon from '@mui/icons-material/ThumbUpOffAlt'; +import DescriptionOutlinedIcon from '@mui/icons-material/DescriptionOutlined'; +// icons +const icons = { + ThumbUpOffAltIcon, + DescriptionOutlinedIcon +}; + +// ==============================|| MENU ITEMS - DASHBOARD ||============================== // + +const appreciation = { + id: 'appreciation-registration', + title: 'Appreciation Registration', + type: 'group', + //ability:['SUPPRESS','REMINDER'], + children: [ + { + id: 'appreciation', + title: 'Appreciation Record', + type: 'item', + url: '/appreciation', + icon: icons.ThumbUpOffAltIcon, + breadcrumbs: false, + ability:['VIEW','APPRECIATION'] + }, + { + id: 'report', + title: 'Reports', + type: 'item', + url: '/appreciation/report', + icon: icons.DescriptionOutlinedIcon, + breadcrumbs: false, + ability:['GENERATE','REPORTS'] + }, + ] +}; + +export default appreciation; diff --git a/src/menu-items/award.js b/src/menu-items/award.js new file mode 100644 index 0000000..219d0cc --- /dev/null +++ b/src/menu-items/award.js @@ -0,0 +1,51 @@ +// assets +import { DashboardOutlined } from '@ant-design/icons'; +import CalendarMonthIcon from '@mui/icons-material/CalendarMonth'; +import EmojiEventsIcon from '@mui/icons-material/EmojiEvents'; + +// icons +const icons = { + DashboardOutlined, + CalendarMonthIcon, + EmojiEventsIcon +}; + +// ==============================|| MENU ITEMS - DASHBOARD ||============================== // + +const award = { + id: 'award-management', + title: 'Award Management', + type: 'group', + //ability:['SUPPRESS','REMINDER'], + children: [ + { + id: 'event', + title: 'Event', + type: 'item', + url: '/event', + icon: icons.CalendarMonthIcon, + breadcrumbs: false, + ability:['VIEW','EVENT'] + }, + { + id: 'application', + title: 'Application', + type: 'item', + url: '/application', + icon: icons.DashboardOutlined, + breadcrumbs: false, + ability:['VIEW','APPLICATION'] + }, + { + id: 'award', + title: 'Award', + type: 'item', + url: '/award', + icon: icons.EmojiEventsIcon, + breadcrumbs: false, + ability:['VIEW','AWARD'] + }, + ] +}; + +export default award; diff --git a/src/menu-items/client.js b/src/menu-items/client.js new file mode 100644 index 0000000..085ce53 --- /dev/null +++ b/src/menu-items/client.js @@ -0,0 +1,33 @@ +// assets +import BoyIcon from '@mui/icons-material/Boy'; + +// icons +const ClientIcon = () => { + return ( +
+ +
+ ); +}; + +// ==============================|| MENU ITEMS - DASHBOARD ||============================== // + +const client = { + id: 'client-management', + title: 'Client Management', + type: 'group', + //ability:['SUPPRESS','REMINDER'], + children: [ + { + id: 'Client', + title: 'Client', + type: 'item', + url: '/client', + icon: ClientIcon, + breadcrumbs: false, + ability:['VIEW','DASHBOARD'] + }, + ] +}; + +export default client; diff --git a/src/menu-items/dashboard.js b/src/menu-items/dashboard.js new file mode 100644 index 0000000..1a96811 --- /dev/null +++ b/src/menu-items/dashboard.js @@ -0,0 +1,61 @@ +// assets +import { SearchOutlined, DashboardOutlined, ContainerOutlined } from '@ant-design/icons'; +import DescriptionIcon from '@mui/icons-material/Description'; +import NotificationsActiveOutlinedIcon from '@mui/icons-material/NotificationsActiveOutlined'; +import SpeedIcon from '@mui/icons-material/Speed'; +import {FormattedMessage} from "react-intl"; +// icons +const icons = { + SpeedIcon, + DashboardOutlined, + SearchOutlined, + ContainerOutlined, + DescriptionIcon, + NotificationsActiveOutlinedIcon +}; + +// ==============================|| MENU ITEMS - DASHBOARD ||============================== // + +const dashboard = { + id: 'group-dashboard', + type: 'group', + children: [ + /*{ + id: 'dashboard', + title: 'Dashboard', + type: 'item', + url: '/dashboard', + icon: icons.DashboardOutlined, + breadcrumbs: false + },*/ + { + id: 'lionerdashboard', + title: , + type: 'item', + url: '/lionerDashboard', + icon: icons.SpeedIcon, + breadcrumbs: false, + ability:['VIEW','DASHBOARD'] + }, + // { + // id: 'maintainPage', + // title: 'Reminder', + // type: 'item', + // url: '/reminder', + // icon: icons.NotificationsActiveOutlinedIcon, + // breadcrumbs: false, + // ability:['VIEW','REMINDER'] + // }, + // { + // id: 'searchPage', + // title: 'Search Template', + // type: 'item', + // url: '/template', + // icon: icons.DescriptionIcon, + // breadcrumbs: false, + // ability:['MAINTAIN','SEARCH_TEMPLATE'] + // }, + ] +}; + +export default dashboard; diff --git a/src/menu-items/index.js b/src/menu-items/index.js new file mode 100644 index 0000000..1ee9465 --- /dev/null +++ b/src/menu-items/index.js @@ -0,0 +1,19 @@ +// project import +//import pages from './pages'; +import dashboard from './dashboard'; +import setting from "./setting"; +//import misc from "./misc"; +import award from "./award"; +import client from "./client"; +import appreciation from "./appreciation"; +//import utilities from './utilities'; +//import support from './support'; + +// ==============================|| MENU ITEMS ||============================== // + +const menuItems = { + items: [dashboard, client, setting] +}; +// pages, utilities, support, misc + +export default menuItems; diff --git a/src/menu-items/misc.js b/src/menu-items/misc.js new file mode 100644 index 0000000..c180897 --- /dev/null +++ b/src/menu-items/misc.js @@ -0,0 +1,29 @@ +// assets +import { SettingOutlined, LoginOutlined, ProfileOutlined } from '@ant-design/icons'; + +// icons +const icons = { + SettingOutlined, + LoginOutlined, + ProfileOutlined +}; + +// ==============================|| MENU ITEMS - EXTRA PAGES ||============================== // + +const misc = { + id: 'misc', + title: 'Miscellaneous', + type: 'group', + children: [ + { + id: 'logout', + title: 'Logout', + type: 'item', + url: '/logout', + icon: icons.LoginOutlined, + breadcrumbs: false + } + ] +}; + +export default misc; diff --git a/src/menu-items/pages.js b/src/menu-items/pages.js new file mode 100644 index 0000000..b55b72f --- /dev/null +++ b/src/menu-items/pages.js @@ -0,0 +1,36 @@ +// assets +import { LoginOutlined, ProfileOutlined } from '@ant-design/icons'; + +// icons +const icons = { + LoginOutlined, + ProfileOutlined +}; + +// ==============================|| MENU ITEMS - EXTRA PAGES ||============================== // + +const pages = { + id: 'authentication', + title: 'Authentication', + type: 'group', + children: [ + { + id: 'login1', + title: 'Login', + type: 'item', + url: '/login', + icon: icons.LoginOutlined, + target: true + }, + { + id: 'register1', + title: 'Register', + type: 'item', + url: '/register', + icon: icons.ProfileOutlined, + target: true + } + ] +}; + +export default pages; diff --git a/src/menu-items/setting.js b/src/menu-items/setting.js new file mode 100644 index 0000000..90e09ec --- /dev/null +++ b/src/menu-items/setting.js @@ -0,0 +1,164 @@ +// assets +import { + SafetyCertificateOutlined, + SettingOutlined, + LoginOutlined, + ProfileOutlined, + UserOutlined, + UsergroupAddOutlined, + AppstoreOutlined, + NotificationOutlined, + TagOutlined, + DatabaseOutlined, + MenuUnfoldOutlined, + FileSearchOutlined, + MailOutlined, + ApartmentOutlined +} from '@ant-design/icons'; + +// icons +const icons = { + SettingOutlined, + LoginOutlined, + ProfileOutlined, + SafetyCertificateOutlined, + UserOutlined, + UsergroupAddOutlined, + AppstoreOutlined, + NotificationOutlined, + TagOutlined, + DatabaseOutlined, + MenuUnfoldOutlined, + FileSearchOutlined, + MailOutlined, + ApartmentOutlined +}; + +// ==============================|| MENU ITEMS - EXTRA PAGES ||============================== // + +const setting = { + id: 'settingMenu', + title: 'System Administration', + type: 'group', + children: [ + // { + // id: 'category', + // title: 'Category', + // type: 'item', + // url: '/category', + // icon: icons.AppstoreOutlined, + // breadcrumbs: false, + // ability:['MAINTAIN','CATEGORY'] + // }, + // { + // id: 'tag', + // title: 'Tag', + // type: 'item', + // url: '/tag', + // icon: icons.TagOutlined, + // breadcrumbs: false, + // ability:['MAINTAIN','TAG'] + // }, + // { + // id: 'promotionChannel', + // title: 'Promotion Channel', + // type: 'item', + // url: '/promotionChannel', + // icon: icons.NotificationOutlined, + // breadcrumbs: false, + // ability:['MAINTAIN','PROMOTION_CHANNEL'] + // }, + // { + // id: 'division', + // title: 'SBU / Division', + // type: 'item', + // url: '/division', + // icon: icons.DatabaseOutlined, + // breadcrumbs: false, + // ability:['MAINTAIN','DIVISION'] + // }, + // { + // id: 'clientDepartment', + // title: 'Client Department', + // type: 'item', + // url: '/clientDepartment', + // icon: icons.ApartmentOutlined, + // breadcrumbs: false, + // ability:['MAINTAIN','CLIENT_DEPARTMENT'] + // }, + { + id: 'userGroup', + title: 'User Group', + type: 'item', + url: '/usergroupSearchview', + icon: icons.UsergroupAddOutlined, + breadcrumbs: false, + ability:['MAINTAIN','USER_GROUP'] + }, + { + id: 'user', + title: 'User', + type: 'item', + url: '/userSearchview', + icon: icons.UserOutlined, + breadcrumbs: false, + ability:['MAINTAIN','USER'] + }, + // { + // id: 'auditLog', + // title: 'Audit Log', + // type: 'item', + // url: '/auditLog', + // icon: icons.FileSearchOutlined, + // breadcrumbs: false, + // ability:['VIEW','AUDIT_LOG'] + // }, + { + id: 'loginLog', + title: 'Login Log', + type: 'item', + url: '/loginLog', + icon: icons.MenuUnfoldOutlined, + breadcrumbs: false, + ability:['VIEW','LOGIN_LOG'] + }, + { + id: 'passwordPolicy', + title: 'Password Policy', + type: 'item', + url: '/passwordpolicy', + icon: icons.SafetyCertificateOutlined, + breadcrumbs: false, + ability:['MANAGE','PASSWORD_POLICY'] + }, + { + id: 'setting', + title: 'System Configuration', + type: 'item', + url: '/setting', + icon: icons.SettingOutlined, + breadcrumbs: false, + ability:['MANAGE','SYSTEM_CONFIGURATION'] + }, + // { + // id: 'generateReminder', + // title: 'Generate Reminder', + // type: 'item', + // url: '/generateReminder', + // icon: icons.SettingOutlined, + // breadcrumbs: false, + // ability:['MANAGE','SYSTEM_CONFIGURATION'] + // }, + // { + // id: 'emailConfig', + // title: 'Email Configuration', + // type: 'item', + // url: '/emailConfig', + // icon: icons.MailOutlined, + // breadcrumbs: false, + // ability:['MANAGE','SYSTEM_CONFIGURATION'] + // }, + ] +}; + +export default setting; diff --git a/src/menu-items/support.js b/src/menu-items/support.js new file mode 100644 index 0000000..f934761 --- /dev/null +++ b/src/menu-items/support.js @@ -0,0 +1,36 @@ +// assets +import { ChromeOutlined, QuestionOutlined } from '@ant-design/icons'; + +// icons +const icons = { + ChromeOutlined, + QuestionOutlined +}; + +// ==============================|| MENU ITEMS - SAMPLE PAGE & DOCUMENTATION ||============================== // + +const support = { + id: 'support', + title: 'Support', + type: 'group', + children: [ + { + id: 'sample-page', + title: 'Sample Page', + type: 'item', + url: '/sample-page', + icon: icons.ChromeOutlined + }, + { + id: 'documentation', + title: 'Documentation', + type: 'item', + url: 'https://codedthemes.gitbook.io/mantis/', + icon: icons.QuestionOutlined, + external: true, + target: true + } + ] +}; + +export default support; diff --git a/src/menu-items/utilities.js b/src/menu-items/utilities.js new file mode 100644 index 0000000..4e8e116 --- /dev/null +++ b/src/menu-items/utilities.js @@ -0,0 +1,60 @@ +// assets +import { + AppstoreAddOutlined, + AntDesignOutlined, + BarcodeOutlined, + BgColorsOutlined, + FontSizeOutlined, + LoadingOutlined +} from '@ant-design/icons'; + +// icons +const icons = { + FontSizeOutlined, + BgColorsOutlined, + BarcodeOutlined, + AntDesignOutlined, + LoadingOutlined, + AppstoreAddOutlined +}; + +// ==============================|| MENU ITEMS - UTILITIES ||============================== // + +const utilities = { + id: 'utilities', + title: 'Utilities', + type: 'group', + children: [ + { + id: 'util-typography', + title: 'Typography', + type: 'item', + url: '/typography', + icon: icons.FontSizeOutlined + }, + { + id: 'util-color', + title: 'Color', + type: 'item', + url: '/color', + icon: icons.BgColorsOutlined + }, + { + id: 'util-shadow', + title: 'Shadow', + type: 'item', + url: '/shadow', + icon: icons.BarcodeOutlined + }, + { + id: 'ant-icons', + title: 'Ant Icons', + type: 'item', + url: '/icons/ant', + icon: icons.AntDesignOutlined, + breadcrumbs: false + } + ] +}; + +export default utilities; diff --git a/src/pages/authentication/AuthCard.js b/src/pages/authentication/AuthCard.js new file mode 100644 index 0000000..c85f295 --- /dev/null +++ b/src/pages/authentication/AuthCard.js @@ -0,0 +1,34 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { Box } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; + +// ==============================|| AUTHENTICATION - CARD WRAPPER ||============================== // + +const AuthCard = ({ children, ...other }) => ( + *': { + flexGrow: 1, + flexBasis: '50%' + } + }} + content={false} + {...other} + border={false} + boxShadow + > + {children} + +); + +AuthCard.propTypes = { + children: PropTypes.node +}; + +export default AuthCard; diff --git a/src/pages/authentication/AuthWrapper.js b/src/pages/authentication/AuthWrapper.js new file mode 100644 index 0000000..200c7b9 --- /dev/null +++ b/src/pages/authentication/AuthWrapper.js @@ -0,0 +1,51 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { Box, Grid } from '@mui/material'; + +// project import +import AuthCard from './AuthCard'; +import Logo from 'components/Logo'; + +// assets +import AuthBackground from 'assets/images/auth/AuthBackground'; + +// ==============================|| AUTHENTICATION - WRAPPER ||============================== // + +const AuthWrapper = ({ children }) => ( + + + + + + + + + + {children} + + + + + +); + +AuthWrapper.propTypes = { + children: PropTypes.node +}; + +export default AuthWrapper; diff --git a/src/pages/authentication/Login.js b/src/pages/authentication/Login.js new file mode 100644 index 0000000..21fbb83 --- /dev/null +++ b/src/pages/authentication/Login.js @@ -0,0 +1,30 @@ +//import { Link } from 'react-router-dom'; + +// material-ui +import { Grid, Stack, Typography } from '@mui/material'; + +// project import +import AuthLogin from './auth-forms/AuthLogin'; +import AuthWrapper from './AuthWrapper'; + +// ================================|| LOGIN ||================================ // + +const Login = () => ( + + + + + Login + {/**/} + {/* Don't have an account?*/} + {/**/} + + + + + + + +); + +export default Login; diff --git a/src/pages/authentication/Register.js b/src/pages/authentication/Register.js new file mode 100644 index 0000000..9192732 --- /dev/null +++ b/src/pages/authentication/Register.js @@ -0,0 +1,30 @@ +import { Link } from 'react-router-dom'; + +// material-ui +import { Grid, Stack, Typography } from '@mui/material'; + +// project import +import FirebaseRegister from './auth-forms/AuthRegister'; +import AuthWrapper from './AuthWrapper'; + +// ================================|| REGISTER ||================================ // + +const Register = () => ( + + + + + Sign up + + Already have an account? + + + + + + + + +); + +export default Register; diff --git a/src/pages/authentication/auth-forms/AuthLogin.js b/src/pages/authentication/auth-forms/AuthLogin.js new file mode 100644 index 0000000..3e9a40d --- /dev/null +++ b/src/pages/authentication/auth-forms/AuthLogin.js @@ -0,0 +1,282 @@ +import React, {useState} from 'react'; +import {useNavigate} from 'react-router-dom'; + +// material-ui +import { + Button, + //Checkbox, + //Divider, + //FormControlLabel, + FormHelperText, + Grid, + //Link, + IconButton, + InputAdornment, + InputLabel, + Stack, TextField, + //Typography +} from '@mui/material'; + +// third party +import * as Yup from 'yup'; +import { Formik } from 'formik'; + +// project import +//import FirebaseSocial from './FirebaseSocial'; +import AnimateButton from 'components/@extended/AnimateButton'; +// assets +import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; +//import axios from "axios"; +import {useDispatch} from "react-redux"; +import {handleLogin} from "auth/index"; +//import useJwt from "../../../auth/jwt/useJwt"; +import axios from "axios"; +import {apiPath} from "../../../auth/utils"; +import {LOGIN_PATH} from "../../../utils/ApiPathConst"; +import {LIONER_LOGIN_THEME} from "../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +//import {AbilityContext} from "utils/context/Can" +// ============================|| FIREBASE - LOGIN ||============================ // + +const AuthLogin = () => { + //const ability = useContext(AbilityContext) + const dispatch = useDispatch() + const navigate = useNavigate() + //const [checked, setChecked] = useState(false); + + const [showPassword, setShowPassword] = useState(false); + const [errors, setErrors] = useState({}); + const handleClickShowPassword = () => { + setShowPassword(!showPassword); + }; + + const [userName, setUserName] = useState(""); + const [userPassword, setUserPassword] = useState(""); + + const handleMouseDownPassword = (event) => { + event.preventDefault(); + }; + + const tryLogin = () => { + + const formErrors = {}; + + if (userName.length===0) { + formErrors.loginError = 'Username are required.'; + } + + if (userPassword.length===0){ + formErrors.passwordError = 'Password are required.'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + axios.post(`${apiPath}${LOGIN_PATH}`, + {username: userName, password: userPassword}, + ) + .then(async (response) => { + const userData = { + id: response.data.id, + fullName: response.data.name, + email: response.data.email, + role: response.data.role, + abilities: response.data.abilities, + subDivisionId: response.data.subDivisionId, + lotusNotesUser: response.data.lotusNotesUser + //avatar: require('src/assets/images/users/avatar-3.png').default, + } + const data = { + ...userData, + accessToken: response.data.accessToken, + refreshToken: response.data.refreshToken + } + await dispatch(handleLogin(data)) + //const abilities = response.data.abilities + //ability.update(abilities) + const lastPath = localStorage.getItem('lastVisitedPath'); + + await navigate(lastPath === null ? '/lionerDashboard' : lastPath); + await window.location.reload(); + await localStorage.removeItem('lastVisitedPath'); + + }) + .catch(error => { + const formErrors = {}; + formErrors.loginError = " "; + formErrors.passwordError = error.response.data.message; + setErrors(formErrors); + + return false; + }); + + /*useJwt + .login({username: userName, password: userPassword}) + .then((response) => { + const userData = { + id: response.data.id, + fullName: response.data.name, + email: response.data.email, + role: response.data.role, + abilities: response.data.abilities, + //avatar: require('src/assets/images/users/avatar-3.png').default, + } + const data = {...userData, accessToken: response.data.accessToken, refreshToken: response.data.refreshToken} + dispatch(handleLogin(data)) + //const abilities = response.data.abilities + //ability.update(abilities) + navigate('/lionerDashboard'); + }) + .catch(error => { + console.log(error); + return Promise.reject(error); + });*/ + } + + } + + const onUserNameChange = (event) => { + setUserName(event.target.value); + } + + const onPasswordChange = (event) => { + setUserPassword(event.target.value); + } + return ( + <> + { + try { + setStatus({ success: false }); + setSubmitting(false); + } catch (err) { + setStatus({ success: false }); + setErrors({ submit: err.message }); + setSubmitting(false); + } + }} + > + {({ handleBlur, handleSubmit, isSubmitting /*touched*/ }) => ( +
+ + + + + User Name + + {/*{touched.email && errors.email && (*/} + {/* */} + {/* {errors.email}*/} + {/* */} + {/*)}*/} + + + + + Password + + + {showPassword ? : } + + + ), + }} + placeholder="Enter password" + /> + {/*{touched.password && errors.password && (*/} + {/* */} + {/* {errors.password}*/} + {/* */} + {/*)}*/} + + + + + + {/* setChecked(event.target.checked)}*/} + {/* name="checked"*/} + {/* color="primary"*/} + {/* size="small"*/} + {/* />*/} + {/* }*/} + {/* label={Keep me sign in}*/} + {/*/>*/} + {/**/} + {/* Forgot Password?*/} + {/**/} + + + {errors.submit && ( + + {errors.submit} + + )} + + + + + + {/**/} + {/* */} + {/* Login with*/} + {/* */} + {/**/} + {/**/} + {/* */} + {/**/} + + +
+ )} +
+ + ); +}; + +export default AuthLogin; diff --git a/src/pages/authentication/auth-forms/AuthRegister.js b/src/pages/authentication/auth-forms/AuthRegister.js new file mode 100644 index 0000000..41b1a20 --- /dev/null +++ b/src/pages/authentication/auth-forms/AuthRegister.js @@ -0,0 +1,263 @@ +import { useEffect, useState } from 'react'; +import { Link as RouterLink } from 'react-router-dom'; + +// material-ui +import { + Box, + Button, + Divider, + FormControl, + FormHelperText, + Grid, + Link, + IconButton, + InputAdornment, + InputLabel, + OutlinedInput, + Stack, + Typography +} from '@mui/material'; + +// third party +import * as Yup from 'yup'; +import { Formik } from 'formik'; + +// project import +import FirebaseSocial from './FirebaseSocial'; +import AnimateButton from 'components/@extended/AnimateButton'; +import { strengthColor, strengthIndicator } from 'utils/password-strength'; + +// assets +import { EyeOutlined, EyeInvisibleOutlined } from '@ant-design/icons'; + +// ============================|| FIREBASE - REGISTER ||============================ // + +const AuthRegister = () => { + const [level, setLevel] = useState(); + const [showPassword, setShowPassword] = useState(false); + const handleClickShowPassword = () => { + setShowPassword(!showPassword); + }; + + const handleMouseDownPassword = (event) => { + event.preventDefault(); + }; + + const changePassword = (value) => { + const temp = strengthIndicator(value); + setLevel(strengthColor(temp)); + }; + + useEffect(() => { + changePassword(''); + }, []); + + return ( + <> + { + try { + setStatus({ success: false }); + setSubmitting(false); + } catch (err) { + console.error(err); + setStatus({ success: false }); + setErrors({ submit: err.message }); + setSubmitting(false); + } + }} + > + {({ errors, handleBlur, handleChange, handleSubmit, isSubmitting, touched, values }) => ( +
+ + + + First Name* + + {touched.firstname && errors.firstname && ( + + {errors.firstname} + + )} + + + + + Last Name* + + {touched.lastname && errors.lastname && ( + + {errors.lastname} + + )} + + + + + Company + + {touched.company && errors.company && ( + + {errors.company} + + )} + + + + + Email Address* + + {touched.email && errors.email && ( + + {errors.email} + + )} + + + + + Password + { + handleChange(e); + changePassword(e.target.value); + }} + endAdornment={ + + + {showPassword ? : } + + + } + placeholder="******" + inputProps={{}} + /> + {touched.password && errors.password && ( + + {errors.password} + + )} + + + + + + + + + {level?.label} + + + + + + + + By Signing up, you agree to our   + + Terms of Service + +   and   + + Privacy Policy + + + + {errors.submit && ( + + {errors.submit} + + )} + + + + + + + + Sign up with + + + + + + +
+ )} +
+ + ); +}; + +export default AuthRegister; diff --git a/src/pages/authentication/auth-forms/FirebaseSocial.js b/src/pages/authentication/auth-forms/FirebaseSocial.js new file mode 100644 index 0000000..b8e3168 --- /dev/null +++ b/src/pages/authentication/auth-forms/FirebaseSocial.js @@ -0,0 +1,66 @@ +// material-ui +import { useTheme } from '@mui/material/styles'; +import { useMediaQuery, Button, Stack } from '@mui/material'; + +// assets +import Google from 'assets/images/icons/google.svg'; +import Twitter from 'assets/images/icons/twitter.svg'; +import Facebook from 'assets/images/icons/facebook.svg'; + +// ==============================|| FIREBASE - SOCIAL BUTTON ||============================== // + +const FirebaseSocial = () => { + const theme = useTheme(); + const matchDownSM = useMediaQuery(theme.breakpoints.down('sm')); + + const googleHandler = async () => { + // login || singup + }; + + const twitterHandler = async () => { + // login || singup + }; + + const facebookHandler = async () => { + // login || singup + }; + + return ( + + + + + + ); +}; + +export default FirebaseSocial; diff --git a/src/pages/client/ClientMaintainPage/ApplicationTable.js b/src/pages/client/ClientMaintainPage/ApplicationTable.js new file mode 100644 index 0000000..8b73ed4 --- /dev/null +++ b/src/pages/client/ClientMaintainPage/ApplicationTable.js @@ -0,0 +1,122 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect, useRef} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay} from "../../../utils/CommonFunction"; +import AbilityContext from "../../../components/AbilityProvider"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function ApplicationTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const ability = useContext(AbilityContext); + + const navigate = useNavigate() + + const gridRef = useRef(null); + + useEffect(() => { + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/application/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="warning" + disabled={!ability.can('VIEW','APPLICATION')} + />] + }, + }, + { + id: 'applicationName', + field: 'applicationName', + headerName: 'Application', + flex: 1, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'subDivisions', + field: 'subDivisions', + //type: 'date', + //sortable: false, + headerName: 'Sub-Divisions', + flex: 1, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'tags', + field: 'tags', + //type: 'date', + //sortable: false, + headerName: 'Tags', + flex: 0.8, + }, + { + id: 'responsibleOfficer', + field: 'responsibleOfficer', + headerName: 'Responsible Officer', + flex: 0.7, + }, + ]; + + return ( +
+ 'auto'} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 5}, + }, + }} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[5]} + autoHeight + /> +
+ ); +} diff --git a/src/pages/client/ClientMaintainPage/ClientForm.js b/src/pages/client/ClientMaintainPage/ClientForm.js new file mode 100644 index 0000000..0d83ffb --- /dev/null +++ b/src/pages/client/ClientMaintainPage/ClientForm.js @@ -0,0 +1,1109 @@ +// material-ui +import { + Button, + FormControlLabel, + Grid, InputAdornment, Switch, TextField, Typography +} from '@mui/material'; +import MainCard from "../../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useContext, useEffect, useState} from "react"; +import LoadingComponent from "../../extra-pages/LoadingComponent"; +import {useLocation, useNavigate, useParams} from "react-router-dom"; +import { + GeneralConfirmWindow, + getComboValueByIdList, + getComboValueByLabel, + getDateString, + getDeletedRecordWithRefList, + getIdList, + getNewRecordWithRefList, isOptionEqualToValue, isStringEmptyAfterTrim, notifyDeleteError, notifyDeleteSuccess, + notifySaveSuccess, trimDataBeforePost, +} from "../../../utils/CommonFunction"; +import Autocomplete from "@mui/material/Autocomplete"; +import axios from "axios"; +import {apiPath} from "../../../auth/utils"; +import { + CHECK_EVENT_DUPLICATE, //GET_EVENT_NOTIFICATION_OVERTIME, + GET_EVENT_PATH, + GET_SUB_DIVISION_COMBO_LIST, + POST_EVENT_PATH +} from "../../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME, GENERAL_RED_COLOR} from "../../../themes/colorConst"; +import {eventFrequencyCombo, EVENT_REGION_COMBO, EVENT_TYPE_COMBO} from "../../../utils/ComboConst"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../../components/UploadProvider"; +import {isObjEmpty} from "../../../utils/Utils"; +import AbilityContext from "../../../components/AbilityProvider"; +import {CARD_MAX_WIDTH} from "../../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ClientForm = ({ refClientDetail, + isNewRecord, + refSubDivisionList, + getClientDetail, + applicationList, + refReminderInterval, + refReminderBefore, + refReminderLimit, + refReminderLimitMax +}) => { + const [overtimeWarning, setOvertimeWarning] = useState(""); + const [reminderInterval, setReminderInterval] = useState(null); + const [reminderBefore, setReminderBefore] = useState(null); + const [reminderLimit, setReminderLimit] = useState(null); + const [reminderLimitMax, setReminderLimitMax] = useState(0); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + const [isFirstInit, setIsFirstInit] = useState(true); + + const params = useParams(); + const navigate = useNavigate(); + const ability = useContext(AbilityContext); + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + const [eventDetail, setClientDetail] = useState({}); + const [isCollectData, setIsCollectData] = useState(false); + const [userConfirm, setUserConfirm] = useState(false); + const [isEditing, setIsEditing] = useState(false); + const { setIsUploading } = useContext(UploadContext); + const [refClient, setRefClient] = useState({}); + + //form data + const {register, getValues, setValue} = useForm(); + const [eventDate, setClientDate] = useState(null); + const [awardDate, setAwardDate] = useState(null); + const [deadlineDate, setDeadlineDate] = useState(null); + const [announceDate, setAnnounceDate] = useState(null); + const [selectedRegion, setSelectedRegion] = useState(null); + const [selectedType, setSelectedType] = useState(null); + const [selectedSubDivision, setSelectedSubDivision] = useState([]); + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [reminderFlag, setReminderFlag] = useState(false); + const [isFlagFetched, setIsFlagFetched] = useState(false); + + //reminder option + const [selectedFrequency, setSelectedFrequency] = useState(null); + const [nextApplicationDate, setNextApplicationDate] = useState(null); + + //combo list + const [subDivisionList, setSubDivisionList] = useState([]); + + const [eventDateError, setClientDateError] = React.useState(null); + const [awardDateError, setAwardDateError] = React.useState(null); + const [deadlineDateError, setDeadlineDateError] = React.useState(null); + const [announceDateError, setAnnounceDateError] = React.useState(null); + const [fromError, setFromError] = React.useState(null); + const [toError, setToError] = React.useState(null); + const [nextApplicationDateError, setNextApplicationDateError] = React.useState(null); + + const eventDateErrorMessage = React.useMemo(() => { + switch (eventDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [eventDateError]); + + const awardDateErrorMessage = React.useMemo(() => { + switch (awardDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [awardDateError]); + + const deadlineDateErrorMessage = React.useMemo(() => { + switch (deadlineDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [deadlineDateError]); + + const announceDateErrorMessage = React.useMemo(() => { + switch (announceDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [announceDateError]); + + const fromErrorMessage = React.useMemo(() => { + switch (fromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [fromError]); + + const toErrorMessage = React.useMemo(() => { + switch (toError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [toError]); + + const nextApplicationDateErrorMessage = React.useMemo(() => { + switch (nextApplicationDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [nextApplicationDateError]); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + const copyClientAsNew = () => { + navigate(`/event/maintain/-1?refId=${params.id}`); + } + + useEffect(()=>{ + if(applicationList.length===0){ + validateReminder(); + } + },[eventDate, nextApplicationDate, deadlineDate]); + + const validateReminder = () =>{ + const values = getValues(); + let firstIssueDate = null; + let reminderDates = []; + if (eventDate !== null && + nextApplicationDate !== null && + values.reminderThreshold !== null && + values.reminderInterval !== null && + values.reminderLimit !== null + ) { + //have value + if(applicationList.length <=0){ + firstIssueDate = eventDate.add(-values.reminderThreshold,'days'); + } + else{ + firstIssueDate = nextApplicationDate.add(-values.reminderThreshold, 'days'); + } + + reminderDates.push(firstIssueDate); + for(let i=1; i < parseInt(values.reminderLimit)+1 ; i++){ + reminderDates.push(firstIssueDate.add(i*values.reminderInterval,'days')) + } + + for(let j=0; j < reminderDates.length ; j++){ + if(reminderDates[j]-deadlineDate > 0){ + setOvertimeWarning(`Estimated reminder exceeds the application deadline, the last reminder will be generated on ${reminderDates[j>1?j-1:0].format('DD/MM/YYYY')}.`); + return false; + } + } + + setOvertimeWarning(""); + return true; + } + return true; + } + + function updateData(){ + if(applicationList.length >0){ + notifyDeleteError("Delete restricted. Application exist in this event"); + setIsWindowOpen(false); + } + else{ + axios.delete(`${apiPath}${GET_EVENT_PATH}/${params.id}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + returnSearchPage(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + const validateReminderLimit = (value) => { + const maxValue = reminderLimitMax; // Set the maximum value here + if (/^[0-9]\d*$/.test(value) || value === '') { + if (parseInt(value) > maxValue) { + //console.log(value); + setValue("reminderLimit", maxValue) + } + } + else{ + setValue("reminderLimit", ''); + } + }; + + const handleReminderIntervalChange = (event) => { + const inputValue = event.target.value; + if (/^[0-9]\d*$/.test(inputValue) || inputValue === '') { + setValue("reminderInterval", inputValue); + } + else{ + setValue("reminderInterval", ''); + } + }; + + const handleReminderThresholdChange = (event) => { + const inputValue = event.target.value; + if (/^[0-9]\d*$/.test(inputValue) || inputValue === '') { + setValue("reminderThreshold", inputValue); + } + else{ + setValue("reminderThreshold", ''); + } + }; + + useEffect(()=>{ + //if combo list ready + if (subDivisionList.length >0) { + setRefClient(refClientDetail); + } + },[subDivisionList]); + + useEffect(()=>{ + if(!isObjEmpty(refClient)){ + setIsFlagFetched(true); + } + },[reminderFlag,refClient]); + + useEffect(()=>{ + if(isFlagFetched){ + if(!reminderFlag){ + setReminderInterval(null); + setReminderBefore(null); + setReminderLimit(null); + setValue("reminderThreshold",null); + setValue("reminderLimit",null); + setValue("reminderInterval",null); + } + } + },[isFlagFetched, refClient, reminderFlag]); + + useEffect(()=>{ + setReminderLimitMax(refReminderLimitMax); + if(!isObjEmpty(refClient) ) { + if(reminderFlag){ + setReminderInterval(refReminderInterval); + setReminderBefore(refReminderBefore); + setReminderLimit(refReminderLimit); + } + } + },[reminderFlag, refReminderLimit,refReminderInterval,refReminderLimitMax,refReminderBefore,refClient]); + + useEffect(()=>{ + //if ref data ready + if (!isObjEmpty(refClient)) { + //checkOvertime(); + if(refId !== null){ + setValue("name", refClient.name); + setValue("nameCht", refClient.nameCht); + setValue("description", refClient.description); + setValue("organization", refClient.organization); + setValue("series", refClient.series); + } + setSelectedSubDivision(getComboValueByIdList(subDivisionList,refSubDivisionList)); + setSelectedRegion(getComboValueByLabel(EVENT_REGION_COMBO, refClient.region)); + setSelectedType(getComboValueByLabel(EVENT_TYPE_COMBO, refClient.eventType)); + setReminderFlag(refClient.reminderFlag); + setSelectedFrequency(getComboValueByLabel(eventFrequencyCombo, refClient.frequency)); + setClientDate(dayjs(getDateString(refClient.startDate))); + setAwardDate( + refClient.awardDate === null ? null : dayjs(getDateString(refClient.awardDate)) + ); + setNextApplicationDate( + refClient.nextApplicationDate === null ? null : dayjs(getDateString(refClient.nextApplicationDate)) + ); + setAnnounceDate( + refClient.announcementDate === null ? null : dayjs(getDateString(refClient.announcementDate)) + ); + setFromDate( + refClient.eventFrom === null ? null : dayjs(getDateString(refClient.eventFrom)) + ); + setToDate( + refClient.eventTo === null ? null : dayjs(getDateString(refClient.eventTo)) + ); + setDeadlineDate(dayjs(getDateString(refClient.applicationDeadline))); + } + },[refClient]); + + useEffect(()=>{ + if( + !isObjEmpty(refClient) && + selectedSubDivision.length > 0 && + !isObjEmpty(selectedRegion) && + !isObjEmpty(selectedType) && + !isObjEmpty(eventDate) && + !isObjEmpty(deadlineDate) + ){ + setOnReady(true); + } + else if(isNewRecord){ + setOnReady(true); + setIsEditing(true); + } + },[refClient,selectedSubDivision,selectedRegion,selectedType, eventDate,deadlineDate]); + + useEffect(()=>{ + if(selectedFrequency !== null){ + if(selectedFrequency.key === 5 && isNewRecord){ + setReminderBefore(0); + setReminderInterval(0); + setReminderLimit(0); + setValue("reminderThreshold",null); + setValue("reminderLimit",null); + setValue("reminderInterval",null); + } + else if (isFirstInit && refId !== null){ + setValue("reminderThreshold",refClient.reminderThreshold); + setValue("reminderLimit",refClient.reminderLimit); + setValue("reminderInterval",refClient.reminderInterval); + setIsFirstInit(false); + } + else if(isNewRecord){ + setValue("reminderThreshold",refReminderBefore); + setValue("reminderLimit",refReminderLimit); + setValue("reminderInterval",refReminderInterval); + setReminderInterval(refReminderInterval); + setReminderBefore(refReminderBefore); + setReminderLimit(refReminderLimit); + } + + if (isEditing){ + if (eventDate !== null){ + switch(selectedFrequency.key){ + case 1: + setNextApplicationDate(eventDate.add(1,'month')); + break; + case 2: + setNextApplicationDate(eventDate.add(3,'month')); + break; + case 3: + setNextApplicationDate(eventDate.add(1,'year')); + break; + case 4: + setNextApplicationDate(eventDate.add(6,'month')); + break; + default: + setNextApplicationDate(nextApplicationDate); + break; + } + } + } + } + },[selectedFrequency,eventDate]); + + useEffect(() => { + //if state data are ready and assign to different field + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const formErrors = {}; + + if (isStringEmptyAfterTrim(values.name)) { + formErrors.name = 'Client Name is required'; + } + + + if (selectedRegion === null ) { + formErrors.region = 'Client Region is required'; + } + + if (isStringEmptyAfterTrim(values.organization)) { + formErrors.organization = 'Client Organization is required'; + } + + if (selectedType === null) { + formErrors.type = 'Client Type is required'; + } + + if (eventDate === null) { + formErrors.eventDate = 'Client Date is required'; + } + + if (deadlineDate === null) { + formErrors.deadlineDate = 'Deadline Date is required'; + } + + if (awardDate === null) { + formErrors.awardDate = 'Award Date is required'; + } + + if (selectedSubDivision.length <= 0){ + formErrors.subDivision = 'Sub-Division is required'; + } + + if(reminderFlag){ + if (selectedFrequency === null){ + formErrors.frequency = 'Frequency is required'; + } + + if (!values.reminderThreshold){ + formErrors.threshold = 'Threshold is required'; + } + + if (!values.reminderInterval){ + formErrors.interval = 'Interval is required'; + } + + if (!values.reminderLimit){ + formErrors.limit = 'Limit is required'; + } + + + if(applicationList.length===0){ + if(!validateReminder()){ + formErrors.calError = "calError"; + } + } + + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0 && + !eventDateError && !awardDateError && + !deadlineDateError && !announceDateError && + !fromError && !toError && !nextApplicationDateError + ) { + axios.get(`${apiPath}${CHECK_EVENT_DUPLICATE}`, + { + params: { + "name": values.name.trim(), + "id": params.id, + }, + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if(response.data.isTaken){ + formErrors.name = 'Client name must be unique.'; + setErrors(formErrors); + setIsCollectData(false); + setUserConfirm(false); + } + else if(!response.data.isTaken){ + if (Object.keys(formErrors).length === 0) { + let data = {}; + data["id"] = isNewRecord ? params.id : refClientDetail.id; + data["description"] = values.description; + data["name"] = values.name; + data["nameCht"] = values.nameCht; + data["organization"] = values.organization; + data["reminderThreshold"] = values.reminderThreshold; + data["reminderInterval"] = values.reminderInterval; + data["reminderLimit"] = values.reminderLimit; + data["series"] = values.series; + data["region"] = selectedRegion === null ? null : selectedRegion.label; + data["eventType"] = selectedType === null ? null : selectedType.label; + data["frequency"] = selectedFrequency === null ? null : selectedFrequency.label; + data["reminderFlag"] = reminderFlag; + data["startDate"] = eventDate === null ? null : dayjs(eventDate).format('YYYY-MM-DD'); + data["eventFrom"] = fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'); + data["eventTo"] = toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'); + data["applicationDeadline"] = deadlineDate === null ? null : dayjs(deadlineDate).format('YYYY-MM-DD'); + data["nextApplicationDate"] = nextApplicationDate === null ? null : dayjs(nextApplicationDate).format('YYYY-MM-DD'); + data["announcementDate"] = announceDate === null ? null : dayjs(announceDate).format('YYYY-MM-DD'); + data["awardDate"] = awardDate === null ? null : dayjs(awardDate).format('YYYY-MM-DD'); + data["subDivisionIds"] = isNewRecord ? getIdList(selectedSubDivision) : getNewRecordWithRefList(refSubDivisionList, getIdList(selectedSubDivision)); + data["subDivisionRemoveIds"] = isNewRecord ? [] : getDeletedRecordWithRefList(refSubDivisionList, getIdList(selectedSubDivision)); + setClientDetail(data); + } + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + }, [isCollectData]); + + function returnSearchPage(){ + navigate('/client'); + } + + function createNewApplication(){ + navigate('/application/maintain/-1/'+ params.id); + } + + useEffect(() => { + if (userConfirm) { + postClient(); + } + setUserConfirm(false); + }, [eventDetail]); + + + const submitData = () => { + setIsCollectData(!isCollectData); + setUserConfirm(true); + } + + const updateIsEdit = () => { + setIsEditing(!isEditing); + } + + function postClient(){ + setIsUploading(true); + const temp = trimDataBeforePost(eventDetail); + axios.post(`${apiPath}${POST_EVENT_PATH}`, + temp, + ) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + if(isNewRecord){ + setIsUploading(false); + navigate('/event') + } + else{ + setIsUploading(false); + getClientDetail(params.id); + //checkOvertime(); + setIsEditing(!isEditing); + } + setIsCollectData(!isCollectData); + + } + }) + .catch(error => { + if (error.response.status === 422){ + const formErrors = {}; + formErrors.subDivision = error.response.data.error; + setErrors(formErrors); + } + console.log(error); + setIsUploading(false); + return false; + }); + } + + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + Client Name: + * + + + + + + + + + + + + + + Last Name: + + + + + + + + + + + + + + First Name: + + + + + + + + + + {/* + + + + First Name: * + + + + + { + setSelectedRegion(newValue); + }} + renderInput={(params) => } + disabled={!isEditing} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + */} + + + + + + Join Date: * + + + + {/* + + + setClientDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setClientDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.eventDate || eventDateError, + helperText: eventDateError ? eventDateErrorMessage : errors.eventDate, + }, + }} + disabled={!isEditing} + /> + + + */} + + + + + + + + Series: + + + + {/* + + */} + + + + + + + + Application Deadline: * + + + + {/* + + + setDeadlineDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setDeadlineDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.deadlineDate || deadlineDateError, + helperText: deadlineDateError ? deadlineDateErrorMessage : errors.deadlineDate, + }, + }} + disabled={!isEditing} + /> + + + */} + + + + + + + + Award Date: * + + + + {/* + + + setAwardDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setAwardDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.awardDate || awardDateError, + helperText: awardDateError ? awardDateErrorMessage : errors.awardDate, + }, + }} + disabled={!isEditing} + /> + + + */} + + + + + + + + Sub-Divisions: * + + + + {/* + option.label} + onChange={(event, newValue) => { + setSelectedSubDivision(newValue); + }} + renderInput={(params) => ( + + {errors.subDivision.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + {...params} + placeholder="" + /> + )} + disabled={!isEditing} + isOptionEqualToValue={isOptionEqualToValue} + /> + */} + + + + + + + + Announcement Date: + + + + {/* + + + setAnnounceDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setAnnounceDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: announceDateErrorMessage, + }, + }} + disabled={!isEditing} + /> + + + */} + + + + + + + + Client Description: + + + + {/* + + */} + + + {/*row 2*/} + { + (isEditing ) ? + + + + + + + + + + + + + + + + + + + + + + {/* + + */} + + {/* + + */} + + + + + + : + + + + + + + + + + + + + + } + + + +
+
+ + + ); +}; + +export default ClientForm; diff --git a/src/pages/client/ClientMaintainPage/index.js b/src/pages/client/ClientMaintainPage/index.js new file mode 100644 index 0000000..d1a823a --- /dev/null +++ b/src/pages/client/ClientMaintainPage/index.js @@ -0,0 +1,247 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import ClientForm from "./ClientForm"; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../../auth/utils"; +import { + GET_EVENT_APPLICATION_PATH, + GET_CLIENT_PATH, + GET_REMINDER_BEFORE, + GET_REMINDER_INTERVAL, + GET_REMINDER_LIMIT, + GET_REMINDER_LIMIT_MAX, + GET_SUB_DIVISION_COMBO_LIST, +} from "../../../utils/ApiPathConst"; +import LoadingComponent from "../../extra-pages/LoadingComponent"; +import {useLocation, useParams} from "react-router-dom"; +import ApplicationTable from "./ApplicationTable"; +import MainCard from "../../../components/MainCard"; +import AbilityContext from "../../../components/AbilityProvider"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import {isObjEmpty} from "../../../utils/Utils"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ClientPanel = () => { + const params = useParams(); + const ability = useContext(AbilityContext); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + + const [onReady, setOnReady] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const [applicationDetail, setApplicationDetail] = useState({}); + const [subDivisionCombo, setSubDivisionCombo] = useState([]); + const [refSubDivisionList, setRefSubDivisionList] = useState([]); + const [clientDetail, setClientDetail] = useState({}); + const [applicationList, setApplicationList] = useState([]); + const [reminderInterval, setReminderInterval] = useState(0); + const [reminderBefore, setReminderBefore] = useState(0); + const [reminderLimit, setReminderLimit] = useState(0); + const [reminderLimitMax, setReminderLimitMax] = useState(0); + + //const [tagCombo, setTagCombo] = useState({}); + + function updateApplicationDetail(applicationData) { + setApplicationDetail(applicationData); + } + + useEffect(() => { + getReminderInterval(); + getReminderBefore(); + getReminderLimit(); + getReminderLimitMax(); + if(refId !== null){ + setIsNewRecord(true); + getClientDetail(refId); + } + else if(params.id<0){ + setIsNewRecord(true); + } + else{ + getClientDetail(params.id); + } + getGroupList(); + getApplicationList(); + }, []); + + function getReminderBefore(){ + axios.get(`${apiPath}${GET_REMINDER_BEFORE}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderBefore(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getReminderLimit(){ + axios.get(`${apiPath}${GET_REMINDER_LIMIT}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderLimit(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getReminderLimitMax(){ + axios.get(`${apiPath}${GET_REMINDER_LIMIT_MAX}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderLimitMax(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + if (!isObjEmpty(subDivisionCombo)) { + setOnReady(true); + } + else if(isNewRecord && + Object.keys(clientDetail).length > 0 + ){ + setOnReady(true); + } + }, [subDivisionCombo,clientDetail]); + + function getApplicationList(){ + const byDivision = { + clientId: params.id, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + axios.get(`${apiPath}${GET_EVENT_APPLICATION_PATH}`, + { + params: byDivision, + } + ) + .then((response) => { + if (response.status === 200) { + setApplicationList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getReminderInterval(){ + axios.get(`${apiPath}${GET_REMINDER_INTERVAL}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderInterval(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getClientDetail(clientId) { + axios.get(`${apiPath}${GET_CLIENT_PATH}/${clientId}`, + ) + .then((response) => { + if (response.status === 200) { + setClientDetail(response.data.data); + setRefSubDivisionList(response.data.clientDivision); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getGroupList() { + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + ) + .then((response) => { + if (response.status === 200) { + setSubDivisionCombo(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + return ( + !onReady ? + + : + + + + + + + {isNewRecord? "New Client" : "Maintain Client"} + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + { + params.id > 0 ? + + + + + + + + : + undefined + } + + + + ); +}; + +export default ClientPanel; diff --git a/src/pages/client/ClientSearchPage/ClientSearchForm.js b/src/pages/client/ClientSearchPage/ClientSearchForm.js new file mode 100644 index 0000000..b5b66c0 --- /dev/null +++ b/src/pages/client/ClientSearchPage/ClientSearchForm.js @@ -0,0 +1,491 @@ +// material-ui +import { + Button, + Typography, + Grid, TextField, InputLabel, CardActions +} from '@mui/material'; +import MainCard from "../../../components/MainCard"; +import {useForm} from "react-hook-form"; +import {useContext, useState} from "react"; +// import {useContext, useEffect, useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import * as React from "react"; +// import axios from "axios"; +// import {apiPath, getUserData} from "../../../auth/utils"; +// import { +// GET_CONSULTANT_COMBO_LIST, GET_EVENT_EXPORT, +// GET_SUB_CONSULTANT_COMBO_LIST, POST_SEARCH_TEMPLATE_PATH, VALIDATE_TEMPLATE_NAME_PATH, +// } from "../../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME} from "../../../themes/colorConst"; +// import { +// GeneralCreateTemplateWindow, +// getComboValueByIdList, getComboValueByLabel, +// getIdList, isOptionEqualToValue, notifySaveSuccess, +// } from "../../../utils/CommonFunction"; +// import Qs from 'qs'; +import {useNavigate} from "react-router"; +import {ThemeProvider} from "@emotion/react"; +// import UploadContext from "../../../components/UploadProvider"; +// import {EVENT_REGION_COMBO, EVENT_TYPE_COMBO} from "../../../utils/ComboConst"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +// import {isObjEmpty} from "../../../utils/Utils"; +// import {useLocation} from "react-router-dom"; +import AbilityContext from "../../../components/AbilityProvider"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../../themes/themeConst"; +import Collapse from '@mui/material/Collapse'; +import {ExpandMore} from "@mui/icons-material"; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import { isNull } from 'lodash'; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +// const EventSearchForm = ({applySearch, refTemplateData, isUpdating, +// setIsUpdating, getTemplateList,setExpanded,expanded,userConsultant}) => { +const ClientSearchForm = ({applySearch, setExpanded,expanded}) => { + + const navigate = useNavigate() + // const location = useLocation(); + // const queryParams = new URLSearchParams(location.search); + // const { setIsUploading } = useContext(UploadContext); + const ability = useContext(AbilityContext); + + + // const [selectedRegion, setSelectedRegion] = useState(null); + // const [selectedType, setSelectedType] = useState(null); + // const [selectedCaseManager, setSelectedCaseManager] = useState([]); + // const [selectedConsultants, setSelectedConsultants] = useState([]); + const [joinDateFrom, setJoinDateFrom] = useState(null); + const [joinDateTo, setJoinDateTo] = useState(null); + + // const [caseManagerList, setCaseManagerList] = useState([]); + // const [consultantList, setConsultantList] = useState([]); + + const { setValue, reset, register, handleSubmit, getValues } = useForm() + const handleExpandClick = () => { + setExpanded(!expanded); + }; + + const [joinDateFromError, setJoinDateFromError] = React.useState(null); + const [joinDateToError, setJoinDateToError] = React.useState(null); + + const joinDateFromErrorMessage = React.useMemo(() => { + switch (joinDateFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [joinDateFromError]); + + const joinDateToErrorMessage = React.useMemo(() => { + switch (joinDateToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [joinDateToError]); + + const createNewClient = () => { + navigate(`/client/maintain/-1`); + }; + + const onSubmit = (data) => { + const criteria = { + ...data, + joinDateFrom: joinDateFrom === null ? null : dayjs(joinDateFrom).format('YYYY-MM-DD'), + joinDateTo: joinDateTo === null ? null : dayjs(joinDateTo).format('YYYY-MM-DD'), + // region: selectedRegion === null ? null : selectedRegion.label, + // type: selectedType === null ? null :selectedType.label, + // consultantIdList: getIdList(selectedConsultants), + // caseManagerIdList: getIdList(selectedCaseManager), + }; + applySearch(criteria); + }; + + // function onExport(){ + // const data = getValues(); + // const temp = { + // ...data, + // fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + // joinDateTo: joinDateTo === null ? null : dayjs(joinDateTo).format('YYYY-MM-DD'), + // region: selectedRegion === null ? null : selectedRegion.label, + // type: selectedType === null ? null :selectedType.label, + // consultantIdList: getIdList(selectedConsultants), + // caseManagerIdList: getIdList(selectedCaseManager), + // }; + // setIsUploading(true); + // axios.get(`${apiPath}${GET_EVENT_EXPORT}`,{ + // responseType: 'blob', + // params: temp, + // paramsSerializer: function (params) { + // return Qs.stringify(params, { arrayFormat: 'repeat' }); + // }, + // }) + // .then((response) => { + // if (response.status === 200) { + // setIsUploading(false); + // const url = URL.createObjectURL(new Blob([response.data])); + // const link = document.createElement("a"); + // link.href = url; + // link.setAttribute("download", "event_export_"+ Date.now() + ".xlsx"); + // link.click(); + // } + // }) + // .catch(error => { + // setIsUploading(false); + // console.log(error); + // return false; + // }); + // } + + // function getCaseManagerCombo(caseManagerIds){ + // axios.get(`${apiPath}${GET_CASE_MANAGER_COMBO_LIST}`, + // { + // params: { + // "caseManagerIds": caseManagerIds + // }, + // paramsSerializer: function (params) { + // return Qs.stringify(params, { arrayFormat: 'repeat' }); + // }, + // }) + // .then((response) => { + // if (response.status === 200) { + // setCaseManagerList(response.data.records); + // if(!isObjEmpty(refEvent) && isUpdating){ + // setSelectedCaseManager(getComboValueByIdList(response.data.records,refEvent.selectedCaseManager)); + // setIsUpdating(false); + // } + // } + // }) + // .catch(error => { + // console.log(error); + // return false; + // }); + // } + + // function getConsultantCombo(){ + // axios.get(`${apiPath}${GET_CONSULTANT_COMBO_LIST}`) + // .then((response) => { + // if (response.status === 200) { + // setConsultantList(response.data.records); + // } + // }) + // .catch(error => { + // console.log(error); + // return false; + // }); + // } + + // useEffect(() => { + // getConsultantCombo(); + // getCaseManagerCombo(null); + // const year = queryParams.get('year'); + // if(year !== null){ + // setFromDate( + // dayjs(year+"-01-01 00:00:00") + // ); + // setToDate( + // dayjs(year+"12-31") + // ); + // } + // }, []); + + // useEffect(() => { + // const userCaseManager = queryParams.get('userCaseManager'); + // if(userCaseManager === "true" && + // !isObjEmpty(userConsultant) && + // !isObjEmpty(consultantList)){ + // setSelectedConsultants(getComboValueByIdList(consultantList,[userConsultant.id])); + // } + // }, [userConsultant,consultantList]); + + function resetForm(){ + // setSelectedCaseManager([]); + // setSelectedConsultants([]); + // setSelectedRegion(null); + // setSelectedType(null); + setJoinDateFrom(null); + setJoinDateTo(null); + // setToDate(null); + reset(); + } + + return ( + + + + {/*row 1*/} + + + Search Criteria(s) + + + + + + + + + + +
+ + {/*row 2*/} + + + Client Name + + + + + Client Last Name + + + + + Client First Name + + + + + Phone No. + + + + {/* + Case Manager + { + setSelectedCaseManager(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Consultant + { + setSelectedConsultants(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + */} + + {/* + Case Manager + { + setSelectedRegion(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Consultant + { + setSelectedType(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + */} + + + Join Date + + + + + + setJoinDateFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: joinDateFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={joinDateFrom === null ? null : dayjs(joinDateFrom)} + onChange={(newValue) => setJoinDateFrom(newValue)} + // label="From" + /> + + + + + + To + + + + + + setJoinDateToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: joinDateToErrorMessage, + }, + }} + id="joinDateTo" + //label="To Date" + value={joinDateTo === null ? null : dayjs(joinDateTo)} + onChange={(newValue) => setJoinDateTo(newValue)} + /> + + + + + + + + Remarks + + + + + + + {/*last row*/} + + + + + + + + + {/* + + */} + + + + + + + + + + {ability.can('EDIT','EVENT') ? + + + + : + + } + + + + + +
+
+
+ ); +}; + +export default ClientSearchForm; diff --git a/src/pages/client/ClientSearchPage/ClientTable.js b/src/pages/client/ClientSearchPage/ClientTable.js new file mode 100644 index 0000000..0445277 --- /dev/null +++ b/src/pages/client/ClientSearchPage/ClientTable.js @@ -0,0 +1,207 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay, dateComparator, getDateString} from "../../../utils/CommonFunction"; +import AbilityContext from "../../../components/AbilityProvider"; +import {LIONER_BUTTON_THEME} from "../../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| CLIENT TABLE ||============================== // + +export default function ClientTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const navigate = useNavigate() + const ability = useContext(AbilityContext); + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/client/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + // flex: 0.5, + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + disabled={'true'} + // disabled={!ability.can('VIEW','DASHBOARD')} + /> + + ] + }, + }, + // { + // id: 'title', + // field: 'title', + // headerName: 'Title', + // // sortComparator: dateComparator, + // flex: 0.75, + // renderCell: (params) => ( + //
+ // {params.value} + //
+ // //
+ // // {getDateString(params.row.clientFrom,false)} + // //
+ // ), + // }, + { + id: 'fullname', + field: 'fullname', + headerName: 'Client Name', + flex: 2, + renderCell: (params) => { + return ( +
+ ({params.row.title}) {params.value} +
+ ); + } + }, + { + id: 'joinDate', + field: 'joinDate', + headerName: 'Join Date', + flex: 1, + sortComparator: dateComparator, + renderCell: (params) => ( +
+ {/* {formattedDate = date.toLocaleDateString()} */} + {getDateString(params.row.joinDate, 'dd/MM/yyyy')} +
+ ), + }, + // { + // id: 'lastname', + // field: 'lastname', + // headerName: 'Last Name', + // flex: 1.5, + // sortComparator: dateComparator, + // renderCell: (params) => ( + //
+ // {params.value} + //
+ // //
+ // // {getDateString(params.row.startDate,false)} + // //
+ // ), + // }, + // { + // id: 'firstname', + // field: 'firstname', + // headerName: 'First Name', + // // sortComparator: dateComparator, + // flex: 2, + // renderCell: (params) => ( + //
+ // {params.value} + //
+ // //
+ // // {getDateString(params.row.applicationDeadline,false)} + // //
+ // ), + // }, + { + id: 'email', + field: 'email', + headerName: 'Email', + flex: 1.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'phone1', + field: 'phone1', + headerName: 'Phone No.', + flex: 1, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'phone2', + field: 'phone2', + headerName: '2nd Phone No.', + flex: 1, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'remarks', + field: 'remarks', + headerName: 'Remarks', + flex: 3, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + + ]; + + return ( + 'auto'} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> + ); +} diff --git a/src/pages/client/ClientSearchPage/index.js b/src/pages/client/ClientSearchPage/index.js new file mode 100644 index 0000000..373b4f6 --- /dev/null +++ b/src/pages/client/ClientSearchPage/index.js @@ -0,0 +1,136 @@ +// material-ui +import { + Grid, Typography +} from '@mui/material'; +import MainCard from "../../../components/MainCard"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../../auth/utils"; +import { +// GET_DIVISION_FROM_SUB_DIVISION, + GET_CLIENT_PATH, +// GET_SEARCH_TEMPLATE_COMBO_PATH, +// GET_SEARCH_TEMPLATE_PATH +} from "../../../utils/ApiPathConst"; +import * as React from "react"; +import LoadingComponent from "../../extra-pages/LoadingComponent"; +import ClientTable from "./ClientTable"; +import ClientSearchForm from "./ClientSearchForm"; +import Qs from "qs"; +// import Autocomplete from "@mui/material/Autocomplete"; +import {isObjEmpty} from "../../../utils/Utils"; +import {isFormEmpty} from "../../../utils/CommonFunction"; +// import UploadContext from "../../components/UploadProvider"; +// import {useLocation} from "react-router-dom"; +// import dayjs from "dayjs"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ClientSearchPage = () => { + const [onReady, setOnReady] = useState(false); + const [expanded, setExpanded] = React.useState(true); + const [record,setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + + function getClientList() { + // const userSubDivision = queryParams.get('userSubDivision'); + // const year = queryParams.get('year'); + // const temp = { + // fromDate: year === null ? null : dayjs(year+"-01-01").format('YYYY-MM-DD'), + // toDate: year === null ? null : dayjs(year+"-12-31").format('YYYY-MM-DD'), + // divisionIdList: userSubDivision === "true" ? [userDivision.id] : null, + // }; + axios.get(`${apiPath}${GET_CLIENT_PATH}`, { + params: searchCriteria, + // params: isInit? temp : searchCriteria, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + } + ) + .then((response) => { + if (response.status === 200) { + if (!isFormEmpty(searchCriteria) && !isObjEmpty(response.data.records)) { + setExpanded(false); + } + setRecord(response.data.records); + setOnReady(true); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getClientList(); + }, [searchCriteria]); + + // useEffect(() => { + // if(isObjEmpty(searchCriteria)){ + // getClientList(); + // } + // console.log("1st"); + // }, []); + + function applySearch(input) { + console.log("SearchCriteria:") + console.log(input) + setSearchCriteria(input); + } + + return ( + + + + + + Search Client + + + + + {/* Search Form */} + + + + + {!onReady? : + // Client Table + + +
+ +
+
+
+ } +
+
+ + ); +}; + +export default ClientSearchPage; \ No newline at end of file diff --git a/src/pages/components-overview/AntIcons.js b/src/pages/components-overview/AntIcons.js new file mode 100644 index 0000000..2298d3e --- /dev/null +++ b/src/pages/components-overview/AntIcons.js @@ -0,0 +1,24 @@ +// material-ui +import { styled } from '@mui/material/styles'; + +// project import +import ComponentSkeleton from './ComponentSkeleton'; +import MainCard from 'components/MainCard'; + +// styles +const IFrameWrapper = styled('iframe')(() => ({ + height: 'calc(100vh - 210px)', + border: 'none' +})); + +// ============================|| ANT ICONS ||============================ // + +const AntIcons = () => ( + + + + + +); + +export default AntIcons; diff --git a/src/pages/components-overview/Color.js b/src/pages/components-overview/Color.js new file mode 100644 index 0000000..d64cc49 --- /dev/null +++ b/src/pages/components-overview/Color.js @@ -0,0 +1,141 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { Box, Card, Grid, Stack, Typography } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; +import ComponentSkeleton from './ComponentSkeleton'; + +// ===============================|| COLOR BOX ||=============================== // + +function ColorBox({ bgcolor, title, data, dark, main }) { + return ( + <> + + + {title && ( + + + {data && ( + + {data.label} + {data.color} + + )} + + + + {title} + + + + )} + + + + ); +} + +ColorBox.propTypes = { + bgcolor: PropTypes.string, + title: PropTypes.string, + data: PropTypes.object.isRequired, + dark: PropTypes.bool, + main: PropTypes.bool +}; + +// ===============================|| COMPONENT - COLOR ||=============================== // + +const ComponentColor = () => ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +); + +export default ComponentColor; diff --git a/src/pages/components-overview/ComponentSkeleton.js b/src/pages/components-overview/ComponentSkeleton.js new file mode 100644 index 0000000..ee370c6 --- /dev/null +++ b/src/pages/components-overview/ComponentSkeleton.js @@ -0,0 +1,59 @@ +import PropTypes from 'prop-types'; +import { useEffect, useState } from 'react'; + +// material-ui +import { Grid, Skeleton, Stack } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; + +// ===============================|| COMPONENT - SKELETON ||=============================== // + +const ComponentSkeleton = ({ children }) => { + const [isLoading, setLoading] = useState(true); + useEffect(() => { + setLoading(false); + }, []); + + const skeletonCard = ( + } + secondary={} + > + + + + + + + + ); + + return ( + <> + {isLoading && ( + + + {skeletonCard} + + + {skeletonCard} + + + {skeletonCard} + + + {skeletonCard} + + + )} + {!isLoading && children} + + ); +}; + +ComponentSkeleton.propTypes = { + children: PropTypes.node +}; + +export default ComponentSkeleton; diff --git a/src/pages/components-overview/Shadow.js b/src/pages/components-overview/Shadow.js new file mode 100644 index 0000000..5c15edf --- /dev/null +++ b/src/pages/components-overview/Shadow.js @@ -0,0 +1,152 @@ +import PropTypes from 'prop-types'; + +// material-ui +import { useTheme } from '@mui/material/styles'; +import { Grid, Stack, Typography } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; +import ComponentSkeleton from './ComponentSkeleton'; + +// ===============================|| SHADOW BOX ||=============================== // + +function ShadowBox({ shadow }) { + return ( + + + boxShadow + {shadow} + + + ); +} + +ShadowBox.propTypes = { + shadow: PropTypes.string.isRequired +}; + +// ===============================|| CUSTOM - SHADOW BOX ||=============================== // + +function CustomShadowBox({ shadow, label, color, bgcolor }) { + return ( + + + + {label} + + + + ); +} + +CustomShadowBox.propTypes = { + shadow: PropTypes.string.isRequired, + color: PropTypes.string.isRequired, + label: PropTypes.string.isRequired, + bgcolor: PropTypes.string +}; + +// ============================|| COMPONENT - SHADOW ||============================ // + +const ComponentShadow = () => { + const theme = useTheme(); + + return ( + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default ComponentShadow; diff --git a/src/pages/components-overview/Typography.js b/src/pages/components-overview/Typography.js new file mode 100644 index 0000000..868dfd1 --- /dev/null +++ b/src/pages/components-overview/Typography.js @@ -0,0 +1,252 @@ +// material-ui +import { Breadcrumbs, Divider, Grid, Link, Stack, Typography } from '@mui/material'; + +// project import +import ComponentSkeleton from './ComponentSkeleton'; +import MainCard from 'components/MainCard'; + +// ==============================|| COMPONENTS - TYPOGRAPHY ||============================== // + +const ComponentTypography = () => ( + + + + + + + Inter + Font Family + + Regular + Medium + Bold + + + + + + H1 Heading + + Size: 38px + Weight: Bold + Line Height: 46px + + + + H2 Heading + + Size: 30px + Weight: Bold + Line Height: 38px + + + + H3 Heading + + Size: 24px + Weight: Regular & Bold + Line Height: 32px + + + + H4 Heading + + Size: 20px + Weight: Bold + Line Height: 28px + + + + H5 Heading + + Size: 16px + Weight: Regular & Medium & Bold + Line Height: 24px + + + + H6 Heading / Subheading + + Size: 14px + Weight: Regular + Line Height: 22px + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 14px + Weight: Regular + Line Height: 22px + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 12px + Weight: Regular + Line Height: 20px + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 14px + Weight: Medium + Line Height: 22px + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 12px + Weight: Medium + Line Height: 20px + + + + + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 12px + Weight: Regular + Line Height: 20px + + + + + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 12px + Weight: Regular + Line Height: 20px + + + + + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 12px + Weight: Regular + Line Height: 20px + + + + + + www.mantis.com + + Size: 12px + Weight: Regular + Line Height: 20px + + + + + <> + + This is textPrimary text color. + + + This is textSecondary text color. + + + This is primary text color. + + + This is secondary text color. + + + This is success text color. + + + This is warning text color. + + + This is error text color. + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 14px + Weight: Regular + Line Height: 22px + + + + + <> + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. + + + Size: 14px + Weight: Italic Regular & Italic Bold + Line Height: 22px + + + + + + + +); + +export default ComponentTypography; diff --git a/src/pages/dashboard/IncomeAreaChart.js b/src/pages/dashboard/IncomeAreaChart.js new file mode 100644 index 0000000..124f98c --- /dev/null +++ b/src/pages/dashboard/IncomeAreaChart.js @@ -0,0 +1,121 @@ +import PropTypes from 'prop-types'; +import { useState, useEffect } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; + +// chart options +const areaChartOptions = { + chart: { + height: 450, + type: 'area', + toolbar: { + show: false + } + }, + dataLabels: { + enabled: false + }, + stroke: { + curve: 'smooth', + width: 2 + }, + grid: { + strokeDashArray: 0 + } +}; + +// ==============================|| INCOME AREA CHART ||============================== // + +const IncomeAreaChart = ({ slot }) => { + const theme = useTheme(); + + const { primary, secondary } = theme.palette.text; + const line = theme.palette.divider; + + const [options, setOptions] = useState(areaChartOptions); + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + colors: [theme.palette.primary.main, theme.palette.primary[700]], + xaxis: { + categories: + slot === 'month' + ? ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] + : ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], + labels: { + style: { + colors: [ + secondary, + secondary, + secondary, + secondary, + secondary, + secondary, + secondary, + secondary, + secondary, + secondary, + secondary, + secondary + ] + } + }, + axisBorder: { + show: true, + color: line + }, + tickAmount: slot === 'month' ? 11 : 7 + }, + yaxis: { + labels: { + style: { + colors: [secondary] + } + } + }, + grid: { + borderColor: line + }, + tooltip: { + theme: 'light' + } + })); + }, [primary, secondary, line, theme, slot]); + + const [series, setSeries] = useState([ + { + name: 'Page Views', + data: [0, 86, 28, 115, 48, 210, 136] + }, + { + name: 'Sessions', + data: [0, 43, 14, 56, 24, 105, 68] + } + ]); + + useEffect(() => { + setSeries([ + { + name: 'Page Views', + data: slot === 'month' ? [76, 85, 101, 98, 87, 105, 91, 114, 94, 86, 115, 35] : [31, 40, 28, 51, 42, 109, 100] + }, + { + name: 'Sessions', + data: slot === 'month' ? [110, 60, 150, 35, 60, 36, 26, 45, 65, 52, 53, 41] : [11, 32, 45, 32, 34, 52, 41] + } + ]); + }, [slot]); + + return ; +}; + +IncomeAreaChart.propTypes = { + slot: PropTypes.string +}; + +export default IncomeAreaChart; diff --git a/src/pages/dashboard/MonthlyBarChart.js b/src/pages/dashboard/MonthlyBarChart.js new file mode 100644 index 0000000..2f6d1e9 --- /dev/null +++ b/src/pages/dashboard/MonthlyBarChart.js @@ -0,0 +1,85 @@ +import { useEffect, useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; + +// chart options +const barChartOptions = { + chart: { + type: 'bar', + height: 365, + toolbar: { + show: false + } + }, + plotOptions: { + bar: { + columnWidth: '45%', + borderRadius: 4 + } + }, + dataLabels: { + enabled: false + }, + xaxis: { + categories: ['Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa', 'Su'], + axisBorder: { + show: false + }, + axisTicks: { + show: false + } + }, + yaxis: { + show: false + }, + grid: { + show: false + } +}; + +// ==============================|| MONTHLY BAR CHART ||============================== // + +const MonthlyBarChart = () => { + const theme = useTheme(); + + const { primary, secondary } = theme.palette.text; + const info = theme.palette.info.light; + + const [series] = useState([ + { + data: [80, 95, 70, 42, 65, 55, 78] + } + ]); + + const [options, setOptions] = useState(barChartOptions); + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + colors: [info], + xaxis: { + labels: { + style: { + colors: [secondary, secondary, secondary, secondary, secondary, secondary, secondary] + } + } + }, + tooltip: { + theme: 'light' + } + })); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [primary, info, secondary]); + + return ( +
+ +
+ ); +}; + +export default MonthlyBarChart; diff --git a/src/pages/dashboard/OrdersTable.js b/src/pages/dashboard/OrdersTable.js new file mode 100644 index 0000000..5f8867a --- /dev/null +++ b/src/pages/dashboard/OrdersTable.js @@ -0,0 +1,224 @@ +import PropTypes from 'prop-types'; +import { useState } from 'react'; +import { Link as RouterLink } from 'react-router-dom'; + +// material-ui +import { Box, Link, Stack, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Typography } from '@mui/material'; + +// third-party +import NumberFormat from 'react-number-format'; + +// project import +import Dot from 'components/@extended/Dot'; + +function createData(trackingNo, name, fat, carbs, protein) { + return { trackingNo, name, fat, carbs, protein }; +} + +const rows = [ + createData(84564564, 'Camera Lens', 40, 2, 40570), + createData(98764564, 'Laptop', 300, 0, 180139), + createData(98756325, 'Mobile', 355, 1, 90989), + createData(98652366, 'Handset', 50, 1, 10239), + createData(13286564, 'Computer Accessories', 100, 1, 83348), + createData(86739658, 'TV', 99, 0, 410780), + createData(13256498, 'Keyboard', 125, 2, 70999), + createData(98753263, 'Mouse', 89, 2, 10570), + createData(98753275, 'Desktop', 185, 1, 98063), + createData(98753291, 'Chair', 100, 0, 14001) +]; + +function descendingComparator(a, b, orderBy) { + if (b[orderBy] < a[orderBy]) { + return -1; + } + if (b[orderBy] > a[orderBy]) { + return 1; + } + return 0; +} + +function getComparator(order, orderBy) { + return order === 'desc' ? (a, b) => descendingComparator(a, b, orderBy) : (a, b) => -descendingComparator(a, b, orderBy); +} + +function stableSort(array, comparator) { + const stabilizedThis = array.map((el, index) => [el, index]); + stabilizedThis.sort((a, b) => { + const order = comparator(a[0], b[0]); + if (order !== 0) { + return order; + } + return a[1] - b[1]; + }); + return stabilizedThis.map((el) => el[0]); +} + +// ==============================|| ORDER TABLE - HEADER CELL ||============================== // + +const headCells = [ + { + id: 'trackingNo', + align: 'left', + disablePadding: false, + label: 'Tracking No.' + }, + { + id: 'name', + align: 'left', + disablePadding: true, + label: 'Product Name' + }, + { + id: 'fat', + align: 'right', + disablePadding: false, + label: 'Total Order' + }, + { + id: 'carbs', + align: 'left', + disablePadding: false, + + label: 'Status' + }, + { + id: 'protein', + align: 'right', + disablePadding: false, + label: 'Total Amount' + } +]; + +// ==============================|| ORDER TABLE - HEADER ||============================== // + +function OrderTableHead({ order, orderBy }) { + return ( + + + {headCells.map((headCell) => ( + + {headCell.label} + + ))} + + + ); +} + +OrderTableHead.propTypes = { + order: PropTypes.string, + orderBy: PropTypes.string +}; + +// ==============================|| ORDER TABLE - STATUS ||============================== // + +const OrderStatus = ({ status }) => { + let color; + let title; + + switch (status) { + case 0: + color = 'warning'; + title = 'Pending'; + break; + case 1: + color = 'success'; + title = 'Approved'; + break; + case 2: + color = 'error'; + title = 'Rejected'; + break; + default: + color = 'primary'; + title = 'None'; + } + + return ( + + + {title} + + ); +}; + +OrderStatus.propTypes = { + status: PropTypes.number +}; + +// ==============================|| ORDER TABLE ||============================== // + +export default function OrderTable() { + const [order] = useState('asc'); + const [orderBy] = useState('trackingNo'); + const [selected] = useState([]); + + const isSelected = (trackingNo) => selected.indexOf(trackingNo) !== -1; + + return ( + + + + + + {stableSort(rows, getComparator(order, orderBy)).map((row, index) => { + const isItemSelected = isSelected(row.trackingNo); + const labelId = `enhanced-table-checkbox-${index}`; + + return ( + + + + {row.trackingNo} + + + {row.name} + {row.fat} + + + + + + + + ); + })} + +
+
+
+ ); +} diff --git a/src/pages/dashboard/ReportAreaChart.js b/src/pages/dashboard/ReportAreaChart.js new file mode 100644 index 0000000..f7f1f40 --- /dev/null +++ b/src/pages/dashboard/ReportAreaChart.js @@ -0,0 +1,105 @@ +import { useEffect, useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; + +// chart options +const areaChartOptions = { + chart: { + height: 340, + type: 'line', + toolbar: { + show: false + } + }, + dataLabels: { + enabled: false + }, + stroke: { + curve: 'smooth', + width: 1.5 + }, + grid: { + strokeDashArray: 4 + }, + xaxis: { + type: 'datetime', + categories: [ + '2018-05-19T00:00:00.000Z', + '2018-06-19T00:00:00.000Z', + '2018-07-19T01:30:00.000Z', + '2018-08-19T02:30:00.000Z', + '2018-09-19T03:30:00.000Z', + '2018-10-19T04:30:00.000Z', + '2018-11-19T05:30:00.000Z', + '2018-12-19T06:30:00.000Z' + ], + labels: { + format: 'MMM' + }, + axisBorder: { + show: false + }, + axisTicks: { + show: false + } + }, + yaxis: { + show: false + }, + tooltip: { + x: { + format: 'MM' + } + } +}; + +// ==============================|| REPORT AREA CHART ||============================== // + +const ReportAreaChart = () => { + const theme = useTheme(); + + const { primary, secondary } = theme.palette.text; + const line = theme.palette.divider; + + const [options, setOptions] = useState(areaChartOptions); + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + colors: [theme.palette.warning.main], + xaxis: { + labels: { + style: { + colors: [secondary, secondary, secondary, secondary, secondary, secondary, secondary, secondary] + } + } + }, + grid: { + borderColor: line + }, + tooltip: { + theme: 'light' + }, + legend: { + labels: { + colors: 'grey.500' + } + } + })); + }, [primary, secondary, line, theme]); + + const [series] = useState([ + { + name: 'Series 1', + data: [58, 115, 28, 83, 63, 75, 35, 55] + } + ]); + + return ; +}; + +export default ReportAreaChart; diff --git a/src/pages/dashboard/SalesColumnChart.js b/src/pages/dashboard/SalesColumnChart.js new file mode 100644 index 0000000..d11c021 --- /dev/null +++ b/src/pages/dashboard/SalesColumnChart.js @@ -0,0 +1,148 @@ +import { useEffect, useState } from 'react'; + +// material-ui +import { useTheme } from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; + +// chart options +const columnChartOptions = { + chart: { + type: 'bar', + height: 430, + toolbar: { + show: false + } + }, + plotOptions: { + bar: { + columnWidth: '30%', + borderRadius: 4 + } + }, + dataLabels: { + enabled: false + }, + stroke: { + show: true, + width: 8, + colors: ['transparent'] + }, + xaxis: { + categories: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun'] + }, + yaxis: { + title: { + text: '$ (thousands)' + } + }, + fill: { + opacity: 1 + }, + tooltip: { + y: { + formatter(val) { + return `$ ${val} thousands`; + } + } + }, + legend: { + show: true, + fontFamily: `'Public Sans', sans-serif`, + offsetX: 10, + offsetY: 10, + labels: { + useSeriesColors: false + }, + markers: { + width: 16, + height: 16, + radius: '50%', + offsexX: 2, + offsexY: 2 + }, + itemMargin: { + horizontal: 15, + vertical: 50 + } + }, + responsive: [ + { + breakpoint: 600, + options: { + yaxis: { + show: false + } + } + } + ] +}; + +// ==============================|| SALES COLUMN CHART ||============================== // + +const SalesColumnChart = () => { + const theme = useTheme(); + + const { primary, secondary } = theme.palette.text; + const line = theme.palette.divider; + + const warning = theme.palette.warning.main; + const primaryMain = theme.palette.primary.main; + const successDark = theme.palette.success.dark; + + const [series] = useState([ + { + name: 'Net Profit', + data: [180, 90, 135, 114, 120, 145] + }, + { + name: 'Revenue', + data: [120, 45, 78, 150, 168, 99] + } + ]); + + const [options, setOptions] = useState(columnChartOptions); + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + colors: [warning, primaryMain], + xaxis: { + labels: { + style: { + colors: [secondary, secondary, secondary, secondary, secondary, secondary] + } + } + }, + yaxis: { + labels: { + style: { + colors: [secondary] + } + } + }, + grid: { + borderColor: line + }, + tooltip: { + theme: 'light' + }, + legend: { + position: 'top', + horizontalAlign: 'right', + labels: { + colors: 'grey.500' + } + } + })); + }, [primary, secondary, line, warning, primaryMain, successDark]); + + return ( +
+ +
+ ); +}; + +export default SalesColumnChart; \ No newline at end of file diff --git a/src/pages/dashboard/index.js b/src/pages/dashboard/index.js new file mode 100644 index 0000000..e3dfd00 --- /dev/null +++ b/src/pages/dashboard/index.js @@ -0,0 +1,344 @@ +import { useState } from 'react'; + +// material-ui +import { + Avatar, + AvatarGroup, + Box, + Button, + Grid, + List, + ListItemAvatar, + ListItemButton, + ListItemSecondaryAction, + ListItemText, + MenuItem, + Stack, + TextField, + Typography +} from '@mui/material'; + +// project import +import OrdersTable from './OrdersTable'; +import IncomeAreaChart from './IncomeAreaChart'; +import MonthlyBarChart from './MonthlyBarChart'; +import ReportAreaChart from './ReportAreaChart'; +import SalesColumnChart from './SalesColumnChart'; +import MainCard from 'components/MainCard'; +import AnalyticEcommerce from 'components/cards/statistics/AnalyticEcommerce'; + +// assets +import { GiftOutlined, MessageOutlined, SettingOutlined } from '@ant-design/icons'; +import avatar1 from 'assets/images/users/avatar-1.png'; +import avatar2 from 'assets/images/users/avatar-2.png'; +import avatar3 from 'assets/images/users/avatar-3.png'; +import avatar4 from 'assets/images/users/avatar-4.png'; + +// avatar style +const avatarSX = { + width: 36, + height: 36, + fontSize: '1rem' +}; + +// action style +const actionSX = { + mt: 0.75, + ml: 1, + top: 'auto', + right: 'auto', + alignSelf: 'flex-start', + transform: 'none' +}; + +// sales report status +const status = [ + { + value: 'today', + label: 'Today' + }, + { + value: 'month', + label: 'This Month' + }, + { + value: 'year', + label: 'This Year' + } +]; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const DashboardDefault = () => { + const [value, setValue] = useState('today'); + const [slot, setSlot] = useState('week'); + + return ( + + {/* row 1 */} + + Event Overall Status + + + + + + + + + + + + + + + + + {/* row 2 */} + + + + Application + + + + + + + + + + + + + + + + + + Income Overview + + + + + + + + This Week Statistics + + $7,650 + + + + + + + {/* row 3 */} + + + + Recent Orders + + + + + + + + + + + Analytics Report + + + + + + + + +45.14% + + + + 0.58% + + + + Low + + + + + + + {/* row 4 */} + + + + Sales Report + + + setValue(e.target.value)} + sx={{ '& .MuiInputBase-input': { py: 0.5, fontSize: '0.875rem' } }} + > + {status.map((option) => ( + + {option.label} + + ))} + + + + + + + Net Profit + + $1560 + + + + + + + + Transaction History + + + + + + + + + + + + Order #002434} secondary="Today, 2:00 AM" /> + + + + + $1,430 + + + 78% + + + + + + + + + + + Order #984947} secondary="5 August, 1:45 PM" /> + + + + + $302 + + + 8% + + + + + + + + + + + Order #988784} secondary="7 hours ago" /> + + + + + $682 + + + 16% + + + + + + + + + + + + + Help & Support Chat + + + Typical replay within 5 min + + + + + + + + + + + + + + + + + + ); +}; + +export default DashboardDefault; diff --git a/src/pages/extra-pages/ErrorPage.js b/src/pages/extra-pages/ErrorPage.js new file mode 100644 index 0000000..96b14a1 --- /dev/null +++ b/src/pages/extra-pages/ErrorPage.js @@ -0,0 +1,46 @@ +import { + ButtonBase +} from '@mui/material' +import { useNavigate } from "react-router-dom"; +import MainCard from 'components/MainCard'; + +//import errorImg from '@src/assets/images/pages/error.svg' + +const ErrorPage = () => { + let navigate = useNavigate(); + const handleToHomePage = () =>{ + let path = `/`; + navigate(path); + } + + return ( + +
+ +

LIONER

+
+
+
+

Page Not Found 🕵🏻‍♀️

+

Oops! 😖 The requested URL was not found on this server.

+ + Back to home + + {/*Not authorized page*/} +
+
+
+ + ) +} +export default ErrorPage; diff --git a/src/pages/extra-pages/LoadingComponent.js b/src/pages/extra-pages/LoadingComponent.js new file mode 100644 index 0000000..e0d1457 --- /dev/null +++ b/src/pages/extra-pages/LoadingComponent.js @@ -0,0 +1,17 @@ +import {Box, CircularProgress, Grid} from "@mui/material"; + +const LoadingComponent = () => { + return ( + + + + + + ) +} +export default LoadingComponent; diff --git a/src/pages/extra-pages/LogoutPage.js b/src/pages/extra-pages/LogoutPage.js new file mode 100644 index 0000000..c920f24 --- /dev/null +++ b/src/pages/extra-pages/LogoutPage.js @@ -0,0 +1,27 @@ +// material-ui +import { + Grid +} from '@mui/material'; +import {useEffect} from "react"; +import {handleLogoutFunction} from "../../auth"; +import {useDispatch} from "react-redux"; +import {useNavigate} from "react-router-dom"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const LogoutPage = () => { + const dispatch = useDispatch() + const navigate = useNavigate() + + useEffect(async () => { + await dispatch(handleLogoutFunction()); + await navigate('/login'); + },[]) + + return ( + + + ); +}; + +export default LogoutPage; diff --git a/src/pages/extra-pages/SamplePage.js b/src/pages/extra-pages/SamplePage.js new file mode 100644 index 0000000..5ed2c60 --- /dev/null +++ b/src/pages/extra-pages/SamplePage.js @@ -0,0 +1,20 @@ +// material-ui +import { Typography } from '@mui/material'; + +// project import +import MainCard from 'components/MainCard'; + +// ==============================|| SAMPLE PAGE ||============================== // + +const SamplePage = () => ( + + + Lorem ipsum dolor sit amen, consenter nipissing eli, sed do elusion tempos incident ut laborers et doolie magna alissa. Ut enif ad + minim venice, quin nostrum exercitation illampu laborings nisi ut liquid ex ea commons construal. Duos aube grue dolor in reprehended + in voltage veil esse colum doolie eu fujian bulla parian. Exceptive sin ocean cuspidate non president, sunk in culpa qui officiate + descent molls anim id est labours. + + +); + +export default SamplePage; diff --git a/src/pages/extra-pages/TabTestPage.js b/src/pages/extra-pages/TabTestPage.js new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/lionerAdvanceSearchPage/AdvanceSearchForm.js b/src/pages/lionerAdvanceSearchPage/AdvanceSearchForm.js new file mode 100644 index 0000000..b5e319a --- /dev/null +++ b/src/pages/lionerAdvanceSearchPage/AdvanceSearchForm.js @@ -0,0 +1,141 @@ +// material-ui +import { + Button, + CardContent, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import Autocomplete from "@mui/material/Autocomplete"; +import {MODULE_COMBO} from "../../utils/ComboConst"; +import {useEffect, useState} from "react"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AdvanceSearchForm = ({applySearch, selectedModule, + reset,register,handleSubmit}) => { + + const [locSelectedModule, setLocSelectedModule] = useState(null); + const [errors, setErrors] = useState({}); + + const onSubmit = (data) => { + + const formErrors = {}; + + if (!data.keyword) { + formErrors.keyword = 'Please input keywords.'; + } + + if (locSelectedModule == null){ + formErrors.module = 'Module is required.'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + applySearch(data,locSelectedModule); + } + }; + + useEffect(() => { + //console.log("from top bar"); + setLocSelectedModule(selectedModule); + }, [selectedModule]); + + + function resetForm(){ + setLocSelectedModule(null); + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + + + {/*row 2*/} + + + Keyword + + + + + Module + { + setLocSelectedModule(newValue); + }} + renderInput={(params) => } + /> + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + +
+
+ ); +}; + +export default AdvanceSearchForm; diff --git a/src/pages/lionerAdvanceSearchPage/index.js b/src/pages/lionerAdvanceSearchPage/index.js new file mode 100644 index 0000000..a4c5231 --- /dev/null +++ b/src/pages/lionerAdvanceSearchPage/index.js @@ -0,0 +1,218 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import AdvanceSearchForm from "./AdvanceSearchForm"; +import {useContext, useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_APPLICATION_PATH, GET_AWARD_PATH, GET_EVENT_PATH} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; +import EventTable from "../lionerEventSearchPage/EventTable"; +import ApplicationTable from "../lionerApplicationSearchPage/ApplicationTable"; +import AwardTable from "../lionerAwardSearchPage/AwardTable"; +import {useParams} from "react-router-dom"; +import {getComboValueByLabel} from "../../utils/CommonFunction"; +import {useForm} from "react-hook-form"; +import {MODULE_COMBO} from "../../utils/ComboConst"; +import {isObjEmpty} from "../../utils/Utils"; +import AbilityContext from "../../components/AbilityProvider"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const DivisionSearchPanel = () => { + const ability = useContext(AbilityContext); + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + const [selectedModule, setSelectedModule] = useState(null); + const params = useParams(); + const { reset, register, handleSubmit, setValue } = useForm() + + useEffect(() => { + setValue('keyword', params.keyword ); + setSelectedModule(getComboValueByLabel(MODULE_COMBO,params.module)); + setSearchCriteria({ + keyword: params.keyword, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + }); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + if(selectedModule != null && !isObjEmpty(searchCriteria)){ + getRecordList(); + } + }, [searchCriteria,selectedModule]); + + + function getRecordList() { + if(selectedModule !== null){ + switch (selectedModule.key){ + case 1: + getEventList(); + break; + case 2: + getApplicationList(); + break; + case 3: + getAwardList(); + break; + default: + getEventList(); + break; + } + } + else{ + getEventList(); + } + } + + function getEventList(){ + axios.get(`${apiPath}${GET_EVENT_PATH}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getApplicationList(){ + axios.get(`${apiPath}${GET_APPLICATION_PATH}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getAwardList(){ + axios.get(`${apiPath}${GET_AWARD_PATH}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + const renderByModule = () => { + if(selectedModule !== null){ + switch (selectedModule.key){ + case 1: + return + case 2: + return + case 3: + return + default: + return + } + } + else{ + return + } + } + + function applySearch(input,selectedModule) { + setSearchCriteria( + { + ...input, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + }); + setSelectedModule(selectedModule); + + } + + return ( + !onReady ? + + : + + + + + + Advsssance Search + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + +
+ + {renderByModule()} + +
+
+ + +
+
+
+ +
+ + ); +}; + +export default DivisionSearchPanel; diff --git a/src/pages/lionerApplicationSearchPage/ApplicationSearchForm.js b/src/pages/lionerApplicationSearchPage/ApplicationSearchForm.js new file mode 100644 index 0000000..3d848be --- /dev/null +++ b/src/pages/lionerApplicationSearchPage/ApplicationSearchForm.js @@ -0,0 +1,644 @@ +// material-ui +import { + Button, + Typography, + Grid, InputLabel, TextField, CardActions, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; + +import {useContext, useEffect, useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import * as React from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import { + GET_APPLICATION_EXPORT, + GET_DIVISION_COMBO_LIST, GET_EVENT_COMBO_PATH, GET_LDAP_USER_LIST, + GET_SUB_DIVISION_COMBO_LIST, + GET_TAG_COMBO_LIST, POST_SEARCH_TEMPLATE_PATH, VALIDATE_TEMPLATE_NAME_PATH +} from "../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import { + convertXmlToObject, + GeneralComboWindow, GeneralCreateTemplateWindow, + getComboValueByIdList, getComboValueByLabel, + getIdList, isOptionEqualToValue, notifySaveSuccess, +} from "../../utils/CommonFunction"; +import Qs from 'qs'; +import {useNavigate} from "react-router"; +import {ThemeProvider} from "@emotion/react"; +import {isObjEmpty} from "../../utils/Utils"; +import UploadContext from "../../components/UploadProvider"; +import {APPLICATION_STATUS_COMBO} from "../../utils/ComboConst"; +import {parseString} from "xml2js"; +import AbilityContext from "../../components/AbilityProvider"; +import Collapse from '@mui/material/Collapse'; +import {ExpandMore} from "@mui/icons-material"; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ApplicationSearchForm = ({refTemplateData, applySearch, isUpdating, + setIsUpdating,getTemplateList,setExpanded,expanded}) => { + + const navigate = useNavigate() + const ability = useContext(AbilityContext); + const { setIsUploading } = useContext(UploadContext); + const handleExpandClick = () => { + setExpanded(!expanded); + }; + + const [selectedTag, setSelectedTag] = useState([]); + const [selectedStatus, setSelectedStatus] = useState(null); + const [selectedOfficer, setSelectedOfficer] = useState(null); + const [selectedSubDivisions, setSelectedSubDivisions] = useState([]); + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [selectedEvenet, setSelectedEvent] = useState(null); + + const [tagList, setTagList] = useState([]); + const [subDivisionList, setSubDivisionList] = useState([]); + const [divisionList, setDivisionList] = useState([]); + + const [userEventComboList, setUserEventComboList] = useState([]); + const { setValue, reset, register, handleSubmit, getValues } = useForm() + + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const handleLocationCodeChange = (event, value) => { + setSelectedOfficer({ + label: value, + }); + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + // Function to fetch user name options based on locationCode + const fetchLotusUserList = async (input) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + // if(!isObjEmpty(refApplication) && isUpdating){ + // setSelectedOfficer( + // getComboValueByLabel(convertXmlToObject(result.RECORDS.RECORD), + // refApplication.selectedOfficer)); + // } + setLotusNoteUserList(convertXmlToObject(result.RECORDS.RECORD)); + }); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + //=====TEMPLATE RELATED START=====// + const [refApplication, setRefApplication] = useState(null); + + useEffect(() => { + setRefApplication(refTemplateData); + }, [refTemplateData]); + + useEffect(() => { + if(!isObjEmpty(refApplication)){ + if(refApplication.selectedOfficer !== null){ + //const locationCode = .split('(')[1].replace(')',''); + fetchLotusUserList(refApplication.selectedOfficer); + } + else{ + setSelectedOfficer(null); + } + setValue('eventName', refApplication.eventName ); + setValue('applicationName', refApplication.applicationName ); + setValue('description', refApplication.description ); + setSelectedTag(getComboValueByIdList(tagList,refApplication.selectedTag)); + setSelectedDivisions(getComboValueByIdList(divisionList,refApplication.selectedDivisions)); + setSelectedSubDivisions(getComboValueByIdList(subDivisionList,refApplication.selectedSubDivisions)); + setSelectedOfficer(refApplication.selectedOfficer); + setSelectedStatus(getComboValueByLabel(APPLICATION_STATUS_COMBO,refApplication.selectedStatus)); + } + else{ + resetForm(); + } + }, [refApplication]); + + useEffect(() => { + setRefApplication(refTemplateData); + }, [subDivisionList]); + //=====TEMPLATE RELATED END=====// + +// ==============================|| NEW WINDOW RELATED START||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const handleClose = () => { + setIsWindowOpen(false); + }; + + function updateData(){ + setIsWindowOpen(false); + navigate(`/application/maintain/-1/${selectedEvenet.id}`); + } + + const createNewApplication = () => { + setIsWindowOpen(true); + }; +// ==============================|| NEW WINDOW RELATED END||============================== // + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + const [isTempWindowOpen, setIsTempWindowOpen] = React.useState(false); + const [templateName, setTemplateName] = React.useState(false); + + const handleTempClose = () => { + setIsTempWindowOpen(false); + }; + + function uploadTemplate(){ + setIsTempWindowOpen(false); + setIsUploading(true); + const userData = getUserData(); + const data = getValues(); + const temp = { + eventName: data.eventName, + applicationName: data.applicationName, + description: data.description, + selectedStatus: selectedStatus === null ? null :selectedStatus.label, + selectedOfficer: selectedOfficer ? null : selectedOfficer.label, + selectedTag: getIdList(selectedTag), + selectedDivisions: getIdList(selectedDivisions), + selectedSubDivisions: getIdList(selectedSubDivisions), + }; + + let templateSet={ + id: -1, + userId: userData.id, + name: templateName.trim(), + module: "Application", + criteria: JSON.stringify(temp), + } + axios.post(`${apiPath}${POST_SEARCH_TEMPLATE_PATH}`, + templateSet, + ) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + getTemplateList(); + notifySaveSuccess(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + const createNewTemplate = () => { + setIsTempWindowOpen(true); + }; + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + + const onSubmit = (data) => { + const temp = { + eventName: data.eventName, + applicationName: data.applicationName, + description: data.description, + status: selectedStatus === null ? null :selectedStatus.label, + officer: isObjEmpty(selectedOfficer) ? null : selectedOfficer.label, + tagList: getIdList(selectedTag), + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + }; + applySearch(temp); + setExpanded(false); + }; + + function onExport(){ + const data = getValues(); + const temp = { + eventName: data.eventName, + applicationName: data.applicationName, + description: data.description, + status: selectedStatus === null ? null :selectedStatus.label, + officer: isObjEmpty(selectedOfficer) ? null : selectedOfficer.label, + tagList: getIdList(selectedTag), + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + }; + setIsUploading(true); + axios.get(`${apiPath}${GET_APPLICATION_EXPORT}`,{ + responseType: 'blob', + params: temp, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", "application_export_"+ Date.now() + ".xlsx"); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + function getSubDivisionCombo(divisionIds){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + { + params: { + "divisionIds": divisionIds + }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + if(!isObjEmpty(refApplication) && isUpdating){ + setSelectedSubDivisions(getComboValueByIdList(response.data.records,refApplication.selectedSubDivisions)); + setIsUpdating(false); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getDivisionCombo(){ + axios.get(`${apiPath}${GET_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getTagCombo(){ + axios.get(`${apiPath}${GET_TAG_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setTagList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getUserEventCombo(){ + axios.get(`${apiPath}${GET_EVENT_COMBO_PATH}`,{ + params:{ + userSubDivisionId: ability.can('EDIT','ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + }) + .then((response) => { + if (response.status === 200) { + setUserEventComboList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getTagCombo(); + getUserEventCombo(); + getDivisionCombo(); + getSubDivisionCombo(null); + }, []); + + // useEffect(() => { + // if(selectedDivisions !== null && selectedDivisions !== undefined){ + // const temp = selectedDivisions.length > 0 ? getIdList(selectedDivisions) : []; + // //const idList = castListToString(temp); + // getSubDivisionCombo(temp); + // } + // if(selectedDivisions.length <=0){ + // setSelectedSubDivisions([]); + // } + // }, [selectedDivisions]); + // + // useEffect(() => { + // removeInvalidSubDivision(getIdList(selectedDivisions)); + // }, [subDivisionList]); + // + // function removeInvalidSubDivision (divisionIdList){ + // let temp = selectedSubDivisions; + // let output = []; + // for(let i=0 ; i + + + {/*row 1*/} + + + Search Criteria(s) + + + + + + + + + + +
+ {/*row 2*/} + + + Event Name + + + + + Application Name + + + + + Application Description + + + + + Tag + { + setSelectedTag(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Division + { + setSelectedDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Sub-Division + { + setSelectedSubDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Responsible Officer + { + setSelectedOfficer(newValue); + // if(lotusNoteUserList.length >0){ + // if(newValue !== null){ + // if(getComboValueByLabel(lotusNoteUserList, newValue.label) !== null){ + // setSelectedOfficer(newValue); + // } + // } + // else{ + // setSelectedOfficer(null); + // } + // } + }} + renderInput={(params) => } + /> + + + + Status + { + setSelectedStatus(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + ability.can('EDIT','APPLICATION') ? + + + + + + + : + + } + + + + +
+
+ + ); +}; + +export default ApplicationSearchForm; diff --git a/src/pages/lionerApplicationSearchPage/ApplicationTable.js b/src/pages/lionerApplicationSearchPage/ApplicationTable.js new file mode 100644 index 0000000..b8c55eb --- /dev/null +++ b/src/pages/lionerApplicationSearchPage/ApplicationTable.js @@ -0,0 +1,117 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function ApplicationTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + + const navigate = useNavigate() + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + + const handleEditClick = (id) => () => { + navigate('/application/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + + ] + }, + }, + { + id: 'eventName', + field: 'eventName', + headerName: 'Event Name', + flex: 1.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'applicationName', + field: 'applicationName', + headerName: 'Application', + flex: 1.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'status', + field: 'status', + headerName: 'Status', + flex: 0.5, + }, + { + id: 'responsibleOfficer', + field: 'responsibleOfficer', + headerName: 'Responsible Officer', + flex: 0.75, + }, + ]; + + return ( + 'auto'} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> + ); +} diff --git a/src/pages/lionerApplicationSearchPage/index.js b/src/pages/lionerApplicationSearchPage/index.js new file mode 100644 index 0000000..22ea869 --- /dev/null +++ b/src/pages/lionerApplicationSearchPage/index.js @@ -0,0 +1,199 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useContext, useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import {GET_APPLICATION_PATH, GET_SEARCH_TEMPLATE_COMBO_PATH, GET_SEARCH_TEMPLATE_PATH} from "../../utils/ApiPathConst"; +import * as React from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import ApplicationTable from "./ApplicationTable"; +import ApplicationSearchForm from "./ApplicationSearchForm"; +import Qs from "qs"; +import Autocomplete from "@mui/material/Autocomplete"; +import UploadContext from "../../components/UploadProvider"; +import {isObjEmpty} from "../../utils/Utils"; +import {notifyLoadSuccess} from "../../utils/CommonFunction"; +import AbilityContext from "../../components/AbilityProvider"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ApplicationSearchPage = () => { + + const [record,setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + const ability = useContext(AbilityContext); + const [expanded, setExpanded] = React.useState(true); + + useEffect(() => { + getApplicationList(); + getTemplateList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getApplicationList(); + }, [searchCriteria]); + + //=====TEMPLATE RELATED START=====// + const { setIsUploading } = useContext(UploadContext); + const [selectedTemplate, setSelectedTemplate] = useState(null); + const [searchTemplateList, setSearchTemplateList] = useState([]); + const [refTemplateData, setRefTemplateData] = useState(null); + const [isUpdating, setIsUpdating] = useState(false); + + function getTemplateList(){ + const userData = getUserData(); + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_COMBO_PATH}`, { + params: { + "module": "Application", + "userId": userData.id + }, + } + ) + .then((response) => { + if (response.status === 200) { + setSearchTemplateList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + if(!isObjEmpty(selectedTemplate)){ + getTemplateDetail(); + } + else{ + setRefTemplateData(null); + } + }, [selectedTemplate]); + + function getTemplateDetail(){ + setIsUploading(true); + setIsUpdating(true); + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_PATH}/${selectedTemplate.id}`) + .then((response) => { + if (response.status === 200) { + setRefTemplateData(JSON.parse(response.data.data.criteria)); + setIsUploading(false); + notifyLoadSuccess(); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + //=====TEMPLATE RELATED END=====// + + function getApplicationList(){ + const byDivision = { + ...searchCriteria, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + axios.get(`${apiPath}${GET_APPLICATION_PATH}`, { + params: byDivision, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + } + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + Search Application + + + + + Search Template: + + + { + setSelectedTemplate(newValue); + }} + renderInput={(params) => } + /> + + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + +
+ +
+
+
+
+
+ + ); +}; + +export default ApplicationSearchPage; diff --git a/src/pages/lionerAppreciationSearchPage/AppreciationSearchForm.js b/src/pages/lionerAppreciationSearchPage/AppreciationSearchForm.js new file mode 100644 index 0000000..c4b4290 --- /dev/null +++ b/src/pages/lionerAppreciationSearchPage/AppreciationSearchForm.js @@ -0,0 +1,769 @@ +// material-ui +import { + Button, + Typography, + Grid, InputLabel, TextField, CardActions, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; + +import {useContext, useEffect, useRef, useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_APPRECIATION_CATEGORY_COMBO_LIST, + GET_APPRECIATION_EXPORT, + GET_APPRECIATION_IMPORT_TEMPLATE, + GET_SBU_DIVISION_COMBO_LIST, + POST_APPRECIATION_IMPORT, +} from "../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, LIONER_MEDIUM_BUTTON_THEME} from "../../themes/colorConst"; +import { + getIdList, isOptionEqualToValue, notifyDeleteError +} from "../../utils/CommonFunction"; +import Qs from 'qs'; +import {useNavigate} from "react-router"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../components/UploadProvider"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import AbilityContext from "../../components/AbilityProvider"; +import Collapse from '@mui/material/Collapse'; +import {ExpandMore} from "@mui/icons-material"; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ImportResultWindow} from "./ImportResultWindow"; +import {isObjEmpty} from "../../utils/Utils"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AppreciationSearchForm = ({applySearch, setExpanded,expanded}) => { + + const navigate = useNavigate() + const ability = useContext(AbilityContext); + const { setIsUploading } = useContext(UploadContext); + const handleExpandClick = () => { + setExpanded(!expanded); + }; + + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [selectedCategories, setSelectedCategories] = useState([]); + const [categoryList, setCategoryList] = useState([]); + const [sbuDivisionList, setSBUDivisionList] = useState([]); + const [recordCount, setRecordCount] = useState(0); + const [importErrorList, setImportErrorList] = useState([]); + const [importStatus, setImportStatus] = useState(0); + + const { reset, register, handleSubmit, getValues } = useForm() + + const [receiptDateFrom, setReceiptDateFrom] = useState(null); + const [receiptDateTo, setReceiptDateTo] = useState(null); + const [receiptFromError, setReceiptFromError] = React.useState(null); + const [receiptToError, setReceiptToError] = React.useState(null); + const receiptFromErrorMessage = React.useMemo(() => { + switch (receiptFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [receiptFromError]); + const receiptToErrorMessage = React.useMemo(() => { + switch (receiptToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [receiptToError]); + + const [lnReceiptDateFrom, setLNReceiptDateFrom] = useState(null); + const [lnReceiptDateTo, setLNReceiptDateTo] = useState(null); + const [lnReceiptDateFromError, setLNReceiptDateFromError] = React.useState(null); + const [lnReceiptDateToError, setLNReceiptDateToError] = React.useState(null); + const lnReceiptDateFromErrorMessage = React.useMemo(() => { + switch (lnReceiptDateFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [lnReceiptDateFromError]); + const lnReceiptDateToErrorMessage = React.useMemo(() => { + switch (lnReceiptDateToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [lnReceiptDateToError]); + + const [clientReplyDateFrom, setClientReplyDateFrom] = useState(null); + const [clientReplyDateTo, setClientReplyDateTo] = useState(null); + const [clientReplyDateFromError, setClientReplyDateFromError] = React.useState(null); + const [clientReplyDateToError, setClientReplyDateToError] = React.useState(null); + const clientReplyDateFromErrorMessage = React.useMemo(() => { + switch (clientReplyDateFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [clientReplyDateFromError]); + const clientReplyDateToErrorMessage = React.useMemo(() => { + switch (clientReplyDateToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [clientReplyDateToError]); + + const [staffReplyDateFrom, setStaffReplyDateFrom] = useState(null); + const [staffReplyDateTo, setStaffReplyDateTo] = useState(null); + const [staffReplyDateFromError, setStaffReplyDateFromError] = React.useState(null); + const [staffReplyDateToError, setStaffReplyDateToError] = React.useState(null); + const staffReplyDateFromErrorMessage = React.useMemo(() => { + switch (staffReplyDateFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [staffReplyDateFromError]); + const staffReplyDateToErrorMessage = React.useMemo(() => { + switch (staffReplyDateToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [staffReplyDateToError]); + + // ==============================|| IMPORT TEMPLATE WINDOW RELATED ||============================== // + const fileInputRef = useRef(null); + + const handleFileInputChange = (event) => { + setIsUploading(true); + const selectedFile = event.target.files[0]; + if (selectedFile.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { + const formData = new FormData(); + formData.append('files', selectedFile); + axios.post(`${apiPath}${POST_APPRECIATION_IMPORT}`, + formData, + { + headers: { + 'Content-Type': 'multipart/form-data', + } + } + ) + .then((response) => { + if (response.status === 200) { + setRecordCount(response.data.data.recordCount); + setImportErrorList(response.data.data.recordList); + setImportStatus(response.data.data.status); + displayImportResult(); + } + setIsUploading(false); + fileInputRef.current.value = ''; + }) + .catch((error) => { + setIsUploading(false); + notifyDeleteError('Server busy, please try again later.'); + console.log(error); + return false; + }); + } else { + // Handle case when selected file is not an Excel file + setIsUploading(false); + fileInputRef.current.value = ''; + // Show an error message to the user + alert('Please select an Excel xlsx file.'); + } + + }; + + const handleImportTemplateClick = () => { + fileInputRef.current.click(); + }; + + const [isResultWindowOpen, setIsResultWindowOpen] = React.useState(false); + + const handleWindowClose = (event, reason) => { + if (reason && reason === "backdropClick") + return; + setIsResultWindowOpen(false); + }; + + const handleReload = () =>{ + setIsResultWindowOpen(false); + const data = getValues(); + const temp = { + sbuIds: isObjEmpty(getIdList(selectedDivisions)) ? null : "[" + getIdList(selectedDivisions).toString() + "]" , + categoryIds: getIdList(selectedCategories), + clientDepOrOrg: data.department, + clientName: data.clientName, + receiptDateFrom: receiptDateFrom === null ? null : dayjs(receiptDateFrom).format('YYYY-MM-DD'), + receiptDateTo: receiptDateTo === null ? null : dayjs(receiptDateTo).format('YYYY-MM-DD'), + lnReceiptDateFrom: lnReceiptDateFrom === null ? null : dayjs(lnReceiptDateFrom).format('YYYY-MM-DD'), + lnReceiptDateTo: lnReceiptDateTo === null ? null : dayjs(lnReceiptDateTo).format('YYYY-MM-DD'), + clientReplyDateFrom: clientReplyDateFrom === null ? null : dayjs(clientReplyDateFrom).format('YYYY-MM-DD'), + clientReplyDateTo: clientReplyDateTo === null ? null : dayjs(clientReplyDateTo).format('YYYY-MM-DD'), + staffReplyDateFrom: staffReplyDateFrom === null ? null : dayjs(staffReplyDateFrom).format('YYYY-MM-DD'), + staffReplyDateTo: staffReplyDateTo === null ? null : dayjs(staffReplyDateTo).format('YYYY-MM-DD'), + }; + + applySearch(temp); + } + + function displayImportResult(){ + setIsResultWindowOpen(true); + } + +// ==============================|| IMPORT TEMPLATE WINDOW RELATED ||============================== // + + + function downloadTemplate(){ + axios.get(`${apiPath}${GET_APPRECIATION_IMPORT_TEMPLATE}`,{ + responseType: 'blob', + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", response.headers.filename); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + function newAppreciation(){ + navigate(`/appreciation/maintain/-1`); + } + + + const onSubmit = (data) => { + const temp = { + sbuIds: isObjEmpty(getIdList(selectedDivisions)) ? null : "[" + getIdList(selectedDivisions).toString() + "]" , + categoryIds: getIdList(selectedCategories), + clientDepOrOrg: data.department, + clientName: data.clientName, + receiptDateFrom: receiptDateFrom === null ? null : dayjs(receiptDateFrom).format('YYYY-MM-DD'), + receiptDateTo: receiptDateTo === null ? null : dayjs(receiptDateTo).format('YYYY-MM-DD'), + lnReceiptDateFrom: lnReceiptDateFrom === null ? null : dayjs(lnReceiptDateFrom).format('YYYY-MM-DD'), + lnReceiptDateTo: lnReceiptDateTo === null ? null : dayjs(lnReceiptDateTo).format('YYYY-MM-DD'), + clientReplyDateFrom: clientReplyDateFrom === null ? null : dayjs(clientReplyDateFrom).format('YYYY-MM-DD'), + clientReplyDateTo: clientReplyDateTo === null ? null : dayjs(clientReplyDateTo).format('YYYY-MM-DD'), + staffReplyDateFrom: staffReplyDateFrom === null ? null : dayjs(staffReplyDateFrom).format('YYYY-MM-DD'), + staffReplyDateTo: staffReplyDateTo === null ? null : dayjs(staffReplyDateTo).format('YYYY-MM-DD'), + }; + applySearch(temp); + setExpanded(false); + }; + + function onExport(){ + const data = getValues(); + const temp = { + sbuIds: isObjEmpty(getIdList(selectedDivisions)) ? null : "[" + getIdList(selectedDivisions).toString() + "]" , + categoryIds: getIdList(selectedCategories), + clientDepOrOrg: data.department, + clientName: data.clientName, + receiptDateFrom: receiptDateFrom === null ? null : dayjs(receiptDateFrom).format('YYYY-MM-DD'), + receiptDateTo: receiptDateTo === null ? null : dayjs(receiptDateTo).format('YYYY-MM-DD'), + lnReceiptDateFrom: lnReceiptDateFrom === null ? null : dayjs(lnReceiptDateFrom).format('YYYY-MM-DD'), + lnReceiptDateTo: lnReceiptDateTo === null ? null : dayjs(lnReceiptDateTo).format('YYYY-MM-DD'), + clientReplyDateFrom: clientReplyDateFrom === null ? null : dayjs(clientReplyDateFrom).format('YYYY-MM-DD'), + clientReplyDateTo: clientReplyDateTo === null ? null : dayjs(clientReplyDateTo).format('YYYY-MM-DD'), + staffReplyDateFrom: staffReplyDateFrom === null ? null : dayjs(staffReplyDateFrom).format('YYYY-MM-DD'), + staffReplyDateTo: staffReplyDateTo === null ? null : dayjs(staffReplyDateTo).format('YYYY-MM-DD'), + }; + setIsUploading(true); + axios.get(`${apiPath}${GET_APPRECIATION_EXPORT}`,{ + responseType: 'blob', + params: temp, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", response.headers.filename); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + function getDivisionCombo(){ + axios.get(`${apiPath}${GET_SBU_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setSBUDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getCategoryCombo(){ + axios.get(`${apiPath}${GET_APPRECIATION_CATEGORY_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setCategoryList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getDivisionCombo(); + getCategoryCombo(); + }, []); + + function resetForm(){ + setSelectedDivisions([]); + setSelectedCategories([]); + setReceiptDateFrom(null); + setReceiptDateTo(null); + setLNReceiptDateFrom(null); + setLNReceiptDateTo(null); + setClientReplyDateFrom(null); + setClientReplyDateTo(null); + setStaffReplyDateFrom(null); + setStaffReplyDateTo(null); + reset(); + } + + return ( + + + + + {/*row 1*/} + + + Search Criteria(s) + + + + + + + + + + +
+ + {/*row 2*/} + + + SBU / Division + { + setSelectedDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Category + { + setSelectedCategories(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Receipt Date From + + + + + setReceiptFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: receiptFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={receiptDateFrom === null ? null : dayjs(receiptDateFrom)} + onChange={(newValue) => setReceiptDateFrom(newValue)} + /> + + + + + + To + + + + + + setReceiptToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: receiptToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={receiptDateTo === null ? null : dayjs(receiptDateTo)} + onChange={(newValue) => setReceiptDateTo(newValue)} + /> + + + + + + + + LN Receipt Date From + + + + + setLNReceiptDateFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: lnReceiptDateFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={lnReceiptDateFrom === null ? null : dayjs(lnReceiptDateFrom)} + onChange={(newValue) => setLNReceiptDateFrom(newValue)} + /> + + + + + + To + + + + + + setLNReceiptDateToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: lnReceiptDateToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={lnReceiptDateTo === null ? null : dayjs(lnReceiptDateTo)} + onChange={(newValue) => setLNReceiptDateTo(newValue)} + /> + + + + + + + + Client Department / Organization + + + + + Client Name + + + + + Client Reply Date From + + + + + setClientReplyDateFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: clientReplyDateFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={clientReplyDateFrom === null ? null : dayjs(clientReplyDateFrom)} + onChange={(newValue) => setClientReplyDateFrom(newValue)} + /> + + + + + + To + + + + + + setClientReplyDateToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: clientReplyDateToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={clientReplyDateTo === null ? null : dayjs(clientReplyDateTo)} + onChange={(newValue) => setClientReplyDateTo(newValue)} + /> + + + + + + + + Staff Reply Date From + + + + + setStaffReplyDateFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: staffReplyDateFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={staffReplyDateFrom === null ? null : dayjs(staffReplyDateFrom)} + onChange={(newValue) => setStaffReplyDateFrom(newValue)} + /> + + + + + + To + + + + + + setStaffReplyDateToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: staffReplyDateToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={staffReplyDateTo === null ? null : dayjs(staffReplyDateTo)} + onChange={(newValue) => setStaffReplyDateTo(newValue)} + /> + + + + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + { + ability.can('MAINTAIN','APPRECIATION') ? + + + + + + + + + + + + + + + + + + + + + + + : + + } + + + + +
+
+
+ ); +}; + +export default AppreciationSearchForm; diff --git a/src/pages/lionerAppreciationSearchPage/AppreciationTable.js b/src/pages/lionerAppreciationSearchPage/AppreciationTable.js new file mode 100644 index 0000000..81de9aa --- /dev/null +++ b/src/pages/lionerAppreciationSearchPage/AppreciationTable.js @@ -0,0 +1,183 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay, dateComparator, getDateString} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function AppreciationTable({recordList, divisionRef}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + + const navigate = useNavigate() + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + + + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/appreciation/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + + ] + }, + }, + { + id: 'sbuIds', + field: 'sbuIds', + headerName: 'SUB / Division', + flex: 0.75, + renderCell: (params) => { + const sbuIds = JSON.parse(params.value); // Parse the JSON string to an array + const labels = sbuIds.map((item) => { + const division = divisionRef.find((div) => div.id === item.id); // Find the corresponding division object + return division ? division.label : ''; // Get the label or an empty string if not found + }); + + const renderedLabels = labels.filter(Boolean); // Remove empty strings from labels + const displayedLabels = renderedLabels.join(', '); // Join the non-empty labels with a comma separator + + return ( +
+ {displayedLabels} +
+ ); + } + }, + { + id: 'receiptDate', + field: 'receiptDate', + headerName: 'Receipt Date', + flex: 0.6, + //sortable: false, + sortComparator: dateComparator, + renderCell: (params) => { + const dateString = getDateString(params.row.receiptDate,false).toString(); + return ( +
+ {dateString} +
+ ); + } + }, + { + id: 'description', + field: 'description', + //type: 'date', + //sortable: false, + headerName: 'Brief Description', + flex: 2, + renderCell: (params) => { + const { value } = params; + let truncatedValue = value; + + if (value.length > 300) { + truncatedValue = value.substring(0, 300) + '...'; + } + + return ( +
+ {truncatedValue} +
+ ); + } + }, + { + id: 'clientDepartment', + field: 'clientDeptOrg', + headerName: 'Client Department / Organization', + flex: 1.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'lnReceiptDate', + field: 'lnReceiptDate', + headerName: 'LN Receipt Date', + //sortable: false, + flex: 0.7, + sortComparator: dateComparator, + renderCell: (params) => { + const dateString = getDateString(params.row.lnReceiptDate,false).toString(); + return ( +
+ {dateString} +
+ ); + } + }, + { + id: 'category', + field: 'category', + headerName: 'Category', + flex: 0.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + ]; + + return ( + 'auto'} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + pageSizeOptions={[10]} + autoHeight + /> + ); +} diff --git a/src/pages/lionerAppreciationSearchPage/ImportResultWindow.js b/src/pages/lionerAppreciationSearchPage/ImportResultWindow.js new file mode 100644 index 0000000..8b96ecf --- /dev/null +++ b/src/pages/lionerAppreciationSearchPage/ImportResultWindow.js @@ -0,0 +1,200 @@ +import Dialog from '@mui/material/Dialog'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import { Button, Grid, Typography } from '@mui/material'; +import DialogActions from '@mui/material/DialogActions'; +import * as React from 'react'; +import ValidateResultTable from './ValidateResultTable'; +import { LIONER_FORM_THEME, CARD_MAX_WIDTH } from '../../themes/themeConst'; +import { ThemeProvider } from '@emotion/react'; +import { GENERAL_GREEN_COLOR, GENERAL_RED_COLOR } from '../../themes/colorConst'; +import MainCard from '../../components/MainCard'; +import axios from 'axios'; +import { apiPath } from '../../auth/utils'; +import { GET_APPRECIATION_IMPORT_ERROR_REPORT, GET_AWARD_IMPORT_ERROR_REPORT } from '../../utils/ApiPathConst'; + +export function ImportResultWindow({ + isWindowOpen, + isMultiTable, + title, + onNormalClose, + onConfirmClose, + validateResult, + isAppreciation, + recordCount, + eventCount, + applicationCount, + awardCount, + recordList, + setIsUploading +}) { + function exportReport() { + setIsUploading(true); + axios({ + method: 'post', + url: isMultiTable ? `${apiPath}${GET_AWARD_IMPORT_ERROR_REPORT}` : `${apiPath}${GET_APPRECIATION_IMPORT_ERROR_REPORT}`, + responseType: 'blob', + data: { + errorRecord: recordList + } + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement('a'); + link.href = url; + link.setAttribute('download', response.headers.filename); + link.click(); + } + }) + .catch((error) => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + return ( + + + + + {title} + + + + + + + + + + Status: + + + + + + {validateResult ? 'Import Success' : 'Validation Fail'} + + + + + {isAppreciation ? ( + + + + Total number of Record: + + + + + + {recordCount} + + + + ) : ( + <> + + + + Total number of Event: + + + + + + {eventCount} + + + + + + + + Total number of Application: + + + + + + {applicationCount} + + + + + + + + Total number of Award: + + + + + + {awardCount} + + + + + )} + + {validateResult ? ( + + ) : ( + + + + Invalid Record Result + + + + )} + + + {validateResult ? ( + + ) : ( + + +
+ +
+
+
+ )} +
+
+
+ + {validateResult ? ( + + ) : ( + + )} + + + +
+
+ ); +} diff --git a/src/pages/lionerAppreciationSearchPage/ValidateResultTable.js b/src/pages/lionerAppreciationSearchPage/ValidateResultTable.js new file mode 100644 index 0000000..88a2e2c --- /dev/null +++ b/src/pages/lionerAppreciationSearchPage/ValidateResultTable.js @@ -0,0 +1,135 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, +} from "@mui/x-data-grid"; +import {useEffect} from "react"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function ValidateResultTable({recordList, isMultiTable}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + + const columns = isMultiTable ? + [ + { + id: 'rowId', + field: 'rowId', + headerName: 'Row #', + width: 125, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'pageName', + field: 'pageName', + headerName: 'Page Name', + flex: 1, + renderCell: (params) => ( +
+ {params.value} +
+ ), + }, + { + id: 'column', + field: 'column', + headerName: 'Column', + flex: 1, + renderCell: (params) => ( +
+ {params.value} +
+ ), + }, + { + id: 'remarks', + field: 'remarks', + headerName: 'Error Message', + flex: 1.5, + renderCell: (params) => ( +
+ {params.value} +
+ ), + }, + ] + : + [ + { + id: 'rowId', + field: 'rowId', + headerName: 'Row #', + width: 125, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'column', + field: 'column', + headerName: 'Column', + flex: 1, + renderCell: (params) => ( +
+ {params.value} +
+ ), + }, + { + id: 'remarks', + field: 'remarks', + headerName: 'Error Message', + flex: 1.5, + renderCell: (params) => ( +
+ {params.value} +
+ ), + }, + ] + + ; + + return ( + 'auto'} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> + ); +} diff --git a/src/pages/lionerAppreciationSearchPage/index.js b/src/pages/lionerAppreciationSearchPage/index.js new file mode 100644 index 0000000..98c8ff8 --- /dev/null +++ b/src/pages/lionerAppreciationSearchPage/index.js @@ -0,0 +1,141 @@ +// material-ui +import { + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_APPRECIATION_LIST, + GET_SBU_DIVISION_COMBO_LIST, +} from "../../utils/ApiPathConst"; +import * as React from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import AppreciationTable from "./AppreciationTable"; +import AppreciationSearchForm from "./AppreciationSearchForm"; +import Qs from "qs"; +import {isObjEmpty} from "../../utils/Utils"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AppreciationSearchPage = () => { + const [record,setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + const [expanded, setExpanded] = React.useState(true); + const userSubDivisionId = localStorage.getItem('subDivisionId'); + const [divRef, setDivRef] = useState([]); + const [isFetchDivision, setIsFetchDivision] = useState(false); + + function getDivisionRef(){ + axios.get(`${apiPath}${GET_SBU_DIVISION_COMBO_LIST}`,{ + params:{ + id: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setDivRef(response.data.records); + setIsFetchDivision(true); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getDivisionRef(); + }, []); + + useEffect(() => { + if(isFetchDivision){ + getAwardList(); + } + }, [isFetchDivision]); + + useEffect(() => { + if(!isObjEmpty(searchCriteria)){ + getAwardList(); + } + }, [searchCriteria]); + + function getAwardList(){ + const params = { + ...searchCriteria, + } + axios.get(`${apiPath}${GET_APPRECIATION_LIST}`, { + params: params, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + } + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + setOnReady(true); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + Search Appreciation Record + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + +
+ +
+
+
+
+
+ + ); +}; + +export default AppreciationSearchPage; diff --git a/src/pages/lionerAuditTrailPage/AuditLogDetailWindow.js b/src/pages/lionerAuditTrailPage/AuditLogDetailWindow.js new file mode 100644 index 0000000..32b4e5a --- /dev/null +++ b/src/pages/lionerAuditTrailPage/AuditLogDetailWindow.js @@ -0,0 +1,191 @@ +import Dialog from "@mui/material/Dialog"; +//import DialogTitle from "@mui/material/DialogTitle"; +import DialogContent from "@mui/material/DialogContent"; +import {Grid} from "@mui/material"; +import * as React from "react"; +import {getDateString} from "../../utils/CommonFunction"; +import MainCard from "../../components/MainCard"; +//import {isObjEmpty} from "../../utils/Utils"; +import {Typography} from "@mui/material"; + +const AuditLogDetailWindow = ({ isWindowOpen, + title, + record, + onNormalClose, + tableName + }) => { + + // console.log(record); + // if(!isObjEmpty(record)){ + // console.log(JSON.parse(record.newData)); + // console.log(JSON.parse(record.oldData)); + // } + + function renderNestedKeyValuePairs(data) { + const excludedKeys = [ + "createdById", "modifiedById", "userId", + "eventId", "applicationId","categoryId", + "subDivisionIds", "user_auth_id", "user_group_id", + "group_user_id", "group_auth_id" + ]; + + const dayKeys = [ + "applicationDeadline", "startDate", + "announcementDate", "applicationDeadline", + "awardDate", "nextApplicationDate", + "receiveDate","eventFrom", "eventTo", + "lnReceiptDate", "receiptDate", "staffReplyDate", + "clientReplyDate" + ]; + const sortedData = Object.entries(data) + .filter(([key]) => !excludedKeys.includes(key)) + .sort(([keyA], [keyB]) => { + const topKeys = ["id", "version", "modifiedBy", "modified", "createdBy", "created", "deleted"]; + if (topKeys.includes(keyA)) { + if (topKeys.includes(keyB)) { + return topKeys.indexOf(keyA) - topKeys.indexOf(keyB); + } else { + return -1; + } + } else if (topKeys.includes(keyB)) { + return 1; + } + return keyA.localeCompare(keyB); + }) + .map(([key, value]) => { + if (typeof value === "object" && value !== null) { + // Handle nested objects recursively + return ( +
+ {key}: + {value.toString()} +
+ ); + } else { + // Render non-nested key-value pairs + return ( +
+ {key}: {" "} + {value === null ? "" : dayKeys.includes(key) ? value.toString().split('T')[0] : value.toString() } +
+ ); + } + }); + + return sortedData; + } + + return ( + !(Object.keys(record).length > 0 && record !== undefined) ? +
+ : + + {/**/} + {/* */} + {/* {title}*/} + {/* */} + {/**/} + + + + + + { + tableName === "apr_appreciation"? + + : + + + Record Name: + + + } + { + tableName === "apr_appreciation"? + + : + + + {title} + + + } + + + + Modified By: + + + + + + {record.username} + + + + + + + Modified Date: + + + + + + {record.modified === null ? '' : getDateString(record.modified,true)} + + + + + + + + + + Old Data + + + + {renderNestedKeyValuePairs(JSON.parse(record.oldData))} + + + + + + New Data + + + {/*{prettyJson(record.newData)}*/} + + {renderNestedKeyValuePairs(JSON.parse(record.newData))} + + + + + + + + + + + + + + ) +} + +export default AuditLogDetailWindow; diff --git a/src/pages/lionerAuditTrailPage/AuditLogSearchForm.js b/src/pages/lionerAuditTrailPage/AuditLogSearchForm.js new file mode 100644 index 0000000..da40c19 --- /dev/null +++ b/src/pages/lionerAuditTrailPage/AuditLogSearchForm.js @@ -0,0 +1,254 @@ +// material-ui +import { + Button, + Grid, TextField, Typography, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {useEffect, useState} from "react"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import Autocomplete from "@mui/material/Autocomplete"; +import {tableNameCombo} from "../../utils/ComboConst"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_USER_AUDIT_COMBO_LIST} from "../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AuditLogSearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [selectedTableName, setSelectedTableName] = useState(null); + const [selectedUser, setSelectedUser] = useState(null); + const [userCombo, setUserCombo] = useState([]); + const [errors, setErrors] = useState({}); + const [fromError, setFromError] = React.useState(null); + const [toError, setToError] = React.useState(null); + const fromErrorMessage = React.useMemo(() => { + switch (fromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [fromError]); + + const toErrorMessage = React.useMemo(() => { + switch (toError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [toError]); + + const onSubmit = (data) => { + const formErrors = {}; + + if(selectedTableName === null){ + formErrors.tableName = 'Table name is required'; + + } + if(fromDate === null || toDate === null ) { + formErrors.date = 'Date Range is required'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + const temp = { + tableName: selectedTableName == null ? null : selectedTableName.value, + recordName: data.recordName, + modifiedBy: selectedUser == null ? null : selectedUser.id, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + } + applySearch(temp); + } + }; + + useEffect(() => { + axios.get(`${apiPath}${GET_USER_AUDIT_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setUserCombo(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + function resetForm(){ + setFromDate(null); + setToDate(null); + setSelectedUser(null); + setSelectedTableName(null); + reset(); + } + + return ( + + +
+ + {/*row 1*/} + + + {/*row 2*/} + + + + + Table + * + + { + setSelectedTableName(newValue); + }} + renderInput={(params) => } + /> + + + + + Modified By + + { + setSelectedUser(newValue); + }} + renderInput={(params) => } + /> + + + + + Record Name + + + + + + + Modified Date + * + + + + + + setFromDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.date || fromError, + helperText: fromError ? fromErrorMessage :errors.date, + }, + }} + /> + + + + + + To + + + + + + setToDate(newValue)} + onError={(newError) => setToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.date || toError, + helperText: toErrorMessage + }, + }} + /> + + + + + + + + + {/*last row*/} + + + + + + + + + + + + +
+ ); +}; + +export default AuditLogSearchForm; diff --git a/src/pages/lionerAuditTrailPage/AuditLogTable.js b/src/pages/lionerAuditTrailPage/AuditLogTable.js new file mode 100644 index 0000000..91b943e --- /dev/null +++ b/src/pages/lionerAuditTrailPage/AuditLogTable.js @@ -0,0 +1,152 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, GridActionsCellItem, +} from "@mui/x-data-grid"; +import {useEffect} from "react"; +import {CustomNoRowsOverlay, getDateString} from "../../utils/CommonFunction"; +import ManageSearchIcon from '@mui/icons-material/ManageSearch'; +import AuditLogDetailWindow from "./AuditLogDetailWindow"; +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +export default function AuditLogTable({recordList, pageSize,tableName}) { + const [rows, setRows] = React.useState([]); + // ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedAuditLog, setSelectedAuditLog] = React.useState({}); + + const handleClose = () => { + setIsWindowOpen(false); + }; + // ==============================|| DELETE WINDOW RELATED ||============================== // + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + function handleViewClick(params){ + setSelectedAuditLog(params.row); + setIsWindowOpen(true); + + } + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: (params) => { + return [ + } + label="view" + className="textPrimary" + onClick={()=>handleViewClick(params)} + />] + }, + }, + { + id: 'recordId', + field: 'recordId', + headerName: 'Record Id', + flex: 0.3, + }, + { + id: 'recordName', + field: 'recordName', + headerName: 'Record', + flex: 1.75, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'modified', + field: 'modified', + headerName: 'Modified Date', + flex: 0.4, + renderCell: (params) => ( +
+ {getDateString(params.row.modified, true)} +
+ ), + sortComparator: (v1, v2) => getDateString(v1,true).localeCompare(getDateString(v2,true)) + }, + { + id: 'modifiedBy', + field: 'username', + headerName: 'Modified By', + flex: 0.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + /*{ + id: 'oldData', + field: 'oldData', + headerName: 'Old Data', + flex: 1, + }, + { + id: 'newData', + field: 'newData', + headerName: 'New Data', + flex: 1, + },*/ + + ]; + + return ( +
+ ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[15]} + getRowHeight={() => 'auto'} + autoHeight + getRowId={(row) => row.recordId+row.tableName + row.modified} + /> + + + +
+ ); +} diff --git a/src/pages/lionerAuditTrailPage/index.js b/src/pages/lionerAuditTrailPage/index.js new file mode 100644 index 0000000..2b02d97 --- /dev/null +++ b/src/pages/lionerAuditTrailPage/index.js @@ -0,0 +1,102 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import AuditLogSearchForm from "./AuditLogSearchForm"; +import AuditLogTable from "./AuditLogTable"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_AUDIT_LOG_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {isObjEmpty} from "../../utils/Utils"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AuditLogSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + //getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + if(!isObjEmpty(searchCriteria)){ + getGroupList(); + } + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_AUDIT_LOG_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + Audit Log + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + + + ); +}; + +export default AuditLogSearchPanel; diff --git a/src/pages/lionerAwardSearchPage/AwardSearchForm.js b/src/pages/lionerAwardSearchPage/AwardSearchForm.js new file mode 100644 index 0000000..67d07fc --- /dev/null +++ b/src/pages/lionerAwardSearchPage/AwardSearchForm.js @@ -0,0 +1,1135 @@ +// material-ui +import { + Button, + Typography, + Grid, InputLabel, TextField, CardActions, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; + +import {useContext, useEffect, useRef, useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import * as React from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import { + GET_APPLICATION_COMBO_PATH, + GET_AWARD_EXPORT, + GET_AWARD_EXPORT_TEMPLATE, + GET_CATEGORY_COMBO_LIST, + GET_DIVISION_COMBO_LIST, + GET_EVENT_COMBO_PATH, + GET_LDAP_USER_LIST, + GET_PROMOTION_CHANNEL_COMBO_LIST, + GET_SUB_DIVISION_COMBO_LIST, + GET_TAG_COMBO_LIST, + POST_AWARD_IMPORT, + POST_SEARCH_TEMPLATE_PATH, + VALIDATE_TEMPLATE_NAME_PATH +} from "../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME, LIONER_MEDIUM_BUTTON_THEME} from "../../themes/colorConst"; +import { + convertXmlToObject, + GeneralCreateTemplateWindow, + GeneralTwoComboWindow, + getComboValueByIdList, getComboValueByLabel, + getIdList, isOptionEqualToValue, notifyDeleteError, notifySaveSuccess, +} from "../../utils/CommonFunction"; +import Qs from 'qs'; +import {useNavigate} from "react-router"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../components/UploadProvider"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {isObjEmpty} from "../../utils/Utils"; +import {parseString} from "xml2js"; +import {useLocation} from "react-router-dom"; +import AbilityContext from "../../components/AbilityProvider"; +import Collapse from '@mui/material/Collapse'; +import {ExpandMore} from "@mui/icons-material"; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ImportResultWindow} from "../lionerAppreciationSearchPage/ImportResultWindow"; +//import {ImportResultWindow} from "../lionerAppreciationSearchPage/ImportResultWindow"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AwardSearchForm = ({refTemplateData, applySearch,isUpdating, + setIsUpdating, getTemplateList,setExpanded,expanded, + userDivision}) => { + + const navigate = useNavigate() + const location = useLocation(); + const ability = useContext(AbilityContext); + const queryParams = new URLSearchParams(location.search); + const { setIsUploading } = useContext(UploadContext); + const handleExpandClick = () => { + setExpanded(!expanded); + }; + + const [selectedTag, setSelectedTag] = useState([]); + const [selectedChannels, setSelectedChannels] = useState([]); + const [selectedOfficer, setSelectedOfficer] = useState(null); + const [selectedSubDivisions, setSelectedSubDivisions] = useState([]); + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [selectedEvent, setSelectedEvent] = useState(null); + const [selectedCategories, setSelectedCategories] = useState([]); + const [selectedApplication, setSelectedApplication] = useState(null); + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [awardFromDate, setAwardFromDate] = useState(null); + const [awardToDate, setAwardToDate] = useState(null); + + const [tagList, setTagList] = useState([]); + const [channelList, setChannelList] = useState([]); + const [categoryList, setCategoryList] = useState([]); + const [subDivisionList, setSubDivisionList] = useState([]); + const [divisionList, setDivisionList] = useState([]); + const [eventList, setEventList] = useState([]); + const [applicationList, setApplicationList] = useState([]); + + const { setValue, reset, register, handleSubmit, getValues } = useForm() + const [eventFromError, setEventFromError] = React.useState(null); + const [eventToError, setEventToError] = React.useState(null); + const eventFromErrorMessage = React.useMemo(() => { + switch (eventFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [eventFromError]); + + const eventToErrorMessage = React.useMemo(() => { + switch (eventToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [eventToError]); + + const [awardFromError, setAwardFromError] = React.useState(null); + const [awardToError, setAwardToError] = React.useState(null); + + const awardFromErrorMessage = React.useMemo(() => { + switch (awardFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [awardFromError]); + + const awardToErrorMessage = React.useMemo(() => { + switch (awardToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [awardToError]); + + + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const handleLocationCodeChange = (event, value) => { + setSelectedOfficer({ + label: value, + }); + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + // Function to fetch user name options based on locationCode + const fetchLotusUserList = async (input) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + if(!isObjEmpty(refAward) && isUpdating){ + setSelectedOfficer({ + label:refAward.selectedOfficer + }); + } + setLotusNoteUserList(convertXmlToObject(result.RECORDS.RECORD)); + }); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + //=====TEMPLATE RELATED START=====// + const [refAward, setRefAward] = useState(null); + + useEffect(() => { + setRefAward(refTemplateData); + }, [subDivisionList]); + + useEffect(() => { + setRefAward(refTemplateData); + }, [refTemplateData]); + + useEffect(() => { + if(!isObjEmpty(refAward)){ + if(refAward.selectedOfficer !== null){ + //const locationCode = refAward.selectedOfficer.split('(')[1].replace(')',''); + fetchLotusUserList(refAward.selectedOfficer); + } + else{ + setSelectedOfficer(null); + } + setValue('eventName', refAward.eventName ); + setValue('applicationName', refAward.applicationName ); + setValue('awardName', refAward.awardName ); + setValue('storageLocation', refAward.storageLocation ); + setValue('physicalAward', refAward.physicalAward ); + setSelectedTag(getComboValueByIdList(tagList,refAward.selectedTag)); + setSelectedCategories(getComboValueByIdList(categoryList,refAward.selectedCategories)); + setSelectedDivisions(getComboValueByIdList(divisionList,refAward.selectedDivisions)); + setSelectedSubDivisions(getComboValueByIdList(subDivisionList,refAward.selectedSubDivisions)); + setSelectedChannels(getComboValueByIdList(channelList,refAward.selectedChannels)); + setSelectedOfficer(getComboValueByLabel(lotusNoteUserList,refAward.selectedOfficer)); + setFromDate( + refAward.fromDate === null ? null : dayjs(refAward.fromDate) + ); + setToDate( + refAward.toDate === null ? null : dayjs(refAward.toDate) + ) + setAwardFromDate( + refAward.awardFromDate === null ? null : dayjs(refAward.awardFromDate) + ); + setAwardToDate( + refAward.awardToDate === null ? null : dayjs(refAward.awardToDate) + ) + } + else{ + resetForm(); + } + }, [refAward]); + //=====TEMPLATE RELATED END=====// + + // ==============================|| IMPORT TEMPLATE WINDOW RELATED ||============================== // + const fileInputRef = useRef(null); + const [importStatus, setImportStatus] = useState(0); + const [eventCount, setEventCount] = useState(0); + const [applicationCount, setApplicationCount] = useState(0); + const [awardCount, setAwardCount] = useState(0); + const [importErrorList, setImportErrorList] = useState([]); + + const handleFileInputChange = (event) => { + setIsUploading(true); + const selectedFile = event.target.files[0]; + if (selectedFile.type === "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { + const formData = new FormData(); + formData.append('files', selectedFile); + axios.post(`${apiPath}${POST_AWARD_IMPORT}`, + formData, + { + headers: { + 'Content-Type': 'multipart/form-data', + } + } + ) + .then((response) => { + if (response.status === 200) { + setEventCount(response.data.data.eventCount); + setApplicationCount(response.data.data.applicationCount); + setAwardCount(response.data.data.awardCount); + setImportErrorList(response.data.data.recordList); + setImportStatus(response.data.data.status); + displayImportResult(); + } + setIsUploading(false); + fileInputRef.current.value = ''; + }) + .catch((error) => { + setIsUploading(false); + notifyDeleteError('Server busy, please try again later.'); + console.log(error); + return false; + }); + } else { + // Handle case when selected file is not an Excel file + setIsUploading(false); + fileInputRef.current.value = ''; + // Show an error message to the user + alert('Please select an Excel xlsx file.'); + } + + }; + + const handleImportTemplateClick = () => { + fileInputRef.current.click(); + }; + + const [isResultWindowOpen, setIsResultWindowOpen] = React.useState(false); + + const handleWindowClose = (event, reason) => { + if (reason && reason === "backdropClick") + return; + setIsResultWindowOpen(false); + }; + + const handleReload = () =>{ + setIsResultWindowOpen(false); + const data = getValues(); + const temp = { + eventName: data.eventName, + applicationName: data.applicationName, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + awardFromDate: awardFromDate === null ? null : dayjs(awardFromDate).format('YYYY-MM-DD'), + awardToDate: awardToDate === null ? null : dayjs(awardToDate).format('YYYY-MM-DD'), + awardName: data.awardName, + categoryIds: getIdList(selectedCategories), + tagIds: getIdList(selectedTag), + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + storageLocation: data.storageLocation, + physicalAward: data.physicalAward, + promotionChannel: isObjEmpty(getIdList(selectedChannels)) ? null : "[" + getIdList(selectedChannels).toString() + "]" , + responsibleOfficer: isObjEmpty(selectedOfficer) ? null : selectedOfficer.label, + }; + + applySearch(temp); + } + + function displayImportResult(){ + setIsResultWindowOpen(true); + } + + // ==============================|| IMPORT TEMPLATE WINDOW RELATED ||============================== // + + + function downloadTemplate(){ + axios.get(`${apiPath}${GET_AWARD_EXPORT_TEMPLATE}`,{ + responseType: 'blob', + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", response.headers.filename); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + const [isTempWindowOpen, setIsTempWindowOpen] = React.useState(false); + const [templateName, setTemplateName] = React.useState(false); + + const handleTempClose = () => { + setIsTempWindowOpen(false); + }; + + function uploadTemplate(){ + setIsTempWindowOpen(false); + setIsUploading(true); + const userData = getUserData(); + const data = getValues(); + const temp = { + eventName: data.eventName, + awardName: data.awardName, + physicalAward: data.physicalAward, + storageLocation: data.storageLocation, + applicationName: data.applicationName, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + selectedCategories: getIdList(selectedCategories), + awardFromDate: awardFromDate === null ? null : dayjs(awardFromDate).format('YYYY-MM-DD'), + awardToDate: awardToDate === null ? null : dayjs(awardToDate).format('YYYY-MM-DD'), + selectedTag: getIdList(selectedTag), + selectedDivisions: getIdList(selectedDivisions), + selectedSubDivisions: getIdList(selectedSubDivisions), + selectedChannels: getIdList(selectedChannels), + selectedOfficer: selectedOfficer === null ? null : selectedOfficer.label, + }; + + let templateSet={ + id: -1, + userId: userData.id, + name: templateName.trim(), + module: "Award", + criteria: JSON.stringify(temp), + } + axios.post(`${apiPath}${POST_SEARCH_TEMPLATE_PATH}`, + templateSet, + ) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + getTemplateList(); + notifySaveSuccess(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + const createNewTemplate = () => { + setIsTempWindowOpen(true); + }; + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + + +// ==============================|| NEW WINDOW RELATED START ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const handleClose = () => { + setIsWindowOpen(false); + }; + + function updateData(){ + setIsWindowOpen(false); + navigate(`/award/maintain/-1/${selectedEvent.id}/${selectedApplication.id}`); + } + + const createNewAward = () => { + setIsWindowOpen(true); + }; +// ==============================|| NEW WINDOW RELATED END ||============================== // + + const onSubmit = (data) => { + const temp = { + eventName: data.eventName, + applicationName: data.applicationName, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + awardFromDate: awardFromDate === null ? null : dayjs(awardFromDate).format('YYYY-MM-DD'), + awardToDate: awardToDate === null ? null : dayjs(awardToDate).format('YYYY-MM-DD'), + awardName: data.awardName, + categoryIds: getIdList(selectedCategories), + tagIds: getIdList(selectedTag), + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + storageLocation: data.storageLocation, + physicalAward: data.physicalAward, + promotionChannel: isObjEmpty(getIdList(selectedChannels)) ? null : "[" + getIdList(selectedChannels).toString() + "]" , + responsibleOfficer: isObjEmpty(selectedOfficer) ? null : selectedOfficer.label, + }; + applySearch(temp); + setExpanded(false); + }; + + function onExport(){ + const data = getValues(); + const temp = { + eventName: data.eventName, + applicationName: data.applicationName, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + awardFromDate: awardFromDate === null ? null : dayjs(awardFromDate).format('YYYY-MM-DD'), + awardToDate: awardToDate === null ? null : dayjs(awardToDate).format('YYYY-MM-DD'), + awardName: data.awardName, + categoryIds: getIdList(selectedCategories), + tagIds: getIdList(selectedTag), + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + storageLocation: data.storageLocation, + physicalAward: data.physicalAward, + promotionChannel: isObjEmpty(getIdList(selectedChannels)) ? null : "[" + getIdList(selectedChannels).toString() + "]" , + responsibleOfficer: isObjEmpty(selectedOfficer) ? null : selectedOfficer.label, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + }; + setIsUploading(true); + axios.get(`${apiPath}${GET_AWARD_EXPORT}`,{ + responseType: 'blob', + params: temp, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", "award_export_"+ Date.now() + ".xlsx"); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + function getSubDivisionCombo(divisionIds){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + { + params: { + "divisionIds": divisionIds + }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + if(!isObjEmpty(refAward) && isUpdating){ + setSelectedSubDivisions(getComboValueByIdList(response.data.records,refAward.selectedSubDivisions)); + setIsUpdating(false); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getDivisionCombo(){ + axios.get(`${apiPath}${GET_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getChannelCombo(){ + axios.get(`${apiPath}${GET_PROMOTION_CHANNEL_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setChannelList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getCategoryCombo(){ + axios.get(`${apiPath}${GET_CATEGORY_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setCategoryList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getTagCombo(){ + axios.get(`${apiPath}${GET_TAG_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setTagList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getEventCombo(){ + axios.get(`${apiPath}${GET_EVENT_COMBO_PATH}`, + { + params:{ + userSubDivisionId: ability.can('EDIT','ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + }) + .then((response) => { + if (response.status === 200) { + setEventList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getApplicationCombo(eventId){ + axios.get(`${apiPath}${GET_APPLICATION_COMBO_PATH}`, + { + params: { + "eventId": eventId, + userSubDivisionId: ability.can('EDIT','ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + }) + .then((response) => { + if (response.status === 200) { + setApplicationList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getTagCombo(); + getEventCombo(); + getDivisionCombo(); + getCategoryCombo(); + getChannelCombo(); + getApplicationCombo(null); + getSubDivisionCombo(null); + const year = queryParams.get('year'); + if(year !== null){ + setAwardFromDate( + dayjs(year+"-01-01 00:00:00") + ); + setAwardToDate( + dayjs(year+"12-31") + ); + } + }, []); + + useEffect(() => { + const userSubDivision = queryParams.get('userSubDivision'); + if(userSubDivision === "true" && + !isObjEmpty(userDivision) && + !isObjEmpty(divisionList)){ + setSelectedDivisions(getComboValueByIdList(divisionList,[userDivision.id])); + } + }, [userDivision,divisionList]); + + useEffect(() => { + if(selectedEvent !== null && Object.keys(selectedEvent).length >= 0){ + getApplicationCombo(selectedEvent.id); + } + }, [selectedEvent]); + + // useEffect(() => { + // if(selectedDivisions !== null && selectedDivisions !== undefined){ + // const temp = selectedDivisions.length > 0 ? getIdList(selectedDivisions) : []; + // //const idList = castListToString(temp); + // getSubDivisionCombo(temp); + // } + // if(selectedDivisions.length <=0){ + // setSelectedSubDivisions([]); + // } + // }, [selectedDivisions]); + // + // useEffect(() => { + // removeInvalidSubDivision(getIdList(selectedDivisions)); + // }, [subDivisionList]); + // + // function removeInvalidSubDivision (divisionIdList){ + // let temp = selectedSubDivisions; + // let output = []; + // for(let i=0 ; i + + + + {/*row 1*/} + + + Search Criteria(s) + + + + + + + + + + +
+ + {/*row 2*/} + + + Event Name + + + + + Application Name + + + + + Award Name + + + + + Event Date From + + + + + setEventFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: eventFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={fromDate === null ? null : dayjs(fromDate)} + onChange={(newValue) => setFromDate(newValue)} + /> + + + + + + To + + + + + + setEventToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: eventToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={toDate === null ? null : dayjs(toDate)} + onChange={(newValue) => setToDate(newValue)} + /> + + + + + + + + Award Date From + + + + + setAwardFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: awardFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={awardFromDate === null ? null : dayjs(awardFromDate)} + onChange={(newValue) => setAwardFromDate(newValue)} + /> + + + + + + To + + + + + + setAwardToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: awardToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={awardToDate === null ? null : dayjs(awardToDate)} + onChange={(newValue) => setAwardToDate(newValue)} + /> + + + + + + + + Category + { + setSelectedCategories(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Tag + { + setSelectedTag(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Division + { + setSelectedDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Sub-Division + { + setSelectedSubDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Responsible Officer + { + setSelectedOfficer(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + Promotion Channel + { + setSelectedChannels(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Storage Location + + + + + Physical Award + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + { + ability.can('EDIT','AWARD') ? + + + + + + + {ability.can('MASS', 'IMPORT_AWARD') ? + + + + + : + <> + } + + + {ability.can('MASS', 'IMPORT_AWARD') ? + + + + + + + + : <> + } + + + : + + } + + + + + +
+
+ + ); +}; + +export default AwardSearchForm; diff --git a/src/pages/lionerAwardSearchPage/AwardTable.js b/src/pages/lionerAwardSearchPage/AwardTable.js new file mode 100644 index 0000000..e25b827 --- /dev/null +++ b/src/pages/lionerAwardSearchPage/AwardTable.js @@ -0,0 +1,139 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function AwardTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + + const navigate = useNavigate() + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/award/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + + ] + }, + }, + { + id: 'eventName', + field: 'eventName', + headerName: 'Event Name', + flex: 1.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'applicationName', + field: 'applicationName', + headerName: 'Application', + flex: 1.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'awardName', + field: 'awardName', + //type: 'date', + //sortable: false, + headerName: 'Award', + flex: 0.75, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'responsibleOfficer', + field: 'responsibleOfficer', + headerName: 'Responsible Officer', + flex: 0.5, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + ]; + + return ( + 'auto'} + // getRowHeight={(params) => Math.max( + // getRowHeight(params, 'applicationName', 66), + // getRowHeight(params, 'eventName', 53) + // )} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + pageSizeOptions={[10]} + autoHeight + /> + ); +} diff --git a/src/pages/lionerAwardSearchPage/index.js b/src/pages/lionerAwardSearchPage/index.js new file mode 100644 index 0000000..9387ec1 --- /dev/null +++ b/src/pages/lionerAwardSearchPage/index.js @@ -0,0 +1,246 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useContext, useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import { + GET_AWARD_PATH, + GET_DIVISION_FROM_SUB_DIVISION, + GET_SEARCH_TEMPLATE_COMBO_PATH, + GET_SEARCH_TEMPLATE_PATH +} from "../../utils/ApiPathConst"; +import * as React from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import AwardTable from "./AwardTable"; +import AwardSearchForm from "./AwardSearchForm"; +import Qs from "qs"; +import Autocomplete from '@mui/material/Autocomplete'; +import UploadContext from "../../components/UploadProvider"; +import {isObjEmpty} from "../../utils/Utils"; +import {isOptionEqualToValue, notifyLoadSuccess} from "../../utils/CommonFunction"; +import dayjs from "dayjs"; +import {useLocation} from "react-router-dom"; +import AbilityContext from "../../components/AbilityProvider"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AwardSearchPage = () => { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const [record,setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + const ability = useContext(AbilityContext); + const [expanded, setExpanded] = React.useState(true); + const userSubDivisionId = localStorage.getItem('subDivisionId'); + const [userDivision, setUserDivision] = useState(null); + + function getUserDivisionDetail(){ + axios.get(`${apiPath}${GET_DIVISION_FROM_SUB_DIVISION}`,{ + params:{ + id: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setUserDivision(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getUserDivisionDetail(); + }, []); + + useEffect(() => { + if(!isObjEmpty(userDivision)){ + getAwardList(true); + getTemplateList(); + } + }, [userDivision]); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + if(!isObjEmpty(searchCriteria)){ + getAwardList(false); + } + }, [searchCriteria]); + + //=====TEMPLATE RELATED START=====// + const { setIsUploading } = useContext(UploadContext); + const [selectedTemplate, setSelectedTemplate] = useState(null); + const [searchTemplateList, setSearchTemplateList] = useState([]); + const [refTemplateData, setRefTemplateData] = useState(null); + const [isUpdating, setIsUpdating] = useState(false); + + function getTemplateList(){ + const userData = getUserData(); + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_COMBO_PATH}`, { + params: { + "module": "Award", + "userId": userData.id + }, + } + ) + .then((response) => { + if (response.status === 200) { + setSearchTemplateList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + if(!isObjEmpty(selectedTemplate)){ + getTemplateDetail(); + } + else{ + setRefTemplateData(null); + } + }, [selectedTemplate]); + + function getTemplateDetail(){ + setIsUploading(true); + setIsUpdating(true); + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_PATH}/${selectedTemplate.id}`) + .then((response) => { + if (response.status === 200) { + setRefTemplateData(JSON.parse(response.data.data.criteria)); + setIsUploading(false); + notifyLoadSuccess(); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + //=====TEMPLATE RELATED END=====// + + function getAwardList(isInit){ + const year = queryParams.get('year'); + const userSubDivision = queryParams.get('userSubDivision'); + + const temp = { + awardFromDate: year === null ? null : dayjs(year+"-01-01").format('YYYY-MM-DD'), + awardToDate: year === null ? null : dayjs(year+"-12-31").format('YYYY-MM-DD'), + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + divisionIdList: userSubDivision === "true" ? [userDivision.id] : null, + }; + const byDivision = { + ...searchCriteria, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + axios.get(`${apiPath}${GET_AWARD_PATH}`, { + params: isInit? temp : byDivision, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + } + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + Search Award + + + + + + Search Template: + + + { + setSelectedTemplate(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + +
+ +
+
+
+
+
+ + ); +}; + +export default AwardSearchPage; diff --git a/src/pages/lionerCategoryPage/AppreciationCategoryIndex.js b/src/pages/lionerCategoryPage/AppreciationCategoryIndex.js new file mode 100644 index 0000000..ef86567 --- /dev/null +++ b/src/pages/lionerCategoryPage/AppreciationCategoryIndex.js @@ -0,0 +1,97 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_APPRECIATION_CATEGORY_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import AppreciationCategorySearchForm from "./AppreciationCategorySearchForm"; +import AppreciationCategoryTable from "./AppreciationCategoryTable"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AppreciationCategoryIndex = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_APPRECIATION_CATEGORY_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + if(response.data.records !== record){ + setRecord(response.data.records); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View Appreciation Category + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default AppreciationCategoryIndex; diff --git a/src/pages/lionerCategoryPage/AppreciationCategorySearchForm.js b/src/pages/lionerCategoryPage/AppreciationCategorySearchForm.js new file mode 100644 index 0000000..8a0478c --- /dev/null +++ b/src/pages/lionerCategoryPage/AppreciationCategorySearchForm.js @@ -0,0 +1,77 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const CategorySearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + applySearch(data); + }; + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + Category Name + + + + + {/*last row*/} + + + + + + + + + + + + + +
+ ); +}; + +export default CategorySearchForm; diff --git a/src/pages/lionerCategoryPage/AppreciationCategoryTable.js b/src/pages/lionerCategoryPage/AppreciationCategoryTable.js new file mode 100644 index 0000000..28636f5 --- /dev/null +++ b/src/pages/lionerCategoryPage/AppreciationCategoryTable.js @@ -0,0 +1,344 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useContext, useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_APPRECIATION_CATEGORY_DUPLICATE, + GET_APPRECIATION_CATEGORY_LIST, + UPDATE_APPRECIATION_CATEGORY_PATH +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + } + ,...oldRows + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| CATEGORY TABLE ||============================== // + +export default function AppreciationCategoryTable({recordList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const { setIsUploading } = useContext(UploadContext); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_APPRECIATION_CATEGORY_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(()=>{ + setRows(recordList); + },[recordList]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateCategory(data) { + if(data.name.trim().length === 0){ + notifyDeleteError(`Name cannot be null`); + handleEditClick(data.id); + } + else{ + axios.get(`${apiPath}${CHECK_APPRECIATION_CATEGORY_DUPLICATE}`, + { + params: { + "name": data.name.trim(), + "id": data.id + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + notifyDeleteError(`${data.name} already exists.`) + handleEditClick(data.id); + } + else if(!response.data.isTaken){ + processUpload(data); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + + } + + function processUpload(data){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_APPRECIATION_CATEGORY_PATH}`, + { + "id": data.id, + "name": data.name.trim(), + }, + ) + + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + setIsUploading(false); + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateCategory(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="error" + /> + , + + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="save" + onClick={handleSaveClick(id)} + /> + , + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + ]; + }, + }, + { + id: 'categoryName', + field: 'name', + headerName: 'Category Name', + flex: 1, + editable: true, + preProcessEditCellProps: (params) => { + if(params.props.value !== undefined){ + const hasError = params.props.value.length > 50; + if (hasError) { + notifyDeleteError("Input has reached the length limit (50)"); + } + return { ...params.props, error: hasError }; + } + }, + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + getRowHeight={() => 'auto'} + processRowUpdate={processRowUpdate} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[15]} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerCategoryPage/CategorySearchForm.js b/src/pages/lionerCategoryPage/CategorySearchForm.js new file mode 100644 index 0000000..6e8e304 --- /dev/null +++ b/src/pages/lionerCategoryPage/CategorySearchForm.js @@ -0,0 +1,89 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const CategorySearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + applySearch(data); + }; + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + Category Name + + + + + Category Description + + + + + + {/*last row*/} + + + + + + + + + + + + + +
+ ); +}; + +export default CategorySearchForm; diff --git a/src/pages/lionerCategoryPage/CategoryTable.js b/src/pages/lionerCategoryPage/CategoryTable.js new file mode 100644 index 0000000..e577eed --- /dev/null +++ b/src/pages/lionerCategoryPage/CategoryTable.js @@ -0,0 +1,361 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useContext, useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_CATEGORY_DUPLICATE, + GET_CATEGORY_LIST, + UPDATE_CATEGORY_PATH, +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + } + ,...oldRows + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| CATEGORY TABLE ||============================== // + +export default function CategoryTable({recordList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const { setIsUploading } = useContext(UploadContext); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_CATEGORY_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(()=>{ + setRows(recordList); + },[recordList]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateCategory(data) { + if(data.name.trim().length === 0){ + notifyDeleteError(`Name cannot be null`); + handleEditClick(data.id); + } + else{ + axios.get(`${apiPath}${CHECK_CATEGORY_DUPLICATE}`, + { + params: { + "name": data.name.trim(), + "categoryId": data.id + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + notifyDeleteError(`${data.name} already exists.`) + handleEditClick(data.id); + } + else if(!response.data.isTaken){ + processUpload(data); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + + } + + function processUpload(data){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_CATEGORY_PATH}`, + { + "id": data.id, + "name": data.name.trim(), + "description": data.description, + }, + ) + + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + setIsUploading(false); + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateCategory(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="error" + /> + , + + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="save" + onClick={handleSaveClick(id)} + /> + , + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + ]; + }, + }, + { + id: 'categoryName', + field: 'name', + headerName: 'Category Name', + flex: 1, + editable: true, + preProcessEditCellProps: (params) => { + if(params.props.value !== undefined){ + const hasError = params.props.value.length > 50; + if (hasError) { + notifyDeleteError("Input has reached the length limit (50)"); + } + return { ...params.props, error: hasError }; + } + }, + }, + { + id: 'categoryDescription', + field: 'description', + headerName: 'Category Description', + flex: 1, + editable: true, + preProcessEditCellProps: (params) => { + if(params.props.value !== undefined){ + const hasError = params.props.value.length > 255; + if (hasError) { + notifyDeleteError("Input has reached the length limit (255)"); + } + return { ...params.props, error: hasError }; + } + }, + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + getRowHeight={() => 'auto'} + processRowUpdate={processRowUpdate} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[15]} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerCategoryPage/LIONERCategoryIndex.js b/src/pages/lionerCategoryPage/LIONERCategoryIndex.js new file mode 100644 index 0000000..3541fcb --- /dev/null +++ b/src/pages/lionerCategoryPage/LIONERCategoryIndex.js @@ -0,0 +1,97 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import CategorySearchForm from "./CategorySearchForm"; +import CategoryTable from "./CategoryTable"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_CATEGORY_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const LIONERCategoryIndex = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_CATEGORY_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + if(response.data.records !== record){ + setRecord(response.data.records); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View Category + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default LIONERCategoryIndex; diff --git a/src/pages/lionerCategoryPage/index.js b/src/pages/lionerCategoryPage/index.js new file mode 100644 index 0000000..e8a8157 --- /dev/null +++ b/src/pages/lionerCategoryPage/index.js @@ -0,0 +1,86 @@ +import {useState} from 'react'; + +// material-ui +import { + Box, + //Box, + Tab, Tabs, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useTheme} from "@mui/material/styles"; +import LIONERCategoryIndex from "./LIONERCategoryIndex"; +import AppreciationCategoryIndex from "./AppreciationCategoryIndex"; +import {CategoryTabHeading} from "../../utils/ComboConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const CategoryPage = () => { + const [value, setValue] = useState(0);//0 for unread, 1 for readed + const theme = useTheme(); + const [tabData] = useState(CategoryTabHeading); + + //const subDivisionId = localStorage.getItem('subDivisionId'); + + function TabPanel({children, value, index, ...other}) { + return ( + + ); + } + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + + return ( + + { + + + {tabData.map(data => ( + + ))} + + + } + + + + + + + + ); +}; + +export default CategoryPage; diff --git a/src/pages/lionerClientDepartmentPage/ClientDepartmentSearchForm.js b/src/pages/lionerClientDepartmentPage/ClientDepartmentSearchForm.js new file mode 100644 index 0000000..9366cf2 --- /dev/null +++ b/src/pages/lionerClientDepartmentPage/ClientDepartmentSearchForm.js @@ -0,0 +1,84 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ClientDepartmentSearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + applySearch(data); + }; + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + Client Department + + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + +
+ ); +}; + +export default ClientDepartmentSearchForm; diff --git a/src/pages/lionerClientDepartmentPage/ClientDepartmentTable.js b/src/pages/lionerClientDepartmentPage/ClientDepartmentTable.js new file mode 100644 index 0000000..0337ddb --- /dev/null +++ b/src/pages/lionerClientDepartmentPage/ClientDepartmentTable.js @@ -0,0 +1,342 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useContext, useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_CLIENT_DEPARTMENT_DUPLICATE, + GET_CLIENT_DEPARTMENT_LIST, + UPDATE_CLIENT_DEPARTMENT, + +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +//import {useEffect} from "react"; + +// ==============================|| EVENT TABLE - COLUMN ||============================== // + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + } + ,...oldRows + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| CLIENT DEPARTMENT TABLE ||============================== // + +export default function ClientDepartmentTable({recordList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const { setIsUploading } = useContext(UploadContext); + // ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(-1); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_CLIENT_DEPARTMENT_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(()=>{ + setRows(recordList); + },[recordList]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateDepartment(data) { + if(data.name.trim().length === 0){ + notifyDeleteError(`Name cannot be null`); + handleEditClick(data.id); + } + else{ + axios.get(`${apiPath}${CHECK_CLIENT_DEPARTMENT_DUPLICATE}`, + { + params: { + "name": data.name.trim(), + "id": data.id + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + notifyDeleteError(`${data.name} already exists.`) + handleEditClick(data.id); + } + else if(!response.data.isTaken){ + processUpload(data); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + } + + function processUpload(data){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_CLIENT_DEPARTMENT}`, + { + "id": data.id, + "name": data.name.trim(), + }, + ) + + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + setIsUploading(false); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateDepartment(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="delete" + /> + , + + } + label="Save" + color='save' + onClick={handleSaveClick(id)} + /> + , + + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + + ]; + }, + }, + { + id: 'clientDepartmentName', + field: 'name', + headerName: 'Client Department', + flex: 1, + editable: true, + preProcessEditCellProps: (params) => { + const hasError = params.props.value.length > 255; + if(hasError){ + notifyDeleteError("Input have reach the length limit(255)") + } + return { ...params.props, error: hasError }; + }, + }, + ]; + + return ( +
+ { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + processRowUpdate={processRowUpdate} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + getRowHeight={() => 'auto'} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerClientDepartmentPage/index.js b/src/pages/lionerClientDepartmentPage/index.js new file mode 100644 index 0000000..e764a7b --- /dev/null +++ b/src/pages/lionerClientDepartmentPage/index.js @@ -0,0 +1,95 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import ClientDepartmentSearchForm from "./ClientDepartmentSearchForm"; +import ClientDepartmentTable from "./ClientDepartmentTable"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_CLIENT_DEPARTMENT_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ChannelSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_CLIENT_DEPARTMENT_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View Client Department + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default ChannelSearchPanel; diff --git a/src/pages/lionerDivisionEdit/DivisionInfoCard.js b/src/pages/lionerDivisionEdit/DivisionInfoCard.js new file mode 100644 index 0000000..c2202ac --- /dev/null +++ b/src/pages/lionerDivisionEdit/DivisionInfoCard.js @@ -0,0 +1,159 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {getComboValueByLabel, isOptionEqualToValue, isStringEmptyAfterTrim} from "../../utils/CommonFunction"; +import Autocomplete from "@mui/material/Autocomplete"; +import {BRANCH_COMBO} from "../../utils/ComboConst"; +import {isObjEmpty} from "../../utils/Utils"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +//import {useParams} from "react-router-dom"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const DivisionInfoCard = ({isCollectData, updateGroupObject,divisionData,isNewRecord,setUserConfirm,setIsCollectData}) => { + //const params = useParams(); + const [currentDivisionData, setCurrentDivisionData] = useState({}); + const [selectedBranch, setSelectedBranch] = useState(null); + const [onReady, setOnReady] = useState(false); + const {register, getValues} = useForm() + const [errors, setErrors] = useState({}); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(divisionData).length > 0 && divisionData !== undefined) { + setCurrentDivisionData(divisionData); + } + }, [divisionData]); + + useEffect(() => { + //if state data are ready and assign to different field + if (!isObjEmpty(currentDivisionData)) { + setSelectedBranch(getComboValueByLabel(BRANCH_COMBO,currentDivisionData.branch)); + setOnReady(true); + } + if(isNewRecord){ + setOnReady(true); + } + }, [currentDivisionData]); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const formErrors = {}; + + if (isStringEmptyAfterTrim(values.divisionName)) { + formErrors.divisionName = 'Division Name is required'; + } + + if (selectedBranch === null) { + formErrors.branch = 'Branch is required'; + } + + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + const objectData ={ + ...values, + branch: selectedBranch.label, + } + updateGroupObject(objectData); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + + + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + Division Name: + * + + + + + + + + + + + + + + Branch: * + + + + + { + setSelectedBranch(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + +
+
+ ); +}; + +export default DivisionInfoCard; diff --git a/src/pages/lionerDivisionEdit/SubDivisionTable.js b/src/pages/lionerDivisionEdit/SubDivisionTable.js new file mode 100644 index 0000000..dcb7c74 --- /dev/null +++ b/src/pages/lionerDivisionEdit/SubDivisionTable.js @@ -0,0 +1,243 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +//import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useEffect} from "react"; +import {CustomNoRowsOverlay, notifyDeleteError} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import DoneIcon from '@mui/icons-material/Done'; +import {GridPreProcessEditCellProps} from "@mui/x-data-grid"; +//import {useEffect} from "react"; + +// ==============================|| EVENT TABLE - COLUMN ||============================== // + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + }, + ...oldRows, + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| EVENT TABLE ||============================== // + +export default function SubDivisionTable({divisionData, isCollectData, + updateSubDivisionList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const [deletedList, setDeletedList] = React.useState([]); + + useEffect(()=>{ + setRows(divisionData); + },[divisionData]); + + useEffect(() => { + //upload latest data to parent + let allRecordSaved = true; + Object.keys(rowModesModel).forEach((id) => { + const rowMode = rowModesModel[id]; + if (rowMode.mode === GridRowModes.Edit) { + allRecordSaved = false; + } + }); + updateSubDivisionList({ + "records": rows, + "deletedList": deletedList + }, + allRecordSaved); + }, [isCollectData]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleDeleteClick = (id) => () => { + if(id >0){ + const temp = [...deletedList, id]; + setDeletedList(temp); + } + setRows(rows.filter((row) => row.id !== id)); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="delete" + /> + , + + } + label="Save" + color='create' + onClick={handleSaveClick(id)} + /> + , + + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + + ]; + }, + }, + { + id: 'subDivision', + field: 'name', + headerName: 'Sub-Division', + flex: 1, + editable: true, + preProcessEditCellProps: (params: GridPreProcessEditCellProps) => { + const hasError = params.props.value.length > 255; + if(hasError){ + notifyDeleteError("Input have reach the length limit(255)") + } + return { ...params.props, error: hasError }; + }, + }, + ]; + + return ( + { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 10}, + }, + }} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + getRowHeight={() => 'auto'} + pageSizeOptions={[10]} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + ); +} diff --git a/src/pages/lionerDivisionEdit/index.js b/src/pages/lionerDivisionEdit/index.js new file mode 100644 index 0000000..110beae --- /dev/null +++ b/src/pages/lionerDivisionEdit/index.js @@ -0,0 +1,318 @@ +// material-ui +import { + Button, + Grid, Typography +} from '@mui/material'; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {useNavigate, useParams} from "react-router-dom"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import { + CHECK_DIV_DUPLICATE, + GET_DIVISION_LIST, + UPDATE_DIVISION_PATH +} from "../../utils/ApiPathConst"; +import DivisionInfoCard from "./DivisionInfoCard"; +import SubDivisionTable from "./SubDivisionTable"; +import 'react-toastify/dist/ReactToastify.css'; +import { + GeneralConfirmWindow, getListByFieldName, notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, trimListDataBeforePost, +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import Qs from "qs"; +import MainCard from "../../components/MainCard"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const DivisionEditPage = () => { + const navigate = useNavigate(); + const params = useParams(); + const [onReady, setOnReady] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [editedDivisionData, setEditedDivisionData] = useState({}); + const [divisionData, setDivisionData] = useState({}); + const [subDivisionList, setSubDivisionList] = useState([]); + const [deletedList, setDeletedList] = React.useState([]); + const [userConfirm, setUserConfirm] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const { setIsUploading } = useContext(UploadContext); + const [validToSave, setValidToSave] = useState(true); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + function deleteData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_DIVISION_LIST}/${params.id}`, + ) + .then((response) => { + if (response.status === 200) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + setIsUploading(false); + navigate('/division'); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + function updateGroupObject(groupData) { + setEditedDivisionData(groupData); + } + + function updateSubDivisionList(tableData, isAllSaved) { + if(isCollectData){ + if(isAllSaved){ + setSubDivisionList(trimListDataBeforePost(tableData.records)); + setDeletedList(tableData.deletedList); + setValidToSave(true); + } + else{ + notifyDeleteError("Please save all sub-division name before saving division!"); + setIsCollectData(false); + setValidToSave(false); + } + } + } + + const handleCancelClick = () => { + navigate('/division'); + }; + + const submitData = () => { + setUserConfirm(true); + setIsCollectData(!isCollectData); + } + + useEffect(() => { + if(params.id > 0 ){ + axios.get(`${apiPath}${GET_DIVISION_LIST}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setDivisionData(response.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + else{ + //new record case + setDivisionData( + { + "data": {}, + "subDivision":[] + } + ); + setIsNewRecord(true); + } + + }, []); + + useEffect(() => { + if (Object.keys(divisionData).length > 0 && divisionData !== undefined) { + setOnReady(true); + } + else if(isNewRecord){ + setOnReady(true); + } + }, [divisionData]); + + useEffect(() => { + if (userConfirm && validToSave) { + const tempList = getListByFieldName(subDivisionList, 'name'); + + + const duplicates = tempList.filter((value, index) => { + return tempList.lastIndexOf(value) !== index; + }); + + if(duplicates.length === 0){ + axios.get(`${apiPath}${CHECK_DIV_DUPLICATE}`, + { + params: { + "divisionId": params.id, + "division": editedDivisionData.divisionName, + "subDivisionList": getListByFieldName(subDivisionList,'name') === null ? " " : getListByFieldName(subDivisionList,'name') + }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + if (!response.data.valid) { + let temp = ""; + if(response.data.duplicatedDivision.length >0){ + temp += response.data.duplicatedDivision; + } + + if(response.data.duplicatedSubDivision.length >0){ + if(temp.length >0){ + temp += "," + response.data.duplicatedSubDivision; + } + else{ + temp = response.data.duplicatedSubDivision; + } + } + notifyDeleteError(`${temp} already exists.`) + } else if (response.data.valid) { + processUpload(); + } + setUserConfirm(false); + setIsCollectData(false); + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else{ + notifyDeleteError(`${duplicates.toString()} have duplicated record.`) + setUserConfirm(false); + setIsCollectData(false); + } + + } + }, [editedDivisionData,validToSave]); + + function processUpload(){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_DIVISION_PATH}`, + { + "id": parseInt(params.id), + "name": editedDivisionData.divisionName.trim(), + "branch": editedDivisionData.branch, + "subDivisionList": subDivisionList, + "subDivisionDeleteList": deletedList, + }, + ) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + setIsUploading(false); + navigate('/division'); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + setUserConfirm(false); + } + + return ( + !onReady ? + + : + + + + + {isNewRecord? "Create Division" : "Maintain Division"} + + {/*col 1*/} + + + + {/*col 2*/} + + +
+ +
+
+
+ + {/*bottom button*/} + + + + + + + + + + + + + + + + + + + + +
+
+
+ ); +}; + +export default DivisionEditPage; diff --git a/src/pages/lionerDivisionSearch/DivisionSearchForm.js b/src/pages/lionerDivisionSearch/DivisionSearchForm.js new file mode 100644 index 0000000..2eb1d34 --- /dev/null +++ b/src/pages/lionerDivisionSearch/DivisionSearchForm.js @@ -0,0 +1,137 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {useNavigate} from "react-router-dom"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import {BRANCH_COMBO} from "../../utils/ComboConst"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const DivisionSearchForm = ({applySearch}) => { + const navigate = useNavigate(); + const { reset, register, handleSubmit } = useForm() + const [selectedBranch, setSelectedBranch] = useState(null); + + const onSubmit = (data) => { + const temp = { + ...data, + branch: selectedBranch === null ? "" : selectedBranch.label + }; + applySearch(temp); + }; + + function resetForm(){ + setSelectedBranch(null); + reset(); + } + + function createNewDivision(){ + navigate('/division/-1'); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + Division Name + + + + + Sub-Division Name + + + + + Branch + { + setSelectedBranch(newValue); + }} + renderInput={(params) => } + /> + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +}; + +export default DivisionSearchForm; diff --git a/src/pages/lionerDivisionSearch/DivisionTable.js b/src/pages/lionerDivisionSearch/DivisionTable.js new file mode 100644 index 0000000..5cd30b8 --- /dev/null +++ b/src/pages/lionerDivisionSearch/DivisionTable.js @@ -0,0 +1,197 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import DeleteIcon from "@mui/icons-material/DeleteOutlined"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + notifyDeleteSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_DIVISION_LIST} from "../../utils/ApiPathConst"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +//import {isObjEmpty} from "../../utils/Utils"; + +export default function DivisionTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const navigate = useNavigate(); + const { setIsUploading } = useContext(UploadContext); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_DIVISION_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 200) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + // const getRowHeight = (params) => { + // let temp = ""; + // params.model.subDivision.map(function(input){ + // temp = temp + input.name + ","; + // } + // ); + // if(!isObjEmpty(temp)){ + // const SINGLE_LINE_HEIGHT = 40; + // const HEIGHT_WITH_PADDING = 35; + // const LINE_HEIGHT = 25; // Adjust this value based on your font size and row padding + // const numberOfLines = Math.ceil(temp.length / 110); // Change 50 to your desired line length + // const height = numberOfLines < 2 ? SINGLE_LINE_HEIGHT : HEIGHT_WITH_PADDING*2 + (LINE_HEIGHT * (numberOfLines-2) ); + // //console.log(height); + // return height <= SINGLE_LINE_HEIGHT ? SINGLE_LINE_HEIGHT : height; + // } + // else { + // return 40; + // } + // }; + + const handleEditClick = (id) => () => { + navigate('/division/'+ id); + }; + + function getSubDivisionDisplay (subDivisionList){ + let tempString = ""; + for(let i = 0 ; i < subDivisionList.length ; i++){ + if (i !== subDivisionList.length-1){ + tempString = tempString + subDivisionList[i].name + ", " + } + else{ + tempString = tempString + subDivisionList[i].name + } + } + //console.log(ele.name) + return tempString + } + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + ] + }, + }, + { + id: 'division', + field: 'name', + headerName: 'Division', + flex: 0.8, + }, + { + id: 'subDivision', + field: 'subDivision', + headerName: 'Sub Division', + flex: 1.2, + // valueGetter: ({ row }) => { + // return
+ // + //
; + // }, + renderCell: (params) => ( +
+ {getSubDivisionDisplay(params.row.subDivision)} +
+ + ), + }, + ]; + + return ( +
+ 'auto'} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerDivisionSearch/LIONERDivisionIndex.js b/src/pages/lionerDivisionSearch/LIONERDivisionIndex.js new file mode 100644 index 0000000..b4895b5 --- /dev/null +++ b/src/pages/lionerDivisionSearch/LIONERDivisionIndex.js @@ -0,0 +1,96 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import DivisionSearchForm from "./DivisionSearchForm"; +import DivisionTable from "./DivisionTable"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_DIVISION_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const DivisionSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_DIVISION_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View Division + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default DivisionSearchPanel; diff --git a/src/pages/lionerDivisionSearch/SBUDivisionIndex.js b/src/pages/lionerDivisionSearch/SBUDivisionIndex.js new file mode 100644 index 0000000..1159a42 --- /dev/null +++ b/src/pages/lionerDivisionSearch/SBUDivisionIndex.js @@ -0,0 +1,97 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_SBU_DIVISION_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import AppreciationCategorySearchForm from "./SBUDivisionSearchForm"; +import SBUDivisionTable from "./SBUDivisionTable"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const SBUDivisionIndex = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_SBU_DIVISION_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + if(response.data.records !== record){ + setRecord(response.data.records); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View SBU / Division + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default SBUDivisionIndex; diff --git a/src/pages/lionerDivisionSearch/SBUDivisionSearchForm.js b/src/pages/lionerDivisionSearch/SBUDivisionSearchForm.js new file mode 100644 index 0000000..dc92c51 --- /dev/null +++ b/src/pages/lionerDivisionSearch/SBUDivisionSearchForm.js @@ -0,0 +1,77 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const CategorySearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + applySearch(data); + }; + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + SBU / Division Name + + + + + {/*last row*/} + + + + + + + + + + + + + +
+ ); +}; + +export default CategorySearchForm; diff --git a/src/pages/lionerDivisionSearch/SBUDivisionTable.js b/src/pages/lionerDivisionSearch/SBUDivisionTable.js new file mode 100644 index 0000000..7f589fa --- /dev/null +++ b/src/pages/lionerDivisionSearch/SBUDivisionTable.js @@ -0,0 +1,344 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useContext, useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_SBU_DIVISION_DUPLICATE, + GET_SBU_DIVISION_LIST, + UPDATE_SBU_DIVISION_PATH +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + } + ,...oldRows + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| CATEGORY TABLE ||============================== // + +export default function SBUDivisionTable({recordList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const { setIsUploading } = useContext(UploadContext); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_SBU_DIVISION_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(()=>{ + setRows(recordList); + },[recordList]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateCategory(data) { + if(data.name.trim().length === 0){ + notifyDeleteError(`Name cannot be null`); + handleEditClick(data.id); + } + else{ + axios.get(`${apiPath}${CHECK_SBU_DIVISION_DUPLICATE}`, + { + params: { + "name": data.name.trim(), + "id": data.id + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + notifyDeleteError(`${data.name} already exists.`) + handleEditClick(data.id); + } + else if(!response.data.isTaken){ + processUpload(data); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + + } + + function processUpload(data){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_SBU_DIVISION_PATH}`, + { + "id": data.id, + "name": data.name.trim(), + }, + ) + + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + setIsUploading(false); + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateCategory(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="error" + /> + , + + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="save" + onClick={handleSaveClick(id)} + /> + , + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + ]; + }, + }, + { + id: 'sbuDivisionName', + field: 'name', + headerName: 'SBU / Division', + flex: 1, + editable: true, + preProcessEditCellProps: (params) => { + if(params.props.value !== undefined){ + const hasError = params.props.value.length > 50; + if (hasError) { + notifyDeleteError("Input has reached the length limit (50)"); + } + return { ...params.props, error: hasError }; + } + }, + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + getRowHeight={() => 'auto'} + processRowUpdate={processRowUpdate} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[15]} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerDivisionSearch/index.js b/src/pages/lionerDivisionSearch/index.js new file mode 100644 index 0000000..36df94a --- /dev/null +++ b/src/pages/lionerDivisionSearch/index.js @@ -0,0 +1,86 @@ +import {useState} from 'react'; + +// material-ui +import { + Box, + //Box, + Tab, Tabs, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useTheme} from "@mui/material/styles"; +import LIONERDivisionIndex from "./LIONERDivisionIndex"; +import SBUDivisionIndex from "./SBUDivisionIndex"; +import {CategoryTabHeading} from "../../utils/ComboConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const CategoryPage = () => { + const [value, setValue] = useState(0);//0 for unread, 1 for readed + const theme = useTheme(); + const [tabData] = useState(CategoryTabHeading); + + //const subDivisionId = localStorage.getItem('subDivisionId'); + + function TabPanel({children, value, index, ...other}) { + return ( + + ); + } + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + + return ( + + { + + + {tabData.map(data => ( + + ))} + + + } + + + + + + + + ); +}; + +export default CategoryPage; diff --git a/src/pages/lionerEmailConfig/index.js b/src/pages/lionerEmailConfig/index.js new file mode 100644 index 0000000..333042f --- /dev/null +++ b/src/pages/lionerEmailConfig/index.js @@ -0,0 +1,318 @@ +// material-ui +import { + Button, + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {EMAIL_TEMPLATE_COMBO} from "../../utils/ComboConst"; +import Autocomplete from "@mui/material/Autocomplete"; +import {useContext, useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_SETTING_ROUTE, POST_TODO_TEST, UPDATE_SETTING_PATH, +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {useParams} from "react-router-dom"; +import {/*getComboValueByLabel,*/ isOptionEqualToValue, notifySaveSuccess} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +//import {isObjEmpty} from "../../utils/Utils"; +import {ThemeProvider} from "@emotion/react"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {isObjEmpty} from "../../utils/Utils"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const MaintainTemplatePage = () => { + const params = useParams(); + const [errors, setErrors] = useState({}); + + const { register, handleSubmit, setValue, getValues } = useForm() + const [onReady, setOnReady] = useState(false); + const { setIsUploading } = useContext(UploadContext); + + const [isCollectData, setIsCollectData] = useState(false); + const [isUserConfirm, setIsUserConfirm] = useState(false); + + const [formData, setFormData] = useState(null); + const [selectedTemplate, setSelectedTemplate] = useState(null); + + const [templateData, setTemplateData] = useState({}); + const [isEdited, setIsEdited] = useState(false); + + const onSubmit = (data) => { + setFormData(data); + setIsUserConfirm(true); + setIsCollectData(!isCollectData); + }; + + useEffect(() => { + if(isCollectData && isUserConfirm){ + + const formErrors = {}; + + if(selectedTemplate === null){ + formErrors.selectedTemplate = 'Email Template cannot be null'; + } + + if (!formData.template ) { + formErrors.template = 'Template cannot be null'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + let tempSettingList =[]; + + tempSettingList.push({ + "name": selectedTemplate.value, + "value": formData.template + }); + + axios.put(`${apiPath}${UPDATE_SETTING_PATH}`, + { + settingList: tempSettingList + }, + ) + .then((response) => { + if (response.status === 204) { + setIsEdited(false); + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + setIsUploading(false); + setIsUserConfirm(false); + setIsCollectData(false); + }, [formData]); + + // const resetForm = () => { + // reset(); + // setSelectedTemplate(null); + // } + + const testEmailTemplate = () => { + const formData = getValues(); + const formErrors = {}; + + if(selectedTemplate === null){ + formErrors.selectedTemplate = 'Email Template cannot be null'; + } + + if (!formData.emailTo ) { + formErrors.emailTo = 'Receiver cannot be null'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + + axios.get(`${apiPath}${POST_TODO_TEST}`, + { + params:{ + templateName: selectedTemplate.value, + receiver: formData.emailTo + } + }, + ) + .then((response) => { + if (response.status === 204) { + setIsEdited(false); + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + } + + useEffect(() => { + setOnReady(true); + }, [templateData]); + + function getTemplateData() { + if(!isObjEmpty(selectedTemplate)){ + axios.get(`${apiPath}${GET_SETTING_ROUTE}/${selectedTemplate.value}`) + .then((response) => { + if (response.status === 200) { + setTemplateData(response.data.data); + setValue("template", response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + + useEffect(() => { + getTemplateData(); + }, [selectedTemplate]); + + return ( + !onReady ? + + : + + + Email Template + + + +
+ + + {/*row 1*/} + + + + + + Email Template: + * + + + + { + setSelectedTemplate(newValue); + }} + disabled={params.id>0} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + Template Detail: + * + + + + + + + + + { + if(!isEdited){ + setIsEdited(true); + } + }} + multiline + maxRows={30} + id="templateName" + error={!!errors.template} + helperText={errors.template} + /> + + + + + + + + + + + + + + + + + + + + + + {/* last row */} + + + + + + + + {/**/} + {/* */} + {/* Clear*/} + {/* */} + {/**/} + + + + + +
+
+
+ +
+ + ); +}; + +export default MaintainTemplatePage; diff --git a/src/pages/lionerEventSearchPage/EventSearchForm.js b/src/pages/lionerEventSearchPage/EventSearchForm.js new file mode 100644 index 0000000..e3b9ef9 --- /dev/null +++ b/src/pages/lionerEventSearchPage/EventSearchForm.js @@ -0,0 +1,610 @@ +// material-ui +import { + Button, + Typography, + Grid, TextField, InputLabel, CardActions +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; + +import {useContext, useEffect, useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import * as React from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import { + GET_DIVISION_COMBO_LIST, GET_EVENT_EXPORT, + GET_SUB_DIVISION_COMBO_LIST, POST_SEARCH_TEMPLATE_PATH, VALIDATE_TEMPLATE_NAME_PATH, +} from "../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import { + GeneralCreateTemplateWindow, + getComboValueByIdList, getComboValueByLabel, + getIdList, isOptionEqualToValue, notifySaveSuccess, +} from "../../utils/CommonFunction"; +import Qs from 'qs'; +import {useNavigate} from "react-router"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../components/UploadProvider"; +import {EVENT_REGION_COMBO, EVENT_TYPE_COMBO} from "../../utils/ComboConst"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {isObjEmpty} from "../../utils/Utils"; +import {useLocation} from "react-router-dom"; +import AbilityContext from "../../components/AbilityProvider"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import Collapse from '@mui/material/Collapse'; +import {ExpandMore} from "@mui/icons-material"; +import ExpandMoreIcon from '@mui/icons-material/ExpandMore'; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const EventSearchForm = ({applySearch, refTemplateData, isUpdating, + setIsUpdating, getTemplateList,setExpanded,expanded,userDivision}) => { + + const navigate = useNavigate() + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const { setIsUploading } = useContext(UploadContext); + const ability = useContext(AbilityContext); + + + const [selectedRegion, setSelectedRegion] = useState(null); + const [selectedType, setSelectedType] = useState(null); + const [selectedSubDivisions, setSelectedSubDivisions] = useState([]); + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + + const [subDivisionList, setSubDivisionList] = useState([]); + const [divisionList, setDivisionList] = useState([]); + + const { setValue, reset, register, handleSubmit, getValues } = useForm() + const handleExpandClick = () => { + setExpanded(!expanded); + }; + + const [fromError, setFromError] = React.useState(null); + const [toError, setToError] = React.useState(null); + + const fromErrorMessage = React.useMemo(() => { + switch (fromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [fromError]); + + const toErrorMessage = React.useMemo(() => { + switch (toError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [toError]); + + + //=====TEMPLATE RELATED START=====// + const [refEvent, setRefEvent] = useState(null); + + useEffect(() => { + setRefEvent(refTemplateData); + }, [refTemplateData]); + + useEffect(() => { + setRefEvent(refTemplateData); + }, [subDivisionList]); + + useEffect(() => { + if(!isObjEmpty(refEvent)){ + setValue('eventName', refEvent.eventName ); + setValue('description', refEvent.description ); + setValue('organization', refEvent.organization ); + setSelectedRegion(getComboValueByLabel(EVENT_REGION_COMBO,refEvent.selectedRegion)); + setSelectedDivisions(getComboValueByIdList(divisionList,refEvent.selectedDivisions)); + setSelectedSubDivisions(getComboValueByIdList(subDivisionList,refEvent.selectedSubDivisions)); + + setSelectedType(getComboValueByLabel(EVENT_TYPE_COMBO,refEvent.selectedType)); + setFromDate( + refEvent.fromDate === null ? null : dayjs(refEvent.fromDate) + ); + setToDate( + refEvent.toDate === null ? null : dayjs(refEvent.toDate) + ); + } + else{ + resetForm(); + } + }, [refEvent]); + + //=====TEMPLATE RELATED END=====// + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + const [isTempWindowOpen, setIsTempWindowOpen] = React.useState(false); + const [templateName, setTemplateName] = React.useState(false); + + const handleTempClose = () => { + setIsTempWindowOpen(false); + }; + + function uploadTemplate(){ + setIsTempWindowOpen(false); + setIsUploading(true); + const userData = getUserData(); + const data = getValues(); + const temp = { + eventName: data.eventName, + description: data.description, + organization: data.organization, + selectedRegion: selectedRegion === null ? null : selectedRegion.label, + selectedType: selectedType === null ? null : selectedType.label, + selectedDivisions: selectedDivisions.length <1 ? [] : getIdList(selectedDivisions), + selectedSubDivisions: selectedSubDivisions.length <1 ? [] : getIdList(selectedSubDivisions), + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + }; + + let templateSet={ + id: -1, + userId: userData.id, + name: templateName.trim(), + module: "Event", + criteria: JSON.stringify(temp), + } + axios.post(`${apiPath}${POST_SEARCH_TEMPLATE_PATH}`, + templateSet, + ) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + getTemplateList(); + notifySaveSuccess(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + const createNewTemplate = () => { + setIsTempWindowOpen(true); + }; + +// ==============================|| NEW TEMPLATE WINDOW RELATED ||============================== // + + const createNewEvent = () => { + navigate(`/event/maintain/-1`); + }; + + const onSubmit = (data) => { + const temp = { + ...data, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + region: selectedRegion === null ? null : selectedRegion.label, + type: selectedType === null ? null :selectedType.label, + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + }; + applySearch(temp); + setExpanded(false); + }; + + function onExport(){ + const data = getValues(); + const temp = { + ...data, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + region: selectedRegion === null ? null : selectedRegion.label, + type: selectedType === null ? null :selectedType.label, + divisionIdList: getIdList(selectedDivisions), + subDivisionIdList: getIdList(selectedSubDivisions), + }; + setIsUploading(true); + axios.get(`${apiPath}${GET_EVENT_EXPORT}`,{ + responseType: 'blob', + params: temp, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", "event_export_"+ Date.now() + ".xlsx"); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + function getSubDivisionCombo(divisionIds){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + { + params: { + "divisionIds": divisionIds + }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + if(!isObjEmpty(refEvent) && isUpdating){ + setSelectedSubDivisions(getComboValueByIdList(response.data.records,refEvent.selectedSubDivisions)); + setIsUpdating(false); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getDivisionCombo(){ + axios.get(`${apiPath}${GET_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getDivisionCombo(); + getSubDivisionCombo(null); + const year = queryParams.get('year'); + if(year !== null){ + setFromDate( + dayjs(year+"-01-01 00:00:00") + ); + setToDate( + dayjs(year+"12-31") + ); + } + }, []); + + useEffect(() => { + const userSubDivision = queryParams.get('userSubDivision'); + if(userSubDivision === "true" && + !isObjEmpty(userDivision) && + !isObjEmpty(divisionList)){ + setSelectedDivisions(getComboValueByIdList(divisionList,[userDivision.id])); + } + }, [userDivision,divisionList]); + + // useEffect(() => { + // if(selectedDivisions !== null && selectedDivisions !== undefined){ + // const temp = selectedDivisions.length > 0 ? getIdList(selectedDivisions) : []; + // //const idList = castListToString(temp); + // getSubDivisionCombo(temp); + // } + // if(selectedDivisions.length <=0){ + // setSelectedSubDivisions([]); + // } + // }, [selectedDivisions]); + // + // useEffect(() => { + // removeInvalidSubDivision(getIdList(selectedDivisions)); + // }, [subDivisionList]); + // + // function removeInvalidSubDivision (divisionIdList){ + // let temp = selectedSubDivisions; + // let output = []; + // for(let i=0 ; i + + + {/*row 1*/} + + + Search Criteria(s) + + + + + + + + + + +
+ + {/*row 2*/} + + + Event Name + + + + + Event Description + + + + + Event Organization + + + + + Event Region + { + setSelectedRegion(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Event Type + { + setSelectedType(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Application Date From + + + + + + setFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: fromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={fromDate === null ? null : dayjs(fromDate)} + onChange={(newValue) => setFromDate(newValue)} + /> + + + + + + To + + + + + + setToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: toErrorMessage, + }, + }} + id="toDate" + //label="To Date" + value={toDate === null ? null : dayjs(toDate)} + onChange={(newValue) => setToDate(newValue)} + /> + + + + + + + + Division + { + setSelectedDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + Sub-Division + { + setSelectedSubDivisions(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {ability.can('EDIT','EVENT') ? + + + + : + + } + + + + + +
+
+ + ); +}; + +export default EventSearchForm; diff --git a/src/pages/lionerEventSearchPage/EventTable.js b/src/pages/lionerEventSearchPage/EventTable.js new file mode 100644 index 0000000..2d52487 --- /dev/null +++ b/src/pages/lionerEventSearchPage/EventTable.js @@ -0,0 +1,130 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay, dateComparator, getDateString} from "../../utils/CommonFunction"; +import AbilityContext from "../../components/AbilityProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function EventTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const navigate = useNavigate() + const ability = useContext(AbilityContext); + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/event/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + disabled={!ability.can('VIEW','EVENT')} + /> + + ] + }, + }, + { + id: 'name', + field: 'name', + headerName: 'Event Name', + flex: 2, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'eventDate', + field: 'startDate', + headerName: 'Application Date', + flex: 0.45, + sortComparator: dateComparator, + renderCell: (params) => ( +
+ {getDateString(params.row.startDate,false)} +
+ ), + }, + { + id: 'applicationDeadline', + field: 'applicationDeadline', + headerName: 'Application Deadline', + sortComparator: dateComparator, + flex: 0.5, + renderCell: (params) => ( +
+ {getDateString(params.row.applicationDeadline,false)} +
+ ), + }, + { + id: 'eventFrom', + field: 'eventFrom', + headerName: 'Event Start Date', + sortComparator: dateComparator, + flex: 0.45, + renderCell: (params) => ( +
+ {getDateString(params.row.eventFrom,false)} +
+ ), + }, + + ]; + + return ( + 'auto'} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> + ); +} diff --git a/src/pages/lionerEventSearchPage/index.js b/src/pages/lionerEventSearchPage/index.js new file mode 100644 index 0000000..2cedd87 --- /dev/null +++ b/src/pages/lionerEventSearchPage/index.js @@ -0,0 +1,231 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useContext, useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import { + GET_DIVISION_FROM_SUB_DIVISION, + GET_EVENT_PATH, + GET_SEARCH_TEMPLATE_COMBO_PATH, + GET_SEARCH_TEMPLATE_PATH +} from "../../utils/ApiPathConst"; +import * as React from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import EventTable from "./EventTable"; +import EventSearchForm from "./EventSearchForm"; +import Qs from "qs"; +import Autocomplete from "@mui/material/Autocomplete"; +import {isObjEmpty} from "../../utils/Utils"; +import {isOptionEqualToValue, notifyLoadSuccess} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {useLocation} from "react-router-dom"; +import dayjs from "dayjs"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const EventSearchPage = () => { + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const [record,setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + const [isUpdating, setIsUpdating] = useState(false); + const [expanded, setExpanded] = React.useState(true); + const userSubDivisionId = localStorage.getItem('subDivisionId'); + const [userDivision, setUserDivision] = useState(null); + + function getUserDivisionDetail(){ + axios.get(`${apiPath}${GET_DIVISION_FROM_SUB_DIVISION}`,{ + params:{ + id: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setUserDivision(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + + getUserDivisionDetail(); + }, []); + + useEffect(() => { + if(!isObjEmpty(userDivision)){ + getTemplateList(); + getEventList(true); + } + }, [userDivision]); + + useEffect(() => { + if(!isObjEmpty(searchCriteria)){ + getEventList(false); + } + }, [searchCriteria]); + + //=====TEMPLATE RELATED START=====// + const { setIsUploading } = useContext(UploadContext); + const [selectedTemplate, setSelectedTemplate] = useState(null); + const [searchTemplateList, setSearchTemplateList] = useState([]); + const [refTemplateData, setRefTemplateData] = useState(null); + + function getTemplateList(){ + const userData = getUserData(); + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_COMBO_PATH}`, { + params: { + "module": "Event", + "userId": userData.id + }, + } + ) + .then((response) => { + if (response.status === 200) { + setSearchTemplateList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + if(!isObjEmpty(selectedTemplate)){ + getTemplateDetail(); + } + else{ + setRefTemplateData(null); + } + }, [selectedTemplate]); + + function getTemplateDetail(){ + setIsUploading(true); + setIsUpdating(true); + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_PATH}/${selectedTemplate.id}`) + .then((response) => { + if (response.status === 200) { + setRefTemplateData(JSON.parse(response.data.data.criteria)); + setIsUploading(false); + notifyLoadSuccess(); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + //=====TEMPLATE RELATED END=====// + + + function getEventList(isInit){ + const userSubDivision = queryParams.get('userSubDivision'); + const year = queryParams.get('year'); + const temp = { + fromDate: year === null ? null : dayjs(year+"-01-01").format('YYYY-MM-DD'), + toDate: year === null ? null : dayjs(year+"-12-31").format('YYYY-MM-DD'), + divisionIdList: userSubDivision === "true" ? [userDivision.id] : null, + }; + axios.get(`${apiPath}${GET_EVENT_PATH}`, { + params: isInit? temp : searchCriteria, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + } + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + setOnReady(true); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + + + + + + Search Event + + + + + Search Template: + + + { + setSelectedTemplate(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + {!onReady? : + // Client Table + + +
+ +
+
+
+ } +
+
+
+ ); +}; + +export default EventSearchPage; diff --git a/src/pages/lionerGenerateReportPage/AppreciationGenerateForm.js b/src/pages/lionerGenerateReportPage/AppreciationGenerateForm.js new file mode 100644 index 0000000..644912d --- /dev/null +++ b/src/pages/lionerGenerateReportPage/AppreciationGenerateForm.js @@ -0,0 +1,207 @@ +// material-ui +import { + Button, + Grid, InputLabel, Typography, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {useContext, useState} from "react"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {GET_APPRECIATION_CASES_REPORT} from "../../utils/ApiPathConst"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import UploadContext from "../../components/UploadProvider"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AppreciationGenerateForm = () => { + const { setIsUploading } = useContext(UploadContext); + + const { handleSubmit } = useForm() + const [lnReceiptDateFrom, setLNReceiptDateFrom] = useState(null); + const [lnReceiptDateTo, setLNReceiptDateTo] = useState(null); + const [lnReceiptDateFromError, setLNReceiptDateFromError] = React.useState(null); + const [lnReceiptDateToError, setLNReceiptDateToError] = React.useState(null); + const lnReceiptDateFromErrorMessage = React.useMemo(() => { + switch (lnReceiptDateFromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [lnReceiptDateFromError]); + const lnReceiptDateToErrorMessage = React.useMemo(() => { + switch (lnReceiptDateToError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [lnReceiptDateToError]); + + const shouldDisableDateTo = (date) => { + // Disable dates with a different year or month than the selected date + if (lnReceiptDateFrom && lnReceiptDateFrom.year() !== date.year()) { + return true; + } + if (lnReceiptDateFrom && lnReceiptDateFrom.month() !== date.month()) { + return true; + } + return false; + }; + + const shouldDisableDateFrom = (date) => { + // Disable dates with a different year or month than the selected date + if (lnReceiptDateTo && lnReceiptDateTo.year() !== date.year()) { + return true; + } + if (lnReceiptDateTo && lnReceiptDateTo.month() !== date.month()) { + return true; + } + return false; + }; + + function resetForm(){ + setLNReceiptDateFrom(null); + setLNReceiptDateTo(null); + } + + const onSubmit = () => { + setIsUploading(true); + axios.get(`${apiPath}${GET_APPRECIATION_CASES_REPORT}`,{ + responseType: 'blob', + params:{ + dateFrom: dayjs(lnReceiptDateFrom).format('YYYY-MM-DD'), + dateTo: dayjs(lnReceiptDateTo).format('YYYY-MM-DD') + } + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", response.headers.filename); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + }; + + return ( + + +
+ {/*row 1*/} + + + Search Criteria(s) + + + + + {/*row 2*/} + + + LN Receipt Date From + * + + + + + + setLNReceiptDateFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: lnReceiptDateFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + maxDate={lnReceiptDateTo === null ? null : dayjs(lnReceiptDateTo)} + value={lnReceiptDateFrom === null ? null : dayjs(lnReceiptDateFrom)} + onChange={(newValue) => setLNReceiptDateFrom(newValue)} + shouldDisableDate={shouldDisableDateFrom} + /> + + + + + + To + + + + + + setLNReceiptDateToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: lnReceiptDateToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + minDate={lnReceiptDateFrom === null ? null : dayjs(lnReceiptDateFrom)} + value={lnReceiptDateTo === null ? null : dayjs(lnReceiptDateTo)} + onChange={(newValue) => setLNReceiptDateTo(newValue)} + shouldDisableDate={shouldDisableDateTo} + /> + + + + + + + + {/*last row*/} + + + + + + + + + + + + +
+
+ ); +}; + +export default AppreciationGenerateForm; diff --git a/src/pages/lionerGenerateReportPage/SummaryGenerateForm.js b/src/pages/lionerGenerateReportPage/SummaryGenerateForm.js new file mode 100644 index 0000000..06d99b5 --- /dev/null +++ b/src/pages/lionerGenerateReportPage/SummaryGenerateForm.js @@ -0,0 +1,148 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, Typography, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +import Autocomplete from "@mui/material/Autocomplete"; +import {isOptionEqualToValue} from "../../utils/CommonFunction"; +import {useContext, useState} from "react"; +import {MONTH_COMBO} from "../../utils/ComboConst"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_APPRECIATION_SUMMARY_REPORT} from "../../utils/ApiPathConst"; +import UploadContext from "../../components/UploadProvider"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const SummaryGenerateForm = ({yearComboList}) => { + const { setIsUploading } = useContext(UploadContext); + + const { handleSubmit } = useForm() + const [selectedYear , setSelectedYear] = useState(null); + const [selectedMonth , setSelectedMonth] = useState(null); + + const onSubmit = () => { + setIsUploading(true); + axios.get(`${apiPath}${GET_APPRECIATION_SUMMARY_REPORT}`,{ + responseType: 'blob', + params:{ + year: selectedYear.id, + month: selectedMonth.id + } + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", response.headers.filename); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + }; + + function resetForm(){ + setSelectedYear(null); + setSelectedMonth(null); + } + + return ( + + +
+ {/*row 1*/} + + + Search Criteria(s) + + + + {/*row 2*/} + + + + Year + * + + { + setSelectedYear(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + Month + * + + { + setSelectedMonth(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + {/*last row*/} + + + + + + + + + + + + +
+
+ ); +}; + +export default SummaryGenerateForm; diff --git a/src/pages/lionerGenerateReportPage/index.js b/src/pages/lionerGenerateReportPage/index.js new file mode 100644 index 0000000..988e315 --- /dev/null +++ b/src/pages/lionerGenerateReportPage/index.js @@ -0,0 +1,94 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import AppreciationGenerateForm from "./AppreciationGenerateForm"; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_APPRECIATION_YEAR_COMBO_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import LocaleContext from "../../components/I18nProvider"; +import SummaryGenerateForm from "./SummaryGenerateForm"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const GenerateReportPanel = () => { + + const [yearComboList, setYearComboList] = useState([]); + const [onReady, setOnReady] = useState(false); + const { setIsAdvanceDisplay } = useContext(LocaleContext); + + useEffect(() => { + getTagList(); + setIsAdvanceDisplay(false); + }, []); + + useEffect(() => { + setOnReady(true); + }, [yearComboList]); + + function getTagList() { + axios.get(`${apiPath}${GET_APPRECIATION_YEAR_COMBO_LIST}`, + ) + .then((response) => { + if (response.status === 200) { + setYearComboList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + return ( + !onReady ? + + : + + + + + + + Report 1: Appreciations Case + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + + + + + Report 2: Annex III - Summary of Appreciation Case + + + + + + {/*row 3*/} + + + + + + + ); +}; + +export default GenerateReportPanel; diff --git a/src/pages/lionerLoginLog/LoginLogSearchForm.js b/src/pages/lionerLoginLog/LoginLogSearchForm.js new file mode 100644 index 0000000..d2f2e9b --- /dev/null +++ b/src/pages/lionerLoginLog/LoginLogSearchForm.js @@ -0,0 +1,181 @@ +// material-ui +import { + Button, + Grid, TextField,InputLabel +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {useState} from "react"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const LoginLogSearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [fromError, setFromError] = React.useState(null); + const [toError, setToError] = React.useState(null); + const fromErrorMessage = React.useMemo(() => { + switch (fromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [fromError]); + + const toErrorMessage = React.useMemo(() => { + switch (toError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [toError]); + + const onSubmit = (data) => { + const temp = { + username: data.username, + ipAddr: data.ipAddr, + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + } + applySearch(temp); + }; + + function resetForm(){ + setFromDate(null); + setToDate(null); + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + + Username + + + + + + + IP Address + + + + + + + Date Period + + + + + + setFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: fromErrorMessage, + }, + }} + value={fromDate === null ? null : dayjs(fromDate)} + onChange={(newValue) => setFromDate(newValue)} + /> + + + + + + To + + + + + + setToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: toErrorMessage, + }, + }} + //label="To Date" + value={toDate === null ? null : dayjs(toDate)} + onChange={(newValue) => setToDate(newValue)} + /> + + + + + + + + + {/*last row*/} + + + + + + + + + + + + + +
+ ); +}; + +export default LoginLogSearchForm; diff --git a/src/pages/lionerLoginLog/LoginLogTable.js b/src/pages/lionerLoginLog/LoginLogTable.js new file mode 100644 index 0000000..8fee907 --- /dev/null +++ b/src/pages/lionerLoginLog/LoginLogTable.js @@ -0,0 +1,82 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, +} from "@mui/x-data-grid"; +import {useEffect} from "react"; +import {CustomNoRowsOverlay, getDateString} from "../../utils/CommonFunction"; + +export default function LoginLogTable({recordList}) { + const [rows, setRows] = React.useState([]); + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const columns = [ + { + id: 'userName', + field: 'username', + headerName: 'Username', + flex: 1, + }, + { + id: 'ipAddr', + field: 'ipAddr', + headerName: 'IP Address', + flex: 1, + }, + { + id: 'loginTime', + field: 'loginTime', + headerName: 'Login Time', + flex: 1, + renderCell: (params) => ( +
+ {getDateString(params.row.loginTime, true)} +
+ ), + sortComparator: (v1, v2) => getDateString(v1,true).localeCompare(getDateString(v2,true)) + },{ + id: 'success', + field: 'success', + headerName: 'Success', + flex: 1, + }, + + ]; + + return ( +
+ 'auto'} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 15}, + }, + }} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[15]} + autoHeight + getRowId={(row: any) => row.username + row.loginTime} + /> + +
+ ); +} diff --git a/src/pages/lionerLoginLog/index.js b/src/pages/lionerLoginLog/index.js new file mode 100644 index 0000000..04346a0 --- /dev/null +++ b/src/pages/lionerLoginLog/index.js @@ -0,0 +1,94 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import LoginLogSearchForm from "./LoginLogSearchForm"; +import LoginLogTable from "./LoginLogTable"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_USER_LOGIN_LOG_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const LoginLogSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_USER_LOGIN_LOG_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + Login Log + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + ); +}; + +export default LoginLogSearchPanel; diff --git a/src/pages/lionerMaintainApplicationPage/ApplicationForm.js b/src/pages/lionerMaintainApplicationPage/ApplicationForm.js new file mode 100644 index 0000000..638ecca --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/ApplicationForm.js @@ -0,0 +1,662 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {Dashboard} from "@uppy/react"; +import Uppy, { debugLogger } from '@uppy/core'; +//import ThumbnailGenerator from '@uppy/thumbnail-generator'; +import {useParams} from "react-router-dom"; +// Don't forget the CSS: core and the UI components + plugins you are using. +import '@uppy/core/dist/style.min.css'; +import '@uppy/dashboard/dist/style.min.css'; +import '@uppy/webcam/dist/style.min.css'; +//import * as XLSX from 'xlsx'; +import { + convertXmlToObject, + getComboValueByIdList, + getComboValueByLabel, + getDeletedRecordWithRefList, + getIdList, getNewRecordWithRefList, isOptionEqualToValue, isStringEmptyAfterTrim +} from "../../utils/CommonFunction"; +import Autocomplete from "@mui/material/Autocomplete"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_APPLICATION_DUPLICATE, + GET_LDAP_USER_LIST, GET_SUB_DIVISION_COMBO_LIST, + GET_TAG_COMBO_LIST +} from "../../utils/ApiPathConst"; +import {GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {isObjEmpty} from "../../utils/Utils"; +import {APPLICATION_STATUS_COMBO} from "../../utils/ComboConst"; +import {parseString} from "xml2js"; +import Qs from "qs"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {useLocation} from "react-router"; + +const uppyDashboard = new Uppy({ + autoProceed: true, + logger: debugLogger, + hideUploadButton: true, + restrictions: { + maxFileSize: 512 * 1024 * 1024, // 512 MB in bytes + }, + }) + //.use(ThumbnailGenerator, {thumbnailWidth: 200}) + //.use(XHR, { endpoint: 'https://your-domain.com/upload' }) + ; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ApplicationForm = ({eventDetail, applicationDetail, updateApplicationDetail, + isNewRecord, isCollectData, eventName, + refTagList, refSubDivisionList, + setIsCollectData, setUserConfirm, isEditing, + usedFileSize,videoCount,responseError +}) => { + const params = useParams(); + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + const [fileErrors, setFileErrors] = useState({}); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + + const {register, getValues, setValue} = useForm(); + const [selectedStatus, setSelectedStatus] = useState(null); + const [selectedOfficer, setSelectedOfficer] = useState(null); + const [selectedSubDivision, setSelectedSubDivision] = useState([]); + const [selectedTags, setSelectedTags] = useState([]); + + const [subDivisionList, setSubDivisionList] = useState([]); + const [tagList, setTagList] = useState([]); + const [isTagFetched, setIsTagFetched] = useState(false); + const [refApplication, setRefApplication] = useState(null); + + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const handleLocationCodeChange = (event, value) => { + setSelectedOfficer({ + label: value, + }); + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value, false); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + // Function to fetch user name options based on locationCode + const fetchLotusUserList = async (input, isInit) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + if(!isObjEmpty(refApplication) && isInit){ + setSelectedOfficer({ + label: applicationDetail.responsibleOfficer, + }); + } + setLotusNoteUserList(convertXmlToObject(result.RECORDS.RECORD)); + }); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + uppyDashboard.on('file-added', (/*file*/) => { + uppyDashboard.setOptions({ + hideUploadButton: true, + }); + }); + + useEffect(()=>{ + //if combo list ready + if (isTagFetched && subDivisionList.length >0) { + setRefApplication(applicationDetail); + } + },[subDivisionList,isTagFetched]); + + useEffect(()=>{ + //if ref data ready + if (!isObjEmpty(refApplication)) { + uppyDashboard.cancelAll() + if(refId !== null){ + setValue("name", refApplication.name); + setValue("description", refApplication.description); + } + //const locationCode = refApplication.responsibleOfficer.split('(')[1].replace(')',''); + fetchLotusUserList( refApplication.responsibleOfficer, true); + setSelectedTags(getComboValueByIdList(tagList,refTagList)); + setSelectedSubDivision(getComboValueByIdList(subDivisionList,refSubDivisionList)); + setSelectedStatus(getComboValueByLabel(APPLICATION_STATUS_COMBO,refApplication.status)); + } + },[refApplication]); + + useEffect(()=>{ + //if form data ready + if( + !isObjEmpty(applicationDetail) && + subDivisionList.length > 0 && + !isObjEmpty(selectedStatus) && + !isObjEmpty(selectedOfficer) + ){ + setOnReady(true); + } + else if(params.id <0 && refId === null){ + setOnReady(true); + } + },[subDivisionList,applicationDetail, selectedStatus, selectedOfficer]); + + useEffect(()=>{ + if(!isObjEmpty(applicationDetail)){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`,{ + // axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_FOR_APPLICATION_LIST}`,{ + // params: { + // //"eventId": applicationDetail.eventId + // }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + else if(isNewRecord){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`,{ + // axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_FOR_APPLICATION_LIST}`,{ + // params: { + // "eventId": params.eventId + // }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + },[applicationDetail]) + + useEffect(() => { + uppyDashboard.cancelAll(); + //if state data are ready and assign to different field + axios.get(`${apiPath}${GET_TAG_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setIsTagFetched(true); + setTagList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + if(isNewRecord && refId === null){ + setOnReady(true); + } + }, []); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const uploadFileList = []; + const fileList = uppyDashboard.getFiles(); + + const files = uppyDashboard.getFiles(); + if(files.length > 0) { + for (const file of fileList) { + uploadFileList.push(file.data); + } + } + + // console.log(usedFileSize); + // console.log(videoCount); + let totalSize = files.reduce((total, file) => total + file.size, 0); + totalSize = totalSize/1024/1024; + const videoFiles = files.filter(file => + file.type.startsWith('video/') || /\.(mp4|mov|avi|mkv)$/i.test(file.name) + ); + const videoAttachCount = videoFiles.length; + const formErrors = {}; + + const fileErrors = {}; + if(totalSize + usedFileSize > 100.0){ + formErrors.fileSize = '-The total size of attachments exceeds the limit. Please notice that the size of the attachment is limited to 100MB per application and 500MB per award. You can only attach ' + Math.floor(100-usedFileSize) + " MB file more."; + fileErrors.fileSize = '-The total size of attachments exceeds the limit. Please notice that the size of the attachment is limited to 100MB per application and 500MB per award. You can only attach ' + Math.floor(100-usedFileSize) + " MB file more."; + + } + if(videoCount >= 1 && videoAttachCount >= 1){ + formErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + fileErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + } + if(videoAttachCount>1){ + formErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + fileErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + } + + if (isStringEmptyAfterTrim(values.name)) { + formErrors.name = 'Application Name is required'; + } + + if (selectedStatus == null){ + formErrors.status = 'Status is required'; + } + + if (selectedOfficer == null){ + formErrors.officer = 'Officer is required'; + } + + if (selectedSubDivision.length <= 0){ + formErrors.subDivision = 'Sub-Division is required'; + } + + setFileErrors(fileErrors); + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + axios.get(`${apiPath}${CHECK_APPLICATION_DUPLICATE}`, + { + params: { + "name": values.name, + "id": params.id, + "eventId": isNewRecord? params.eventId : refApplication.eventId, + }, + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if(response.data.isTaken){ + formErrors.name = 'Application name must be unique.'; + setErrors(formErrors); + setIsCollectData(false); + setUserConfirm(false); + } + else if(!response.data.isTaken){ + if (Object.keys(formErrors).length === 0) { + let formData = new FormData(); + formData.append("id", isNewRecord ? params.id : refApplication.id); + formData.append("eventId", isNewRecord ? params.eventId : refApplication.eventId); + formData.append("eventName", values.eventName); + formData.append("description", values.description === null ? "" : values.description.trim()); + formData.append("name", values.name.trim()); + formData.append("responsibleOfficer", selectedOfficer == null ? "" : selectedOfficer.label.trim()); + formData.append("status", selectedStatus == null ? "" : selectedStatus.label); + formData.append("subDivisionIdList", isNewRecord ? getIdList(selectedSubDivision) : selectedSubDivision == null ? [] : getNewRecordWithRefList(refSubDivisionList,getIdList(selectedSubDivision))); + formData.append("subDivisionRemoveIdList", isNewRecord ? [] : selectedSubDivision == null ? [] : getDeletedRecordWithRefList(refSubDivisionList,getIdList(selectedSubDivision))); + formData.append("tagIdList", isNewRecord ? (selectedTags === null ? [] : getIdList(selectedTags)) : (selectedTags === null ? [] : getNewRecordWithRefList(refTagList,getIdList(selectedTags)))); + formData.append("tagRemoveIdList", isNewRecord? [] : selectedTags == null ? [] : getDeletedRecordWithRefList(refTagList,getIdList(selectedTags))); + for (const file of uploadFileList) { + formData.append("files",file); + } + updateApplicationDetail(formData); + } + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + }, [isCollectData]); + + useEffect(() => { + setErrors(responseError); + }, [responseError]); + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + Event Name: + + + + + + {isNewRecord? eventDetail.name : eventName} + + + + + + + + + + + Application Name: + + * + + + + + + + + + + + + + + Application Description: + + + + + + + + + + + + + + + Status: + + * + + + + + { + setSelectedStatus(newValue); + }} + disabled={!isEditing} + renderInput={(params) => + } + isOptionEqualToValue={isOptionEqualToValue} + + /> + + + + + + + + + + Responsible Officer: + + * + + + + + { + setSelectedOfficer(newValue); + // if(lotusNoteUserList.length >0){ + // if(newValue !== null){ + // if(getComboValueByLabel(lotusNoteUserList, newValue.label) !== null){ + // setSelectedOfficer(newValue); + // } + // } + // else{ + // setSelectedOfficer(null); + // } + // } + }} + disabled={!isEditing} + renderInput={(params) => + } + //isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + + Sub-Divisions: + + * + + + + + option.label} + onChange={(event, newValue) => { + setSelectedSubDivision(newValue); + }} + disabled={!isEditing} + renderInput={(params) => ( + + {errors.subDivision.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + {...params} + placeholder="" + disabled={!isEditing} + /> + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Tags: + + + + + option.label} + onChange={(event, newValue) => { + setSelectedTags(newValue); + }} + disabled={!isEditing} + renderInput={(params) => ( + + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + { + isEditing ? + + { + fileErrors.fileSize ? +
+ {fileErrors.fileSize} +
+ : + undefined + } + { + fileErrors.fileRef ? +
+ {fileErrors.fileRef} +
+ : + undefined + } +
+ + You may upload supplementary material for record, including relevant photos or document + +
+ +
+ : + undefined + } + +
+
+
+ ); +}; + +export default ApplicationForm; diff --git a/src/pages/lionerMaintainApplicationPage/AwardTable.js b/src/pages/lionerMaintainApplicationPage/AwardTable.js new file mode 100644 index 0000000..c1f6047 --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/AwardTable.js @@ -0,0 +1,143 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect, useRef} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay, getDateString} from "../../utils/CommonFunction"; +import AbilityContext from "../../components/AbilityProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function AwardTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const ability = useContext(AbilityContext); + + const navigate = useNavigate() + + const gridRef = useRef(null); + /*useEffect(() => { + const handleResize = () => { + if (gridRef.current) { + gridRef.current.updateSize(); // Manually trigger layout recalculation + } + }; + + window.addEventListener('resize', handleResize); + + return () => { + window.removeEventListener('resize', handleResize); + }; + }, []);*/ + + useEffect(() => { + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/award/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + disabled={!ability.can('VIEW','AWARD')} + /> + + ] + }, + }, + { + id: 'awardName', + field: 'name', + headerName: 'Award', + flex: 1.3, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'subDivisions', + field: 'subDivisions', + //type: 'date', + //sortable: false, + headerName: 'Sub-Divisions', + flex: 1, + }, + { + id: 'receiveDate', + field: 'receiveDate', + headerName: 'Received Date', + flex: 0.7, + renderCell: (params) => ( +
+ {getDateString(params.row.receiveDate)} +
+ ), + sortComparator: (v1, v2) => getDateString(v1,true).localeCompare(getDateString(v2,true)) + }, + { + id: 'storageLocation', + field: 'storageLocation', + headerName: 'Storage Location', + flex: 1, + }, + { + id: 'responsibleOfficer', + field: 'responsibleOfficer', + headerName: 'Responsible Officer', + flex: 1, + }, + ]; + + return ( +
+ 'auto'} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 5}, + }, + }} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[5]} + autoHeight + /> +
+ ); +} diff --git a/src/pages/lionerMaintainApplicationPage/ExternalRefGrid.js b/src/pages/lionerMaintainApplicationPage/ExternalRefGrid.js new file mode 100644 index 0000000..6de5d3c --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/ExternalRefGrid.js @@ -0,0 +1,301 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_APPLICATION_EXTERNAL_REF_PATH, + UPDATE_APPLICATION_EXTERNAL_REFERENCE_PATH, +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, notifyDeleteError, //getObjectById, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +//import AbilityContext from "../../components/AbilityProvider"; + +let count = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel, canEdit} = props; + console.log(canEdit ); + //const ability = useContext(AbilityContext); + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + }, + ...oldRows, + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'remarks'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| EXTERNAL REFERENCE TABLE ||============================== // + +export default function ExternalRefGrid({applicationId, canEdit}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + //const ability = useContext(AbilityContext); + //const [canUserEdit] = React.useState(!ability.can('EDIT','APPLICATION')); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + useEffect(() => { + if(applicationId > 0 ){ + axios.get(`${apiPath}${GET_APPLICATION_EXTERNAL_REF_PATH}/${applicationId}`) + .then((response) => { + if (response.status === 200) { + setRows(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + }, [applicationId]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + axios.delete(`${apiPath}${GET_APPLICATION_EXTERNAL_REF_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'remarks'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'remarks'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateChannel(data) { + axios.post(`${apiPath}${UPDATE_APPLICATION_EXTERNAL_REFERENCE_PATH}`, + { + "id": data.id, + "remarks" : data.remarks, + "refId" : applicationId + }, + ) + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.remarks.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateChannel(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + } + label="Cancel" + className="textPrimary" + disabled={canEdit} + onClick={handleCancelClick(id)} + color="error" + />, + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="primary" + disabled={canEdit} + onClick={handleSaveClick(id)} + />, + ]; + } + + return [ + } + label="Delete" + disabled={canEdit} + onClick={handleDeleteClick(id)} + color="error" + />, + } + label="Edit" + className="textPrimary" + disabled={canEdit} + onClick={handleEditClick(id)} + color="warning" + />, + ]; + }, + }, + { + id: 'extRef', + field: 'remarks', + headerName: 'External Attachment Reference', + flex: 1, + editable: true, + renderCell: (params) => ( + + {params.value} + + ), + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Link cannot be null`); + }} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 10}, + }, + }} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[5,10, 20]} + slotProps={{ + toolbar: {setRows, setRowModesModel, canEdit}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerMaintainApplicationPage/FilePreviewGrid.js b/src/pages/lionerMaintainApplicationPage/FilePreviewGrid.js new file mode 100644 index 0000000..433ca72 --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/FilePreviewGrid.js @@ -0,0 +1,227 @@ +// material-ui +import React, {useContext, useEffect, useState} from 'react'; +import MainCard from "../../components/MainCard"; +import Image from "mui-image"; +import {Box, CardContent, Grid, Typography} from "@mui/material"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {DELETE_FILE_PATH, GET_FILE_PATH,} from "../../utils/ApiPathConst"; +import IconButton from '@mui/material/IconButton'; +import ClearIcon from '@mui/icons-material/Clear'; +import {GENERAL_INFO_COLOR, GENERAL_RED_COLOR, GENERAL_SETTING_COLOR} from "../../themes/colorConst"; +import { + GeneralConfirmWindow, + notifyDeleteSuccess, + //removeObjectWithId, + UploadFileWindow +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +//import AbilityContext from "../../components/AbilityProvider"; +import 'assets/style/imageOverlay.css'; +import DownloadIcon from '@mui/icons-material/Download'; +import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded'; +import doc from 'assets/images/display/doc.png'; + +// material-ui + +const FilePreviewGrid = ({fileList, reloadList, canEdit}) => { + + const [imageList, setImageList] = useState([]); + const { setIsUploading } = useContext(UploadContext); + //const ability = useContext(AbilityContext); + + useEffect(() => { + setImageList(fileList); + }, [fileList]); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const [isUploadWindowOpen, setIsUploadWindowOpen] = React.useState(false); + const [selectedVideo, setSelectedVideo] = React.useState({}); + + const handleUploadWindowClose = () => { + setIsUploadWindowOpen(false); + }; + + const handleUploadWindowSuccess = () =>{ + setIsUploadWindowOpen(false); + reloadList(); + } + + const handleUploadThumbnail = (video) => () =>{ + setIsUploadWindowOpen(true); + setSelectedVideo(video); + } + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = (fileId) => () =>{ + setIsWindowOpen(true); + setSelectedId(fileId); + } + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${DELETE_FILE_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 200) { + notifyDeleteSuccess(); + //const newList =removeObjectWithId(imageList,selectedId); + setIsUploading(false); + reloadList(); + setIsWindowOpen(false); + //setImageList(newList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + + const downloadFile = (fileId, skey, filename) => () => { + setIsUploading(true); + axios.get(`${apiPath}${GET_FILE_PATH}/${fileId}/${skey}/${filename}`,{ responseType: 'blob' }) + .then((response) => { + if (response.status === 200) { + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", filename); + link.click(); + setIsUploading(false); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }; + + return ( + + + + {imageList.map((thumbnail ) => { + // Return the element. Also pass key + return ( + + + { + !canEdit? + + + + + + + + + + + + + : + undefined + } + + +
+ + +
+ +
+
+
+
+ + + + + + {thumbnail.filename} + + + + + + { + thumbnail.remarks === "" || thumbnail.remarks === null ? + + : + + + + Description: + + + + + {thumbnail.remarks.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + + + } + +
+
+
) + })} +
+ + +
+
+ ); +}; + +export default FilePreviewGrid; diff --git a/src/pages/lionerMaintainApplicationPage/FileRefCard.js b/src/pages/lionerMaintainApplicationPage/FileRefCard.js new file mode 100644 index 0000000..73a9a45 --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/FileRefCard.js @@ -0,0 +1,84 @@ +// material-ui +import React, { useState} from 'react'; +import MainCard from "../../components/MainCard"; +import {Box, Tab, Tabs} from "@mui/material"; +import {TabHeading} from "./TabConst"; +import {useTheme} from "@mui/material/styles"; +import FilePreviewGrid from "./FilePreviewGrid"; +import ExternalRefGrid from "./ExternalRefGrid"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; + + +// material-ui + +// ==============================|| TAB PANEL RELATED ||============================== // +function TabPanel({children, value, index, ...other}) { + return ( + + ); +} + +// ==============================|| TAB PANEL RELATED ||============================== // + +const FileRefCard = ({thumbnailList, applicationId, reloadList,canEdit}) => { + const [tabData] = useState(TabHeading); + const [value, setValue] = useState(0); + const theme = useTheme(); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + + + + {tabData.map(data => ( + + ))} + + + {tabData.map(data => ( + + {data.key === 1 ? + + : + + + } + + ))} + + + ); +}; + +export default FileRefCard; diff --git a/src/pages/lionerMaintainApplicationPage/FileUploadCard.js b/src/pages/lionerMaintainApplicationPage/FileUploadCard.js new file mode 100644 index 0000000..4e62693 --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/FileUploadCard.js @@ -0,0 +1,12 @@ +// material-ui +import React from 'react'; + + +export default function FileUploadCard() { + + + return ( +
+
+ ); +} diff --git a/src/pages/lionerMaintainApplicationPage/TabConst.js b/src/pages/lionerMaintainApplicationPage/TabConst.js new file mode 100644 index 0000000..a88f129 --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/TabConst.js @@ -0,0 +1,10 @@ +export const TabHeading = [ + { + key: 1, + name: 'Attachment(s)' + }, + { + key: 2, + name: 'External Link(s)' + } +]; \ No newline at end of file diff --git a/src/pages/lionerMaintainApplicationPage/index.js b/src/pages/lionerMaintainApplicationPage/index.js new file mode 100644 index 0000000..ab163e9 --- /dev/null +++ b/src/pages/lionerMaintainApplicationPage/index.js @@ -0,0 +1,649 @@ +// material-ui +import { + Box, Button, + Grid, Typography +} from '@mui/material'; +import ApplicationForm from "./ApplicationForm"; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_APPLICATION_AWARD_PATH, + GET_APPLICATION_FILE_PATH, + GET_APPLICATION_PATH, + GET_APPLICATION_STORAGE_SIZE, + GET_APPLICATION_VIDEO_EXIST, GET_EVENT_COMBO_PATH, + GET_EVENT_PATH, + GET_SUB_DIVISION_COMBO_LIST, + GET_THUMBNAIL_PATH, + POST_APPLICATION_PATH +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import { + GeneralComboWindow, + GeneralConfirmWindow, + getObjectById, isUserDivisionIdInList, notifyDeleteError, + notifyDeleteSuccess, notifyNoPermission, + notifySaveSuccess +} from "../../utils/CommonFunction"; +import FileRefCard from "./FileRefCard"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import {useNavigate, useParams} from "react-router-dom"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../components/UploadProvider"; +import MainCard from "../../components/MainCard"; +import AwardTable from "./AwardTable"; +import AbilityContext from "../../components/AbilityProvider"; + +import {isObjEmpty} from "../../utils/Utils"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {useLocation} from "react-router"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ApplicationPanel = () => { + const params = useParams(); + const navigate = useNavigate() + const { setIsUploading } = useContext(UploadContext); + const ability = useContext(AbilityContext); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + + const [userEventComboList, setUserEventComboList] = useState([]); + const [selectedEvenet, setSelectedEvent] = useState(null); + const [isCopyWindowOpen, setIsCopyWindowOpen] = React.useState(false); + const handleCopyClose = () => { + setIsCopyWindowOpen(false); + }; + + function updateCopyData(){ + setIsCopyWindowOpen(false); + navigate(`/application/maintain/-1/${selectedEvenet.id}?refId=${params.id}`); + } + + const createNewApplication = () => { + setIsCopyWindowOpen(true); + }; + + const [onReady, setOnReady] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [userConfirm, setUserConfirm] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const [applicationDetail, setApplicationDetail] = useState({}); + const [subDivisionCombo, setSubDivisionCombo] = useState([]); + const [refFileList, setRefFileList] = useState([]); + const [refTagList, setRefTagList] = useState([]); + const [refSubDivisionList, setRefSubDivisionList] = useState([]); + const [thumbnailList, setThumbnailList] = useState([]); + const [eventDetail, setEventDetail] = useState({}); + const [awardList, setAwardList ] = useState([]); + const [isEditing, setIsEditing] = useState(false); + const [usedFileSize, setUsedFileSize ] = useState(0); + const [videoCount, setVideoCount ] = useState(0); + const [responseError, setResponseError] = useState({}); + const [eventName, setEventName] = useState(""); + //const [tagCombo, setTagCombo] = useState({}); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + const createNewAward = () =>{ + navigate(`/award/maintain/-1/${applicationDetail.eventId}/${applicationDetail.id}`); + } + function updateData(){ + if(awardList.length > 0 || refFileList.length > 0){ + notifyDeleteError("Delete restricted. Attachment exists in this application.") + setIsWindowOpen(false); + } + else{ + axios.delete(`${apiPath}${GET_APPLICATION_PATH}/${params.id}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + returnSearchPage(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + function updateApplicationDetail(applicationData) { + setApplicationDetail(applicationData); + } + + function getUserEventCombo(){ + axios.get(`${apiPath}${GET_EVENT_COMBO_PATH}`,{ + params:{ + userSubDivisionId: ability.can('EDIT','ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + }) + .then((response) => { + if (response.status === 200) { + setUserEventComboList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + if(refId !== null){ + setIsEditing(true); + setIsNewRecord(true); + getApplicationDetail(refId); + getEventDetail(); + } + else if(params.id<0){ + if(!ability.can('EDIT','APPLICATION')){ + notifyNoPermission(); + navigate('/'); + } + setIsEditing(true); + setIsNewRecord(true); + getEventDetail(); + } + else{ + getApplicationDetail(params.id); + getAwardList(); + } + getGroupList(); + getFileList(); + getUserEventCombo(); + }, []); + + useEffect(() => { + if (Object.keys(subDivisionCombo).length > 0 + && subDivisionCombo !== undefined + && !isObjEmpty(applicationDetail) + && (!isObjEmpty(thumbnailList) || refFileList.length === 0) + ) { + setOnReady(true); + } + else if(isNewRecord && Object.keys(eventDetail).length > 0){ + setOnReady(true); + } + }, [subDivisionCombo,applicationDetail, eventDetail, thumbnailList, refFileList]); + + function reloadData(){ + getApplicationDetail(params.id); + getGroupList(); + getFileList(); + } + + function reloadList(){ + getFileList(); + } + + function returnSearchPage(){ + navigate('/application'); + } + + const submitData = () => { + setUserConfirm(true); + setIsCollectData(!isCollectData); + } + + const updateIsEdit = () => { + setIsEditing(!isEditing); + } + + useEffect(() => { + if (userConfirm && onReady) { + postApplication(); + } + setUserConfirm(false); + }, [applicationDetail]); + + function postApplication(){ + setIsUploading(true); + axios.post(`${apiPath}${POST_APPLICATION_PATH}`, + applicationDetail, + { + headers: { + 'Content-Type': 'multipart/form-data', + } + } + ) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + setIsEditing(false); + if(isNewRecord){ + setIsUploading(false); + navigate('/application') + } + else{ + setIsUploading(false); + reloadData(); + } + setIsCollectData(!isCollectData); + + } + }) + .catch(error => { + if (error.response.status === 422){ + const formErrors = {}; + formErrors.subDivision = error.response.data.error; + setIsUploading(false); + setUserConfirm(false); + setIsCollectData(false); + setResponseError(formErrors); + } + else{ + setIsUploading(false); + setUserConfirm(false); + setIsCollectData(false); + notifyDeleteError("Server busy, please try again later."); + } + console.log(error); + return false; + }); + } + + function getEventDetail() { + axios.get(`${apiPath}${GET_EVENT_PATH}/${params.eventId}`, + ) + .then((response) => { + if (response.status === 200) { + setEventDetail(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getGroupList() { + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + ) + .then((response) => { + if (response.status === 200) { + setSubDivisionCombo(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getAwardList() { + const byDivision = { + applicationId: params.id, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + axios.get(`${apiPath}${GET_APPLICATION_AWARD_PATH}`, + { + params: byDivision, + } + ) + .then((response) => { + if (response.status === 200) { + setAwardList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getFileList() { + axios.get(`${apiPath}${GET_APPLICATION_FILE_PATH}/${params.id}`, + ) + .then((response) => { + if (response.status === 200) { + setRefFileList(response.data.records); + if(response.data.records.length >0){ + setThumbnailList([]); + setOnReady(false); + } + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getApplicationDetail(applicationId){ + axios.get(`${apiPath}${GET_APPLICATION_PATH}/${applicationId}`, + ) + .then((response) => { + if (response.status === 200) { + setApplicationDetail(response.data.data); + setEventName(response.data.data.eventName) + setRefTagList(response.data.tagList); + setRefSubDivisionList(response.data.subDivisionList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + const tempList = []; + if (refFileList.length > 0) { + // for(let i=0 ; i < refFileList.length ; i++){ + // axios.get(`${apiPath}${GET_THUMBNAIL_PATH}/${refFileList[i].id}/${refFileList[i].skey}/${refFileList[i].filename}`, + // { responseType: 'blob' }) + // .then((response) => { + // if (response.status === 200) { + // const tempURL = URL.createObjectURL(new Blob([response.data],{type: refFileList[i].mimetype})); + // if(getObjectById(thumbnailList,refFileList[i].filename) === null){ + // tempList.push({ + // "id": refFileList[i].id, + // "fileId": refFileList[i].id, + // "skey": refFileList[i].skey, + // "mimetype": refFileList[i].mimetype.split('/')[0], + // "key": refFileList[i].filename, + // "remarks": refFileList[i].remarks, + // "src": tempURL, + // "fileSize": response.data.size, + // }); + // setThumbnailList([...tempList]); + // } + // } + // }) + // .catch(error => { + // console.log(error); + // return false; + // }); + // } + const promises = refFileList.reduce((accumulator, refFile) => { + const promise = axios + .get(`${apiPath}${GET_THUMBNAIL_PATH}/${refFile.id}/${refFile.skey}/${refFile.filename}`, { responseType: 'blob' }) + .then((response) => { + if (response.status === 200) { + const tempURL = URL.createObjectURL(new Blob([response.data], { type: refFile.mimetype })); + if (getObjectById(thumbnailList, refFile.filename) === null) { + const thumbnail = { + id: refFile.id, + fileId: refFile.id, + skey: refFile.skey, + key: refFile.filename + refFile.id, + filename: refFile.filename, + mimetype: refFile.mimetype.split('/')[0], + remarks: refFile.remarks, + src: tempURL, + fileSize: response.data.size + }; + return thumbnail; + } + } + }) + .catch((error) => { + console.log(error); + // create a empty thumbnail object instead of block the form load + const thumbnail = { + id: refFile.id, + fileId: refFile.id, + skey: refFile.skey, + key: refFile.filename + refFile.id, + filename: refFile.filename, + mimetype: refFile.mimetype.split('/')[0], + remarks: refFile.remarks, + fileSize: 0 + }; + return thumbnail; + }); + + accumulator.push(promise); + return accumulator; + }, []); + + Promise.all(promises) + .then((thumbnails) => { + const filteredThumbnails = thumbnails.filter((thumbnail) => thumbnail !== false); + const arrCopy = Array.from(filteredThumbnails); + arrCopy.sort((a, b) => a.key.localeCompare(b.key)); + setThumbnailList([...arrCopy]); + }) + .catch((error) => { + console.log(error); + }); + } + else { + setThumbnailList(tempList); + } + + axios.get(`${apiPath}${GET_APPLICATION_STORAGE_SIZE}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setUsedFileSize(response.data.size); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + axios.get(`${apiPath}${GET_APPLICATION_VIDEO_EXIST}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setVideoCount(response.data.count); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + setThumbnailList([...tempList]); + }, [refFileList]); + + return ( + !onReady ? + + : + + + + + + + {isNewRecord? "New Application" : "Maintain Application"} + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + { + (isEditing ) ? + + + + + + + + + + + + + + + + + + + + { + ability.can('EDIT','AWARD')? + + + + + + + + + + + + + + + + + + : + + } + + + + + : + + + + + + + + + + + + + + } + + {/*row 3*/} + { + params.id > 0 ? + + + {/**/} + + : + + } + + + {/* row 4 */} + { + params.id > 0 ? + + + + + + : + undefined + } + + + ); +}; + +export default ApplicationPanel; diff --git a/src/pages/lionerMaintainAppreciationPage/AppreciationForm.js b/src/pages/lionerMaintainAppreciationPage/AppreciationForm.js new file mode 100644 index 0000000..75fce11 --- /dev/null +++ b/src/pages/lionerMaintainAppreciationPage/AppreciationForm.js @@ -0,0 +1,887 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {Dashboard} from "@uppy/react"; +import Uppy, { debugLogger } from '@uppy/core'; +import {useParams} from "react-router-dom"; +import '@uppy/core/dist/style.min.css'; +import '@uppy/dashboard/dist/style.min.css'; +import '@uppy/webcam/dist/style.min.css'; +import { + getComboValueById, + getComboValueByIdList, getComboValueByLabel, + //getComboValueByLabel, + getDateString, + getIdList, getJSONIdList, isOptionEqualToValue, isStringEmptyAfterTrim +} from "../../utils/CommonFunction"; +import Autocomplete from "@mui/material/Autocomplete"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_APPRECIATION_CATEGORY_COMBO_LIST, + GET_CLIENT_DEPARTMENT_COMBO_LIST, + GET_SBU_DIVISION_COMBO_LIST, +} from "../../utils/ApiPathConst"; +import {GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {isObjEmpty} from "../../utils/Utils"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; + +const uppyDashboard = new Uppy({ + autoProceed: true, + logger: debugLogger, + hideUploadButton: true, + restrictions: { + maxFileSize: 10 * 1024 * 1024, // 10 MB in bytes + }, + }) +; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AppreciationForm = ({appreciationDetail, updateAppreciationDetail, + isNewRecord, isCollectData, + setIsCollectData, setUserConfirm, isEditing, + usedFileSize, recordId +}) => { + const params = useParams(); + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + const [fileErrors, setFileErrors] = useState({}); + const {register, getValues, setValue} = useForm(); + + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [selectedDepartment, setSelectedDepartment] = useState(null); + const [selectedCategory, setSelectedCategory] = useState(null); + + const [receiptDate, setReceiptDate] = useState(null); + const [receiptDateError, setReceiptDateError] = React.useState(null); + const receiptDateErrorMessage = React.useMemo(() => { + switch (receiptDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [receiptDateError]); + + const [clientReplyDate, setClientReplyDate] = useState(null); + const [clientReplyDateError, setClientReplyDateError] = React.useState(null); + const clientReplyDateErrorMessage = React.useMemo(() => { + switch (clientReplyDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [clientReplyDateError]); + + const [staffReplyDate, setStaffReplyDate] = useState(null); + const [staffReplyDateError, setStaffReplyDateError] = React.useState(null); + const staffReplyDateErrorMessage = React.useMemo(() => { + switch (staffReplyDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [staffReplyDateError]); + + const [lnReceiptDate, setLNReceiptDate] = useState(null); + const [lnReceiptDateError, setLNReceiptDateError] = React.useState(null); + const lnReceiptDateErrorMessage = React.useMemo(() => { + switch (lnReceiptDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [lnReceiptDateError]); + + const [sbuDivisionList, setSBUDivisionList] = useState([]); + const [isSBUFetched, setisSBUFetched] = useState(false); + + const [departmentList, setDepartmentList] = useState([]); + const [categoryList, setCategoryList] = useState([]); + + const [orgInput, setOrgInput] = useState(""); + + uppyDashboard.on('file-added', (/*file*/) => { + uppyDashboard.setOptions({ + hideUploadButton: true, + }); + }); + + const handleChange = (event) => { + // Handle the changes here + const newValue = event.target.value; + console.log(newValue); + if(newValue>999999999){ + setValue("noOfStaff", 999999999); + } + else if(newValue < 0){ + setValue("noOfStaff", 0); + } + // Perform any necessary actions with the new value + }; + + useEffect(()=>{ + if (!isObjEmpty(appreciationDetail) + && categoryList.length > 0 + && sbuDivisionList.length > 0 + && isSBUFetched + ) { + uppyDashboard.cancelAll() + //setSelectedCategory(getComboValueByLabel(categoryList,appreciationDetail.categoryName)); + setReceiptDate( + appreciationDetail.receiptDate === null ? null : dayjs(getDateString(appreciationDetail.receiptDate)) + ); + setClientReplyDate( + appreciationDetail.clientReplyDate === null ? null : dayjs(getDateString(appreciationDetail.clientReplyDate)) + ); + setStaffReplyDate( + appreciationDetail.staffReplyDate === null ? null : dayjs(getDateString(appreciationDetail.staffReplyDate)) + ); + setLNReceiptDate( + appreciationDetail.lnReceiptDate === null ? null : dayjs(getDateString(appreciationDetail.lnReceiptDate)) + ); + if(appreciationDetail.sbuIds !== null){ + const tempChannelIdList = Object.keys(appreciationDetail.sbuIds).length <= 0 ? null : getIdList(JSON.parse(appreciationDetail.sbuIds)); + setSelectedDivisions(tempChannelIdList === null ? null : getComboValueByIdList(sbuDivisionList, tempChannelIdList)); + } + if(appreciationDetail.clientOrganization){ + setOrgInput(appreciationDetail.clientOrganization); + } + + setSelectedDepartment(getComboValueByLabel(departmentList,appreciationDetail.clientDepartment)); + setSelectedCategory(getComboValueById(categoryList,appreciationDetail.aprCategoryId)); + + setOnReady(true); + } + else if(params.id <0 ){ + setOnReady(true); + } + },[appreciationDetail,sbuDivisionList, categoryList,isSBUFetched]); + + useEffect(() => { + uppyDashboard.cancelAll() + //if state data are ready and assign to different field + axios.get(`${apiPath}${GET_SBU_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setisSBUFetched(true); + setSBUDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + axios.get(`${apiPath}${GET_APPRECIATION_CATEGORY_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setCategoryList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + if(isNewRecord){ + setOnReady(true); + } + + axios.get(`${apiPath}${GET_CLIENT_DEPARTMENT_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setDepartmentList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + if(isNewRecord){ + setOnReady(true); + } + }, []); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const uploadFileList = []; + const fileList = uppyDashboard.getFiles(); + const files = uppyDashboard.getFiles(); + if(files.length > 0) { + for (const file of fileList) { + uploadFileList.push(file.data); + } + } + let totalSize = files.reduce((total, file) => total + file.size, 0); + totalSize = totalSize/1024/1024; + + const formErrors = {}; + const fileErrors = {}; + if(totalSize + usedFileSize > 10.0){ + formErrors.fileSize = '-The total size of attachments exceeds the limit. Please notice that the size of the attachment is limited to 10MB per appreciation. You can only attach ' + Math.floor(10-usedFileSize) + " MB file more."; + fileErrors.fileSize = '-The total size of attachments exceeds the limit. Please notice that the size of the attachment is limited to 10MB per appreciation. You can only attach ' + Math.floor(10-usedFileSize) + " MB file more."; + + } + + + if (selectedDivisions.length <= 0 ){ + formErrors.division = 'SBU / Division is required'; + } + + if (receiptDate === null){ + formErrors.receiptDate = 'Receipt Date is required'; + } + + if (lnReceiptDate === null){ + formErrors.lnReceiptDate = 'LN Receipt Date is required'; + } + + if (isStringEmptyAfterTrim(values.description)){ + formErrors.description = 'Brief Description is required'; + } + + if (selectedCategory === null){ + formErrors.category = 'Category is required'; + } + + if( orgInput.trim().length > 0 && + selectedDepartment != null + ){ + formErrors.dptOrgError = "Please provide either client department or client organization but not both." + } + else if ( orgInput.trim().length === 0 && + selectedDepartment == null + ){ + formErrors.dptOrgError = "Please provide client department or client organization." + } + + setFileErrors(fileErrors); + setErrors(formErrors); + if (Object.keys(formErrors).length === 0 && + Object.keys(fileErrors).length === 0 && + !receiptDateError && + !clientReplyDateError && + !staffReplyDateError && + !lnReceiptDateError + ) { + let formData = new FormData(); + formData.append("id", isNewRecord ? params.id : recordId); + formData.append("sbuIds", JSON.stringify(getJSONIdList(selectedDivisions))); + if(receiptDate !== null){ + formData.append("receiptDate", receiptDate === null ? null : dayjs(receiptDate).format('YYYY-MM-DD')); + } + formData.append("description", values.description === null ? "" : values.description.trim()); + formData.append("clientDepartment", selectedDepartment === null ? "" : selectedDepartment.label); + formData.append("clientOrganization", values.clientOrganization === null ? "" : values.clientOrganization.trim()); + formData.append("clientFullname", values.clientFullname === null ? "" : values.clientFullname.trim()); + formData.append("clientPost", values.clientPost === null ? "" : values.clientPost.trim()); + formData.append("venue", values.venue === null ? "" : values.venue.trim()); + if(clientReplyDate !== null){ + formData.append("clientReplyDate", clientReplyDate === null ? null : dayjs(clientReplyDate).format('YYYY-MM-DD')); + } + if(staffReplyDate !== null){ + formData.append("staffReplyDate", staffReplyDate === null ? null : dayjs(staffReplyDate).format('YYYY-MM-DD')); + } + formData.append("noOfStaff", values.noOfStaff == null ? "" : values.noOfStaff ); + if(lnReceiptDate !== null){ + formData.append("lnReceiptDate", lnReceiptDate === null ? null : dayjs(lnReceiptDate).format('YYYY-MM-DD')); + } + formData.append("aprCategoryId", selectedCategory.id); + formData.append("remarks", values.remarks); + for (const file of uploadFileList) { + formData.append("files",file); + } + updateAppreciationDetail(formData); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + }, [isCollectData]); + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + SBU / Division: + * + + + + + option.label} + onChange={(event, newValue) => { + setSelectedDivisions(newValue); + }} + renderInput={(params) => ( + + {errors.division.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + {...params} + required + placeholder="" + disabled={!isEditing} + /> + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Receipt Date: + * + + + + + + + setReceiptDate(newValue)} + format="DD/MM/YYYY" + error={!!errors.receiptDate} + helperText={errors.receiptDate} + onError={(newError) => setReceiptDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.receiptDate || receiptDateError, + helperText: receiptDateError ? receiptDateErrorMessage : errors.receiptDate, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + LN Receive Date: + * + + + + + + + setLNReceiptDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setLNReceiptDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.lnReceiptDate || lnReceiptDateError, + helperText: lnReceiptDateError ? lnReceiptDateErrorMessage : errors.lnReceiptDate, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + + Category: + + * + + + + + { + setSelectedCategory(newValue); + }} + disabled={!isEditing} + renderInput={(params) => + } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + + Brief Description: + * + + + + + + + + + + + + + + + + Venue Involved: + + + + + + + + + + + + + + + + + + Client Department: + + + + + + { + setSelectedDepartment(newValue); + }} + disabled={!isEditing} + renderInput={(params) => + } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + + or + + + + + + + + + + + + + + Client Organization : + + + + + { + const newValue = event.target.value; + setOrgInput(newValue); + }} + error={!!errors.dptOrgError} + helperText={errors.dptOrgError} + id='clientOrganization' + disabled={!isEditing} + multiline + maxRows={10} + InputProps={{ + style: { minHeight:'42.5px', maxHeight: '50vh' }, + }} + inputProps={{maxLength: 255}} + autoComplete="off" + /> + + + + + + + + + + + Client Post : + + + + + + + + + + + + + + Client Full Name : + + + + + + + + + + + + + + Client Reply Date: + + + + + + + setClientReplyDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setClientReplyDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: clientReplyDateErrorMessage, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + Staff Reply Date: + + + + + + + setStaffReplyDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setStaffReplyDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: staffReplyDateErrorMessage, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + No. of Staff : + + + + + + + + + + + + + + + + Remarks: + + + + + + + + + + + + { + isEditing ? + + { + fileErrors.fileSize ? +
+ {fileErrors.fileSize} +
+ : + undefined + } + { + fileErrors.fileRef ? +
+ {fileErrors.fileRef} +
+ : + undefined + } +
+ + You may upload supplementary material for this appreciation + +
+ +
+ : + undefined + } +
+
+
+ ); +}; + +export default AppreciationForm; diff --git a/src/pages/lionerMaintainAppreciationPage/ExternalRefGrid.js b/src/pages/lionerMaintainAppreciationPage/ExternalRefGrid.js new file mode 100644 index 0000000..103b26f --- /dev/null +++ b/src/pages/lionerMaintainAppreciationPage/ExternalRefGrid.js @@ -0,0 +1,304 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_AWARD_EXTERNAL_REF_PATH, UPDATE_AWARD_EXTERNAL_REFERENCE_PATH, +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, notifyDeleteError, //getObjectById, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +//import AbilityContext from "../../components/AbilityProvider"; + +let count = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel, canEdit} = props; + //const ability = useContext(AbilityContext); + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + }, + ...oldRows, + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'remarks'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| EXTERNAL REFERENCE TABLE ||============================== // + +export default function ExternalRefGrid({applicationId,canEdit}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + //const ability = useContext(AbilityContext); + //const [canUserEdit] = React.useState(!ability.can('EDIT','AWARD')); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + useEffect(() => { + if(applicationId > 0 ){ + axios.get(`${apiPath}${GET_AWARD_EXTERNAL_REF_PATH}/${applicationId}`) + .then((response) => { + if (response.status === 200) { + setRows(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + }, [applicationId]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + axios.delete(`${apiPath}${GET_AWARD_EXTERNAL_REF_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'remarks'} + }); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateChannel(data) { + axios.post(`${apiPath}${UPDATE_AWARD_EXTERNAL_REFERENCE_PATH}`, + { + "id": data.id, + "remarks" : data.remarks, + "refId" : applicationId + }, + ) + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.remarks.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateChannel(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + disabled={canEdit} + color="error" + />, + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="primary" + onClick={handleSaveClick(id)} + disabled={canEdit} + />, + ]; + } + + return [ + } + label="Delete" + onClick={handleDeleteClick(id)} + disabled={canEdit} + color="error" + />, + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + disabled={canEdit} + color="warning" + />, + ]; + }, + }, + { + id: 'extRef', + field: 'remarks', + headerName: 'External Attachment Reference', + flex: 1, + editable: true, + renderCell: (params) => ( + + {params.value} + + ), + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Link cannot be null`); + }} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 10}, + }, + }} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[5,10, 20]} + slotProps={{ + toolbar: {setRows, setRowModesModel, canEdit}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerMaintainAppreciationPage/FilePreviewGrid.js b/src/pages/lionerMaintainAppreciationPage/FilePreviewGrid.js new file mode 100644 index 0000000..e476726 --- /dev/null +++ b/src/pages/lionerMaintainAppreciationPage/FilePreviewGrid.js @@ -0,0 +1,230 @@ +// material-ui +import React, {useContext, useEffect, useState} from 'react'; +import MainCard from "../../components/MainCard"; +import Image from "mui-image"; +import {Box, CardContent, Grid, Typography} from "@mui/material"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {DELETE_FILE_PATH, GET_FILE_PATH} from "../../utils/ApiPathConst"; +import IconButton from '@mui/material/IconButton'; +import ClearIcon from '@mui/icons-material/Clear'; +import {GENERAL_INFO_COLOR, GENERAL_RED_COLOR, GENERAL_SETTING_COLOR} from "../../themes/colorConst"; +import { + GeneralConfirmWindow, + notifyDeleteSuccess, + //removeObjectWithId, + UploadFileWindow +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +//import AbilityContext from "../../components/AbilityProvider"; +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import 'assets/style/imageOverlay.css'; +import DownloadIcon from '@mui/icons-material/Download'; +import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded'; +import doc from 'assets/images/display/doc.png'; +// material-ui + +const FilePreviewGrid = ({fileList, reloadList, canEdit}) => { + + const [imageList, setImageList] = useState([]); + const { setIsUploading } = useContext(UploadContext); + //const ability = useContext(AbilityContext); + + useEffect(() => { + setImageList(fileList); + }, [fileList]); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const [isUploadWindowOpen, setIsUploadWindowOpen] = React.useState(false); + const [selectedVideo, setSelectedVideo] = React.useState({}); + + const handleUploadWindowClose = () => { + setIsUploadWindowOpen(false); + }; + + const handleUploadWindowSuccess = () =>{ + setIsUploadWindowOpen(false); + reloadList(); + } + + const handleUploadThumbnail = (video) => () =>{ + setIsUploadWindowOpen(true); + setSelectedVideo(video); + } + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = (fileId) => () =>{ + setIsWindowOpen(true); + setSelectedId(fileId); + } + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${DELETE_FILE_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 200) { + notifyDeleteSuccess(); + //const newList =removeObjectWithId(imageList,selectedId); + setIsUploading(false); + reloadList(); + setIsWindowOpen(false); + //setImageList(newList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + + const downloadFile = (fileId, skey, filename) => () => { + setIsUploading(true); + axios.get(`${apiPath}${GET_FILE_PATH}/${fileId}/${skey}/${filename}`,{ responseType: 'blob' }) + .then((response) => { + if (response.status === 200) { + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", filename); + link.click(); + setIsUploading(false); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }; + + return ( + + + + + {imageList.map((thumbnail ) => { + // Return the element. Also pass key + return ( + + + { + !canEdit? + + + + + + + + + + + + + : + undefined + } + + +
+ + +
+ +
+
+
+
+ + + + + + {thumbnail.filename} + + + + + + { + thumbnail.remarks === "" || thumbnail.remarks === null ? + + : + + + + Description: + + + + + {thumbnail.remarks.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + + + } + +
+
+
) + })} +
+ + +
+
+
+ ); +}; + +export default FilePreviewGrid; diff --git a/src/pages/lionerMaintainAppreciationPage/FileRefCard.js b/src/pages/lionerMaintainAppreciationPage/FileRefCard.js new file mode 100644 index 0000000..b7304a7 --- /dev/null +++ b/src/pages/lionerMaintainAppreciationPage/FileRefCard.js @@ -0,0 +1,74 @@ +// material-ui +import React, { useState} from 'react'; +import MainCard from "../../components/MainCard"; +import {Box, Tab, Tabs} from "@mui/material"; +import {useTheme} from "@mui/material/styles"; +import FilePreviewGrid from "./FilePreviewGrid"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {AttachmentTabHeading} from "../../utils/ComboConst"; + + +// material-ui + +// ==============================|| TAB PANEL RELATED ||============================== // +function TabPanel({children, value, index, ...other}) { + return ( + + ); +} + +// ==============================|| TAB PANEL RELATED ||============================== // + +const FileRefCard = ({thumbnailList, reloadList, canEdit}) => { + const [tabData] = useState(AttachmentTabHeading); + const [value, setValue] = useState(0); + const theme = useTheme(); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + + + + {tabData.map(data => ( + + ))} + + + {tabData.map(data => ( + + + + ))} + + + ); +}; + +export default FileRefCard; diff --git a/src/pages/lionerMaintainAppreciationPage/FileUploadCard.js b/src/pages/lionerMaintainAppreciationPage/FileUploadCard.js new file mode 100644 index 0000000..4e62693 --- /dev/null +++ b/src/pages/lionerMaintainAppreciationPage/FileUploadCard.js @@ -0,0 +1,12 @@ +// material-ui +import React from 'react'; + + +export default function FileUploadCard() { + + + return ( +
+
+ ); +} diff --git a/src/pages/lionerMaintainAppreciationPage/index.js b/src/pages/lionerMaintainAppreciationPage/index.js new file mode 100644 index 0000000..17b1f25 --- /dev/null +++ b/src/pages/lionerMaintainAppreciationPage/index.js @@ -0,0 +1,401 @@ +// material-ui +import { Box, Button, Grid, Typography } from '@mui/material'; +import AppreciationForm from './AppreciationForm'; +import { useContext, useEffect, useState } from 'react'; +import * as React from 'react'; +import axios from 'axios'; +import { apiPath } from '../../auth/utils'; +import { + GET_APPRECIATION_FILE_PATH, + GET_APPRECIATION_LIST, + GET_APPRECIATION_STORAGE_SIZE, + GET_THUMBNAIL_PATH, + UPDATE_APPRECIATION_PATH +} from '../../utils/ApiPathConst'; +import LoadingComponent from '../extra-pages/LoadingComponent'; +import { + GeneralConfirmWindow, + getObjectById, + notifyDeleteError, + notifyDeleteSuccess, + notifyNoPermission, + notifySaveSuccess +} from '../../utils/CommonFunction'; +import FileRefCard from './FileRefCard'; +import { LIONER_BUTTON_THEME } from '../../themes/colorConst'; +import { useNavigate, useParams } from 'react-router-dom'; +import { ThemeProvider } from '@emotion/react'; +import UploadContext from '../../components/UploadProvider'; +import AbilityContext from '../../components/AbilityProvider'; +import { isObjEmpty } from '../../utils/Utils'; + +import { LIONER_FORM_THEME } from '../../themes/themeConst'; +import { useLocation } from 'react-router'; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ApplicationPanel = () => { + const params = useParams(); + const navigate = useNavigate(); + const { setIsUploading } = useContext(UploadContext); + const [isEditing, setIsEditing] = useState(false); + const ability = useContext(AbilityContext); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get('refId'); + + const [onReady, setOnReady] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [userConfirm, setUserConfirm] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const [appreciationDetail, setAppreciationDetail] = useState({}); + const [refFileList, setRefFileList] = useState([]); + const [refSubDivisionList, setRefSubDivisionList] = useState([]); + const [thumbnailList, setThumbnailList] = useState([]); + const [usedFileSize, setUsedFileSize] = useState(0); + + // ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + function updateData() { + if (refFileList.length > 0) { + notifyDeleteError('Delete restricted. Attachment exists in this appreciation record.'); + setIsWindowOpen(false); + } else { + axios + .delete(`${apiPath}${GET_APPRECIATION_LIST}/${params.id}`) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + returnSearchPage(); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + } + // ==============================|| DELETE WINDOW RELATED ||============================== // + + function updateAppreciationDetail(applicationData) { + setAppreciationDetail(applicationData); + } + + useEffect(() => { + if (refId !== null) { + setIsEditing(true); + setIsNewRecord(true); + getAppreciationDetail(refId); + } else if (params.id < 0) { + if (!ability.can('MAINTAIN', 'APPRECIATION')) { + notifyNoPermission(); + navigate('/'); + } + setIsEditing(true); + setIsNewRecord(true); + } else { + getAppreciationDetail(params.id); + } + getFileList(); + }, []); + + useEffect(() => { + if (!isObjEmpty(appreciationDetail) + && (!isObjEmpty(thumbnailList) || refFileList.length === 0) + ) { + setOnReady(true); + } else if (isNewRecord) { + setOnReady(true); + } + }, [appreciationDetail, thumbnailList, refFileList]); + + function reloadData() { + getAppreciationDetail(params.id); + getFileList(); + } + + function reloadList() { + getFileList(); + } + + const updateIsEdit = () => { + setIsEditing(!isEditing); + }; + + function returnSearchPage() { + navigate('/appreciation'); + } + + const submitData = () => { + setUserConfirm(true); + setIsCollectData(!isCollectData); + }; + + useEffect(() => { + if (userConfirm && onReady) { + postAppreciation(); + //console.log(appreciationDetail); + } + setUserConfirm(false); + }, [appreciationDetail]); + + function postAppreciation() { + setIsEditing(false); + setIsUploading(true); + axios + .post(`${apiPath}${UPDATE_APPRECIATION_PATH}`, appreciationDetail, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + if (isNewRecord) { + setIsUploading(false); + navigate('/appreciation'); + } else { + setIsUploading(false); + reloadData(); + } + setIsCollectData(!isCollectData); + } + }) + .catch((error) => { + setIsUploading(false); + notifyDeleteError('Server busy, please try again later.'); + console.log(error); + return false; + }); + } + + + function getFileList() { + axios + .get(`${apiPath}${GET_APPRECIATION_FILE_PATH}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setRefFileList(response.data.records); + if(response.data.records.length >0){ + setThumbnailList([]); + setOnReady(false); + } + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getAppreciationDetail(appreciationId) { + axios + .get(`${apiPath}${GET_APPRECIATION_LIST}/${appreciationId}`) + .then((response) => { + if (response.status === 200) { + setAppreciationDetail(response.data.data); + setRefSubDivisionList(response.data.subDivisionList); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + useEffect(() => { + const tempList = []; + if (refFileList.length > 0) { + const promises = refFileList.reduce((accumulator, refFile) => { + const promise = axios + .get(`${apiPath}${GET_THUMBNAIL_PATH}/${refFile.id}/${refFile.skey}/${refFile.filename}`, { responseType: 'blob' }) + .then((response) => { + if (response.status === 200) { + const tempURL = URL.createObjectURL(new Blob([response.data], { type: refFile.mimetype })); + if (getObjectById(thumbnailList, refFile.filename) === null) { + const thumbnail = { + id: refFile.id, + fileId: refFile.id, + skey: refFile.skey, + key: refFile.filename + refFile.id, + filename: refFile.filename, + mimetype: refFile.mimetype.split('/')[0], + remarks: refFile.remarks, + src: tempURL, + fileSize: response.data.size + }; + return thumbnail; + } + } + }) + .catch((error) => { + console.log(error); + // create a empty thumbnail object instead of block the form load + const thumbnail = { + id: refFile.id, + fileId: refFile.id, + skey: refFile.skey, + key: refFile.filename + refFile.id, + filename: refFile.filename, + mimetype: refFile.mimetype.split('/')[0], + remarks: refFile.remarks, + fileSize: 0 + }; + return thumbnail; + }); + + accumulator.push(promise); + return accumulator; + }, []); + + Promise.all(promises) + .then((thumbnails) => { + const filteredThumbnails = thumbnails.filter((thumbnail) => thumbnail !== false); + const arrCopy = Array.from(filteredThumbnails); + arrCopy.sort((a, b) => a.key.localeCompare(b.key)); + setThumbnailList([...arrCopy]); + }) + .catch((error) => { + console.log(error); + }); + } else { + setThumbnailList(tempList); + } + + axios + .get(`${apiPath}${GET_APPRECIATION_STORAGE_SIZE}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setUsedFileSize(response.data.size); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + + }, [refFileList]); + + return !onReady ? ( + + ) : ( + + + + + + + + {isNewRecord ? 'Maintain Appreciation Record' : 'Maintain Appreciation Record'} + + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + {isEditing ? ( + + + + + + + + + + + + + + + + + + + ) : ( + + + + + + + + + + + + + )} + + {/*row 3*/} + {params.id > 0 ? ( + + + + ) : ( + + )} + + + ); +}; + +export default ApplicationPanel; diff --git a/src/pages/lionerMaintainAwardPage/AwardForm.js b/src/pages/lionerMaintainAwardPage/AwardForm.js new file mode 100644 index 0000000..5f855ed --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/AwardForm.js @@ -0,0 +1,803 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {Dashboard} from "@uppy/react"; +import Uppy, { debugLogger } from '@uppy/core'; +import {useLocation, useParams} from "react-router-dom"; +import '@uppy/core/dist/style.min.css'; +import '@uppy/dashboard/dist/style.min.css'; +import '@uppy/webcam/dist/style.min.css'; +import { + convertXmlToObject, + getComboValueByIdList, + getComboValueByLabel, getDateString, + getDeletedRecordWithRefList, + getIdList, getNewRecordWithRefList, isOptionEqualToValue, isStringEmptyAfterTrim +} from "../../utils/CommonFunction"; +import Autocomplete from "@mui/material/Autocomplete"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_AWARD_DUPLICATE, + GET_CATEGORY_COMBO_LIST, + GET_LDAP_USER_LIST, + GET_PROMOTION_CHANNEL_COMBO_LIST, + GET_SUB_DIVISION_COMBO_LIST, +} from "../../utils/ApiPathConst"; +import {GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {parseString} from "xml2js"; +import {isObjEmpty} from "../../utils/Utils"; +import Qs from "qs"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; + +const uppyDashboard = new Uppy({ + autoProceed: true, + logger: debugLogger, + hideUploadButton: true, + restrictions: { + maxFileSize: 512 * 1024 * 1024, // 512 MB in bytes + }, + }) + //.use(ThumbnailGenerator, {thumbnailWidth: 200}) + //.use(XHR, { endpoint: 'https://your-domain.com/upload' }) +; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const AwardForm = ({eventDetail, applicationDetail, awardDetail, updateAwardDetail, + isNewRecord, isCollectData, + refSubDivisionList, + setIsCollectData, setUserConfirm, isEditing, + usedFileSize,videoCount, + eventName,applicationName +}) => { + const params = useParams(); + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + const [fileErrors, setFileErrors] = useState({}); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + + const {register, getValues, setValue} = useForm(); + const [selectedChannels, setSelectedChannels] = useState([]); + const [selectedOfficer, setSelectedOfficer] = useState(null); + const [selectedSubDivision, setSelectedSubDivision] = useState([]); + const [selectedCategory, setSelectedCategory] = useState(null); + const [receiveDate, setReceiveDate] = useState(null); + const [receiveDateError, setReceiveDateToError] = React.useState(null); + + const receiveDateErrorMessage = React.useMemo(() => { + switch (receiveDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [receiveDateError]); + + const [channelList, setChannelList] = useState([]); + const [isChannelFetched, setIsChannelFetched] = useState(false); + + const [subDivisionList, setSubDivisionList] = useState([]); + const [categoryList, setCategoryList] = useState([]); + + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const handleLocationCodeChange = (event, value) => { + setSelectedOfficer({ + label: value, + }); + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value, false); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + // Function to fetch user name options based on locationCode + const fetchLotusUserList = async (input, isInit) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + if(!isObjEmpty(awardDetail) && isInit){ + setSelectedOfficer({ + label: awardDetail.responsibleOfficer, + }); + } + setLotusNoteUserList(convertXmlToObject(result.RECORDS.RECORD)); + }); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + uppyDashboard.on('file-added', (/*file*/) => { + uppyDashboard.setOptions({ + hideUploadButton: true, + }); + }); + + useEffect(()=>{ + if (!isObjEmpty(awardDetail) + && subDivisionList.length > 0 + && categoryList.length > 0 + && isChannelFetched + ) { + uppyDashboard.cancelAll() + if(refId !== null){ + setValue("name", awardDetail.name); + setValue("nameCht", awardDetail.nameCht); + setValue("physicalAward", awardDetail.physicalAward); + setValue("remarks", awardDetail.remarks); + setValue("storageLocation", awardDetail.storageLocation); + } + setSelectedCategory(getComboValueByLabel(categoryList,awardDetail.categoryName)); + setSelectedSubDivision(getComboValueByIdList(subDivisionList,refSubDivisionList)); + setReceiveDate( + awardDetail.receiveDate === null ? null : dayjs(getDateString(awardDetail.receiveDate)) + ); + if(awardDetail.promotionChannel !== null){ + const tempChannelIdList = Object.keys(awardDetail.promotionChannel).length <= 0 ? null : getIdList(JSON.parse(awardDetail.promotionChannel)); + setSelectedChannels(tempChannelIdList === null ? null : getComboValueByIdList(channelList, tempChannelIdList)); + } + //const locationCode = awardDetail.responsibleOfficer.split('(')[1].replace(')',''); + fetchLotusUserList(awardDetail.responsibleOfficer, true); + setOnReady(true); + } + else if(params.id <0 && refId === null){ + setOnReady(true); + } + },[awardDetail,subDivisionList,categoryList,isChannelFetched]); + + useEffect(()=>{ + if(!isObjEmpty(awardDetail)){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`,{ + // axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_FOR_AWARD_LIST}`,{ + // params: { + // "applicationId": awardDetail.applicationId + // }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + else if(isNewRecord){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`,{ + // axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_FOR_AWARD_LIST}`,{ + // params: { + // "applicationId": params.applicationId + // }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + },[awardDetail]) + + useEffect(() => { + uppyDashboard.cancelAll() + //if state data are ready and assign to different field + axios.get(`${apiPath}${GET_CATEGORY_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setCategoryList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + axios.get(`${apiPath}${GET_PROMOTION_CHANNEL_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setIsChannelFetched(true); + setChannelList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + + if(isNewRecord && refId === null){ + setOnReady(true); + } + }, []); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const uploadFileList = []; + const fileList = uppyDashboard.getFiles(); + const files = uppyDashboard.getFiles(); + if(files.length > 0) { + for (const file of fileList) { + uploadFileList.push(file.data); + } + } + let totalSize = files.reduce((total, file) => total + file.size, 0); + totalSize = totalSize/1024/1024; + const videoFiles = files.filter(file => + file.type.startsWith('video/') || /\.(mp4|mov|avi|mkv)$/i.test(file.name) + ); + + const videoAttachCount = videoFiles.length; + const formErrors = {}; + const fileErrors = {}; + if(totalSize + usedFileSize > 500.0){ + formErrors.fileSize = '-The total size of attachments exceeds the limit. Please notice that the size of the attachment is limited to 100MB per application and 500MB per award. You can only attach ' + Math.floor(500-usedFileSize) + " MB file more."; + fileErrors.fileSize = '-The total size of attachments exceeds the limit. Please notice that the size of the attachment is limited to 100MB per application and 500MB per award. You can only attach ' + Math.floor(500-usedFileSize) + " MB file more."; + + } + if(videoCount >= 1 && videoAttachCount >= 1){ + formErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + fileErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + } + if(videoAttachCount>1){ + formErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + fileErrors.fileRef = '-Total number of videos exceeds the limit, please delete existing uploaded video, or stop uploading new videos.'; + } + + if (isStringEmptyAfterTrim(values.name)) { + formErrors.name = 'Award Name is required'; + } + + if (selectedCategory === null){ + formErrors.category = 'Category is required'; + } + + if (selectedOfficer === null){ + formErrors.officer = 'Officer is required'; + }else if(selectedOfficer.label.trim().length === 0){ + formErrors.officer = 'Officer is required'; + + } + + if (selectedSubDivision.length <= 0){ + formErrors.subDivision = 'Sub-Division is required'; + } + + setFileErrors(fileErrors); + setErrors(formErrors); + if (Object.keys(formErrors).length === 0 && !receiveDateError) { + axios.get(`${apiPath}${CHECK_AWARD_DUPLICATE}`, + { + params: { + "name": values.name.trim(), + "id": params.id, + "applicationId": isNewRecord? params.applicationId : awardDetail.applicationId, + }, + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if(response.data.isTaken){ + formErrors.name = 'Award name must be unique for the same application.'; + setErrors(formErrors); + setIsCollectData(false); + setUserConfirm(false); + } + else if(!response.data.isTaken){ + if (Object.keys(formErrors).length === 0) { + let formData = new FormData(); + formData.append("id", isNewRecord ? params.id : awardDetail.id); + formData.append("applicationId", isNewRecord ? params.applicationId : awardDetail.applicationId); + formData.append("name", values.name.trim()); + formData.append("nameCht", values.nameCht === null ? "" : values.nameCht.trim()); + formData.append("remarks", values.remarks === null ? "" : values.remarks.trim()); + formData.append("categoryId", selectedCategory == null ? "" : selectedCategory.id); + if(receiveDate !== null){ + formData.append("receiveDate", receiveDate === null ? null : dayjs(receiveDate).format('YYYY-MM-DD')); + } + formData.append("storageLocation", values.storageLocation === null ? "" : values.storageLocation.trim()); + formData.append("physicalAward", values.physicalAward === null ? "" : values.physicalAward.trim()); + formData.append("responsibleOfficer", selectedOfficer == null ? "" : selectedOfficer.label.trim()); + formData.append("promotionChannel", JSON.stringify(selectedChannels)); + formData.append("subDivisionIdList", isNewRecord ? getIdList(selectedSubDivision) : selectedSubDivision == null ? [] : getNewRecordWithRefList(refSubDivisionList,getIdList(selectedSubDivision))); + formData.append("subDivisionRemoveIdList", isNewRecord ? [] : selectedSubDivision == null ? [] : getDeletedRecordWithRefList(refSubDivisionList,getIdList(selectedSubDivision))); + for (const file of uploadFileList) { + formData.append("files",file); + } + updateAwardDetail(formData); + } + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + }, [isCollectData]); + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + Event Name: + + + + + + {isNewRecord? eventDetail.name : eventName} + + + + + + + + + + Application Name: + + + + + + {isNewRecord? applicationDetail.name : applicationName} + + + + + + + + + + + Award Name: + + * + + + + + + + + + + + + + + + Award Name Chinese: + + + + + + + + + + + + + + + + Remarks: + + + + + + + + + + + + + + + Physical Award: + + + + + e.g. Trophy, Cert, Medal or Electronic Doc + } + /> + + + + + + + + + Storage Location: + + + + + + + + + + + + + + Received Date: + + + + + + + setReceiveDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setReceiveDateToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: receiveDateErrorMessage, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + + Category: + + * + + + + + { + setSelectedCategory(newValue); + }} + disabled={!isEditing} + renderInput={(params) => + } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + + Responsible Officer: + + * + + + + + { + setSelectedOfficer(newValue); + //if(lotusNoteUserList.length >0){ + // if(newValue !== null){ + // if(getComboValueByLabel(lotusNoteUserList, newValue.label) !== null){ + // setSelectedOfficer(newValue); + // } + // } + // else{ + // setSelectedOfficer(null); + // } + //} + }} + renderInput={(params) => + } + //isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + + Sub-Divisions: + + * + + + + + option.label} + onChange={(event, newValue) => { + setSelectedSubDivision(newValue); + }} + disabled={!isEditing} + renderInput={(params) => ( + + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Promotion Channels: + + + + + option.label} + onChange={(event, newValue) => { + setSelectedChannels(newValue); + }} + renderInput={(params) => ( + + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + { + isEditing ? + + { + fileErrors.fileSize ? +
+ {fileErrors.fileSize} +
+ : + undefined + } + { + fileErrors.fileRef ? +
+ {fileErrors.fileRef} +
+ : + undefined + } +
+ + You may upload supplementary material for record, including relevant photos or document + +
+ +
+ : + undefined + } +
+
+
+ ); +}; + +export default AwardForm; diff --git a/src/pages/lionerMaintainAwardPage/ExternalRefGrid.js b/src/pages/lionerMaintainAwardPage/ExternalRefGrid.js new file mode 100644 index 0000000..103b26f --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/ExternalRefGrid.js @@ -0,0 +1,304 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_AWARD_EXTERNAL_REF_PATH, UPDATE_AWARD_EXTERNAL_REFERENCE_PATH, +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, notifyDeleteError, //getObjectById, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +//import AbilityContext from "../../components/AbilityProvider"; + +let count = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel, canEdit} = props; + //const ability = useContext(AbilityContext); + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + }, + ...oldRows, + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'remarks'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| EXTERNAL REFERENCE TABLE ||============================== // + +export default function ExternalRefGrid({applicationId,canEdit}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + //const ability = useContext(AbilityContext); + //const [canUserEdit] = React.useState(!ability.can('EDIT','AWARD')); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + useEffect(() => { + if(applicationId > 0 ){ + axios.get(`${apiPath}${GET_AWARD_EXTERNAL_REF_PATH}/${applicationId}`) + .then((response) => { + if (response.status === 200) { + setRows(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + }, [applicationId]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + axios.delete(`${apiPath}${GET_AWARD_EXTERNAL_REF_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'remarks'} + }); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateChannel(data) { + axios.post(`${apiPath}${UPDATE_AWARD_EXTERNAL_REFERENCE_PATH}`, + { + "id": data.id, + "remarks" : data.remarks, + "refId" : applicationId + }, + ) + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.remarks.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateChannel(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + disabled={canEdit} + color="error" + />, + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="primary" + onClick={handleSaveClick(id)} + disabled={canEdit} + />, + ]; + } + + return [ + } + label="Delete" + onClick={handleDeleteClick(id)} + disabled={canEdit} + color="error" + />, + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + disabled={canEdit} + color="warning" + />, + ]; + }, + }, + { + id: 'extRef', + field: 'remarks', + headerName: 'External Attachment Reference', + flex: 1, + editable: true, + renderCell: (params) => ( + + {params.value} + + ), + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Link cannot be null`); + }} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 10}, + }, + }} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[5,10, 20]} + slotProps={{ + toolbar: {setRows, setRowModesModel, canEdit}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerMaintainAwardPage/FilePreviewGrid.js b/src/pages/lionerMaintainAwardPage/FilePreviewGrid.js new file mode 100644 index 0000000..e476726 --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/FilePreviewGrid.js @@ -0,0 +1,230 @@ +// material-ui +import React, {useContext, useEffect, useState} from 'react'; +import MainCard from "../../components/MainCard"; +import Image from "mui-image"; +import {Box, CardContent, Grid, Typography} from "@mui/material"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {DELETE_FILE_PATH, GET_FILE_PATH} from "../../utils/ApiPathConst"; +import IconButton from '@mui/material/IconButton'; +import ClearIcon from '@mui/icons-material/Clear'; +import {GENERAL_INFO_COLOR, GENERAL_RED_COLOR, GENERAL_SETTING_COLOR} from "../../themes/colorConst"; +import { + GeneralConfirmWindow, + notifyDeleteSuccess, + //removeObjectWithId, + UploadFileWindow +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +//import AbilityContext from "../../components/AbilityProvider"; +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import 'assets/style/imageOverlay.css'; +import DownloadIcon from '@mui/icons-material/Download'; +import SettingsRoundedIcon from '@mui/icons-material/SettingsRounded'; +import doc from 'assets/images/display/doc.png'; +// material-ui + +const FilePreviewGrid = ({fileList, reloadList, canEdit}) => { + + const [imageList, setImageList] = useState([]); + const { setIsUploading } = useContext(UploadContext); + //const ability = useContext(AbilityContext); + + useEffect(() => { + setImageList(fileList); + }, [fileList]); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const [isUploadWindowOpen, setIsUploadWindowOpen] = React.useState(false); + const [selectedVideo, setSelectedVideo] = React.useState({}); + + const handleUploadWindowClose = () => { + setIsUploadWindowOpen(false); + }; + + const handleUploadWindowSuccess = () =>{ + setIsUploadWindowOpen(false); + reloadList(); + } + + const handleUploadThumbnail = (video) => () =>{ + setIsUploadWindowOpen(true); + setSelectedVideo(video); + } + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = (fileId) => () =>{ + setIsWindowOpen(true); + setSelectedId(fileId); + } + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${DELETE_FILE_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 200) { + notifyDeleteSuccess(); + //const newList =removeObjectWithId(imageList,selectedId); + setIsUploading(false); + reloadList(); + setIsWindowOpen(false); + //setImageList(newList); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + + const downloadFile = (fileId, skey, filename) => () => { + setIsUploading(true); + axios.get(`${apiPath}${GET_FILE_PATH}/${fileId}/${skey}/${filename}`,{ responseType: 'blob' }) + .then((response) => { + if (response.status === 200) { + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", filename); + link.click(); + setIsUploading(false); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }; + + return ( + + + + + {imageList.map((thumbnail ) => { + // Return the element. Also pass key + return ( + + + { + !canEdit? + + + + + + + + + + + + + : + undefined + } + + +
+ + +
+ +
+
+
+
+ + + + + + {thumbnail.filename} + + + + + + { + thumbnail.remarks === "" || thumbnail.remarks === null ? + + : + + + + Description: + + + + + {thumbnail.remarks.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + + + } + +
+
+
) + })} +
+ + +
+
+
+ ); +}; + +export default FilePreviewGrid; diff --git a/src/pages/lionerMaintainAwardPage/FileRefCard.js b/src/pages/lionerMaintainAwardPage/FileRefCard.js new file mode 100644 index 0000000..021ea84 --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/FileRefCard.js @@ -0,0 +1,82 @@ +// material-ui +import React, { useState} from 'react'; +import MainCard from "../../components/MainCard"; +import {Box, Tab, Tabs} from "@mui/material"; +import {TabHeading} from "./TabConst"; +import {useTheme} from "@mui/material/styles"; +import FilePreviewGrid from "./FilePreviewGrid"; +import ExternalRefGrid from "./ExternalRefGrid"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; + + +// material-ui + +// ==============================|| TAB PANEL RELATED ||============================== // +function TabPanel({children, value, index, ...other}) { + return ( + + ); +} + +// ==============================|| TAB PANEL RELATED ||============================== // + +const FileRefCard = ({thumbnailList, applicationId, reloadList, canEdit}) => { + const [tabData] = useState(TabHeading); + const [value, setValue] = useState(0); + const theme = useTheme(); + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + + + + {tabData.map(data => ( + + ))} + + + {tabData.map(data => ( + + {data.key === 1 ? + + : + + } + + ))} + + + ); +}; + +export default FileRefCard; diff --git a/src/pages/lionerMaintainAwardPage/FileUploadCard.js b/src/pages/lionerMaintainAwardPage/FileUploadCard.js new file mode 100644 index 0000000..4e62693 --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/FileUploadCard.js @@ -0,0 +1,12 @@ +// material-ui +import React from 'react'; + + +export default function FileUploadCard() { + + + return ( +
+
+ ); +} diff --git a/src/pages/lionerMaintainAwardPage/TabConst.js b/src/pages/lionerMaintainAwardPage/TabConst.js new file mode 100644 index 0000000..a88f129 --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/TabConst.js @@ -0,0 +1,10 @@ +export const TabHeading = [ + { + key: 1, + name: 'Attachment(s)' + }, + { + key: 2, + name: 'External Link(s)' + } +]; \ No newline at end of file diff --git a/src/pages/lionerMaintainAwardPage/index.js b/src/pages/lionerMaintainAwardPage/index.js new file mode 100644 index 0000000..6d714be --- /dev/null +++ b/src/pages/lionerMaintainAwardPage/index.js @@ -0,0 +1,610 @@ +// material-ui +import { Box, Button, Grid, Typography } from '@mui/material'; +import AwardForm from './AwardForm'; +import { useContext, useEffect, useState } from 'react'; +import * as React from 'react'; +import axios from 'axios'; +import { apiPath } from '../../auth/utils'; +import { + GET_APPLICATION_COMBO_PATH, + GET_APPLICATION_PATH, + GET_AWARD_FILE_PATH, + GET_AWARD_PATH, + GET_AWARD_STORAGE_SIZE, + GET_AWARD_VIDEO_EXIST, + GET_EVENT_COMBO_PATH, + GET_EVENT_PATH, + GET_SUB_DIVISION_COMBO_LIST, + GET_THUMBNAIL_PATH, + POST_AWARD_PATH +} from '../../utils/ApiPathConst'; +import LoadingComponent from '../extra-pages/LoadingComponent'; +import { + GeneralConfirmWindow, + GeneralTwoComboWindow, + getObjectById, + isUserDivisionIdInList, + notifyDeleteError, + notifyDeleteSuccess, + notifyNoPermission, + notifySaveSuccess +} from '../../utils/CommonFunction'; +import FileRefCard from './FileRefCard'; +import { LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME } from '../../themes/colorConst'; +import { useNavigate, useParams } from 'react-router-dom'; +import { ThemeProvider } from '@emotion/react'; +import UploadContext from '../../components/UploadProvider'; +import AbilityContext from '../../components/AbilityProvider'; +import { isObjEmpty } from '../../utils/Utils'; + +import { LIONER_FORM_THEME } from '../../themes/themeConst'; +import { useLocation } from 'react-router'; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ApplicationPanel = () => { + const params = useParams(); + const navigate = useNavigate(); + const { setIsUploading } = useContext(UploadContext); + const [isEditing, setIsEditing] = useState(false); + const ability = useContext(AbilityContext); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get('refId'); + + const [onReady, setOnReady] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [userConfirm, setUserConfirm] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const [awardDetail, setAwardDetail] = useState({}); + const [subDivisionCombo, setSubDivisionCombo] = useState([]); + const [refFileList, setRefFileList] = useState([]); + const [refSubDivisionList, setRefSubDivisionList] = useState([]); + const [thumbnailList, setThumbnailList] = useState([]); + const [eventDetail, setEventDetail] = useState({}); + const [applicationDetail, setApplicationDetail] = useState({}); + const [usedFileSize, setUsedFileSize] = useState(0); + const [videoCount, setVideoCount] = useState(0); + //const [tagCombo, setTagCombo] = useState({}); + + // ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + function updateData() { + if (refFileList.length > 0) { + notifyDeleteError('Delete restricted. Attachment exists in this award.'); + setIsWindowOpen(false); + } else { + axios + .delete(`${apiPath}${GET_AWARD_PATH}/${params.id}`) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + returnSearchPage(); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + } + // ==============================|| DELETE WINDOW RELATED ||============================== // + + // ==============================|| NEW WINDOW RELATED START ||============================== // + const [isCopyWindowOpen, setIsCopyWindowOpen] = React.useState(false); + const [eventList, setEventList] = useState([]); + const [applicationList, setApplicationList] = useState([]); + const [selectedEvent, setSelectedEvent] = useState(null); + const [selectedApplication, setSelectedApplication] = useState(null); + const [eventName, setEventName] = useState(""); + const [applicationName, setApplicationName] = useState(""); + + const handleCopyClose = () => { + setIsCopyWindowOpen(false); + }; + + function updateCopyData() { + setIsCopyWindowOpen(false); + navigate(`/award/maintain/-1/${selectedEvent.id}/${selectedApplication.id}?refId=${params.id}`); + } + + const createNewAward = () => { + setIsCopyWindowOpen(true); + }; + // ==============================|| NEW WINDOW RELATED END ||============================== // + + function updateAwardDetail(applicationData) { + setAwardDetail(applicationData); + } + + useEffect(() => { + if (refId !== null) { + setIsEditing(true); + setIsNewRecord(true); + getAwardDetail(refId); + getEventDetail(); + getApplicationDetail(); + } else if (params.id < 0) { + if (!ability.can('EDIT', 'APPLICATION')) { + notifyNoPermission(); + navigate('/'); + } + setIsEditing(true); + setIsNewRecord(true); + getEventDetail(); + getApplicationDetail(); + } else { + getAwardDetail(params.id); + } + getGroupList(); + getFileList(); + getApplicationCombo(); + getEventCombo(); + }, []); + + useEffect(() => { + if(selectedEvent !== null && Object.keys(selectedEvent).length >= 0){ + getApplicationCombo(selectedEvent.id); + } + }, [selectedEvent]); + + + useEffect(() => { + if (Object.keys(subDivisionCombo).length > 0 + && !isObjEmpty(awardDetail) + && (!isObjEmpty(thumbnailList) || refFileList.length === 0) + ) { + setOnReady(true); + } else if (isNewRecord && Object.keys(eventDetail).length > 0 + && Object.keys(applicationDetail).length > 0 + ) { + setOnReady(true); + } + }, [subDivisionCombo, applicationDetail, eventDetail, awardDetail, thumbnailList, refFileList]); + + function reloadData() { + getAwardDetail(params.id); + getGroupList(); + getFileList(); + } + + function reloadList() { + getFileList(); + } + + const updateIsEdit = () => { + setIsEditing(!isEditing); + }; + + function returnSearchPage() { + navigate('/award'); + } + + const submitData = () => { + setUserConfirm(true); + setIsCollectData(!isCollectData); + }; + + useEffect(() => { + if (userConfirm && onReady) { + postApplication(); + //console.log(awardDetail); + } + setUserConfirm(false); + }, [awardDetail]); + + function postApplication() { + setIsEditing(false); + setIsUploading(true); + axios + .post(`${apiPath}${POST_AWARD_PATH}`, awardDetail, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + if (isNewRecord) { + setIsUploading(false); + navigate('/award'); + } else { + setIsUploading(false); + reloadData(); + } + setIsCollectData(!isCollectData); + } + }) + .catch((error) => { + setIsUploading(false); + notifyDeleteError('Server busy, please try again later.'); + console.log(error); + return false; + }); + } + + function getApplicationDetail() { + axios + .get(`${apiPath}${GET_APPLICATION_PATH}/${params.applicationId}`) + .then((response) => { + if (response.status === 200) { + setApplicationDetail(response.data.data); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getEventDetail() { + axios + .get(`${apiPath}${GET_EVENT_PATH}/${params.eventId}`) + .then((response) => { + if (response.status === 200) { + setEventDetail(response.data.data); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getEventCombo() { + axios + .get(`${apiPath}${GET_EVENT_COMBO_PATH}`, { + params: { + userSubDivisionId: ability.can('EDIT', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId') + } + }) + .then((response) => { + if (response.status === 200) { + setEventList(response.data.records); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getApplicationCombo(eventId) { + axios + .get(`${apiPath}${GET_APPLICATION_COMBO_PATH}`, { + params: { + eventId: eventId, + userSubDivisionId: ability.can('EDIT', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId') + } + }) + .then((response) => { + if (response.status === 200) { + setApplicationList(response.data.records); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getGroupList() { + axios + .get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setSubDivisionCombo(response.data.records); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getFileList() { + axios + .get(`${apiPath}${GET_AWARD_FILE_PATH}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setRefFileList(response.data.records); + if(response.data.records.length >0){ + setThumbnailList([]); + setOnReady(false); + } + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + function getAwardDetail(awardId) { + axios + .get(`${apiPath}${GET_AWARD_PATH}/${awardId}`) + .then((response) => { + if (response.status === 200) { + setAwardDetail(response.data.data); + setEventName(response.data.data.eventName); + setApplicationName(response.data.data.applicationName); + setRefSubDivisionList(response.data.subDivisionList); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + + useEffect(() => { + const tempList = []; + if (refFileList.length > 0) { + // for(let i=0 ; i < refFileList.length ; i++){ + // axios.get(`${apiPath}${GET_THUMBNAIL_PATH}/${refFileList[i].id}/${refFileList[i].skey}/${refFileList[i].filename}`, + // { responseType: 'blob' }) + // .then((response) => { + // if (response.status === 200) { + // const tempURL = URL.createObjectURL(new Blob([response.data],{type: refFileList[i].mimetype})); + // if(getObjectById(thumbnailList,refFileList[i].filename) === null){ + // tempList.push({ + // "id": refFileList[i].id, + // "fileId": refFileList[i].id, + // "skey": refFileList[i].skey, + // "key": refFileList[i].filename, + // "mimetype": refFileList[i].mimetype.split('/')[0], + // "remarks": refFileList[i].remarks, + // "src": tempURL, + // "fileSize": response.data.size, + // }); + // setThumbnailList([...tempList]); + // } + // } + // }) + // .catch(error => { + // console.log(error); + // return false; + // }); + // } + const promises = refFileList.reduce((accumulator, refFile) => { + const promise = axios + .get(`${apiPath}${GET_THUMBNAIL_PATH}/${refFile.id}/${refFile.skey}/${refFile.filename}`, { responseType: 'blob' }) + .then((response) => { + if (response.status === 200) { + const tempURL = URL.createObjectURL(new Blob([response.data], { type: refFile.mimetype })); + if (getObjectById(thumbnailList, refFile.filename) === null) { + const thumbnail = { + id: refFile.id, + fileId: refFile.id, + skey: refFile.skey, + key: refFile.filename + refFile.id, + filename: refFile.filename, + mimetype: refFile.mimetype.split('/')[0], + remarks: refFile.remarks, + src: tempURL, + fileSize: response.data.size + }; + return thumbnail; + } + } + }) + .catch((error) => { + console.log(error); + // create a empty thumbnail object instead of block the form load + const thumbnail = { + id: refFile.id, + fileId: refFile.id, + skey: refFile.skey, + key: refFile.filename + refFile.id, + filename: refFile.filename, + mimetype: refFile.mimetype.split('/')[0], + remarks: refFile.remarks, + fileSize: 0 + }; + return thumbnail; + }); + + accumulator.push(promise); + return accumulator; + }, []); + + Promise.all(promises) + .then((thumbnails) => { + const filteredThumbnails = thumbnails.filter((thumbnail) => thumbnail !== false); + const arrCopy = Array.from(filteredThumbnails); + arrCopy.sort((a, b) => a.key.localeCompare(b.key)); + setThumbnailList([...arrCopy]); + }) + .catch((error) => { + console.log(error); + }); + } else { + setThumbnailList(tempList); + } + + axios + .get(`${apiPath}${GET_AWARD_STORAGE_SIZE}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setUsedFileSize(response.data.size); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + + axios + .get(`${apiPath}${GET_AWARD_VIDEO_EXIST}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setVideoCount(response.data.count); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + }, [refFileList]); + + return !onReady ? ( + + ) : ( + + + + + + + + {isNewRecord ? 'New Award' : 'Maintain Award'} + + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + {isEditing ? ( + + + + + + + + + + + + + + + + + + + + + + + + + ) : ( + + + + + + + + + + + + + )} + + {/*row 3*/} + {params.id > 0 ? ( + + + {/**/} + + ) : ( + + )} + + + ); +}; + +export default ApplicationPanel; diff --git a/src/pages/lionerMaintainEventPage/ApplicationTable.js b/src/pages/lionerMaintainEventPage/ApplicationTable.js new file mode 100644 index 0000000..6417c8f --- /dev/null +++ b/src/pages/lionerMaintainEventPage/ApplicationTable.js @@ -0,0 +1,122 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect, useRef} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; +import AbilityContext from "../../components/AbilityProvider"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function ApplicationTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const ability = useContext(AbilityContext); + + const navigate = useNavigate() + + const gridRef = useRef(null); + + useEffect(() => { + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/application/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="warning" + disabled={!ability.can('VIEW','APPLICATION')} + />] + }, + }, + { + id: 'applicationName', + field: 'applicationName', + headerName: 'Application', + flex: 1, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'subDivisions', + field: 'subDivisions', + //type: 'date', + //sortable: false, + headerName: 'Sub-Divisions', + flex: 1, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'tags', + field: 'tags', + //type: 'date', + //sortable: false, + headerName: 'Tags', + flex: 0.8, + }, + { + id: 'responsibleOfficer', + field: 'responsibleOfficer', + headerName: 'Responsible Officer', + flex: 0.7, + }, + ]; + + return ( +
+ 'auto'} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 5}, + }, + }} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[5]} + autoHeight + /> +
+ ); +} diff --git a/src/pages/lionerMaintainEventPage/EventForm.js b/src/pages/lionerMaintainEventPage/EventForm.js new file mode 100644 index 0000000..3d1091f --- /dev/null +++ b/src/pages/lionerMaintainEventPage/EventForm.js @@ -0,0 +1,1420 @@ +// material-ui +import { + Button, + FormControlLabel, + Grid, InputAdornment, Switch, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useContext, useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {useLocation, useNavigate, useParams} from "react-router-dom"; +import { + GeneralConfirmWindow, + getComboValueByIdList, + getComboValueByLabel, + getDateString, + getDeletedRecordWithRefList, + getIdList, + getNewRecordWithRefList, isOptionEqualToValue, isStringEmptyAfterTrim, notifyDeleteError, notifyDeleteSuccess, + notifySaveSuccess, trimDataBeforePost, +} from "../../utils/CommonFunction"; +import Autocomplete from "@mui/material/Autocomplete"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_EVENT_DUPLICATE, //GET_EVENT_NOTIFICATION_OVERTIME, + GET_EVENT_PATH, + GET_SUB_DIVISION_COMBO_LIST, + POST_EVENT_PATH +} from "../../utils/ApiPathConst"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {eventFrequencyCombo, EVENT_REGION_COMBO, EVENT_TYPE_COMBO} from "../../utils/ComboConst"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../components/UploadProvider"; +import {isObjEmpty} from "../../utils/Utils"; +import AbilityContext from "../../components/AbilityProvider"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const EventForm = ({ refEventDetail, + isNewRecord, + refSubDivisionList, + getEventDetail, + applicationList, + refReminderInterval, + refReminderBefore, + refReminderLimit, + refReminderLimitMax +}) => { + const [overtimeWarning, setOvertimeWarning] = useState(""); + const [reminderInterval, setReminderInterval] = useState(null); + const [reminderBefore, setReminderBefore] = useState(null); + const [reminderLimit, setReminderLimit] = useState(null); + const [reminderLimitMax, setReminderLimitMax] = useState(0); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + const [isFirstInit, setIsFirstInit] = useState(true); + + const params = useParams(); + const navigate = useNavigate(); + const ability = useContext(AbilityContext); + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + const [eventDetail, setEventDetail] = useState({}); + const [isCollectData, setIsCollectData] = useState(false); + const [userConfirm, setUserConfirm] = useState(false); + const [isEditing, setIsEditing] = useState(false); + const { setIsUploading } = useContext(UploadContext); + const [refEvent, setRefEvent] = useState({}); + + //form data + const {register, getValues, setValue} = useForm(); + const [eventDate, setEventDate] = useState(null); + const [awardDate, setAwardDate] = useState(null); + const [deadlineDate, setDeadlineDate] = useState(null); + const [announceDate, setAnnounceDate] = useState(null); + const [selectedRegion, setSelectedRegion] = useState(null); + const [selectedType, setSelectedType] = useState(null); + const [selectedSubDivision, setSelectedSubDivision] = useState([]); + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [reminderFlag, setReminderFlag] = useState(false); + const [isFlagFetched, setIsFlagFetched] = useState(false); + + //reminder option + const [selectedFrequency, setSelectedFrequency] = useState(null); + const [nextApplicationDate, setNextApplicationDate] = useState(null); + + //combo list + const [subDivisionList, setSubDivisionList] = useState([]); + + const [eventDateError, setEventDateError] = React.useState(null); + const [awardDateError, setAwardDateError] = React.useState(null); + const [deadlineDateError, setDeadlineDateError] = React.useState(null); + const [announceDateError, setAnnounceDateError] = React.useState(null); + const [fromError, setFromError] = React.useState(null); + const [toError, setToError] = React.useState(null); + const [nextApplicationDateError, setNextApplicationDateError] = React.useState(null); + + const eventDateErrorMessage = React.useMemo(() => { + switch (eventDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [eventDateError]); + + const awardDateErrorMessage = React.useMemo(() => { + switch (awardDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [awardDateError]); + + const deadlineDateErrorMessage = React.useMemo(() => { + switch (deadlineDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [deadlineDateError]); + + const announceDateErrorMessage = React.useMemo(() => { + switch (announceDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [announceDateError]); + + const fromErrorMessage = React.useMemo(() => { + switch (fromError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [fromError]); + + const toErrorMessage = React.useMemo(() => { + switch (toError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [toError]); + + const nextApplicationDateErrorMessage = React.useMemo(() => { + switch (nextApplicationDateError) { + case 'invalidDate': { + return "Invalid date"; + } + } + }, [nextApplicationDateError]); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + const copyEventAsNew = () => { + navigate(`/event/maintain/-1?refId=${params.id}`); + } + + useEffect(()=>{ + if(applicationList.length===0){ + validateReminder(); + } + },[eventDate, nextApplicationDate, deadlineDate]); + + const validateReminder = () =>{ + const values = getValues(); + let firstIssueDate = null; + let reminderDates = []; + if (eventDate !== null && + nextApplicationDate !== null && + values.reminderThreshold !== null && + values.reminderInterval !== null && + values.reminderLimit !== null + ) { + //have value + if(applicationList.length <=0){ + firstIssueDate = eventDate.add(-values.reminderThreshold,'days'); + } + else{ + firstIssueDate = nextApplicationDate.add(-values.reminderThreshold, 'days'); + } + + reminderDates.push(firstIssueDate); + for(let i=1; i < parseInt(values.reminderLimit)+1 ; i++){ + reminderDates.push(firstIssueDate.add(i*values.reminderInterval,'days')) + } + + for(let j=0; j < reminderDates.length ; j++){ + if(reminderDates[j]-deadlineDate > 0){ + setOvertimeWarning(`Estimated reminder exceeds the application deadline, the last reminder will be generated on ${reminderDates[j>1?j-1:0].format('DD/MM/YYYY')}.`); + return false; + } + } + + setOvertimeWarning(""); + return true; + } + return true; + } + + function updateData(){ + if(applicationList.length >0){ + notifyDeleteError("Delete restricted. Application exist in this event"); + setIsWindowOpen(false); + } + else{ + axios.delete(`${apiPath}${GET_EVENT_PATH}/${params.id}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + returnSearchPage(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + const validateReminderLimit = (value) => { + const maxValue = reminderLimitMax; // Set the maximum value here + if (/^[0-9]\d*$/.test(value) || value === '') { + if (parseInt(value) > maxValue) { + //console.log(value); + setValue("reminderLimit", maxValue) + } + } + else{ + setValue("reminderLimit", ''); + } + }; + + const handleReminderIntervalChange = (event) => { + const inputValue = event.target.value; + if (/^[0-9]\d*$/.test(inputValue) || inputValue === '') { + setValue("reminderInterval", inputValue); + } + else{ + setValue("reminderInterval", ''); + } + }; + + const handleReminderThresholdChange = (event) => { + const inputValue = event.target.value; + if (/^[0-9]\d*$/.test(inputValue) || inputValue === '') { + setValue("reminderThreshold", inputValue); + } + else{ + setValue("reminderThreshold", ''); + } + }; + + useEffect(()=>{ + //if combo list ready + if (subDivisionList.length >0) { + setRefEvent(refEventDetail); + } + },[subDivisionList]); + + useEffect(()=>{ + if(!isObjEmpty(refEvent)){ + setIsFlagFetched(true); + } + },[reminderFlag,refEvent]); + + useEffect(()=>{ + if(isFlagFetched){ + if(!reminderFlag){ + setReminderInterval(null); + setReminderBefore(null); + setReminderLimit(null); + setValue("reminderThreshold",null); + setValue("reminderLimit",null); + setValue("reminderInterval",null); + } + } + },[isFlagFetched, refEvent, reminderFlag]); + + useEffect(()=>{ + setReminderLimitMax(refReminderLimitMax); + if(!isObjEmpty(refEvent) ) { + if(reminderFlag){ + setReminderInterval(refReminderInterval); + setReminderBefore(refReminderBefore); + setReminderLimit(refReminderLimit); + } + } + },[reminderFlag, refReminderLimit,refReminderInterval,refReminderLimitMax,refReminderBefore,refEvent]); + + useEffect(()=>{ + //if ref data ready + if (!isObjEmpty(refEvent)) { + //checkOvertime(); + if(refId !== null){ + setValue("name", refEvent.name); + setValue("nameCht", refEvent.nameCht); + setValue("description", refEvent.description); + setValue("organization", refEvent.organization); + setValue("series", refEvent.series); + } + setSelectedSubDivision(getComboValueByIdList(subDivisionList,refSubDivisionList)); + setSelectedRegion(getComboValueByLabel(EVENT_REGION_COMBO, refEvent.region)); + setSelectedType(getComboValueByLabel(EVENT_TYPE_COMBO, refEvent.eventType)); + setReminderFlag(refEvent.reminderFlag); + setSelectedFrequency(getComboValueByLabel(eventFrequencyCombo, refEvent.frequency)); + setEventDate(dayjs(getDateString(refEvent.startDate))); + setAwardDate( + refEvent.awardDate === null ? null : dayjs(getDateString(refEvent.awardDate)) + ); + setNextApplicationDate( + refEvent.nextApplicationDate === null ? null : dayjs(getDateString(refEvent.nextApplicationDate)) + ); + setAnnounceDate( + refEvent.announcementDate === null ? null : dayjs(getDateString(refEvent.announcementDate)) + ); + setFromDate( + refEvent.eventFrom === null ? null : dayjs(getDateString(refEvent.eventFrom)) + ); + setToDate( + refEvent.eventTo === null ? null : dayjs(getDateString(refEvent.eventTo)) + ); + setDeadlineDate(dayjs(getDateString(refEvent.applicationDeadline))); + } + },[refEvent]); + + useEffect(()=>{ + if( + !isObjEmpty(refEvent) && + selectedSubDivision.length > 0 && + !isObjEmpty(selectedRegion) && + !isObjEmpty(selectedType) && + !isObjEmpty(eventDate) && + !isObjEmpty(deadlineDate) + ){ + setOnReady(true); + } + else if(isNewRecord){ + setOnReady(true); + setIsEditing(true); + } + },[refEvent,selectedSubDivision,selectedRegion,selectedType, eventDate,deadlineDate]); + + useEffect(()=>{ + if(selectedFrequency !== null){ + if(selectedFrequency.key === 5 && isNewRecord){ + setReminderBefore(0); + setReminderInterval(0); + setReminderLimit(0); + setValue("reminderThreshold",null); + setValue("reminderLimit",null); + setValue("reminderInterval",null); + } + else if (isFirstInit && refId !== null){ + setValue("reminderThreshold",refEvent.reminderThreshold); + setValue("reminderLimit",refEvent.reminderLimit); + setValue("reminderInterval",refEvent.reminderInterval); + setIsFirstInit(false); + } + else if(isNewRecord){ + setValue("reminderThreshold",refReminderBefore); + setValue("reminderLimit",refReminderLimit); + setValue("reminderInterval",refReminderInterval); + setReminderInterval(refReminderInterval); + setReminderBefore(refReminderBefore); + setReminderLimit(refReminderLimit); + } + + if (isEditing){ + if (eventDate !== null){ + switch(selectedFrequency.key){ + case 1: + setNextApplicationDate(eventDate.add(1,'month')); + break; + case 2: + setNextApplicationDate(eventDate.add(3,'month')); + break; + case 3: + setNextApplicationDate(eventDate.add(1,'year')); + break; + case 4: + setNextApplicationDate(eventDate.add(6,'month')); + break; + default: + setNextApplicationDate(nextApplicationDate); + break; + } + } + } + } + },[selectedFrequency,eventDate]); + + useEffect(() => { + //if state data are ready and assign to different field + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const formErrors = {}; + + if (isStringEmptyAfterTrim(values.name)) { + formErrors.name = 'Event Name is required'; + } + + + if (selectedRegion === null ) { + formErrors.region = 'Event Region is required'; + } + + if (isStringEmptyAfterTrim(values.organization)) { + formErrors.organization = 'Event Organization is required'; + } + + if (selectedType === null) { + formErrors.type = 'Event Type is required'; + } + + if (eventDate === null) { + formErrors.eventDate = 'Event Date is required'; + } + + if (deadlineDate === null) { + formErrors.deadlineDate = 'Deadline Date is required'; + } + + if (awardDate === null) { + formErrors.awardDate = 'Award Date is required'; + } + + if (selectedSubDivision.length <= 0){ + formErrors.subDivision = 'Sub-Division is required'; + } + + if(reminderFlag){ + if (selectedFrequency === null){ + formErrors.frequency = 'Frequency is required'; + } + + if (!values.reminderThreshold){ + formErrors.threshold = 'Threshold is required'; + } + + if (!values.reminderInterval){ + formErrors.interval = 'Interval is required'; + } + + if (!values.reminderLimit){ + formErrors.limit = 'Limit is required'; + } + + + if(applicationList.length===0){ + if(!validateReminder()){ + formErrors.calError = "calError"; + } + } + + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0 && + !eventDateError && !awardDateError && + !deadlineDateError && !announceDateError && + !fromError && !toError && !nextApplicationDateError + ) { + axios.get(`${apiPath}${CHECK_EVENT_DUPLICATE}`, + { + params: { + "name": values.name.trim(), + "id": params.id, + }, + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if(response.data.isTaken){ + formErrors.name = 'Event name must be unique.'; + setErrors(formErrors); + setIsCollectData(false); + setUserConfirm(false); + } + else if(!response.data.isTaken){ + if (Object.keys(formErrors).length === 0) { + let data = {}; + data["id"] = isNewRecord ? params.id : refEventDetail.id; + data["description"] = values.description; + data["name"] = values.name; + data["nameCht"] = values.nameCht; + data["organization"] = values.organization; + data["reminderThreshold"] = values.reminderThreshold; + data["reminderInterval"] = values.reminderInterval; + data["reminderLimit"] = values.reminderLimit; + data["series"] = values.series; + data["region"] = selectedRegion === null ? null : selectedRegion.label; + data["eventType"] = selectedType === null ? null : selectedType.label; + data["frequency"] = selectedFrequency === null ? null : selectedFrequency.label; + data["reminderFlag"] = reminderFlag; + data["startDate"] = eventDate === null ? null : dayjs(eventDate).format('YYYY-MM-DD'); + data["eventFrom"] = fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'); + data["eventTo"] = toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'); + data["applicationDeadline"] = deadlineDate === null ? null : dayjs(deadlineDate).format('YYYY-MM-DD'); + data["nextApplicationDate"] = nextApplicationDate === null ? null : dayjs(nextApplicationDate).format('YYYY-MM-DD'); + data["announcementDate"] = announceDate === null ? null : dayjs(announceDate).format('YYYY-MM-DD'); + data["awardDate"] = awardDate === null ? null : dayjs(awardDate).format('YYYY-MM-DD'); + data["subDivisionIds"] = isNewRecord ? getIdList(selectedSubDivision) : getNewRecordWithRefList(refSubDivisionList, getIdList(selectedSubDivision)); + data["subDivisionRemoveIds"] = isNewRecord ? [] : getDeletedRecordWithRefList(refSubDivisionList, getIdList(selectedSubDivision)); + setEventDetail(data); + } + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + }, [isCollectData]); + + function returnSearchPage(){ + navigate('/event'); + } + + function createNewApplication(){ + navigate('/application/maintain/-1/'+ params.id); + } + + useEffect(() => { + if (userConfirm) { + postEvent(); + } + setUserConfirm(false); + }, [eventDetail]); + + + const submitData = () => { + setIsCollectData(!isCollectData); + setUserConfirm(true); + } + + const updateIsEdit = () => { + setIsEditing(!isEditing); + } + + function postEvent(){ + setIsUploading(true); + const temp = trimDataBeforePost(eventDetail); + axios.post(`${apiPath}${POST_EVENT_PATH}`, + temp, + ) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + if(isNewRecord){ + setIsUploading(false); + navigate('/event') + } + else{ + setIsUploading(false); + getEventDetail(params.id); + //checkOvertime(); + setIsEditing(!isEditing); + } + setIsCollectData(!isCollectData); + + } + }) + .catch(error => { + if (error.response.status === 422){ + const formErrors = {}; + formErrors.subDivision = error.response.data.error; + setErrors(formErrors); + } + console.log(error); + setIsUploading(false); + return false; + }); + } + + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + Event Name: + * + + + + + + + + + + + + + + Event Name Chinese: + + + + + + + + + + + + + + Event Region: * + + + + + { + setSelectedRegion(newValue); + }} + renderInput={(params) => } + disabled={!isEditing} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Event Organization: * + + + + + + + + + + + + + + Event Type: + * + + + + + { + setSelectedType(newValue); + }} + renderInput={(params) => + } + disabled={!isEditing} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Event Period: + + + + + + + + + setFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: fromErrorMessage, + }, + }} + id="fromDate" + value={fromDate === null ? null : dayjs(fromDate)} + onChange={(newValue) => setFromDate(newValue)} + disabled={!isEditing} + /> + + + + + + To + + + + + + setToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: toErrorMessage, + }, + }} + id="toDate" + //label="To Date" + value={toDate === null ? null : dayjs(toDate)} + onChange={(newValue) => setToDate(newValue)} + disabled={!isEditing} + /> + + + + + + + + + + + + + Application Date: * + + + + + + + setEventDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setEventDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.eventDate || eventDateError, + helperText: eventDateError ? eventDateErrorMessage : errors.eventDate, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + Series: + + + + + + + + + + + + + + Application Deadline: * + + + + + + + setDeadlineDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setDeadlineDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.deadlineDate || deadlineDateError, + helperText: deadlineDateError ? deadlineDateErrorMessage : errors.deadlineDate, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + Award Date: * + + + + + + + setAwardDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setAwardDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.awardDate || awardDateError, + helperText: awardDateError ? awardDateErrorMessage : errors.awardDate, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + Sub-Divisions: * + + + + + option.label} + onChange={(event, newValue) => { + setSelectedSubDivision(newValue); + }} + renderInput={(params) => ( + + {errors.subDivision.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + {...params} + placeholder="" + /> + )} + disabled={!isEditing} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Announcement Date: + + + + + + + setAnnounceDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setAnnounceDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: announceDateErrorMessage, + }, + }} + disabled={!isEditing} + /> + + + + + + + + + + + Event Description: + + + + + + + + + + + + + + Reminder Options + + { + overtimeWarning.length >0 && reminderFlag? + {overtimeWarning} + : + undefined + } + + + + { + setReminderFlag(newValue); + }} + checked={reminderFlag} + disabled={!isEditing} + /> + } + label="Reminder Enable/Disable:" + /> + + + + + + + + + + + Frequency: + * + + + + + option.label} + onChange={(event, newValue) => { + setSelectedFrequency(newValue); + }} + renderInput={(params) => ( + + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Next Application Date: + + + + + + + setNextApplicationDate(newValue)} + format="DD/MM/YYYY" + onError={(newError) => setNextApplicationDateError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + error: !!errors.reminderDate || nextApplicationDateError , + helperText: nextApplicationDateError ? nextApplicationDateErrorMessage : errors.reminderDate, + }, + }} + /> + + + + + + + + + + + Reminder Before: + * + + + + + 0 ? reminderBefore : 0 , + })} + InputProps={{ + inputProps: { min: 0 }, + endAdornment: days, + }} + id='remindBefore' + required + type="number" + onChange={handleReminderThresholdChange} + disabled={!reminderFlag || !isEditing} + error={!!errors.threshold} + helperText={errors.threshold} + autoComplete="off" + /> + + + + + + + + + Reminder Interval: + * + + + + + 0 ? reminderInterval : 0, + })} + InputProps={{ + inputProps: { min: 0 }, + endAdornment: days, + }} + id='reminderInterval' + required + type="number" + onChange={handleReminderIntervalChange} + disabled={!reminderFlag || !isEditing} + error={!!errors.interval} + helperText={errors.interval} + autoComplete="off" + /> + + + + + + + + + Reminder Limit: + * + + + + + 0 ? reminderLimit : 0, + max: reminderLimitMax, + pattern: /^[1-9]\d*$/, // Regular expression to accept positive integers + min: 0, + //validate: validateReminderLimit + })} + InputProps={{ + inputProps: { min: 0 } + }} + id='remindLimit' + required + type="number" + onChange={(e) => validateReminderLimit(e.target.value)} + disabled={!reminderFlag || !isEditing} + error={!!errors.limit} + helperText={errors.limit} + /*InputProps={{ + inputProps: { min: 0, max: reminderLimitMax, maxLength: 2 } + // Set the maximum value here + }}*/ + autoComplete="off" + /> + + + + + + + {/*row 2*/} + { + (isEditing ) ? + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + + + + + + + + + + + } + + + +
+
+ ); +}; + +export default EventForm; diff --git a/src/pages/lionerMaintainEventPage/index.js b/src/pages/lionerMaintainEventPage/index.js new file mode 100644 index 0000000..a0fcaf0 --- /dev/null +++ b/src/pages/lionerMaintainEventPage/index.js @@ -0,0 +1,247 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import EventForm from "./EventForm"; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_EVENT_APPLICATION_PATH, + GET_EVENT_PATH, + GET_REMINDER_BEFORE, + GET_REMINDER_INTERVAL, + GET_REMINDER_LIMIT, + GET_REMINDER_LIMIT_MAX, + GET_SUB_DIVISION_COMBO_LIST, +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {useLocation, useParams} from "react-router-dom"; +import ApplicationTable from "./ApplicationTable"; +import MainCard from "../../components/MainCard"; +import AbilityContext from "../../components/AbilityProvider"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import {isObjEmpty} from "../../utils/Utils"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const EventPanel = () => { + const params = useParams(); + const ability = useContext(AbilityContext); + const location = useLocation(); + const queryParams = new URLSearchParams(location.search); + const refId = queryParams.get("refId"); + + const [onReady, setOnReady] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const [applicationDetail, setApplicationDetail] = useState({}); + const [subDivisionCombo, setSubDivisionCombo] = useState([]); + const [refSubDivisionList, setRefSubDivisionList] = useState([]); + const [eventDetail, setEventDetail] = useState({}); + const [applicationList, setApplicationList] = useState([]); + const [reminderInterval, setReminderInterval] = useState(0); + const [reminderBefore, setReminderBefore] = useState(0); + const [reminderLimit, setReminderLimit] = useState(0); + const [reminderLimitMax, setReminderLimitMax] = useState(0); + + //const [tagCombo, setTagCombo] = useState({}); + + function updateApplicationDetail(applicationData) { + setApplicationDetail(applicationData); + } + + useEffect(() => { + getReminderInterval(); + getReminderBefore(); + getReminderLimit(); + getReminderLimitMax(); + if(refId !== null){ + setIsNewRecord(true); + getEventDetail(refId); + } + else if(params.id<0){ + setIsNewRecord(true); + } + else{ + getEventDetail(params.id); + } + getGroupList(); + getApplicationList(); + }, []); + + function getReminderBefore(){ + axios.get(`${apiPath}${GET_REMINDER_BEFORE}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderBefore(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getReminderLimit(){ + axios.get(`${apiPath}${GET_REMINDER_LIMIT}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderLimit(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getReminderLimitMax(){ + axios.get(`${apiPath}${GET_REMINDER_LIMIT_MAX}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderLimitMax(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + if (!isObjEmpty(subDivisionCombo)) { + setOnReady(true); + } + else if(isNewRecord && + Object.keys(eventDetail).length > 0 + ){ + setOnReady(true); + } + }, [subDivisionCombo,eventDetail]); + + function getApplicationList(){ + const byDivision = { + eventId: params.id, + userSubDivisionId: ability.can('VIEW', 'ALL_RECORD') ? null : localStorage.getItem('subDivisionId'), + } + axios.get(`${apiPath}${GET_EVENT_APPLICATION_PATH}`, + { + params: byDivision, + } + ) + .then((response) => { + if (response.status === 200) { + setApplicationList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getReminderInterval(){ + axios.get(`${apiPath}${GET_REMINDER_INTERVAL}`, + ) + .then((response) => { + if (response.status === 200) { + setReminderInterval(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getEventDetail(eventId) { + axios.get(`${apiPath}${GET_EVENT_PATH}/${eventId}`, + ) + .then((response) => { + if (response.status === 200) { + setEventDetail(response.data.data); + setRefSubDivisionList(response.data.eventDivision); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getGroupList() { + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + ) + .then((response) => { + if (response.status === 200) { + setSubDivisionCombo(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + return ( + !onReady ? + + : + + + + + + + {isNewRecord? "New Event" : "Maintain Event"} + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + { + params.id > 0 ? + + + + + + + + : + undefined + } + + + + ); +}; + +export default EventPanel; diff --git a/src/pages/lionerMaintainSearchTemplatePage/ApplicationTemplateForm.js b/src/pages/lionerMaintainSearchTemplatePage/ApplicationTemplateForm.js new file mode 100644 index 0000000..950e29d --- /dev/null +++ b/src/pages/lionerMaintainSearchTemplatePage/ApplicationTemplateForm.js @@ -0,0 +1,437 @@ +import {Grid, TextField, Typography} from "@mui/material"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import Autocomplete from "@mui/material/Autocomplete"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_DIVISION_COMBO_LIST, GET_LDAP_USER_LIST, + GET_SUB_DIVISION_COMBO_LIST, GET_TAG_COMBO_LIST +} from "../../utils/ApiPathConst"; +import Qs from "qs"; +import { + convertXmlToObject, + getComboValueByIdList, + getComboValueByLabel, + getIdList, + isOptionEqualToValue +} from "../../utils/CommonFunction"; +import {useParams} from "react-router-dom"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {APPLICATION_STATUS_COMBO} from "../../utils/ComboConst"; +import {isObjEmpty} from "../../utils/Utils"; +import {parseString} from "xml2js"; + +export default function ApplicationTemplateForm({setValue, setIsReset, refTemplateData, isReset, isCollectData, applyTemplateValue, register}) { + const params = useParams(); + const [onReady, setOnReady] = useState(false); + + //value + const [selectedTag, setSelectedTag] = useState([]); + const [selectedStatus, setSelectedStatus] = useState(null); + const [selectedOfficer, setSelectedOfficer] = useState(null); + const [selectedSubDivisions, setSelectedSubDivisions] = useState([]); + const [selectedDivisions, setSelectedDivisions] = useState([]); + + const [refApplication, setRefApplication] = useState({}); + + //combo list + const [tagList, setTagList] = useState([]); + const [subDivisionList, setSubDivisionList] = useState([]); + const [divisionList, setDivisionList] = useState([]); + + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const handleLocationCodeChange = (event, value) => { + setSelectedOfficer({ + label: value, + }); + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value,false); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + + // Function to fetch user name options based on locationCode + const fetchLotusUserList = async (input, isInit) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + if(!isObjEmpty(refTemplateData) && isInit){ + setSelectedOfficer( + getComboValueByLabel(convertXmlToObject(result.RECORDS.RECORD), + refTemplateData.selectedOfficer)); + } + setLotusNoteUserList(convertXmlToObject(result.RECORDS.RECORD)); + }); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + useEffect(() => { + getTagCombo(); + getDivisionCombo(); + getSubDivisionCombo(null); + }, []); + + useEffect(() => { + if(isReset){ + setValue('eventName', "" ); + setValue('applicationName', "" ); + setValue('description', "" ); + setSelectedSubDivisions([]); + setSelectedDivisions([]); + setSelectedTag([]); + setSelectedStatus(null); + setSelectedOfficer(""); + setIsReset(false) + } + + }, [isReset]); + + useEffect(()=>{ + if(tagList.length > 0 && + subDivisionList.length > 0 && + divisionList.length > 0 + ){ + setRefApplication(refTemplateData); + } + },[tagList,subDivisionList,divisionList]); + + useEffect(() => { + if (Object.keys(refApplication).length > 0 + && params.id > 0 + ) { + if(refTemplateData.selectedOfficer !== null){ + //const locationCode = refTemplateData.selectedOfficer.split('(')[1].replace(')',''); + fetchLotusUserList(refTemplateData.selectedOfficer,true); + } + setSelectedTag(getComboValueByIdList(tagList,refApplication.selectedTag)); + setSelectedDivisions(getComboValueByIdList(divisionList,refApplication.selectedDivisions)); + setSelectedSubDivisions(getComboValueByIdList(subDivisionList,refApplication.selectedSubDivisions)); + setSelectedStatus(getComboValueByLabel(APPLICATION_STATUS_COMBO,refApplication.selectedStatus)); + setOnReady(true); + } + else if ( params.id < 0){ + setOnReady(true); + } + }, [refApplication]); + + useEffect(() => { + if(isCollectData){ + let data = { + selectedTag: selectedTag.length <1 ? [] : getIdList(selectedTag), + selectedStatus: selectedStatus === null ? null : selectedStatus.label, + selectedOfficer: selectedOfficer === null ? null : selectedOfficer.label, + selectedDivisions: selectedDivisions.length <1 ? [] : getIdList(selectedDivisions), + selectedSubDivisions: selectedSubDivisions.length <1 ? [] : getIdList(selectedSubDivisions), + }; + applyTemplateValue(data); + } + }, [isCollectData]); + + function getSubDivisionCombo(divisionIds){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + { + params: { + "divisionIds": divisionIds + }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + // useEffect(() => { + // if(selectedDivisions !== null && selectedDivisions !== undefined){ + // const temp = selectedDivisions.length > 0 ? getIdList(selectedDivisions) : []; + // getSubDivisionCombo(temp); + // } + // if(selectedDivisions.length <=0){ + // setSelectedSubDivisions([]); + // } + // }, [selectedDivisions]); + + // useEffect(() => { + // removeInvalidSubDivision(getIdList(selectedDivisions)); + // }, [subDivisionList]); + // + // function removeInvalidSubDivision (divisionIdList){ + // let temp = selectedSubDivisions; + // let output = []; + // for(let i=0 ; i { + if (response.status === 200) { + setDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getTagCombo(){ + axios.get(`${apiPath}${GET_TAG_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setTagList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + return !onReady ? + + : + + + + + + Event Name: + + + + + + + + + + + + + + Application Name: + + + + + + + + + + + + + + Application Description: + + + + + + + + + + + + + + Tag: + + + + + { + setSelectedTag(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Division: + + + + + { + setSelectedDivisions(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Sub-Division: + + + + + { + setSelectedSubDivisions(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Responsible Officer: + + + + + { + setSelectedOfficer(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Status: + + + + + { + setSelectedStatus(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + +} \ No newline at end of file diff --git a/src/pages/lionerMaintainSearchTemplatePage/AwardTemplateForm.js b/src/pages/lionerMaintainSearchTemplatePage/AwardTemplateForm.js new file mode 100644 index 0000000..5865e46 --- /dev/null +++ b/src/pages/lionerMaintainSearchTemplatePage/AwardTemplateForm.js @@ -0,0 +1,737 @@ +import {Grid, TextField,Typography} from "@mui/material"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import Autocomplete from "@mui/material/Autocomplete"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_CATEGORY_COMBO_LIST, + GET_DIVISION_COMBO_LIST, GET_LDAP_USER_LIST, + GET_PROMOTION_CHANNEL_COMBO_LIST, + GET_SUB_DIVISION_COMBO_LIST, GET_TAG_COMBO_LIST +} from "../../utils/ApiPathConst"; +import Qs from "qs"; +import { + convertXmlToObject, + getComboValueByIdList, + getComboValueByLabel, + getIdList, + isOptionEqualToValue +} from "../../utils/CommonFunction"; +import {useParams} from "react-router-dom"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {parseString} from "xml2js"; +import {isObjEmpty} from "../../utils/Utils"; + +export default function AwardTemplateForm({setValue,setIsReset, refTemplateData, + isReset, isCollectData, applyTemplateValue, + register, setIsCollectData}) { + const params = useParams(); + const [onReady, setOnReady] = useState(false); + + //value + const [selectedTag, setSelectedTag] = useState([]); + const [selectedChannels, setSelectedChannels] = useState([]); + const [selectedOfficer, setSelectedOfficer] = useState(null); + const [selectedSubDivisions, setSelectedSubDivisions] = useState([]); + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [selectedCategories, setSelectedCategories] = useState([]); + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [refAward, setRefAward] = useState({}); + const [awardFromDate, setAwardFromDate] = useState(null); + const [awardToDate, setAwardToDate] = useState(null); + + //combo list + const [tagList, setTagList] = useState([]); + const [channelList, setChannelList] = useState([]); + const [categoryList, setCategoryList] = useState([]); + const [subDivisionList, setSubDivisionList] = useState([]); + const [divisionList, setDivisionList] = useState([]); + + const [eventFromError, setEventFromError] = React.useState(null); + const [eventToError, setEventToError] = React.useState(null); + + const eventFromErrorMessage = React.useMemo(() => { + switch (eventFromError) { + case 'invalidDate': { + return "Please input a valid date"; + } + } + }, [eventFromError]); + + const eventToErrorMessage = React.useMemo(() => { + switch (eventToError) { + case 'invalidDate': { + return "Please input a valid date"; + } + } + }, [eventToError]); + + const [awardFromError, setAwardFromError] = React.useState(null); + const [awardToError, setAwardToError] = React.useState(null); + + const awardFromErrorMessage = React.useMemo(() => { + switch (awardFromError) { + case 'invalidDate': { + return "Please input a valid date"; + } + } + }, [awardFromError]); + + const awardToErrorMessage = React.useMemo(() => { + switch (awardToError) { + case 'invalidDate': { + return "Please input a valid date"; + } + } + }, [awardToError]); + + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const handleLocationCodeChange = (event, value) => { + setSelectedOfficer({ + label: value, + }); + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value,false); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + + // Function to fetch user name options based on locationCode + const fetchLotusUserList = async (input, isInit) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + if(!isObjEmpty(refTemplateData) && isInit){ + setSelectedOfficer( + getComboValueByLabel(convertXmlToObject(result.RECORDS.RECORD), + refTemplateData.selectedOfficer)); + } + setLotusNoteUserList(convertXmlToObject(result.RECORDS.RECORD)); + }); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + useEffect(() => { + getTagCombo(); + getDivisionCombo(); + getCategoryCombo(); + getChannelCombo(); + getSubDivisionCombo(null); + }, []); + + useEffect(() => { + if(isReset){ + setValue('eventName', "" ); + setValue('applicationName', "" ); + setValue('awardName', "" ); + setValue('storageLocation', "" ); + setValue('physicalAward', "" ); + setSelectedSubDivisions([]); + setSelectedDivisions([]); + setSelectedTag([]); + setSelectedCategories([]); + setSelectedOfficer(""); + setFromDate(null); + setToDate(null); + setAwardFromDate(null); + setAwardToDate(null); + setSelectedChannels([]) + setIsReset(false) + } + }, [isReset]); + + useEffect(()=>{ + if(channelList.length >0 && + subDivisionList.length >0 && + categoryList.length >0 + ){ + setRefAward(refTemplateData); + } + },[channelList,subDivisionList,categoryList]); + + useEffect(() => { + if (Object.keys(refAward).length > 0 + && params.id > 0 + ) { + if(refTemplateData.selectedOfficer !== null){ + //const locationCode = refTemplateData.selectedOfficer.split('(')[1].replace(')',''); + fetchLotusUserList(refTemplateData.selectedOfficer,true); + } + setSelectedTag(getComboValueByIdList(tagList,refAward.selectedTag)); + setSelectedCategories(getComboValueByIdList(categoryList,refAward.selectedCategories)); + setSelectedDivisions(getComboValueByIdList(divisionList,refAward.selectedDivisions)); + setSelectedSubDivisions(getComboValueByIdList(subDivisionList,refAward.selectedSubDivisions)); + setSelectedChannels(getComboValueByIdList(channelList,refAward.selectedChannels)); + setFromDate( + refAward.fromDate === null ? null : dayjs(refAward.fromDate) + ); + setToDate( + refAward.toDate === null ? null : dayjs(refAward.toDate) + ) + setAwardFromDate( + refAward.awardFromDate === null ? null : dayjs(refAward.awardFromDate) + ); + setAwardToDate( + refAward.awardToDate === null ? null : dayjs(refAward.awardToDate) + ) + setOnReady(true); + } + else if ( params.id < 0){ + setOnReady(true); + } + }, [refAward]); + + useEffect(() => { + if(isCollectData){ + if(!eventFromError && !eventToError && !awardFromError && !awardToError) { + let data = { + selectedTag: selectedTag.length <1 ? [] : getIdList(selectedTag), + selectedChannels: getIdList(selectedChannels), + selectedOfficer: selectedOfficer === null ? null : selectedOfficer.label, + selectedDivisions: selectedDivisions.length <1 ? [] : getIdList(selectedDivisions), + selectedSubDivisions: selectedSubDivisions.length <1 ? [] : getIdList(selectedSubDivisions), + selectedCategories: selectedCategories.length <1 ? [] : getIdList(selectedCategories), + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + awardFromDate: awardFromDate === null ? null : dayjs(awardFromDate).format('YYYY-MM-DD'), + awardToDate: awardToDate === null ? null : dayjs(awardToDate).format('YYYY-MM-DD'), + }; + applyTemplateValue(data); + } + else{ + setIsCollectData(false); + } + + } + }, [isCollectData]); + + function getSubDivisionCombo(divisionIds){ + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`, + { + params: { + "divisionIds": divisionIds + }, + paramsSerializer: function (params) { + return Qs.stringify(params, { arrayFormat: 'repeat' }); + }, + }) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + // useEffect(() => { + // if(selectedDivisions !== null && selectedDivisions !== undefined){ + // const temp = selectedDivisions.length > 0 ? getIdList(selectedDivisions) : []; + // getSubDivisionCombo(temp); + // } + // if(selectedDivisions.length <=0){ + // setSelectedSubDivisions([]); + // } + // }, [selectedDivisions]); + + // useEffect(() => { + // removeInvalidSubDivision(getIdList(selectedDivisions)); + // }, [subDivisionList]); + + // function removeInvalidSubDivision (divisionIdList){ + // let temp = selectedSubDivisions; + // let output = []; + // for(let i=0 ; i { + if (response.status === 200) { + setDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getChannelCombo(){ + axios.get(`${apiPath}${GET_PROMOTION_CHANNEL_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setChannelList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getCategoryCombo(){ + axios.get(`${apiPath}${GET_CATEGORY_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setCategoryList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getTagCombo(){ + axios.get(`${apiPath}${GET_TAG_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setTagList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + return !onReady ? + + : + + + + + + Event Name: + + + + + + + + + + + + + + Application Name: + + + + + + + + + + + + + + Award Name: + + + + + + + + + + + + + + Event Date: + + + + + + + + + setEventFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: eventFromErrorMessage, + }, + }} + value={fromDate === null ? null : dayjs(fromDate)} + onChange={(newValue) => setFromDate(newValue)} + /> + + + + + + To + + + + + + setEventToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: eventToErrorMessage, + }, + }} + value={toDate === null ? null : dayjs(toDate)} + onChange={(newValue) => setToDate(newValue)} + /> + + + + + + + + + + + + + Award Date: + + + + + + + + + setAwardFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: awardFromErrorMessage, + }, + }} + format="DD/MM/YYYY" + value={awardFromDate === null ? null : dayjs(awardFromDate)} + onChange={(newValue) => setAwardFromDate(newValue)} + /> + + + + + + To + + + + + + setAwardToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: awardToErrorMessage, + }, + }} + format="DD/MM/YYYY" + //label="To Date" + value={awardToDate === null ? null : dayjs(awardToDate)} + onChange={(newValue) => setAwardToDate(newValue)} + /> + + + + + + + + + + + + + + Category: + + + + + { + setSelectedCategories(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Tag: + + + + + { + setSelectedTag(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Division: + + + + + { + setSelectedDivisions(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Sub-Division: + + + + + { + setSelectedSubDivisions(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Responsible Officer: + + + + + { + setSelectedOfficer(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Promotion Channel: + + + + + { + setSelectedChannels(newValue); + }} + renderInput={(params) => } + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Storage Location: + + + + + + + + + + + + + + Physical Award: + + + + + + + + + + + +} \ No newline at end of file diff --git a/src/pages/lionerMaintainSearchTemplatePage/EventTemplateForm.js b/src/pages/lionerMaintainSearchTemplatePage/EventTemplateForm.js new file mode 100644 index 0000000..2c11f48 --- /dev/null +++ b/src/pages/lionerMaintainSearchTemplatePage/EventTemplateForm.js @@ -0,0 +1,423 @@ +import {Grid, TextField,Typography} from "@mui/material"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import Autocomplete from "@mui/material/Autocomplete"; +import {EVENT_REGION_COMBO, EVENT_TYPE_COMBO} from "../../utils/ComboConst"; +import {LocalizationProvider} from "@mui/x-date-pickers/LocalizationProvider"; +import {AdapterDayjs} from "@mui/x-date-pickers/AdapterDayjs"; +import {DemoItem} from "@mui/x-date-pickers/internals/demo"; +import {DatePicker} from "@mui/x-date-pickers/DatePicker"; +import dayjs from "dayjs"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_DIVISION_COMBO_LIST, GET_SUB_DIVISION_COMBO_LIST} from "../../utils/ApiPathConst"; +import Qs from "qs"; +import {getComboValueByIdList, getComboValueByLabel, getIdList, isOptionEqualToValue} from "../../utils/CommonFunction"; +import {useParams} from "react-router-dom"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +export default function EventTemplateForm({setValue,setIsReset, refTemplateData, + isReset, isCollectData, applyTemplateValue, + register, setIsCollectData}) { + const params = useParams(); + const [onReady, setOnReady] = useState(false); + + const [selectedRegion, setSelectedRegion] = useState(null); + const [selectedType, setSelectedType] = useState(null); + const [selectedSubDivisions, setSelectedSubDivisions] = useState([]); + const [selectedDivisions, setSelectedDivisions] = useState([]); + const [fromDate, setFromDate] = useState(null); + const [toDate, setToDate] = useState(null); + const [refEvent, setRefEvent] = useState({}); + + const [subDivisionList, setSubDivisionList] = useState([]); + const [divisionList, setDivisionList] = useState([]); + + const [fromError, setFromError] = React.useState(null); + const [toError, setToError] = React.useState(null); + + const fromErrorMessage = React.useMemo(() => { + switch (fromError) { + case 'invalidDate': { + return "Please input a valid date"; + } + } + }, [fromError]); + + const toErrorMessage = React.useMemo(() => { + switch (toError) { + case 'invalidDate': { + return "Please input a valid date"; + } + } + }, [toError]); + + useEffect(() => { + if(isReset){ + setValue('eventName', "" ); + setValue('description', "" ); + setValue('organization', "" ); + setSelectedSubDivisions([]); + setSelectedDivisions([]); + setSelectedRegion(null); + setSelectedType(null); + setFromDate(null); + setToDate(null); + setIsReset(false) + } + }, [isReset]); + + useEffect(()=>{ + if(divisionList.length >0 && subDivisionList.length >0){ + setRefEvent(refTemplateData); + } + },[divisionList,subDivisionList]); + + useEffect(() => { + if (Object.keys(refEvent).length > 0 + && params.id > 0 + ) { + setSelectedRegion(getComboValueByLabel(EVENT_REGION_COMBO,refEvent.selectedRegion)); + setSelectedDivisions(getComboValueByIdList(divisionList,refEvent.selectedDivisions)); + setSelectedType(getComboValueByLabel(EVENT_TYPE_COMBO,refEvent.selectedType)); + setSelectedSubDivisions(getComboValueByIdList(subDivisionList,refEvent.selectedSubDivisions)); + setFromDate( + refEvent.fromDate === null ? null : dayjs(refEvent.fromDate) + ); + setToDate( + refEvent.toDate === null ? null : dayjs(refEvent.toDate) + ); + setOnReady(true); + } + else if ( params.id < 0){ + setOnReady(true); + } + }, [refEvent]); + + useEffect(() => { + if(isCollectData){ + if(!fromError && !toError){ + let data = { + selectedRegion: selectedRegion === null ? null : selectedRegion.label, + selectedType: selectedType === null ? null : selectedType.label, + selectedDivisions: selectedDivisions.length === 0 ? [] : getIdList(selectedDivisions), + selectedSubDivisions: selectedSubDivisions.length === 0 ? [] : getIdList(selectedSubDivisions), + fromDate: fromDate === null ? null : dayjs(fromDate).format('YYYY-MM-DD'), + toDate: toDate === null ? null : dayjs(toDate).format('YYYY-MM-DD'), + }; + applyTemplateValue(data); + } + else{ + setIsCollectData(false); + } + } + }, [isCollectData]); + + // useEffect(() => { + // if(selectedDivisions !== null && selectedDivisions !== undefined){ + // //change according to subDivision + // const temp = selectedDivisions.length > 0 ? getIdList(selectedDivisions) : []; + // getSubDivisionCombo(temp); + // } + // if(selectedDivisions.length <=0){ + // setSelectedSubDivisions([]); + // } + // }, [selectedDivisions]); + + // useEffect(() => { + // if(selectedDivisions.length >0){ + // removeInvalidSubDivision(getIdList(selectedDivisions)); + // } + // }, [subDivisionList]); + // + // function removeInvalidSubDivision (divisionIdList){ + // let temp = selectedSubDivisions; + // let output = []; + // for(let i=0 ; i { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getDivisionCombo(){ + axios.get(`${apiPath}${GET_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getDivisionCombo(); + getSubDivisionCombo(null); + }, []); + + return !onReady ? + + : + + + + + + Event Name: + + + + + + + + + + + + + + Event Description: + + + + + + + + + + + + + + Event Organization: + + + + + + + + + + + + + + Event Region: + + + + + { + setSelectedRegion(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Event Type: + + + + + { + setSelectedType(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Application Date: + + + + + + + + + setFromError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: fromErrorMessage, + }, + }} + value={fromDate === null ? null : dayjs(fromDate)} + onChange={(newValue) => setFromDate(newValue)} + /> + + + + + + + To + + + + + + + setToError(newError)} + slotProps={{ + field: { clearable: true }, + textField: { + helperText: toErrorMessage, + }, + }} + value={toDate === null ? null : dayjs(toDate)} + onChange={(newValue) => setToDate(newValue)} + /> + + + + + + + + + + + + + Division: + + + + + { + setSelectedDivisions(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Sub-Division: + + + + + { + setSelectedSubDivisions(newValue); + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + +} \ No newline at end of file diff --git a/src/pages/lionerMaintainSearchTemplatePage/index.js b/src/pages/lionerMaintainSearchTemplatePage/index.js new file mode 100644 index 0000000..87470cd --- /dev/null +++ b/src/pages/lionerMaintainSearchTemplatePage/index.js @@ -0,0 +1,348 @@ +// material-ui +import { + Button, + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {MODULE_COMBO} from "../../utils/ComboConst"; +import Autocomplete from "@mui/material/Autocomplete"; +import {useContext, useEffect, useState} from "react"; +import EventTemplateForm from "./EventTemplateForm"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import { + GET_SEARCH_TEMPLATE_PATH, + POST_SEARCH_TEMPLATE_PATH, VALIDATE_TEMPLATE_NAME_PATH, +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {useNavigate, useParams} from "react-router-dom"; +import { + getComboValueByLabel, + isOptionEqualToValue, + notifySaveSuccess, + trimDataBeforePost +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {isObjEmpty} from "../../utils/Utils"; +import AwardTemplateForm from "./AwardTemplateForm"; +import ApplicationTemplateForm from "./ApplicationTemplateForm"; +import {ThemeProvider} from "@emotion/react"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const MaintainTemplatePage = () => { + const params = useParams(); + const navigate = useNavigate(); + const [errors, setErrors] = useState({}); + + const { reset, register, handleSubmit, setValue } = useForm() + const [onReady, setOnReady] = useState(false); + const { setIsUploading } = useContext(UploadContext); + + const [isReset, setIsReset] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [isUserConfirm, setIsUserConfirm] = useState(false); + + const [formData, setFormData] = useState(null); + const [templateValue, setTemplateValue] = useState(null); + const [selectedModule, setSelectedModule] = useState(null); + const [refTemplateData , setRefTemplateData] = useState({}); + + const [templateData, setTemplateData] = useState({}); + + function validateTemplateName(name, temp) { + const userData = getUserData(); + + axios + .get(`${apiPath}${VALIDATE_TEMPLATE_NAME_PATH}`, { + params: { + name: name.trim(), + userId: userData.id, + templateId: params.id, + module: selectedModule.label, + } + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if (response.data.isTaken) { + formErrors.name = 'Name have been taken'; + setErrors(formErrors); + } else if (!response.data.isTaken) { + if (Object.keys(formErrors).length === 0) { + let templateSet={ + id: params.id, + userId: userData.id, + name: formData.name.trim(), + module: selectedModule.label, + criteria: JSON.stringify(temp), + } + setIsUploading(true); + axios.post(`${apiPath}${POST_SEARCH_TEMPLATE_PATH}`, + templateSet, + ) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + notifySaveSuccess(); + navigate('/template'); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + } + } + }) + .catch((error) => { + console.log(error); + return true; + }); + } + + const onSubmit = (data) => { + setFormData(data); + setIsUserConfirm(true); + setIsCollectData(!isCollectData); + }; + + useEffect(() => { + if(isCollectData && isUserConfirm){ + const formErrors = {}; + if(!selectedModule){ + formErrors.module = "Module is required"; + } + + if (!formData.name || formData.name.trim().length === 0 ) { + formErrors.name = 'Template name is required'; + } + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0 && templateValue!== null) { + let temp={ + ...formData, + ...templateValue + } + temp = trimDataBeforePost(temp); + validateTemplateName(formData.name,temp); + setIsUploading(false); + setIsUserConfirm(false); + setIsCollectData(false); + } + else if(Object.keys(formErrors).length >0){ + setTemplateValue(null); + setIsUploading(false); + setIsUserConfirm(false); + setIsCollectData(false); + } + } + }, [templateValue,isCollectData,isUserConfirm]); + + function applyTemplateValue(input){ + setTemplateValue(input); + } + + const resetForm = () => { + reset(); + setIsReset(true); + } + + useEffect(() => { + if(params.id>0){ + getTemplateData(); + } + }, []); + + useEffect(() => { + if(!isObjEmpty(templateData) && !isObjEmpty(refTemplateData)){ + setSelectedModule(getComboValueByLabel(MODULE_COMBO, templateData.module)); + setOnReady(true); + } + else if(params.id <0){ + setOnReady(true); + } + }, [templateData,refTemplateData]); + + function getTemplateData() { + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_PATH}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setTemplateData(response.data.data); + setRefTemplateData(JSON.parse(response.data.data.criteria)); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + renderByModule(); + }, [selectedModule]); + + const renderByModule = () => { + if(selectedModule !== null){ + switch (selectedModule.key){ + case 1: + return + case 2: + return + case 3: + return + default: + return ""; + } + } + } + + return ( + !onReady ? + + : + + + + Maintain Search Template + + + +
+ + + {/*row 1*/} + + + + + + Module: + + * + + + + { + setSelectedModule(newValue); + }} + disabled={params.id>0} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Template Name: + + * + + + + + + + + {renderByModule()} + + {/* last row */} + + + + + + + + + + + + + + + + + +
+
+
+
+
+ + ); +}; + +export default MaintainTemplatePage; diff --git a/src/pages/lionerManualButtonPage/index.js b/src/pages/lionerManualButtonPage/index.js new file mode 100644 index 0000000..5d4cd22 --- /dev/null +++ b/src/pages/lionerManualButtonPage/index.js @@ -0,0 +1,195 @@ +// material-ui +import { + Typography, Grid, Button +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import CampaignIcon from "@mui/icons-material/Campaign"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import ReplayIcon from '@mui/icons-material/Replay'; +import { + POST_RESEND_FAIL_EMAIL, + POST_TODO_TEST_ANNOUNCEMENT, + POST_TODO_TEST_REMINDER, + //XML_TEST +} from "../../utils/ApiPathConst"; +import {notifyDeleteError, notifyInfo, notifySuccess} from "../../utils/CommonFunction"; +// import {useContext} from "react"; +// import UploadContext from "../../components/UploadProvider"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const SettingPage = () => { + //zconst { setIsUploading } = useContext(UploadContext); + + function triggerApplicationSchedule(){ + notifyInfo("Schedule have been manually triggered"); + axios.get(`${apiPath}${POST_TODO_TEST_REMINDER}`) + .then(() => { + notifySuccess("Schedule job finished!"); + }) + .catch(error => { + notifyDeleteError("Error occur during schedule job"); + console.log(error); + return false; + }); + } + + function triggerAnnouncementSchedule(){ + notifyInfo("Schedule have been manually triggered."); + axios.get(`${apiPath}${POST_TODO_TEST_ANNOUNCEMENT}`) + .then(() => { + notifySuccess("Schedule job finished!"); + }) + .catch(error => { + notifyDeleteError("Error occur during schedule job"); + console.log(error); + return false; + }); + } + + function triggerResendFailEmail(){ + notifyInfo("Resending failed email."); + axios.get(`${apiPath}${POST_RESEND_FAIL_EMAIL}`) + .then(() => { + notifySuccess("Resend email job finished!"); + }) + .catch(error => { + notifyDeleteError("Error occur when resending email"); + console.log(error); + return false; + }); + } + + // function testXML(){ + // notifyInfo("Download XML"); + // axios.get(`${apiPath}${XML_TEST}`) + // .then((response) => { + // if (response.status === 200) { + // setIsUploading(false); + // const url = URL.createObjectURL(new Blob([response.data])); + // const link = document.createElement("a"); + // link.href = url; + // link.setAttribute("download", response.headers['filename']); + // link.click(); + // } + // }) + // .catch(error => { + // notifyDeleteError("Downlaod Fail!"); + // console.log(error); + // return false; + // }); + // } + + return ( + + + + Generate Reminder + + + + + + + + Trigger Reminder (For Test) + + + + + + + + + + + + + + + + + + + + + + Resend Failed Reminder + + + + + + + + + + + + + {/**/} + {/* */} + {/* */} + {/* XML Test*/} + {/* */} + {/* */} + {/* */} + {/* */} + {/* }*/} + {/* >*/} + {/* Download XML*/} + {/* */} + + {/* */} + {/* */} + {/* */} + {/* */} + {/**/} + + + + + + + + + ); +}; + +export default SettingPage; diff --git a/src/pages/lionerPasswordPolicyPage/index.js b/src/pages/lionerPasswordPolicyPage/index.js new file mode 100644 index 0000000..1b4d480 --- /dev/null +++ b/src/pages/lionerPasswordPolicyPage/index.js @@ -0,0 +1,452 @@ +// material-ui +import { + Button, + CardContent, Divider, FormControlLabel, + Grid, InputAdornment, Switch, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import {LIONER_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_PASSWORD_POLICY_PATH, UPDATE_SETTING_PATH} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {getObjectByName, notifySaveSuccess} from "../../utils/CommonFunction"; +import {SETTING_STRING_DICT} from "../../utils/SettingConst"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const PasswordPolicyPage = () => { + + const { reset, register, handleSubmit } = useForm() + const [aNonA, setANonA] = useState(false); + const [needSpecialCharacter, setNeedSpecialCharacter] = useState(false); + const [noUsernameAsPart, setNoUsernameAsPart] = useState(false); + const [noConsecutiveChar, setNoConsecutiveChar] = useState(false); + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + + const onSubmit = (data) => { + + const formErrors = {}; + if (!data.passwordLength) { + formErrors.passwordLength = 'Setting value cannot be null'; + } + + if (!data.passwordDuration) { + formErrors.passwordDuration = 'Setting value cannot be null'; + } + + if (!data.passwordHistory) { + formErrors.passwordHistory = 'Setting value cannot be null'; + } + + if (!data.maxLoginFailure) { + formErrors.maxLoginFailure = 'Setting value cannot be null'; + } + + if (!data.loginFailPenaltyTime) { + formErrors.loginFailPenaltyTime = 'Setting value cannot be null'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + let tempSettingList =[]; + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_LENGTH, + "value": data.passwordLength + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_DURATION, + "value": data.passwordDuration + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_HISTORY, + "value": data.passwordHistory + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.LOGIN_ATTEMPT_LIMIT, + "value": data.maxLoginFailure + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.LOGIN_ATTEMPT_PENALTY, + "value": data.loginFailPenaltyTime + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_RULE_NUMBER_AND_CHAR, + "value": aNonA.toString() + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_RULE_SPECIAL_CHAR, + "value": needSpecialCharacter.toString() + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_RULE_NO_USERNAME, + "value": noUsernameAsPart.toString() + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.PASSWORD_RULE_NO_THREE_CONSECUTIVE_CHAR, + "value": noConsecutiveChar.toString() + }); + + axios.put(`${apiPath}${UPDATE_SETTING_PATH}`, + { + settingList: tempSettingList + }, + ) + .then((response) => { + if (response.status === 204) { + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + }; + + const [refRecord, setRefRecord] = useState([]); + + useEffect(() => { + getSettingList(); + }, []); + + useEffect(() => { + if(refRecord.length >0){ + setANonA(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_NUMBER_AND_CHAR).value === "true") + setNeedSpecialCharacter(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_SPECIAL_CHAR).value === "true") + setNoConsecutiveChar(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_NO_USERNAME).value === "true"); + setNoUsernameAsPart(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_NO_THREE_CONSECUTIVE_CHAR).value === "true"); + setOnReady(true); + } + }, [refRecord]); + + function getSettingList() { + axios.get(`${apiPath}${GET_PASSWORD_POLICY_PATH}` + ) + .then((response) => { + if (response.status === 200) { + setRefRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function resetForm(){ + setANonA(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_NUMBER_AND_CHAR).value === "true") + setNeedSpecialCharacter(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_SPECIAL_CHAR).value === "true") + setNoConsecutiveChar(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_NO_USERNAME).value === "true"); + setNoUsernameAsPart(getObjectByName(refRecord,SETTING_STRING_DICT.PASSWORD_RULE_NO_THREE_CONSECUTIVE_CHAR).value === "true"); + reset(); + } + return ( + !onReady ? + + : + + + + Password Policy + + + + +
+ {/*Title*/} + + + + + {/*row 1*/} + + + + + + Length of Password + + * + + + + + + + + + + + {/*row 2*/} + + + + + + Change Password (days) + + * + + + + + days, + }} + /> + + + + + + {/*row 3*/} + + + + + + Password History + + * + + + + + + + + + + + {/*row 4*/} + + + + + + Maximum number of login failure + + * + + + + + + + + + + + {/*row 5*/} + + + + + + Penalty time of login failure (minutes) + + * + + + + + minutes, + }} + /> + + + + + + + + {/*row 7*/} + + + + + { + setANonA(newValue); + }} + checked={aNonA} + /> + } + labelPlacement="start" + label={ + + Contain at least one alphabetic and non-alphabetic character + + }/> + + + + + + {/*row 8*/} + + + + + { + setNeedSpecialCharacter(newValue); + }} + checked={needSpecialCharacter} + /> + } + labelPlacement="start" + label={ + + Contain at least one special character (eg. #,$,@ etc) + } + /> + + + + + + {/*row 9*/} + + + + + { + setNoUsernameAsPart(newValue); + }} + checked={noUsernameAsPart} + /> + } + labelPlacement="start" + label={ + + Not contain the username as part of password + + } + /> + + + + + + {/*row 10*/} + + + + + { + setNoConsecutiveChar(newValue); + }} + checked={noConsecutiveChar} + /> + } + labelPlacement="start" + label={ + + Contain no more than three identical consecutive characters + + } + /> + + + + + + {/*last row*/} + + + + + + + + + + + + + + + +
+
+
+
+ + ); +}; + +export default PasswordPolicyPage; diff --git a/src/pages/lionerPromotionChannelPage/ChannelSearchForm.js b/src/pages/lionerPromotionChannelPage/ChannelSearchForm.js new file mode 100644 index 0000000..462cdec --- /dev/null +++ b/src/pages/lionerPromotionChannelPage/ChannelSearchForm.js @@ -0,0 +1,84 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ChannelSearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + applySearch(data); + }; + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + Promotion Channel Name + + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + +
+ ); +}; + +export default ChannelSearchForm; diff --git a/src/pages/lionerPromotionChannelPage/ChannelTable.js b/src/pages/lionerPromotionChannelPage/ChannelTable.js new file mode 100644 index 0000000..606a835 --- /dev/null +++ b/src/pages/lionerPromotionChannelPage/ChannelTable.js @@ -0,0 +1,338 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, GridPreProcessEditCellProps, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useContext, useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {CHECK_CHANNEL_DUPLICATE, GET_PROMOTION_CHANNEL_LIST, UPDATE_PROMOTION_CHANNEL} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +//import {useEffect} from "react"; + +// ==============================|| EVENT TABLE - COLUMN ||============================== // + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + } + ,...oldRows + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| CHANNEL TABLE ||============================== // + +export default function ChannelTable({recordList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const { setIsUploading } = useContext(UploadContext); + // ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(-1); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_PROMOTION_CHANNEL_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(()=>{ + setRows(recordList); + },[recordList]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateChannel(data) { + if(data.name.trim().length === 0){ + notifyDeleteError(`Name cannot be null`); + handleEditClick(data.id); + } + else{ + axios.get(`${apiPath}${CHECK_CHANNEL_DUPLICATE}`, + { + params: { + "name": data.name.trim(), + "id": data.id + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + notifyDeleteError(`${data.name} already exists.`) + handleEditClick(data.id); + } + else if(!response.data.isTaken){ + processUpload(data); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + } + + function processUpload(data){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_PROMOTION_CHANNEL}`, + { + "id": data.id, + "name": data.name.trim(), + }, + ) + + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + notifySaveSuccess(); + setIsUploading(false); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateChannel(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="delete" + /> + , + + } + label="Save" + color='save' + onClick={handleSaveClick(id)} + /> + , + + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + + ]; + }, + }, + { + id: 'promotionChannelName', + field: 'name', + headerName: 'Promotion Channel Name', + flex: 1, + editable: true, + preProcessEditCellProps: (params: GridPreProcessEditCellProps) => { + const hasError = params.props.value.length > 100; + if(hasError){ + notifyDeleteError("Input have reach the length limit(100)") + } + return { ...params.props, error: hasError }; + }, + }, + ]; + + return ( +
+ { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + processRowUpdate={processRowUpdate} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + getRowHeight={() => 'auto'} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerPromotionChannelPage/index.js b/src/pages/lionerPromotionChannelPage/index.js new file mode 100644 index 0000000..61006f8 --- /dev/null +++ b/src/pages/lionerPromotionChannelPage/index.js @@ -0,0 +1,95 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import ChannelSearchForm from "./ChannelSearchForm"; +import ChannelTable from "./ChannelTable"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_PROMOTION_CHANNEL_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const ChannelSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_PROMOTION_CHANNEL_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View Promotion Channel + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default ChannelSearchPanel; diff --git a/src/pages/lionerReminderPage/InnerInnerTab.js b/src/pages/lionerReminderPage/InnerInnerTab.js new file mode 100644 index 0000000..220ec77 --- /dev/null +++ b/src/pages/lionerReminderPage/InnerInnerTab.js @@ -0,0 +1,66 @@ +import {useState} from 'react'; + +// material-ui +import { + Box, + //Box, + Tab, Tabs, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useTheme} from "@mui/material/styles"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const InnerInnerTab = ({selectedPage, selectedInnerPage, awardData}) => { + const [value, setValue] = useState(0); + const theme = useTheme(); + + function TabPanel({ children, value, index, ...other }) { + return ( + + ); + } + + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + + + + {awardData.map(data => ( + + ))} + + + {awardData.map(data => ( + + {selectedPage}-{selectedInnerPage}-{data.key} + + ))} + + ); + +}; + +export default InnerInnerTab; diff --git a/src/pages/lionerReminderPage/InnerTab.js b/src/pages/lionerReminderPage/InnerTab.js new file mode 100644 index 0000000..ac85573 --- /dev/null +++ b/src/pages/lionerReminderPage/InnerTab.js @@ -0,0 +1,110 @@ +import {useEffect, useState} from 'react'; + +// material-ui +import { + Box, + //Box, + Tab, Tabs, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useTheme} from "@mui/material/styles"; +import ReminderTable from "./ReminderTable"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import {GET_TODO_ANNOUNCEMENT_LIST, GET_TODO_APPLICATION_LIST} from "../../utils/ApiPathConst"; + +import {useNavigate} from "react-router-dom"; +import {ReminderTabHeading} from "../../utils/ComboConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const InnerTab = ({isReminder}) => { + const [value, setValue] = useState(0);//0 for unread, 1 for readed + const theme = useTheme(); + const [tabData] = useState(ReminderTabHeading); + const [reminderList, setReminderList] = useState([]); + const navigate = useNavigate(); + + //const subDivisionId = localStorage.getItem('subDivisionId'); + + function TabPanel({children, value, index, ...other}) { + return ( + + ); + } + + const handleChange = (event, newValue) => { + setValue(newValue); + fetchList(newValue); + }; + + useEffect(() => { + fetchList(value); + },[]); + + function fetchList (curValue){ + const userData = getUserData(); + if(userData === null){ + navigate('/login'); + window.location.reload(); + } + //value 0 for unread, 1 for read + axios.get(`${apiPath}${isReminder? GET_TODO_APPLICATION_LIST : GET_TODO_ANNOUNCEMENT_LIST}/${userData.id}/${curValue !== 0}`,{ + }) + .then((response) => { + if (response.status === 200) { + setReminderList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + return ( + + { + + + {tabData.map(data => ( + + ))} + + + } + {tabData.map(data => ( + + + + ))} + + ); +}; + +export default InnerTab; diff --git a/src/pages/lionerReminderPage/ReminderTable.js b/src/pages/lionerReminderPage/ReminderTable.js new file mode 100644 index 0000000..d7fff52 --- /dev/null +++ b/src/pages/lionerReminderPage/ReminderTable.js @@ -0,0 +1,215 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import AssignmentTurnedInOutlinedIcon from '@mui/icons-material/AssignmentTurnedInOutlined'; +import NotificationsOffRoundedIcon from '@mui/icons-material/NotificationsOffRounded'; +import { + CustomNoRowsOverlay, getObjectById, notifySaveSuccess, +} from "../../utils/CommonFunction"; +import {Typography} from "@mui/material"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import {POST_TODO_MARK_READ, POST_TODO_MARK_SUPPRESS} from "../../utils/ApiPathConst"; +import {useContext} from "react"; +import AbilityContext from "../../components/AbilityProvider"; + +export default function ReminderTable({recordList, isReaded, fetchList,value, isReminder}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const userData = getUserData(); + const ability = useContext(AbilityContext); + + + const handleSuppressClick = (id) => () => { + axios.post(`${apiPath}${POST_TODO_MARK_SUPPRESS}/${id}/${userData.id}`,{ + }) + .then((response) => { + if (response.status === 200) { + fetchList(value); + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }; + + const handleReadClick = (id) => () => { + axios.post(`${apiPath}${POST_TODO_MARK_READ}/${id}/${userData.id}`,{ + }) + .then((response) => { + if (response.status === 200) { + setRows(rows.filter((row) => row.id !== id)); + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }; + + // const getRowHeight = (params) => { + // const message = params.model.message; // Assuming the 'message' field is present in the data + // const lines = message.split("\\n").length; + // + // const SINGLE_LINE_HEIGHT = 40; + // const HEIGHT_WITH_PADDING = 20; + // const LINE_HEIGHT = 24; // Adjust this value based on your font size and row padding + // const height = lines < 2 ? SINGLE_LINE_HEIGHT : HEIGHT_WITH_PADDING*2 + (LINE_HEIGHT * (lines-2) ); + // console.log(height); + // return height <= SINGLE_LINE_HEIGHT ? SINGLE_LINE_HEIGHT : height; + // }; + + const columns = [ + { + id: 'title', + field: 'title', + headerName: 'Title', + //headerAlign: 'center', + //align: 'center', + flex: 2, + renderCell: (params) => { + return ( +
+ + {params.row.title} + +
+ ); + } + }, + { + id: 'message', + field: 'message', + headerName: 'Message', + flex: 3 , + renderCell: (params) => { + const detail = params.row.message; + const detailLines = detail.split("\\n").map((line, index) => { + const lineWithTabs = line.replaceAll("\\t", '\t'); // Replace \t with four non-breaking spaces + return ( + + {lineWithTabs} + + ) + }); + + return
{detailLines}
; + }, + }, + { + field: 'actions', + type: 'actions', + headerName: !isReminder ? 'Read' : 'Read/ Suppress', + width: 200, + cellClassName: 'actions', + getActions: ({id}) => { + const row = getObjectById(rows,id); + //console.log(row.suppressedBy) + return !isReminder? + isReaded? + [ + + + ] + : + [ + + } + label="Read" + onClick={handleReadClick(id)} + color="create" + /> + + , + ] + : + isReaded? + [ + + } + label="Suppress" + className="textPrimary" + onClick={handleSuppressClick(id)} + color="delete" + disabled={row.suppressedBy === null ? !ability.can('SUPPRESS','REMINDER') : true} + /> + , + ] + : + [ + + } + label="Read" + onClick={handleReadClick(id)} + color="create" + /> + + , + + } + label="Suppress" + className="textPrimary" + onClick={handleSuppressClick(id)} + disabled={!ability.can('SUPPRESS','REMINDER') } + color="delete" + /> + , + ] + }, + }, + ]; + + return ( +
+ 'auto'} + //getRowHeight={getRowHeight} + initialState={{ + pagination: { + paginationModel: {page: 0, pageSize: 10}, + }, + }} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10, 15, 20]} + //autoHeight + /> +
+ ); +} diff --git a/src/pages/lionerReminderPage/TabConst.js b/src/pages/lionerReminderPage/TabConst.js new file mode 100644 index 0000000..e69de29 diff --git a/src/pages/lionerReminderPage/ThreeLayerTabPage.js b/src/pages/lionerReminderPage/ThreeLayerTabPage.js new file mode 100644 index 0000000..20ff5de --- /dev/null +++ b/src/pages/lionerReminderPage/ThreeLayerTabPage.js @@ -0,0 +1,76 @@ +import {useState} from 'react'; + +// material-ui +import { + Box, + CardContent, + //Box, + Grid, Tab, Tabs, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useTheme} from "@mui/material/styles"; +import InnerTab from ".//InnerTab"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const ThreeLayerTabPage = () => { + const [value, setValue] = useState(0); + const theme = useTheme(); + + function TabPanel({ children, value, index, ...other }) { + return ( + + ); + } + + + const handleChange = (event, newValue) => { + setValue(newValue); + }; + + return ( + + + + + + + + + + + + + 1 + + + + 2 + + + + ); +}; + +export default ThreeLayerTabPage; diff --git a/src/pages/lionerReminderPage/index.js b/src/pages/lionerReminderPage/index.js new file mode 100644 index 0000000..6eae4cc --- /dev/null +++ b/src/pages/lionerReminderPage/index.js @@ -0,0 +1,88 @@ +// material-ui +import { + Box, + //Box, + //Button, + Grid, Typography, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import InnerTab from "./InnerTab"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const MaintainPage = () => { + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + setOnReady(true); + }, []); + + return ( + !onReady ? + + : + + + + + + + Application Reminders + + + + + + + {/*row 1*/} + + + + + + + + + + + + + + + Announcement Reminders + + + + + + {/*row 2*/} + + + + + + + + + + + ); +}; + +export default MaintainPage; diff --git a/src/pages/lionerSearchPanel/DummyComboRecord.js b/src/pages/lionerSearchPanel/DummyComboRecord.js new file mode 100644 index 0000000..a609405 --- /dev/null +++ b/src/pages/lionerSearchPanel/DummyComboRecord.js @@ -0,0 +1,66 @@ +export const eventType = [ + {label: '同心', type: 1}, + {label: '創新', type: 2}, + {label: '惠民', type: 3}, + {label: '傳承', type: 3}, +]; + +export const divisionType = [ + {key: 1, label: 'Railways Branch', type: 1}, + {key: 2, label: 'Electricity and Energy Efficiency Branch ', type: 2}, + {key: 3, label: 'Gas and General Legislation Branch', type: 3}, + {key: 4, label: 'Engineering Services Branch 1', type: 4}, + {key: 5, label: 'Engineering Services Branch 2', type: 5}, + {key: 6, label: 'Engineering Services Branch 3', type: 6}, +]; + +export const subDivision1 = [ + {key: 1, label: 'Sub Division 1 of Railways Branch', type: 1}, + {key: 2, label: 'Sub Division 2 of Railways Branch', type: 2}, + {key: 3, label: 'Sub Division 3 of Railways Branch', type: 3}, + {key: 4, label: 'Sub Division 4 of Railways Branch', type: 4}, +]; + +export const subDivision2 = [ + {key: 1, label: 'Sub Division 1 of Electricity and Energy Efficiency Branch', type: 1}, + {key: 2, label: 'Sub Division 2 of Electricity and Energy Efficiency Branch', type: 2}, + {key: 3, label: 'Sub Division 3 of Electricity and Energy Efficiency Branch', type: 3}, +]; + +export const subDivision3 = [ + {key: 1, label: 'Sub Division 1 of Gas and General Legislation Branch', type: 1}, + {key: 2, label: 'Sub Division 2 of Gas and General Legislation Branch', type: 2}, + {key: 3, label: 'Sub Division 3 of Gas and General Legislation Branch', type: 3}, +]; + +export const subDivision4 = [ + {key: 1, label: 'Sub Division 1 of Engineering Services Branch 1', type: 1}, + {key: 2, label: 'Sub Division 2 of Engineering Services Branch 1', type: 2}, + {key: 3, label: 'Sub Division 3 of Engineering Services Branch 1', type: 3}, + {key: 4, label: 'Sub Division 4 of Engineering Services Branch 1', type: 4}, +]; + +export const subDivision5 = [ + {key: 1, label: 'Sub Division 1 of Engineering Services Branch 2', type: 1}, + {key: 2, label: 'Sub Division 2 of Engineering Services Branch 2', type: 2}, + {key: 3, label: 'Sub Division 3 of Engineering Services Branch 2', type: 3}, +]; + +export const subDivision6 = [ + {key: 1, label: 'Sub Division 1 of Engineering Services Branch 3', type: 1}, + {key: 2, label: 'Sub Division 2 of Engineering Services Branch 3', type: 2}, + {key: 3, label: 'Sub Division 3 of Engineering Services Branch 3', type: 3}, +]; + +export const tableRecord = [ + {trackingNo: 84564564, name: 'Camera', fat: 40, carbs: 2, protein: 4057}, + {trackingNo: 98764564, name: 'Laptop', fat: 300, carbs: 0, protein: 180139}, + {trackingNo: 98756325, name: 'Mobile', fat: 355, carbs: 1, protein: 90989}, + {trackingNo: 98652366, name: 'Handset', fat: 50, carbs: 1, protein: 10239}, + {trackingNo: 13286564, name: 'Computer', fat: 100, carbs: 1, protein: 8334}, + {trackingNo: 86739658, name: 'TV', fat: 99, carbs: 0, protein: 410780}, + {trackingNo: 13256498, name: 'Keyboard', fat: 125, carbs: 2, protein: 70999}, + {trackingNo: 98753263, name: 'Mouse', fat: 89, carbs: 2, protein: 10570}, + {trackingNo: 98753275, name: 'Desktop', fat: 185, carbs: 1, protein: 98063}, + {trackingNo: 98753291, name: 'Chair', fat: 100, carbs: 0, protein: 14001}, +]; \ No newline at end of file diff --git a/src/pages/lionerSearchPanel/TemplateSearchForm.js b/src/pages/lionerSearchPanel/TemplateSearchForm.js new file mode 100644 index 0000000..f746364 --- /dev/null +++ b/src/pages/lionerSearchPanel/TemplateSearchForm.js @@ -0,0 +1,136 @@ +// material-ui +import { + Button,InputLabel, + Grid, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import {useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import {ThemeProvider} from "@emotion/react"; +import {MODULE_COMBO} from "../../utils/ComboConst"; +import * as React from "react"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import {useNavigate} from "react-router"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const TemplateSearchForm = ({applySearch}) => { + + const navigate = useNavigate() + const [selectedModule, setSelectedModule] = useState(null); + const { reset, register, handleSubmit } = useForm() + + const onSubmit = (data) => { + const temp = { + module: selectedModule === null ? "" : selectedModule.label, + templateName: data.name + }; + applySearch(temp); + }; + + function resetForm(){ + setSelectedModule(null); + reset(); + } + + function createNewTemplate(){ + navigate(`/template/maintain/-1`); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + + + + Module + + { + setSelectedModule(newValue); + }} + renderInput={(params) => } + /> + + + + + Template Name + + + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +}; + +export default TemplateSearchForm; diff --git a/src/pages/lionerSearchPanel/TemplateTable.js b/src/pages/lionerSearchPanel/TemplateTable.js new file mode 100644 index 0000000..0ea726c --- /dev/null +++ b/src/pages/lionerSearchPanel/TemplateTable.js @@ -0,0 +1,152 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useContext, useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import DeleteIcon from "@mui/icons-material/DeleteOutlined"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, + //getObjectById, + notifyDeleteSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_SEARCH_TEMPLATE_PATH} from "../../utils/ApiPathConst"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +export default function DivisionTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const navigate = useNavigate(); + const { setIsUploading } = useContext(UploadContext); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_SEARCH_TEMPLATE_PATH}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + const handleEditClick = (id) => () => { + navigate('/template/maintain/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + ] + }, + }, + { + id: 'module', + field: 'module', + headerName: 'Module', + flex: 1, + }, + { + id: 'templateName', + field: 'name', + headerName: 'Template Name', + flex: 1, + }, + ]; + + return ( +
+ 'auto'} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerSearchPanel/index.js b/src/pages/lionerSearchPanel/index.js new file mode 100644 index 0000000..3f281ce --- /dev/null +++ b/src/pages/lionerSearchPanel/index.js @@ -0,0 +1,105 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import TemplateSearchForm from "./TemplateSearchForm"; +import TemplateTable from "./TemplateTable"; +import { useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath, getUserData} from "../../auth/utils"; +import {GET_SEARCH_TEMPLATE_PATH} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + + +const SearchTemplatePanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + const userData = getUserData(); + const temp = { + ...searchCriteria, + "userId": userData.id, + } + axios.get(`${apiPath}${GET_SEARCH_TEMPLATE_PATH}`, + {params: temp} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + + return ( + !onReady ? + + : + + + + + + + Search Template + + + + + + + {/*row 1*/} + + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default SearchTemplatePanel; diff --git a/src/pages/lionerSettingPage/TemplateSettingSection.js b/src/pages/lionerSettingPage/TemplateSettingSection.js new file mode 100644 index 0000000..544665f --- /dev/null +++ b/src/pages/lionerSettingPage/TemplateSettingSection.js @@ -0,0 +1,315 @@ +// material-ui +import { + Button, + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {LIONER_LONG_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {EMAIL_TEMPLATE_COMBO} from "../../utils/ComboConst"; +import Autocomplete from "@mui/material/Autocomplete"; +import {useContext, useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_SETTING_ROUTE, POST_TODO_TEST, UPDATE_SETTING_PATH, +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {useParams} from "react-router-dom"; +import {/*getComboValueByLabel,*/ + isOptionEqualToValue, + notifySaveSuccess, + notifySendSuccess +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +//import {isObjEmpty} from "../../utils/Utils"; +import {ThemeProvider} from "@emotion/react"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {isObjEmpty} from "../../utils/Utils"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const TemplateSettingSection = () => { + const params = useParams(); + const [errors, setErrors] = useState({}); + + const { register, setValue, getValues } = useForm() + const [onReady, setOnReady] = useState(false); + const { setIsUploading } = useContext(UploadContext); + + const [isCollectData, setIsCollectData] = useState(false); + const [isUserConfirm, setIsUserConfirm] = useState(false); + + const [formData, setFormData] = useState(null); + const [selectedTemplate, setSelectedTemplate] = useState(null); + + const [templateData, setTemplateData] = useState({}); + const [isEdited, setIsEdited] = useState(false); + + const onUpload = () => { + const data = getValues(); + setFormData(data); + setIsUserConfirm(true); + setIsCollectData(!isCollectData); + }; + + useEffect(() => { + if(isCollectData && isUserConfirm){ + + const formErrors = {}; + + if(selectedTemplate === null){ + formErrors.selectedTemplate = 'Email Template cannot be null'; + } + + if (!formData.template ) { + formErrors.template = 'Template cannot be null'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + let tempSettingList =[]; + + tempSettingList.push({ + "name": selectedTemplate.value, + "value": formData.template + }); + setIsUploading(true); + axios.put(`${apiPath}${UPDATE_SETTING_PATH}`, + { + settingList: tempSettingList + }, + ) + .then((response) => { + if (response.status === 204) { + setIsEdited(false); + setIsUploading(false); + notifySaveSuccess(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + } + setIsUserConfirm(false); + setIsCollectData(false); + }, [formData]); + + // const resetForm = () => { + // reset(); + // setSelectedTemplate(null); + // } + + const testEmailTemplate = () => { + const formData = getValues(); + const formErrors = {}; + + if(selectedTemplate === null){ + formErrors.selectedTemplate = 'Email Template cannot be null'; + } + + if (!formData.emailTo ) { + formErrors.emailTo = 'Receiver cannot be null'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + setIsUploading(true); + axios.get(`${apiPath}${POST_TODO_TEST}`, + { + params:{ + templateName: selectedTemplate.value, + receiver: formData.emailTo + } + }, + ) + .then((response) => { + if (response.status === 200) { + setIsEdited(false); + setIsUploading(false); + notifySendSuccess(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + } + + useEffect(() => { + setOnReady(true); + }, [templateData]); + + function getTemplateData() { + if(!isObjEmpty(selectedTemplate)){ + axios.get(`${apiPath}${GET_SETTING_ROUTE}/${selectedTemplate.value}`) + .then((response) => { + if (response.status === 200) { + setTemplateData(response.data.data); + setValue("template", response.data.data); + + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + + useEffect(() => { + getTemplateData(); + }, [selectedTemplate]); + + return ( + !onReady ? + + : + + + +
+ + + {/*row 1*/} + + + + + + + Email Template: + + * + + + + { + setSelectedTemplate(newValue); + }} + disabled={params.id>0} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + Template Detail: + + * + + + + + + + + + { + if(!isEdited){ + setIsEdited(true); + } + }} + multiline + maxRows={30} + id="templateName" + error={!!errors.template} + helperText={errors.template} + /> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + ); +}; + +export default TemplateSettingSection; diff --git a/src/pages/lionerSettingPage/index.js b/src/pages/lionerSettingPage/index.js new file mode 100644 index 0000000..f38faae --- /dev/null +++ b/src/pages/lionerSettingPage/index.js @@ -0,0 +1,501 @@ +// material-ui +import { + Button, + CardContent, Divider, + Grid, InputAdornment, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +//import Radio from '@mui/material/Radio'; +//import RadioGroup from '@mui/material/RadioGroup'; +//import FormControlLabel from '@mui/material/FormControlLabel'; +//import FormControl from '@mui/material/FormControl'; +//import {useState} from "react"; +import * as React from "react"; +import {LIONER_BUTTON_THEME, GENERAL_RED_COLOR} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import { useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_SETTING_PATH, UPDATE_SETTING_PATH, } from "../../utils/ApiPathConst"; +import { getObjectByName, notifySaveSuccess} from "../../utils/CommonFunction"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {SETTING_STRING_DICT} from "../../utils/SettingConst"; + +import TemplateSettingSection from "./TemplateSettingSection"; +import {LIONER_FORM_THEME} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const SettingPage = () => { + + //const [notificationType, setNotificationType] = useState(null); + + const { reset, register, handleSubmit } = useForm() + const [onReady, setOnReady] = useState(false); + const [errors, setErrors] = useState({}); + + const onSubmit = (data) => { + const formErrors = {}; + if (!data.idleLogoutTime) { + formErrors.idleLogoutTime = 'Setting value cannot be null'; + } + + if (!data.reminderBefore) { + formErrors.reminderBefore = 'Setting value cannot be null'; + } + + if (!data.reminderInterval) { + formErrors.reminderInterval = 'Setting value cannot be null'; + } + + if (!data.reminderLimit) { + formErrors.reminderLimit = 'Setting value cannot be null'; + } + + if (!data.reminderLimitMaxVal) { + formErrors.reminderLimitMaxVal = 'Setting value cannot be null'; + } + + if (!data.eventReminderWithin) { + formErrors.eventReminderWithin = 'Setting value cannot be null'; + } + + if (!data.smtpHost) { + formErrors.smtpHost = 'Setting value cannot be null'; + } + + if (!data.smtpPort) { + formErrors.smtpPort = 'Setting value cannot be null'; + } + + if (!data.smtpSenderEmail) { + formErrors.smtpSenderEmail = 'Setting value cannot be null'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + let tempSettingList =[]; + tempSettingList.push({ + "name": SETTING_STRING_DICT.IDLE_LOGOUT_TIME, + "value": data.idleLogoutTime + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.REMINDER_BEFORE, + "value": data.reminderBefore + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.REMINDER_INTERVAL, + "value": data.reminderInterval + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.REMINDER_LIMIT, + "value": data.reminderLimit + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.REMINDER_LIMIT_MAX, + "value": data.reminderLimitMaxVal + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.REMINDER_WITHIN, + "value": data.eventReminderWithin + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.MAIL_HOST, + "value": data.smtpHost + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.MAIL_PORT, + "value": data.smtpPort + }); + tempSettingList.push({ + "name": SETTING_STRING_DICT.MAIL_USERNAME, + "value": data.smtpSenderEmail + }); + + + axios.put(`${apiPath}${UPDATE_SETTING_PATH}`, + { + settingList: tempSettingList + }, + ) + .then((response) => { + if (response.status === 204) { + notifySaveSuccess(); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + //console.log(notificationType); + }; + + const [refRecord, setRefRecord] = useState([]); + + useEffect(() => { + getSettingList(); + }, []); + + useEffect(() => { + if(refRecord.length >0){ + setOnReady(true); + } + }, [refRecord]); + + function getSettingList() { + axios.get(`${apiPath}${GET_SETTING_PATH}` + ) + .then((response) => { + if (response.status === 200) { + setRefRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function resetForm(){ + //setNotificationType(null); + reset(); + } + return ( + !onReady ? + + : + + + System Configuration + + + + +
+ {/*Title*/} + + + + + + {/*row 1*/} + + + + + + Idle Logout Time + + * + + + + minutes, + }} + /> + + + + + + {/*row 2*/} + + + + + + Reminder Before + + * + + + + days, + }} + /> + + + + + + {/*row 3*/} + + + + + + Reminder Interval + + * + + + + days, + }} + /> + + + + + + {/*row 4*/} + + + + + + Reminder Limit + + * + + + + + + + + + + {/*row 5*/} + + + + + + Reminder Limit: Max. Value + + * + + + + + + + + + + {/*row 6*/} + + + + + + Event Reminder Within + + * + + + + years, + }} + /> + + + + + + {/*row 7*/} + + + + + + SMTP Host + + * + + + + + + + + + + {/*row 8*/} + + + + + + SMTP Port + + * + + + + + + + + + + {/*row 6*/} + + + + + + SMTP Sender Email + + * + + + + + + + + + + + + + + Email Template Edit + + + + + + + {/* last row */} + + + + + + + + + + + + + + + + + + + + +
+
+
+ +
+ + ); +}; + +export default SettingPage; diff --git a/src/pages/lionerTagPage/TagSearchForm.js b/src/pages/lionerTagPage/TagSearchForm.js new file mode 100644 index 0000000..d20ff9b --- /dev/null +++ b/src/pages/lionerTagPage/TagSearchForm.js @@ -0,0 +1,79 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const TagSearchForm = ({applySearch}) => { + + const { reset, register, handleSubmit } = useForm() + + const onSubmit = (data) => { + applySearch(data); + }; + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + Tag Name + + + + + + {/*last row*/} + + + + + + + + + + + + + +
+ ); +}; + +export default TagSearchForm; diff --git a/src/pages/lionerTagPage/TagTable.js b/src/pages/lionerTagPage/TagTable.js new file mode 100644 index 0000000..65fad27 --- /dev/null +++ b/src/pages/lionerTagPage/TagTable.js @@ -0,0 +1,345 @@ +// material-ui +import * as React from 'react'; +import { + Button, +} from '@mui/material'; +import { + DataGrid, + GridActionsCellItem, GridPreProcessEditCellProps, + GridRowEditStopReasons, + GridRowModes, + GridToolbarContainer +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import DeleteIcon from '@mui/icons-material/DeleteOutlined'; +import SaveIcon from '@mui/icons-material/Save'; +import CancelIcon from '@mui/icons-material/Close'; +import AddIcon from '@mui/icons-material/Add'; +import {useContext, useEffect} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_TAG_DUPLICATE, + GET_TAG_LIST, + UPDATE_TAG_PATH, +} from "../../utils/ApiPathConst"; +import { + CustomNoRowsOverlay, + GeneralConfirmWindow, notifyDeleteError, + notifyDeleteSuccess, + notifySaveSuccess, + removeObjectWithId +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE - COLUMN ||============================== // + +let customerCount = -1; +function EditToolbar(props) { + const {setRows, setRowModesModel} = props; + + const handleClick = (id) => { + setRows((oldRows) => [ + { + id, + isNew:true + }, + ...oldRows, + ]); + setRowModesModel((oldModel) => ({ + ...oldModel, + [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}, + })); + }; + + return ( + + + + ); +} + +// ==============================|| TAG TABLE ||============================== // + +export default function TagTable({recordList}) { + const [rows, setRows] = React.useState([]); + const [rowModesModel, setRowModesModel] = React.useState({}); + const { setIsUploading } = useContext(UploadContext); +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const [selectedId, setSelectedId] = React.useState(null); + + const handleClose = () => { + setIsWindowOpen(false); + }; + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleDeleteClick = (id) => () => { + setIsWindowOpen(true); + setSelectedId(id); + }; + + function updateData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_TAG_LIST}/${selectedId}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + const newList =removeObjectWithId(rows,selectedId); + setIsWindowOpen(false); + setRows(newList); + setIsUploading(false); + + } + setIsUploading(false); + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(()=>{ + setRows(recordList); + },[recordList]); + + const handleRowEditStop = (params, event) => { + if (params.reason === GridRowEditStopReasons.rowFocusOut) { + event.defaultMuiPrevented = true; + } + }; + + const handleEditClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.Edit, fieldToFocus: 'name'}}); + }; + + const handleSaveClick = (id) => () => { + setRowModesModel({...rowModesModel, [id]: {mode: GridRowModes.View, fieldToFocus: 'name'}}); + }; + + const handleCancelClick = (id) => () => { + setRowModesModel({ + ...rowModesModel, + [id]: {mode: GridRowModes.View, ignoreModifications: true}, + }); + const editedRow = rows.find((row) => row.id === id); + if (editedRow.isNew) { + setRows(rows.filter((row) => row.id !== id)); + } + }; + + function updateTag(data) { + if(data.name.trim().length === 0){ + notifyDeleteError(`Name cannot be null`); + handleEditClick(data.id); + } + else{ + axios.get(`${apiPath}${CHECK_TAG_DUPLICATE}`, + { + params: { + "name": data.name.trim(), + "id": data.id, + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + notifyDeleteError(`${data.name} already exists.`) + handleEditClick(data.id); + } + else if(!response.data.isTaken){ + processUpload(data); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + + } + + function processUpload(data){ + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_TAG_PATH}`, + { + "id": data.id, + "name": data.name.trim(), + "description": data.description, + }, + ) + + .then((response) => { + if (response.status === 200) { + const updatedRow = { ...data }; + updatedRow.id = response.data.id; + if(data.id === -1){ + setRows(rows.map((row) => (row.id === -1 ? updatedRow : row))); + } + else{ + setRows(rows.map((row) => (row.id === data.id ? updatedRow : row))); + } + setIsUploading(false); + notifySaveSuccess(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + } + + const processRowUpdate = (newRow) => { + return new Promise((resolve, reject) => { + const updatedRow = { ...newRow, isNew: false }; + if (updatedRow.name.trim().length === 0) { + const error = new Error('Name cannot be null'); + reject(error); + return; + } + setRows(rows.map((row) => (row.id === newRow.id ? updatedRow : row))); + updateTag(updatedRow); + resolve(updatedRow); // Resolve the Promise with the updated row + }); + }; + + const handleRowModesModelChange = (newRowModesModel) => { + setRowModesModel(newRowModesModel); + }; + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + const isInEditMode = rowModesModel[id]?.mode === GridRowModes.Edit; + + if (isInEditMode) { + return [ + + } + label="Cancel" + className="textPrimary" + onClick={handleCancelClick(id)} + color="delete" + /> + , + + } + label="Save" + // sx={{ + // color: 'primary.main', + // }} + color="save" + onClick={handleSaveClick(id)} + /> + , + ]; + } + + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + , + ]; + }, + }, + { + id: 'tagName', + field: 'name', + headerName: 'Tag Name', + flex: 1, + editable: true, + preProcessEditCellProps: (params: GridPreProcessEditCellProps) => { + const hasError = params.props.value.length > 100; + if(hasError){ + notifyDeleteError("Input have reach the length limit(100)") + } + return { ...params.props, error: hasError }; + }, + }, + ]; + + return ( +
+ + { + console.log(error); + notifyDeleteError(`Name cannot be null`); + }} + getRowHeight={() => 'auto'} + processRowUpdate={processRowUpdate} + paginationModel={paginationModel} + onPaginationModelChange={setPaginationModel} + pageSizeOptions={[10]} + slots={{ + toolbar: EditToolbar, + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + slotProps={{ + toolbar: {setRows, setRowModesModel}, + }} + autoHeight + /> + +
+ ); +} diff --git a/src/pages/lionerTagPage/index.js b/src/pages/lionerTagPage/index.js new file mode 100644 index 0000000..8ac3fba --- /dev/null +++ b/src/pages/lionerTagPage/index.js @@ -0,0 +1,95 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import TagSearchForm from "./TagSearchForm"; +import TagTable from "./TagTable"; +import {useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_TAG_LIST} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const TagSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getTagList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getTagList(); + }, [searchCriteria]); + + function getTagList() { + axios.get(`${apiPath}${GET_TAG_LIST}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View Tag + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default TagSearchPanel; diff --git a/src/pages/lionerUserDetailPage/UserAuthTable.js b/src/pages/lionerUserDetailPage/UserAuthTable.js new file mode 100644 index 0000000..a610d5a --- /dev/null +++ b/src/pages/lionerUserDetailPage/UserAuthTable.js @@ -0,0 +1,87 @@ +// material-ui +import { + DataGrid, +} from "@mui/x-data-grid"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; +import {GET_AUTH_LIST} from "../../utils/ApiPathConst"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function UserAuthTable({setSelectedRow, userAuth}) { + const [authData, setAuthData] = useState([]); + const [onReady, setOnReady] = useState(false); + const [currentSelectedRow, setCurrentSelectedRow] = useState(userAuth); + + useEffect(() => { + axios.get(`${apiPath}${GET_AUTH_LIST}`) + .then((response) => { + if (response.status === 200) { + setAuthData(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + //if state data are ready and assign to different field + if (authData.length > 0) { + setOnReady(true); + } + }, [authData]); + + const columns = [ + { + id: 'module', + field: 'module', + headerName: 'Module', + flex: 1, + }, + { + id: 'authority', + field: 'name', + headerName: 'Authority', + flex: 2, + }, + ]; + + return ( + !onReady ? + + : +
+ ( + CustomNoRowsOverlay() + ) + }} + getRowHeight={() => 'auto'} + pageSizeOptions={[6]} + checkboxSelection + rowSelectionModel={currentSelectedRow} + onRowSelectionModelChange={(ids) => { + setSelectedRow(ids); + setCurrentSelectedRow(ids); + }} + //autoHeight + /> +
+ ); +} diff --git a/src/pages/lionerUserDetailPage/UserAuthorityCard.js b/src/pages/lionerUserDetailPage/UserAuthorityCard.js new file mode 100644 index 0000000..82922e1 --- /dev/null +++ b/src/pages/lionerUserDetailPage/UserAuthorityCard.js @@ -0,0 +1,59 @@ +// material-ui +import { + Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import UserAuthTable from "./UserAuthTable"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const UserAuthorityCard = ({isCollectData, updateUserAuthList,userData}) => { + const [currentAuthData, setCurrentAuthData] = React.useState({}); + const [onReady, setOnReady] = useState(false); + const [selectedRow, setSelectedRow] = useState([]); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(userData).length > 0 && userData !== undefined) { + setCurrentAuthData(userData.data); + setSelectedRow(userData.authIds); + } + }, [userData]); + + useEffect(() => { + //if state data are ready and assign to different field + if (Object.keys(userData).length > 0 && currentAuthData !== undefined) { + setOnReady(true); + } + }, [currentAuthData]); + + useEffect(() => { + //upload latest data to parent + updateUserAuthList(selectedRow); + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + User Authority + + + + + ); +}; + +export default UserAuthorityCard; diff --git a/src/pages/lionerUserDetailPage/UserGroupCard.js b/src/pages/lionerUserDetailPage/UserGroupCard.js new file mode 100644 index 0000000..f7b4107 --- /dev/null +++ b/src/pages/lionerUserDetailPage/UserGroupCard.js @@ -0,0 +1,58 @@ +// material-ui +import { + Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import UserGroupTable from "./UserGroupTable"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const UserGroupCard = ({isCollectData, updateUserGroupList,userData}) => { + const [currentUserData, setCurrentUserData] = React.useState({}); + const [onReady, setOnReady] = useState(false); + const [selectedRow, setSelectedRow] = useState([]); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(userData).length > 0 && userData !== undefined) { + setCurrentUserData(userData.data); + setSelectedRow(userData.groupIds); + } + }, [userData]); + + useEffect(() => { + //if state data are ready and assign to different field + if (Object.keys(userData).length > 0 &¤tUserData !== undefined) { + setOnReady(true); + } + }, [currentUserData]); + + useEffect(() => { + //upload latest data to parent + updateUserGroupList(selectedRow); + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + Group(s) + + + + ); +}; + +export default UserGroupCard; diff --git a/src/pages/lionerUserDetailPage/UserGroupTable.js b/src/pages/lionerUserDetailPage/UserGroupTable.js new file mode 100644 index 0000000..4541379 --- /dev/null +++ b/src/pages/lionerUserDetailPage/UserGroupTable.js @@ -0,0 +1,83 @@ +// material-ui +import { + DataGrid, +} from "@mui/x-data-grid"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; +import {GET_GROUP_COMBO_PATH} from "../../utils/ApiPathConst"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function UserGroupTable({setSelectedRow, userGroup}) { + const [groupData, setGroupData] = useState([]); + const [onReady, setOnReady] = useState(false); + const [currentSelectedRow, setCurrentSelectedRow] = useState(userGroup); + + useEffect(() => { + axios.get(`${apiPath}${GET_GROUP_COMBO_PATH}`) + .then((response) => { + if (response.status === 200) { + setGroupData(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + //if state data are ready and assign to different field + if (groupData.length > 0) { + setOnReady(true); + } + }, [groupData]); + + const columns = [ + { + id: 'group', + field: 'name', + headerName: 'Select All', + flex: 1, + }, + ]; + + return ( + !onReady ? + + : +
+ ( + CustomNoRowsOverlay() + ) + }} + // getRowHeight={(params) => Math.max( + // getRowHeight(params, 'name', 30), + // )} + getRowHeight={() => 'auto'} + pageSizeOptions={[3, 5]} + checkboxSelection + rowSelectionModel={currentSelectedRow} + onRowSelectionModelChange={(ids) => { + setSelectedRow(ids); + setCurrentSelectedRow(ids); + }} + /> +
+ ); +} diff --git a/src/pages/lionerUserDetailPage/UserInformationCard.js b/src/pages/lionerUserDetailPage/UserInformationCard.js new file mode 100644 index 0000000..69cd904 --- /dev/null +++ b/src/pages/lionerUserDetailPage/UserInformationCard.js @@ -0,0 +1,652 @@ +// material-ui +import { + FormControl, IconButton, + Grid, InputAdornment, TextField, Typography, Switch +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import Autocomplete from "@mui/material/Autocomplete"; +import {useEffect, useState} from "react"; +import Checkbox from "@mui/material/Checkbox"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + CHECK_USER_DUPLICATE, GET_LDAP_USER_COMBO, + GET_LDAP_USER_LIST, + GET_SUB_DIVISION_COMBO_LIST +} from "../../utils/ApiPathConst"; +import Visibility from '@mui/icons-material/Visibility'; +import VisibilityOff from '@mui/icons-material/VisibilityOff'; +import { + convertXmlToObject, + getComboValueByLabel, + getObjectById, getObjectByValueName, + isOptionEqualToValue, isStringEmptyAfterTrim +} from "../../utils/CommonFunction"; +import {parseString} from "xml2js"; +import {useParams} from "react-router-dom"; +import {isObjEmpty} from "../../utils/Utils"; +import {GENERAL_RED_COLOR} from "../../themes/colorConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const UserInformationCard = ({isCollectData, updateUserObject,userData, + isNewRecord,setIsCollectData,setUserConfirm, + requestError}) => { + const params = useParams(); + const [currentUserData, setCurrentUserData] = React.useState({}); + const [subDivision, setSubDivision] = useState(null); + const [locked, setLocked] = useState(false); + const [isLotusNoteUser, setIsLotusNoteUser] = useState(false); + const [lotusNoteUserList, setLotusNoteUserList] = useState([]) + const [selectedLotusUser, setSelectedLotusUser] = useState(null); + const [receiveReminder, setReceiveReminder] = useState(false); + const [subDivisionList, setSubDivisionList] = useState([]); + const [showPassword, setShowPassword] = React.useState(false); + const [onReady, setOnReady] = useState(false); + const {register, getValues, setValue} = useForm() + const [errors, setErrors] = useState({}); + const [tempLotusDetail, setTempLotusDetail] = useState(null); + + const handleClickShowPassword = () => setShowPassword((show) => !show); + const handleMouseDownPassword = () => setShowPassword(!showPassword); + + const handleReceiveSwitchToggle = () => { + setReceiveReminder(!receiveReminder); + }; + + const handleLockSwitchToggle = () => { + setLocked(!locked); + }; + + const handleLocationCodeChange = (event, value) => { + if (value.length >2 && !value.includes("(")) { + fetchLotusUserList(value); + } else { + setLotusNoteUserList(lotusNoteUserList); + } + }; + // Function to fetch user name options based on locationCode + const fetchLotusUserListDetail = async (input) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_LIST}`,{ + params:{ + "EMSDlotus": input, + } + }) + .then((response) => { + if (response.status === 200) { + let xml = response.data; + parseString(xml, function (err, result) { + const tempRecordList = convertXmlToObject(result.RECORDS.RECORD); + const tempRecord = getObjectByValueName(tempRecordList,"EMSDlotus", input) + setTempLotusDetail(tempRecord); + }); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + const fetchLotusUserList = async (input) => { + try { + axios.get(`${apiPath}${GET_LDAP_USER_COMBO}`,{ + params:{ + "username": input, + } + }) + .then((response) => { + if (response.status === 200) { + setLotusNoteUserList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } catch (error) { + console.error('Error fetching user name options:', error); + } + }; + + // const validateEmail = (email) => { + // // Regular expression for email validation + // const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + // return emailRegex.test(email); + // }; + + useEffect(() => { + if(!isObjEmpty(selectedLotusUser)){ + //set basic info + if(isNewRecord){ + setValue('username', selectedLotusUser.label); + } + setValue('email', selectedLotusUser.mail); + fetchLotusUserListDetail(selectedLotusUser.label); + } + else{ + if(isNewRecord){ + setValue('username', null); + setValue('post', null); + setValue('fullname',null); + setValue('email', null); + setValue("phone1", null); + } + } + }, [selectedLotusUser]); + + useEffect(()=>{ + if(!isObjEmpty(tempLotusDetail)){ + setValue('post',tempLotusDetail.EMSDtitle); + setValue('fullname',tempLotusDetail.EMSDlastname + " " + tempLotusDetail.EMSDfirstname); + setValue("phone1", tempLotusDetail.EMSDofftel.substring(0,8)); + } + else if(isNewRecord){ + setValue('post',""); + setValue('fullname',""); + setValue("phone1",""); + } + },[tempLotusDetail]); + + useEffect(() => { + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + setErrors(requestError); + }, [requestError]); + + useEffect(() => { + if(isNewRecord){ + setValue("password", null); + setValue("username", null); + } + }, [isLotusNoteUser]); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(userData).length > 0 && userData !== undefined) { + setIsLotusNoteUser(userData.data.lotusNotesUser); + setCurrentUserData(userData.data); + } + }, [userData]); + + useEffect(() => { + //if state data are ready and assign to different field + if (Object.keys(currentUserData).length > 0 &¤tUserData !== undefined) { + setLocked(currentUserData.locked); + setReceiveReminder(currentUserData.reminderFlag); + setSubDivision(getObjectById(subDivisionList, currentUserData.subDivisionId)); + setOnReady(true); + } + else if(isNewRecord){ + setLocked(false); + setOnReady(true); + } + }, [currentUserData,subDivisionList]); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const formErrors = {}; + + if (isStringEmptyAfterTrim(values.username) ) { + formErrors.username = 'User Name is required'; + } + + if (isStringEmptyAfterTrim(values.password) && !isLotusNoteUser && isNewRecord){ + formErrors.password = "Password is required" + } + + if (isStringEmptyAfterTrim(values.fullname) ) { + formErrors.fullname = 'Full Name is required'; + } + + if(isStringEmptyAfterTrim(values.email)){ + formErrors.email = 'Email is required'; + } + // else if(!validateEmail(values.email)){ + // formErrors.email = 'Invalid Email'; + // } + + + if(subDivision === null){ + formErrors.subDivision = 'Sub-Division is required'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + axios.get(`${apiPath}${CHECK_USER_DUPLICATE}`, + { + params: { + "name": values.username, + "id": params.id + }, + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if(response.data.isTaken){ + formErrors.username = `${values.username} already exists.`; + setErrors(formErrors); + setUserConfirm(false); + setIsCollectData(false); + } + else if(!response.data.isTaken){ + const objectData ={ + ...values, + lotusNotesUser: isLotusNoteUser ? true : selectedLotusUser !== null, + selectedLotusUser: (isLotusNoteUser && selectedLotusUser !== null)? selectedLotusUser.account : null, + subDivisionId: subDivision !== null ? subDivision.id : null, + locked: locked, + reminderFlag: receiveReminder, + } + updateUserObject(objectData); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + Lotus Note User: + + + + + setIsLotusNoteUser(event.target.checked)} + name="isLotusNoteUser" + color="primary" + size="medium" + disabled={!isNewRecord} + /> + + + + { + if(lotusNoteUserList.length >0){ + if(newValue !== null){ + if(getComboValueByLabel(lotusNoteUserList, newValue.label) !== null){ + setSelectedLotusUser(newValue); + } + } + else{ + setSelectedLotusUser(null); + } + } + }} + isOptionEqualToValue={isOptionEqualToValue} + renderInput={(params) => } + /> + + + + + + + + + + Username: + * + + + + + + + + + + + + + + + {isLotusNoteUser || !isNewRecord? + + Password: + + : + + Password: + * + + } + + + + + + {errors.password.split("\n").map((line, index) => { + return ( + + {line} + + ) + })} + + ) : null + } + InputProps={{ + endAdornment: ( + + + {showPassword ? : } + + + ) + }} + /> + + + + + + + + + + Full Name: + * + + + + + + + + + + + + + + + + Post: + + + + + + + + + + + + + + + + Sub-Division: + * + + + + + { + setSubDivision(newValue); + }} + renderInput={(params) => ( + + )} + isOptionEqualToValue={isOptionEqualToValue} + /> + + + + + + + + + Email: + * + + + + + + + + + + + + + + + + Phone: + + + + + + + + + + + + + + + + Receive Reminder: + * + + + + + + + + + + + + + + + Locked: + * + + + + + + + + + + + +
+
+ ); +}; + +export default UserInformationCard; diff --git a/src/pages/lionerUserDetailPage/index.js b/src/pages/lionerUserDetailPage/index.js new file mode 100644 index 0000000..5d02bce --- /dev/null +++ b/src/pages/lionerUserDetailPage/index.js @@ -0,0 +1,293 @@ +// material-ui +import { + Button, + Grid, Typography +} from '@mui/material'; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {useNavigate, useParams} from "react-router-dom"; +import UserInformationCard from "./UserInformationCard"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import UserGroupCard from "./UserGroupCard"; +import UserAuthorityCard from "./UserAuthorityCard"; +import {CREATE_USER_PATH, GET_USER_PATH} from "../../utils/ApiPathConst"; +import { + GeneralConfirmWindow, + getDeletedRecordWithRefList, + notifyDeleteSuccess, + notifySaveSuccess +} from "../../utils/CommonFunction"; +import UploadContext from "../../components/UploadProvider"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const UserMaintainPage = () => { + const { setIsUploading } = useContext(UploadContext); + + const params = useParams(); + const navigate = useNavigate(); + const [refUserData, setRefUserData] = React.useState({}); + const [userData, setUserData] = React.useState({}); + const [onReady, setOnReady] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [editedCustomerData, setEditedCustomerData] = useState({}); + const [userGroupData,setUserGroupData] = useState([]); + const [userAuthData,setUserAuthData] = useState([]); + const [userConfirm, setUserConfirm] = useState(false); + const [isNewRecord, setIsNewRecord] = useState(false); + const [requestError, setRequestError] = useState({}); + + function updateUserObject(userData) { + setEditedCustomerData(userData); + } + + function updateUserGroupList(userGroupData){ + setUserGroupData(userGroupData); + } + + function updateUserAuthList(userAuthData){ + setUserAuthData(userAuthData); + } + + const submitData = () => { + setUserConfirm(true); + setIsCollectData(true); + } + + const handleCancelClick = () => { + navigate('/userSearchview'); + }; + + // ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = useState(false); + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + function deleteData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_USER_PATH}/${params.id}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + setIsUploading(false); + navigate('/userSearchview'); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + useEffect(() => { + if(params.id > 0 ){ + axios.get(`${apiPath}${GET_USER_PATH}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setUserData(response.data); + setRefUserData(response.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + else{ + setUserData( + { + "authIds": [], + "data": {}, + "groupIds": [] + } + ); + setRefUserData( + { + "authIds": [], + "data": {}, + "groupIds": [] + } + ); + setIsNewRecord(true); + } + + }, []); + + useEffect(() => { + if (Object.keys(userData).length > 0 && userData !== undefined) { + setOnReady(true); + } + else if(isNewRecord){ + setOnReady(true); + } + }, [userData]); + + useEffect(() => { + if(userConfirm && onReady){ + const deletedUserAuth = getDeletedRecordWithRefList(refUserData.authIds,userAuthData); + const deletedUserGroup = getDeletedRecordWithRefList(refUserData.groupIds,userGroupData); + setIsUploading(true); + axios.post(`${apiPath}${CREATE_USER_PATH}`, + { + "id": parseInt(params.id), + "fullname": editedCustomerData.fullname.trim(), + "name": editedCustomerData.username.trim(), + "locked": editedCustomerData.locked, + "lotusNotesUser": editedCustomerData.lotusNotesUser, + "selectedLotusUser": editedCustomerData.selectedLotusUser, + "username": editedCustomerData.username.trim(), + "password": editedCustomerData.lotusNotesUser? null : editedCustomerData.password, + "phone1": editedCustomerData.phone1 === null ? "" : editedCustomerData.phone1.trim(), + "post": editedCustomerData.post === null ? "" : editedCustomerData.post.trim(), + "email": editedCustomerData.email === null ? "": editedCustomerData.email.trim(), + "reminderFlag": editedCustomerData.reminderFlag, + "subDivisionId": editedCustomerData.subDivisionId, + "addGroupIds": userGroupData, + "removeGroupIds": deletedUserGroup, + "addAuthIds": userAuthData, + "removeAuthIds": deletedUserAuth, + }, + ).then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + setIsUploading(false); + navigate('/userSearchview'); + } + + }) + .catch(error => { + setIsUploading(false); + if (error.response.status === 422){ + //password error + const formErrors = {}; + if(error.response.data.error === "Incorrect existing password"){ + formErrors.password = error.response.data.error; + } + else{ + formErrors.password = error.response.data.error; + } + setRequestError(formErrors); + } + console.log(error); + return false; + }); + } + setUserConfirm(false); + setIsCollectData(false); + }, [editedCustomerData]); + + return ( + !onReady ? + + : + + + + {isNewRecord? "Create User" : "Maintain User"} + + {/*col 1*/} + + + + {/*col 2*/} + + + + + + + + + + + + + + + {/*bottom button*/} + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default UserMaintainPage; diff --git a/src/pages/lionerUserGroupDetailPage/GroupAuthCard.js b/src/pages/lionerUserGroupDetailPage/GroupAuthCard.js new file mode 100644 index 0000000..5bff26d --- /dev/null +++ b/src/pages/lionerUserGroupDetailPage/GroupAuthCard.js @@ -0,0 +1,65 @@ +// material-ui +import { + Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import GroupAuthTable from "./GroupAuthTable"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const GroupAuthCard = ({isCollectData, updateUserAuthList,userGroupData}) => { + const [currentAuthData, setCurrentAuthData] = React.useState({}); + const [onReady, setOnReady] = useState(false); + const [selectedRow, setSelectedRow] = useState([]); + const [referenceRow, setReferenceRow] = useState([]); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) { + setCurrentAuthData(userGroupData.data); + setSelectedRow(userGroupData.authIds); + setReferenceRow(userGroupData.authIds); + } + }, [userGroupData]); + + useEffect(() => { + //if state data are ready and assign to different field + if (Object.keys(userGroupData).length > 0 && currentAuthData !== undefined) { + setOnReady(true); + } + }, [currentAuthData]); + + useEffect(() => { + //upload latest data to parent + let deletedList = referenceRow.filter(x => !selectedRow.includes(x)); + updateUserAuthList({ + "currentList": selectedRow, + "deletedList": deletedList + }); + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + User Authority + + + + + ); +}; + +export default GroupAuthCard; diff --git a/src/pages/lionerUserGroupDetailPage/GroupAuthTable.js b/src/pages/lionerUserGroupDetailPage/GroupAuthTable.js new file mode 100644 index 0000000..bde5365 --- /dev/null +++ b/src/pages/lionerUserGroupDetailPage/GroupAuthTable.js @@ -0,0 +1,86 @@ +// material-ui +import { + DataGrid, +} from "@mui/x-data-grid"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; +import {GET_GROUP_AUTH_LIST} from "../../utils/ApiPathConst"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function GroupAuthTable({setSelectedRow, userAuth}) { + const [authData, setAuthData] = useState([]); + const [onReady, setOnReady] = useState(false); + const [currentSelectedRow, setCurrentSelectedRow] = useState(userAuth); + + useEffect(() => { + axios.get(`${apiPath}${GET_GROUP_AUTH_LIST}`) + .then((response) => { + if (response.status === 200) { + setAuthData(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + //if state data are ready and assign to different field + if (authData.length > 0) { + setOnReady(true); + } + }, [authData]); + + const columns = [ + { + id: 'module', + field: 'module', + headerName: 'Module', + flex: 1, + }, + { + id: 'authority', + field: 'name', + headerName: 'Authority', + flex: 2, + }, + ]; + + return ( + !onReady ? + + : +
+ ( + CustomNoRowsOverlay() + ) + }} + getRowHeight={() => 'auto'} + pageSizeOptions={[14]} + checkboxSelection + rowSelectionModel={currentSelectedRow} + onRowSelectionModelChange={(ids) => { + setSelectedRow(ids); + setCurrentSelectedRow(ids); + }} + /> +
+ ); +} diff --git a/src/pages/lionerUserGroupDetailPage/UserAddCard.js b/src/pages/lionerUserGroupDetailPage/UserAddCard.js new file mode 100644 index 0000000..554feff --- /dev/null +++ b/src/pages/lionerUserGroupDetailPage/UserAddCard.js @@ -0,0 +1,144 @@ +// material-ui +import { + Button, + Grid, TextField, + Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import UserAddTable from "./UserAddTable"; +import {GET_GROUP_MEMBER_LIST_PATH, GET_USER_COMBO_LIST} from "../../utils/ApiPathConst"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import Autocomplete from "@mui/material/Autocomplete"; +import {getIdList} from "../../utils/CommonFunction"; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const UserAddCard = ({isCollectData, updateGroupMember,userGroupData,isNewRecord}) => { + const [currentUserData, setCurrentUserData] = React.useState({}); + const [onReady, setOnReady] = useState(false); + const [groupUserData, setGroupUserData] = useState([]); + const [userComboList, setUserComboList] = useState([]); + const [selectedUser, setSelectedUser] = useState(null); + const [deletedList, setDeletedList] = useState([]); + + function updateUserList (){ + const idList = getIdList(groupUserData); + if(!idList.includes(selectedUser.id)){ + const userList = [...groupUserData, selectedUser]; + setGroupUserData(userList); + } + } + + useEffect(() => { + axios.get(`${apiPath}${GET_USER_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setUserComboList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) { + setCurrentUserData(userGroupData.data); + } + }, [userGroupData]); + + useEffect(() => { + //if state data are ready and assign to different field + if(isNewRecord){ + setOnReady(true); + } + else{ + if (Object.keys(userGroupData).length > 0 &¤tUserData !== undefined) { + axios.get(`${apiPath}${GET_GROUP_MEMBER_LIST_PATH}?id=${userGroupData.data.id}`) + .then((response) => { + if (response.status === 200) { + setGroupUserData(response.data.records); + } + setOnReady(true); + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + }, [currentUserData]); + + useEffect(() => { + //upload latest data to parent + updateGroupMember({ + "currentList" : groupUserData, + "deletedList" : deletedList + }); + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + User(s) + + + + + + User: + + + + { + setSelectedUser(newValue); + }} + renderInput={(params) => } + /> + + + + + + + + + + + + ); +}; + +export default UserAddCard; diff --git a/src/pages/lionerUserGroupDetailPage/UserAddTable.js b/src/pages/lionerUserGroupDetailPage/UserAddTable.js new file mode 100644 index 0000000..b61d3c3 --- /dev/null +++ b/src/pages/lionerUserGroupDetailPage/UserAddTable.js @@ -0,0 +1,117 @@ +// material-ui +import { + DataGrid, GridActionsCellItem, +} from "@mui/x-data-grid"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; +import DeleteIcon from "@mui/icons-material/DeleteOutlined"; +import {CustomNoRowsOverlay, removeObjectWithId} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| EVENT TABLE ||============================== // + +export default function UserAddTable({setGroupUserData, userList,setDeletedList}) { + const [groupData, setGroupData] = useState([]); + const [onReady, setOnReady] = useState(false); + const [localDeletedList, setLocalDeletedList] = React.useState([]); + + useEffect(() => { + setGroupData(userList); + }, []); + + useEffect(() => { + setGroupData(userList); + }, [userList]); + + useEffect(() => { + setDeletedList(localDeletedList); + }, [localDeletedList]); + + useEffect(() => { + //if state data are ready and assign to different field + if (groupData !== undefined) { + setOnReady(true); + } + }, [groupData]); + + const handleDeleteClick = (id) => () => { + if(id >0){ + const temp = [...localDeletedList, id]; + setLocalDeletedList(temp); + } + const newList =removeObjectWithId(groupData,id) + setGroupUserData(newList); + setGroupData(newList); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Delete" + onClick={handleDeleteClick(id)} + color="delete" + /> + , + ] + }, + }, + { + id: 'name', + field: 'name', + headerName: 'User', + flex: 0.7, + }, + { + id: 'subDiv', + field: 'subDivisionName', + headerName: 'Sub-Division', + flex: 1.3, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + ]; + + return ( + !onReady ? + + : +
+ ( + CustomNoRowsOverlay() + ) + }} + getRowHeight={() => 'auto'} + pageSizeOptions={10} + pageSize={20} + //autoHeight={true} + /> +
+ ); +} diff --git a/src/pages/lionerUserGroupDetailPage/UserGroupInfoCard.js b/src/pages/lionerUserGroupDetailPage/UserGroupInfoCard.js new file mode 100644 index 0000000..d28c977 --- /dev/null +++ b/src/pages/lionerUserGroupDetailPage/UserGroupInfoCard.js @@ -0,0 +1,170 @@ +// material-ui +import { + Grid, TextField, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {useForm} from "react-hook-form"; +import {useEffect, useState} from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {GENERAL_RED_COLOR} from "../../themes/colorConst"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {CHECK_GROUP_DUPLICATE} from "../../utils/ApiPathConst"; +import {useParams} from "react-router-dom"; +import {isStringEmptyAfterTrim} from "../../utils/CommonFunction"; +//import {useParams} from "react-router-dom"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const UserGroupInfoCard = ({isCollectData, updateGroupObject,userGroupData,isNewRecord,setUserConfirm,setIsCollectData}) => { + //const params = useParams(); + const [currentUserGroupData, setCurrentUserGroupData] = React.useState({}); + const [onReady, setOnReady] = useState(false); + const {register, getValues} = useForm() + const [errors, setErrors] = useState({}); + const params = useParams(); + + useEffect(() => { + //if user data from parent are not null + if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) { + setCurrentUserGroupData(userGroupData.data); + } + }, [userGroupData]); + + useEffect(() => { + //if state data are ready and assign to different field + if (Object.keys(userGroupData).length > 0 &¤tUserGroupData !== undefined) { + setOnReady(true); + } + else if(isNewRecord){ + setOnReady(true); + } + }, [currentUserGroupData]); + + useEffect(() => { + //upload latest data to parent + if(isCollectData){ + const values = getValues(); + const formErrors = {}; + + if (isStringEmptyAfterTrim(values.userGroupName)) { + formErrors.userGroupName = 'User Group Name is required'; + } + + setErrors(formErrors); + + if (Object.keys(formErrors).length === 0) { + axios.get(`${apiPath}${CHECK_GROUP_DUPLICATE}`, + { + params: { + "name": values.userGroupName.trim(), + "id": params.id, + }, + }) + .then((response) => { + if (response.status === 200) { + if(response.data.isTaken){ + formErrors.userGroupName = `${values.userGroupName} already exists.`; + setErrors(formErrors); + setUserConfirm(false); + setIsCollectData(false); + } + else if(!response.data.isTaken){ + const values = getValues(); + const objectData ={ + ...values, + } + updateGroupObject(objectData); + } + } + }) + .catch(error => { + console.log(error); + return true; + }); + } + else if(isCollectData){ + setUserConfirm(false); + setIsCollectData(false); + } + } + + + }, [isCollectData]); + + + return ( + !onReady ? + + : + + + Information + + +
+ + + + + + + User Group Name: + * + + + + + + + + + + + + + + User Group Description: + {/***/} + + + + + + + + + +
+
+ ); +}; + +export default UserGroupInfoCard; diff --git a/src/pages/lionerUserGroupDetailPage/index.js b/src/pages/lionerUserGroupDetailPage/index.js new file mode 100644 index 0000000..2550332 --- /dev/null +++ b/src/pages/lionerUserGroupDetailPage/index.js @@ -0,0 +1,267 @@ +// material-ui +import { + Button, + Grid, Typography +} from '@mui/material'; +import {useContext, useEffect, useState} from "react"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {useParams} from "react-router-dom"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import {GET_GROUP_LIST_PATH, UPDATE_GROUP_PATH} from "../../utils/ApiPathConst"; +import GroupAuthCard from "./GroupAuthCard"; +import UserGroupInfoCard from "./UserGroupInfoCard"; +import UserAddCard from "./UserAddCard"; +import { + GeneralConfirmWindow, + getDeletedRecordWithRefList, + getIdList, + notifyDeleteSuccess, + notifySaveSuccess +} from "../../utils/CommonFunction"; +import {useNavigate} from "react-router"; +import UploadContext from "../../components/UploadProvider"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + + +const UserMaintainPage = () => { + const { setIsUploading } = useContext(UploadContext); + + const params = useParams(); + const navigate = useNavigate(); + const [onReady, setOnReady] = useState(false); + const [isCollectData, setIsCollectData] = useState(false); + const [editedGroupData, setEditedGroupData] = useState({}); + const [userGroupData,setUserGroupData] = useState({}); + const [userAuthData,setUserAuthData] = useState([]); + const [userConfirm, setUserConfirm] = useState(false); + const [groupMember, setGroupMember] = useState([]); + const [isNewRecord, setIsNewRecord] = useState(false); + const [deletedUserList, setDeletedUserList] = React.useState([]); + const [deletedAuthList, setDeletedAuthList] = React.useState([]); + +// ==============================|| DELETE WINDOW RELATED ||============================== // + const [isWindowOpen, setIsWindowOpen] = React.useState(false); + const handleClose = () => { + setIsWindowOpen(false); + }; + + const handleDeleteClick = () => { + setIsWindowOpen(true); + }; + + function deleteData(){ + setIsUploading(true); + axios.delete(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`, + ) + .then((response) => { + if (response.status === 204) { + notifyDeleteSuccess(); + setIsWindowOpen(false); + navigate('/usergroupSearchview'); + } + setIsUploading(false); + + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } +// ==============================|| DELETE WINDOW RELATED ||============================== // + + function updateGroupObject(groupData) { + setEditedGroupData(groupData); + } + + function updateGroupMember(groupMember){ + setGroupMember(groupMember.currentList); + setDeletedUserList(groupMember.deletedList); + } + + function updateUserAuthList(userAuthData){ + setUserAuthData(userAuthData.currentList); + setDeletedAuthList(userAuthData.deletedList); + } + + const submitData = () => { + setUserConfirm(true); + setIsCollectData(!isCollectData); + } + + const handleCancelClick = () =>{ + navigate('/usergroupSearchview'); + } + + useEffect(() => { + if(params.id > 0 ){ + axios.get(`${apiPath}${GET_GROUP_LIST_PATH}/${params.id}`) + .then((response) => { + if (response.status === 200) { + setUserGroupData(response.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + else{ + //new record case + setUserGroupData( + { + "authIds": [], + "data": {}, + "userIds": [] + } + ); + setIsNewRecord(true); + } + + }, []); + + useEffect(() => { + if (Object.keys(userGroupData).length > 0 && userGroupData !== undefined) { + setOnReady(true); + } + else if(isNewRecord){ + setOnReady(true); + } + }, [userGroupData]); + + useEffect(() => { + if(userConfirm && onReady){ + //avoid delete and add user at the same time + let finalDeletedUserList = getDeletedRecordWithRefList(deletedUserList, getIdList(groupMember)); + setIsUploading(true); + axios.post(`${apiPath}${UPDATE_GROUP_PATH}`, + { + "id": parseInt(params.id) !== -1? parseInt(params.id) : null, + "name": editedGroupData.userGroupName.trim(), + "description": editedGroupData.description == null ? "" : editedGroupData.description.trim(), + "addUserIds": getIdList(groupMember), + "removeUserIds": finalDeletedUserList, + "addAuthIds": userAuthData, + "removeAuthIds": deletedAuthList, + }, + ) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + setIsUploading(false); + navigate('/usergroupSearchview'); + } + }) + .catch(error => { + console.log(error); + setIsUploading(false); + return false; + }); + } + setUserConfirm(false); + }, [editedGroupData]); + + return ( + !onReady ? + + : + + + + {isNewRecord? "Create User Group" : "Maintain User Group"} + + {/*col 1*/} + + + + + + + + + + + + {/*col 2*/} + + + + + {/*bottom button*/} + + + + + + + + + + + + + + + + + + + + + + ); +}; + +export default UserMaintainPage; diff --git a/src/pages/lionerUserGroupSearchPage/UserGroupSearchForm.js b/src/pages/lionerUserGroupSearchPage/UserGroupSearchForm.js new file mode 100644 index 0000000..e2af55b --- /dev/null +++ b/src/pages/lionerUserGroupSearchPage/UserGroupSearchForm.js @@ -0,0 +1,110 @@ +// material-ui +import { + Button, + Grid, InputLabel, TextField, +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; +import * as React from "react"; +import {useNavigate} from "react-router-dom"; +import {LIONER_BUTTON_THEME, LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const UserGroupSearchForm = ({applySearch}) => { + const navigate = useNavigate(); + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + applySearch(data); + }; + + function createNewUserGroup(){ + navigate('/userGroup/-1'); + } + + function resetForm(){ + reset(); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + User Group Name + + + + + User Group Description + + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +}; + +export default UserGroupSearchForm; diff --git a/src/pages/lionerUserGroupSearchPage/UserGroupTable.js b/src/pages/lionerUserGroupSearchPage/UserGroupTable.js new file mode 100644 index 0000000..032c871 --- /dev/null +++ b/src/pages/lionerUserGroupSearchPage/UserGroupTable.js @@ -0,0 +1,89 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +// ==============================|| EVENT TABLE ||============================== // + +export default function UserGroupTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const navigate = useNavigate() + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/userGroup/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + ] + }, + }, + { + id: 'groupName', + field: 'name', + headerName: 'User Group Name', + flex: 1, + }, + { + id: 'description', + field: 'description', + headerName: 'User Group Description', + flex: 1, + }, + ]; + + return ( +
+ ( + CustomNoRowsOverlay() + ) + }} + getRowHeight={() => 'auto'} + pageSizeOptions={[10]} + autoHeight + /> +
+ ); +} diff --git a/src/pages/lionerUserGroupSearchPage/index.js b/src/pages/lionerUserGroupSearchPage/index.js new file mode 100644 index 0000000..840c46f --- /dev/null +++ b/src/pages/lionerUserGroupSearchPage/index.js @@ -0,0 +1,96 @@ +// material-ui +import { + Box, + //Button, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import UserGroupSearchForm from "./UserGroupSearchForm"; +import UserGroupTable from "./UserGroupTable"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_GROUP_LIST_PATH} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import * as React from "react"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const UserGroupSearchPanel = () => { + + const [record, setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getGroupList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getGroupList(); + }, [searchCriteria]); + + function getGroupList() { + axios.get(`${apiPath}${GET_GROUP_LIST_PATH}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View User Group + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default UserGroupSearchPanel; diff --git a/src/pages/lionerUserSearchPage/UserSearchForm.js b/src/pages/lionerUserSearchPage/UserSearchForm.js new file mode 100644 index 0000000..592c927 --- /dev/null +++ b/src/pages/lionerUserSearchPage/UserSearchForm.js @@ -0,0 +1,276 @@ +// material-ui +import { + Button, + FormControlLabel, + Grid, TextField, + Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import {useForm} from "react-hook-form"; + +import {useEffect, useState} from "react"; +import Autocomplete from '@mui/material/Autocomplete'; +import Checkbox from "@mui/material/Checkbox"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_SUB_DIVISION_COMBO_LIST} from "../../utils/ApiPathConst"; +import {useNavigate} from 'react-router-dom'; +import {ThemeProvider} from "@emotion/react"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {USER_TYPE_COMBO} from "../../utils/ComboConst"; +import {CARD_MAX_WIDTH} from "../../themes/themeConst"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const UserSearchForm = ({applySearch}) => { + + const navigate = useNavigate() + const [type, setType] = useState([]); + const [subDivision, setSubDivision] = useState(null); + const [selectedUserType, setSelectedUserType] = useState(null); + const [subDivisionList, setSubDivisionList] = useState([]); + const [locked, setLocked] = useState(false); + + + const { reset, register, handleSubmit } = useForm() + const onSubmit = (data) => { + + let typeArray = []; + + for(let i =0; i < type.length; i++){ + typeArray.push(type[i].label); + } + + const temp = { + username: data.userName, + fullname: data.fullName, + post: data.post, + subDivisionId: subDivision !== null ? subDivision.id : null, + email: data.email, + phone: data.phone, + isLotusNotesUser: selectedUserType === null ? null : selectedUserType.id === 1 ? null : selectedUserType.id === 2, + locked: locked, + }; + applySearch(temp); + }; + + useEffect(() => { + axios.get(`${apiPath}${GET_SUB_DIVISION_COMBO_LIST}`) + .then((response) => { + if (response.status === 200) { + setSubDivisionList(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + }, []); + + function resetForm(){ + setType([]); + setSubDivision(null); + setSelectedUserType(null); + setLocked(false); + reset(); + } + + function createNewUser(){ + navigate('/user/-1'); + } + + return ( + + +
+ {/*row 1*/} + + + {/*row 2*/} + + + + Username + + + + + + + Full Name + + + + + + + Post + + + + + + + Sub-Division + + { + setSubDivision(newValue); + }} + renderInput={(params) => } + /> + + + + + Email + + + + + + + Phone + + + + + + + User Type + + { + setSelectedUserType(newValue); + }} + renderInput={(params) => } + /> + {/* setSelectedUserType(event.target.checked)}*/} + {/* name="checked"*/} + {/* color="primary"*/} + {/* size="medium"*/} + {/* />*/} + {/* }*/} + {/* label={Lotus Notes User}*/} + {/*/>*/} + + + + setLocked(event.target.checked)} + name="checked" + color="primary" + size="medium" + /> + } + label={Locked} + /> + + {/**/} + {/* */} + {/**/} + + + + + {/*last row*/} + + + + + + + + + + + + + + + + + + + + + + + + +
+ ); +}; + +export default UserSearchForm; diff --git a/src/pages/lionerUserSearchPage/UserTable.js b/src/pages/lionerUserSearchPage/UserTable.js new file mode 100644 index 0000000..01a6c0d --- /dev/null +++ b/src/pages/lionerUserSearchPage/UserTable.js @@ -0,0 +1,167 @@ +// material-ui +import * as React from 'react'; +import { + DataGrid, + GridActionsCellItem, +} from "@mui/x-data-grid"; +import EditIcon from '@mui/icons-material/Edit'; +import {useEffect} from "react"; +import {useNavigate} from "react-router-dom"; +import { useTheme } from '@mui/material/styles'; +import Checkbox from '@mui/material/Checkbox'; +import {CustomNoRowsOverlay} from "../../utils/CommonFunction"; +import {LIONER_BUTTON_THEME} from "../../themes/colorConst"; +import {ThemeProvider} from "@emotion/react"; +// ==============================|| EVENT TABLE ||============================== // + +export default function UserTable({recordList}) { + const [rows, setRows] = React.useState(recordList); + const [rowModesModel] = React.useState({}); + const theme = useTheme(); + + const navigate = useNavigate() + + const [paginationModel, setPaginationModel] = React.useState({ + page: 0, + pageSize:10 + }); + useEffect(() => { + setPaginationModel({page:0,pageSize:10}); + setRows(recordList); + }, [recordList]); + + const handleEditClick = (id) => () => { + navigate('/user/'+ id); + }; + + const columns = [ + { + field: 'actions', + type: 'actions', + headerName: 'Actions', + width: 100, + cellClassName: 'actions', + getActions: ({id}) => { + return [ + + + } + label="Edit" + className="textPrimary" + onClick={handleEditClick(id)} + color="edit" + /> + ] + }, + }, + { + id: 'username', + field: 'username', + headerName: 'User Name', + flex: 0.8, + }, + { + id: 'name', + field: 'fullname', + headerName: 'Full Name', + flex: 0.75, + }, + { + id: 'post', + field: 'post', + headerName: 'Post', + flex: 0.5, + }, + { + id: 'email', + field: 'email', + headerName: 'Email', + flex: 1.45, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'subDivision', + field: 'subDivision', + //type: 'date', + //sortable: false, + headerName: 'Sub-Division', + flex: 1.45, + renderCell: (params) => { + return ( +
+ {params.value} +
+ ); + } + }, + { + id: 'lotusNotesUser', + field: 'lotusNotesUser', + type: 'bool', + headerName: 'Lotus Notes', + flex: 0.63, + renderCell: (params) => { + return ( + + ); + }, + }, + { + id: 'locked', + field: 'locked', + type: 'bool', + headerName: 'Locked', + flex: 0.5, + renderCell: (params) => { + return ( + + ); + }, + }, + ]; + + return ( +
+ 'auto'} + slots={{ + noRowsOverlay: () => ( + CustomNoRowsOverlay() + ) + }} + pageSizeOptions={[10]} + autoHeight + /> +
+ ); +} diff --git a/src/pages/lionerUserSearchPage/index.js b/src/pages/lionerUserSearchPage/index.js new file mode 100644 index 0000000..115d965 --- /dev/null +++ b/src/pages/lionerUserSearchPage/index.js @@ -0,0 +1,95 @@ +// material-ui +import { + Box, + Grid, Typography +} from '@mui/material'; +import MainCard from "../../components/MainCard"; +import SearchForm from "./UserSearchForm"; +import UserTable from "./UserTable"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_USER_PATH} from "../../utils/ApiPathConst"; +import * as React from "react"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME, CARD_MAX_WIDTH} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const UserSettingPage = () => { + + const [record,setRecord] = useState([]); + const [searchCriteria, setSearchCriteria] = useState({}); + const [onReady, setOnReady] = useState(false); + + useEffect(() => { + getUserList(); + }, []); + + useEffect(() => { + setOnReady(true); + }, [record]); + + useEffect(() => { + getUserList(); + }, [searchCriteria]); + + function getUserList(){ + axios.get(`${apiPath}${GET_USER_PATH}`, + {params: searchCriteria} + ) + .then((response) => { + if (response.status === 200) { + setRecord(response.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function applySearch(input) { + setSearchCriteria(input); + } + + return ( + !onReady ? + + : + + + + + + + View User + + + + + + {/*row 1*/} + + + + {/*row 2*/} + + + + + + + + + ); +}; + +export default UserSettingPage; diff --git a/src/pages/lionerdashboard/CardBarchartContent.js b/src/pages/lionerdashboard/CardBarchartContent.js new file mode 100644 index 0000000..6d6b01e --- /dev/null +++ b/src/pages/lionerdashboard/CardBarchartContent.js @@ -0,0 +1,97 @@ +import {Box, Grid} from "@mui/material"; +import RankingTable from "./RankingTable"; +import RankingColumnChart from "./RankingColumnChart"; +import {chartLineColor} from "../../themes/colorConst"; +import {useEffect, useState} from "react"; +import {categoryType, dummyData1, dummyData2} from "./DummyRecord"; + +const CardBarchartContent = ({ + reverse, + selectedYear, + chartData, + boardData, + mean, + median, + useWhiteBoarder + }) => { + + const [year, setYear] = useState(selectedYear); + const [meanValue, setMeanValue] = useState(mean); + const [medianValue, setMedianValue] = useState(median); + const [data, setData] = useState(dummyData2); + const [rankingData, setRankingData] = useState(boardData); + const [fixCategoryType, setFixCategoryType] = useState(categoryType); + + useEffect(() => { + setData(dummyData1); + }, []); + + useEffect(() => { + setYear(selectedYear) + }, [selectedYear]); + + useEffect(() => { + setMeanValue(mean) + }, [mean]); + + useEffect(() => { + setMedianValue(median) + }, [median]); + + useEffect(() => { + //TODO: use api here with year to get data + setData(chartData) + setFixCategoryType(categoryType.slice(0, chartData[0].data.length)) + }, [chartData]); + + useEffect(() => { + //TODO: use api here with year to get data + setRankingData(boardData) + }, [boardData]); + + return ( + + { + reverse ? + + + + + + + + + : + + + + + + + + + + } + + ); +} + +export default CardBarchartContent; diff --git a/src/pages/lionerdashboard/CardHorizontalBarchartContent.js b/src/pages/lionerdashboard/CardHorizontalBarchartContent.js new file mode 100644 index 0000000..0e5bb6b --- /dev/null +++ b/src/pages/lionerdashboard/CardHorizontalBarchartContent.js @@ -0,0 +1,93 @@ +import {Box, Grid, Stack, Typography} from "@mui/material"; +import {chartLineColor} from "../../themes/colorConst"; +import {useEffect, useState} from "react"; +import {dummyData1, dummyData2} from "./DummyRecord"; +import RankingHorizontalBarChart from "./RankingHorizontalBarChart"; +import MainCard from "../../components/MainCard"; + +const CardHorizontalBarchartContent = ({ + selectedYear, + chartData, + mean, + median, + customCategoryType, + useWhiteBoarder, + chartColorAlt + }) => { + + const [year, setYear] = useState(selectedYear); + const [meanValue, setMeanValue] = useState(mean); + const [medianValue, setMedianValue] = useState(median); + const [data, setData] = useState(dummyData2); + const [fixCategoryType, setFixCategoryType] = useState(customCategoryType); + + useEffect(() => { + setData(dummyData1); + setFixCategoryType(customCategoryType); + }, []); + + useEffect(() => { + setYear(selectedYear) + }, [selectedYear]); + + useEffect(() => { + setMeanValue(mean) + }, [mean]); + + useEffect(() => { + setMedianValue(median) + }, [median]); + + useEffect(() => { + //TODO: use api here with year to get data + setData(chartData) + setFixCategoryType(fixCategoryType.slice(0, chartData[0].data.length)) + }, [chartData]); + + return ( + + + + + + + + + + + + Total Awards + + 47 + + + + + + + + + Total Event + + 52 + + + + + + + + + ); +} + +export default CardHorizontalBarchartContent; diff --git a/src/pages/lionerdashboard/CardSummaryContent.js b/src/pages/lionerdashboard/CardSummaryContent.js new file mode 100644 index 0000000..79a0a0e --- /dev/null +++ b/src/pages/lionerdashboard/CardSummaryContent.js @@ -0,0 +1,131 @@ +import {Box, Grid, Link, Stack, Typography} from "@mui/material"; +import RankingTable from "./RankingTable"; +import Image from "mui-image"; +import celebration from 'assets/images/display/celebration.png'; +import MainCard from "../../components/MainCard"; +import * as React from "react"; +import {Link as RouterLink} from "react-router-dom"; +import {useEffect, useState} from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_EVENT_YEAR_AWARD, GET_EVENT_YEAR_COUNT} from "../../utils/ApiPathConst"; +//import MainCard from "../../components/MainCard"; + +const CardBarchartContent = ({ + boardData, + selectedYear, + viewDivisionOnly + //chartColorAlt + }) => { + + const [eventCount, setEventCount] = useState(0); + const [awardCount, setAwardCount] = useState(0); + const userSubDivisionId = localStorage.getItem('subDivisionId'); + + function getYearCount(){ + axios.get(`${apiPath}${GET_EVENT_YEAR_COUNT}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + + } + }) + .then((response) => { + if (response.status === 200) { + setEventCount(response.data.data.count); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getYearAward(){ + axios.get(`${apiPath}${GET_EVENT_YEAR_AWARD}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setAwardCount(response.data.data.count); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + + useEffect(() => { + getYearCount(); + getYearAward(); + }, []); + + useEffect(() => { + getYearCount(); + getYearAward(); + }, [selectedYear, viewDivisionOnly]); + + return ( + + { + + + + + + + + + + Total Awards + + + + + Total Event + + + + + + + + + } + + ); +} + +export default CardBarchartContent; diff --git a/src/pages/lionerdashboard/DummyRecord.js b/src/pages/lionerdashboard/DummyRecord.js new file mode 100644 index 0000000..4ea9838 --- /dev/null +++ b/src/pages/lionerdashboard/DummyRecord.js @@ -0,0 +1,233 @@ +export const categoryType = ['#1', '#2', '#3', '#4', '#5', '#6', '#7', '#8', '#9', '#10']; + +export const dummyData1 = [ + { + name: 'Award Count', + data: [17, 13, 7, 4, 3, 3] + } +]; +export const dummyDataDetail1 = [ + { rank: 1, eventName: 'International Exhibition of Inventions of Geneva ', awardCount: 17, eventId: 8 }, + { rank: 2, eventName: 'BIM Achievement', awardCount: 13, eventId: 6 }, + { rank: 3, eventName: 'International Annual Report Competition (ARC)', awardCount: 7, eventId: 3 }, + { rank: 4, eventName: 'VTC 2021 Outstanding Apprentices Scheme', awardCount: 4, eventId: 11 }, + { rank: 5, eventName: 'HKMA Best Annual Reports Awards', awardCount: 3, eventId: 1 }, + { rank: 6, eventName: 'League of American Communications Professionals', awardCount: 3, eventId: 5 } +]; + +export const dummyData1alt = [ + { + name: 'Award Count', + data: [0, 0, 0, 0, 0, 0] + } +]; + +export const dummyDataDetail1alt = [ + { rank: 1, eventName: 'VTC 2021 Outstanding Apprentices Scheme', awardCount: 18, eventId: 11 }, + { rank: 2, eventName: 'International Exhibition of Inventions of Geneva', awardCount: 12, eventId: 8 }, + { rank: 3, eventName: 'International Annual Report Competition (ARC)', awardCount: 9, eventId: 3 }, + { rank: 4, eventName: 'BIM Achievement', awardCount: 8, eventId: 6 }, + { rank: 5, eventName: 'HKMA Best Annual Reports Awards', awardCount: 5, eventId: 1 }, + { rank: 6, eventName: 'League of American Communications Professionals', awardCount: 5, eventId: 5 } +]; + +export const dummyData2 = [ + { + name: 'Award Count', + data: [9, 8, 8, 7, 7, 6, 5, 5, 4, 3] + } +]; + +export const dummyDataDetail2 = [ + { rank: 1, eventName: 'Railways Branch', awardCount: 9, eventId: 1 }, + { rank: 2, eventName: 'Electricity and Energy Efficiency Branch ', awardCount: 8, eventId: 3 }, + { rank: 3, eventName: 'Gas and General Legislation Branch', awardCount: 8, eventId: 5 }, + { rank: 4, eventName: 'Engineering Services Branch 1', awardCount: 7, eventId: 7 }, + { rank: 5, eventName: 'Engineering Services Branch 2', awardCount: 7, eventId: 2 }, + { rank: 6, eventName: 'Engineering Services Branch 3', awardCount: 6, eventId: 4 }, + { rank: 7, eventName: 'Gas Standards Division A Chief Engineer', awardCount: 5, eventId: 2 }, + { rank: 8, eventName: 'Gas Standards Division B Chief Engineer', awardCount: 5, eventId: 2 }, + { rank: 9, eventName: 'General Legislation Division 1 Chief Electrical and Mechanical Engineer', awardCount: 4, eventId: 2 }, + { rank: 10, eventName: 'General Legislation Division 2 Chief Electrical and Mechanical Engineer', awardCount: 3, eventId: 2 } +]; + +export const dummyDataDetailString = [ + 'Railways Branch', + 'Electricity and Energy Efficiency Branch ', + 'Gas and General Legislation Branch', + 'Engineering Services Branch 1', + 'Engineering Services Branch 2', + 'Engineering Services Branch 3', + 'Gas Standards Division A Chief Engineer', + 'Gas Standards Division B Chief Engineer', + 'General Legislation Division 1 Chief Electrical and Mechanical Engineer', + 'General Legislation Division 2 Chief Electrical and Mechanical Engineer' +]; + +export const dummyData2alt = [ + { + name: 'Award Count', + data: [10, 9, 8, 7, 7, 6, 5, 3, 3, 2] + } +]; + +export const dummyDataDetail2alt = [ + { rank: 1, eventName: 'General Legislation Division 1 Chief Electrical and Mechanical Engineer', awardCount: 10, eventId: 2 }, + { rank: 2, eventName: 'Electricity and Energy Efficiency Branch ', awardCount: 9, eventId: 3 }, + { rank: 3, eventName: 'Gas Standards Division B Chief Engineer', awardCount: 8, eventId: 2 }, + { rank: 4, eventName: 'Engineering Services Branch 1', awardCount: 7, eventId: 7 }, + { rank: 5, eventName: 'Railways Branch', awardCount: 7, eventId: 1 }, + { rank: 6, eventName: 'Engineering Services Branch 2', awardCount: 6, eventId: 2 }, + { rank: 7, eventName: 'General Legislation Division 2 Chief Electrical and Mechanical Engineer', awardCount: 5, eventId: 2 }, + { rank: 8, eventName: 'Engineering Services Branch 3', awardCount: 3, eventId: 4 }, + { rank: 9, eventName: 'Gas and General Legislation Branch', awardCount: 3, eventId: 5 }, + { rank: 1, eventName: 'Gas Standards Division A Chief Engineer', awardCount: 2, eventId: 2 } +]; + +export const dummyDataDetailString2alt = [ + 'General Legislation Division 1 Chief Electrical and Mechanical Engineer', + 'Electricity and Energy Efficiency Branch ', + 'Gas Standards Division B Chief Engineer', + 'Engineering Services Branch 1', + 'Railways Branch', + 'Engineering Services Branch 2', + 'General Legislation Division 2 Chief Electrical and Mechanical Engineer', + 'Engineering Services Branch 3', + 'Gas and General Legislation Branch', + 'Gas Standards Division A Chief Engineer' +]; + +export const dummyData3 = [ + { + name: 'Award Count', + data: [10, 7, 6, 3, 15] + } +]; + +export const dummyDataDetail3 = [ + { eventName: 'Visionary Leadership', awardCount: 10 }, + { eventName: 'Effective HR policies', awardCount: 7 }, + { eventName: 'Competent', awardCount: 6 }, + { eventName: 'Knowledge Management', awardCount: 3 }, + { eventName: 'Others', awardCount: 15 } +]; + +export const dummyDataDetail3String = [ + 'Visionary Leadership', + 'Effective HR policies', + 'Competent', + 'Knowledge Management', + 'Others' +]; + +export const dummyData3alt = [ + { + name: 'Award Count', + data: [8, 8, 5, 4, 15] + } +]; + +export const dummyDataDetail3Stringalt = [ + 'Effective HR policies', + ' Capable Workforce', + 'Caring Culture', + 'Knowledge Management', + 'Others' +]; +export const dummyDataDetail3alt = [ + { eventName: 'Effective HR policies', awardCount: 0 }, + { eventName: ' Capable Workforce', awardCount: 8 }, + { eventName: 'Caring Culture', awardCount: 5 }, + { eventName: 'Knowledge Management', awardCount: 4 }, + { eventName: 'Others', awardCount: 15 } +]; + +export const dummyData4 = [ + { + name: 'Award Count', + data: [12, 4, 2, 5, 22] + } +]; + +export const dummyDataDetail4 = [ + { eventName: '創新', awardCount: 12 }, + { eventName: '傳承', awardCount: 4 }, + { eventName: '同心', awardCount: 2 }, + { eventName: '惠民', awardCount: 5 }, + { eventName: '其他', awardCount: 22 } +]; + +export const dummyDataDetail4String = ['同心', '創新', '惠民', '傳承', '其他']; + +export const dummyData4alt = [ + { + name: 'Award Count', + data: [11, 9, 5, 5, 17] + } +]; + +export const dummyDataDetail4Stringalt = ['創新', '傳承', '同心', '惠民', '其他']; + +export const dummyDataDetail4alt = [ + { eventName: '創新', awardCount: 11 }, + { eventName: '傳承', awardCount: 9 }, + { eventName: '同心', awardCount: 5 }, + { eventName: '惠民', awardCount: 5 }, + { eventName: '其他', awardCount: 17 } +]; + +export const EventApplicationData = [ + { + key: 1, + name: 'Application 1' + }, + { + key: 2, + name: 'Application 2' + }, + { + key: 3, + name: 'Application 3' + } +]; + +export const EventAwardData = [ + [ + { + key: 1, + name: 'Award 1' + }, + { + key: 2, + name: 'Award 2' + }, + { + key: 3, + name: 'Award 3' + } + ], + [ + { + key: 1, + name: 'Award 1' + }, + { + key: 2, + name: 'Award 2' + } + ], + [ + { + key: 1, + name: 'Award 1' + }, + { + key: 2, + name: 'Award 2' + }, + { + key: 3, + name: 'Award 3' + } + ] +]; diff --git a/src/pages/lionerdashboard/RankingCard.js b/src/pages/lionerdashboard/RankingCard.js new file mode 100644 index 0000000..0feec8e --- /dev/null +++ b/src/pages/lionerdashboard/RankingCard.js @@ -0,0 +1,86 @@ +import MainCard from "../../components/MainCard"; +import {Grid, Stack} from "@mui/material"; +import CardSummaryContent from "./CardSummaryContent"; + +const RankingCard = ({ + cardType, + title, + customBorderColor, + titleClass, + selectedYear, + boardData, + viewDivisionOnly, + }) => { + + function getCardContent(cardType) { + switch (cardType) { + case 1: + return ( + + ); + /*case 2: + return ( + + ); + case 3: + return( + + ); + default: + return ( + + );*/ + } + } + + return ( + + + + { + cardType === 3? + : undefined + } + {getCardContent(cardType)} + + + ); +} + +export default RankingCard; diff --git a/src/pages/lionerdashboard/RankingColumnChart.js b/src/pages/lionerdashboard/RankingColumnChart.js new file mode 100644 index 0000000..d3f6818 --- /dev/null +++ b/src/pages/lionerdashboard/RankingColumnChart.js @@ -0,0 +1,223 @@ +import {useEffect, useState} from 'react'; + +// material-ui +import {useTheme} from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; +import {chartColor} from "../../themes/colorConst"; +//import {categoryType} from "./DummyRecord"; +// chart options + + +const columnChartOptions = { + chart: { + type: 'bar', + height: '100%', + toolbar: { + show: false + } + }, + plotOptions: { + bar: { + distributed: true, + columnWidth: '30%', + borderRadius: 4 + } + }, + dataLabels: { + enabled: false + }, + stroke: { + show: true, + width: 8, + colors: ['transparent'] + }, + yaxis: { + title: { + text: '$(thousands)' + } + }, + fill: { + colors: chartColor, + opacity: 1 + }, + tooltip: { + y: { + formatter(val) { + return `${val} awards`; + } + } + }, + legend: { + show: false, + fontFamily: `'Public Sans', sans-serif`, + offsetX: 10, + offsetY: 10, + labels: { + useSeriesColors: false + }, + markers: { + width: 16, + height: 16, + radius: '50%', + offsexX: 2, + offsexY: 2 + }, + itemMargin: { + horizontal: 15, + vertical: 50 + } + }, + responsive: [ + { + breakpoint: 600, + options: { + yaxis: { + show: false + } + } + } + ] +}; + + +// ==============================|| SALES COLUMN CHART ||============================== // + +const RankingColumnChart = ({ + standardLineShow, + dummyData, + categoryType, + max, + mean, + median, + borderColor + }) => { + const theme = useTheme(); + + const {primary, secondary} = theme.palette.text; + const line = theme.palette.divider; + + const warning = theme.palette.warning.main; + const primaryMain = theme.palette.primary.main; + const successDark = theme.palette.success.dark; + + const [series, setSeries] = useState(dummyData); + + const [options, setOptions] = useState(columnChartOptions); + + const [fixCategoryType, setFixCategoryType] = useState(categoryType); + + useEffect(() => { + setSeries(dummyData); + setFixCategoryType(categoryType) + }, [dummyData,categoryType]); + + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + colors: [warning, primaryMain], + annotations: { + yaxis: standardLineShow ? [ + { + y: median, + borderColor: "green", + fillColor: "green", + opacity: 0.1, + label: { + position: "top", + textAnchor: "start", + borderColor: "green", + style: { + color: "#fff", + background: "green" + }, + text: `Median: ${median}` + } + } + , + { + y: mean, + borderColor: "red", + fillColor: "red", + opacity: 0.1, + label: { + borderColor: "red", + style: { + color: "#fff", + background: "red" + }, + text: `Average: ${mean}` + } + } + ] : [], + + }, + xaxis: { + axisBorder: { + show: true, + color: '#78909C', + height: 1, + width: '100%', + offsetX: 0, + offsetY: 0 + }, + categories: fixCategoryType, + labels: { + style: { + colors: chartColor, + } + } + }, + yaxis: { + axisBorder: { + show: true, + color: '#78909C', + offsetX: 0, + offsetY: 0 + }, + min: 0, + max: max, + labels: { + style: { + colors: [secondary] + } + } + }, + grid: { + borderColor: borderColor + }, + tooltip: { + theme: 'light' + }, + legend: { + position: 'top', + horizontalAlign: 'right', + labels: { + colors: 'grey.500' + } + } + })); + }, [primary, secondary, line, warning, primaryMain, successDark, mean, median, fixCategoryType]); + + return ( +
+ +
+ ); +}; + +RankingColumnChart.defaultProps = { + max: 20, + standardLineValue: 12, + standardLineShow: true, + mean: 0, + median: 0, +} + +export default RankingColumnChart; diff --git a/src/pages/lionerdashboard/RankingHorizontalBarChart.js b/src/pages/lionerdashboard/RankingHorizontalBarChart.js new file mode 100644 index 0000000..42b89c5 --- /dev/null +++ b/src/pages/lionerdashboard/RankingHorizontalBarChart.js @@ -0,0 +1,255 @@ +import {useEffect, useState} from 'react'; + +// material-ui +import {useTheme} from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; +import {chartColor} from "../../themes/colorConst"; +import {makeStyles} from "@mui/styles"; +//import {categoryType} from "./DummyRecord"; +// chart options + + +const columnChartOptions = { + chart: { + type: 'bar', + height: '100%', + width: '100%', + toolbar: { + show: false + }, + zoom: { + enabled: true, + type: 'x', + resetIcon: { + offsetX: -10, + offsetY: 0, + fillColor: '#fff', + strokeColor: '#37474F' + }, + selection: { + background: '#90CAF9', + border: '#0D47A1' + } + } + + }, + plotOptions: { + bar: { + barHeight: "100%", + distributed: true, + horizontal: true, + columnWidth: '30%', + borderRadius: 4, + dataLabels: { + position: 'bottom' + }, + } + }, + dataLabels: { + enabled: true, + textAnchor: 'start', + style: { + colors: ['#333'], + fontSize: '16px', + fontWeight: 'bold', + }, + formatter: function (val, opt) { + return val === 0 ? + "" : + opt.w.globals.labels[opt.dataPointIndex] + ": " + val + }, + offsetX: 0, + // dropShadow: { + // color: '#fff', + // opacity: 0.8, + // blur: 2, + // enabled: true + // } + }, + stroke: { + show: true, + width: 1, + colors: ['transparent'] + }, + yaxis: { + labels: { + show: false + }, + title: { + text: '$(thousands)' + } + }, + fill: { + colors: chartColor, + opacity: 0.6 + }, + tooltip: { + y: { + formatter(val) { + return `${val} awards`; + } + } + }, + legend: { + show: false, + fontFamily: `'Public Sans', sans-serif`, + offsetX: 10, + offsetY: 10, + labels: { + useSeriesColors: false + }, + markers: { + width: 16, + height: 16, + radius: '50%', + offsexX: 2, + offsexY: 2 + }, + itemMargin: { + horizontal: 15, + vertical: 50 + } + }, + responsive: [ + { + breakpoint: 600, + options: { + yaxis: { + show: false + } + } + } + ] +}; + + +// ==============================|| SALES COLUMN CHART ||============================== // + +const useStyles = makeStyles(() => ({ + chartContainer: { + height: '270px', // Set the desired height of the chart container using vh + width: '100%', + overflow: 'auto', + }, +})); + +const RankingHorizontalBarChart = ({ + detailData, + categoryType, + recordSize, + }) => { + const theme = useTheme(); + const classes = useStyles(); + const {primary, secondary} = theme.palette.text; + const line = theme.palette.divider; + + const warning = theme.palette.warning.main; + const primaryMain = theme.palette.primary.main; + const successDark = theme.palette.success.dark; + + const [series, setSeries] = useState([]); + + const [options, setOptions] = useState(columnChartOptions); + + const [fixCategoryType, setFixCategoryType] = useState([]); + + useEffect(() => { + setSeries(detailData); + setFixCategoryType(categoryType) + }, [detailData,categoryType]); + + // useEffect(() => { + // setSeries(detailData); + // setFixCategoryType(categoryType); + // }, [series]); + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + colors: [warning, primaryMain], + zoom: { + enabled: true, + type: 'y', + resetIcon: { + offsetX: -10, + offsetY: 0, + fillColor: '#fff', + strokeColor: '#37474F' + }, + selection: { + background: '#90CAF9', + border: '#0D47A1' + } + }, + xaxis: { + axisBorder: { + show: false, + }, + labels: { + style: { + colors: 'white' + } + }, + categories: fixCategoryType, + }, + yaxis: { + labels: { + show: false + }, + axisBorder: { + show: false, + }, + /*forceNiceScale: true, + min: 0, + max: max, + labels: { + align: 'right', + minWidth: 150, + maxWidth: 500, + style: { + fontSize: '20px', + colors: rankColor, + fontWeight: 'bold' + } + }*/ + }, + grid: { + show: false + }, + tooltip: { + theme: 'light' + }, + legend: { + position: 'top', + horizontalAlign: 'right', + labels: { + colors: 'grey.500' + } + }, + })); + }, [primary, secondary, line, warning, primaryMain, successDark, fixCategoryType]); + + return ( +
+ +
+ ); +}; + +RankingHorizontalBarChart.defaultProps = { + max: 20, + standardLineValue: 12, + standardLineShow: true, + mean: 0, + median: 0, +} + +export default RankingHorizontalBarChart; diff --git a/src/pages/lionerdashboard/RankingPieChart.js b/src/pages/lionerdashboard/RankingPieChart.js new file mode 100644 index 0000000..bf8a85a --- /dev/null +++ b/src/pages/lionerdashboard/RankingPieChart.js @@ -0,0 +1,102 @@ +import {useEffect, useState} from 'react'; + +// material-ui +import {useTheme} from '@mui/material/styles'; + +// third-party +import ReactApexChart from 'react-apexcharts'; +//import {piechartColor1, piechartColor2} from "../../themes/colorConst"; +//import {categoryType} from "./DummyRecord"; +// chart options + + +const pieChartOptions = { + chart: { + type: 'donut', + }, + legend: { + fontSize: '16px', + position: 'bottom', + horizontalAlign: 'left', + }, + dataLabels: { + style: { + fontSize: '16px' + } + }, + responsive: [{ + breakpoint: 480, + options: { + chart: { + width: 30 + }, + legend: { + position: 'bottom' + } + } + }] +}; +// ==============================|| SALES COLUMN CHART ||============================== // + +const RankingPieChart = ({ + chartType, + chartData, + categoryType, + legendPosition, + }) => { + const theme = useTheme(); + + const {primary, secondary} = theme.palette.text; + const line = theme.palette.divider; + + const warning = theme.palette.warning.main; + const primaryMain = theme.palette.primary.main; + const successDark = theme.palette.success.dark; + + const [series, setSeries] = useState(chartData); + + const [options, setOptions] = useState(pieChartOptions); + + const [fixCategoryType, setFixCategoryType] = useState(categoryType); + + useEffect(() => { + setSeries(chartData); + setFixCategoryType(categoryType) + }, [chartData, categoryType]); + + + useEffect(() => { + setOptions((prevState) => ({ + ...prevState, + chart: { + type: chartType, + }, + labels: fixCategoryType, + //colors: chartColorAlt? piechartColor1 : piechartColor2, + tooltip: { + theme: 'light' + }, + legend: { + position: legendPosition, + }, + })); + }, [primary, secondary, line, warning, primaryMain, successDark, fixCategoryType]); + + return ( +
+ +
+ ); +}; + +RankingPieChart.defaultProps = { + max: 20, + chartType: 'pie' +} + +export default RankingPieChart; diff --git a/src/pages/lionerdashboard/RankingTable.js b/src/pages/lionerdashboard/RankingTable.js new file mode 100644 index 0000000..2f5cdf9 --- /dev/null +++ b/src/pages/lionerdashboard/RankingTable.js @@ -0,0 +1,233 @@ +import PropTypes from 'prop-types'; +import {useEffect, useState} from 'react'; + +// material-ui +import { + Box, + Stack, + Table, + TableBody, + TableCell, + TableContainer, + TableHead, + TableRow, Typography, +} from '@mui/material'; + +// project import +import {dummyDataDetail1} from "./DummyRecord"; +import {rankColor} from "../../themes/colorConst"; +import * as React from "react"; +import 'assets/style/rankStyle.css'; + + +//import LooksOneIcon from '@mui/icons-material/LooksOne'; +//import { DashboardOutlined } from '@ant-design/icons'; +//import {EmojiEvents, LooksTwoRounded, Looks3Outlined} from '@mui/icons-material'; + +function descendingComparator(a, b, orderBy) { + if (b[orderBy] < a[orderBy]) { + return -1; + } + if (b[orderBy] > a[orderBy]) { + return 1; + } + return 0; +} + +function getComparator(order, orderBy) { + return order === 'desc' ? (a, b) => descendingComparator(a, b, orderBy) : (a, b) => -descendingComparator(a, b, orderBy); +} + +function stableSort(array, comparator) { + const stabilizedThis = array.map((el, index) => [el, index]); + stabilizedThis.sort((a, b) => { + const order = comparator(a[0], b[0]); + if (order !== 0) { + return order; + } + return a[1] - b[1]; + }); + return stabilizedThis.map((el) => el[0]); +} + +// ==============================|| ORDER TABLE - HEADER CELL ||============================== // + +const headCells = [ + /*{ + id: 'Rank', + key: 'rank', + align: 'left', + disablePadding: false, + label: 'Rank' + },*/ + { + id: 'Event', + key: 'Event', + align: 'left', + disablePadding: true, + label: 'Top 6 Event' + }, + { + id: 'No. of Award', + key: 'awardCount', + align: 'right', + disablePadding: false, + label: 'No. of Award' + }, +]; + +// ==============================|| ORDER TABLE - HEADER ||============================== // + +function RankingTableHead({ order, orderBy }) { + return ( + + + {headCells.map((headCell) => ( + + {headCell.label} + + ))} + + + ); +} + +RankingTableHead.propTypes = { + order: PropTypes.string, + orderBy: PropTypes.string +}; +// ==============================|| ORDER TABLE ||============================== // + +export default function RankingTable({boardData}) { + const [rows,setRows] = useState(dummyDataDetail1); + + const [order] = useState('asc'); + const [orderBy] = useState('trackingNo'); + + /*function renderRank(rank){ + switch(rank) { + case 1: + return ; + case 2: + return ; + case 3: + return ; + default: + return rank; + } + }*/ + + function renderDetail(rank,detail){ + switch(rank) { + case 1: + return + + {detail} + + ; + case 2: + return + + {detail} + + ; + case 3: + return + + {detail} + + ; + default: + return + + {detail} + + ; + } + + } + + useEffect(() => { + setRows(boardData); + }, [boardData]); + + return ( + + + + + + + {/**/} + + + + {stableSort(rows, getComparator(order, orderBy)).map((row, /*index*/) => { + return ( + + {/**/} + {/* {renderRank(row.rank)}*/} + {/**/} + + {renderDetail(row.rank, row.eventName,row.eventId)} + + + {row.awardCount} + + + ); + })} + +
+
+
+ ); +} diff --git a/src/pages/lionerdashboard/TestTable.js b/src/pages/lionerdashboard/TestTable.js new file mode 100644 index 0000000..76fad86 --- /dev/null +++ b/src/pages/lionerdashboard/TestTable.js @@ -0,0 +1,54 @@ +import * as React from 'react'; +import Table from '@mui/material/Table'; +import TableBody from '@mui/material/TableBody'; +import TableCell from '@mui/material/TableCell'; +import TableContainer from '@mui/material/TableContainer'; +import TableHead from '@mui/material/TableHead'; +import TableRow from '@mui/material/TableRow'; +import Paper from '@mui/material/Paper'; + +function createData(name, calories, fat, carbs, protein) { + return { name, calories, fat, carbs, protein }; +} + +const rows = [ + createData('Frozen yoghurt', 159, 6.0, 24, 4.0), + createData('Ice cream sandwich', 237, 9.0, 37, 4.3), + createData('Eclair', 262, 16.0, 24, 6.0), + createData('Cupcake', 305, 3.7, 67, 4.3), + createData('Gingerbread', 356, 16.0, 49, 3.9), +]; + +export default function TestTable() { + return ( + + + + + Dessert (100g serving) + Calories + Fat (g) + Carbs (g) + Protein (g) + + + + {rows.map((row) => ( + + + {row.name} + + {row.calories} + {row.fat} + {row.carbs} + {row.protein} + + ))} + +
+
+ ); +} \ No newline at end of file diff --git a/src/pages/lionerdashboard/ThreeInOneCard.js b/src/pages/lionerdashboard/ThreeInOneCard.js new file mode 100644 index 0000000..d6d04ce --- /dev/null +++ b/src/pages/lionerdashboard/ThreeInOneCard.js @@ -0,0 +1,260 @@ +import {Box, Button, Grid, TextField, Typography} from "@mui/material"; +import {LIONER_LONG_BUTTON_THEME} from "../../themes/colorConst"; +import {useContext, useEffect, useState} from "react"; +import RankingHorizontalBarChart from "./RankingHorizontalBarChart"; +import MainCard from "../../components/MainCard"; +import {cardBorderColor} from "../../themes/colorConst"; +import * as React from "react"; +import {getListByFieldName} from "../../utils/CommonFunction"; +import RankingPieChart from "./RankingPieChart"; +import LoadingComponent from "../extra-pages/LoadingComponent"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import {GET_EVENT_SUMMARY_EXCEL} from "../../utils/ApiPathConst"; +import {ThemeProvider} from "@emotion/react"; +import UploadContext from "../../components/UploadProvider"; +import {BRANCH_COMBO} from "../../utils/ComboConst"; +import Autocomplete from "@mui/material/Autocomplete"; + +const ThreeInOneCard = ({ + setIsUpdating, + isUpdating, + selectedYear, + divisionData, + tagData, + categoryData, + selectedBranch, + setSelectedBranch, + viewDivisionOnly + }) => { + + const [onReady, setOnReady] = useState(false); + const { setIsUploading } = useContext(UploadContext); + + const [divisionChartData, setDivisionChartData] = useState([]); + const [divisionCategoryType, setDivisionCategoryType] = useState([]); + + const [tagChartData, setTagChartData] = useState([]); + const [tagCategoryType, setTagCategoryType] = useState([]); + + const [categoryChartData, setCategoryChartData] = useState([]); + const [categoryCategoryType, setCategoryCategoryType] = useState([]); + + + const downloadReport = () => { + const userSubDivisionId = localStorage.getItem('subDivisionId'); + + setIsUploading(true); + axios.get(`${apiPath}${GET_EVENT_SUMMARY_EXCEL}`,{ + responseType: 'blob', + params:{ + year: selectedYear, + branch: selectedBranch === null ? null : selectedBranch.label, + viewDivisionOnly: viewDivisionOnly === null ? false : viewDivisionOnly, + userSubDivisionId: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setIsUploading(false); + const url = URL.createObjectURL(new Blob([response.data])); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", "Award_summary_"+ Date.now() + ".xlsx"); + link.click(); + } + }) + .catch(error => { + setIsUploading(false); + console.log(error); + return false; + }); + }; + + useEffect(() => { + if(divisionData.length > 0){ + if(divisionData.length === 1){ + let tempList = divisionData; + tempList.push({ + awardCount:0, + name:"", + rank:2, + }); + + setDivisionChartData([{ + name: 'Award Count', + data: getListByFieldName(tempList, 'awardCount') + }]) + setDivisionCategoryType(getListByFieldName(tempList,'name')); + } + else{ + setDivisionChartData([{ + name: 'Award Count', + data: getListByFieldName(divisionData, 'awardCount') + }]) + setDivisionCategoryType(getListByFieldName(divisionData,'name')); + } + } + }, [divisionData]); + + useEffect(() => { + if(divisionChartData.length > 0 && divisionCategoryType.length > 0){ + if(divisionChartData[0].data.length === divisionCategoryType.length){ + setIsUpdating(false); + } + } + else{ + setIsUpdating(false); + } + }, [tagData,divisionCategoryType]); + + useEffect(() => { + setTagChartData(getListByFieldName(tagData, 'awardCount')) + setTagCategoryType(getListByFieldName(tagData,'name')); + }, [tagData]); + + useEffect(() => { + setCategoryChartData(getListByFieldName(categoryData, 'awardCount')); + setCategoryCategoryType(getListByFieldName(categoryData,'name')); + }, [categoryData]); + + useEffect(() => { + /*if( + divisionChartData.length >0 && + tagChartData.length >0 && + categoryData.length >0 + ){ + }*/ + setOnReady(true); + + }, [divisionChartData,tagChartData,categoryChartData]); + + return ( + !isUpdating && !onReady ? + + : + + + + + + + { + viewDivisionOnly ? + undefined + : + + + + Branch: + + + + + { + setSelectedBranch(newValue); + }} + renderInput={(params) => + + } + /> + + + } + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ); +} + +export default ThreeInOneCard; diff --git a/src/pages/lionerdashboard/index copy.js b/src/pages/lionerdashboard/index copy.js new file mode 100644 index 0000000..40d6ad5 --- /dev/null +++ b/src/pages/lionerdashboard/index copy.js @@ -0,0 +1,313 @@ +import {useEffect, useState} from 'react'; + +// material-ui +import { + Box, + Grid, + MenuItem, + TextField, + Typography +} from '@mui/material'; +import RankingCard from "./RankingCard"; +import {cardBorderColor} from "../../themes/colorConst"; +import ThreeInOneCard from "./ThreeInOneCard"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_DIVISION_FROM_SUB_DIVISION, + GET_EVENT_CATEGORY_SUMMARY, + GET_EVENT_DIVISION_SUMMARY, + GET_EVENT_TAG_SUMMARY, + GET_EVENT_TOP6, + GET_EVENT_YEAR_COMBO +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import {handleLogoutFunction} from "../../auth"; +import {useDispatch} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {BRANCH_COMBO, DASHBOARD_DIVISION_COMBO} from "../../utils/ComboConst"; +// sales report status + + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const LIONERDashboard = () => { + const dispatch = useDispatch() + const navigate = useNavigate() + const userSubDivisionId = localStorage.getItem('subDivisionId'); + + const [selectedYear, setSelectedYear] = useState(null); + const [yearList, setYearList] = useState([]); + const [onReady, setOnReady] = useState(false); + const [top6List, setTop6List] = useState([]); + const [divisionSummary, setDivisionSummary] = useState([]); + const [tagSummary, setTagSummary] = useState([]); + const [categorySummary, setCategorySummary] = useState([]); + const [fetchedYear, setFetchedYear] = useState(false); + const [isUpdating, setIsUpdating] = useState(false); + const [selectedBranch, setSelectedBranch] = useState(BRANCH_COMBO[0]); + const [viewDivisionOnly, setViewDivisionOnly] = useState(null); + const [viewDivisionDisplay, setViewDivisionDisplay] = useState(false); + const [userDivision, setUserDivision] = useState(null); + + function getUserDivisionDetail(){ + axios.get(`${apiPath}${GET_DIVISION_FROM_SUB_DIVISION}`,{ + params:{ + id: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setUserDivision(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + function getDivisionSummary(){ + if (selectedYear) { + axios.get(`${apiPath}${GET_EVENT_DIVISION_SUMMARY}`,{ + params:{ + year: selectedYear, + branch: selectedBranch === null ? null : selectedBranch.label, + viewDivisionOnly: viewDivisionOnly === null ? false : viewDivisionOnly, + userSubDivisionId: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setDivisionSummary(response.data.records); + setIsUpdating(true); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + + function getTagSummary(){ + axios.get(`${apiPath}${GET_EVENT_TAG_SUMMARY}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setTagSummary(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getCategorySummary(){ + axios.get(`${apiPath}${GET_EVENT_CATEGORY_SUMMARY}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setCategorySummary(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getYearComboList(){ + axios.get(`${apiPath}${GET_EVENT_YEAR_COMBO}` + ) + .then((response) => { + if (response.status === 200) { + if(response.data.records.length === 0){ + let tempList = [{ + label: new Date().getFullYear(), + id: new Date().getFullYear() + }]; + setYearList(tempList); + setSelectedYear(tempList[0].label); + setFetchedYear(true); + } + else{ + setYearList(response.data.records); + setSelectedYear(response.data.records[0].label); + setFetchedYear(true); + } + } + }) + .catch(error => { + dispatch(handleLogoutFunction()); + navigate('/login'); + console.log(error); + return false; + }); + } + + function getYearTop6(){ + + axios.get(`${apiPath}${GET_EVENT_TOP6}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setTop6List(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getYearComboList(); + getUserDivisionDetail(); + setViewDivisionDisplay(1); + }, []); + + useEffect(() => { + if(fetchedYear){ + if(selectedYear!== null){ + getYearTop6(); + getDivisionSummary(); + getTagSummary(); + getCategorySummary(); + } + setOnReady(true); + } + + }, [fetchedYear, selectedYear, viewDivisionOnly]); + + useEffect(() => { + getDivisionSummary(); + }, [selectedBranch]); + + return ( + !onReady ? + + : + + + + + + + + + Dashboard + + + + + + + Year: + + + + setSelectedYear(e.target.value)} + > + {yearList.map((option) => ( + + {option.label} + + ))} + + + + + + + + + + Dashboard Type: + + + + { + setViewDivisionDisplay(e.target.value); + setViewDivisionOnly(DASHBOARD_DIVISION_COMBO[e.target.value-1].value); + }} + sx={{width:{md:'15vw',lg:'10vw'}}} + > + {DASHBOARD_DIVISION_COMBO.map((option) => ( + + {option.label} + + ))} + + + + + + + + + + + {/* row 2 */} + + + + + + + + + + + + + ); +}; + +export default LIONERDashboard; diff --git a/src/pages/lionerdashboard/index.js b/src/pages/lionerdashboard/index.js new file mode 100644 index 0000000..30c0e2e --- /dev/null +++ b/src/pages/lionerdashboard/index.js @@ -0,0 +1,220 @@ +import {useEffect, useState} from 'react'; + +// material-ui +import { + Box, + Grid, + MenuItem, + TextField, + Typography +} from '@mui/material'; +import RankingCard from "./RankingCard"; +import {cardBorderColor} from "../../themes/colorConst"; +import ThreeInOneCard from "./ThreeInOneCard"; +import * as React from "react"; +import axios from "axios"; +import {apiPath} from "../../auth/utils"; +import { + GET_DIVISION_FROM_SUB_DIVISION, + GET_EVENT_CATEGORY_SUMMARY, + GET_EVENT_DIVISION_SUMMARY, + GET_EVENT_TAG_SUMMARY, + GET_EVENT_TOP6, + GET_EVENT_YEAR_COMBO +} from "../../utils/ApiPathConst"; +import LoadingComponent from "../extra-pages/LoadingComponent"; + +import {LIONER_FORM_THEME} from "../../themes/themeConst"; +import {ThemeProvider} from "@emotion/react"; +import {handleLogoutFunction} from "../../auth"; +import {useDispatch} from "react-redux"; +import {useNavigate} from "react-router-dom"; +import {BRANCH_COMBO, DASHBOARD_DIVISION_COMBO} from "../../utils/ComboConst"; +// sales report status + + +// ==============================|| DASHBOARD - DEFAULT ||============================== // + +const LIONERDashboard = () => { + const dispatch = useDispatch() + const navigate = useNavigate() + const userSubDivisionId = localStorage.getItem('subDivisionId'); + + const [selectedYear, setSelectedYear] = useState(null); + const [yearList, setYearList] = useState([]); + const [onReady, setOnReady] = useState(false); + const [top6List, setTop6List] = useState([]); + const [divisionSummary, setDivisionSummary] = useState([]); + const [tagSummary, setTagSummary] = useState([]); + const [categorySummary, setCategorySummary] = useState([]); + const [fetchedYear, setFetchedYear] = useState(false); + const [isUpdating, setIsUpdating] = useState(false); + const [selectedBranch, setSelectedBranch] = useState(BRANCH_COMBO[0]); + const [viewDivisionOnly, setViewDivisionOnly] = useState(null); + const [viewDivisionDisplay, setViewDivisionDisplay] = useState(false); + const [userDivision, setUserDivision] = useState(null); + + function getUserDivisionDetail(){ + axios.get(`${apiPath}${GET_DIVISION_FROM_SUB_DIVISION}`,{ + params:{ + id: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setUserDivision(response.data.data); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + function getDivisionSummary(){ + if (selectedYear) { + axios.get(`${apiPath}${GET_EVENT_DIVISION_SUMMARY}`,{ + params:{ + year: selectedYear, + branch: selectedBranch === null ? null : selectedBranch.label, + viewDivisionOnly: viewDivisionOnly === null ? false : viewDivisionOnly, + userSubDivisionId: userSubDivisionId + } + }) + .then((response) => { + if (response.status === 200) { + setDivisionSummary(response.data.records); + setIsUpdating(true); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + } + + function getTagSummary(){ + axios.get(`${apiPath}${GET_EVENT_TAG_SUMMARY}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setTagSummary(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getCategorySummary(){ + axios.get(`${apiPath}${GET_EVENT_CATEGORY_SUMMARY}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setCategorySummary(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + function getYearComboList(){ + axios.get(`${apiPath}${GET_EVENT_YEAR_COMBO}` + ) + .then((response) => { + if (response.status === 200) { + if(response.data.records.length === 0){ + let tempList = [{ + label: new Date().getFullYear(), + id: new Date().getFullYear() + }]; + setYearList(tempList); + setSelectedYear(tempList[0].label); + setFetchedYear(true); + } + else{ + setYearList(response.data.records); + setSelectedYear(response.data.records[0].label); + setFetchedYear(true); + } + } + }) + .catch(error => { + dispatch(handleLogoutFunction()); + navigate('/login'); + console.log(error); + return false; + }); + } + + function getYearTop6(){ + + axios.get(`${apiPath}${GET_EVENT_TOP6}`,{ + params:{ + year: selectedYear, + userSubDivisionId: viewDivisionOnly? userSubDivisionId : null + } + }) + .then((response) => { + if (response.status === 200) { + setTop6List(response.data.records); + } + }) + .catch(error => { + console.log(error); + return false; + }); + } + + useEffect(() => { + getYearComboList(); + getUserDivisionDetail(); + setViewDivisionDisplay(1); + }, []); + + useEffect(() => { + if(fetchedYear){ + if(selectedYear!== null){ + getYearTop6(); + getDivisionSummary(); + getTagSummary(); + getCategorySummary(); + } + setOnReady(true); + } + + }, [fetchedYear, selectedYear, viewDivisionOnly]); + + useEffect(() => { + getDivisionSummary(); + }, [selectedBranch]); + + return ( + !onReady ? + + : + + + + + Welcome to LIONER System + + + + + + ); +}; + +export default LIONERDashboard; diff --git a/src/react-app-env.d.js b/src/react-app-env.d.js new file mode 100644 index 0000000..6431bc5 --- /dev/null +++ b/src/react-app-env.d.js @@ -0,0 +1 @@ +/// diff --git a/src/reportWebVitals.js b/src/reportWebVitals.js new file mode 100644 index 0000000..532f29b --- /dev/null +++ b/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = (onPerfEntry) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/src/routes/AppreciationRoute.js b/src/routes/AppreciationRoute.js new file mode 100644 index 0000000..4764c25 --- /dev/null +++ b/src/routes/AppreciationRoute.js @@ -0,0 +1,68 @@ +import {lazy, useContext} from 'react'; + +// project import +import Loadable from 'components/Loadable'; +import MainLayout from "../layout/MainLayout"; +import {handleRouteAbility} from "../utils/CommonFunction"; +import {Navigate} from "react-router"; +import AbilityContext from "../components/AbilityProvider"; + +// render - login +const AppreciationSearchPage = Loadable(lazy( () => import('pages/lionerAppreciationSearchPage'))); +const AppreciationMaintainPage = Loadable(lazy( () => import('pages/lionerMaintainAppreciationPage'))); +const AppreciationReportPage = Loadable(lazy( () => import('pages/lionerGenerateReportPage'))); + +// ==============================|| AUTH ROUTING ||============================== // + +const AppreciationRoutes =() => { + const ability = useContext(AbilityContext); + + return { + path: '/', + element: , + children: [ + { + path: 'appreciation', + element: ( + handleRouteAbility( + ability.can('VIEW', 'APPRECIATION'), + , + + ) + ), + }, + { + path: 'appreciation/maintain/:id', + element: ( + handleRouteAbility( + ability.can('VIEW', 'APPRECIATION'), + , + + ) + ), + }, + { + path: 'appreciation/report', + element: ( + handleRouteAbility( + ability.can('GENERATE', 'REPORTS'), + , + + ) + ), + }, + // { + // path: 'event/maintain/:id', + // element: ( + // handleRouteAbility( + // ability.can('VIEW', 'EVENT'), + // , + // + // ) + // ), + // }, + ] + }; +}; + +export default AppreciationRoutes; diff --git a/src/routes/AwardRoutes.js b/src/routes/AwardRoutes.js new file mode 100644 index 0000000..d3050b2 --- /dev/null +++ b/src/routes/AwardRoutes.js @@ -0,0 +1,116 @@ +import {lazy, useContext} from 'react'; + +// project import +import Loadable from 'components/Loadable'; +import MainLayout from "../layout/MainLayout"; +import {handleRouteAbility} from "../utils/CommonFunction"; +import {Navigate} from "react-router"; +import AbilityContext from "../components/AbilityProvider"; + +// render - login +const ApplicationSearchPage = Loadable(lazy( () => import('pages/lionerApplicationSearchPage'))); +const ApplicationMaintainPage = Loadable(lazy(() => import('pages/lionerMaintainApplicationPage'))); +const EventSearchPage = Loadable(lazy( () => import('pages/lionerEventSearchPage'))); +const EventMaintainPage = Loadable(lazy( () => import('pages/lionerMaintainEventPage'))); +const AwardSearchPage = Loadable(lazy( () => import('pages/lionerAwardSearchPage'))); +const AwardMaintainPage = Loadable(lazy( () => import('pages/lionerMaintainAwardPage'))); +const AdvanceSearchPage = Loadable(lazy( () => import('pages/lionerAdvanceSearchPage'))); + +// ==============================|| AUTH ROUTING ||============================== // + +const AwardRoutes =() => { + const ability = useContext(AbilityContext); + + return { + path: '/', + element: , + children: [ + { + path: 'advance/:module/:keyword', + element: + }, + { + path: 'event', + element: ( + handleRouteAbility( + ability.can('VIEW', 'EVENT'), + , + + ) + ), + }, + { + path: 'event/maintain/:id', + element: ( + handleRouteAbility( + ability.can('VIEW', 'EVENT'), + , + + ) + ), + }, + { + path: 'application', + element: ( + handleRouteAbility( + ability.can('VIEW', 'APPLICATION'), + , + + ) + ), + }, + { + path: 'application/maintain/:id', + element: ( + handleRouteAbility( + ability.can('VIEW', 'APPLICATION'), + , + + ) + ), + }, + { + path: 'application/maintain/:id/:eventId', + element: ( + handleRouteAbility( + ability.can('VIEW', 'APPLICATION'), + , + + ) + ), + }, + { + path: 'award', + element: ( + handleRouteAbility( + ability.can('VIEW', 'AWARD'), + , + + ) + ), + }, + { + path: 'award/maintain/:id', + element: ( + handleRouteAbility( + ability.can('VIEW', 'AWARD'), + , + + ) + ), + }, + { + path: 'award/maintain/:id/:eventId/:applicationId', + element: ( + handleRouteAbility( + ability.can('VIEW', 'AWARD'), + , + + ) + ), + }, + ] + }; +}; + +export default AwardRoutes; diff --git a/src/routes/ClientRoutes.js b/src/routes/ClientRoutes.js new file mode 100644 index 0000000..b7eb8d1 --- /dev/null +++ b/src/routes/ClientRoutes.js @@ -0,0 +1,47 @@ +import {lazy, useContext} from 'react'; + +// project import +import Loadable from 'components/Loadable'; +import MainLayout from "../layout/MainLayout"; +import {handleRouteAbility} from "../utils/CommonFunction"; +import {Navigate} from "react-router"; +import AbilityContext from "../components/AbilityProvider"; + +// render - login +const ClientSearchPage = Loadable(lazy( () => import('pages/client/ClientSearchPage'))); +const ClientMaintainPage = Loadable(lazy( () => import('pages/client/ClientMaintainPage'))); + +// ==============================|| AUTH ROUTING ||============================== // + +const ClientRoutes =() => { + const ability = useContext(AbilityContext); + + return { + path: '/', + element: , + children: [ + { + path: 'client', + element: ( + handleRouteAbility( + ability.can('VIEW', 'DASHBOARD'), + , + + ) + ), + }, + { + path: 'client/maintain/:id', + element: ( + handleRouteAbility( + ability.can('VIEW', 'DASHBOARD'), + , + + ) + ), + }, + ] + }; +}; + +export default ClientRoutes; diff --git a/src/routes/LoginRoutes.js b/src/routes/LoginRoutes.js new file mode 100644 index 0000000..097e79e --- /dev/null +++ b/src/routes/LoginRoutes.js @@ -0,0 +1,33 @@ +import { lazy } from 'react'; + +// project import +import Loadable from 'components/Loadable'; +import MinimalLayout from 'layout/MinimalLayout'; + +// render - login +const AuthLogin = Loadable(lazy(() => import('pages/authentication/Login'))); +const AuthRegister = Loadable(lazy(() => import('pages/authentication/Register'))); +const ErrorPage = Loadable(lazy(() => import('pages/extra-pages/ErrorPage'))); + +// ==============================|| AUTH ROUTING ||============================== // + +const LoginRoutes = { + path: '/', + element: , + children: [ + { + path: 'login', + element: + }, + { + path: 'register', + element: + }, + { + path: 'error', + element: + } + ] +}; + +export default LoginRoutes; diff --git a/src/routes/MainRoutes.js b/src/routes/MainRoutes.js new file mode 100644 index 0000000..7820b56 --- /dev/null +++ b/src/routes/MainRoutes.js @@ -0,0 +1,89 @@ +import {lazy, useContext} from 'react'; + +// project import +import Loadable from 'components/Loadable'; +import MainLayout from 'layout/MainLayout'; +import AbilityContext from "../components/AbilityProvider"; +import {handleRouteAbility} from "../utils/CommonFunction"; +import {Navigate} from "react-router"; + +// render - dashboard +//const DashboardDefault = Loadable(lazy(() => import('pages/dashboard'))); +const LIONERDashboard = Loadable(lazy(() => import('pages/lionerdashboard'))); +const ReminderPage = Loadable(lazy(() => import('pages/lionerReminderPage'))); +const TemplateSearchPage = Loadable(lazy(() => import('pages/lionerSearchPanel'))); +const TemplateMaintainPage = Loadable(lazy(() => import('pages/lionerMaintainSearchTemplatePage'))); + +// render - sample page +//const SamplePage = Loadable(lazy(() => import('pages/extra-pages/SamplePage'))); + +// render - utilities +// const Typography = Loadable(lazy(() => import('pages/components-overview/Typography'))); +// const Color = Loadable(lazy(() => import('pages/components-overview/Color'))); +// const Shadow = Loadable(lazy(() => import('pages/components-overview/Shadow'))); +// const AntIcons = Loadable(lazy(() => import('pages/components-overview/AntIcons'))); + +// ==============================|| MAIN ROUTING ||============================== // + +const MainRoutes = () => { + const ability = useContext(AbilityContext); + + return { + path: '/', + element: , + children: [ + { + path: '/', + element: ( + handleRouteAbility( + ability.can('VIEW', 'DASHBOARD'), + , + + ) + ), + }, + { + path: '/lionerDashboard', + element: ( + handleRouteAbility( + ability.can('VIEW', 'DASHBOARD'), + , + + ) + ), + }, + // { + // path: '/reminder', + // element: ( + // handleRouteAbility( + // ability.can('VIEW', 'REMINDER'), + // , + // + // ) + // ), + // }, + // { + // path: '/template', + // element: ( + // handleRouteAbility( + // ability.can('MAINTAIN', 'SEARCH_TEMPLATE'), + // , + // + // ) + // ), + // }, + // { + // path: '/template/maintain/:id', + // element: ( + // handleRouteAbility( + // ability.can('MAINTAIN', 'SEARCH_TEMPLATE'), + // , + // + // ) + // ), + // }, + ] + }; +} + +export default MainRoutes; diff --git a/src/routes/SettingRoutes.js b/src/routes/SettingRoutes.js new file mode 100644 index 0000000..cefa052 --- /dev/null +++ b/src/routes/SettingRoutes.js @@ -0,0 +1,205 @@ +import {lazy, useContext} from 'react'; + +// project import +import Loadable from 'components/Loadable'; +import MainLayout from "../layout/MainLayout"; +import AbilityContext from "../components/AbilityProvider"; +import {handleRouteAbility} from "../utils/CommonFunction"; +import {Navigate} from "react-router"; + +// render - login +const SettingPage = Loadable(lazy(() => import('pages/lionerSettingPage'))); +const LogoutPage = Loadable(lazy(() => import('pages/extra-pages/LogoutPage'))); +const PasswordPolicyPage = Loadable(lazy(()=> import('pages/lionerPasswordPolicyPage'))) +const UserSearchPage = Loadable(lazy(()=>import ('pages/lionerUserSearchPage'))); +const CategoryPage = Loadable(lazy(()=>import ('pages/lionerCategoryPage'))); +const UserMaintainPage = Loadable(lazy(() => import('pages/lionerUserDetailPage'))); +const UserGroupSearchPage = Loadable(lazy(() => import('pages/lionerUserGroupSearchPage'))); +const UserGroupDetailPage = Loadable(lazy(() => import('pages/lionerUserGroupDetailPage'))); +const DivisionSearchPage = Loadable(lazy(() => import('pages/lionerDivisionSearch'))); +const DivisionEditPage = Loadable(lazy(() => import('pages/lionerDivisionEdit'))); +const PromotionChannelPage = Loadable(lazy(() => import('pages/lionerPromotionChannelPage'))); +const TagPage = Loadable(lazy(() => import('pages/lionerTagPage'))); +const AuditLogPage = Loadable(lazy(() => import('pages/lionerAuditTrailPage'))); +const LoginLogPage = Loadable(lazy(() => import('pages/lionerLoginLog'))); +const EmailConfigPage = Loadable(lazy(() => import('pages/lionerEmailConfig'))); +const GenerateReminderPage = Loadable(lazy(() => import('pages/lionerManualButtonPage'))); +const ClientDepartmentPage = Loadable(lazy(() => import('pages/lionerClientDepartmentPage'))); +// ==============================|| AUTH ROUTING ||============================== // + +const SettingRoutes = () => { + const ability = useContext(AbilityContext); + + return { + path: '/', + element: , + children: [ + { + path: 'category', + element: ( + handleRouteAbility( + ability.can('MAINTAIN', 'CATEGORY'), + , + + ) + ), + }, + { + path: 'tag', + element:( + handleRouteAbility( + ability.can('MAINTAIN', 'TAG'), + , + + ) + ), + }, + { + path: 'promotionChannel', + element: ( + handleRouteAbility( + ability.can('MAINTAIN', 'PROMOTION_CHANNEL'), + , + + ) + ), + }, + { + path: 'clientDepartment', + element: ( + handleRouteAbility( + ability.can('MAINTAIN', 'CLIENT_DEPARTMENT'), + , + + ) + ), + }, + { + path: 'division', + element: ( + handleRouteAbility( + ability.can('MAINTAIN', 'DIVISION'), + , + + ) + ), + }, + { + path: 'division/:id', + element:( + handleRouteAbility( + ability.can('MAINTAIN', 'DIVISION'), + , + + ) + ), + }, + { + path: 'usergroupSearchview', + element: ( + handleRouteAbility( + ability.can('MAINTAIN', 'USER_GROUP'), + , + + ) + ), + }, + { + path: 'userGroup/:id', + element:( + handleRouteAbility( + ability.can('MAINTAIN', 'USER_GROUP'), + , + + ) + ), + }, + { + path: 'user/:id', + element: ( + handleRouteAbility( + ability.can('MAINTAIN', 'USER'), + , + + ) + ), + }, + { + path: 'userSearchview', + element:( + handleRouteAbility( + ability.can('MAINTAIN', 'USER'), + , + + ) + ), + }, + { + path: 'setting', + element: ( + handleRouteAbility( + ability.can('MANAGE', 'SYSTEM_CONFIGURATION'), + , + + ) + ), + }, + { + path: 'auditLog', + element:( + handleRouteAbility( + ability.can('VIEW', 'AUDIT_LOG'), + , + + ) + ), + }, + { + path: 'loginLog', + element: ( + handleRouteAbility( + ability.can('VIEW', 'LOGIN_LOG'), + , + + ) + ), + }, + { + path: 'passwordpolicy', + element: ( + handleRouteAbility( + ability.can('MANAGE', 'PASSWORD_POLICY'), + , + + ) + ), + }, + { + path: 'emailConfig', + element: ( + handleRouteAbility( + ability.can('MANAGE', 'SYSTEM_CONFIGURATION'), + , + + ) + ), + }, + { + path: 'generateReminder', + element: ( + handleRouteAbility( + ability.can('MANAGE', 'SYSTEM_CONFIGURATION'), + , + + ) + ), + }, + { + path: 'logout', + element: + } + ] + } +}; + +export default SettingRoutes; diff --git a/src/routes/index.js b/src/routes/index.js new file mode 100644 index 0000000..5ef392d --- /dev/null +++ b/src/routes/index.js @@ -0,0 +1,49 @@ +// project import +import LoginRoutes from './LoginRoutes' +import MainRoutes from './MainRoutes' +import {useLocation, useRoutes} from 'react-router-dom' +import {isUserLoggedIn} from "utils/Utils"; +import {Navigate} from "react-router"; +import SettingRoutes from "./SettingRoutes"; +import AwardRoutes from "./AwardRoutes"; +import ClientRoutes from "./ClientRoutes"; +import {useContext, useEffect} from "react"; +import LocaleContext from "../components/I18nProvider"; +import AppreciationRoutes from "./AppreciationRoute"; +// ==============================|| ROUTING RENDER ||============================== // + +export default function ThemeRoutes() { + const location = useLocation(); + const { setIsAdvanceDisplay } = useContext(LocaleContext); + + useEffect(() => { + if(location && !isUserLoggedIn()){ + if(location.pathname !== "/" && location.pathname !== "/login"){ + localStorage.setItem('lastVisitedPath', location.pathname); + } + } + + if( + !location.pathname.includes("/appreciation") + ){ + setIsAdvanceDisplay(true); + } + else{ + setIsAdvanceDisplay(false); + } + }, [location]); + + return useRoutes([ + { + path: '', + element: isUserLoggedIn() ? + : + }, + LoginRoutes, + MainRoutes(), + AwardRoutes(), + ClientRoutes(), + AppreciationRoutes(), + SettingRoutes() + ]); +} diff --git a/src/setupTests.js b/src/setupTests.js new file mode 100644 index 0000000..8f2609b --- /dev/null +++ b/src/setupTests.js @@ -0,0 +1,5 @@ +// jest-dom adds custom jest matchers for asserting on DOM nodes. +// allows you to do things like: +// expect(element).toHaveTextContent(/react/i) +// learn more: https://github.com/testing-library/jest-dom +import '@testing-library/jest-dom'; diff --git a/src/store/index.js b/src/store/index.js new file mode 100644 index 0000000..e2a4638 --- /dev/null +++ b/src/store/index.js @@ -0,0 +1,15 @@ +// third-party +import { configureStore } from '@reduxjs/toolkit'; + +// project import +import reducers from './reducers'; + +// ==============================|| REDUX TOOLKIT - MAIN STORE ||============================== // + +const store = configureStore({ + reducer: reducers +}); + +const { dispatch } = store; + +export { store, dispatch }; diff --git a/src/store/reducers/actions.js b/src/store/reducers/actions.js new file mode 100644 index 0000000..d5a0eb8 --- /dev/null +++ b/src/store/reducers/actions.js @@ -0,0 +1,4 @@ +// action - account reducer +export const LOGIN = '@auth/LOGIN'; +export const LOGOUT = '@auth/LOGOUT'; +export const REGISTER = '@auth/REGISTER'; diff --git a/src/store/reducers/index.js b/src/store/reducers/index.js new file mode 100644 index 0000000..e5c3261 --- /dev/null +++ b/src/store/reducers/index.js @@ -0,0 +1,11 @@ +// third-party +import { combineReducers } from 'redux'; + +// project import +import menu from './menu'; + +// ==============================|| COMBINE REDUCERS ||============================== // + +const reducers = combineReducers({ menu }); + +export default reducers; diff --git a/src/store/reducers/menu.js b/src/store/reducers/menu.js new file mode 100644 index 0000000..314815d --- /dev/null +++ b/src/store/reducers/menu.js @@ -0,0 +1,39 @@ +// types +import { createSlice } from '@reduxjs/toolkit'; + +// initial state +const initialState = { + openItem: ['dashboard'], + defaultId: 'dashboard', + openComponent: 'buttons', + drawerOpen: false, + componentDrawerOpen: true +}; + +// ==============================|| SLICE - MENU ||============================== // + +const menu = createSlice({ + name: 'menu', + initialState, + reducers: { + activeItem(state, action) { + state.openItem = action.payload.openItem; + }, + + activeComponent(state, action) { + state.openComponent = action.payload.openComponent; + }, + + openDrawer(state, action) { + state.drawerOpen = action.payload.drawerOpen; + }, + + openComponentDrawer(state, action) { + state.componentDrawerOpen = action.payload.componentDrawerOpen; + } + } +}); + +export default menu.reducer; + +export const { activeItem, activeComponent, openDrawer, openComponentDrawer } = menu.actions; diff --git a/src/themes/colorConst.js b/src/themes/colorConst.js new file mode 100644 index 0000000..11941dc --- /dev/null +++ b/src/themes/colorConst.js @@ -0,0 +1,290 @@ +import { createTheme } from "@mui/material"; + +export const chartColor = [ + '#CB4047', '#ED3A41', '#F47B50', '#FBA647', + '#FDB64C', '#CCBB32', '#9ACC59', '#57B962', + '#1E83C5', '#7C4A9D' +]; + +export const chartSingleColor = [ + '#f2969a', '#fc9599', '#faa789', '#f7ae94', + '#ffd491', '#ede5a1', '#d1f5a2', '#9de0a4', + '#a2d4f5', '#b685d6' +]; + +export const rankColor = [ + '#FFD700', '#C0C0C0', '#CD853F', '#57B962', '#57B962', + '#57B962', '#57B962', '#57B962', '#57B962', '#57B962' +]; + +export const piechartColor1 = [ + '#E84A3E', '#F2883C', '#FDCD4D', '#CE478A', '#B63D2A', + '#6A8B9E', '#60667E', '#58865F', '#2F763E', '#7D80B5', +]; + +export const piechartColor2 = [ + '#6A8B9E', '#60667E', '#58865F', '#2F763E', '#7D80B5', + '#E84A3E', '#F2883C', '#FDCD4D', '#CE478A', '#B63D2A', +]; + +export const cardBorderColor = [ + '#efb142', '#4bb641', '#448df2', '#e03c04' +]; + +export const chartLineColor = [ + '#FFFFFF', '#D9D9D9' +]; + +export const GENERAL_GREEN_COLOR = '#57B962'; + +export const GENERAL_RED_COLOR = '#e03c04'; + +export const TABLE_HEADER_TEXT_COLOR = "#3367D1"; + +export const GENERAL_INFO_COLOR = '#448df2'; + +export const GENERAL_SETTING_COLOR = '#666666'; + +export const GENERAL_TABLE_BOARDER_COLOR = '#F0F0F0'; + +export const GENERAL_BORDER_COLOR ='#e6ebf1'; + +export const GENERAL_TEXT_COLOR ='#262626'; + +export const LIONER_BUTTON_THEME = createTheme({ + palette: { + create: { + main: '#57B962', + // light: will be calculated from palette.primary.main, + // dark: will be calculated from palette.primary.main, + // contrastText: will be calculated to contrast with palette.primary.main + contrastText: '#FFFFFF', + }, + delete: { + main: '#E03C04', + contrastText: '#FFFFFF', + + }, + cancel: { + main: '#999999', + contrastText: '#FFFFFF', + + }, + save:{ + main: '#448DF2', + contrastText: '#FFFFFF', + }, + export:{ + main: '#8C52FF', + contrastText: '#FFFFFF', + }, + saveAs:{ + main: '#FFBD59', + contrastText: '#FFFFFF', + }, + edit:{ + main: '#F3AF2B', + contrastText: '#FFFFFF', + }, + exportExcel:{ + main: '#6A8B9E', + contrastText: '#FFFFFF', + } + }, + components: { + MuiDataGrid: { + styleOverrides: { + actionsCell: { + '& .MuiDataGrid-actionsContainer .MuiIconButton-root': { + fontSize: '80px', // Set the desired icon size here + }, + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + fontSize: '1.0rem', + height: '40px', + minWidth: '40vw', // Default width for xs screen sizes + '@media (min-width: 600px)': { // sm breakpoint + minWidth: '40vw', + }, + '@media (min-width: 960px)': { // md breakpoint + minWidth: '15vw', + }, + '@media (min-width: 1280px)': { // lg breakpoint + minWidth: '7vw', + }, + textTransform: "none", + alignItems: 'center' + }, + }, + }, + } +}); + +export const LIONER_LONG_BUTTON_THEME = createTheme({ + palette: { + create: { + main: '#57B962', + // light: will be calculated from palette.primary.main, + // dark: will be calculated from palette.primary.main, + // contrastText: will be calculated to contrast with palette.primary.main + contrastText: '#FFFFFF', + }, + delete: { + main: '#E03C04', + contrastText: '#FFFFFF', + + }, + cancel: { + main: '#999999', + contrastText: '#FFFFFF', + + }, + save:{ + main: '#448DF2', + contrastText: '#FFFFFF', + }, + export:{ + main: '#8C52FF', + contrastText: '#FFFFFF', + }, + saveAs:{ + main: '#FFBD59', + contrastText: '#FFFFFF', + }, + edit:{ + main: '#F3AF2B', + contrastText: '#FFFFFF', + }, + exportExcel:{ + main: '#60667E', + contrastText: '#FFFFFF', + } + }, + components: { + MuiDataGrid: { + styleOverrides: { + actionsCell: { + '& .MuiDataGrid-actionsContainer .MuiIconButton-root': { + fontSize: '80px', // Set the desired icon size here + }, + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + fontSize: '1.0rem', + height: '40px', + minWidth: '40vw', // Default width for xs screen sizes + '@media (min-width: 600px)': { // sm breakpoint + minWidth: '30vw', + }, + '@media (min-width: 960px)': { // md breakpoint + minWidth: '25vw', + }, + '@media (min-width: 1280px)': { // lg breakpoint + minWidth: '14vw', + }, + textTransform: "none", + alignItems: 'center' + }, + }, + }, + } +}); + +export const LIONER_MEDIUM_BUTTON_THEME = createTheme({ + palette: { + create: { + main: '#57B962', + // light: will be calculated from palette.primary.main, + // dark: will be calculated from palette.primary.main, + // contrastText: will be calculated to contrast with palette.primary.main + contrastText: '#FFFFFF', + }, + delete: { + main: '#E03C04', + contrastText: '#FFFFFF', + + }, + cancel: { + main: '#999999', + contrastText: '#FFFFFF', + + }, + save:{ + main: '#448DF2', + contrastText: '#FFFFFF', + }, + export:{ + main: '#8C52FF', + contrastText: '#FFFFFF', + }, + saveAs:{ + main: '#FFBD59', + contrastText: '#FFFFFF', + }, + edit:{ + main: '#F3AF2B', + contrastText: '#FFFFFF', + }, + exportExcel:{ + main: '#60667E', + contrastText: '#FFFFFF', + } + }, + components: { + MuiDataGrid: { + styleOverrides: { + actionsCell: { + '& .MuiDataGrid-actionsContainer .MuiIconButton-root': { + fontSize: '80px', // Set the desired icon size here + }, + }, + }, + }, + MuiButton: { + styleOverrides: { + root: { + fontSize: '1.0rem', + height: '40px', + minWidth: '40vw', // Default width for xs screen sizes + '@media (min-width: 600px)': { // sm breakpoint + minWidth: '40vw', + }, + '@media (min-width: 960px)': { // md breakpoint + minWidth: '22vw', + }, + '@media (min-width: 1280px)': { // lg breakpoint + minWidth: '13vw', + }, + textTransform: "none", + alignItems: 'center' + }, + }, + }, + } +}); + + +export const formTheme = createTheme({ + components: { + MuiFormLabel: { + root: { // Name of the rule + color: "rgba(0, 0, 0, 1)", + }, + styleOverrides: { + asterisk: { + color: "#db3131", + "&$error": { + color: "#db3131", + }, + }, + }, + }, + }, +}); diff --git a/src/themes/index.js b/src/themes/index.js new file mode 100644 index 0000000..fc8ab03 --- /dev/null +++ b/src/themes/index.js @@ -0,0 +1,64 @@ +import PropTypes from 'prop-types'; +import { useMemo } from 'react'; + +// material-ui +import { CssBaseline, StyledEngineProvider } from '@mui/material'; +import { createTheme, ThemeProvider } from '@mui/material/styles'; + +// project import +import Palette from './palette'; +import Typography from './typography'; +import CustomShadows from './shadows'; +import componentsOverride from './overrides'; + +// ==============================|| DEFAULT THEME - MAIN ||============================== // + +export default function ThemeCustomization({ children }) { + const theme = Palette('light', 'default'); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const themeTypography = Typography(`'Public Sans', sans-serif`); + const themeCustomShadows = useMemo(() => CustomShadows(theme), [theme]); + + const themeOptions = useMemo( + () => ({ + breakpoints: { + values: { + xs: 0, + sm: 768, + md: 1024, + lg: 1266, + xl: 1536 + } + }, + direction: 'ltr', + mixins: { + toolbar: { + minHeight: 60, + paddingTop: 8, + paddingBottom: 8 + } + }, + palette: theme.palette, + customShadows: themeCustomShadows, + typography: themeTypography + }), + [theme, themeTypography, themeCustomShadows] + ); + + const themes = createTheme(themeOptions); + themes.components = componentsOverride(themes); + + return ( + + + + {children} + + + ); +} + +ThemeCustomization.propTypes = { + children: PropTypes.node +}; diff --git a/src/themes/overrides/Badge.js b/src/themes/overrides/Badge.js new file mode 100644 index 0000000..89a0078 --- /dev/null +++ b/src/themes/overrides/Badge.js @@ -0,0 +1,15 @@ +// ==============================|| OVERRIDES - BADGE ||============================== // + +export default function Badge(theme) { + return { + MuiBadge: { + styleOverrides: { + standard: { + minWidth: theme.spacing(2), + height: theme.spacing(2), + padding: theme.spacing(0.5) + } + } + } + }; +} diff --git a/src/themes/overrides/Button.js b/src/themes/overrides/Button.js new file mode 100644 index 0000000..e601b31 --- /dev/null +++ b/src/themes/overrides/Button.js @@ -0,0 +1,28 @@ +// ==============================|| OVERRIDES - BUTTON ||============================== // + +export default function Button(theme) { + const disabledStyle = { + '&.Mui-disabled': { + backgroundColor: theme.palette.grey[200] + } + }; + + return { + MuiButton: { + defaultProps: { + disableElevation: true + }, + styleOverrides: { + root: { + fontWeight: 400 + }, + contained: { + ...disabledStyle + }, + outlined: { + ...disabledStyle + } + } + } + }; +} diff --git a/src/themes/overrides/CardContent.js b/src/themes/overrides/CardContent.js new file mode 100644 index 0000000..4a1f515 --- /dev/null +++ b/src/themes/overrides/CardContent.js @@ -0,0 +1,16 @@ +// ==============================|| OVERRIDES - CARD CONTENT ||============================== // + +export default function CardContent() { + return { + MuiCardContent: { + styleOverrides: { + root: { + padding: 20, + '&:last-child': { + paddingBottom: 20 + } + } + } + } + }; +} diff --git a/src/themes/overrides/Checkbox.js b/src/themes/overrides/Checkbox.js new file mode 100644 index 0000000..0bf2a99 --- /dev/null +++ b/src/themes/overrides/Checkbox.js @@ -0,0 +1,13 @@ +// ==============================|| OVERRIDES - CHECKBOX ||============================== // + +export default function Checkbox(theme) { + return { + MuiCheckbox: { + styleOverrides: { + root: { + color: theme.palette.secondary[300] + } + } + } + }; +} diff --git a/src/themes/overrides/Chip.js b/src/themes/overrides/Chip.js new file mode 100644 index 0000000..b503b0f --- /dev/null +++ b/src/themes/overrides/Chip.js @@ -0,0 +1,40 @@ +// ==============================|| OVERRIDES - CHIP ||============================== // + +export default function Chip(theme) { + return { + MuiChip: { + styleOverrides: { + root: { + borderRadius: 4, + '&:active': { + boxShadow: 'none' + } + }, + sizeLarge: { + fontSize: '1rem', + height: 30 + }, + light: { + color: theme.palette.primary.main, + backgroundColor: theme.palette.primary.lighter, + borderColor: theme.palette.primary.light, + '&.MuiChip-lightError': { + color: theme.palette.error.main, + backgroundColor: theme.palette.error.lighter, + borderColor: theme.palette.error.light + }, + '&.MuiChip-lightSuccess': { + color: theme.palette.success.main, + backgroundColor: theme.palette.success.lighter, + borderColor: theme.palette.success.light + }, + '&.MuiChip-lightWarning': { + color: theme.palette.warning.main, + backgroundColor: theme.palette.warning.lighter, + borderColor: theme.palette.warning.light + } + } + } + } + }; +} diff --git a/src/themes/overrides/IconButton.js b/src/themes/overrides/IconButton.js new file mode 100644 index 0000000..a78af99 --- /dev/null +++ b/src/themes/overrides/IconButton.js @@ -0,0 +1,28 @@ +// ==============================|| OVERRIDES - ICON BUTTON ||============================== // + +export default function IconButton(theme) { + return { + MuiIconButton: { + styleOverrides: { + root: { + borderRadius: 4 + }, + sizeLarge: { + width: theme.spacing(5.5), + height: theme.spacing(5.5), + fontSize: '1.25rem' + }, + sizeMedium: { + width: theme.spacing(4.5), + height: theme.spacing(4.5), + fontSize: '1rem' + }, + sizeSmall: { + width: theme.spacing(3.75), + height: theme.spacing(3.75), + fontSize: '0.75rem' + } + } + } + }; +} diff --git a/src/themes/overrides/InputLabel.js b/src/themes/overrides/InputLabel.js new file mode 100644 index 0000000..7eec340 --- /dev/null +++ b/src/themes/overrides/InputLabel.js @@ -0,0 +1,25 @@ +// ==============================|| OVERRIDES - INPUT LABEL ||============================== // + +export default function InputLabel(theme) { + return { + MuiInputLabel: { + styleOverrides: { + root: { + color: theme.palette.grey[600] + }, + outlined: { + lineHeight: '0.8em', + '&.MuiInputLabel-sizeSmall': { + lineHeight: '1em' + }, + '&.MuiInputLabel-shrink': { + background: theme.palette.background.paper, + padding: '0 8px', + marginLeft: -6, + lineHeight: '1.4375em' + } + } + } + } + }; +} diff --git a/src/themes/overrides/LinearProgress.js b/src/themes/overrides/LinearProgress.js new file mode 100644 index 0000000..20cb67d --- /dev/null +++ b/src/themes/overrides/LinearProgress.js @@ -0,0 +1,17 @@ +// ==============================|| OVERRIDES - LINER PROGRESS ||============================== // + +export default function LinearProgress() { + return { + MuiLinearProgress: { + styleOverrides: { + root: { + height: 6, + borderRadius: 100 + }, + bar: { + borderRadius: 100 + } + } + } + }; +} diff --git a/src/themes/overrides/Link.js b/src/themes/overrides/Link.js new file mode 100644 index 0000000..fe7b409 --- /dev/null +++ b/src/themes/overrides/Link.js @@ -0,0 +1,11 @@ +// ==============================|| OVERRIDES - LINK ||============================== // + +export default function Link() { + return { + MuiLink: { + defaultProps: { + underline: 'hover' + } + } + }; +} diff --git a/src/themes/overrides/ListItemIcon.js b/src/themes/overrides/ListItemIcon.js new file mode 100644 index 0000000..225a6a1 --- /dev/null +++ b/src/themes/overrides/ListItemIcon.js @@ -0,0 +1,13 @@ +// ==============================|| OVERRIDES - LIST ITEM ICON ||============================== // + +export default function ListItemIcon() { + return { + MuiListItemIcon: { + styleOverrides: { + root: { + minWidth: 24 + } + } + } + }; +} diff --git a/src/themes/overrides/OutlinedInput.js b/src/themes/overrides/OutlinedInput.js new file mode 100644 index 0000000..c2fb839 --- /dev/null +++ b/src/themes/overrides/OutlinedInput.js @@ -0,0 +1,44 @@ +// material-ui +import { alpha } from '@mui/material/styles'; + +// ==============================|| OVERRIDES - OUTLINED INPUT ||============================== // + +export default function OutlinedInput(theme) { + return { + MuiOutlinedInput: { + styleOverrides: { + input: { + padding: '10.5px 14px 10.5px 12px' + }, + root: { + '&:hover .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.primary.light + }, + '&.Mui-focused': { + boxShadow: `0 0 0 2px ${alpha(theme.palette.primary.main, 0.2)}`, + '& .MuiOutlinedInput-notchedOutline': { + border: `1px solid ${theme.palette.primary.light}` + } + }, + '&.Mui-error': { + '&:hover .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.error.light + }, + '&.Mui-focused': { + boxShadow: `0 0 0 2px ${alpha(theme.palette.error.main, 0.2)}`, + '& .MuiOutlinedInput-notchedOutline': { + border: `1px solid ${theme.palette.error.light}` + } + } + } + }, + inputSizeSmall: { + padding: '7.5px 8px 7.5px 12px' + }, + inputMultiline: { + padding: 0 + } + } + } + }; +} diff --git a/src/themes/overrides/Tab.js b/src/themes/overrides/Tab.js new file mode 100644 index 0000000..2c41b14 --- /dev/null +++ b/src/themes/overrides/Tab.js @@ -0,0 +1,14 @@ +// ==============================|| OVERRIDES - TAB ||============================== // + +export default function Tab(theme) { + return { + MuiTab: { + styleOverrides: { + root: { + minHeight: 46, + color: theme.palette.text.primary + } + } + } + }; +} diff --git a/src/themes/overrides/TableCell.js b/src/themes/overrides/TableCell.js new file mode 100644 index 0000000..debe66c --- /dev/null +++ b/src/themes/overrides/TableCell.js @@ -0,0 +1,20 @@ +// ==============================|| OVERRIDES - TABLE CELL ||============================== // + +export default function TableCell(theme) { + return { + MuiTableCell: { + styleOverrides: { + root: { + fontSize: '0.875rem', + padding: 12, + borderColor: theme.palette.divider + }, + head: { + fontWeight: 600, + paddingTop: 20, + paddingBottom: 20 + } + } + } + }; +} diff --git a/src/themes/overrides/Tabs.js b/src/themes/overrides/Tabs.js new file mode 100644 index 0000000..661de7d --- /dev/null +++ b/src/themes/overrides/Tabs.js @@ -0,0 +1,13 @@ +// ==============================|| OVERRIDES - TABS ||============================== // + +export default function Tabs() { + return { + MuiTabs: { + styleOverrides: { + vertical: { + overflow: 'visible' + } + } + } + }; +} diff --git a/src/themes/overrides/Typography.js b/src/themes/overrides/Typography.js new file mode 100644 index 0000000..1bd78ad --- /dev/null +++ b/src/themes/overrides/Typography.js @@ -0,0 +1,13 @@ +// ==============================|| OVERRIDES - TYPOGRAPHY ||============================== // + +export default function Typography() { + return { + MuiTypography: { + styleOverrides: { + gutterBottom: { + marginBottom: 12 + } + } + } + }; +} diff --git a/src/themes/overrides/index.js b/src/themes/overrides/index.js new file mode 100644 index 0000000..3db4b76 --- /dev/null +++ b/src/themes/overrides/index.js @@ -0,0 +1,41 @@ +// third-party +import { merge } from 'lodash'; + +// project import +import Badge from './Badge'; +import Button from './Button'; +import CardContent from './CardContent'; +import Checkbox from './Checkbox'; +import Chip from './Chip'; +import IconButton from './IconButton'; +import InputLabel from './InputLabel'; +import LinearProgress from './LinearProgress'; +import Link from './Link'; +import ListItemIcon from './ListItemIcon'; +import OutlinedInput from './OutlinedInput'; +import Tab from './Tab'; +import TableCell from './TableCell'; +import Tabs from './Tabs'; +import Typography from './Typography'; + +// ==============================|| OVERRIDES - MAIN ||============================== // + +export default function ComponentsOverrides(theme) { + return merge( + Button(theme), + Badge(theme), + CardContent(), + Checkbox(theme), + Chip(theme), + IconButton(theme), + InputLabel(theme), + LinearProgress(), + Link(), + ListItemIcon(), + OutlinedInput(theme), + Tab(theme), + TableCell(theme), + Tabs(), + Typography() + ); +} diff --git a/src/themes/page-misc.scss b/src/themes/page-misc.scss new file mode 100644 index 0000000..ceb2416 --- /dev/null +++ b/src/themes/page-misc.scss @@ -0,0 +1,37 @@ +// ================================================================================================ +// File Name: page-misc.scss +// Description: Coming Soon pages custom scss +// ---------------------------------------------------------------------------------------------- +// Item Name: Vuexy - Vuejs, HTML & Laravel Admin Dashboard Template +// Author: PIXINVENT +// Author URL: http://www.themeforest.net/user/pixinvent +// ================================================================================================ + +$misc-inner-max-width: 750px; + +.misc-wrapper { + display: flex; + flex-basis: 100%; + min-height: 100vh; + width: 100%; + align-items: center; + justify-content: center; + + .misc-inner { + position: relative; + max-width: $misc-inner-max-width; + } + + .brand-logo { + display: flex; + justify-content: center; + position: absolute; + top: 2rem; + left: 2rem; + margin: 0; + + .brand-text { + font-weight: 600; + } + } +} diff --git a/src/themes/palette.js b/src/themes/palette.js new file mode 100644 index 0000000..d20075f --- /dev/null +++ b/src/themes/palette.js @@ -0,0 +1,60 @@ +// material-ui +import { createTheme } from '@mui/material/styles'; + +// third-party +import { presetPalettes } from '@ant-design/colors'; + +// project import +import ThemeOption from './theme'; + +// ==============================|| DEFAULT THEME - PALETTE ||============================== // + +const Palette = (mode) => { + const colors = presetPalettes; + + const greyPrimary = [ + '#ffffff', + '#fafafa', + '#f5f5f5', + '#f0f0f0', + '#d9d9d9', + '#bfbfbf', + '#8c8c8c', + '#595959', + '#262626', + '#141414', + '#000000' + ]; + const greyAscent = ['#fafafa', '#bfbfbf', '#434343', '#1f1f1f']; + const greyConstant = ['#fafafb', '#e6ebf1']; + + colors.grey = [...greyPrimary, ...greyAscent, ...greyConstant]; + + const paletteColor = ThemeOption(colors); + + return createTheme({ + palette: { + mode, + common: { + black: '#000', + white: '#fff' + }, + ...paletteColor, + text: { + primary: paletteColor.grey[700], + secondary: paletteColor.grey[500], + disabled: paletteColor.grey[400] + }, + action: { + disabled: paletteColor.grey[300] + }, + divider: paletteColor.grey[200], + background: { + paper: paletteColor.grey[0], + default: paletteColor.grey.A50 + } + } + }); +}; + +export default Palette; diff --git a/src/themes/shadows.js b/src/themes/shadows.js new file mode 100644 index 0000000..9c56b9e --- /dev/null +++ b/src/themes/shadows.js @@ -0,0 +1,13 @@ +// material-ui +import { alpha } from '@mui/material/styles'; + +// ==============================|| DEFAULT THEME - CUSTOM SHADOWS ||============================== // + +const CustomShadows = (theme) => ({ + button: `0 2px #0000000b`, + text: `0 -1px 0 rgb(0 0 0 / 12%)`, + z1: `0px 2px 8px ${alpha(theme.palette.grey[900], 0.15)}` + // only available in paid version +}); + +export default CustomShadows; diff --git a/src/themes/theme/index.js b/src/themes/theme/index.js new file mode 100644 index 0000000..670cfef --- /dev/null +++ b/src/themes/theme/index.js @@ -0,0 +1,92 @@ +// ==============================|| PRESET THEME - THEME SELECTOR ||============================== // + +const Theme = (colors) => { + const { blue, red, gold, cyan, green, grey } = colors; + const greyColors = { + 0: grey[0], + 50: grey[1], + 100: grey[2], + 200: grey[3], + 300: grey[4], + 400: grey[5], + 500: grey[6], + 600: grey[7], + 700: grey[8], + 800: grey[9], + 900: grey[10], + A50: grey[15], + A100: grey[11], + A200: grey[12], + A400: grey[13], + A700: grey[14], + A800: grey[16] + }; + const contrastText = '#fff'; + + return { + primary: { + lighter: blue[0], + 100: blue[1], + 200: blue[2], + light: blue[3], + 400: blue[4], + main: blue[5], + dark: blue[6], + 700: blue[7], + darker: blue[8], + 900: blue[9], + contrastText + }, + secondary: { + lighter: greyColors[100], + 100: greyColors[100], + 200: greyColors[200], + light: greyColors[300], + 400: greyColors[400], + main: greyColors[500], + 600: greyColors[600], + dark: greyColors[700], + 800: greyColors[800], + darker: greyColors[900], + A100: greyColors[0], + A200: greyColors.A400, + A300: greyColors.A700, + contrastText: greyColors[0] + }, + error: { + lighter: red[0], + light: red[2], + main: red[4], + dark: red[7], + darker: red[9], + contrastText + }, + warning: { + lighter: gold[0], + light: gold[3], + main: gold[5], + dark: gold[7], + darker: gold[9], + contrastText: greyColors[100] + }, + info: { + lighter: cyan[0], + light: cyan[3], + main: cyan[5], + dark: cyan[7], + darker: cyan[9], + contrastText + }, + success: { + lighter: green[0], + light: green[3], + main: green[5], + dark: green[7], + darker: green[9], + contrastText + }, + grey: greyColors + }; +}; + +export default Theme; diff --git a/src/themes/themeConst.js b/src/themes/themeConst.js new file mode 100644 index 0000000..ac94415 --- /dev/null +++ b/src/themes/themeConst.js @@ -0,0 +1,408 @@ +import {createTheme} from "@mui/material"; +import Palette from "./palette"; +import Typography from "./typography"; +import {alpha} from "@mui/material/styles"; +import {GENERAL_TABLE_BOARDER_COLOR, TABLE_HEADER_TEXT_COLOR} from "./colorConst"; +const FONT_SIZE = '1.1rem'; +const TABLE_FONT_SIZE = '1.0rem'; +const HELPER_FONT_SIZE = '0.9rem'; +const ROW_HEIGHT = '42.5px'; +const theme = Palette('light', 'default'); +export const CARD_MAX_WIDTH = "98%" + +const themeTypography = Typography( + `'Public Sans', sans-serif`, +); + +export const LIONER_FORM_THEME = createTheme({ + palette: theme.palette, + typography: themeTypography, + components: { + MuiImage: { + root: { + position: 'relative', + '&:hover': { + '&::after': { + content: '""', + position: 'absolute', + top: 0, + left: 0, + width: '100%', + height: '100%', + background: 'rgba(0, 0, 0, 0.5)', + opacity: 0, + transition: 'opacity 0.3s ease', + }, + '&:hover::after': { + opacity: 1, + }, + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: { + marginLeft: '-1px', + //marginRight: '0px', + }, + }, + }, + MuiFormHelperText: { + styleOverrides: { + root: { + fontSize: HELPER_FONT_SIZE, // Adjust the font size as needed + }, + }, + }, + MuiPickersBasePicker: { + styleOverrides: { + toolbar: { + height: ROW_HEIGHT // Set the desired height value here + } + } + }, + MuiPickersDay: { + root:{ + height: ROW_HEIGHT, + }, + day: { + padding: '20px', // Set the desired padding value here + }, + }, + MuiButtonBase:{ + styleOverrides:{ + root:{ + '&.MuiChip-root.Mui-disabled':{ + opacity: 0.75, + }, + '&.MuiButton-root':{ + fontSize: FONT_SIZE + }, + } + } + }, + MuiIconButton: { + styleOverrides: { + root: { + marginRight: '-1px', + borderRadius: 3 + }, + marginRight: '-3px', + sizeLarge: { + width: theme.spacing(5.5), + height: theme.spacing(5.5), + fontSize: '1.25rem' + }, + sizeMedium: { + width: theme.spacing(4.5), + height: theme.spacing(4.5), + fontSize: '1rem' + }, + sizeSmall: { + width: theme.spacing(3.75), + height: theme.spacing(3.75), + fontSize: '0.75rem' + } + } + }, + MuiInputLabel: { + styleOverrides: { + root: { + color: 'rgba(0, 0, 0, 0.8)', + fontSize: '1rem', + }, + }, + }, + MuiChip:{ + styleOverrides: { + label: { + lineHeight: 'normal', + whiteSpace: "inherit", + paddingTop: '2px', + paddingBottom: '2px' + }, + }, + }, + MuiAutocomplete: { + styleOverrides: { + tag: { + height: 'auto', + whiteSpace: 'normal', + }, + inputRoot: { + maxHeight: '30vh', // Set the desired height value here + }, + root: { + minHeight: ROW_HEIGHT, + '&:MuiAutocomplete-input': { + display: 'flex', + alignItems: 'center', + }, + }, + popupIndicator: { + height: '30px', + width: '30px', + }, + endAdornment: { + root: { + height: '30px', + width: '30px', + marginRight: '-2px', + marginBottom: '3px', + borderRadius: 3 + }, + //top: 'calc(50% - 18px)', + top: 'auto', + marginRight: '-3px', + sizeLarge: { + width: theme.spacing(5.5), + height: theme.spacing(5.5), + fontSize: '1.25rem' + }, + sizeMedium: { + width: theme.spacing(4.5), + height: theme.spacing(4.5), + fontSize: '1rem' + }, + sizeSmall: { + width: theme.spacing(3.75), + height: theme.spacing(3.75), + fontSize: '0.75rem' + } + }, + }, + }, + MuiInputBase: { + root: { + padding: '2px', // Set the desired padding value here + }, + }, + MuiOutlinedInput: { + styleOverrides: { + input: { + //padding: '10.5px 14px 10.5px 12px', + '&.MuiOutlinedInput-input.Mui-disabled': { + WebkitTextFillColor: '#888888', + }, + }, + root: { + '&:hover .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.primary.light + }, + '&.Mui-focused': { + boxShadow: `0 0 0 2px ${alpha(theme.palette.primary.main, 0.2)}`, + '& .MuiOutlinedInput-notchedOutline': { + border: `1px solid ${theme.palette.primary.light}` + } + }, + '&.Mui-error': { + '&:hover .MuiOutlinedInput-notchedOutline': { + borderColor: theme.palette.error.light + }, + '&.Mui-focused': { + boxShadow: `0 0 0 2px ${alpha(theme.palette.error.main, 0.2)}`, + '& .MuiOutlinedInput-notchedOutline': { + border: `1px solid ${theme.palette.error.light}` + } + } + } + }, + inputSizeSmall: { + padding: '7.5px 8px 7.5px 12px' + }, + inputMultiline: { + root:{ + minHeight:'42.5px', + maxHeight: '50vh' + }, + padding: '7.5px 8px 7.5px 12px' + + } + } + }, + MuiTextField: { + styleOverrides: { + root: { + '& .MuiInputBase-input': { + fontSize: FONT_SIZE, + display: 'flex', + alignItems: 'center', + }, + '& .MuiInputBase-root': { + //height: '40px', + minHeight: '42.5px', + maxHeight: ROW_HEIGHT, + boxSizing: 'border-box', // Ensure the background shape follows the size of the TextField + padding: '1px', // Adjust the padding as needed + }, + '& .MuiInputBase-input:disabled': { + color: 'rgba(0, 0, 0, 0.8)', + //backgroundColor: '#777777', // Set background color to #777777 for disabled state + //color: '#010101', // Set text color to #111111 for disabled state + }, + '& .Mui-focused.MuiAutocomplete-input': { + color: "red" + }, + }, + }, + }, + MuiTableCell: { + styleOverrides: { + root: { + fontSize: TABLE_FONT_SIZE, + borderColor: theme.palette.divider + }, + head: { + fontWeight: 600, + paddingTop: 3, + paddingBottom: 3 + } + } + }, + MuiTablePagination:{ + styleOverrides:{ + root:{ + fontSize: HELPER_FONT_SIZE, + }, + selectLabel:{ + fontSize: HELPER_FONT_SIZE, + }, + displayedRows:{ + fontSize: HELPER_FONT_SIZE, + } + } + }, + MuiDataGrid: { + styleOverrides: { + '&>.MuiDataGrid-main': { + '&>.MuiDataGrid-columnHeaders': { + borderBottom: 'none', + fontWeight: '900', + }, + }, + root: { + fontSize: TABLE_FONT_SIZE, // Set the font size + maxWidth: '98vw', + border: 'none !important', + '& .MuiDataGrid-cell': { + whiteSpace: 'normal', // Enable auto-wrapping + wordBreak: 'break-word', // Break words if needed + }, + }, + footerContainer:{ + maxHeight: "40px", + minHeight: "40px", + }, + editInputCell:{ + fontSize: TABLE_FONT_SIZE, + }, + cell: { + fontSize: TABLE_FONT_SIZE, + borderBottom: 'none', + '& .MuiDataGrid-cellValue': { + whiteSpace: 'normal', // Enable auto-wrapping + wordBreak: 'break-word', // Break words if needed + }, + }, + columnHeaderCell: { + '&:focus': { + outline: 'none', // Remove the outline on focus + }, + }, + columnHeaders: { + borderBottom: '1px solid ' + GENERAL_TABLE_BOARDER_COLOR + ' !important', + }, + columnHeader: { + color: TABLE_HEADER_TEXT_COLOR, + fontSize: TABLE_FONT_SIZE, + + '&:focus': { + outline: 'none', // Remove the outline on focus + }, + '&:not(:last-child)': { + borderRight: 'none', // Remove the border between column headers + }, + fontWeight: '900', + }, + row: { + borderBottom: 'none', + }, + pagination: { + borderTop: 'none !important', + fontSize: TABLE_FONT_SIZE, + "& .MuiTablePagination-actions": { + border: 'none', // Remove the border around the pagination actions + } + }, + '& .MuiPaginationItem-root': { + borderRadius: 0, + }, + }, + }, + MuiCssBaseline: { + styleOverrides: { + '.MuiDataGrid-root .MuiDataGrid-row': { + borderBottom: 'none', // Disable the border under each record + }, + '.MuiDataGrid-root .MuiDataGrid-columnHeader': { + borderBottom: 'none', // Disable the border near the column headers + }, + }, + }, + MuiTab: { + styleOverrides: { + root: { + fontSize: TABLE_FONT_SIZE, + minHeight: 46, + color: theme.palette.text.primary + } + } + }, + MuiTabs: { + styleOverrides: { + vertical: { + overflow: 'visible' + } + } + } + }, +}); + +export const LIONER_NAV_THEME = createTheme({ + typography: { + fontSize: 14, + }, +}); + +export const LIONER_LOGIN_THEME = createTheme({ + components: { + MuiFormHelperText: { + styleOverrides: { + root: { + fontSize: HELPER_FONT_SIZE, // Adjust the font size as needed + }, + }, + }, + MuiInputLabel: { + styleOverrides: { + root: { + fontSize: '1.15rem', + }, + }, + }, + MuiTextField: { + styleOverrides: { + root: { + '& .MuiInputBase-input': { + fontSize: '1.3rem', + display: 'flex', + alignItems: 'flex-end', + }, + '& .MuiInputBase-root': { + height: '50px', + }, + }, + }, + }, + }, +}); \ No newline at end of file diff --git a/src/themes/typography.js b/src/themes/typography.js new file mode 100644 index 0000000..6f1499a --- /dev/null +++ b/src/themes/typography.js @@ -0,0 +1,94 @@ +// ==============================|| DEFAULT THEME - TYPOGRAPHY ||============================== // + +const Typography = (fontFamily) => ({ + htmlFontSize: 16, + fontFamily, + fontWeightLight: 300, + fontWeightRegular: 400, + fontWeightMedium: 500, + fontWeightBold: 600, + h1: { + fontWeight: 600, + fontSize: '2.375rem', + lineHeight: 1.21 + }, + h2: { + fontWeight: 600, + fontSize: '1.875rem', + lineHeight: 1.27 + }, + h3: { + fontWeight: 600, + fontSize: '1.5rem', + lineHeight: 1.33 + }, + h4: { + fontWeight: 600, + fontSize: '1.25rem', + lineHeight: 1.4 + }, + lionerSize: { + fontWeight: 400, + fontSize: '1.1rem', + lineHeight: 1.5 + }, + lionerDetailSize: { + fontWeight: 400, + fontSize: '1.0rem', + lineHeight: 1.5 + }, + lionerSubLabel: { + fontSize: '1rem', + lineHeight: 1.2, + }, + lionerLabel: { + fontSize: '1rem', + lineHeight: 1.5 + }, + lionerBold: { + fontWeight: 600, + fontSize: '1.1rem', + lineHeight: 1.5 + }, + h5: { + fontWeight: 600, + fontSize: '1rem', + lineHeight: 1.5 + }, + h6: { + fontWeight: 400, + fontSize: '0.875rem', + lineHeight: 1.57 + }, + caption: { + fontWeight: 400, + fontSize: '0.75rem', + lineHeight: 1.66 + }, + body1: { + fontSize: '0.875rem', + lineHeight: 1.57 + }, + body2: { + fontSize: '0.75rem', + lineHeight: 1.66 + }, + subtitle1: { + fontSize: '0.875rem', + fontWeight: 600, + lineHeight: 1.57 + }, + subtitle2: { + fontSize: '0.75rem', + fontWeight: 500, + lineHeight: 1.66 + }, + overline: { + lineHeight: 1.66 + }, + button: { + textTransform: 'capitalize' + } +}); + +export default Typography; diff --git a/src/translations/en.json b/src/translations/en.json new file mode 100644 index 0000000..491678e --- /dev/null +++ b/src/translations/en.json @@ -0,0 +1,9 @@ +{ + "en": "English", + "zh-HK": "Traditional Chinese", + "zh-CN": "Simplified Chinese", + + "Dashboard": "Dashboard", + + "event": "Event" +} \ No newline at end of file diff --git a/src/translations/zh-CN.json b/src/translations/zh-CN.json new file mode 100644 index 0000000..b308b83 --- /dev/null +++ b/src/translations/zh-CN.json @@ -0,0 +1,9 @@ +{ + "en": "英文", + "zh-HK": "繁体中文", + "zh-CN": "简体中文", + + "Dashboard": "仪表板", + + "event": "活动" +} \ No newline at end of file diff --git a/src/translations/zh-HK.json b/src/translations/zh-HK.json new file mode 100644 index 0000000..b21cade --- /dev/null +++ b/src/translations/zh-HK.json @@ -0,0 +1,9 @@ +{ + "en": "英文", + "zh-HK": "繁體中文", + "zh-CN": "簡體中文", + + "Dashboard": "儀表板", + + "event": "活動" +} \ No newline at end of file diff --git a/src/utils/ApiPathConst.js b/src/utils/ApiPathConst.js new file mode 100644 index 0000000..4322166 --- /dev/null +++ b/src/utils/ApiPathConst.js @@ -0,0 +1,138 @@ +import {SETTING_STRING_DICT} from "./SettingConst"; + +export const REFRESH_TOKEN = "/refresh-token" +export const LOGIN_PATH = "/login" +export const CHANGE_PASSWORD_PATH = "/user/change-password" +export const GET_GROUP_LIST_PATH = "/group" +export const GET_GROUP_COMBO_PATH = "/group/combo" +export const GET_GROUP_MEMBER_LIST_PATH = "/group/member" +export const UPDATE_GROUP_PATH = "/group/save" +export const GET_GROUP_AUTH_LIST = "/group/auth/combo" +export const GET_USER_PATH = "/user" +export const GET_USER_REMINDER_FLAG = "/user/getReminderFlag" +export const SET_USER_REMINDER_FLAG = "/user/setReminderFlag" +export const GET_USER_PASSWORD_DURATION = "/user/isPasswordExpired" +export const GET_AUTH_LIST = "/user/auth/combo" +export const CREATE_USER_PATH = "/user/admin/registry" +export const GET_USER_COMBO_LIST = "/user/combo" +export const GET_USER_AUDIT_COMBO_LIST = "/user/audit/combo" +export const GET_DIVISION_LIST = "/division" +export const GET_DIVISION_FROM_SUB_DIVISION = "/division/fromSubDiv" +export const UPDATE_DIVISION_PATH = "/division/save" +export const GET_DIVISION_COMBO_LIST = "/division/combo" +export const GET_SUB_DIVISION_COMBO_LIST = "/division/subdivision/combo" +export const GET_SUB_DIVISION_COMBO_FOR_APPLICATION_LIST = "/division/subdivision/event/combo" +export const GET_SUB_DIVISION_COMBO_FOR_AWARD_LIST = "/division/subdivision/application/combo" +export const GET_PROMOTION_CHANNEL_LIST = "/channel" +export const GET_PROMOTION_CHANNEL_COMBO_LIST = "/channel/combo" +export const UPDATE_PROMOTION_CHANNEL = "/channel/save" +export const GET_CLIENT_DEPARTMENT_LIST = "/clientDepartment" +export const GET_CLIENT_DEPARTMENT_COMBO_LIST = "/clientDepartment/combo" +export const UPDATE_CLIENT_DEPARTMENT = "/clientDepartment/save" + +export const GET_CATEGORY_LIST = "/category" +export const GET_CATEGORY_COMBO_LIST = "/category/combo" +export const UPDATE_CATEGORY_PATH = "/category/save" +export const GET_APPRECIATION_CATEGORY_LIST = "/appreciationCategory" +export const GET_APPRECIATION_CATEGORY_COMBO_LIST = "/appreciationCategory/combo" +export const UPDATE_APPRECIATION_CATEGORY_PATH = "/appreciationCategory/save" +export const GET_APPRECIATION_LIST = "/appreciation" +export const UPDATE_APPRECIATION_PATH = "/appreciation/save" +export const GET_SBU_DIVISION_LIST = "/sbuDivision" +export const GET_SBU_DIVISION_COMBO_LIST = "/sbuDivision/combo" +export const UPDATE_SBU_DIVISION_PATH = "/sbuDivision/save" +export const GET_TAG_LIST = "/tag" +export const GET_TAG_COMBO_LIST = "/tag/combo" +export const UPDATE_TAG_PATH = "/tag/save" +export const GET_AUDIT_LOG_LIST = "/auditLog" +export const GET_USER_LOGIN_LOG_LIST = "/user/loginLog" +export const GET_APPLICATION_PATH = "/application" +export const GET_APPLICATION_COMBO_PATH = "/application/combo" +export const POST_APPLICATION_PATH = "/application/save" +export const GET_APPLICATION_FILE_PATH = "/application/fileRef" +export const GET_APPLICATION_EXTERNAL_REF_PATH = "/application/externalRef" +export const GET_APPLICATION_STORAGE_SIZE = "/application/storedSize" +export const GET_APPLICATION_VIDEO_EXIST = "/application/videoExist" +export const GET_APPLICATION_AWARD_PATH = "/application/award" +export const UPDATE_APPLICATION_EXTERNAL_REFERENCE_PATH = "/application/externalRef/save"; +export const DELETE_FILE_PATH = "/file" +export const GET_FILE_PATH = "/file/dl" +export const GET_THUMBNAIL_PATH = "/file/thumbnail" +export const POST_THUMBNAIL_PATH = "/file/thumbnail/ul" +export const GET_CLIENT_PATH = "/client" +export const POST_CLIENT_PATH = "/client/save" +export const GET_EVENT_PATH = "/event" +export const POST_EVENT_PATH = "/event/save" +export const GET_EVENT_APPLICATION_PATH = "/event/application" +export const GET_EVENT_COMBO_PATH = "/event/combo" +export const GET_EVENT_NOTIFICATION_OVERTIME = "/event/checkOvertime" +export const GET_EVENT_YEAR_COMBO = "/event/dashboard/combo" +export const GET_EVENT_YEAR_COUNT = "/event/dashboard/yearEvent" +export const GET_EVENT_YEAR_AWARD = "/event/dashboard/yearAward" +export const GET_EVENT_TOP6 = "/event/dashboard/topRecord" +export const GET_EVENT_DIVISION_SUMMARY = "/event/dashboard/yearDivisionSummary" +export const GET_EVENT_TAG_SUMMARY = "/event/dashboard/yearTagSummary" +export const GET_EVENT_SUMMARY_EXCEL = "/event/dashboard/awardSummaryReport" +export const GET_EVENT_CATEGORY_SUMMARY = "/event/dashboard/yearCategorySummary" +export const GET_AWARD_PATH = "/award" +export const POST_AWARD_PATH = "/award/save" +export const GET_AWARD_FILE_PATH = "/award/fileRef" +export const GET_AWARD_EXTERNAL_REF_PATH = "/award/externalRef" +export const GET_AWARD_STORAGE_SIZE = "/award/storedSize" +export const GET_APPRECIATION_FILE_PATH = "/appreciation/fileRef" +export const GET_APPRECIATION_STORAGE_SIZE = "/appreciation/storedSize" +export const GET_APPRECIATION_IMPORT_TEMPLATE = "/appreciation/downloadTemplate" +export const GET_APPRECIATION_EXPORT ="/appreciation/export" +export const POST_APPRECIATION_IMPORT ="/appreciation/massImport" +export const GET_APPRECIATION_YEAR_COMBO_LIST = "/appreciation/yearCombo" +export const GET_APPRECIATION_CASES_REPORT = "/appreciation/caseReport" +export const GET_APPRECIATION_SUMMARY_REPORT = "/appreciation/summaryReport" +export const GET_APPRECIATION_IMPORT_ERROR_REPORT = "/appreciation/errorExport" +export const GET_AWARD_VIDEO_EXIST = "/award/videoExist" +export const UPDATE_AWARD_EXTERNAL_REFERENCE_PATH = "/award/externalRef/save"; +export const GET_SEARCH_TEMPLATE_PATH = "/template" +export const POST_SEARCH_TEMPLATE_PATH = "/template/save" +export const GET_SEARCH_TEMPLATE_COMBO_PATH = "/template/combo" +export const VALIDATE_TEMPLATE_NAME_PATH = "/template/checkTemplateName" +export const GET_SETTING_ROUTE = "/settings"; +export const GET_REMINDER_BEFORE = "/settings/" + SETTING_STRING_DICT.REMINDER_BEFORE; +export const GET_REMINDER_INTERVAL = "/settings/" + SETTING_STRING_DICT.REMINDER_INTERVAL; +export const GET_REMINDER_LIMIT = "/settings/" + SETTING_STRING_DICT.REMINDER_LIMIT; +export const GET_REMINDER_LIMIT_MAX = "/settings/" + SETTING_STRING_DICT.REMINDER_LIMIT_MAX; +export const GET_IDLE_LOGOUT_TIME = "/settings/" + SETTING_STRING_DICT.IDLE_LOGOUT_TIME; +export const GET_SETTING_PATH = "/settings/config" +export const UPDATE_SETTING_PATH = "/settings/save" +export const GET_PASSWORD_POLICY_PATH = "/settings/passwordPolicy" +export const GET_LDAP_USER_LIST = "/user/lotus" +export const GET_LDAP_USER_COMBO = "/user/lotusCombo" +export const GET_TODO_APPLICATION_LIST = "/todo/application" +export const GET_TODO_ANNOUNCEMENT_LIST = "/todo/announcement" +export const POST_TODO_MARK_READ = "/todo/markRead" +export const POST_TODO_MARK_SUPPRESS = "/todo/markSuppress" +export const POST_TODO_TEST = "/todo/test" + +export const GET_EVENT_EXPORT = "/event/export" +export const GET_AWARD_EXPORT = "/award/export" +export const GET_AWARD_EXPORT_TEMPLATE = "/award/getExportTemplate" +export const POST_AWARD_IMPORT = "/award/massImportAward" +export const GET_AWARD_IMPORT_ERROR_REPORT = "/award/errorExport" +export const GET_APPLICATION_EXPORT = "/application/export" + +export const CHECK_EVENT_DUPLICATE = "/event/checkDuplicate" +export const CHECK_APPLICATION_DUPLICATE = "/application/checkDuplicate" +export const CHECK_AWARD_DUPLICATE = "/award/checkDuplicate" +export const CHECK_CATEGORY_DUPLICATE = "/category/checkDuplicate" +export const CHECK_APPRECIATION_CATEGORY_DUPLICATE = "/appreciationCategory/checkDuplicate" +export const CHECK_TAG_DUPLICATE = "/tag/checkDuplicate" +export const CHECK_CHANNEL_DUPLICATE = "/channel/checkDuplicate" +export const CHECK_DIV_DUPLICATE = "/division/checkDuplicate" +export const CHECK_GROUP_DUPLICATE = "/group/checkDuplicate" +export const CHECK_USER_DUPLICATE = "/user/checkDuplicate" +export const CHECK_CLIENT_DEPARTMENT_DUPLICATE = "/clientDepartment/checkDuplicate" +export const CHECK_SBU_DIVISION_DUPLICATE = "/sbuDivision/checkDuplicate" + +export const POST_TODO_TEST_REMINDER = "/todo/testReminder" +export const POST_TODO_TEST_ANNOUNCEMENT = "/todo/testAnnouncement" +export const POST_RESEND_FAIL_EMAIL = "/todo/resendFailEmail" + +export const XML_TEST = "/report/xmlTest" \ No newline at end of file diff --git a/src/utils/ComboConst.js b/src/utils/ComboConst.js new file mode 100644 index 0000000..055832f --- /dev/null +++ b/src/utils/ComboConst.js @@ -0,0 +1,117 @@ +import {SETTING_STRING_DICT} from "./SettingConst"; + +export const tableNameCombo = [ + {key: 1, label: 'Application', value: "application"}, + {key: 2, label: 'Appreciation', value: "apr_appreciation"}, + {key: 3, label: 'Appreciation Category', value: "apr_category"}, + {key: 4, label: 'Award', value: "award"}, + {key: 5, label: 'Category', value: "category"}, + {key: 6, label: 'Client Department', value: "apr_client_department"}, + {key: 7, label: 'Division', value: "division"}, + {key: 8, label: 'Event', value: "event"}, + {key: 9, label: 'Promotion Channel', value: "promotion_channel"}, + {key: 10, label: 'SBU / Division', value: "apr_sbu"}, + {key: 11, label: 'Search Criteria Template', value: "search_criteria_template"}, + {key: 12, label: 'Tag', value: "tag"}, + {key: 13, label: 'Todo Reminder', value: "todo_reminder"}, + {key: 14, label: 'User', value: "user"}, + {key: 15, label: 'Group', value: "`group`"}, +]; + +export const EVENT_TYPE_COMBO = [ + {id:1, key: 1, label: 'Competition', value: "competition"}, + {id:2, key: 2, label: 'Event', value: "event"}, +]; + +export const MONTH_COMBO = [ + {id:1, key: 1, label: 'January', value: 1}, + {id:2, key: 2, label: 'February', value: 2}, + {id:3, key: 3, label: 'March', value: 3}, + {id:4, key: 4, label: 'April ', value: 4}, + {id:5, key: 5, label: 'May ', value: 5}, + {id:6, key: 6, label: 'June ', value: 6}, + {id:7, key: 7, label: 'July ', value: 7}, + {id:8, key: 8, label: 'August ', value: 8}, + {id:9, key: 9, label: 'September ', value: 9}, + {id:10, key: 10, label: 'October ', value: 10}, + {id:11, key: 11, label: 'November ', value: 11}, + {id:12, key: 12, label: 'December ', value: 12}, +]; + + +export const DASHBOARD_DIVISION_COMBO = [ + {id:1, key: 1, label: 'All Division', value: false}, + {id:2, key: 2, label: 'User Division ', value: true}, +]; + +export const MODULE_COMBO = [ + {id:1, key: 1, label: 'Event'}, + {id:2, key: 2, label: 'Application'}, + {id:3, key: 3, label: 'Award'}, +]; + +export const USER_TYPE_COMBO = [ + {id:1, key: 1, label: 'All Type'}, + {id:2, key: 2, label: 'Lotus Note User'}, + {id:3, key: 3, label: 'System User'}, +]; + +export const EVENT_REGION_COMBO = [ + {id:1, key: 1, label: 'Local'}, + {id:2, key: 2, label: 'Oversea'}, +]; + +export const BRANCH_COMBO = [ + {id:1, key: 1, label: 'Regulatory Services'}, + {id:2, key: 2, label: 'Trading Services'}, +]; + +export const APPLICATION_STATUS_COMBO = [ + {id:1, key: 1, label: 'Open', type: 1}, + {id:2, key: 2, label: 'Submitted', type: 2}, + {id:3, key: 3, label: 'Cancelled', type: 3}, +]; + +export const eventFrequencyCombo = [ + //{id:1, key: 1, label: 'Monthly', value: 30}, + //{id:2, key: 2, label: 'Quarterly', value:90}, + {id:3, key: 3, label: 'Annually', value:365}, + {id:4, key: 4, label: 'Bi-annually', value:180}, + {id:5, key: 5, label: 'Others', value:-1}, +]; + +export const EMAIL_TEMPLATE_COMBO = [ + {id:1, key: 1, label: 'Announcement Template', value: SETTING_STRING_DICT.EMAIL_TEMPLATE_ANNOUNCEMENT}, + {id:2, key: 2, label: 'Application Reminder for New Event', value: SETTING_STRING_DICT.EMAIL_TEMPLATE_APPLICATION_REMINDER_NEW_EVENT}, + {id:3, key: 3, label: 'Application Reminder for Old Event', value: SETTING_STRING_DICT.EMAIL_TEMPLATE_APPLICATION_REMINDER_OLD_EVENT}, +]; + +export const CategoryTabHeading = [ + { + key: 1, + name: 'Client Management' + }, + { + key: 2, + name: 'Appreciation Registration' + } +]; + +export const AttachmentTabHeading = [ + { + key: 1, + name: 'Attachment(s)' + }, +]; + +export const ReminderTabHeading = [ + { + key: 1, + name: 'Unread' + }, + { + key: 2, + name: 'Read' + } +]; + diff --git a/src/utils/CommonFunction.js b/src/utils/CommonFunction.js new file mode 100644 index 0000000..bff13b0 --- /dev/null +++ b/src/utils/CommonFunction.js @@ -0,0 +1,1005 @@ +import { toast } from 'react-toastify'; +import DialogTitle from '@mui/material/DialogTitle'; +import DialogContent from '@mui/material/DialogContent'; +import DialogContentText from '@mui/material/DialogContentText'; +import DialogActions from '@mui/material/DialogActions'; +import { Button, Grid, TextField, Typography, InputLabel, FormControl } from '@mui/material'; +import Dialog from '@mui/material/Dialog'; +import * as React from 'react'; +import Autocomplete from '@mui/material/Autocomplete'; +import {useEffect, useRef, useState} from 'react'; +import { format } from 'date-fns'; +import { GridOverlay } from '@mui/x-data-grid'; +import axios from 'axios'; +import {apiPath, getUserData} from '../auth/utils'; +import {GENERAL_RED_COLOR, GENERAL_TEXT_COLOR} from '../themes/colorConst'; +// import { Route } from '@mui/icons-material'; +import { MuiFileInput } from 'mui-file-input'; +import { POST_THUMBNAIL_PATH } from './ApiPathConst'; +import { useForm } from 'react-hook-form'; +import {isObjEmpty} from "./Utils"; +import AttachFileIcon from '@mui/icons-material/AttachFile' +import CloudUploadIcon from '@mui/icons-material/CloudUpload'; + +//====================COMMON FUNCTION====================// +export function getUserAuthList() { + const abilities = localStorage.getItem('abilities'); + if (abilities !== null) { + const abilitiesList = abilities.split(','); + return abilitiesList; + } + return []; +} + +export function handleRouteAbility(canAccess, targetPage, redirectPage) { + return canAccess ? targetPage : redirectPage; +} + +export function readFile(input, curBlob, setCurBlob) { + let reader = new FileReader(); + //console.log(input); + reader.readAsArrayBuffer(input.data); + reader.onload = function () { + //console.log(reader.result); + let temp = curBlob; + temp[input.id] = reader.result; + setCurBlob(temp); + }; +} + +export function convertXmlToObject(xmlArray) { + let output = []; + for (let i = 0; i < xmlArray.length; i++) { + let tempObj = {}; + const keys = Object.keys(xmlArray[i]); + const values = Object.values(xmlArray[i]); + tempObj['id'] = i; + tempObj['key'] = i; + let userType = ''; + let userFirstName = ''; + let userLastName = ''; + //let userNameZh = ""; + for (let j = 0; j < Object.keys(xmlArray[i]).length; j++) { + if (values[j][0] === 'NULL') { + tempObj[keys[j]] = null; + } else { + tempObj[keys[j]] = values[j][0]; + } + + // if(keys[j] === "EMSDknownas"){ + // userNameZh = values[j][0]; + // } + + if (keys[j] === 'EMSDlotus') { + userType = values[j][0]; + } + + if (keys[j] === 'EMSDlastname') { + userLastName = values[j][0]; + } + + if (keys[j] === 'EMSDfirstname') { + userFirstName = values[j][0]; + } + } + let displayLabel = userFirstName + ' ' + userLastName + ' (' + userType + ')'; + tempObj['label'] = displayLabel; + if(displayLabel.trim() !== "()" && displayLabel.trim().length > 3){ + output.push(tempObj); + } + } + return output; +} + +//Get user added record by compare with the original data +export function getDeletedRecordWithRefList(referenceList, updatedList) { + return referenceList.filter((x) => !updatedList.includes(x)); +} + +//Get user deleted record by compare with the original data +export function getNewRecordWithRefList(referenceList, updatedList) { + return updatedList.filter((x) => !referenceList.includes(x)); +} + +//Get single combo value by using of label +export function getComboValueByLabel(comboList, input) { + for (let i = 0; i < comboList.length; i++) { + if (comboList[i].label === input) { + return comboList[i]; + } + } + return (input === undefined || input === "") ? null : input; +} + +export function getComboValueById(comboList, input) { + for (let i = 0; i < comboList.length; i++) { + if (comboList[i].id === input) { + return comboList[i]; + } + } + return input === undefined ? null : input; +} + + +export const getRowHeight = (params, fieldName, lengthToSplit) => { + let temp = params.model[fieldName]; + //console.log(temp); + if(!isObjEmpty(temp)){ + const SINGLE_LINE_HEIGHT = 40; + const HEIGHT_WITH_PADDING = 35; + const LINE_HEIGHT = 25; // Adjust this value based on your font size and row padding + const numberOfLines = Math.ceil(temp.length / lengthToSplit); // Change 50 to your desired line length + const height = numberOfLines < 2 ? SINGLE_LINE_HEIGHT : HEIGHT_WITH_PADDING*2 + (LINE_HEIGHT * (numberOfLines-2) ); + //console.log(height); + return height <= SINGLE_LINE_HEIGHT ? SINGLE_LINE_HEIGHT : height; + } + else { + return 40; + } + }; + +//Get multi combo value by using of id +export function getComboValueByIdList(comboList, idList) { + if (!isObjEmpty(idList) && idList !== undefined) { + const output = idList.map(function (id) { + for (let i = 0; i < comboList.length; i++) { + if (comboList[i].id === id) { + return comboList[i]; + } + } + }) + .filter(Boolean); // Filter out undefined values from the output array + return output; + } + return []; +} + + +//Check if user subDivisionId in List +export function isUserDivisionIdInList(input, idList) { + if (idList.length < 1) { + return false; + } + for (let i = 0; i < idList.length; i++) { + if (idList[i] === parseInt(input)) { + return true; + } + } + return false; +} + +//Format List to String by using comma +export function castListToString(input) { + let output = ''; + for (let i = 0; i < input.length; i++) { + if (i !== 0) { + output = output + ','; + } + output = output + input[i]; + } + return output; +} + +//Convert Object list to id list +export function getIdList(input) { + const output = input.map(function (obj) { + return obj.id; + }); + return output; +} + +//Convert Object list to JSON Object id List +export function getJSONIdList(data) { + return data.map(({ id }) => ({ id })); +} + +//Convert Object list to field list +export function getListByFieldName(input, name) { + const output = input.map(function (obj) { + return obj[name]; + }); + return output; +} + +export function isStringEmptyAfterTrim(data){ + return (!data || data.trim().length === 0) ; +} + +export function isFormEmpty(data){ + return (Object.values(data).every(value => !value)) ; +} + +export function trimListDataBeforePost(dataList) { + return dataList.map((dataObject) => { + for (let key in dataObject) { + if (typeof dataObject[key] === 'string') { + dataObject[key] = dataObject[key].trim(); + } + } + return dataObject; + }); +} + +export function trimDataBeforePost(dataObject){ + for (let key in dataObject) { + if (typeof dataObject[key] === 'string') { + dataObject[key] = dataObject[key].trim(); + } + } + return dataObject; +} + +export function getObjectByValueName(list, valueName, value) { + const obj = list.find((element) => { + return element[valueName] === value; + }); + return obj === undefined || Object.keys(obj).length <= 0 ? null : obj; +} + + +export function getObjectByName(list, name) { + const obj = list.find((element) => { + return element.name === name; + }); + return obj === undefined || Object.keys(obj).length <= 0 ? null : obj; +} + +export function getObjectById(list, id) { + const obj = list.find((element) => { + return element.id === id; + }); + return obj === undefined || Object.keys(obj).length <= 0 ? null : obj; +} + +export function removeObjectWithId(arr, id) { + const arrCopy = Array.from(arr); + const objWithIdIndex = arrCopy.findIndex((obj) => obj.id === id); + arrCopy.splice(objWithIdIndex, 1); + return arrCopy; +} + +/** + * Display the date array in string format, default format is 'yyyy-MM-dd'. + * + * @param {*} queryDateArray - The date array to display. + * @param {*} [formatOption] - Set to True to display also the timestamp, or input custom format text. + */ +export function getDateString(queryDateArray, formatOption=false) { + if (queryDateArray === null || queryDateArray === undefined) { + return null; + } + + let dateFormat = 'yyyy-MM-dd'; + if (formatOption==true) { + dateFormat = 'yyyy-MM-dd HH:mm:ss'; + } else if (typeof(formatOption) == 'string') { + dateFormat = formatOption; + } + + return format( + new Date( + queryDateArray[0], + queryDateArray[1]-1, + queryDateArray[2], + queryDateArray[3] !== undefined ? queryDateArray[3] : 0, + queryDateArray[4] !== undefined ? queryDateArray[4] : 0, + queryDateArray[5] !== undefined ? queryDateArray[5] : 0 + ), + dateFormat + ); +} + +export const isOptionEqualToValue = (option, value) => { + return option.id === value?.id; +}; + +export const dateComparator = (date1, date2) => { + const dateString1 = getDateString(date1,false); + const dateString2 = getDateString(date2,false); + const date1Obj = new Date(dateString1); + const date2Obj = new Date(dateString2); + if (date1Obj < date2Obj) { + return -1; + } + if (date1Obj > date2Obj) { + return 1; + } + return 0; +}; + +//====================COMMON NOTIFICATION====================// +export const notifySaveSuccess = () => + toast.success('Save success!', { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifySendSuccess = () => + toast.success('Send success!', { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifyLoadSuccess = () => + toast.success('Load success!', { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifyDeleteSuccess = () => + toast.success('Delete Success!', { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifyInfo = (infoString) => + toast.info(infoString, { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifySuccess = (infoString) => + toast.success(infoString, { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifyDeleteError = (errorString) => + toast.error(errorString, { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +export const notifyNoPermission = () => + toast.error('You do not have permission to access this page', { + position: 'bottom-left', + autoClose: 5000, + hideProgressBar: false, + closeOnClick: true, + pauseOnHover: true, + draggable: true, + progress: undefined, + theme: 'light' + }); + +//====================COMMON COMPONENT====================// +export function CustomNoRowsOverlay() { + return ( + + No record found + + ); +} + +export function GeneralConfirmWindow({ isWindowOpen, title, content, onNormalClose, onConfirmClose }) { + return ( + + + + {title} + + + + + + {content} + + + + + + + + + ); +} + +export function GeneralComboWindow({ isWindowOpen, title, content, comboList, setValueCallback, onNormalClose, onConfirmClose }) { + const [errors, setErrors] = useState({}); + const [temp, setTemp] = useState(null); + + function validate() { + const formErrors = {}; + + if (temp == null) { + formErrors.error = 'Event must not be null'; + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0) { + onConfirmClose(); + } + } + + return ( + + {title} + + + + {content} + + * + + + { + setValueCallback(newValue); + setTemp(newValue); + }} + renderInput={(params) => ( + + )} + /> + + + + + + + + ); +} + +export function GeneralTwoComboWindow({ + isWindowOpen, + title, + content, + content2, + comboList, + comboList2, + setValueCallback, + setValueCallback2, + onNormalClose, + onConfirmClose +}) { + const [errors, setErrors] = useState({}); + const [temp, setTemp] = useState(null); + const [temp2, setTemp2] = useState(null); + + function validate() { + const formErrors = {}; + if (temp === null) { + formErrors.error = 'Event must not be null'; + } + + if (temp2 === null) { + formErrors.error2 = 'Application must not be null'; + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0) { + onConfirmClose(); + } + } + + useEffect(() => { + setValueCallback2(null); + setTemp2(null); + }, [temp]); + + return ( + + + {title} + + + + {content} + + * + + + { + setValueCallback(newValue); + setTemp(newValue); + }} + renderInput={(params) => ( + + )} + /> + + + + + {content2} + + * + + + { + setValueCallback2(newValue); + setTemp2(newValue); + }} + value={temp2 === null? null : temp2} + disabled={temp === null} + renderInput={(params) => ( + + )} + /> + + + + + + + + + ); +} + +export function GeneralCreateTemplateWindow({ + isWindowOpen, + title, + content, + setValueCallback, + validatePath, + onNormalClose, + onConfirmClose, + module +}) { + const [errors, setErrors] = useState({}); + const [temp, setTemp] = useState(null); + + function validateTemplateName() { + const userData = getUserData(); + + axios + .get(`${apiPath}${validatePath}`, { + params: { + name: temp.trim(), + userId: userData.id, + module: module + } + }) + .then((response) => { + if (response.status === 200) { + const formErrors = {}; + if (response.data.isTaken) { + formErrors.error = 'Name have been taken'; + setErrors(formErrors); + } else if (!response.data.isTaken) { + if (Object.keys(formErrors).length === 0) { + onConfirmClose(); + } + } + } + }) + .catch((error) => { + console.log(error); + return true; + }); + } + + function validate() { + const formErrors = {}; + if (temp === null) { + formErrors.error = 'Template name must not be null'; + } + else if (temp.trim().length === 0){ + formErrors.error = 'Template name must not be null'; + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0) { + validateTemplateName(); + } + } + + const onInputChange = (event) => { + setTemp(event.target.value); + setValueCallback(event.target.value); + }; + + return ( + + {title} + + + + {content} + + * + + + + + + + + + + + ); +} + +export function UploadFileWindow({ isWindowOpen, title, video, onNormalClose, onConfirmClose }) { + const [errors, setErrors] = useState({}); + const [file, setFile] = React.useState(null) + const fileInputRef = useRef(null); + + const { register, getValues, setValue } = useForm(); + + useEffect(() => { + setValue('remarks', video.remarks); + }, [video]); + + const handleOnClose = () => { + setFile(null); + onNormalClose(); + }; + + const handleFieldChange = (newFile) => { + setFile(newFile); + }; + + const handleChange = (event) => { + if(event !== null){ + const newFile = event.target.files[0]; + setFile(newFile); + } + else{ + setFile(null) + } + }; + + const handleOpenFileSelect = () => { + fileInputRef.current.click(); + }; + + function validate() { + const formErrors = {}; + /*if (file == null) { + formErrors.error = 'File must not be null'; + }*/ + + if (file !== null) { + if (file.type.split('/')[0] !== 'image') { + formErrors.error = 'File must be a image'; + } + } + + setErrors(formErrors); + if (Object.keys(formErrors).length === 0) { + uploadData(); + } + } + + function uploadData() { + const values = getValues(); + let formData = new FormData(); + let containData = false; + formData.append('fileId', video.id); + + if (file !== null) { + formData.append('file', file); + containData = true; + } + if (values.remarks) { + formData.append('remarks', values.remarks); + containData = true; + } + + if (containData) { + axios + .post(`${apiPath}${POST_THUMBNAIL_PATH}`, formData, { + headers: { + 'Content-Type': 'multipart/form-data' + } + }) + .then((response) => { + if (response.status === 200) { + notifySaveSuccess(); + setFile(null); + onConfirmClose(); + } + }) + .catch((error) => { + console.log(error); + return false; + }); + } + } + return ( + + + + {title} + + + + + + + + + File Name: + + + + + + + {video.key} + + + + + + {video.mimetype === 'video' ? ( + + + + Thumbnail: + + + + + + + + + + +
+ + + {/*Selected file: {file ? file.name : 'None'}*/} +
+
+
+
+
+
+ ) : ( + + )} + + + + + Remark: + + + + + + + +
+
+ + + + +
+ ); +} diff --git a/src/utils/CustomAxios.js b/src/utils/CustomAxios.js new file mode 100644 index 0000000..1966fa1 --- /dev/null +++ b/src/utils/CustomAxios.js @@ -0,0 +1,10 @@ +import axios from "axios" + +const instance = axios.create( + { + withCredentials: true, + crossDomain: true + } +) + +export {instance as axios} \ No newline at end of file diff --git a/src/utils/SettingConst.js b/src/utils/SettingConst.js new file mode 100644 index 0000000..4a54f4b --- /dev/null +++ b/src/utils/SettingConst.js @@ -0,0 +1,27 @@ +export const SETTING_STRING_DICT = { + IDLE_LOGOUT_TIME: "SYS.idleLogoutTime", + REMINDER_BEFORE: "SYS.reminder.before", + REMINDER_INTERVAL: "SYS.reminder.interval", + REMINDER_LIMIT: "SYS.reminder.limit", + REMINDER_LIMIT_MAX: "SYS.reminder.limit.maxValue", + REMINDER_WITHIN: "SYS.reminder.eventWithin", + MAIL_HOST: "MAIL.smtp.host", + MAIL_PORT: "MAIL.smtp.port", + MAIL_USERNAME: "MAIL.smtp.username", + MAIL_PASSWORD: "MAIL.smtp.password", + MAIL_AUTH: "MAIL.smtp.auth", + //MAIL_SENDER: "MAIL.smtp.sender", + PASSWORD_LENGTH: "SYS.password.rule.length.min", + PASSWORD_DURATION: "SYS.password.rule.duration", + PASSWORD_HISTORY: "SYS.password.rule.history", + LOGIN_ATTEMPT_LIMIT: "SYS.loginAttempt.limit", + LOGIN_ATTEMPT_PENALTY: "SYS.loginAttempt.penalityTime", + PASSWORD_RULE_NUMBER_AND_CHAR: "SYS.password.rule.numberAndAlphabetic", + PASSWORD_RULE_SPECIAL_CHAR: "SYS.password.rule.specialCharacter", + PASSWORD_RULE_NO_USERNAME: "SYS.password.rule.notContainUsername", + PASSWORD_RULE_NO_THREE_CONSECUTIVE_CHAR: "SYS.password.rule.notContainThreeConsecutiveCharacters", + EMAIL_TEMPLATE_APPLICATION_REMINDER_NEW_EVENT: "SYS.email.template.application.reminder.newEvent", + EMAIL_TEMPLATE_APPLICATION_REMINDER_OLD_EVENT: "SYS.email.template.application.reminder.oldEvent", + EMAIL_TEMPLATE_ANNOUNCEMENT: "SYS.email.template.announcement", + +}; \ No newline at end of file diff --git a/src/utils/SyntaxHighlight.js b/src/utils/SyntaxHighlight.js new file mode 100644 index 0000000..b3cfcc0 --- /dev/null +++ b/src/utils/SyntaxHighlight.js @@ -0,0 +1,19 @@ +import PropTypes from 'prop-types'; + +// third-party +import SyntaxHighlighter from 'react-syntax-highlighter'; +import { a11yDark } from 'react-syntax-highlighter/dist/esm/styles/hljs'; + +// ==============================|| CODE HIGHLIGHTER ||============================== // + +export default function SyntaxHighlight({ children, ...others }) { + return ( + + {children} + + ); +} + +SyntaxHighlight.propTypes = { + children: PropTypes.node +}; diff --git a/src/utils/UserAbilityUtils.js b/src/utils/UserAbilityUtils.js new file mode 100644 index 0000000..19930a2 --- /dev/null +++ b/src/utils/UserAbilityUtils.js @@ -0,0 +1,22 @@ +import {Ability} from "@casl/ability"; + +const {AbilityBuilder} = require("@casl/ability"); + +export function createUserAbility(abilities) { + const { can, rules } = new AbilityBuilder(); + + abilities.forEach((ability) => { + const stringList = ability.split('_'); + const action = stringList[0]; + let type = "" + for(let i=1; i { + if (obj === null || obj === undefined) { + return true + } + + return Object.keys(obj).length === 0 +} + +// ** Returns K format from a number +export const kFormatter = num => (num > 999 ? `${(num / 1000).toFixed(1)}k` : num) + +// ** Converts HTML to string +export const htmlToString = html => html.replace(/<\/?[^>]+(>|$)/g, '') + +// ** Checks if the passed date is today +const isToday = date => { + const today = new Date() + return ( + /* eslint-disable operator-linebreak */ + date.getDate() === today.getDate() && + date.getMonth() === today.getMonth() && + date.getFullYear() === today.getFullYear() + /* eslint-enable */ + ) +} + +/** + ** Format and return date in Humanize format + ** Intl docs: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/format + ** Intl Constructor: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/DateTimeFormat/DateTimeFormat + * @param {String} value date to format + * @param {Object} formatting Intl object to format with + */ +export const formatDate = (value, formatting = {month: 'short', day: 'numeric', year: 'numeric'}) => { + if (!value) return value + return new Intl.DateTimeFormat('en-US', formatting).format(new Date(value)) +} + +// ** Returns short month of passed date +export const formatDateToMonthShort = (value, toTimeForCurrentDay = true) => { + const date = new Date(value) + let formatting = {month: 'short', day: 'numeric'} + + if (toTimeForCurrentDay && isToday(date)) { + formatting = {hour: 'numeric', minute: 'numeric'} + } + + return new Intl.DateTimeFormat('en-US', formatting).format(new Date(value)) +} + +/** + ** Return if user is logged in + ** This is completely up to you and how you want to store the token in your frontend application + * ? e.g. If you are using cookies to store the application please update this function + */ +export const isUserLoggedIn = () => localStorage.getItem('accessToken') !== null +export const getUserData = () => JSON.parse(localStorage.getItem('userData')) + +/** + ** This function is used for demo purpose route navigation + ** In real app you won't need this function because your app will navigate to same route for each users regardless of ability + ** Please note role field is just for showing purpose it's not used by anything in frontend + ** We are checking role just for ease + * ? NOTE: If you have different pages to navigate based on user ability then this function can be useful. However, you need to update it. + * @param {String} userRole Role of user + */ +export const getHomeRouteForLoggedInUser = userRole => { + if (userRole === 'admin') return defaultHomePage + if (userRole === 'user') return defaultHomePage + if (userRole === 'client') return '/access-control' + return '/login' +} + +// ** React Select Theme Colors +export const selectThemeColors = theme => ({ + ...theme, + colors: { + ...theme.colors, + primary25: '#7367f01a', // for option hover bg-color + primary: '#7367f0', // for selected option bg-color + neutral10: '#008a9a', // for tags bg-color + neutral20: '#ededed', // for input border-color + neutral30: '#ededed' // for input hover border-color + } +}) + +export const momentMinuteDiff = (date1, date2) => { + return moment.duration(moment(new Date(date1)).diff(moment(new Date(date2)))).asMinutes() +} + +export const minuteDiff = (nowDate, createdAtDate) => { + let diff = (nowDate.getTime() - new Date(createdAtDate)) / 1000 + diff /= 60 + return Math.abs(Math.ceil(diff)) +} diff --git a/src/utils/context/Can.js b/src/utils/context/Can.js new file mode 100644 index 0000000..03727ea --- /dev/null +++ b/src/utils/context/Can.js @@ -0,0 +1,11 @@ +// ** Imports createContext function +import { createContext } from 'react' + +// ** Imports createContextualCan function +import { createContextualCan } from '@casl/react' + +// ** Create Context +export const AbilityContext = createContext() + +// ** Init Can Context +export const Can = createContextualCan(AbilityContext.Consumer) diff --git a/src/utils/password-strength.js b/src/utils/password-strength.js new file mode 100644 index 0000000..3282760 --- /dev/null +++ b/src/utils/password-strength.js @@ -0,0 +1,29 @@ +// has number +const hasNumber = (number) => new RegExp(/[0-9]/).test(number); + +// has mix of small and capitals +const hasMixed = (number) => new RegExp(/[a-z]/).test(number) && new RegExp(/[A-Z]/).test(number); + +// has special chars +const hasSpecial = (number) => new RegExp(/[!#@$%^&*)(+=._-]/).test(number); + +// set color based on password strength +export const strengthColor = (count) => { + if (count < 2) return { label: 'Poor', color: 'error.main' }; + if (count < 3) return { label: 'Weak', color: 'warning.main' }; + if (count < 4) return { label: 'Normal', color: 'warning.dark' }; + if (count < 5) return { label: 'Good', color: 'success.main' }; + if (count < 6) return { label: 'Strong', color: 'success.dark' }; + return { label: 'Poor', color: 'error.main' }; +}; + +// password strength indicator +export const strengthIndicator = (number) => { + let strengths = 0; + if (number.length > 5) strengths += 1; + if (number.length > 7) strengths += 1; + if (hasNumber(number)) strengths += 1; + if (hasSpecial(number)) strengths += 1; + if (hasMixed(number)) strengths += 1; + return strengths; +}; diff --git a/src/utils/videoThumbnails.js b/src/utils/videoThumbnails.js new file mode 100644 index 0000000..e15d390 --- /dev/null +++ b/src/utils/videoThumbnails.js @@ -0,0 +1,422 @@ +(function(window, document, undefined) { + /** + * Class creation + * @param {array} opts Any overriding options + */ + function VideoThumbnails(opts) { + this.video; + this.videoHtml; + this.videoHeight; + this.videoWidth; + this.videoDuration; + this.videoInterval; + this.videoStart; + this.completed = 0; + this.captures = []; + this.capturesDetailed = {}; + this.events = {}; + this.currentShot = 0; + this.startTime = null; + this.lastTime = null; + + //Default options + this.defaults = { + maxWidth : 1280, + maxHeight : 1280, + count : 8 + } + + /** + * Current options + * @type {Object} + */ + this.opts = {}; + + /** + * Current options + * @type {Object} + */ + this.opts = VideoThumbnails.extend({}, this.defaults, opts || {}); + }; + + VideoThumbnails.prototype = { + /** + * Register events + * @param {name} event Function to hook onto + * @param {Function} callback What to call + */ + on: function (event, callback) { + event = event.toLowerCase(); + if (!this.events.hasOwnProperty(event)) { + this.events[event] = []; + } + this.events[event].push(callback); + }, + + /** + * Remove event callback + * @function + * @param {string} [event] removes all events if not specified + * @param {Function} [fn] removes all callbacks of event if not specified + */ + off: function (event, fn) { + if (event !== undefined) { + event = event.toLowerCase(); + if (fn !== undefined) { + if (this.events.hasOwnProperty(event)) { + arrayRemove(this.events[event], fn); + } + } else { + delete this.events[event]; + } + } else { + this.events = {}; + } + }, + + /** + * Fire an event + * @function + * @param {string} event event name + * @param {...} args arguments of a callback + * @return {bool} value is false if at least one of the event handlers which handled this event + * returned false. Otherwise it returns true. + */ + fire: function (event, args) { + // `arguments` is an object, not array, in FF, so: + args = Array.prototype.slice.call(arguments); + event = event.toLowerCase(); + var preventDefault = false; + if (this.events.hasOwnProperty(event)) { + each(this.events[event], function (callback) { + preventDefault = callback.apply(this, args.slice(1)) === false || preventDefault; + }, this); + } + if (event != 'catchall') { + args.unshift('catchAll'); + preventDefault = this.fire.apply(this, args) === false || preventDefault; + } + return !preventDefault; + }, + + /** + * Start capturing + * @param {file} file The local filename to work with + */ + capture(file) { + //Need this in the events + var thisClass = this; + + this.fire('beforeCapture'); + + this.lastTime = this.startTime = (new Date()).getTime(); + + var data = new FormData(); + data.append("file", file, file.name); + + var url = window.URL || window.webkitURL; + var fileURL = url.createObjectURL(file); + + var videoHtml = $(''); + videoHtml.attr('id', 'videoHtmlCapture'); + videoHtml.attr('controls', true); + videoHtml.attr('preload', 'metadata'); + videoHtml.attr('crossorigin', '*'); + videoHtml.attr('width', 600); + videoHtml.attr('src', fileURL); + + var theVideo = $(''); + theVideo.attr('src', fileURL); + theVideo.attr('type', file.type); + + videoHtml.html(theVideo); + this.videoHtml = videoHtml; + + this.video = this.videoHtml[0]; + + //As soon as the meta is ready, trigger that capture is ready + this.video.onloadedmetadata = function() { + thisClass.fire('startCapture', this.captures); + thisClass.video.play(); + }; + + //Trigger the capture here because the video is ready + this.video.onplay = function() { + thisClass.initScreenshot(); + }; + + //Can't play this video + this.video.onerror = function() { + thisClass.fire('unsupported'); + }; + + this.video.addEventListener('seeked', function() { + //Check we still have a video (might have been cancelled) + if(thisClass.video) { + thisClass.video.pause() + thisClass.captureScreenShot(); + } + }); + }, + + /** + * Setup the screenshot + */ + initScreenshot() { + this.thumbWidth = this.video.videoWidth; + this.thumbHeight = this.video.videoHeight; + + //Wide video + if(this.thumbWidth > this.thumbHeight) { + var ratio = this.opts.maxWidth / this.thumbWidth; + + this.thumbWidth = this.opts.maxWidth; + this.thumbHeight = parseInt(this.thumbHeight * ratio); + + //square video + } else if(this.thumbWidth === this.thumbHeight) { + this.thumbWidth = this.opts.maxWidth; + this.thumbHeight = this.opts.maxHeight; + + //tall video + } else { + var ratio = this.opts.maxHeight / this.thumbHeight; + this.thumbHeight = this.opts.maxHeight; + this.thumbWidth = parseInt(this.thumbWidth * ratio); + } + + this.videoHtml.width(this.thumbWidth); + this.videoHtml.height(this.thumbHeight); + + this.videoDuration = this.video.duration; + this.videoInterval = this.videoDuration / (this.opts.count + 1); //this will ensure credits are ignored + this.videoStart = this.videoInterval / 2; + + //Prepare the next shot + this.prepareScreenshot(); + }, + + /** + * This will work out what the next shot is, and move the video to that point (doesn't take the shot) + * Doesn't return anything. The video seek will capture the shot + */ + prepareScreenshot() { + this.currentShot++; + + var newTime = Math.floor(this.videoStart + (this.currentShot * this.videoInterval) - this.videoInterval); + var statTime = this.getTime(); + + this.capturesDetailed[this.currentShot] = { + capture : this.currentShot, + width : this.thumbWidth, + height : this.thumbHeight, + timeindex : newTime, + startTime : statTime.fromStart, + captureTime : null + }; + + this.video.currentTime = newTime; + }, + + /** + * Capture the shot by using a canvas element + */ + captureScreenShot() { + var canvas = document.createElement('canvas'); + canvas.width = this.thumbWidth; + canvas.height = this.thumbHeight; + + var ctx = canvas.getContext('2d'); + ctx.drawImage(this.video, 0, 0, this.thumbWidth, this.thumbHeight); + + //and save + this.save(canvas); + }, + + /** + * Save the captire + * @param {canvas} canvas The captured thumb + */ + save(canvas) { + //Get the shot + var theCapture = canvas.toDataURL("image/jpeg", 0.7); + + //done + this.grabComplete(theCapture); + }, + + /** + * Complete the + * @param {image} image The image captured + */ + grabComplete(image) { + var counter = this.currentShot; + this.completed += 1; + + //Stats are nice + var statTime = this.getTime(); + + //Save it to the array + this.captures.push(image); + this.capturesDetailed[counter].url = image; + this.capturesDetailed[counter].captureTime = statTime.diff; + + //Fire the event incase anyone is listening + this.fire('capture', image); + + //All done so remove the elements + if(this.completed >= this.opts.count) { + this.cleanUp(); + this.fire('complete', this.captures); + + var stats = this.getTime(); + + this.fire('completeDetail', { + thumbs : this.capturesDetailed, + totalTime : stats.fromStart, + details : { + thumbnailCount : this.opts.count, + videoDuration : this.videoDuration, + videoInterval : this.videoInterval, + thumbWidth : this.thumbWidth, + thumbHeight : this.thumbHeight, + videoStart : this.videoStart + } + }); + } else { + //Prepare the next shot + this.prepareScreenshot(); + } + }, + /** + * Clean up our files etc. Gets expensive on the CPU if it's all still running + */ + cleanUp() { + this.video = null; + delete this.video; + + this.videoHtml = null; + delete this.videoHtml; + }, + /** + * Force and abort of the capture + */ + abort() { + //already finished + if(this.completed >= this.opts.count) { + return; + } + + //crude but effective + this.completed = this.opts.count + 1; + + //Do some tidying + this.cleanUp(); + + this.fire('aborted', this.captures); + }, + /** + * time tracking for our inner stats geek + * @return {array} The stats + */ + getTime() { + var thisTime = (new Date()).getTime(); + var diff = thisTime - this.lastTime; + var fromStart = thisTime - this.startTime; + this.lastTime = thisTime; + + return { + diff : diff, + fromStart : fromStart + } + } + }; + + /** + * Useful function for remove something from and array + * @param {array} array array object to modify + * @param {string} value value to find + */ + function arrayRemove(array, value) { + var index = array.indexOf(value); + if (index > -1) { + array.splice(index, 1); + } + } + + /** + * If option is a function, evaluate it with given params + * @param {*} data + * @param {...} args arguments of a callback + * @returns {*} + */ + function evalOpts(data, args) { + if (typeof data === "function") { + // `arguments` is an object, not array, in FF, so: + args = Array.prototype.slice.call(arguments); + data = data.apply(null, args.slice(1)); + } + return data; + } + VideoThumbnails.evalOpts = evalOpts; + + /** + * Extends the destination object `dst` by copying all of the properties from + * the `src` object(s) to `dst`. You can specify multiple `src` objects. + * @function + * @param {Object} dst Destination object. + * @param {...Object} src Source object(s). + * @returns {Object} Reference to `dst`. + */ + function extend(dst, src) { + each(arguments, function(obj) { + if (obj !== dst) { + each(obj, function(value, key){ + dst[key] = value; + }); + } + }); + return dst; + } + VideoThumbnails.extend = extend; + + /** + * Iterate each element of an object + * @function + * @param {Array|Object} obj object or an array to iterate + * @param {Function} callback first argument is a value and second is a key. + * @param {Object=} context Object to become context (`this`) for the iterator function. + */ + function each(obj, callback, context) { + if (!obj) { + return ; + } + var key; + // Is Array? + if (typeof(obj.length) !== 'undefined') { + for (key = 0; key < obj.length; key++) { + if (callback.call(context, obj[key], key) === false) { + return ; + } + } + } else { + for (key in obj) { + if (obj.hasOwnProperty(key) && callback.call(context, obj[key], key) === false) { + return ; + } + } + } + } + VideoThumbnails.each = each; + + if ( typeof module === "object" && module && typeof module.exports === "object" ) { + // Expose as module.exports in loaders that implement the Node + // module pattern (including browserify). Do not create the global, since + // the user will be storing it themselves locally, and globals are frowned + // upon in the Node module world. + module.exports = VideoThumbnails; + } else { + // Otherwise expose to the global object as usual + window.VideoThumbnails = VideoThumbnails; + } +})(window, document); \ No newline at end of file diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..ce188f8 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,11720 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@adobe/css-tools@^4.0.1": + version "4.2.0" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz" + integrity sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA== + +"@alloc/quick-lru@^5.2.0": + version "5.2.0" + resolved "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz" + integrity sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ant-design/colors@^6.0.0": + 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" + +"@ant-design/icons-svg@^4.2.1": + version "4.2.1" + resolved "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.2.1.tgz" + integrity sha512-EB0iwlKDGpG93hW8f85CTJTs4SvMX7tt5ceupvhALp1IF44SeUFOMhKUOYqpsoYWQKAOuTRDMqn75rEaKDp0Xw== + +"@ant-design/icons@^4.7.0": + version "4.8.0" + resolved "https://registry.npmjs.org/@ant-design/icons/-/icons-4.8.0.tgz" + integrity sha512-T89P2jG2vM7OJ0IfGx2+9FC5sQjtTzRSz+mCHTXkFn/ELZc2YpfStmYHmqzq2Jx55J0F7+O6i5/ZKFSVNWCKNg== + dependencies: + "@ant-design/colors" "^6.0.0" + "@ant-design/icons-svg" "^4.2.1" + "@babel/runtime" "^7.11.2" + classnames "^2.2.6" + rc-util "^5.9.4" + +"@apideck/better-ajv-errors@^0.3.1": + version "0.3.6" + resolved "https://registry.npmjs.org/@apideck/better-ajv-errors/-/better-ajv-errors-0.3.6.tgz" + integrity sha512-P+ZygBLZtkp0qqOAJJVX4oX/sFo5JR3eBWwwuqHHhK0GIgQOKWrAfiAaWX0aArHkRWHMuggFEgAZNxVPwPZYaA== + dependencies: + json-schema "^0.4.0" + jsonpointer "^5.0.0" + leven "^3.1.0" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.0", "@babel/code-frame@^7.22.5", "@babel/code-frame@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.5.tgz" + integrity sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ== + dependencies: + "@babel/highlight" "^7.22.5" + +"@babel/compat-data@^7.22.5", "@babel/compat-data@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.6.tgz" + integrity sha512-29tfsWTq2Ftu7MXmimyC0C5FDZv5DYxOZkh3XD3+QW4V/BYuv/LyEsjj3c0hqedEaDt6DBfDvexMKU8YevdqFg== + +"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.1.0", "@babel/core@^7.11.1", "@babel/core@^7.12.0", "@babel/core@^7.12.3", "@babel/core@^7.13.0", "@babel/core@^7.16.0", "@babel/core@^7.21.4", "@babel/core@^7.4.0-0", "@babel/core@^7.7.2", "@babel/core@^7.8.0", "@babel/core@>=7.11.0": + version "7.22.8" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.8.tgz" + integrity sha512-75+KxFB4CZqYRXjx4NlR4J7yGvKumBuZTmV4NV6v09dVXXkuYVYLT68N6HCzLvfJ+fWCxQsntNzKwwIXL4bHnw== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helpers" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.8" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.2" + +"@babel/eslint-parser@^7.16.3", "@babel/eslint-parser@^7.21.3": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.7.tgz" + integrity sha512-LH6HJqjOyu/Qtp7LuSycZXK/CYXQ4ohdkliEaL1QTdtOXVdOVpTBKVxAo/+eeyt+x/2SRzB+zUPduVl+xiEvdg== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + eslint-visitor-keys "^2.1.0" + +"@babel/generator@^7.22.7", "@babel/generator@^7.7.2": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.7.tgz" + integrity sha512-p+jPjMG+SI8yvIaxGgeW24u7q9+5+TGpZh8/CuB7RhBKd7RCy8FayNEFNNKrNK/eUcY/4ExQqLmyrvBXKsIcwQ== + dependencies: + "@babel/types" "^7.22.5" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.18.6", "@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.5.tgz" + integrity sha512-m1EP3lVOPptR+2DwD125gziZNcmoNSHGmJROKoy87loWUQyJaVXDgpmruWqDARZSmtYQ+Dl25okU8+qhVzuykw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.6.tgz" + integrity sha512-534sYEqWD9VfUm3IPn2SLcH4Q3P86XL+QvqdC7ZsFrzyyPF3T4XGiVghF6PTYNdWg6pXuoqXxNQAhbYeEInTzA== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-validator-option" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + browserslist "^4.21.9" + lru-cache "^5.1.1" + +"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.21.0", "@babel/helper-create-class-features-plugin@^7.22.5", "@babel/helper-create-class-features-plugin@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.6.tgz" + integrity sha512-iwdzgtSiBxF6ni6mzVnZCF3xt5qE6cEA0J7nFt8QOAWZ0zjCFceEgpn3vtb2V7WFR6QzP2jmIFOHMTRo7eNJjQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.6.tgz" + integrity sha512-nBookhLKxAWo/TUCmhnaEJyLz2dekjQvv5SRpE9epWQBcpedWLKt8aZdsuT9XV5ovzR3fENLjRXVT0GsSlGGhA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + regexpu-core "^5.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.1": + version "0.4.1" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.1.tgz" + integrity sha512-kX4oXixDxG197yhX+J3Wp+NpL2wuCFjWQAr6yX2jtCnflK9ulMI51ULFGIrWiX1jGfvAxdHp+XQCcP2bZGPs9A== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.5.tgz" + integrity sha512-aBiH1NKMG0H2cGZqspNvsaBe6wNGjbJjuLy29aU+eDZjSbbN53BaxlpB02xm9v34pLTZ1nIQPFYn2qMZoa5BQQ== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-imports@^7.10.4", "@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.5.tgz" + integrity sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-module-transforms@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.5.tgz" + integrity sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.5.tgz" + integrity sha512-cU0Sq1Rf4Z55fgz7haOakIyM7+x/uCFwXpLPaeRzfoUtAEAuUZjZvFPjL/rk5rW693dIgn2hng1W7xbT7lWT4g== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-replace-supers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.5.tgz" + integrity sha512-aLdNM5I3kdI/V9xGNyKSF3X/gTyMUBohTZ+/3QdQKAA9vxIiy12E+8E2HoOP1/DjeqU+g6as35QHJNMDDYpuCg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.20.0", "@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.5", "@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz" + integrity sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ== + +"@babel/helper-validator-option@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.5.tgz" + integrity sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw== + +"@babel/helper-wrap-function@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.5.tgz" + integrity sha512-bYqLIBSEshYcYQyfks8ewYA8S30yaGSeRslcvKMvoUk6HHPySbxHq9YRi6ghhzEU+yhQv9bP/jXnygkStOcqZw== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helpers@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.6.tgz" + integrity sha512-YjDs6y/fVOYFV8hAf1rxd1QvR9wJe1pDBZ2AREKq/SDayfPzgk0PBnVuTCE5X1acEpMMNOVUqoe+OwiZGJ+OaA== + dependencies: + "@babel/template" "^7.22.5" + "@babel/traverse" "^7.22.6" + "@babel/types" "^7.22.5" + +"@babel/highlight@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.5.tgz" + integrity sha512-BSKlD1hgnedS5XRnGOljZawtag7H1yPfQp0tdNJCHoH6AZ+Pcm9VvkrK59/Yy593Ypg0zMxH2BxD1VPYUQ7UIw== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.0.0" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.5", "@babel/parser@^7.22.7": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.7.tgz" + integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.5.tgz" + integrity sha512-NP1M5Rf+u2Gw9qfSO4ihjcTGW5zXTi36ITLd4/EoAcEhIZ0yjMqmftDNl3QC19CX7olhrjpyU454g/2W7X0jvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.5.tgz" + integrity sha512-31Bb65aZaUwqCbWMnZPduIZxCBngHFlzyN6Dq6KAJjtx+lx6ohKHubc61OomYi7XwVD4Ol0XCVz4h+pYFR048g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.5" + +"@babel/plugin-proposal-class-properties@^7.16.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz" + integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-decorators@^7.16.4": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.22.7.tgz" + integrity sha512-omXqPF7Onq4Bb7wHxXjM3jSMSJvUUbvDvmmds7KI5n9Cq6Ln5I05I1W2nRlRof1rGdiUxJrxwe285WF96XlBXQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/plugin-syntax-decorators" "^7.22.5" + +"@babel/plugin-proposal-nullish-coalescing-operator@^7.16.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz" + integrity sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-proposal-numeric-separator@^7.16.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz" + integrity sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-proposal-optional-chaining@^7.16.0": + version "7.21.0" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz" + integrity sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA== + dependencies: + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/helper-skip-transparent-expression-wrappers" "^7.20.0" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-proposal-private-methods@^7.16.0": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz" + integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-proposal-private-property-in-object@^7.21.11": + version "7.21.11" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.11.tgz" + integrity sha512-0QZ8qP/3RLDVBwBFoWAwCtgcDZJVwA5LUJRZU8x2YFfKNuFq161wK3cuGrALu5yiPu+vzwTAg/sMWVNeWeNyaw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-create-class-features-plugin" "^7.21.0" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-proposal-unicode-property-regex@^7.4.4": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz" + integrity sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-syntax-async-generators@^7.8.4": + version "7.8.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz" + integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz" + integrity sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + version "7.12.13" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz" + integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz" + integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-decorators@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.5.tgz" + integrity sha512-avpUOBS7IU6al8MmF1XpAyj9QYeLPuSDJI5D4pVMSMdL7xQokKqJPYQC67RCT0aCTashUXPiGwMJ0DEXXCEmMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz" + integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz" + integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-flow@^7.14.5", "@babel/plugin-syntax-flow@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz" + integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz" + integrity sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz" + integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz" + integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz" + integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + version "7.10.4" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz" + integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz" + integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + version "7.8.3" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz" + integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz" + integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + version "7.14.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz" + integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.7": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.7.tgz" + integrity sha512-7HmE7pk/Fmke45TODvxvkxRMV9RazV+ZZzhOL9AG8G29TLrr3jkjwF7uJfxZ30EoXpO+LJkq4oA8NjO2DTnEDg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.5.tgz" + integrity sha512-EcACl1i5fSQ6bt+YGuU/XGCeZKStLmyVGytWkpyhCLeQVA0eu6Wtiw92V+I1T/hnezUv7j74dA/Ro69gWcU+hg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.5.tgz" + integrity sha512-SPToJ5eYZLxlnp1UzdARpOGeC2GbHvr9d/UV0EukuVx8atktg194oe+C5BqQ8jRTkgLRVOPYeXRSBg1IlMoVRA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.6.tgz" + integrity sha512-58EgM6nuPNG6Py4Z3zSuu0xWu2VfodiMi72Jt5Kj2FECmaYk1RrTXA45z6KBFsu9tRgwQDwIiY4FXTt+YsSFAQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.5.tgz" + integrity sha512-GfqcFuGW8vnEqTUBM7UtPd5A4q797LTvvwKxXTgRsFjoqaJiEg9deBG6kWeQYkVEL569NpnmpC0Pkr/8BLKGnQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5", "@babel/plugin-transform-dotall-regex@^7.4.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.5.tgz" + integrity sha512-0MC3ppTB1AMxd8fXjSrbPa7LT9hrImt+/fcj+Pg5YMD7UQyWp/02+JWpdnCymmsXwIx5Z+sYn1bwCn4ZJNvhqQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.5.tgz" + integrity sha512-X4hhm7FRnPgd4nDA4b/5V280xCx6oL7Oob5+9qVS5C13Zq4bh1qq7LU0GgRU6b5dBWBvhGaXYVB4AcN6+ol6vg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-flow-strip-types@^7.16.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz" + integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-flow" "^7.22.5" + +"@babel/plugin-transform-for-of@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.5.tgz" + integrity sha512-3kxQjX1dU9uudwSshyLeEipvrLjBCVthCgeTp6CzE/9JYrlAIaeekVxRpCWsDDfYTfRZRoCeZatCQvwo+wvK8A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.5.tgz" + integrity sha512-DuCRB7fu8MyTLbEQd1ew3R85nx/88yMoqo2uPSjevMj3yoN7CDM8jkgrY0wmVxfJZyJ/B9fE1iq7EQppWQmR5A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.5.tgz" + integrity sha512-MQQOUW1KL8X0cDWfbwYP+TbVbZm16QmQXJQ+vndPtH/BoO0lOKpVoEDMI7+PskYxH+IiE0tS8xZye0qr1lGzSA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.5.tgz" + integrity sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.5.tgz" + integrity sha512-emtEpoaTMsOs6Tzz+nbmcePl6AKVtS1yC4YNAeMun9U8YCsgadPNxnOPQ8GhHFB2qdx+LZu9LgoC0Lthuu05DQ== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.5.tgz" + integrity sha512-6CF8g6z1dNYZ/VXok5uYkkBBICHZPiGEl7oDnAx2Mt1hlHVHOSIKWJaXHjQJA5VB43KZnXZDIexMchY4y2PGdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.5.tgz" + integrity sha512-NbslED1/6M+sXiwwtcAB/nieypGw02Ejf4KtDeMkCEpP6gWFMX1wI9WKYua+4oBneCCEmulOkRpwywypVZzs/g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.5.tgz" + integrity sha512-Kk3lyDmEslH9DnvCDA1s1kkd3YWQITiBOHngOtDL9Pt6BZjzqb6hiOlb8VfjiiQJ2unmegBqZu0rx5RxJb5vmQ== + dependencies: + "@babel/compat-data" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.5" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.5.tgz" + integrity sha512-pH8orJahy+hzZje5b8e2QIlBWQvGpelS76C63Z+jhZKsmzfNaPQ+LaW6dcJ9bxTpo1mtXbgHwy765Ro3jftmUg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.5", "@babel/plugin-transform-optional-chaining@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.6.tgz" + integrity sha512-Vd5HiWml0mDVtcLHIoEU5sw6HOUW/Zk0acLs/SAeuLzkGNOPc9DB4nkUajemhCmTIz3eiaKREZn2hQQqF79YTg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.5.tgz" + integrity sha512-AVkFUBurORBREOmHRKo06FjHYgjrabpdqRSwq6+C7R5iTCZOsM4QbcB27St0a4U6fffyAOqh3s/qEfybAhfivg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.5.tgz" + integrity sha512-/9xnaTTJcVoBtSSmrVyhtSvO3kbqS2ODoh2juEU72c3aYonNF0OMGiaz2gjukyKM2wBBYJP38S4JiE0Wfb5VMQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.12.1": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.16.0", "@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.14.9", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.5.tgz" + integrity sha512-rog5gZaVbUip5iWDMTYbVM15XQq+RkUKhET/IHR6oizR+JEoN6CAfTTuHcK4vwUyzca30qqHqEpzBOnaRMWYMA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.5.tgz" + integrity sha512-rR7KePOE7gfEtNTh9Qw+iO3Q/e4DEsoQ+hdvM6QUDH7JRJ5qxq5AA52ZzBWbI5i9lfNuvySgOGP8ZN7LAmaiPw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.1" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.16.4": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.7.tgz" + integrity sha512-o02xM7iY7mSPI+TvaYDH0aYl+lg3+KT7qrD705JlsB/GrZSNaYO/4i+aDFKPiJ7ubq3hgv8NNLCdyB5MFxT8mg== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.5.tgz" + integrity sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.5.tgz" + integrity sha512-biEmVg1IYB/raUO5wT1tgfacCef15Fbzhkx493D3urBI++6hpJ+RFG4SrWMn0NEZLfvilqKf3QDrRVZHo08FYg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.11.0", "@babel/preset-env@^7.12.1", "@babel/preset-env@^7.16.4": + version "7.22.7" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.7.tgz" + integrity sha512-1whfDtW+CzhETuzYXfcgZAh8/GFMeEbz0V5dVgya8YeJyCU6Y/P2Gnx4Qb3MylK68Zu9UiwUvbPMPTpFAOJ+sQ== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.5" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.5" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + "@babel/plugin-syntax-top-level-await" "^7.14.5" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.7" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.5" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.5" + "@babel/plugin-transform-classes" "^7.22.6" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.5" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.5" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.5" + "@babel/plugin-transform-for-of" "^7.22.5" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.5" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.5" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-modules-systemjs" "^7.22.5" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.5" + "@babel/plugin-transform-numeric-separator" "^7.22.5" + "@babel/plugin-transform-object-rest-spread" "^7.22.5" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.6" + "@babel/plugin-transform-parameters" "^7.22.5" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.5" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.5" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.5" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "^0.1.5" + "@babel/types" "^7.22.5" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + babel-plugin-polyfill-corejs2 "^0.4.4" + babel-plugin-polyfill-corejs3 "^0.8.2" + babel-plugin-polyfill-regenerator "^0.5.1" + core-js-compat "^3.31.0" + +"@babel/preset-modules@^0.1.5": + version "0.1.5" + resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz" + integrity sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/plugin-proposal-unicode-property-regex" "^7.4.4" + "@babel/plugin-transform-dotall-regex" "^7.4.4" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.12.5", "@babel/preset-react@^7.16.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.5.tgz" + integrity sha512-M+Is3WikOpEJHgR385HbuCITPTaPRaNkibTEa9oiofmJvIsrceb4yp9RL9Kb+TE8LznmeyZqpP+Lopwcx59xPQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.5" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.16.0": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.5.tgz" + integrity sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.5" + "@babel/plugin-transform-typescript" "^7.22.5" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.0.0", "@babel/runtime@^7.11.2", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.16.0", "@babel/runtime@^7.16.3", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.13", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.22.5", "@babel/runtime@^7.22.6", "@babel/runtime@^7.3.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.0", "@babel/runtime@^7.7.6", "@babel/runtime@^7.8.3", "@babel/runtime@^7.8.4", "@babel/runtime@^7.8.7", "@babel/runtime@^7.9.2": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz" + integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ== + dependencies: + regenerator-runtime "^0.13.11" + +"@babel/runtime@^7.22.10", "@babel/runtime@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.11.tgz" + integrity sha512-ee7jVNlWN09+KftVOu9n7S8gQzD/Z6hN/I8VBRXW4P1+Xe7kJGXMwu8vds4aGIMHZnNbdpSWCfZZtinytpcAvA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.22.15": + version "7.23.1" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.1.tgz" + integrity sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/runtime@^7.23.2": + version "7.23.2" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.2.tgz" + integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz" + integrity sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/parser" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/traverse@^7.22.5", "@babel/traverse@^7.22.6", "@babel/traverse@^7.22.8", "@babel/traverse@^7.7.2": + version "7.22.8" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.8.tgz" + integrity sha512-y6LPR+wpM2I3qJrsheCTwhIinzkETbplIgPBbwvqPKc+uljeA5gP+3nP8irdYt1mjQaDnlIcG+dw8OjAco4GXw== + dependencies: + "@babel/code-frame" "^7.22.5" + "@babel/generator" "^7.22.7" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.7" + "@babel/types" "^7.22.5" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.12.6", "@babel/types@^7.20.7", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.5.tgz" + integrity sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + to-fast-properties "^2.0.0" + +"@base2/pretty-print-object@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz" + integrity sha512-4iri8i1AqYHJE2DstZYkyEprg6Pq6sKx3xn5FpySk9sNhH7qN2LLlHJCfDTZRILNwQNPD7mATWM0TBui7uC1pA== + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@casl/ability@^3.0.0 || ^4.0.0 || ^5.1.0 || ^6.0.0", "@casl/ability@^6.5.0": + version "6.5.0" + resolved "https://registry.npmjs.org/@casl/ability/-/ability-6.5.0.tgz" + integrity sha512-3guc94ugr5ylZQIpJTLz0CDfwNi0mxKVECj1vJUPAvs+Lwunh/dcuUjwzc4MHM9D8JOYX0XUZMEPedpB3vIbOw== + dependencies: + "@ucast/mongo2js" "^1.3.0" + +"@casl/react@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@casl/react/-/react-3.1.0.tgz" + integrity sha512-p4Xmex1Slxz/G0cBtZik+xyOkeOynBUe0UrMFTai6aYkYOb4NyUy3w+9rtnedjcuKijiow2HKJQjnSurLxdc/g== + +"@csstools/normalize.css@*": + version "12.0.0" + resolved "https://registry.npmjs.org/@csstools/normalize.css/-/normalize.css-12.0.0.tgz" + integrity sha512-M0qqxAcwCsIVfpFQSlGN5XjXWu8l5JDZN+fPt1LeW5SZexQTgnaEvgXAY+CeygRw0EeppWHi12JxESWiWrB0Sg== + +"@csstools/postcss-cascade-layers@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-cascade-layers/-/postcss-cascade-layers-1.1.1.tgz" + integrity sha512-+KdYrpKC5TgomQr2DlZF4lDEpHcoxnj5IGddYYfBWJAKfj1JtuHUIqMa+E1pJJ+z3kvDViWMqyqPlG4Ja7amQA== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-color-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-color-function/-/postcss-color-function-1.1.1.tgz" + integrity sha512-Bc0f62WmHdtRDjf5f3e2STwRAl89N2CLb+9iAwzrv4L2hncrbDwnQD9PCq0gtAt7pOI2leIV08HIBUd4jxD8cw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-font-format-keywords@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-font-format-keywords/-/postcss-font-format-keywords-1.0.1.tgz" + integrity sha512-ZgrlzuUAjXIOc2JueK0X5sZDjCtgimVp/O5CEqTcs5ShWBa6smhWYbS0x5cVc/+rycTDbjjzoP0KTDnUneZGOg== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-hwb-function@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-hwb-function/-/postcss-hwb-function-1.0.2.tgz" + integrity sha512-YHdEru4o3Rsbjmu6vHy4UKOXZD+Rn2zmkAmLRfPet6+Jz4Ojw8cbWxe1n42VaXQhD3CQUXXTooIy8OkVbUcL+w== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-ic-unit@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-ic-unit/-/postcss-ic-unit-1.0.1.tgz" + integrity sha512-Ot1rcwRAaRHNKC9tAqoqNZhjdYBzKk1POgWfhN4uCOE47ebGcLRqXjKkApVDpjifL6u2/55ekkpnFcp+s/OZUw== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-is-pseudo-class@^2.0.7": + version "2.0.7" + resolved "https://registry.npmjs.org/@csstools/postcss-is-pseudo-class/-/postcss-is-pseudo-class-2.0.7.tgz" + integrity sha512-7JPeVVZHd+jxYdULl87lvjgvWldYu+Bc62s9vD/ED6/QTGjy0jy0US/f6BG53sVMTBJ1lzKZFpYmofBN9eaRiA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +"@csstools/postcss-nested-calc@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-nested-calc/-/postcss-nested-calc-1.0.0.tgz" + integrity sha512-JCsQsw1wjYwv1bJmgjKSoZNvf7R6+wuHDAbi5f/7MbFhl2d/+v+TvBTU4BJH3G1X1H87dHl0mh6TfYogbT/dJQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-normalize-display-values@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-normalize-display-values/-/postcss-normalize-display-values-1.0.1.tgz" + integrity sha512-jcOanIbv55OFKQ3sYeFD/T0Ti7AMXc9nM1hZWu8m/2722gOTxFg7xYu4RDLJLeZmPUVQlGzo4jhzvTUq3x4ZUw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-oklab-function@^1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@csstools/postcss-oklab-function/-/postcss-oklab-function-1.1.1.tgz" + integrity sha512-nJpJgsdA3dA9y5pgyb/UfEzE7W5Ka7u0CX0/HIMVBNWzWemdcTH3XwANECU6anWv/ao4vVNLTMxhiPNZsTK6iA== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +"@csstools/postcss-progressive-custom-properties@^1.1.0", "@csstools/postcss-progressive-custom-properties@^1.3.0": + version "1.3.0" + resolved "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz" + integrity sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-stepped-value-functions@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@csstools/postcss-stepped-value-functions/-/postcss-stepped-value-functions-1.0.1.tgz" + integrity sha512-dz0LNoo3ijpTOQqEJLY8nyaapl6umbmDcgj4AD0lgVQ572b2eqA1iGZYTTWhrcrHztWDDRAX2DGYyw2VBjvCvQ== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-text-decoration-shorthand@^1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@csstools/postcss-text-decoration-shorthand/-/postcss-text-decoration-shorthand-1.0.0.tgz" + integrity sha512-c1XwKJ2eMIWrzQenN0XbcfzckOLLJiczqy+YvfGmzoVXd7pT9FfObiSEfzs84bpE/VqfpEuAZ9tCRbZkZxxbdw== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-trigonometric-functions@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-trigonometric-functions/-/postcss-trigonometric-functions-1.0.2.tgz" + integrity sha512-woKaLO///4bb+zZC2s80l+7cm07M7268MsyG3M0ActXXEFi6SuhvriQYcb58iiKGbjwwIU7n45iRLEHypB47Og== + dependencies: + postcss-value-parser "^4.2.0" + +"@csstools/postcss-unset-value@^1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@csstools/postcss-unset-value/-/postcss-unset-value-1.0.2.tgz" + integrity sha512-c8J4roPBILnelAsdLr4XOAR/GsTm0GJi4XpcfvoWk3U6KiTCqiFYc63KhRMQQX35jYMp4Ao8Ij9+IZRgMfJp1g== + +"@csstools/selector-specificity@^2.0.0", "@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + +"@ctrl/tinycolor@^3.4.0": + version "3.6.0" + resolved "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.0.tgz" + integrity sha512-/Z3l6pXthq0JvMYdUFyX9j0MaCltlIn6mfh9jLyQwg5aPKxkyNa0PTHtU1AlFXLNk55ZuAeJRcpvq+tmLfKmaQ== + +"@date-io/core@1.x": + version "1.3.13" + resolved "https://registry.npmjs.org/@date-io/core/-/core-1.3.13.tgz" + integrity sha512-AlEKV7TxjeK+jxWVKcCFrfYAk8spX9aCyiToFIiLPtfQbsjmRGLIhb5VZgptQcJdHtLXo7+m0DuurwFgUToQuA== + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.2.0" + +"@emotion/cache@^11.10.3", "@emotion/cache@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.1.0", "@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/react@^11.0.0-rc.0", "@emotion/react@^11.10.4", "@emotion/react@^11.4.1", "@emotion/react@^11.5.0", "@emotion/react@^11.9.0": + version "11.11.1" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.10.4", "@emotion/styled@^11.3.0", "@emotion/styled@^11.8.1": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0": + version "4.5.1" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz" + integrity sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ== + +"@eslint/eslintrc@^2.1.0": + version "2.1.0" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz" + integrity sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A== + dependencies: + ajv "^6.12.4" + debug "^4.3.2" + espree "^9.6.0" + globals "^13.19.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.1.0" + minimatch "^3.1.2" + strip-json-comments "^3.1.1" + +"@eslint/js@8.44.0": + version "8.44.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz" + integrity sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw== + +"@floating-ui/core@^1.4.2": + version "1.5.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.0.tgz" + integrity sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg== + dependencies: + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/dom@^1.5.1": + version "1.5.3" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz" + integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== + dependencies: + "@floating-ui/core" "^1.4.2" + "@floating-ui/utils" "^0.1.3" + +"@floating-ui/react-dom@^2.0.1", "@floating-ui/react-dom@^2.0.2": + version "2.0.2" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/react@^0.24.8": + version "0.24.8" + resolved "https://registry.npmjs.org/@floating-ui/react/-/react-0.24.8.tgz" + integrity sha512-AuYeDoaR8jtUlUXtZ1IJ/6jtBkGnSpJXbGNzokBL87VDJ8opMq1Bgrc0szhK482ReQY6KZsMoZCVSb4xwalkBA== + dependencies: + "@floating-ui/react-dom" "^2.0.1" + aria-hidden "^1.2.3" + tabbable "^6.0.1" + +"@floating-ui/utils@^0.1.3": + version "0.1.4" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.4.tgz" + integrity sha512-qprfWkn82Iw821mcKofJ5Pk9wgioHicxcQMxx+5zt5GSKoqdWvgG5AxVmpmUUjzTLPVSH5auBrhI93Deayn/DA== + +"@formatjs/ecma402-abstract@1.17.2": + version "1.17.2" + resolved "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-1.17.2.tgz" + integrity sha512-k2mTh0m+IV1HRdU0xXM617tSQTi53tVR2muvYOsBeYcUgEAyxV1FOC7Qj279th3fBVQ+Dj6muvNJZcHSPNdbKg== + dependencies: + "@formatjs/intl-localematcher" "0.4.2" + tslib "^2.4.0" + +"@formatjs/fast-memoize@2.2.0": + version "2.2.0" + resolved "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.0.tgz" + integrity sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA== + dependencies: + tslib "^2.4.0" + +"@formatjs/icu-messageformat-parser@2.6.2": + version "2.6.2" + resolved "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.6.2.tgz" + integrity sha512-nF/Iww7sc5h+1MBCDRm68qpHTCG4xvGzYs/x9HFcDETSGScaJ1Fcadk5U/NXjXeCtzD+DhN4BAwKFVclHfKMdA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/icu-skeleton-parser" "1.6.2" + tslib "^2.4.0" + +"@formatjs/icu-skeleton-parser@1.6.2": + version "1.6.2" + resolved "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.6.2.tgz" + integrity sha512-VtB9Slo4ZL6QgtDFJ8Injvscf0xiDd4bIV93SOJTBjUF4xe2nAWOoSjLEtqIG+hlIs1sNrVKAaFo3nuTI4r5ZA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + tslib "^2.4.0" + +"@formatjs/intl-displaynames@6.5.2": + version "6.5.2" + resolved "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-6.5.2.tgz" + integrity sha512-uC2VBlz+WydGTDDpJwMTQuPH3CUpTricr91WH1QMfz5oEHg2sB7mUERcZONE/lu8MOe1jREIx4vBciZEVTqkmA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/intl-localematcher" "0.4.2" + tslib "^2.4.0" + +"@formatjs/intl-listformat@7.4.2": + version "7.4.2" + resolved "https://registry.npmjs.org/@formatjs/intl-listformat/-/intl-listformat-7.4.2.tgz" + integrity sha512-+6bSVudEQkf12Hh7kuKt8Xv/MyFlqdwA4V4NLnTZW8uYdF9RxlOELDD0rPaOc2++TMKIzI5o6XXwHPvpL6VrPA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/intl-localematcher" "0.4.2" + tslib "^2.4.0" + +"@formatjs/intl-localematcher@0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.4.2.tgz" + integrity sha512-BGdtJFmaNJy5An/Zan4OId/yR9Ih1OojFjcduX/xOvq798OgWSyDtd6Qd5jqJXwJs1ipe4Fxu9+cshic5Ox2tA== + dependencies: + tslib "^2.4.0" + +"@formatjs/intl@2.9.3": + version "2.9.3" + resolved "https://registry.npmjs.org/@formatjs/intl/-/intl-2.9.3.tgz" + integrity sha512-hclPdyCF1zk2XmhgdXfl5Sd30QEdRBnIijH7Vc1AWz2K0/saVRrxuL3UYn+m3xEyfOa4yDbTWVbmXDL0XEzlsQ== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/fast-memoize" "2.2.0" + "@formatjs/icu-messageformat-parser" "2.6.2" + "@formatjs/intl-displaynames" "6.5.2" + "@formatjs/intl-listformat" "7.4.2" + intl-messageformat "10.5.3" + tslib "^2.4.0" + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + dependencies: + camelcase "^5.3.1" + find-up "^4.1.0" + get-package-type "^0.1.0" + js-yaml "^3.13.1" + resolve-from "^5.0.0" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/console/-/console-27.5.1.tgz" + integrity sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + +"@jest/console@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/console/-/console-28.1.3.tgz" + integrity sha512-QPAkP5EwKdK/bxIr6C1I4Vs0rm2nHiANzj/Z5X2JQkrZo6IqvC4ldZ9K95tF0HdidhA8Bo6egxSzUFPYKcEXLw== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^28.1.3" + jest-util "^28.1.3" + slash "^3.0.0" + +"@jest/core@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/core/-/core-27.5.1.tgz" + integrity sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/reporters" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.8.1" + exit "^0.1.2" + graceful-fs "^4.2.9" + jest-changed-files "^27.5.1" + jest-config "^27.5.1" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-resolve-dependencies "^27.5.1" + jest-runner "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + jest-watcher "^27.5.1" + micromatch "^4.0.4" + rimraf "^3.0.0" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-27.5.1.tgz" + integrity sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA== + dependencies: + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + +"@jest/expect-utils@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.1.tgz" + integrity sha512-o319vIf5pEMx0LmzSxxkYYxo4wrRLKHq9dP1yJU7FoPTB0LfAKSz8SWD6D/6U3v/O52t9cF5t+MeJiRsfk7zMw== + dependencies: + jest-get-type "^29.4.3" + +"@jest/fake-timers@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-27.5.1.tgz" + integrity sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ== + dependencies: + "@jest/types" "^27.5.1" + "@sinonjs/fake-timers" "^8.0.1" + "@types/node" "*" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +"@jest/globals@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-27.5.1.tgz" + integrity sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/types" "^27.5.1" + expect "^27.5.1" + +"@jest/reporters@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-27.5.1.tgz" + integrity sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + collect-v8-coverage "^1.0.0" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.2.9" + istanbul-lib-coverage "^3.0.0" + istanbul-lib-instrument "^5.1.0" + istanbul-lib-report "^3.0.0" + istanbul-lib-source-maps "^4.0.0" + istanbul-reports "^3.1.3" + jest-haste-map "^27.5.1" + jest-resolve "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + slash "^3.0.0" + source-map "^0.6.0" + string-length "^4.0.1" + terminal-link "^2.0.0" + v8-to-istanbul "^8.1.0" + +"@jest/schemas@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-28.1.3.tgz" + integrity sha512-/l/VWsdt/aBXgjshLWOFyFt3IVdYypu5y2Wn2rOO1un6nkqIn8SLXzgIMYXFyYsRWDyF5EthmKJMIdJvk08grg== + dependencies: + "@sinclair/typebox" "^0.24.1" + +"@jest/schemas@^29.6.0": + version "29.6.0" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.0.tgz" + integrity sha512-rxLjXyJBTL4LQeJW3aKo0M/+GkCOXsO+8i9Iu7eDb6KwtP65ayoDsitrdPBtujxQ88k4wI2FNYfa6TOGwSn6cQ== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-27.5.1.tgz" + integrity sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg== + dependencies: + callsites "^3.0.0" + graceful-fs "^4.2.9" + source-map "^0.6.0" + +"@jest/test-result@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-27.5.1.tgz" + integrity sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag== + dependencies: + "@jest/console" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-result@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-28.1.3.tgz" + integrity sha512-kZAkxnSE+FqE8YjW8gNuoVkkC9I7S1qmenl8sGcDOLropASP+BkcGKwhXoyqQuGOGeYY0y/ixjrd/iERpEXHNg== + dependencies: + "@jest/console" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-27.5.1.tgz" + integrity sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ== + dependencies: + "@jest/test-result" "^27.5.1" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-runtime "^27.5.1" + +"@jest/transform@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-27.5.1.tgz" + integrity sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw== + dependencies: + "@babel/core" "^7.1.0" + "@jest/types" "^27.5.1" + babel-plugin-istanbul "^6.1.1" + chalk "^4.0.0" + convert-source-map "^1.4.0" + fast-json-stable-stringify "^2.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-regex-util "^27.5.1" + jest-util "^27.5.1" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + source-map "^0.6.1" + write-file-atomic "^3.0.0" + +"@jest/types@^27.5.1": + version "27.5.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-27.5.1.tgz" + integrity sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^16.0.0" + chalk "^4.0.0" + +"@jest/types@^28.1.3": + version "28.1.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-28.1.3.tgz" + integrity sha512-RyjiyMUZrKz/c+zlMFO1pm70DcIlST8AeWTkoUdZevew44wcNZQHsEVOiCVtgVnlFFD82FPaXycys58cf2muVQ== + dependencies: + "@jest/schemas" "^28.1.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jest/types@^29.6.1": + version "29.6.1" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.1.tgz" + integrity sha512-tPKQNMPuXgvdOn2/Lg9HNfUvjYVGolt04Hp03f5hAk878uwOLikN+JzeLY0HcVgKgFl9Hs3EIqpu3WX27XNhnw== + dependencies: + "@jest/schemas" "^29.6.0" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz" + integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + 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== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/sourcemap-codec@1.4.14": + version "1.4.14" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz" + integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw== + +"@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.18" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz" + integrity sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA== + dependencies: + "@jridgewell/resolve-uri" "3.1.0" + "@jridgewell/sourcemap-codec" "1.4.14" + +"@juggle/resize-observer@^3.3.1": + version "3.4.0" + resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz" + integrity sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA== + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@mantine/core@^7.0.2": + version "7.0.2" + resolved "https://registry.npmjs.org/@mantine/core/-/core-7.0.2.tgz" + integrity sha512-aJodq48NE4FAgpzimPtT0Izr/dqhXkBwCDOYxgTTe+LpNwTzEJqBfZeysB2B3Aobr7MaEWPvvyUi3Uu9qL5y0g== + dependencies: + "@floating-ui/react" "^0.24.8" + clsx "2.0.0" + react-number-format "^5.2.2" + react-remove-scroll "^2.5.6" + react-textarea-autosize "8.5.2" + type-fest "^3.13.1" + +"@material-ui/pickers@^3.3.10": + version "3.3.10" + resolved "https://registry.npmjs.org/@material-ui/pickers/-/pickers-3.3.10.tgz" + integrity sha512-hS4pxwn1ZGXVkmgD4tpFpaumUaAg2ZzbTrxltfC5yPw4BJV+mGkfnQOB4VpWEYZw2jv65Z0wLwDE/piQiPPZ3w== + dependencies: + "@babel/runtime" "^7.6.0" + "@date-io/core" "1.x" + "@types/styled-jsx" "^2.2.8" + clsx "^1.0.2" + react-transition-group "^4.0.0" + rifm "^0.7.0" + +"@motionone/animation@^10.15.1": + version "10.15.1" + resolved "https://registry.npmjs.org/@motionone/animation/-/animation-10.15.1.tgz" + integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ== + dependencies: + "@motionone/easing" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/dom@^10.15.3": + version "10.16.2" + resolved "https://registry.npmjs.org/@motionone/dom/-/dom-10.16.2.tgz" + integrity sha512-bnuHdNbge1FutZXv+k7xub9oPWcF0hsu8y1HTH/qg6av58YI0VufZ3ngfC7p2xhMJMnoh0LXFma2EGTgPeCkeg== + dependencies: + "@motionone/animation" "^10.15.1" + "@motionone/generators" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.15.1": + version "10.15.1" + resolved "https://registry.npmjs.org/@motionone/easing/-/easing-10.15.1.tgz" + integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw== + dependencies: + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/generators@^10.15.1": + version "10.15.1" + resolved "https://registry.npmjs.org/@motionone/generators/-/generators-10.15.1.tgz" + integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ== + dependencies: + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/types@^10.15.1": + version "10.15.1" + resolved "https://registry.npmjs.org/@motionone/types/-/types-10.15.1.tgz" + integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA== + +"@motionone/utils@^10.15.1": + version "10.15.1" + resolved "https://registry.npmjs.org/@motionone/utils/-/utils-10.15.1.tgz" + integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw== + dependencies: + "@motionone/types" "^10.15.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@mui/base@^5.0.0-beta.22": + version "5.0.0-beta.23" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.23.tgz" + integrity sha512-9L8SQUGAWtd/Qi7Qem26+oSSgpY7f2iQTuvcz/rsGpyZjSomMMO6lwYeQSA0CpWM7+aN7eGoSY/WV6wxJiIxXw== + dependencies: + "@babel/runtime" "^7.23.2" + "@floating-ui/react-dom" "^2.0.2" + "@mui/types" "^7.2.8" + "@mui/utils" "^5.14.17" + "@popperjs/core" "^2.11.8" + clsx "^2.0.0" + prop-types "^15.8.1" + +"@mui/base@5.0.0-beta.10": + version "5.0.0-beta.10" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.10.tgz" + integrity sha512-moTAhGwFfQffj7hsu61FnqcGqVcd53A1CrOhnskM9TF0Uh2rnLDMCuar4JRUWWpaJofAfQEbQBBFPadFQLI4PA== + dependencies: + "@babel/runtime" "^7.22.6" + "@emotion/is-prop-valid" "^1.2.1" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.4" + "@popperjs/core" "^2.11.8" + clsx "^2.0.0" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/base@5.0.0-beta.17": + version "5.0.0-beta.17" + resolved "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.17.tgz" + integrity sha512-xNbk7iOXrglNdIxFBN0k3ySsPIFLWCnFxqsAYl7CIcDkD9low4kJ7IUuy6ctwx/HAy2fenrT3KXHr1sGjAMgpQ== + dependencies: + "@babel/runtime" "^7.22.15" + "@floating-ui/react-dom" "^2.0.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.11" + "@popperjs/core" "^2.11.8" + clsx "^2.0.0" + prop-types "^15.8.1" + +"@mui/core-downloads-tracker@^5.14.11": + version "5.14.11" + resolved "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.14.11.tgz" + integrity sha512-uY8FLQURhXe3f3O4dS5OSGML9KDm9+IE226cBu78jarVIzdQGPlXwGIlSI9VJR8MvZDA6C0+6XfWDhWCHruC5Q== + +"@mui/core@^5.0.0-alpha.54": + version "5.0.0-alpha.54" + resolved "https://registry.npmjs.org/@mui/core/-/core-5.0.0-alpha.54.tgz" + integrity sha512-8TxdHqDdSb6wjhsnpE5n7qtkFKDG3PUSlVY0gR3VcdsHXscUY13l3VbMQW1brI4D/R9zx5VYmxIHWaHFgw4RtA== + dependencies: + "@babel/runtime" "^7.16.0" + "@emotion/is-prop-valid" "^1.1.0" + "@mui/utils" "^5.1.0" + "@popperjs/core" "^2.4.4" + clsx "^1.1.1" + prop-types "^15.7.2" + react-is "^17.0.2" + +"@mui/icons-material@^5.0.0", "@mui/icons-material@^5.14.1": + version "5.14.3" + resolved "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.14.3.tgz" + integrity sha512-XkxWPhageu1OPUm2LWjo5XqeQ0t2xfGe8EiLkRW9oz2LHMMZmijvCxulhgquUVTF1DnoSh+3KoDLSsoAFtVNVw== + dependencies: + "@babel/runtime" "^7.22.6" + +"@mui/lab@^5.0.0-alpha.139": + version "5.0.0-alpha.139" + resolved "https://registry.npmjs.org/@mui/lab/-/lab-5.0.0-alpha.139.tgz" + integrity sha512-YlKKELtGZEpd3Hj9cUo6ekwB6RSDzGBw+LlaCBntudhVb4aRn5mQYFej3BYn6fOYz5335jkTgvBt0sEwlSo4qA== + dependencies: + "@babel/runtime" "^7.22.6" + "@mui/base" "5.0.0-beta.10" + "@mui/system" "^5.14.4" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.4" + clsx "^2.0.0" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/material@^5.0.0", "@mui/material@^5.0.1", "@mui/material@^5.14.11", "@mui/material@^5.4.1", "@mui/material@^5.8.6": + version "5.14.11" + resolved "https://registry.npmjs.org/@mui/material/-/material-5.14.11.tgz" + integrity sha512-DnSdJzcR7lwG12JA5L2t8JF+RDzMygu5rCNW+logWb/KW2/TRzwLyVWO+CorHTBjBRd38DBxnwOCDiYkDd+N3A== + dependencies: + "@babel/runtime" "^7.22.15" + "@mui/base" "5.0.0-beta.17" + "@mui/core-downloads-tracker" "^5.14.11" + "@mui/system" "^5.14.11" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.11" + "@types/react-transition-group" "^4.4.6" + clsx "^2.0.0" + csstype "^3.1.2" + prop-types "^15.8.1" + react-is "^18.2.0" + react-transition-group "^4.4.5" + +"@mui/private-theming@^5.14.11": + version "5.14.11" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.11.tgz" + integrity sha512-MSnNNzTu9pfKLCKs1ZAKwOTgE4bz+fQA0fNr8Jm7NDmuWmw0CaN9Vq2/MHsatE7+S0A25IAKby46Uv1u53rKVQ== + dependencies: + "@babel/runtime" "^7.22.15" + "@mui/utils" "^5.14.11" + prop-types "^15.8.1" + +"@mui/private-theming@^5.14.15": + version "5.14.15" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.15.tgz" + integrity sha512-V2Xh+Tu6A07NoSpup0P9m29GwvNMYl5DegsGWqlOTJyAV7cuuVjmVPqxgvL8xBng4R85xqIQJRMjtYYktoPNuQ== + dependencies: + "@babel/runtime" "^7.23.2" + "@mui/utils" "^5.14.15" + prop-types "^15.8.1" + +"@mui/private-theming@^5.14.4": + version "5.14.4" + resolved "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.14.4.tgz" + integrity sha512-ISXsHDiQ3z1XA4IuKn+iXDWvDjcz/UcQBiFZqtdoIsEBt8CB7wgdQf3LwcwqO81dl5ofg/vNQBEnXuKfZHrnYA== + dependencies: + "@babel/runtime" "^7.22.6" + "@mui/utils" "^5.14.4" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.13.2": + version "5.13.2" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.13.2.tgz" + integrity sha512-VCYCU6xVtXOrIN8lcbuPmoG+u7FYuOERG++fpY74hPpEWkyFQG97F+/XfTQVYzlR2m7nPjnwVUgATcTCMEaMvw== + dependencies: + "@babel/runtime" "^7.21.0" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/styled-engine@^5.14.11": + version "5.14.11" + resolved "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.14.11.tgz" + integrity sha512-jdUlqRgTYQ8RMtPX4MbRZqar6W2OiIb6J5KEFbIu4FqvPrk44Each4ppg/LAqp1qNlBYq5i+7Q10MYLMpDxX9A== + dependencies: + "@babel/runtime" "^7.22.15" + "@emotion/cache" "^11.11.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/styles@^5.14.15": + version "5.14.15" + resolved "https://registry.npmjs.org/@mui/styles/-/styles-5.14.15.tgz" + integrity sha512-ljjnL5HMGM5jhL/8ij4HPu65DsvIg2yDwHP58sNcS87FR+niI+UVxgV/3a/HJWC6qPyBO5LBHW3uahmCobr5Rw== + dependencies: + "@babel/runtime" "^7.23.2" + "@emotion/hash" "^0.9.1" + "@mui/private-theming" "^5.14.15" + "@mui/types" "^7.2.7" + "@mui/utils" "^5.14.15" + clsx "^2.0.0" + csstype "^3.1.2" + hoist-non-react-statics "^3.3.2" + jss "^10.10.0" + jss-plugin-camel-case "^10.10.0" + jss-plugin-default-unit "^10.10.0" + jss-plugin-global "^10.10.0" + jss-plugin-nested "^10.10.0" + jss-plugin-props-sort "^10.10.0" + jss-plugin-rule-value-function "^10.10.0" + jss-plugin-vendor-prefixer "^10.10.0" + prop-types "^15.8.1" + +"@mui/system@^5.14.11", "@mui/system@^5.4.1", "@mui/system@^5.8.0": + version "5.14.11" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.11.tgz" + integrity sha512-yl8xV+y0k7j6dzBsHabKwoShmjqLa8kTxrhUI3JpqLG358VRVMJRW/ES0HhvfcCi4IVXde+Tc2P3K1akGL8zoA== + dependencies: + "@babel/runtime" "^7.22.15" + "@mui/private-theming" "^5.14.11" + "@mui/styled-engine" "^5.14.11" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.11" + clsx "^2.0.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/system@^5.14.4": + version "5.14.4" + resolved "https://registry.npmjs.org/@mui/system/-/system-5.14.4.tgz" + integrity sha512-oPgfWS97QNfHcDBapdkZIs4G5i85BJt69Hp6wbXF6s7vi3Evcmhdk8AbCRW6n0sX4vTj8oe0mh0RIm1G2A1KDA== + dependencies: + "@babel/runtime" "^7.22.6" + "@mui/private-theming" "^5.14.4" + "@mui/styled-engine" "^5.13.2" + "@mui/types" "^7.2.4" + "@mui/utils" "^5.14.4" + clsx "^2.0.0" + csstype "^3.1.2" + prop-types "^15.8.1" + +"@mui/types@^7.2.4": + version "7.2.4" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz" + integrity sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA== + +"@mui/types@^7.2.7": + version "7.2.7" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.7.tgz" + integrity sha512-sofpWmcBqOlTzRbr1cLQuUDKaUYVZTw8ENQrtL39TECRNENEzwgnNPh6WMfqMZlMvf1Aj9DLg74XPjnLr0izUQ== + +"@mui/types@^7.2.8": + version "7.2.8" + resolved "https://registry.npmjs.org/@mui/types/-/types-7.2.8.tgz" + integrity sha512-9u0ji+xspl96WPqvrYJF/iO+1tQ1L5GTaDOeG3vCR893yy7VcWwRNiVMmPdPNpMDqx0WV1wtEW9OMwK9acWJzQ== + +"@mui/utils@^5.1.0": + version "5.13.7" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.13.7.tgz" + integrity sha512-/3BLptG/q0u36eYED7Nhf4fKXmcKb6LjjT7ZMwhZIZSdSxVqDqSTmATW3a56n3KEPQUXCU9TpxAfCBQhs6brVA== + dependencies: + "@babel/runtime" "^7.22.5" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^18.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/utils@^5.14.11": + version "5.14.11" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.11.tgz" + integrity sha512-fmkIiCPKyDssYrJ5qk+dime1nlO3dmWfCtaPY/uVBqCRMBZ11JhddB9m8sjI2mgqQQwRJG5bq3biaosNdU/s4Q== + dependencies: + "@babel/runtime" "^7.22.15" + "@types/prop-types" "^15.7.5" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/utils@^5.14.15": + version "5.14.15" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.15.tgz" + integrity sha512-QBfHovAvTa0J1jXuYDaXGk+Yyp7+Fm8GSqx6nK2JbezGqzCFfirNdop/+bL9Flh/OQ/64PeXcW4HGDdOge+n3A== + dependencies: + "@babel/runtime" "^7.23.2" + "@types/prop-types" "^15.7.8" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/utils@^5.14.16", "@mui/utils@^5.14.17": + version "5.14.17" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.17.tgz" + integrity sha512-yxnWgSS4J6DMFPw2Dof85yBkG02VTbEiqsikymMsnZnXDurtVGTIhlNuV24GTmFTuJMzEyTTU9UF+O7zaL8LEQ== + dependencies: + "@babel/runtime" "^7.23.2" + "@types/prop-types" "^15.7.9" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/utils@^5.14.4": + version "5.14.4" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.4.tgz" + integrity sha512-4ANV0txPD3x0IcTCSEHKDWnsutg1K3m6Vz5IckkbLXVYu17oOZCVUdOKsb/txUmaCd0v0PmSRe5PW+Mlvns5dQ== + dependencies: + "@babel/runtime" "^7.22.6" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^18.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/utils@^5.14.5": + version "5.14.6" + resolved "https://registry.npmjs.org/@mui/utils/-/utils-5.14.6.tgz" + integrity sha512-AznpqLu6hrFnpHgcvsSSMCG+cDbkcCYfo+daUwBVReNYv4l+NQ8+wvBAF4aUMi155N7xWbbgh0cyKs6Wdsm3aA== + dependencies: + "@babel/runtime" "^7.22.10" + "@types/prop-types" "^15.7.5" + "@types/react-is" "^18.2.1" + prop-types "^15.8.1" + react-is "^18.2.0" + +"@mui/x-data-grid@^6.11.1": + version "6.12.0" + resolved "https://registry.npmjs.org/@mui/x-data-grid/-/x-data-grid-6.12.0.tgz" + integrity sha512-ZuQ8Uq/dF6gjrE/qU6VvP3tgy9n78DdCMD6hbXy/uDIoddJ4J8hSn9S6flnFnFQbRZzF/Q/pPWXZTR4oeg8NQg== + dependencies: + "@babel/runtime" "^7.22.11" + "@mui/utils" "^5.14.5" + clsx "^2.0.0" + prop-types "^15.8.1" + reselect "^4.1.8" + +"@mui/x-date-pickers@^6.18.0": + version "6.18.0" + resolved "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.0.tgz" + integrity sha512-y4UlkHQXiNRfb6FWQ/GWir0sZ+9kL+GEEZssG+XWP3KJ+d3lONRteusl4AJkYJBdIAOh+5LnMV9RAQKq9Sl7yw== + dependencies: + "@babel/runtime" "^7.23.2" + "@mui/base" "^5.0.0-beta.22" + "@mui/utils" "^5.14.16" + "@types/react-transition-group" "^4.4.8" + clsx "^2.0.0" + prop-types "^15.8.1" + react-transition-group "^4.4.5" + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + version "5.1.1-v1" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz" + integrity sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg== + dependencies: + eslint-scope "5.1.1" + +"@nicolo-ribaudo/semver-v6@^6.3.3": + version "6.3.3" + resolved "https://registry.npmjs.org/@nicolo-ribaudo/semver-v6/-/semver-v6-6.3.3.tgz" + integrity sha512-3Yc1fUTs69MG/uZbJlLSI3JISMn2UV2rg+1D/vROUqZyh3l6iYHCs7GMp+M40ZD7yOdDbYjJcU1oTJhrc+dGKg== + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.3": + version "0.5.10" + resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz" + integrity sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@popperjs/core@^2.11.8", "@popperjs/core@^2.4.4": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@reduxjs/toolkit@^1.8.5": + version "1.9.5" + resolved "https://registry.npmjs.org/@reduxjs/toolkit/-/toolkit-1.9.5.tgz" + integrity sha512-Rt97jHmfTeaxL4swLRNPD/zV4OxTes4la07Xc4hetpUW/vc75t5m1ANyxG6ymnEQ2FsLQsoMlYB2vV1sO3m8tQ== + dependencies: + immer "^9.0.21" + redux "^4.2.1" + redux-thunk "^2.4.2" + reselect "^4.1.8" + +"@remix-run/router@1.7.1": + version "1.7.1" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.7.1.tgz" + integrity sha512-bgVQM4ZJ2u2CM8k1ey70o1ePFXsEzYVZoWghh6WjM8p59jQ7HxzbHW4SbnWFG7V9ig9chLawQxDTZ3xzOF8MkQ== + +"@rollup/plugin-babel@^5.2.0": + version "5.3.1" + resolved "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz" + integrity sha512-WFfdLWU/xVWKeRQnKmIAQULUI7Il0gZnBIH/ZFO069wYIfPu+8zrfp/KMW0atmELoRDq8FbiP3VCss9MhCut7Q== + dependencies: + "@babel/helper-module-imports" "^7.10.4" + "@rollup/pluginutils" "^3.1.0" + +"@rollup/plugin-node-resolve@^11.2.1": + version "11.2.1" + resolved "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-11.2.1.tgz" + integrity sha512-yc2n43jcqVyGE2sqV5/YCmocy9ArjVAP/BeXyTtADTBBX6V0e5UMqwO8CdQ0kzjb6zu5P1qMzsScCMRvE9OlVg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + "@types/resolve" "1.17.1" + builtin-modules "^3.1.0" + deepmerge "^4.2.2" + is-module "^1.0.0" + resolve "^1.19.0" + +"@rollup/plugin-replace@^2.4.1": + version "2.4.2" + resolved "https://registry.npmjs.org/@rollup/plugin-replace/-/plugin-replace-2.4.2.tgz" + integrity sha512-IGcu+cydlUMZ5En85jxHH4qj2hta/11BHq95iHEyb2sbgiN0eCdzvUcHw5gt9pBL5lTi4JDYJ1acCoMGpTvEZg== + dependencies: + "@rollup/pluginutils" "^3.1.0" + magic-string "^0.25.7" + +"@rollup/pluginutils@^3.1.0": + version "3.1.0" + resolved "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-3.1.0.tgz" + integrity sha512-GksZ6pr6TpIjHm8h9lSQ8pi8BE9VeubNT0OMJ3B5uZJ8pz73NPiqOtCog/x2/QzM1ENChPKxMDhiQuRHsqc+lg== + dependencies: + "@types/estree" "0.0.39" + estree-walker "^1.0.1" + picomatch "^2.2.2" + +"@rushstack/eslint-patch@^1.1.0": + version "1.3.2" + resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.3.2.tgz" + integrity sha512-V+MvGwaHH03hYhY+k6Ef/xKd6RYlc4q8WBx+2ANmipHJcKuktNcI/NgEsJgdSUF6Lw32njT6OnrRsKYCdgHjYw== + +"@sinclair/typebox@^0.24.1": + version "0.24.51" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz" + integrity sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^1.7.0": + version "1.8.6" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.8.6.tgz" + integrity sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^8.0.1": + version "8.1.0" + resolved "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-8.1.0.tgz" + integrity sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg== + dependencies: + "@sinonjs/commons" "^1.7.0" + +"@surma/rollup-plugin-off-main-thread@^2.2.3": + version "2.2.3" + resolved "https://registry.npmjs.org/@surma/rollup-plugin-off-main-thread/-/rollup-plugin-off-main-thread-2.2.3.tgz" + integrity sha512-lR8q/9W7hZpMWweNiAKU7NQerBnzQQLvi8qnTDU/fxItPhtZVMbPV3lbCwjhIlNBe9Bbr5V+KHshvWmVSG9cxQ== + dependencies: + ejs "^3.1.6" + json5 "^2.2.0" + magic-string "^0.25.0" + string.prototype.matchall "^4.0.6" + +"@svgr/babel-plugin-add-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-5.4.0.tgz" + integrity sha512-ZFf2gs/8/6B8PnSofI0inYXr2SDNTDScPXhN7k5EqD4aZ3gi6u+rbmZHVB8IM3wDyx8ntKACZbtXSm7oZGRqVg== + +"@svgr/babel-plugin-remove-jsx-attribute@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-5.4.0.tgz" + integrity sha512-yaS4o2PgUtwLFGTKbsiAy6D0o3ugcUhWK0Z45umJ66EPWunAz9fuFw2gJuje6wqQvQWOTJvIahUwndOXb7QCPg== + +"@svgr/babel-plugin-remove-jsx-empty-expression@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-5.0.1.tgz" + integrity sha512-LA72+88A11ND/yFIMzyuLRSMJ+tRKeYKeQ+mR3DcAZ5I4h5CPWN9AHyUzJbWSYp/u2u0xhmgOe0+E41+GjEueA== + +"@svgr/babel-plugin-replace-jsx-attribute-value@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-5.0.1.tgz" + integrity sha512-PoiE6ZD2Eiy5mK+fjHqwGOS+IXX0wq/YDtNyIgOrc6ejFnxN4b13pRpiIPbtPwHEc+NT2KCjteAcq33/F1Y9KQ== + +"@svgr/babel-plugin-svg-dynamic-title@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-5.4.0.tgz" + integrity sha512-zSOZH8PdZOpuG1ZVx/cLVePB2ibo3WPpqo7gFIjLV9a0QsuQAzJiwwqmuEdTaW2pegyBE17Uu15mOgOcgabQZg== + +"@svgr/babel-plugin-svg-em-dimensions@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-5.4.0.tgz" + integrity sha512-cPzDbDA5oT/sPXDCUYoVXEmm3VIoAWAPT6mSPTJNbQaBNUuEKVKyGH93oDY4e42PYHRW67N5alJx/eEol20abw== + +"@svgr/babel-plugin-transform-react-native-svg@^5.4.0": + version "5.4.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-5.4.0.tgz" + integrity sha512-3eYP/SaopZ41GHwXma7Rmxcv9uRslRDTY1estspeB1w1ueZWd/tPlMfEOoccYpEMZU3jD4OU7YitnXcF5hLW2Q== + +"@svgr/babel-plugin-transform-svg-component@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-5.5.0.tgz" + integrity sha512-q4jSH1UUvbrsOtlo/tKcgSeiCHRSBdXoIoqX1pgcKK/aU3JD27wmMKwGtpB8qRYUYoyXvfGxUVKchLuR5pB3rQ== + +"@svgr/babel-preset@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-5.5.0.tgz" + integrity sha512-4FiXBjvQ+z2j7yASeGPEi8VD/5rrGQk4Xrq3EdJmoZgz/tpqChpo5hgXDvmEauwtvOc52q8ghhZK4Oy7qph4ig== + dependencies: + "@svgr/babel-plugin-add-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-attribute" "^5.4.0" + "@svgr/babel-plugin-remove-jsx-empty-expression" "^5.0.1" + "@svgr/babel-plugin-replace-jsx-attribute-value" "^5.0.1" + "@svgr/babel-plugin-svg-dynamic-title" "^5.4.0" + "@svgr/babel-plugin-svg-em-dimensions" "^5.4.0" + "@svgr/babel-plugin-transform-react-native-svg" "^5.4.0" + "@svgr/babel-plugin-transform-svg-component" "^5.5.0" + +"@svgr/core@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/core/-/core-5.5.0.tgz" + integrity sha512-q52VOcsJPvV3jO1wkPtzTuKlvX7Y3xIcWRpCMtBF3MrteZJtBfQw/+u0B1BHy5ColpQc1/YVTrPEtSYIMNZlrQ== + dependencies: + "@svgr/plugin-jsx" "^5.5.0" + camelcase "^6.2.0" + cosmiconfig "^7.0.0" + +"@svgr/hast-util-to-babel-ast@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-5.5.0.tgz" + integrity sha512-cAaR/CAiZRB8GP32N+1jocovUtvlj0+e65TB50/6Lcime+EA49m/8l+P2ko+XPJ4dw3xaPS3jOL4F2X4KWxoeQ== + dependencies: + "@babel/types" "^7.12.6" + +"@svgr/plugin-jsx@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-5.5.0.tgz" + integrity sha512-V/wVh33j12hGh05IDg8GpIUXbjAPnTdPTKuP4VNLggnwaHMPNQNae2pRnyTAILWCQdz5GyMqtO488g7CKM8CBA== + dependencies: + "@babel/core" "^7.12.3" + "@svgr/babel-preset" "^5.5.0" + "@svgr/hast-util-to-babel-ast" "^5.5.0" + svg-parser "^2.0.2" + +"@svgr/plugin-svgo@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-5.5.0.tgz" + integrity sha512-r5swKk46GuQl4RrVejVwpeeJaydoxkdwkM1mBKOgJLBUJPGaLci6ylg/IjhrRsREKDkr4kbMWdgOtbXEh0fyLQ== + dependencies: + cosmiconfig "^7.0.0" + deepmerge "^4.2.2" + svgo "^1.2.2" + +"@svgr/webpack@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-5.5.0.tgz" + integrity sha512-DOBOK255wfQxguUta2INKkzPj6AIS6iafZYiYmHn6W3pHlycSRRlvWKCfLDG10fXfLWqE3DJHgRUOyJYmARa7g== + dependencies: + "@babel/core" "^7.12.3" + "@babel/plugin-transform-react-constant-elements" "^7.12.1" + "@babel/preset-env" "^7.12.1" + "@babel/preset-react" "^7.12.5" + "@svgr/core" "^5.5.0" + "@svgr/plugin-jsx" "^5.5.0" + "@svgr/plugin-svgo" "^5.5.0" + loader-utils "^2.0.0" + +"@testing-library/dom@^8.5.0", "@testing-library/dom@>=7.21.4": + version "8.20.1" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-8.20.1.tgz" + integrity sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g== + dependencies: + "@babel/code-frame" "^7.10.4" + "@babel/runtime" "^7.12.5" + "@types/aria-query" "^5.0.1" + aria-query "5.1.3" + chalk "^4.1.0" + dom-accessibility-api "^0.5.9" + lz-string "^1.5.0" + pretty-format "^27.0.2" + +"@testing-library/jest-dom@^5.16.5": + version "5.16.5" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-5.16.5.tgz" + integrity sha512-N5ixQ2qKpi5OLYfwQmUb/5mSV9LneAcaUfp32pn4yCnpb8r/Yz0pXFPck21dIicKmi+ta5WRAknkZCfA8refMA== + dependencies: + "@adobe/css-tools" "^4.0.1" + "@babel/runtime" "^7.9.2" + "@types/testing-library__jest-dom" "^5.9.1" + aria-query "^5.0.0" + chalk "^3.0.0" + css.escape "^1.5.1" + dom-accessibility-api "^0.5.6" + lodash "^4.17.15" + redent "^3.0.0" + +"@testing-library/react@^13.4.0": + version "13.4.0" + resolved "https://registry.npmjs.org/@testing-library/react/-/react-13.4.0.tgz" + integrity sha512-sXOGON+WNTh3MLE9rve97ftaZukN3oNf2KjDy7YTx6hcTO2uuLHuCGynMDhFwGw/jYf4OJ2Qk0i4i79qMNNkyw== + dependencies: + "@babel/runtime" "^7.12.5" + "@testing-library/dom" "^8.5.0" + "@types/react-dom" "^18.0.0" + +"@testing-library/user-event@^14.4.3": + version "14.4.3" + resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.4.3.tgz" + integrity sha512-kCUc5MEwaEMakkO5x7aoD+DLi02ehmEM2QCGWvNqAS1dV/fAvORWEjnjsEIvml59M7Y5kCkWN6fCCyPOe8OL6Q== + +"@tootallnate/once@1": + version "1.1.2" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz" + integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw== + +"@transloadit/prettier-bytes@0.0.7": + version "0.0.7" + resolved "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz" + integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA== + +"@transloadit/prettier-bytes@0.0.9": + version "0.0.9" + resolved "https://registry.npmjs.org/@transloadit/prettier-bytes/-/prettier-bytes-0.0.9.tgz" + integrity sha512-pCvdmea/F3Tn4hAtHqNXmjcixSaroJJ+L3STXlYJdir1g1m2mRQpWbN8a4SvgQtaw2930Ckhdx8qXdXBFMKbAA== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/aria-query@^5.0.1": + version "5.0.1" + resolved "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.1.tgz" + integrity sha512-XTIieEY+gvJ39ChLcB4If5zHtPxt3Syj5rgZR+e1ctpmK8NjPf0zFqsz4JpLJT0xla9GFDKjy8Cpu331nrmE1Q== + +"@types/babel__core@^7.0.0", "@types/babel__core@^7.1.14", "@types/babel__core@^7.1.9": + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.4", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.0" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.0.tgz" + integrity sha512-4x5FkPpLipqwthjPsF7ZRbOv3uoLUFkTA9G9v583qi4pACvq0uTELrB8OLUzPWUI4IJIyvM85vzkV1nyiI2Lig== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.35" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz" + integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*", "@types/eslint@^7.29.0 || ^8.4.1": + version "8.40.2" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.40.2.tgz" + integrity sha512-PRVjQ4Eh9z9pmmtaq8nTjZjQwKFk7YIHIud3lRoKRBgUQjgjRmoGxxGEPXQkF+lH7QkHJRNr5F4aBgYCW0lqpQ== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/estree@0.0.39": + version "0.0.39" + resolved "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz" + integrity sha512-EYNwp3bU+98cpU4lAWYYL7Zz+2gryWH1qbdDTidVd6hkiR6weksdbMadyXKXNPEkQFhXM+hVO9ZygomHXp+AIw== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.35" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.35.tgz" + integrity sha512-wALWQwrgiB2AWTT91CB62b6Yt0sNHpznUXeZEcnPU3DRdlDIz74x8Qg1UUYKSVFi+va5vKOLYRBI1bRKiLLKIg== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/graceful-fs@^4.1.2": + version "4.1.6" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/hast@^2.0.0": + version "2.3.4" + resolved "https://registry.npmjs.org/@types/hast/-/hast-2.3.4.tgz" + integrity sha512-wLEm0QvaoawEDoTRwzTXp4b4jpwiJDvR5KMnFnVodm3scufTlBOWRD6N1OBf9TZMhjlNsSfcO5V+7AF4+Vy+9g== + dependencies: + "@types/unist" "*" + +"@types/hoist-non-react-statics@^3.3.1": + version "3.3.1" + resolved "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz" + integrity sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA== + dependencies: + "@types/react" "*" + hoist-non-react-statics "^3.3.0" + +"@types/html-minifier-terser@^6.0.0": + version "6.1.0" + resolved "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg== + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/http-proxy@^1.17.8": + version "1.17.11" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jest@*": + version "29.5.2" + resolved "https://registry.npmjs.org/@types/jest/-/jest-29.5.2.tgz" + integrity sha512-mSoZVJF5YzGVCk+FsDxzDuH7s+SCkzrgKZzf0Z0T2WudhBUPoF6ktoTPC4R0ZoCPCV5xUvuU6ias5NvxcBcMMg== + dependencies: + expect "^29.0.0" + pretty-format "^29.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/lodash@^4.14.175": + version "4.14.195" + resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.195.tgz" + integrity sha512-Hwx9EUgdwf2GLarOjQp5ZH8ZmblzcbTBC2wtQWNKARBSxM9ezRIAUpeDTgoQRAFB0+8CNWXVA9+MaSOzOF3nPg== + +"@types/mime@*", "@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/node@*": + version "20.4.0" + resolved "https://registry.npmjs.org/@types/node/-/node-20.4.0.tgz" + integrity sha512-jfT7iTf/4kOQ9S7CHV9BIyRaQqHu67mOjsIQBC3BKZvzvUB6zLxEwJ6sBE3ozcvP8kF6Uk5PXN0Q+c0dfhGX0g== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prettier@^2.1.5": + version "2.7.3" + resolved "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz" + integrity sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA== + +"@types/prop-types@*", "@types/prop-types@^15.7.5": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/prop-types@^15.7.8": + version "15.7.9" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.9.tgz" + integrity sha512-n1yyPsugYNSmHgxDFjicaI2+gCNjsBck8UX9kuofAKlc0h1bL+20oSF72KeNaW2DUlesbEVCFgyV2dPGTiY42g== + +"@types/prop-types@^15.7.9": + version "15.7.10" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.10.tgz" + integrity sha512-mxSnDQxPqsZxmeShFH+uwQ4kO4gcJcGahjjMFeLbKE95IAZiiZyiEepGZjtXJ7hN/yfu0bu9xN2ajcU0JcxX6A== + +"@types/q@^1.5.1": + version "1.5.5" + resolved "https://registry.npmjs.org/@types/q/-/q-1.5.5.tgz" + integrity sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ== + +"@types/qs@*": + version "6.9.7" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz" + integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^16.8 || ^17.0 || ^18.0", "@types/react-dom@^18.0.0": + version "18.2.6" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.6.tgz" + integrity sha512-2et4PDvg6PVCyS7fuTc4gPoksV58bW0RwSxWKcPRcHZf0PRUGq03TKcD/rUHe3azfV6/5/biUBJw+HhCQjaP0A== + dependencies: + "@types/react" "*" + +"@types/react-is@^18.2.1": + version "18.2.1" + resolved "https://registry.npmjs.org/@types/react-is/-/react-is-18.2.1.tgz" + integrity sha512-wyUkmaaSZEzFZivD8F2ftSyAfk6L+DfFliVj/mYdOXbVjRcS87fQJLTnhk6dRZPuJjI+9g6RZJO4PNCngUrmyw== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.6": + version "4.4.6" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz" + integrity sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew== + dependencies: + "@types/react" "*" + +"@types/react-transition-group@^4.4.8": + version "4.4.9" + resolved "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.9.tgz" + integrity sha512-ZVNmWumUIh5NhH8aMD9CR2hdW0fNuYInlocZHaZ+dgk/1K49j1w/HoAuK1ki+pgscQrOFRTlXeoURtuzEkV3dg== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^16.8 || ^17.0 || ^18.0", "@types/react@^16.8.0 || ^17.0.0 || ^18.0.0", "@types/react@^16.8.6 || ^17.0.0", "@types/react@^16.9.0 || ^17.0.0 || ^18.0.0", "@types/react@^17.0.0 || ^18.0.0", "@types/react@^18.0.0", "@types/react@16 || 17 || 18": + version "18.2.14" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.14.tgz" + integrity sha512-A0zjq+QN/O0Kpe30hA1GidzyFjatVvrpIvWLxD+xv67Vt91TWWgco9IvrJBkeyHm1trGaFS/FSGqPlhyeZRm0g== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/resolve@1.17.1": + version "1.17.1" + resolved "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz" + integrity sha512-yy7HuzQhj0dhGpD8RLXSZWEkLsV9ibvxvi6EiJ3bkqLAO1RGo0WbkWQiwpRlSFymTJRz0d3k5LM3kkx8ArDbLw== + dependencies: + "@types/node" "*" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.3.12": + version "7.5.0" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz" + integrity sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.2" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/styled-jsx@^2.2.8": + version "2.2.9" + resolved "https://registry.npmjs.org/@types/styled-jsx/-/styled-jsx-2.2.9.tgz" + integrity sha512-W/iTlIkGEyTBGTEvZCey8EgQlQ5l0DwMqi3iOXlLs2kyBwYTXHKEiU6IZ5EwoRwngL8/dGYuzezSup89ttVHLw== + dependencies: + "@types/react" "*" + +"@types/testing-library__jest-dom@^5.9.1": + version "5.14.7" + resolved "https://registry.npmjs.org/@types/testing-library__jest-dom/-/testing-library__jest-dom-5.14.7.tgz" + integrity sha512-PFDoAbR9y8pD9+41oM1Yy0nVCkaRPlklmDZoPCXhNpR0ZO13HAYWqdNEjLtvIiveBmfB/+jdvmuOVeOXehKOaA== + dependencies: + "@types/jest" "*" + +"@types/trusted-types@^2.0.2": + version "2.0.3" + resolved "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz" + integrity sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g== + +"@types/unist@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/unist/-/unist-3.0.0.tgz" + integrity sha512-MFETx3tbTjE7Uk6vvnWINA/1iJ7LuMdO4fcq8UfF0pRbj01aGLduVvQcRyswuACJdpnHgg8E3rQLhaRdNEJS0w== + +"@types/use-sync-external-store@^0.0.3": + version "0.0.3" + resolved "https://registry.npmjs.org/@types/use-sync-external-store/-/use-sync-external-store-0.0.3.tgz" + integrity sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA== + +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^16.0.0": + version "16.0.5" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz" + integrity sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ== + dependencies: + "@types/yargs-parser" "*" + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@typescript-eslint/eslint-plugin@^4.0.0 || ^5.0.0", "@typescript-eslint/eslint-plugin@^5.5.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.61.0.tgz" + integrity sha512-A5l/eUAug103qtkwccSCxn8ZRwT+7RXWkFECdA4Cvl1dOlDUgTpAOfSEElZn2uSUxhdDpnCdetrf0jvU4qrL+g== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.61.0" + "@typescript-eslint/type-utils" "5.61.0" + "@typescript-eslint/utils" "5.61.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/experimental-utils@^5.0.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-5.61.0.tgz" + integrity sha512-r4RTnwTcaRRVUyKb7JO4DiOGmcMCat+uNs6HqJBfX7K2nlq5TagYZShhbhAw7hFT3bHaYgxMw6pKP0fhu05VMA== + dependencies: + "@typescript-eslint/utils" "5.61.0" + +"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.5.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.61.0.tgz" + integrity sha512-yGr4Sgyh8uO6fSi9hw3jAFXNBHbCtKKFMdX2IkT3ZqpKmtAq3lHS4ixB/COFuAIJpwl9/AqF7j72ZDWYKmIfvg== + dependencies: + "@typescript-eslint/scope-manager" "5.61.0" + "@typescript-eslint/types" "5.61.0" + "@typescript-eslint/typescript-estree" "5.61.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.61.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.61.0.tgz" + integrity sha512-W8VoMjoSg7f7nqAROEmTt6LoBpn81AegP7uKhhW5KzYlehs8VV0ZW0fIDVbcZRcaP3aPSW+JZFua+ysQN+m/Nw== + dependencies: + "@typescript-eslint/types" "5.61.0" + "@typescript-eslint/visitor-keys" "5.61.0" + +"@typescript-eslint/type-utils@5.61.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.61.0.tgz" + integrity sha512-kk8u//r+oVK2Aj3ph/26XdH0pbAkC2RiSjUYhKD+PExemG4XSjpGFeyZ/QM8lBOa7O8aGOU+/yEbMJgQv/DnCg== + dependencies: + "@typescript-eslint/typescript-estree" "5.61.0" + "@typescript-eslint/utils" "5.61.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.61.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.61.0.tgz" + integrity sha512-ldyueo58KjngXpzloHUog/h9REmHl59G1b3a5Sng1GfBo14BkS3ZbMEb3693gnP1k//97lh7bKsp6/V/0v1veQ== + +"@typescript-eslint/typescript-estree@5.61.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.61.0.tgz" + integrity sha512-Fud90PxONnnLZ36oR5ClJBLTLfU4pIWBmnvGwTbEa2cXIqj70AEDEmOmpkFComjBZ/037ueKrOdHuYmSFVD7Rw== + dependencies: + "@typescript-eslint/types" "5.61.0" + "@typescript-eslint/visitor-keys" "5.61.0" + debug "^4.3.4" + globby "^11.1.0" + is-glob "^4.0.3" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/utils@^5.58.0", "@typescript-eslint/utils@5.61.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.61.0.tgz" + integrity sha512-mV6O+6VgQmVE6+xzlA91xifndPW9ElFW8vbSF0xCT/czPXVhwDewKila1jOyRwa9AE19zKnrr7Cg5S3pJVrTWQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.61.0" + "@typescript-eslint/types" "5.61.0" + "@typescript-eslint/typescript-estree" "5.61.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.61.0": + version "5.61.0" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.61.0.tgz" + integrity sha512-50XQ5VdbWrX06mQXhy93WywSFZZGsv3EOjq+lqp6WC2t+j3mb6A9xYVdrRxafvK88vg9k9u+CT4l6D8PEatjKg== + dependencies: + "@typescript-eslint/types" "5.61.0" + eslint-visitor-keys "^3.3.0" + +"@ucast/core@^1.0.0", "@ucast/core@^1.4.1", "@ucast/core@^1.6.1": + version "1.10.2" + resolved "https://registry.npmjs.org/@ucast/core/-/core-1.10.2.tgz" + integrity sha512-ons5CwXZ/51wrUPfoduC+cO7AS1/wRb0ybpQJ9RrssossDxVy4t49QxWoWgfBDvVKsz9VXzBk9z0wqTdZ+Cq8g== + +"@ucast/js@^3.0.0": + version "3.0.3" + resolved "https://registry.npmjs.org/@ucast/js/-/js-3.0.3.tgz" + integrity sha512-jBBqt57T5WagkAjqfCIIE5UYVdaXYgGkOFYv2+kjq2AVpZ2RIbwCo/TujJpDlwTVluUI+WpnRpoGU2tSGlEvFQ== + dependencies: + "@ucast/core" "^1.0.0" + +"@ucast/mongo@^2.4.0": + version "2.4.3" + resolved "https://registry.npmjs.org/@ucast/mongo/-/mongo-2.4.3.tgz" + integrity sha512-XcI8LclrHWP83H+7H2anGCEeDq0n+12FU2mXCTz6/Tva9/9ddK/iacvvhCyW6cijAAOILmt0tWplRyRhVyZLsA== + dependencies: + "@ucast/core" "^1.4.1" + +"@ucast/mongo2js@^1.3.0": + version "1.3.4" + resolved "https://registry.npmjs.org/@ucast/mongo2js/-/mongo2js-1.3.4.tgz" + integrity sha512-ahazOr1HtelA5AC1KZ9x0UwPMqqimvfmtSm/PRRSeKKeE5G2SCqTgwiNzO7i9jS8zA3dzXpKVPpXMkcYLnyItA== + dependencies: + "@ucast/core" "^1.6.1" + "@ucast/js" "^3.0.0" + "@ucast/mongo" "^2.4.0" + +"@uppy/companion-client@^3.4.0": + version "3.4.0" + resolved "https://registry.npmjs.org/@uppy/companion-client/-/companion-client-3.4.0.tgz" + integrity sha512-mGm3I/VdlaXvvYnbkidQDk3ttPY7VjvRwoHdXaAOHsIwPZBFUlCRggw84TQN9NejiasqTK/U7xvARDunjVhGBA== + dependencies: + "@uppy/utils" "^5.5.0" + namespace-emitter "^2.0.1" + +"@uppy/core@^3.3.1", "@uppy/core@^3.4.0", "@uppy/core@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@uppy/core/-/core-3.5.0.tgz" + integrity sha512-Ujm3VrFkqCNnsqvjZL1RQhIdccbjUxfLJW6EhirYcOLr1kCUjhgKSE/iOJnC2eadohHwOWFTx+X8e9bhH6HT7g== + dependencies: + "@transloadit/prettier-bytes" "0.0.9" + "@uppy/store-default" "^3.0.3" + "@uppy/utils" "^5.5.0" + lodash "^4.17.21" + mime-match "^1.0.2" + namespace-emitter "^2.0.1" + nanoid "^4.0.0" + preact "^10.5.13" + +"@uppy/dashboard@^3.4.2", "@uppy/dashboard@^3.5.2": + version "3.5.2" + resolved "https://registry.npmjs.org/@uppy/dashboard/-/dashboard-3.5.2.tgz" + integrity sha512-6CWhqqm93Uo2QpwYrDRCVrpxStCCK359Wr8CvaOi14BJrcE8JyPczXbrzHMzbjKt2Rz8G3TzQUa1r9nZkylrGQ== + dependencies: + "@transloadit/prettier-bytes" "0.0.7" + "@uppy/informer" "^3.0.3" + "@uppy/provider-views" "^3.5.0" + "@uppy/status-bar" "^3.2.4" + "@uppy/thumbnail-generator" "^3.0.4" + "@uppy/utils" "^5.5.0" + classnames "^2.2.6" + is-shallow-equal "^1.0.1" + lodash "^4.17.21" + memoize-one "^6.0.0" + nanoid "^4.0.0" + preact "^10.5.13" + +"@uppy/drag-drop@^3.0.2", "@uppy/drag-drop@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@uppy/drag-drop/-/drag-drop-3.0.3.tgz" + integrity sha512-0bCgQKxg+9vkxQipTgrX9yQIuK9a0hZrkipm1+Ynq6jTeig49b7II1bWYnoKdiYhi6nRE4UnDJf4z09yCAU7rA== + dependencies: + "@uppy/utils" "^5.4.3" + preact "^10.5.13" + +"@uppy/file-input@^3.0.2", "@uppy/file-input@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@uppy/file-input/-/file-input-3.0.3.tgz" + integrity sha512-tYmbQIWjNPnKFFzBmZcNHFyMkfPAPSOrse+3qnmSWYzGKWaZfKP1zM0MiABZO/AH5X6hhLIQDRY8TsyiPfmJ9w== + dependencies: + "@uppy/utils" "^5.4.3" + preact "^10.5.13" + +"@uppy/informer@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@uppy/informer/-/informer-3.0.3.tgz" + integrity sha512-jMMlZ0bCJ2ruJJ0LMl7pJrM/b0e9vjVEHvYYdQghnRSRDSMONcTJXEqNZ0Lu4x7OZR1SGvqqchFk7n3vAsuERw== + dependencies: + "@uppy/utils" "^5.4.3" + preact "^10.5.13" + +"@uppy/progress-bar@^3.0.2", "@uppy/progress-bar@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@uppy/progress-bar/-/progress-bar-3.0.3.tgz" + integrity sha512-s0iRCnDQ5zcyk8ZyTF46W7Kkf9S1hH1oj2+GBYDdFzc72tgrx49arHs3YobkH7X9whhc/qTskLe32cyC9oe6ZQ== + dependencies: + "@uppy/utils" "^5.4.3" + preact "^10.5.13" + +"@uppy/provider-views@^3.5.0": + version "3.5.0" + resolved "https://registry.npmjs.org/@uppy/provider-views/-/provider-views-3.5.0.tgz" + integrity sha512-xSp5xQ6NsPLS2XJdsdBQCLgQELEd0BvVM2R34/XFyGTSqeA4NJKHfM6kSKwjW/jkj26CyFN5nth6CGeNaaKQ+w== + dependencies: + "@uppy/utils" "^5.4.3" + classnames "^2.2.6" + nanoid "^4.0.0" + p-queue "^7.3.4" + preact "^10.5.13" + +"@uppy/react@^3.1.3": + version "3.1.3" + resolved "https://registry.npmjs.org/@uppy/react/-/react-3.1.3.tgz" + integrity sha512-nzSpJ2PZ3lGp0wwGAxlvyIemUKE1HIITzLA9h6sUJLrweVndbXcZzxGvLm2M09l3lAE8LeybRo5Pnsn8adaH+w== + dependencies: + "@uppy/utils" "^5.4.1" + prop-types "^15.6.1" + +"@uppy/status-bar@^3.2.2", "@uppy/status-bar@^3.2.4": + version "3.2.4" + resolved "https://registry.npmjs.org/@uppy/status-bar/-/status-bar-3.2.4.tgz" + integrity sha512-WuK0LRmz7H7iBDV0VO+iUNoXmhbyeCEAWzslX0nqhkGuMchIQprVwd80ZegACySajqcpV1RDNxdhmgtCbRn8wA== + dependencies: + "@transloadit/prettier-bytes" "0.0.9" + "@uppy/utils" "^5.4.3" + classnames "^2.2.6" + preact "^10.5.13" + +"@uppy/store-default@^3.0.3": + version "3.0.3" + resolved "https://registry.npmjs.org/@uppy/store-default/-/store-default-3.0.3.tgz" + integrity sha512-/zlvQNj4HjkthI+7dNdj/8mOlTg1Zb1gJ/ZsOxof0g3xXD+OAwm7asRnOwpfj2dos+lExdW/zMn8XsRGsuvb6Q== + +"@uppy/thumbnail-generator@^3.0.4": + version "3.0.4" + resolved "https://registry.npmjs.org/@uppy/thumbnail-generator/-/thumbnail-generator-3.0.4.tgz" + integrity sha512-f7E+4F6UWunX3jnV3wfL+k5zQaukKmD1z2qYbmRg5OuE9CxDJrNdAVk14KDAi79seejPJa6VVfCgGjTlIGLaRA== + dependencies: + "@uppy/utils" "^5.4.3" + exifr "^7.0.0" + +"@uppy/tus@^3.2.0": + version "3.2.0" + resolved "https://registry.npmjs.org/@uppy/tus/-/tus-3.2.0.tgz" + integrity sha512-bKZhcxTV9S7GMKqluV2TCI79zWoDxxFNkU4UzQH9T0jXZboqxcvFt09DXA6+/2J9nYQK5REldCg3Ll7MUHJOQQ== + dependencies: + "@uppy/companion-client" "^3.4.0" + "@uppy/utils" "^5.5.0" + tus-js-client "^3.0.0" + +"@uppy/utils@^5.4.1", "@uppy/utils@^5.4.3", "@uppy/utils@^5.5.0": + version "5.5.0" + resolved "https://registry.npmjs.org/@uppy/utils/-/utils-5.5.0.tgz" + integrity sha512-hNeYEbihSq/dKK7CZ3euvv3pN2NAO0z1x2FFoZsTajSxY4f7PPOZJoltvOQEKx1vFljhLvOY33s3KNlvXjogqg== + dependencies: + lodash "^4.17.21" + preact "^10.5.13" + +"@uppy/webcam@^3.3.2": + version "3.3.2" + resolved "https://registry.npmjs.org/@uppy/webcam/-/webcam-3.3.2.tgz" + integrity sha512-3veSmmrU6wZnS1MquJk/jlqa16WIn/epad6j4u6awJDHLbNiU9fbgjaZBEcPF5loC1bXTJBQ9GUSy8OQYPE0GA== + dependencies: + "@uppy/utils" "^5.4.3" + is-mobile "^3.1.1" + preact "^10.5.13" + +"@uppy/xhr-upload@^3.4.0": + version "3.4.0" + resolved "https://registry.npmjs.org/@uppy/xhr-upload/-/xhr-upload-3.4.0.tgz" + integrity sha512-JfJWYkV4NCkeDgS80XpSZwV6D7ssVgTeVckE/h96Sg+ehc7kXCb1aqurzOLZJJmuRiZZzcLpZEMRXYSu1tIPRQ== + dependencies: + "@uppy/companion-client" "^3.4.0" + "@uppy/utils" "^5.5.0" + nanoid "^4.0.0" + +"@webassemblyjs/ast@^1.11.5", "@webassemblyjs/ast@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + 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== + +"@webassemblyjs/helper-api-error@1.11.6": + 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== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + 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== + 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" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + 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== + 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" + +"@webassemblyjs/wasm-gen@1.11.6": + 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== + 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" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@^1.11.5", "@webassemblyjs/wasm-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + 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" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.3, abab@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz" + integrity sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg== + dependencies: + acorn "^7.1.1" + acorn-walk "^7.1.1" + +acorn-import-assertions@^1.9.0: + 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== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^7.1.1: + version "7.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz" + integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== + +"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8, acorn@^8.2.4, acorn@^8.7.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +acorn@^7.1.1: + version "7.4.1" + resolved "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz" + integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== + +address@^1.0.1, address@^1.1.2: + version "1.2.2" + resolved "https://registry.npmjs.org/address/-/address-1.2.2.tgz" + integrity sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +adler-32@~1.3.0: + version "1.3.1" + resolved "https://registry.npmjs.org/adler-32/-/adler-32-1.3.1.tgz" + integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.4.1, ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.4, ajv@^6.12.5, ajv@^6.9.1, ajv@>=8: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.6.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ajv@^8.8.2, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + version "0.0.8" + resolved "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz" + integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-regex@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz" + integrity sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +any-promise@^1.0.0: + version "1.3.0" + resolved "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz" + integrity sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A== + +anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apexcharts@^3.18.0, apexcharts@^3.37.3: + version "3.41.0" + resolved "https://registry.npmjs.org/apexcharts/-/apexcharts-3.41.0.tgz" + integrity sha512-FJXA7NVjxs1q+ptR3b1I+pN8K/gWuXn+qLZjFz8EHvJOokdgcuwa/HSe5aC465HW/LWnrjWLSTsOQejQbQ42hQ== + dependencies: + svg.draggable.js "^2.2.2" + svg.easing.js "^2.0.0" + svg.filter.js "^2.0.2" + svg.pathmorphing.js "^0.1.3" + svg.resize.js "^1.4.3" + svg.select.js "^3.0.1" + +arg@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz" + integrity sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + +aria-query@^5.0.0, aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +aria-query@5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz" + integrity sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ== + dependencies: + deep-equal "^2.0.5" + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-includes@^3.1.6: + version "3.1.6" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz" + integrity sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + is-string "^1.0.7" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.reduce@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.5.tgz" + integrity sha512-kDdugMl7id9COE8R7MHF5jWk7Dqt/fs4Pv+JXoICnYwqpjjjbUurz6w5fT5IG6brLdJhv6/VoHB0H7oyIBXd+Q== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-array-method-boxes-properly "^1.0.0" + is-string "^1.0.7" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +asap@~2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz" + integrity sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +async@^3.2.3: + version "3.2.4" + resolved "https://registry.npmjs.org/async/-/async-3.2.4.tgz" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +at-least-node@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz" + integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg== + +autoprefixer@^10.4.13: + version "10.4.14" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz" + integrity sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ== + dependencies: + browserslist "^4.21.5" + caniuse-lite "^1.0.30001464" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.7.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + +axios@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz" + integrity sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA== + dependencies: + follow-redirects "^1.15.0" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-jest@^27.4.2, babel-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz" + integrity sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg== + dependencies: + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__core" "^7.1.14" + babel-plugin-istanbul "^6.1.1" + babel-preset-jest "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + slash "^3.0.0" + +babel-loader@^8.2.3: + version "8.3.0" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-istanbul@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz" + integrity sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@istanbuljs/load-nyc-config" "^1.0.0" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-instrument "^5.0.4" + test-exclude "^6.0.0" + +babel-plugin-jest-hoist@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-27.5.1.tgz" + integrity sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.0.0" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + +babel-plugin-named-asset-import@^0.3.8: + version "0.3.8" + resolved "https://registry.npmjs.org/babel-plugin-named-asset-import/-/babel-plugin-named-asset-import-0.3.8.tgz" + integrity sha512-WXiAc++qo7XcJ1ZnTYGtLxmBCVbddAml3CEXgWaBzNzLNoxtQ8AiGEFDMOhot9XjTCQbvP5E77Fj9Gk924f00Q== + +babel-plugin-polyfill-corejs2@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.4.tgz" + integrity sha512-9WeK9snM1BfxB38goUEv2FLnA6ja07UMfazFHzCXUb3NyDZAwfXvQiURQ6guTTMeHcOsdknULm1PDhs4uWtKyA== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.1" + "@nicolo-ribaudo/semver-v6" "^6.3.3" + +babel-plugin-polyfill-corejs3@^0.8.2: + version "0.8.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.2.tgz" + integrity sha512-Cid+Jv1BrY9ReW9lIfNlNpsI53N+FN7gE+f73zLAUbr9C52W4gKLWSByx47pfDJsEysojKArqOtOKZSVIIUTuQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.1: + version "0.5.1" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.1.tgz" + integrity sha512-L8OyySuI6OSQ5hFy9O+7zFjyr4WhAfRjLIOkhQGYl+emwJkd/S4XXT1JpfrgR1jrQ1NcGiOh+yAdGlF8pnC3Jw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.1" + +babel-plugin-transform-react-remove-prop-types@^0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/babel-plugin-transform-react-remove-prop-types/-/babel-plugin-transform-react-remove-prop-types-0.4.24.tgz" + integrity sha512-eqj0hVcJUR57/Ug2zE1Yswsw4LhuqqHhD+8v120T1cl3kjg76QwtyBrdIk4WVwK+lAhBJVYCd/v+4nc4y+8JsA== + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + "@babel/plugin-syntax-top-level-await" "^7.8.3" + +babel-preset-jest@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-27.5.1.tgz" + integrity sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag== + dependencies: + babel-plugin-jest-hoist "^27.5.1" + babel-preset-current-node-syntax "^1.0.0" + +babel-preset-react-app@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/babel-preset-react-app/-/babel-preset-react-app-10.0.1.tgz" + integrity sha512-b0D9IZ1WhhCWkrTXyFuIIgqGzSkRIH5D5AmB0bXbzYAB1OBAwHcUeyWW2LorutLWF5btNo/N7r/cIdmvvKJlYg== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-proposal-class-properties" "^7.16.0" + "@babel/plugin-proposal-decorators" "^7.16.4" + "@babel/plugin-proposal-nullish-coalescing-operator" "^7.16.0" + "@babel/plugin-proposal-numeric-separator" "^7.16.0" + "@babel/plugin-proposal-optional-chaining" "^7.16.0" + "@babel/plugin-proposal-private-methods" "^7.16.0" + "@babel/plugin-transform-flow-strip-types" "^7.16.0" + "@babel/plugin-transform-react-display-name" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.4" + "@babel/preset-env" "^7.16.4" + "@babel/preset-react" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.3" + babel-plugin-macros "^3.1.0" + babel-plugin-transform-react-remove-prop-types "^0.4.24" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" + integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw== + +bfj@^7.0.2: + version "7.0.2" + resolved "https://registry.npmjs.org/bfj/-/bfj-7.0.2.tgz" + integrity sha512-+e/UqUzwmzJamNF50tBV6tZPTORow7gQ96iFow+8b562OdMpEK0BcJEq2OSPEDmAbSMBQ7PKZ87ubFkgxpYWgw== + dependencies: + bluebird "^3.5.5" + check-types "^11.1.1" + hoopy "^0.1.4" + tryer "^1.0.1" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bluebird@^3.5.5: + version "3.7.2" + resolved "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz" + integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" + iconv-lite "0.4.24" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0, boolbase@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browser-process-hrtime@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz" + integrity sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow== + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.21.4, browserslist@^4.21.5, browserslist@^4.21.9, "browserslist@>= 4", "browserslist@>= 4.21.0", browserslist@>=4: + version "4.21.9" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.9.tgz" + integrity sha512-M0MFoZzbUrRU4KNfCrDLnvyE7gub+peetoTid3TBIqtunaDJyXlwhakT+/VkvSXcfIzFfK/nkCs4nmyTmxdNSg== + dependencies: + caniuse-lite "^1.0.30001503" + electron-to-chromium "^1.4.431" + node-releases "^2.0.12" + update-browserslist-db "^1.0.11" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-from@^1.0.0, buffer-from@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-modules@^3.1.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + +camelcase-css@^2.0.1: + 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== + +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0, camelcase@^6.2.1: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +can-use-dom@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz" + integrity sha512-ceOhN1DL7Y4O6M0j9ICgmTYziV89WMd96SvSl0REd8PMgrY0B/WBOPoed5S1KUmJqXgUXh8gzSe6E3ae27upsQ== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001464, caniuse-lite@^1.0.30001503: + version "1.0.30001513" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001513.tgz" + integrity sha512-pnjGJo7SOOjAGytZZ203Em95MRM8Cr6jhCXNF/FAXTpCTRTECnqQWLpiTRqrFtdYcth8hf4WECUpkezuYsMVww== + +case-sensitive-paths-webpack-plugin@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.4.0.tgz" + integrity sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw== + +cfb@~1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/cfb/-/cfb-1.2.2.tgz" + integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA== + dependencies: + adler-32 "~1.3.0" + crc-32 "~1.2.0" + +chalk@^2.0.0, chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.0: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +char-regex@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-2.0.1.tgz" + integrity sha512-oSvEeo6ZUD7NepqAat3RqoucZ5SeqLJgOvVIwkafu6IP3V0pO38s/ypdVUmDDK6qIIHNlYHJAKX9E7R7HoKElw== + +character-entities-legacy@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-1.1.4.tgz" + integrity sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA== + +character-entities@^1.0.0: + version "1.2.4" + resolved "https://registry.npmjs.org/character-entities/-/character-entities-1.2.4.tgz" + integrity sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw== + +character-reference-invalid@^1.0.0: + version "1.1.4" + resolved "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz" + integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg== + +check-types@^11.1.1: + version "11.2.2" + resolved "https://registry.npmjs.org/check-types/-/check-types-11.2.2.tgz" + integrity sha512-HBiYvXvn9Z70Z88XKjz3AEKd4HJhBXsa3j7xFnITAzoS8+q6eIGi8qDB8FKPBAjtuxjI/zFpwuiCb8oDtKOYrA== + +chokidar@^3.4.2, chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + 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== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +classnames@^2.2.6: + version "2.3.2" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-css@^5.2.2: + version "5.3.2" + resolved "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz" + integrity sha512-JVJbM+f3d3Q704rF4bqQ5UUyTtuJ0JRKNbTKVEeujCCBoMdkEi+V+e8oktO9qGQNSvHrFTM6JZRXrUvGR1czww== + dependencies: + source-map "~0.6.0" + +cliui@^7.0.2: + version "7.0.4" + resolved "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz" + integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.0" + wrap-ansi "^7.0.0" + +clsx@^1.0.2, clsx@^1.1.1: + version "1.2.1" + resolved "https://registry.npmjs.org/clsx/-/clsx-1.2.1.tgz" + integrity sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg== + +clsx@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +clsx@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/clsx/-/clsx-2.0.0.tgz" + integrity sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q== + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +coa@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz" + integrity sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA== + dependencies: + "@types/q" "^1.5.1" + chalk "^2.4.1" + q "^1.1.2" + +codepage@~1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/codepage/-/codepage-1.15.0.tgz" + integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA== + +collect-v8-coverage@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz" + integrity sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q== + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +colord@^2.9.1: + version "2.9.3" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combine-errors@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/combine-errors/-/combine-errors-3.0.3.tgz" + integrity sha512-C8ikRNRMygCwaTx+Ek3Yr+OuZzgZjduCOfSQBjbM8V3MfgcjSTeto/GXP6PAwKvJz/v15b7GHZvx5rOlczFw/Q== + dependencies: + custom-error-instance "2.1.1" + lodash.uniqby "4.5.0" + +combined-stream@^1.0.8: + 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" + +comma-separated-tokens@^1.0.0: + version "1.0.8" + resolved "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-1.0.8.tgz" + integrity sha512-GHuDRO12Sypu2cV70d1dkA2EUmXHgntrzbpvOB+Qy+49ypNfGgFQIC2fhhXbnyrJRynDCAARsT7Ou0M6hirpfw== + +commander@^2.20.0: + 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== + +commander@^4.0.0: + version "4.1.1" + resolved "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz" + integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@^8.3.0: + version "8.3.0" + resolved "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz" + integrity sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +common-tags@^1.8.0: + version "1.8.2" + resolved "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz" + integrity sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +confusing-browser-globals@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz" + integrity sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA== + +connect-history-api-fallback@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz" + integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA== + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-to-clipboard@^3.3.1: + version "3.3.3" + resolved "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz" + integrity sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA== + dependencies: + toggle-selection "^1.0.6" + +core-js-compat@^3.31.0: + version "3.31.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.31.1.tgz" + integrity sha512-wIDWd2s5/5aJSdpOJHfSibxNODxoGoWOBHt8JSPB41NOE94M7kuTPZCYLOlTtuoXTsBPKobpJ6T+y0SSy5L9SA== + dependencies: + browserslist "^4.21.9" + +core-js-pure@^3.23.3: + version "3.31.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.31.1.tgz" + integrity sha512-w+C62kvWti0EPs4KPMCMVv9DriHSXfQOCQ94bGGBiEW5rrbtt/Rz8n5Krhfw9cpFyzXBjf3DB3QnPdEzGDY4Fw== + +core-js@^3.0.1, core-js@^3.19.2: + version "3.31.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.31.1.tgz" + integrity sha512-2sKLtfq1eFST7l7v62zaqXacPc7uG8ZAya8ogijLhTtaKNcpzpB4TMoTw2Si+8GYKRwFPMMtUT0263QFWFfqyQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-6.0.0.tgz" + integrity sha512-xb3ZL6+L8b9JLLCx3ZdoZy4+2ECphCMo2PwqgP1tlfVq6M6YReyzBJtvWWtbDSpNr9hn96pkCiZqUcFEc+54Qg== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.1.0" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.7.2" + +cosmiconfig@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" + integrity sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA== + dependencies: + "@types/parse-json" "^4.0.0" + import-fresh "^3.2.1" + parse-json "^5.0.0" + path-type "^4.0.0" + yaml "^1.10.0" + +crc-32@~1.2.0, crc-32@~1.2.1: + version "1.2.2" + resolved "https://registry.npmjs.org/crc-32/-/crc-32-1.2.2.tgz" + integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ== + +cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +crypto-random-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz" + integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA== + +css-blank-pseudo@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz" + integrity sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ== + dependencies: + postcss-selector-parser "^6.0.9" + +css-declaration-sorter@^6.3.1: + version "6.4.0" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.0.tgz" + integrity sha512-jDfsatwWMWN0MODAFuHszfjphEXfNw9JUAhmY4pLu3TyTU+ohUpsbVtbU+1MZn4a47D9kqh03i4eyOm+74+zew== + +css-has-pseudo@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz" + integrity sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw== + dependencies: + postcss-selector-parser "^6.0.9" + +css-loader@^6.5.1: + version "6.8.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-minimizer-webpack-plugin@^3.2.0: + version "3.4.1" + resolved "https://registry.npmjs.org/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-3.4.1.tgz" + integrity sha512-1u6D71zeIfgngN2XNRJefc/hY7Ybsxd74Jm4qngIXyUEk7fss3VUzuHxLAq/R8NAba4QU9OUSaMZlbpRc7bM4Q== + dependencies: + cssnano "^5.0.6" + jest-worker "^27.0.2" + postcss "^8.3.5" + schema-utils "^4.0.0" + serialize-javascript "^6.0.0" + source-map "^0.6.1" + +css-prefers-color-scheme@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz" + integrity sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA== + +css-select-base-adapter@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz" + integrity sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w== + +css-select@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz" + integrity sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ== + dependencies: + boolbase "^1.0.0" + css-what "^3.2.1" + domutils "^1.7.0" + nth-check "^1.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-tree@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-tree@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz" + integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q== + dependencies: + mdn-data "2.0.14" + source-map "^0.6.1" + +css-tree@1.0.0-alpha.37: + version "1.0.0-alpha.37" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz" + integrity sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg== + dependencies: + mdn-data "2.0.4" + source-map "^0.6.1" + +css-vendor@^2.0.8: + version "2.0.8" + resolved "https://registry.npmjs.org/css-vendor/-/css-vendor-2.0.8.tgz" + integrity sha512-x9Aq0XTInxrkuFeHKbYC7zWY8ai7qJ04Kxd9MnvbC1uO5DagxoHQjm4JvG+vCdXOoFtCjbL2XSZfxmoYa9uQVQ== + dependencies: + "@babel/runtime" "^7.8.3" + is-in-browser "^1.0.2" + +css-what@^3.2.1: + version "3.4.2" + resolved "https://registry.npmjs.org/css-what/-/css-what-3.4.2.tgz" + integrity sha512-ACUm3L0/jiZTqfzRM3Hi9Q8eZqd6IK37mMWPLz9PJxkLWllYeRf+EHUSHYEtFop2Eqytaq1FizFVh7XfBnXCDQ== + +css-what@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +css.escape@^1.5.1: + version "1.5.1" + resolved "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz" + integrity sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg== + +cssdb@^7.1.0: + version "7.6.0" + resolved "https://registry.npmjs.org/cssdb/-/cssdb-7.6.0.tgz" + integrity sha512-Nna7rph8V0jC6+JBY4Vk4ndErUmfJfV6NJCaZdurL0omggabiy+QB2HCQtu5c/ACLZ0I7REv7A4QyPIoYzZx0w== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^5.2.14: + version "5.2.14" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-5.2.14.tgz" + integrity sha512-t0SFesj/ZV2OTylqQVOrFgEh5uanxbO6ZAdeCrNsUQ6fVuXwYTxJPNAGvGTxHbD68ldIJNec7PyYZDBrfDQ+6A== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^3.1.0" + postcss-calc "^8.2.3" + postcss-colormin "^5.3.1" + postcss-convert-values "^5.1.3" + postcss-discard-comments "^5.1.2" + postcss-discard-duplicates "^5.1.0" + postcss-discard-empty "^5.1.1" + postcss-discard-overridden "^5.1.0" + postcss-merge-longhand "^5.1.7" + postcss-merge-rules "^5.1.4" + postcss-minify-font-values "^5.1.0" + postcss-minify-gradients "^5.1.1" + postcss-minify-params "^5.1.4" + postcss-minify-selectors "^5.2.1" + postcss-normalize-charset "^5.1.0" + postcss-normalize-display-values "^5.1.0" + postcss-normalize-positions "^5.1.1" + postcss-normalize-repeat-style "^5.1.1" + postcss-normalize-string "^5.1.0" + postcss-normalize-timing-functions "^5.1.0" + postcss-normalize-unicode "^5.1.1" + postcss-normalize-url "^5.1.0" + postcss-normalize-whitespace "^5.1.1" + postcss-ordered-values "^5.1.3" + postcss-reduce-initial "^5.1.2" + postcss-reduce-transforms "^5.1.0" + postcss-svgo "^5.1.0" + postcss-unique-selectors "^5.1.1" + +cssnano-utils@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-3.1.0.tgz" + integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA== + +cssnano@^5.0.6: + version "5.1.15" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-5.1.15.tgz" + integrity sha512-j+BKgDcLDQA+eDifLx0EO4XSA56b7uut3BQFH+wbSaSTuGLuiyTa/wbRYthUXX8LC9mLg+WWKe8h+qJuwTAbHw== + dependencies: + cssnano-preset-default "^5.2.14" + lilconfig "^2.0.3" + yaml "^1.10.2" + +csso@^4.0.2, csso@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz" + integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA== + dependencies: + css-tree "^1.1.2" + +cssom@^0.4.4: + version "0.4.4" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz" + integrity sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2, csstype@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +custom-error-instance@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/custom-error-instance/-/custom-error-instance-2.1.1.tgz" + integrity sha512-p6JFxJc3M4OTD2li2qaHkDCw9SfMw82Ldr6OC9Je1aXiGfhx2W8p3GaoeaGrPJTUN9NirTM/KTxHWMUdR1rsUg== + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-urls@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz" + integrity sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ== + dependencies: + abab "^2.0.3" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.0.0" + +date-fns@^2.25.0, date-fns@^2.30.0: + version "2.30.0" + resolved "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + +dayjs@^1.10.7, dayjs@^1.11.10: + version "1.11.10" + resolved "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz" + integrity sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ== + +debug@^2.6.0: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4, debug@4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +decimal.js@^10.2.1: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz" + integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA== + +deep-equal@^2.0.5: + version "2.2.1" + resolved "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.1.tgz" + integrity sha512-lKdkdV6EOGoVn65XaOsPdH4rMxTZOnmFyuIkMjM1i5HHCbfjC97dawgTAy0deYNfuqUqW+Q5VrVaQYtUpSd6yQ== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + es-get-iterator "^1.1.3" + get-intrinsic "^1.2.0" + is-arguments "^1.1.1" + is-array-buffer "^3.0.2" + is-date-object "^1.0.5" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + isarray "^2.0.5" + object-is "^1.1.5" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +deep-is@^0.1.3: + version "0.1.4" + resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz" + integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ== + +deepmerge@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-2.2.1.tgz" + integrity sha512-R9hc1Xa/NOBi9WRVUWg19rl1UB7Tt4kuPd+thNJgFZoxXsTz7ncaPaeIm+40oSGuP33DfMb4sZt1QIGiJzC4EA== + +deepmerge@^4.2.2: + version "4.3.1" + resolved "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + +default-gateway@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz" + integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node-es@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz" + integrity sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +detect-port-alt@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/detect-port-alt/-/detect-port-alt-1.1.6.tgz" + integrity sha512-5tQykt+LqfJFBEYaDITx7S7cR7mJ/zQmLXZ2qt5w04ainYZw6tBf9dBunMjVeVOdYVRUzUOE4HkY5J7+uttb5Q== + dependencies: + address "^1.0.1" + debug "^2.6.0" + +didyoumean@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz" + integrity sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw== + +diff-sequences@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-27.5.1.tgz" + integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ== + +diff-sequences@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.3.tgz" + integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dlv@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz" + integrity sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA== + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.0" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.0.tgz" + integrity sha512-rza3UH1LwdHh9qyPXp8lkwpjSNk/AMD3dPytUoRoqnypDUhY0xvbdmVhWOfxO68frEfV9BU8V12Ez7ZsHGZpCQ== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: + version "0.5.16" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz" + integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-helpers@^5.0.1: + version "5.2.1" + resolved "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz" + integrity sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA== + dependencies: + "@babel/runtime" "^7.8.7" + csstype "^3.0.2" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@0: + version "0.2.2" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz" + integrity sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g== + dependencies: + domelementtype "^2.0.1" + entities "^2.0.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domelementtype@1: + version "1.3.1" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz" + integrity sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w== + +domexception@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz" + integrity sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg== + dependencies: + webidl-conversions "^5.0.0" + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domutils@^1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" + integrity sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg== + dependencies: + dom-serializer "0" + domelementtype "1" + +domutils@^2.5.2: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +dotenv-expand@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz" + integrity sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA== + +dotenv@^10.0.0: + version "10.0.0" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz" + integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +ejs@^3.1.6: + version "3.1.9" + resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + +electron-to-chromium@^1.4.431: + version "1.4.453" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.453.tgz" + integrity sha512-BU8UtQz6CB3T7RIGhId4BjmjJVXQDujb0+amGL8jpcluFJr6lwspBOvkUbnttfpZCm4zFMHmjrX1QrdPWBBMjQ== + +emitter-component@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/emitter-component/-/emitter-component-1.1.1.tgz" + integrity sha512-G+mpdiAySMuB7kesVRLuyvYRqDmshB7ReKEVuyBPkzQlmiDiLrt7hHHIy4Aff552bgknVN7B2/d3lzhGO5dvpQ== + +emittery@^0.10.2: + version "0.10.2" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.10.2.tgz" + integrity sha512-aITqOwnLanpHLNXZJENbOgjUBeHocD+xsSJmNrjovKBW5HbSpW3d1pEls7GFQPUWXiwG9+0P4GtHfEqC/4M0Iw== + +emittery@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz" + integrity sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +env-cmd@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/env-cmd/-/env-cmd-10.1.0.tgz" + integrity sha512-mMdWTT9XKN7yNth/6N6g2GuKuJTsKMDHlQFUDacb/heQRRWOTIZ42t1rMHnQu4jYxU1ajdTeJM+9eEETlqToMA== + dependencies: + commander "^4.0.0" + cross-spawn "^7.0.0" + +error-ex@^1.3.1: + version "1.3.2" + resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz" + integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g== + dependencies: + is-arrayish "^0.2.1" + +error-stack-parser@^2.0.6: + version "2.1.4" + resolved "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.17.2, es-abstract@^1.19.0, es-abstract@^1.20.4, es-abstract@^1.21.2: + version "1.21.2" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz" + integrity sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg== + dependencies: + array-buffer-byte-length "^1.0.0" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.0" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.4.3" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.9" + +es-array-method-boxes-properly@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz" + integrity sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA== + +es-get-iterator@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz" + integrity sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + is-arguments "^1.1.1" + is-map "^2.0.2" + is-set "^2.0.2" + is-string "^1.0.7" + isarray "^2.0.5" + stop-iteration-iterator "^1.0.0" + +es-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^8.8.0: + version "8.8.0" + resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz" + integrity sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA== + +eslint-config-react-app@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/eslint-config-react-app/-/eslint-config-react-app-7.0.1.tgz" + integrity sha512-K6rNzvkIeHaTd8m/QEh1Zko0KI7BACWkkneSs6s9cKZC/J27X3eZR6Upt1jkmZ/4FK+XUOPPxMEN7+lbUXfSlA== + dependencies: + "@babel/core" "^7.16.0" + "@babel/eslint-parser" "^7.16.3" + "@rushstack/eslint-patch" "^1.1.0" + "@typescript-eslint/eslint-plugin" "^5.5.0" + "@typescript-eslint/parser" "^5.5.0" + babel-preset-react-app "^10.0.1" + confusing-browser-globals "^1.0.11" + eslint-plugin-flowtype "^8.0.3" + eslint-plugin-import "^2.25.3" + eslint-plugin-jest "^25.3.0" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-react "^7.27.1" + eslint-plugin-react-hooks "^4.3.0" + eslint-plugin-testing-library "^5.0.1" + +eslint-import-resolver-node@^0.3.7: + version "0.3.7" + resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz" + integrity sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA== + dependencies: + debug "^3.2.7" + is-core-module "^2.11.0" + resolve "^1.22.1" + +eslint-module-utils@^2.7.4: + version "2.8.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-flowtype@^8.0.3: + version "8.0.3" + resolved "https://registry.npmjs.org/eslint-plugin-flowtype/-/eslint-plugin-flowtype-8.0.3.tgz" + integrity sha512-dX8l6qUL6O+fYPtpNRideCFSpmWOUVx5QcaGLVqe/vlDiBSe4vYljDWDETwnyFzpl7By/WVIu6rcrniCgH9BqQ== + dependencies: + lodash "^4.17.21" + string-natural-compare "^3.0.1" + +eslint-plugin-import@^2.25.3, eslint-plugin-import@^2.27.5: + version "2.27.5" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz" + integrity sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.7.4" + has "^1.0.3" + is-core-module "^2.11.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.values "^1.1.6" + resolve "^1.22.1" + semver "^6.3.0" + tsconfig-paths "^3.14.1" + +eslint-plugin-jest@^25.3.0: + version "25.7.0" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" + integrity sha512-PWLUEXeeF7C9QGKqvdSbzLOiLTx+bno7/HC9eefePfEb257QFHg7ye3dh80AZVkaa/RQsBB1Q/ORQvg2X7F0NQ== + dependencies: + "@typescript-eslint/experimental-utils" "^5.0.0" + +eslint-plugin-jsx-a11y@^6.5.1, eslint-plugin-jsx-a11y@^6.7.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-prettier@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.2.1.tgz" + integrity sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.3.0, eslint-plugin-react-hooks@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.27.1, eslint-plugin-react@^7.32.2: + version "7.32.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz" + integrity sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.0" + string.prototype.matchall "^4.0.8" + +eslint-plugin-testing-library@^5.0.1: + version "5.11.0" + resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.0.tgz" + integrity sha512-ELY7Gefo+61OfXKlQeXNIDVVLPcvKTeiQOoMZG9TeuWa7Ln4dUNRv8JdRWBQI9Mbb427XGlVB1aa1QPZxBJM8Q== + dependencies: + "@typescript-eslint/utils" "^5.58.0" + +eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz" + integrity sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz" + integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz" + integrity sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA== + +eslint-webpack-plugin@^3.1.1: + version "3.2.0" + resolved "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz" + integrity sha512-avrKcGncpPbPSUHX6B3stNGzkKFto3eL+DKM4+VyMrVnhPc3vRczVlCq3uhuFOdRvDHTVXuzwk1ZKUrqDQHQ9w== + dependencies: + "@types/eslint" "^7.29.0 || ^8.4.1" + jest-worker "^28.0.2" + micromatch "^4.0.5" + normalize-path "^3.0.0" + schema-utils "^4.0.0" + +eslint@*, "eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.5.0 || ^8.0.0", eslint@^8.0.0, eslint@^8.1.0, eslint@^8.3.0, eslint@^8.38.0, "eslint@>= 6", eslint@>=7.0.0, eslint@>=7.28.0: + version "8.44.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz" + integrity sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.4.0" + "@eslint/eslintrc" "^2.1.0" + "@eslint/js" "8.44.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.10.0" + chalk "^4.0.0" + cross-spawn "^7.0.2" + debug "^4.3.2" + doctrine "^3.0.0" + escape-string-regexp "^4.0.0" + eslint-scope "^7.2.0" + eslint-visitor-keys "^3.4.1" + espree "^9.6.0" + esquery "^1.4.2" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^6.0.1" + find-up "^5.0.0" + glob-parent "^6.0.2" + globals "^13.19.0" + graphemer "^1.4.0" + ignore "^5.2.0" + import-fresh "^3.0.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + is-path-inside "^3.0.3" + js-yaml "^4.1.0" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.4.1" + lodash.merge "^4.6.2" + minimatch "^3.1.2" + natural-compare "^1.4.0" + optionator "^0.9.3" + strip-ansi "^6.0.1" + strip-json-comments "^3.1.0" + text-table "^0.2.0" + +espree@^9.6.0: + version "9.6.0" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz" + integrity sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +estree-walker@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz" + integrity sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +eventemitter3@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz" + integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + +exifr@^7.0.0: + version "7.1.3" + resolved "https://registry.npmjs.org/exifr/-/exifr-7.1.3.tgz" + integrity sha512-g/aje2noHivrRSLbAUtBPWFbxKdKhgj/xr1vATDdUXPOFYJlQ62Ft0oy+72V6XLIpDJfHs6gXLbBLAolqOXYRw== + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expect@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/expect/-/expect-27.5.1.tgz" + integrity sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw== + dependencies: + "@jest/types" "^27.5.1" + jest-get-type "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + +expect@^29.0.0: + version "29.6.1" + resolved "https://registry.npmjs.org/expect/-/expect-29.6.1.tgz" + integrity sha512-XEdDLonERCU1n9uR56/Stx9OqojaLAQtZf9PrCHH9Hl8YXiEIka3H4NXJ3NOIBmQJTg7+j7buh34PMHfJujc8g== + dependencies: + "@jest/expect-utils" "^29.6.1" + "@types/node" "*" + jest-get-type "^29.4.3" + jest-matcher-utils "^29.6.1" + jest-message-util "^29.6.1" + jest-util "^29.6.1" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.12, fast-glob@^3.2.9: + version "3.3.0" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.0.tgz" + integrity sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA== + 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" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +fault@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/fault/-/fault-1.0.4.tgz" + integrity sha512-CJ0HCB5tL5fYTEA7ToAq5+kTwd++Borf1/bifxd9iT70QcXr4MRrO3Llf8Ifs70q+SJcGHFtnIE/Nw6giCtECA== + dependencies: + format "^0.2.0" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +file-loader@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" + integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +filelist@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + +filesize@^8.0.6: + version "8.0.7" + resolved "https://registry.npmjs.org/filesize/-/filesize-8.0.7.tgz" + integrity sha512-pjmC+bkIF8XI7fWaH8KxHcZL3DPybs1roSKP4rKDvy20tAWwIObE4+JIseG2byfGKhud5ZnM4YSGKBz7Sh0ndQ== + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz" + integrity sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg== + dependencies: + flatted "^3.1.0" + rimraf "^3.0.2" + +flatted@^3.1.0: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0, follow-redirects@^1.15.0: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +fork-ts-checker-webpack-plugin@^6.5.0: + version "6.5.3" + resolved "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.3.tgz" + integrity sha512-SbH/l9ikmMWycd5puHJKTkZJKddF4iRLyW3DeZ08HTI7NGyLS38MXd/KGgeWumQO7YNQbW2u/NtPT2YowbPaGQ== + dependencies: + "@babel/code-frame" "^7.8.3" + "@types/json-schema" "^7.0.5" + chalk "^4.1.0" + chokidar "^3.4.2" + cosmiconfig "^6.0.0" + deepmerge "^4.2.2" + fs-extra "^9.0.0" + glob "^7.1.6" + memfs "^3.1.2" + minimatch "^3.0.4" + schema-utils "2.7.0" + semver "^7.3.2" + tapable "^1.0.0" + +form-data@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz" + integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +form-data@^4.0.0: + 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" + +format@^0.2.0: + version "0.2.2" + resolved "https://registry.npmjs.org/format/-/format-0.2.2.tgz" + integrity sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww== + +formik@^2.2.9: + version "2.4.2" + resolved "https://registry.npmjs.org/formik/-/formik-2.4.2.tgz" + integrity sha512-C6nx0hifW2uENP3M6HpPmnAE6HFWCcd8/sqBZEOHZY6lpHJ5qehsfAy43ktpFLEmkBmhiZDei726utcUB9leqg== + dependencies: + deepmerge "^2.1.1" + hoist-non-react-statics "^3.3.0" + lodash "^4.17.21" + lodash-es "^4.17.21" + react-fast-compare "^2.0.1" + tiny-warning "^1.0.2" + tslib "^2.0.0" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +frac@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/frac/-/frac-1.1.2.tgz" + integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA== + +fraction.js@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz" + integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== + +framer-motion@^7.3.6: + version "7.10.3" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-7.10.3.tgz" + integrity sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w== + dependencies: + "@motionone/dom" "^10.15.3" + hey-listen "^1.0.8" + tslib "2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-extra@^10.0.0: + 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== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.0: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-extra@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz" + integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ== + dependencies: + at-least-node "^1.0.0" + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + +fs-monkey@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz" + integrity sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + es-abstract "^1.19.0" + functions-have-names "^1.2.2" + +functions-have-names@^1.2.2, functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-own-enumerable-property-symbols@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz" + integrity sha512-I0UBV/XOz1XkIJHEUDMZAbzCThU/H8DxmSfmdGcKPnVhu2VfFqr34jr9777IyaTYvxjedWhqVIilEDsCdP5G6g== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + 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== + +glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.1.1" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" + integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== + 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" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.19.0: + version "13.20.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz" + integrity sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.0.4, globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + dependencies: + array-union "^2.1.0" + dir-glob "^3.0.1" + fast-glob "^3.2.9" + ignore "^5.2.0" + merge2 "^1.4.1" + slash "^3.0.0" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + 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== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +harmony-reflect@^1.4.6: + version "1.6.2" + resolved "https://registry.npmjs.org/harmony-reflect/-/harmony-reflect-1.6.2.tgz" + integrity sha512-HIp/n38R9kQjDEziXyDTuW3vvoxxyxjxFzXLrBr18uB47GnSt+G9D29fqrpM5ZkspMcPICud3XsBJQ4Y2URg8g== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.1, has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +hast-util-parse-selector@^2.0.0: + version "2.2.5" + resolved "https://registry.npmjs.org/hast-util-parse-selector/-/hast-util-parse-selector-2.2.5.tgz" + integrity sha512-7j6mrk/qqkSehsM92wQjdIgWM2/BW61u/53G6xmC8i1OmEdKLHbk419QKQUjz6LglWsfqoiHmyMRkP1BGjecNQ== + +hastscript@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/hastscript/-/hastscript-6.0.0.tgz" + integrity sha512-nDM6bvd7lIqDUiYEiu5Sl/+6ReP0BMk/2f4U/Rooccxkj0P5nm+acM5PrGJ/t5I8qPGiqZSE6hVAwZEdZIvP4w== + dependencies: + "@types/hast" "^2.0.0" + comma-separated-tokens "^1.0.0" + hast-util-parse-selector "^2.0.0" + property-information "^5.0.0" + space-separated-tokens "^1.0.0" + +he@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" + integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== + +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/hey-listen/-/hey-listen-1.0.8.tgz" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + +highlight.js@^10.4.1, highlight.js@~10.7.0: + version "10.7.3" + resolved "https://registry.npmjs.org/highlight.js/-/highlight.js-10.7.3.tgz" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + +history@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/history/-/history-5.3.0.tgz" + integrity sha512-ZqaKwjjrAYUYfLG+htGaIIZ4nioX2L70ZUMIFysS3xvBsSG4x/n1V6TXV3N8ZYNuFGlDirFg32T7B6WOUPDYcQ== + dependencies: + "@babel/runtime" "^7.7.6" + +hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.1, hoist-non-react-statics@^3.3.2: + version "3.3.2" + resolved "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + +hoopy@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/hoopy/-/hoopy-0.1.4.tgz" + integrity sha512-HRcs+2mr52W0K+x8RzcLzuPPmVIKMSv97RGHy0Ea9y/mpcaK+xTrjICA04KAHi4GRzxliNqNJEFYWHghy3rSfQ== + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +html-encoding-sniffer@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz" + integrity sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ== + dependencies: + whatwg-encoding "^1.0.5" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-minifier-terser@^6.0.2: + version "6.1.0" + resolved "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz" + integrity sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw== + dependencies: + camel-case "^4.1.2" + clean-css "^5.2.2" + commander "^8.3.0" + he "^1.2.0" + param-case "^3.0.4" + relateurl "^0.2.7" + terser "^5.10.0" + +html-parse-stringify@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/html-parse-stringify/-/html-parse-stringify-3.0.1.tgz" + integrity sha512-KknJ50kTInJ7qIScF3jeaFRpMpE8/lfiTdzf/twXyPBLAGrLRTmkz3AdTnKeh40X8k9L2fdYwEp/42WGXIRGcg== + dependencies: + void-elements "3.1.0" + +html-webpack-plugin@^5.5.0: + version "5.5.3" + resolved "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.3.tgz" + integrity sha512-6YrDKTuqaP/TquFH7h4srYWsZx+x6k6+FbsTm0ziCwGHDP78Unr1r9F/H4+sGmMbX08GQcJ+K64x55b+7VM/jg== + dependencies: + "@types/html-minifier-terser" "^6.0.0" + html-minifier-terser "^6.0.2" + lodash "^4.17.21" + pretty-error "^4.0.0" + tapable "^2.0.0" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz" + integrity sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg== + dependencies: + "@tootallnate/once" "1" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz" + integrity sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +hyphenate-style-name@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz" + integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ== + +i18next@^23.5.1, "i18next@>= 23.2.3": + version "23.5.1" + resolved "https://registry.npmjs.org/i18next/-/i18next-23.5.1.tgz" + integrity sha512-JelYzcaCoFDaa+Ysbfz2JsGAKkrHiMG6S61+HLBUEIPaF40WMwW9hCPymlQGrP+wWawKxKPuSuD71WZscCsWHg== + dependencies: + "@babel/runtime" "^7.22.5" + +iconv-lite@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" + integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== + dependencies: + safer-buffer ">= 2.1.2 < 3.0.0" + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idb@^7.0.1: + version "7.1.1" + resolved "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz" + integrity sha512-gchesWBzyvGHRO9W8tzUWFDycow5gwjvFKfyV9FF32Y7F50yZMp7mP+T2mJIWFx49zicqyC4uefHM17o6xKIVQ== + +identity-obj-proxy@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/identity-obj-proxy/-/identity-obj-proxy-3.0.0.tgz" + integrity sha512-00n6YnVHKrinT9t0d9+5yZC6UBNJANpYEQvL2LlX6Ab9lnmxzIRcEmTPuyGScvl1+jKuCICX1Z0Ab1pPKKdikA== + dependencies: + harmony-reflect "^1.4.6" + +ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immer@^9.0.21, immer@^9.0.7: + version "9.0.21" + resolved "https://registry.npmjs.org/immer/-/immer-9.0.21.tgz" + integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA== + +import-fresh@^3.0.0, import-fresh@^3.1.0, import-fresh@^3.2.1: + version "3.3.0" + resolved "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz" + integrity sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw== + dependencies: + parent-module "^1.0.0" + resolve-from "^4.0.0" + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +internal-slot@^1.0.3, internal-slot@^1.0.4, internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +intl-messageformat@10.5.3: + version "10.5.3" + resolved "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.5.3.tgz" + integrity sha512-TzKn1uhJBMyuKTO4zUX47SU+d66fu1W9tVzIiZrQ6hBqQQeYscBMIzKL/qEXnFbJrH9uU5VV3+T5fWib4SIcKA== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/fast-memoize" "2.2.0" + "@formatjs/icu-messageformat-parser" "2.6.2" + tslib "^2.4.0" + +invariant@^2.2.4: + version "2.2.4" + resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz" + integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA== + dependencies: + loose-envify "^1.0.0" + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +ipaddr.js@1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" + integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== + +is-alphabetical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-1.0.4.tgz" + integrity sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg== + +is-alphanumerical@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-1.0.4.tgz" + integrity sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A== + dependencies: + is-alphabetical "^1.0.0" + is-decimal "^1.0.0" + +is-arguments@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz" + integrity sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.11.0, is-core-module@^2.9.0: + version "2.12.1" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz" + integrity sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-decimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-decimal/-/is-decimal-1.0.4.tgz" + integrity sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw== + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-hexadecimal@^1.0.0: + version "1.0.4" + resolved "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz" + integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw== + +is-in-browser@^1.0.2, is-in-browser@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz" + integrity sha512-FeXIBgG/CPGd/WUxuEyvgGTEfwiG9Z4EKGxjNMRqviiIIfsmgrpnHLffEDdwUHqNva1VEW91o3xBT/m8Elgl9g== + +is-map@^2.0.1, is-map@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-mobile@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/is-mobile/-/is-mobile-3.1.1.tgz" + integrity sha512-RRoXXR2HNFxNkUnxtaBdGBXtFlUMFa06S0NUKf/LCF+MuGLu13gi9iBCkoEmc6+rpXuwi5Mso5V8Zf7mNynMBQ== + +is-module@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz" + integrity sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz" + integrity sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg== + +is-path-inside@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz" + integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-potential-custom-element-name@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz" + integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-regexp@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-regexp/-/is-regexp-1.0.0.tgz" + integrity sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA== + +is-root@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-root/-/is-root-2.1.0.tgz" + integrity sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg== + +is-set@^2.0.1, is-set@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shallow-equal@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/is-shallow-equal/-/is-shallow-equal-1.0.1.tgz" + integrity sha512-lq5RvK+85Hs5J3p4oA4256M1FEffzmI533ikeDHvJd42nouRRx5wBzt36JuviiGe5dIPyHON/d0/Up+PBo6XkQ== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.10" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz" + integrity sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +is-typedarray@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz" + integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4, istanbul-lib-instrument@^5.1.0: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^6.3.0" + +istanbul-lib-report@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^3.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + version "4.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz" + integrity sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.5" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz" + integrity sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +jake@^10.8.5: + version "10.8.7" + resolved "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz" + integrity sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.4" + minimatch "^3.1.2" + +jest-changed-files@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-27.5.1.tgz" + integrity sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw== + dependencies: + "@jest/types" "^27.5.1" + execa "^5.0.0" + throat "^6.0.1" + +jest-circus@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-27.5.1.tgz" + integrity sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + dedent "^0.7.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + throat "^6.0.1" + +jest-cli@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-27.5.1.tgz" + integrity sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw== + dependencies: + "@jest/core" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + prompts "^2.0.1" + yargs "^16.2.0" + +jest-config@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-27.5.1.tgz" + integrity sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA== + dependencies: + "@babel/core" "^7.8.0" + "@jest/test-sequencer" "^27.5.1" + "@jest/types" "^27.5.1" + babel-jest "^27.5.1" + chalk "^4.0.0" + ci-info "^3.2.0" + deepmerge "^4.2.2" + glob "^7.1.1" + graceful-fs "^4.2.9" + jest-circus "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-get-type "^27.5.1" + jest-jasmine2 "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runner "^27.5.1" + jest-util "^27.5.1" + jest-validate "^27.5.1" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^27.5.1" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-diff@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-27.5.1.tgz" + integrity sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw== + dependencies: + chalk "^4.0.0" + diff-sequences "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-diff@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.1.tgz" + integrity sha512-FsNCvinvl8oVxpNLttNQX7FAq7vR+gMDGj90tiP7siWw1UdakWUGqrylpsYrpvj908IYckm5Y0Q7azNAozU1Kg== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.4.3" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-docblock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-27.5.1.tgz" + integrity sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-27.5.1.tgz" + integrity sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + jest-get-type "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + +jest-environment-jsdom@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-27.5.1.tgz" + integrity sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + jsdom "^16.6.0" + +jest-environment-node@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-27.5.1.tgz" + integrity sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + jest-mock "^27.5.1" + jest-util "^27.5.1" + +jest-get-type@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-27.5.1.tgz" + integrity sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw== + +jest-get-type@^29.4.3: + version "29.4.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.3.tgz" + integrity sha512-J5Xez4nRRMjk8emnTpWrlkyb9pfRQQanDrvWHhsR1+VUfbwxi30eVcZFlcdGInRibU4G5LwHXpI7IRHU0CY+gg== + +jest-haste-map@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-27.5.1.tgz" + integrity sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng== + dependencies: + "@jest/types" "^27.5.1" + "@types/graceful-fs" "^4.1.2" + "@types/node" "*" + anymatch "^3.0.3" + fb-watchman "^2.0.0" + graceful-fs "^4.2.9" + jest-regex-util "^27.5.1" + jest-serializer "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + micromatch "^4.0.4" + walker "^1.0.7" + optionalDependencies: + fsevents "^2.3.2" + +jest-jasmine2@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-27.5.1.tgz" + integrity sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + co "^4.6.0" + expect "^27.5.1" + is-generator-fn "^2.0.0" + jest-each "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-runtime "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + pretty-format "^27.5.1" + throat "^6.0.1" + +jest-leak-detector@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-27.5.1.tgz" + integrity sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ== + dependencies: + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-27.5.1.tgz" + integrity sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw== + dependencies: + chalk "^4.0.0" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + pretty-format "^27.5.1" + +jest-matcher-utils@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.1.tgz" + integrity sha512-SLaztw9d2mfQQKHmJXKM0HCbl2PPVld/t9Xa6P9sgiExijviSp7TnZZpw2Fpt+OI3nwUO/slJbOfzfUMKKC5QA== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.1" + jest-get-type "^29.4.3" + pretty-format "^29.6.1" + +jest-message-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-27.5.1.tgz" + integrity sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^27.5.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^27.5.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-28.1.3.tgz" + integrity sha512-PFdn9Iewbt575zKPf1286Ht9EPoJmYT7P0kY+RibeYZ2XtOr53pDLEFoTWXbd1h4JiGiWpTBC84fc8xMXQMb7g== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^28.1.3" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^28.1.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-message-util@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.1.tgz" + integrity sha512-KoAW2zAmNSd3Gk88uJ56qXUWbFk787QKmjjJVOjtGFmmGSZgDBrlIL4AfQw1xyMYPNVD7dNInfIbur9B2rd/wQ== + dependencies: + "@babel/code-frame" "^7.12.13" + "@jest/types" "^29.6.1" + "@types/stack-utils" "^2.0.0" + chalk "^4.0.0" + graceful-fs "^4.2.9" + micromatch "^4.0.4" + pretty-format "^29.6.1" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-27.5.1.tgz" + integrity sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-27.5.1.tgz" + integrity sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg== + +jest-regex-util@^28.0.0: + version "28.0.2" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-28.0.2.tgz" + integrity sha512-4s0IgyNIy0y9FK+cjoVYoxamT7Zeo7MhzqRGx7YDYmaQn1wucY9rotiGkBzzcMXTtjrCAP/f7f+E0F7+fxPNdw== + +jest-resolve-dependencies@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-27.5.1.tgz" + integrity sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg== + dependencies: + "@jest/types" "^27.5.1" + jest-regex-util "^27.5.1" + jest-snapshot "^27.5.1" + +jest-resolve@*, jest-resolve@^27.4.2, jest-resolve@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-27.5.1.tgz" + integrity sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw== + dependencies: + "@jest/types" "^27.5.1" + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-pnp-resolver "^1.2.2" + jest-util "^27.5.1" + jest-validate "^27.5.1" + resolve "^1.20.0" + resolve.exports "^1.1.0" + slash "^3.0.0" + +jest-runner@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-27.5.1.tgz" + integrity sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ== + dependencies: + "@jest/console" "^27.5.1" + "@jest/environment" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.8.1" + graceful-fs "^4.2.9" + jest-docblock "^27.5.1" + jest-environment-jsdom "^27.5.1" + jest-environment-node "^27.5.1" + jest-haste-map "^27.5.1" + jest-leak-detector "^27.5.1" + jest-message-util "^27.5.1" + jest-resolve "^27.5.1" + jest-runtime "^27.5.1" + jest-util "^27.5.1" + jest-worker "^27.5.1" + source-map-support "^0.5.6" + throat "^6.0.1" + +jest-runtime@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-27.5.1.tgz" + integrity sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A== + dependencies: + "@jest/environment" "^27.5.1" + "@jest/fake-timers" "^27.5.1" + "@jest/globals" "^27.5.1" + "@jest/source-map" "^27.5.1" + "@jest/test-result" "^27.5.1" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + chalk "^4.0.0" + cjs-module-lexer "^1.0.0" + collect-v8-coverage "^1.0.0" + execa "^5.0.0" + glob "^7.1.3" + graceful-fs "^4.2.9" + jest-haste-map "^27.5.1" + jest-message-util "^27.5.1" + jest-mock "^27.5.1" + jest-regex-util "^27.5.1" + jest-resolve "^27.5.1" + jest-snapshot "^27.5.1" + jest-util "^27.5.1" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-serializer@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-serializer/-/jest-serializer-27.5.1.tgz" + integrity sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w== + dependencies: + "@types/node" "*" + graceful-fs "^4.2.9" + +jest-snapshot@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-27.5.1.tgz" + integrity sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA== + dependencies: + "@babel/core" "^7.7.2" + "@babel/generator" "^7.7.2" + "@babel/plugin-syntax-typescript" "^7.7.2" + "@babel/traverse" "^7.7.2" + "@babel/types" "^7.0.0" + "@jest/transform" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/babel__traverse" "^7.0.4" + "@types/prettier" "^2.1.5" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^27.5.1" + graceful-fs "^4.2.9" + jest-diff "^27.5.1" + jest-get-type "^27.5.1" + jest-haste-map "^27.5.1" + jest-matcher-utils "^27.5.1" + jest-message-util "^27.5.1" + jest-util "^27.5.1" + natural-compare "^1.4.0" + pretty-format "^27.5.1" + semver "^7.3.2" + +jest-util@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-27.5.1.tgz" + integrity sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw== + dependencies: + "@jest/types" "^27.5.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-28.1.3.tgz" + integrity sha512-XdqfpHwpcSRko/C35uLYFM2emRAltIIKZiJ9eAmhjsj0CqZMa0p1ib0R5fWIqGhn1a103DebTbpqIaP1qCQ6tQ== + dependencies: + "@jest/types" "^28.1.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-util@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.6.1.tgz" + integrity sha512-NRFCcjc+/uO3ijUVyNOQJluf8PtGCe/W6cix36+M3cTFgiYqFOOW5MgN4JOOcvbUhcKTYVd1CvHz/LWi8d16Mg== + dependencies: + "@jest/types" "^29.6.1" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-validate@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-27.5.1.tgz" + integrity sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ== + dependencies: + "@jest/types" "^27.5.1" + camelcase "^6.2.0" + chalk "^4.0.0" + jest-get-type "^27.5.1" + leven "^3.1.0" + pretty-format "^27.5.1" + +jest-watch-typeahead@^1.0.0: + version "1.1.0" + resolved "https://registry.npmjs.org/jest-watch-typeahead/-/jest-watch-typeahead-1.1.0.tgz" + integrity sha512-Va5nLSJTN7YFtC2jd+7wsoe1pNe5K4ShLux/E5iHEwlB9AxaxmggY7to9KUqKojhaJw3aXqt5WAb4jGPOolpEw== + dependencies: + ansi-escapes "^4.3.1" + chalk "^4.0.0" + jest-regex-util "^28.0.0" + jest-watcher "^28.0.0" + slash "^4.0.0" + string-length "^5.0.1" + strip-ansi "^7.0.1" + +jest-watcher@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-27.5.1.tgz" + integrity sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw== + dependencies: + "@jest/test-result" "^27.5.1" + "@jest/types" "^27.5.1" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + jest-util "^27.5.1" + string-length "^4.0.1" + +jest-watcher@^28.0.0: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-28.1.3.tgz" + integrity sha512-t4qcqj9hze+jviFPUN3YAtAEeFnr/azITXQEMARf5cMwKY2SMBRnCQTXLixTl20OR6mLh9KLMrgVJgJISym+1g== + dependencies: + "@jest/test-result" "^28.1.3" + "@jest/types" "^28.1.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.10.2" + jest-util "^28.1.3" + string-length "^4.0.1" + +jest-worker@^26.2.1: + version "26.6.2" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz" + integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^7.0.0" + +jest-worker@^27.0.2, jest-worker@^27.4.5, jest-worker@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^28.0.2: + version "28.1.3" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-28.1.3.tgz" + integrity sha512-CqRA220YV/6jCo8VWvAt1KKx6eek1VIHMPeLEbpcfSfkEeWyBNppynM/o6q+Wmw+sOhos2ml34wZbSX3G13//g== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +"jest@^27.0.0 || ^28.0.0", jest@^27.4.3: + version "27.5.1" + resolved "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz" + integrity sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ== + dependencies: + "@jest/core" "^27.5.1" + import-local "^3.0.2" + jest-cli "^27.5.1" + +jiti@^1.18.2: + version "1.19.1" + resolved "https://registry.npmjs.org/jiti/-/jiti-1.19.1.tgz" + integrity sha512-oVhqoRDaBXf7sjkll95LHVS6Myyyb1zaunVwk4Z0+WPSW4gjS0pl01zYKHScTuyEhQsFxV5L4DR5r+YqSyqyyg== + +js-base64@^3.7.2: + version "3.7.5" + resolved "https://registry.npmjs.org/js-base64/-/js-base64-3.7.5.tgz" + integrity sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA== + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdom@^16.6.0: + version "16.7.0" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz" + integrity sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw== + dependencies: + abab "^2.0.5" + acorn "^8.2.4" + acorn-globals "^6.0.0" + cssom "^0.4.4" + cssstyle "^2.3.0" + data-urls "^2.0.0" + decimal.js "^10.2.1" + domexception "^2.0.1" + escodegen "^2.0.0" + form-data "^3.0.0" + html-encoding-sniffer "^2.0.1" + http-proxy-agent "^4.0.1" + https-proxy-agent "^5.0.0" + is-potential-custom-element-name "^1.0.1" + nwsapi "^2.2.0" + parse5 "6.0.1" + saxes "^5.0.1" + symbol-tree "^3.2.4" + tough-cookie "^4.0.0" + w3c-hr-time "^1.0.2" + w3c-xmlserializer "^2.0.0" + webidl-conversions "^6.1.0" + whatwg-encoding "^1.0.5" + whatwg-mimetype "^2.3.0" + whatwg-url "^8.5.0" + ws "^7.4.6" + xml-name-validator "^3.0.0" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + 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== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-schema@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz" + integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA== + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz" + integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.0, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + +jsonpointer@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz" + integrity sha512-p/nXbhSEcu3pZRdkW1OfJhpsVtW1gd4Wa1fnQc9YLiTfAjn0312eMKimbdIQzuZl9aa9xUGaRlP9T/CJE/ditQ== + +jss-plugin-camel-case@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-camel-case/-/jss-plugin-camel-case-10.10.0.tgz" + integrity sha512-z+HETfj5IYgFxh1wJnUAU8jByI48ED+v0fuTuhKrPR+pRBYS2EDwbusU8aFOpCdYhtRc9zhN+PJ7iNE8pAWyPw== + dependencies: + "@babel/runtime" "^7.3.1" + hyphenate-style-name "^1.0.3" + jss "10.10.0" + +jss-plugin-default-unit@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-default-unit/-/jss-plugin-default-unit-10.10.0.tgz" + integrity sha512-SvpajxIECi4JDUbGLefvNckmI+c2VWmP43qnEy/0eiwzRUsafg5DVSIWSzZe4d2vFX1u9nRDP46WCFV/PXVBGQ== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-global@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-global/-/jss-plugin-global-10.10.0.tgz" + integrity sha512-icXEYbMufiNuWfuazLeN+BNJO16Ge88OcXU5ZDC2vLqElmMybA31Wi7lZ3lf+vgufRocvPj8443irhYRgWxP+A== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-nested@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-nested/-/jss-plugin-nested-10.10.0.tgz" + integrity sha512-9R4JHxxGgiZhurDo3q7LdIiDEgtA1bTGzAbhSPyIOWb7ZubrjQe8acwhEQ6OEKydzpl8XHMtTnEwHXCARLYqYA== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-props-sort@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-props-sort/-/jss-plugin-props-sort-10.10.0.tgz" + integrity sha512-5VNJvQJbnq/vRfje6uZLe/FyaOpzP/IH1LP+0fr88QamVrGJa0hpRRyAa0ea4U/3LcorJfBFVyC4yN2QC73lJg== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + +jss-plugin-rule-value-function@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-rule-value-function/-/jss-plugin-rule-value-function-10.10.0.tgz" + integrity sha512-uEFJFgaCtkXeIPgki8ICw3Y7VMkL9GEan6SqmT9tqpwM+/t+hxfMUdU4wQ0MtOiMNWhwnckBV0IebrKcZM9C0g== + dependencies: + "@babel/runtime" "^7.3.1" + jss "10.10.0" + tiny-warning "^1.0.2" + +jss-plugin-vendor-prefixer@^10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss-plugin-vendor-prefixer/-/jss-plugin-vendor-prefixer-10.10.0.tgz" + integrity sha512-UY/41WumgjW8r1qMCO8l1ARg7NHnfRVWRhZ2E2m0DMYsr2DD91qIXLyNhiX83hHswR7Wm4D+oDYNC1zWCJWtqg== + dependencies: + "@babel/runtime" "^7.3.1" + css-vendor "^2.0.8" + jss "10.10.0" + +jss@^10.10.0, jss@10.10.0: + version "10.10.0" + resolved "https://registry.npmjs.org/jss/-/jss-10.10.0.tgz" + integrity sha512-cqsOTS7jqPsPMjtKYDUpdFC0AbhYFLTcuGRqymgmdJIeQ8cH7+AgX7YSgQy79wXloZq2VvATYxUOUQEvS1V/Zw== + dependencies: + "@babel/runtime" "^7.3.1" + csstype "^3.0.2" + is-in-browser "^1.1.3" + tiny-warning "^1.0.2" + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.4" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz" + integrity sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +jwt-decode@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/jwt-decode/-/jwt-decode-3.1.2.tgz" + integrity sha512-UfpWE/VZn0iP50d8cz9NrZLM9lSWhcJ+0Gt/nm4by88UL+J1SiKN8/5dkjMmbEzwL2CAe+67GsegCbIKtbp75A== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lilconfig@^2.0.3, lilconfig@^2.0.5, lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +loader-utils@^3.2.0: + version "3.2.1" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.1.tgz" + integrity sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw== + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + +lodash._baseiteratee@~4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash._baseiteratee/-/lodash._baseiteratee-4.7.0.tgz" + integrity sha512-nqB9M+wITz0BX/Q2xg6fQ8mLkyfF7MU7eE+MNBNjTHFKeKaZAPEzEg+E8LWxKWf1DQVflNEn9N49yAuqKh2mWQ== + dependencies: + lodash._stringtopath "~4.8.0" + +lodash._basetostring@~4.12.0: + version "4.12.0" + resolved "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-4.12.0.tgz" + integrity sha512-SwcRIbyxnN6CFEEK4K1y+zuApvWdpQdBHM/swxP962s8HIxPO3alBH5t3m/dl+f4CMUug6sJb7Pww8d13/9WSw== + +lodash._baseuniq@~4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash._baseuniq/-/lodash._baseuniq-4.6.0.tgz" + integrity sha512-Ja1YevpHZctlI5beLA7oc5KNDhGcPixFhcqSiORHNsp/1QTv7amAXzw+gu4YOvErqVlMVyIJGgtzeepCnnur0A== + dependencies: + lodash._createset "~4.0.0" + lodash._root "~3.0.0" + +lodash._createset@~4.0.0: + version "4.0.3" + resolved "https://registry.npmjs.org/lodash._createset/-/lodash._createset-4.0.3.tgz" + integrity sha512-GTkC6YMprrJZCYU3zcqZj+jkXkrXzq3IPBcF/fIPpNEAB4hZEtXU8zp/RwKOvZl43NUmwDbyRk3+ZTbeRdEBXA== + +lodash._root@~3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz" + integrity sha512-O0pWuFSK6x4EXhM1dhZ8gchNtG7JMqBtrHdoUFUWXD7dJnNSUze1GuyQr5sOs0aCvgGeI3o/OJW8f4ca7FDxmQ== + +lodash._stringtopath@~4.8.0: + version "4.8.0" + resolved "https://registry.npmjs.org/lodash._stringtopath/-/lodash._stringtopath-4.8.0.tgz" + integrity sha512-SXL66C731p0xPDC5LZg4wI5H+dJo/EO4KTqOMwLYCH3+FmmfAKJEZCm6ohGpI+T1xwsDsJCfL4OnhorllvlTPQ== + dependencies: + lodash._basetostring "~4.12.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.sortby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz" + integrity sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA== + +lodash.throttle@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/lodash.throttle/-/lodash.throttle-4.1.1.tgz" + integrity sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.uniqby@4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.5.0.tgz" + integrity sha512-IRt7cfTtHy6f1aRVA5n7kT8rgN3N1nH6MOWLcHfpWG2SH19E3JksLK38MktLxZDhlAjCP9jpIXkOnRXlu6oByQ== + dependencies: + lodash._baseiteratee "~4.7.0" + lodash._baseuniq "~4.6.0" + +lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + 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" + +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + +lowlight@^1.17.0: + version "1.20.0" + resolved "https://registry.npmjs.org/lowlight/-/lowlight-1.20.0.tgz" + integrity sha512-8Ktj+prEb1RoCPkEOrPMYUN/nCggB7qAWe3a7OpMjWQkh3l2RD5wKRQ+o8Q8YuI9RG/xs95waaI/E6ym/7NsTw== + dependencies: + fault "^1.0.0" + highlight.js "~10.7.0" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +lz-string@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/lz-string/-/lz-string-1.5.0.tgz" + integrity sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ== + +magic-string@^0.25.0, magic-string@^0.25.7: + version "0.25.9" + resolved "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz" + integrity sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ== + dependencies: + sourcemap-codec "^1.4.8" + +make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz" + integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== + dependencies: + semver "^6.0.0" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +mdn-data@2.0.14: + version "2.0.14" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz" + integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow== + +mdn-data@2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz" + integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.1.2, memfs@^3.4.3: + version "3.5.3" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz" + integrity sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw== + dependencies: + fs-monkey "^1.0.4" + +memoize-one@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz" + integrity sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw== + +"memoize-one@>=3.1.1 <6": + version "5.2.1" + resolved "https://registry.npmjs.org/memoize-one/-/memoize-one-5.2.1.tgz" + integrity sha512-zYiwtZUcYyXKo/np96AGZAckk+FWWsUdJ3cHGGmld7+AhvcWmQyGCYUh1hc4Q/pkOhb65dQR/pqCyK0cOaHz4Q== + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +"mime-db@>= 1.43.0 < 2", mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-match@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/mime-match/-/mime-match-1.0.2.tgz" + integrity sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg== + dependencies: + wildcard "^1.1.0" + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + 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" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.4.5: + version "2.7.6" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + +minimist@^1.2.0, minimist@^1.2.6: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mkdirp@~0.5.1: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== + dependencies: + minimist "^1.2.6" + +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +ms@^2.1.1, ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +mui-file-input@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/mui-file-input/-/mui-file-input-3.0.2.tgz" + integrity sha512-58Jp3+f5MUXjhZjlLfYFOEOBICnLoFC4x0G1+y411JsGBjZQ1lgICv7KQVgP5aF+IRvhJ1vfI6KpbnmqwRKXoA== + dependencies: + pretty-bytes "^6.1.1" + +mui-image@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/mui-image/-/mui-image-1.0.7.tgz" + integrity sha512-U79TWMKMfMC1ZiGnv/M+SaVJeUpubEjXOdy7w53RsvidUAMZ+4nW+QmDG9yg5fgWeYy6YJgLHyI9BHSDw76iIg== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +mz@^2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz" + integrity sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q== + dependencies: + any-promise "^1.0.0" + object-assign "^4.0.1" + thenify-all "^1.0.0" + +namespace-emitter@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/namespace-emitter/-/namespace-emitter-2.0.1.tgz" + integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g== + +nanoclone@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/nanoclone/-/nanoclone-0.2.1.tgz" + integrity sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA== + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +nanoid@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-4.0.2.tgz" + integrity sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.12: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-url@^6.0.1: + version "6.1.0" + resolved "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz" + integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz" + integrity sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg== + dependencies: + boolbase "~1.0.0" + +nth-check@^2.0.1: + 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== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.0: + version "2.2.7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-hash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz" + integrity sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-is@^1.1.5: + version "1.1.5" + resolved "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz" + integrity sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.3" + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz" + integrity sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.fromentries@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz" + integrity sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.getownpropertydescriptors@^2.1.0: + version "2.1.6" + resolved "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.6.tgz" + integrity sha512-lq+61g26E/BgHv0ZTFgRvi7NMEPuAxLkFU7rukXjc/AlwH4Am5xXVnIXy3un1bg/JPbXHrixRkK1itUzzPiIjQ== + dependencies: + array.prototype.reduce "^1.0.5" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.21.2" + safe-array-concat "^1.0.0" + +object.hasown@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz" + integrity sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw== + dependencies: + define-properties "^1.1.4" + es-abstract "^1.20.4" + +object.values@^1.1.0, object.values@^1.1.6: + version "1.1.6" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz" + integrity sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz" + integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9, open@^8.4.0: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +p-limit@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz" + integrity sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw== + dependencies: + p-limit "^3.0.2" + +p-queue@^7.3.4: + version "7.4.1" + resolved "https://registry.npmjs.org/p-queue/-/p-queue-7.4.1.tgz" + integrity sha512-vRpMXmIkYF2/1hLBKisKeVYJZ8S2tZ0zEAmIJgdVKP2nq0nh4qCdf8bgw+ZgKrkh71AOCaqzwbJJk1WtdcF3VA== + dependencies: + eventemitter3 "^5.0.1" + p-timeout "^5.0.2" + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-timeout@^5.0.2: + version "5.1.0" + resolved "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz" + integrity sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew== + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + +parent-module@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz" + integrity sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g== + dependencies: + callsites "^3.0.0" + +parse-entities@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/parse-entities/-/parse-entities-2.0.0.tgz" + integrity sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ== + dependencies: + character-entities "^1.0.0" + character-entities-legacy "^1.0.0" + character-reference-invalid "^1.0.0" + is-alphanumerical "^1.0.0" + is-decimal "^1.0.0" + is-hexadecimal "^1.0.0" + +parse-json@^5.0.0, parse-json@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz" + integrity sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg== + dependencies: + "@babel/code-frame" "^7.0.0" + error-ex "^1.3.1" + json-parse-even-better-errors "^2.3.0" + lines-and-columns "^1.1.6" + +parse5@6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz" + integrity sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw== + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +perfect-scrollbar@^1.5.0: + version "1.5.5" + resolved "https://registry.npmjs.org/perfect-scrollbar/-/perfect-scrollbar-1.5.5.tgz" + integrity sha512-dzalfutyP3e/FOpdlhVryN4AJ5XDVauVWxybSkLZmakFE2sS3y3pc4JnSprw8tGmHvkaG5Edr5T7LBTZ+WWU2g== + +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz" + integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow== + +picocolors@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz" + integrity sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.2, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pirates@^4.0.1, pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@^4.1.0, pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-up@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz" + integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA== + dependencies: + find-up "^3.0.0" + +postcss-attribute-case-insensitive@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.2.tgz" + integrity sha512-XIidXV8fDr0kKt28vqki84fRK8VW8eTuIa4PChv2MqKuT6C9UjmSKzen6KaWhWEoYvwxFCa7n/tC1SZ3tyq4SQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-browser-comments@^4: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-browser-comments/-/postcss-browser-comments-4.0.0.tgz" + integrity sha512-X9X9/WN3KIvY9+hNERUqX9gncsgBA25XaeR+jshHz2j8+sYyHktHw1JdKuMjeLpGktXidqDhA7b/qm1mrBDmgg== + +postcss-calc@^8.2.3: + version "8.2.4" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-8.2.4.tgz" + integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q== + dependencies: + postcss-selector-parser "^6.0.9" + postcss-value-parser "^4.2.0" + +postcss-clamp@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/postcss-clamp/-/postcss-clamp-4.1.0.tgz" + integrity sha512-ry4b1Llo/9zz+PKC+030KUnPITTJAHeOwjfAyyB60eT0AorGLdzp52s31OsPRHRf8NchkgFoG2y6fCfn1IV1Ow== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-functional-notation@^4.2.4: + version "4.2.4" + resolved "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.4.tgz" + integrity sha512-2yrTAUZUab9s6CpxkxC4rVgFEVaR6/2Pipvi6qcgvnYiVqZcbDHEoBDhrXzyb7Efh2CCfHQNtcqWcIruDTIUeg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-hex-alpha@^8.0.4: + version "8.0.4" + resolved "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.4.tgz" + integrity sha512-nLo2DCRC9eE4w2JmuKgVA3fGL3d01kGq752pVALF68qpGLmx2Qrk91QTKkdUqqp45T1K1XV8IhQpcu1hoAQflQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-color-rebeccapurple@^7.1.1: + version "7.1.1" + resolved "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.1.1.tgz" + integrity sha512-pGxkuVEInwLHgkNxUc4sdg4g3py7zUeCQ9sMfwyHAT+Ezk8a4OaaVZ8lIY5+oNqA/BXXgLyXv0+5wHP68R79hg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-colormin@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-5.3.1.tgz" + integrity sha512-UsWQG0AqTFQmpBegeLLc1+c3jIqBNB0zlDGRWR+dQ3pRKJL1oeMzyqmH3o2PIfn9MBdNrVPWhDbT769LxCTLJQ== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-5.1.3.tgz" + integrity sha512-82pC1xkJZtcJEfiLw6UXnXVXScgtBrjlO5CBmuDQc+dlb88ZYheFsjTn40+zBVi3DkfF7iezO0nJUPLcJK3pvA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-custom-media@^8.0.2: + version "8.0.2" + resolved "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.2.tgz" + integrity sha512-7yi25vDAoHAkbhAzX9dHx2yc6ntS4jQvejrNcC+csQJAXjj15e7VcWfMgLqBNAbOvqi5uIa9huOVwdHbf+sKqg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-properties@^12.1.10: + version "12.1.11" + resolved "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.11.tgz" + integrity sha512-0IDJYhgU8xDv1KY6+VgUwuQkVtmYzRwu+dMjnmdMafXYv86SWqfxkc7qdDvWS38vsjaEtv8e0vGOUQrAiMBLpQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-custom-selectors@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.3.tgz" + integrity sha512-fgVkmyiWDwmD3JbpCmB45SvvlCD6z9CG6Ie6Iere22W5aHea6oWa7EM2bpnv2Fj3I94L3VbtvX9KqwSi5aFzSg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-dir-pseudo-class@^6.0.5: + version "6.0.5" + resolved "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.5.tgz" + integrity sha512-eqn4m70P031PF7ZQIvSgy9RSJ5uI2171O/OO/zcRNYpJbvaeKFUlar1aJ7rmgiQtbm0FSPsRewjpdS0Oew7MPA== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-discard-comments@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz" + integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ== + +postcss-discard-duplicates@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz" + integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw== + +postcss-discard-empty@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz" + integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A== + +postcss-discard-overridden@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz" + integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw== + +postcss-double-position-gradients@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.2.tgz" + integrity sha512-GX+FuE/uBR6eskOK+4vkXgT6pDkexLokPaz/AbJna9s5Kzp/yl488pKPjhy0obB475ovfT1Wv8ho7U/cHNaRgQ== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-env-function@^4.0.6: + version "4.0.6" + resolved "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz" + integrity sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-flexbugs-fixes@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/postcss-flexbugs-fixes/-/postcss-flexbugs-fixes-5.0.2.tgz" + integrity sha512-18f9voByak7bTktR2QgDveglpn9DTbBWPUzSOe9g0N4WR/2eSt6Vrcbf0hmspvMI6YWGywz6B9f7jzpFNJJgnQ== + +postcss-focus-visible@^6.0.4: + version "6.0.4" + resolved "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz" + integrity sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-focus-within@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz" + integrity sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ== + dependencies: + postcss-selector-parser "^6.0.9" + +postcss-font-variant@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz" + integrity sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA== + +postcss-gap-properties@^3.0.5: + version "3.0.5" + resolved "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.5.tgz" + integrity sha512-IuE6gKSdoUNcvkGIqdtjtcMtZIFyXZhmFd5RUlg97iVEvp1BZKV5ngsAjCjrVy+14uhGBQl9tzmi1Qwq4kqVOg== + +postcss-image-set-function@^4.0.7: + version "4.0.7" + resolved "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.7.tgz" + integrity sha512-9T2r9rsvYzm5ndsBE8WgtrMlIT7VbtTfE7b3BQnudUqnBcBo7L758oc+o+pdj/dUV0l5wjwSdjeOH2DZtfv8qw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-import@^15.1.0: + version "15.1.0" + resolved "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz" + integrity sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew== + dependencies: + postcss-value-parser "^4.0.0" + read-cache "^1.0.0" + resolve "^1.1.7" + +postcss-initial@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz" + integrity sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ== + +postcss-js@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz" + integrity sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw== + dependencies: + camelcase-css "^2.0.1" + +postcss-lab-function@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.1.tgz" + integrity sha512-xuXll4isR03CrQsmxyz92LJB2xX9n+pZJ5jE9JgcnmsCammLyKdlzrBin+25dy6wIjfhJpKBAN80gsTlCgRk2w== + dependencies: + "@csstools/postcss-progressive-custom-properties" "^1.1.0" + postcss-value-parser "^4.2.0" + +postcss-load-config@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz" + integrity sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA== + dependencies: + lilconfig "^2.0.5" + yaml "^2.1.1" + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-logical@^5.0.4: + version "5.0.4" + resolved "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz" + integrity sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g== + +postcss-media-minmax@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz" + integrity sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ== + +postcss-merge-longhand@^5.1.7: + version "5.1.7" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-5.1.7.tgz" + integrity sha512-YCI9gZB+PLNskrK0BB3/2OzPnGhPkBEwmwhfYk1ilBHYVAZB7/tkTHFBAnCrvBBOmeYyMYw3DMjT55SyxMBzjQ== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^5.1.1" + +postcss-merge-rules@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-5.1.4.tgz" + integrity sha512-0R2IuYpgU93y9lhVbO/OylTtKMVcHb67zjWIfCiKR9rWL3GUk1677LAqD/BcHizukdZEjT8Ru3oHRoAYoJy44g== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^3.1.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz" + integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz" + integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw== + dependencies: + colord "^2.9.1" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^5.1.4: + version "5.1.4" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-5.1.4.tgz" + integrity sha512-+mePA3MgdmVmv6g+30rn57USjOGSAyuxUmkfiWpzalZ8aiBkdPYjXWtHuwJGm1v5Ojy0Z0LaSYhHaLJQB0P8Jw== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz" + integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-nested@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz" + integrity sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ== + dependencies: + postcss-selector-parser "^6.0.11" + +postcss-nesting@^10.2.0: + version "10.2.0" + resolved "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.2.0.tgz" + integrity sha512-EwMkYchxiDiKUhlJGzWsD9b2zvq/r2SSubcRrgP+jujMXFzqvANLt16lJANC+5uZ6hjI7lpRmI6O8JIl+8l1KA== + dependencies: + "@csstools/selector-specificity" "^2.0.0" + postcss-selector-parser "^6.0.10" + +postcss-normalize-charset@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz" + integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg== + +postcss-normalize-display-values@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz" + integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz" + integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz" + integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz" + integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz" + integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.1.tgz" + integrity sha512-qnCL5jzkNUmKVhZoENp1mJiGNPcsJCs1aaRmURmeJGES23Z/ajaln+EPTD+rBeNkSryI+2WTdW+lwcVdOikrpA== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz" + integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew== + dependencies: + normalize-url "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz" + integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize@^10.0.1: + version "10.0.1" + resolved "https://registry.npmjs.org/postcss-normalize/-/postcss-normalize-10.0.1.tgz" + integrity sha512-+5w18/rDev5mqERcG3W5GZNMJa1eoYYNGo8gB7tEwaos0ajk3ZXAI4mHGcNT47NE+ZnZD1pEpUOFLvltIwmeJA== + dependencies: + "@csstools/normalize.css" "*" + postcss-browser-comments "^4" + sanitize.css "*" + +postcss-opacity-percentage@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/postcss-opacity-percentage/-/postcss-opacity-percentage-1.1.3.tgz" + integrity sha512-An6Ba4pHBiDtyVpSLymUUERMo2cU7s+Obz6BTrS+gxkbnSBNKSuD0AVUc+CpBMrpVPKKfoVz0WQCX+Tnst0i4A== + +postcss-ordered-values@^5.1.3: + version "5.1.3" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz" + integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ== + dependencies: + cssnano-utils "^3.1.0" + postcss-value-parser "^4.2.0" + +postcss-overflow-shorthand@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.4.tgz" + integrity sha512-otYl/ylHK8Y9bcBnPLo3foYFLL6a6Ak+3EQBPOTR7luMYCOsiVTUk1iLvNf6tVPNGXcoL9Hoz37kpfriRIFb4A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-page-break@^3.0.4: + version "3.0.4" + resolved "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz" + integrity sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ== + +postcss-place@^7.0.5: + version "7.0.5" + resolved "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.5.tgz" + integrity sha512-wR8igaZROA6Z4pv0d+bvVrvGY4GVHihBCBQieXFY3kuSuMyOmEnnfFzHl/tQuqHZkfkIVBEbDvYcFfHmpSet9g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-preset-env@^7.0.1: + version "7.8.3" + resolved "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.8.3.tgz" + integrity sha512-T1LgRm5uEVFSEF83vHZJV2z19lHg4yJuZ6gXZZkqVsqv63nlr6zabMH3l4Pc01FQCyfWVrh2GaUeCVy9Po+Aag== + dependencies: + "@csstools/postcss-cascade-layers" "^1.1.1" + "@csstools/postcss-color-function" "^1.1.1" + "@csstools/postcss-font-format-keywords" "^1.0.1" + "@csstools/postcss-hwb-function" "^1.0.2" + "@csstools/postcss-ic-unit" "^1.0.1" + "@csstools/postcss-is-pseudo-class" "^2.0.7" + "@csstools/postcss-nested-calc" "^1.0.0" + "@csstools/postcss-normalize-display-values" "^1.0.1" + "@csstools/postcss-oklab-function" "^1.1.1" + "@csstools/postcss-progressive-custom-properties" "^1.3.0" + "@csstools/postcss-stepped-value-functions" "^1.0.1" + "@csstools/postcss-text-decoration-shorthand" "^1.0.0" + "@csstools/postcss-trigonometric-functions" "^1.0.2" + "@csstools/postcss-unset-value" "^1.0.2" + autoprefixer "^10.4.13" + browserslist "^4.21.4" + css-blank-pseudo "^3.0.3" + css-has-pseudo "^3.0.4" + css-prefers-color-scheme "^6.0.3" + cssdb "^7.1.0" + postcss-attribute-case-insensitive "^5.0.2" + postcss-clamp "^4.1.0" + postcss-color-functional-notation "^4.2.4" + postcss-color-hex-alpha "^8.0.4" + postcss-color-rebeccapurple "^7.1.1" + postcss-custom-media "^8.0.2" + postcss-custom-properties "^12.1.10" + postcss-custom-selectors "^6.0.3" + postcss-dir-pseudo-class "^6.0.5" + postcss-double-position-gradients "^3.1.2" + postcss-env-function "^4.0.6" + postcss-focus-visible "^6.0.4" + postcss-focus-within "^5.0.4" + postcss-font-variant "^5.0.0" + postcss-gap-properties "^3.0.5" + postcss-image-set-function "^4.0.7" + postcss-initial "^4.0.1" + postcss-lab-function "^4.2.1" + postcss-logical "^5.0.4" + postcss-media-minmax "^5.0.0" + postcss-nesting "^10.2.0" + postcss-opacity-percentage "^1.1.2" + postcss-overflow-shorthand "^3.0.4" + postcss-page-break "^3.0.4" + postcss-place "^7.0.5" + postcss-pseudo-class-any-link "^7.1.6" + postcss-replace-overflow-wrap "^4.0.0" + postcss-selector-not "^6.0.1" + postcss-value-parser "^4.2.0" + +postcss-pseudo-class-any-link@^7.1.6: + version "7.1.6" + resolved "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.6.tgz" + integrity sha512-9sCtZkO6f/5ML9WcTLcIyV1yz9D1rf0tWc+ulKcvV30s0iZKS/ONyETvoWsr6vnrmW+X+KmuK3gV/w5EWnT37w== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-reduce-initial@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-5.1.2.tgz" + integrity sha512-dE/y2XRaqAi6OvjzD22pjTUQ8eOfc6m/natGHgKFBK9DxFmIm69YmaRVQrGgFlEfc1HePIurY0TmDeROK05rIg== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz" + integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-replace-overflow-wrap@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz" + integrity sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw== + +postcss-selector-not@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-6.0.1.tgz" + integrity sha512-1i9affjAe9xu/y9uqWH+tD4r6/hDaXJruk8xn2x1vzxC2U3J3LKO3zJW4CyxlNhA56pADJ/djpEwpH1RClI2rQ== + dependencies: + postcss-selector-parser "^6.0.10" + +postcss-selector-parser@^6.0.10, postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9: + 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== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-5.1.0.tgz" + integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^2.7.0" + +postcss-unique-selectors@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz" + integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.0.0, postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +"postcss@^7.0.0 || ^8.0.1", postcss@^8, postcss@^8.0.0, postcss@^8.0.3, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.1.4, postcss@^8.2, postcss@^8.2.14, postcss@^8.2.15, postcss@^8.2.2, postcss@^8.3, postcss@^8.3.5, postcss@^8.4, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.4, postcss@^8.4.6, "postcss@>= 8", postcss@>=8, postcss@>=8.0.9: + version "8.4.25" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.25.tgz" + integrity sha512-7taJ/8t2av0Z+sQEvNzCkpDynl0tX3uJMCODi6nT3PfASC7dYCWV9aQ+uiCf+KBD4SEFcu+GvJdGdwzQ6OSjCw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +postcss@^7.0.35: + version "7.0.39" + resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz" + integrity sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA== + dependencies: + picocolors "^0.2.1" + source-map "^0.6.1" + +preact@^10.5.13: + version "10.17.1" + resolved "https://registry.npmjs.org/preact/-/preact-10.17.1.tgz" + integrity sha512-X9BODrvQ4Ekwv9GURm9AKAGaomqXmip7NQTZgY7gcNmr7XE83adOMJvd3N42id1tMFU7ojiynRsYnY6/BRFxLA== + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz" + integrity sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w== + dependencies: + fast-diff "^1.1.2" + +prettier@^2.8.7, prettier@>=2.0.0: + version "2.8.8" + resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" + integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== + +pretty-bytes@^5.3.0, pretty-bytes@^5.4.1: + version "5.6.0" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz" + integrity sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg== + +pretty-bytes@^6.1.1: + version "6.1.1" + resolved "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-6.1.1.tgz" + integrity sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ== + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +pretty-format@^27.0.2: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^27.5.1: + version "27.5.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-27.5.1.tgz" + integrity sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ== + dependencies: + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^17.0.1" + +pretty-format@^28.1.3: + version "28.1.3" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-28.1.3.tgz" + integrity sha512-8gFb/To0OmxHR9+ZTb14Df2vNxdGCX8g1xWGUTqUw5TiZvcQf5sHKObd5UcPyLLyowNwDAMTF3XWOG1B6mxl1Q== + dependencies: + "@jest/schemas" "^28.1.3" + ansi-regex "^5.0.1" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +pretty-format@^29.0.0, pretty-format@^29.6.1: + version "29.6.1" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.1.tgz" + integrity sha512-7jRj+yXO0W7e4/tSJKoR7HRIHLPPjtNaUGG2xxKQnGvPNRkgWcQ0AZX6P4KBRJN4FcTBWb3sa7DVUJmocYuoog== + dependencies: + "@jest/schemas" "^29.6.0" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +prismjs@^1.27.0: + version "1.29.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz" + integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q== + +prismjs@~1.27.0: + version "1.27.0" + resolved "https://registry.npmjs.org/prismjs/-/prismjs-1.27.0.tgz" + integrity sha512-t13BGPUlFDR7wRB5kQDG4jjl7XeuH6jbJGt11JHPL96qwsEHNX2+68tFXqc1/k+/jALsbSWJKUOT/hcYAZ5LkA== + +process-nextick-args@~2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz" + integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== + +promise@^8.1.0: + version "8.3.0" + resolved "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz" + integrity sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg== + dependencies: + asap "~2.0.6" + +prompts@^2.0.1, prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.1, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: + version "15.8.1" + resolved "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + +proper-lockfile@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/proper-lockfile/-/proper-lockfile-4.1.2.tgz" + integrity sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA== + dependencies: + graceful-fs "^4.2.4" + retry "^0.12.0" + signal-exit "^3.0.2" + +property-expr@^2.0.4: + version "2.0.5" + resolved "https://registry.npmjs.org/property-expr/-/property-expr-2.0.5.tgz" + integrity sha512-IJUkICM5dP5znhCckHSv30Q4b5/JA5enCtkRHYaOVOAocnH/1BQEYTC5NMfT3AVl/iXKdr3aqQbQn9DxyWknwA== + +property-information@^5.0.0: + version "5.6.0" + resolved "https://registry.npmjs.org/property-information/-/property-information-5.6.0.tgz" + integrity sha512-YUHSPk+A30YPv+0Qf8i9Mbfe/C0hdPXk1s1jPVToV8pk8BQtpw10ct89Eo7OWkutrwqvT0eicAxlOg3dOAu8JA== + dependencies: + xtend "^4.0.0" + +proxy-addr@~2.0.7: + version "2.0.7" + resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz" + integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +q@^1.1.2: + version "1.5.1" + resolved "https://registry.npmjs.org/q/-/q-1.5.1.tgz" + integrity sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.npmjs.org/raf/-/raf-3.4.1.tgz" + integrity sha512-Sq4CW4QhwOHE8ucn6J34MqtZCeWFP2aQSmrlroYgqAV1PjStIhJXxYuTgUIfkEk7zTLjmIjLmU5q+fbD1NnOJA== + dependencies: + performance-now "^2.1.0" + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +rc-util@^5.9.4: + version "5.34.1" + resolved "https://registry.npmjs.org/rc-util/-/rc-util-5.34.1.tgz" + integrity sha512-SqiUT8Ssgh5C+hu4y887xwCrMNcxLm6ScOo8AFlWYYF3z9uNNiPpwwSjvicqOlWd79rNw1g44rnP7tz9MrO1ZQ== + dependencies: + "@babel/runtime" "^7.18.3" + react-is "^16.12.0" + +react-apexcharts@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/react-apexcharts/-/react-apexcharts-1.4.0.tgz" + integrity sha512-DrcMV4aAMrUG+n6412yzyATWEyCDWlpPBBhVbpzBC4PDeuYU6iF84SmExbck+jx5MUm4U5PM3/T307Mc3kzc9Q== + dependencies: + prop-types "^15.5.7" + +react-app-polyfill@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/react-app-polyfill/-/react-app-polyfill-3.0.0.tgz" + integrity sha512-sZ41cxiU5llIB003yxxQBYrARBqe0repqPTTYBTmMqTz9szeBbE37BehCE891NZsmdZqqP+xWKdT3eo3vOzN8w== + dependencies: + core-js "^3.19.2" + object-assign "^4.1.1" + promise "^8.1.0" + raf "^3.4.1" + regenerator-runtime "^0.13.9" + whatwg-fetch "^3.6.2" + +react-copy-to-clipboard@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/react-copy-to-clipboard/-/react-copy-to-clipboard-5.1.0.tgz" + integrity sha512-k61RsNgAayIJNoy9yDsYzDe/yAZAzEbEgcz3DZMhF686LEyukcE1hzurxe85JandPUG+yTfGVFzuEw3xt8WP/A== + dependencies: + copy-to-clipboard "^3.3.1" + prop-types "^15.8.1" + +react-dev-utils@^12.0.1: + version "12.0.1" + resolved "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz" + integrity sha512-84Ivxmr17KjUupyqzFode6xKhjwuEJDROWKJy/BthkL7Wn6NJ8h4WE6k/exAv6ImS+0oZLRRW5j/aINMHyeGeQ== + dependencies: + "@babel/code-frame" "^7.16.0" + address "^1.1.2" + browserslist "^4.18.1" + chalk "^4.1.2" + cross-spawn "^7.0.3" + detect-port-alt "^1.1.6" + escape-string-regexp "^4.0.0" + filesize "^8.0.6" + find-up "^5.0.0" + fork-ts-checker-webpack-plugin "^6.5.0" + global-modules "^2.0.0" + globby "^11.0.4" + gzip-size "^6.0.0" + immer "^9.0.7" + is-root "^2.1.0" + loader-utils "^3.2.0" + open "^8.4.0" + pkg-up "^3.1.0" + prompts "^2.4.2" + react-error-overlay "^6.0.11" + recursive-readdir "^2.2.2" + shell-quote "^1.7.3" + strip-ansi "^6.0.1" + text-table "^0.2.0" + +react-device-detect@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/react-device-detect/-/react-device-detect-2.2.3.tgz" + integrity sha512-buYY3qrCnQVlIFHrC5UcUoAj7iANs/+srdkwsnNjI7anr3Tt7UY6MqNxtMLlr0tMBied0O49UZVK8XKs3ZIiPw== + dependencies: + ua-parser-js "^1.0.33" + +"react-dom@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", "react-dom@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react-dom@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react-dom@^16.8 || ^17.0 || ^18.0", "react-dom@^16.8.0 || ^17.0.0", "react-dom@^17.0.0 || ^18.0.0", react-dom@^17.0.2, react-dom@^18.0.0, react-dom@^18.2.0, "react-dom@>= 0.14.0", "react-dom@>= 16.3.0", react-dom@>=16, react-dom@>=16.0.0, react-dom@>=16.3.3, react-dom@>=16.6.0, react-dom@>=16.8, react-dom@>=16.8.0, react-dom@>=16.9.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-draggable@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-draggable/-/react-draggable-4.4.5.tgz" + integrity sha512-OMHzJdyJbYTZo4uQE393fHcqqPYsEtkjfMgvCHr6rejT+Ezn4OZbNyGH50vv+SunC1RMvwOTSWkEODQLzw1M9g== + dependencies: + clsx "^1.1.1" + prop-types "^15.8.1" + +react-element-to-jsx-string@^15.0.0: + version "15.0.0" + resolved "https://registry.npmjs.org/react-element-to-jsx-string/-/react-element-to-jsx-string-15.0.0.tgz" + integrity sha512-UDg4lXB6BzlobN60P8fHWVPX3Kyw8ORrTeBtClmIlGdkOOE+GYQSFvmEU5iLLpwp/6v42DINwNcwOhOLfQ//FQ== + dependencies: + "@base2/pretty-print-object" "1.0.1" + is-plain-object "5.0.0" + react-is "18.1.0" + +react-error-overlay@^6.0.11: + version "6.0.11" + resolved "https://registry.npmjs.org/react-error-overlay/-/react-error-overlay-6.0.11.tgz" + integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== + +react-fast-compare@^2.0.1: + version "2.0.4" + resolved "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-2.0.4.tgz" + integrity sha512-suNP+J1VU1MWFKcyt7RtjiSWUjvidmQSlqu+eHslq+342xCbGTYmC0mEhPCOHxlW0CywylOC1u2DFAT+bv4dBw== + +react-hook-form@^7.45.4: + version "7.45.4" + resolved "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.45.4.tgz" + integrity sha512-HGDV1JOOBPZj10LB3+OZgfDBTn+IeEsNOKiq/cxbQAIbKaiJUe/KV8DBUzsx0Gx/7IG/orWqRRm736JwOfUSWQ== + +react-i18next@^13.2.2: + version "13.2.2" + resolved "https://registry.npmjs.org/react-i18next/-/react-i18next-13.2.2.tgz" + integrity sha512-+nFUkbRByFwnrfDcYqvzBuaeZb+nACHx+fAWN/pZMddWOCJH5hoc21+Sa/N/Lqi6ne6/9wC/qRGOoQhJa6IkEQ== + dependencies: + "@babel/runtime" "^7.22.5" + html-parse-stringify "^3.0.1" + +react-idle-timer@^5.7.2: + version "5.7.2" + resolved "https://registry.npmjs.org/react-idle-timer/-/react-idle-timer-5.7.2.tgz" + integrity sha512-+BaPfc7XEUU5JFkwZCx6fO1bLVK+RBlFH+iY4X34urvIzZiZINP6v2orePx3E6pAztJGE7t4DzvL7if2SL/0GQ== + +react-intl@^6.4.7: + version "6.4.7" + resolved "https://registry.npmjs.org/react-intl/-/react-intl-6.4.7.tgz" + integrity sha512-0hnOHAZhxTFqD1hGTxrF40qNyZJPPYiGhWIIxIz0Udz+3e3c7sdN80qlxArR+AbJ+jb5ALXZkJYH20+GPFCM0Q== + dependencies: + "@formatjs/ecma402-abstract" "1.17.2" + "@formatjs/icu-messageformat-parser" "2.6.2" + "@formatjs/intl" "2.9.3" + "@formatjs/intl-displaynames" "6.5.2" + "@formatjs/intl-listformat" "7.4.2" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/react" "16 || 17 || 18" + hoist-non-react-statics "^3.3.2" + intl-messageformat "10.5.3" + tslib "^2.4.0" + +react-is@^16.12.0, react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.1: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-is@18.1.0: + version "18.1.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.1.0.tgz" + integrity sha512-Fl7FuabXsJnV5Q1qIOQwx/sagGF18kogb4gpfcG4gjLBWO0WDiiz1ko/ExayuxE7InyQkBLkxRFG5oxY6Uu3Kg== + +react-number-format@^4.9.4: + version "4.9.4" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-4.9.4.tgz" + integrity sha512-Gq20Z3ugqPLFgeaidnx5on9cNpbQZntPN3QgNAL/WJrNNlQnNznY0LCx7g8xtssmRBw0/hw+SCqw6zAcajooiA== + dependencies: + prop-types "^15.7.2" + +react-number-format@^5.2.2: + version "5.3.1" + resolved "https://registry.npmjs.org/react-number-format/-/react-number-format-5.3.1.tgz" + integrity sha512-qpYcQLauIeEhCZUZY9jXZnnroOtdy3jYaS1zQ3M1Sr6r/KMOBEIGNIb7eKT19g2N1wbYgFgvDzs19hw5TrB8XQ== + dependencies: + prop-types "^15.7.2" + +react-perfect-scrollbar@^1.5.8: + version "1.5.8" + resolved "https://registry.npmjs.org/react-perfect-scrollbar/-/react-perfect-scrollbar-1.5.8.tgz" + integrity sha512-bQ46m70gp/HJtiBOF3gRzBISSZn8FFGNxznTdmTG8AAwpxG1bJCyn7shrgjEvGSQ5FJEafVEiosY+ccER11OSA== + dependencies: + perfect-scrollbar "^1.5.0" + prop-types "^15.6.1" + +"react-redux@^7.2.1 || ^8.0.2", react-redux@^8.0.4: + version "8.1.1" + resolved "https://registry.npmjs.org/react-redux/-/react-redux-8.1.1.tgz" + integrity sha512-5W0QaKtEhj+3bC0Nj0NkqkhIv8gLADH/2kYFMTHxCVqQILiWzLv6MaLuV5wJU3BQEdHKzTfcvPN0WMS6SC1oyA== + dependencies: + "@babel/runtime" "^7.12.1" + "@types/hoist-non-react-statics" "^3.3.1" + "@types/use-sync-external-store" "^0.0.3" + hoist-non-react-statics "^3.3.2" + react-is "^18.0.0" + use-sync-external-store "^1.0.0" + +react-refresh@^0.11.0, "react-refresh@>=0.10.0 <1.0.0": + version "0.11.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz" + integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== + +react-remove-scroll-bar@^2.3.4: + version "2.3.4" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@^2.5.6: + version "2.5.6" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.6.tgz" + integrity sha512-bO856ad1uDYLefgArk559IzUNeQ6SWH4QnrevIUjH+GczV56giDfl3h0Idptf2oIKxQmd1p9BN25jleKodTALg== + dependencies: + react-remove-scroll-bar "^2.3.4" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-router-dom@^6.4.1: + version "6.14.1" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.14.1.tgz" + integrity sha512-ssF6M5UkQjHK70fgukCJyjlda0Dgono2QGwqGvuk7D+EDGHdacEN3Yke2LTMjkrpHuFwBfDFsEjGVXBDmL+bWw== + dependencies: + "@remix-run/router" "1.7.1" + react-router "6.14.1" + +react-router@^6.4.1, react-router@6.14.1: + version "6.14.1" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.14.1.tgz" + integrity sha512-U4PfgvG55LdvbQjg5Y9QRWyVxIdO1LlpYT7x+tMAxd9/vmiPuJhIwdxZuIQLN/9e3O4KFDHYfR9gzGeYMasW8g== + dependencies: + "@remix-run/router" "1.7.1" + +react-scripts@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz" + integrity sha512-8VAmEm/ZAwQzJ+GOMLbBsTdDKOpuZh7RPs0UymvBR2vRk4iZWCskjbFnxqjrzoIvlNNRZ3QJFx6/qDSi6zSnaQ== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.3" + "@svgr/webpack" "^5.5.0" + babel-jest "^27.4.2" + babel-loader "^8.2.3" + babel-plugin-named-asset-import "^0.3.8" + babel-preset-react-app "^10.0.1" + bfj "^7.0.2" + browserslist "^4.18.1" + camelcase "^6.2.1" + case-sensitive-paths-webpack-plugin "^2.4.0" + css-loader "^6.5.1" + css-minimizer-webpack-plugin "^3.2.0" + dotenv "^10.0.0" + dotenv-expand "^5.1.0" + eslint "^8.3.0" + eslint-config-react-app "^7.0.1" + eslint-webpack-plugin "^3.1.1" + file-loader "^6.2.0" + fs-extra "^10.0.0" + html-webpack-plugin "^5.5.0" + identity-obj-proxy "^3.0.0" + jest "^27.4.3" + jest-resolve "^27.4.2" + jest-watch-typeahead "^1.0.0" + mini-css-extract-plugin "^2.4.5" + postcss "^8.4.4" + postcss-flexbugs-fixes "^5.0.2" + postcss-loader "^6.2.1" + postcss-normalize "^10.0.1" + postcss-preset-env "^7.0.1" + prompts "^2.4.2" + react-app-polyfill "^3.0.0" + react-dev-utils "^12.0.1" + react-refresh "^0.11.0" + resolve "^1.20.0" + resolve-url-loader "^4.0.0" + sass-loader "^12.3.0" + semver "^7.3.5" + source-map-loader "^3.0.0" + style-loader "^3.3.1" + tailwindcss "^3.0.2" + terser-webpack-plugin "^5.2.5" + webpack "^5.64.4" + webpack-dev-server "^4.6.0" + webpack-manifest-plugin "^4.0.2" + workbox-webpack-plugin "^6.4.1" + optionalDependencies: + fsevents "^2.3.2" + +react-style-singleton@^2.2.1: + version "2.2.1" + resolved "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz" + integrity sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g== + dependencies: + get-nonce "^1.0.0" + invariant "^2.2.4" + tslib "^2.0.0" + +react-syntax-highlighter@^15.5.0: + version "15.5.0" + resolved "https://registry.npmjs.org/react-syntax-highlighter/-/react-syntax-highlighter-15.5.0.tgz" + integrity sha512-+zq2myprEnQmH5yw6Gqc8lD55QHnpKaU8TOcFeC/Lg/MQSs8UknEA0JC4nTZGFAXC2J2Hyj/ijJ7NlabyPi2gg== + dependencies: + "@babel/runtime" "^7.3.1" + highlight.js "^10.4.1" + lowlight "^1.17.0" + prismjs "^1.27.0" + refractor "^3.6.0" + +react-textarea-autosize@8.5.2: + version "8.5.2" + resolved "https://registry.npmjs.org/react-textarea-autosize/-/react-textarea-autosize-8.5.2.tgz" + integrity sha512-uOkyjkEl0ByEK21eCJMHDGBAAd/BoFQBawYK5XItjAmCTeSbjxghd8qnt7nzsLYzidjnoObu6M26xts0YGKsGg== + dependencies: + "@babel/runtime" "^7.20.13" + use-composed-ref "^1.3.0" + use-latest "^1.2.1" + +react-toastify@^9.1.3: + version "9.1.3" + resolved "https://registry.npmjs.org/react-toastify/-/react-toastify-9.1.3.tgz" + integrity sha512-fPfb8ghtn/XMxw3LkxQBk3IyagNpF/LIKjOBflbexr2AWxAH1MJgvnESwEwBn9liLFXgTKWgBSdZpw9m4OTHTg== + dependencies: + clsx "^1.1.1" + +react-transition-group@^4.0.0, react-transition-group@^4.4.5: + version "4.4.5" + resolved "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz" + integrity sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g== + dependencies: + "@babel/runtime" "^7.5.5" + dom-helpers "^5.0.1" + loose-envify "^1.4.0" + prop-types "^15.6.2" + +react-window@^1.8.7: + version "1.8.9" + resolved "https://registry.npmjs.org/react-window/-/react-window-1.8.9.tgz" + integrity sha512-+Eqx/fj1Aa5WnhRfj9dJg4VYATGwIUP2ItwItiJ6zboKWA6EX3lYDAXfGF2hyNqplEprhbtjbipiADEcwQ823Q== + dependencies: + "@babel/runtime" "^7.0.0" + memoize-one ">=3.1.1 <6" + +"react@^0.14 || ^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^0.14.8 || ^15.0.1 || ^16.0.0 || ^17.0.1 || ^18.0.0", "react@^0.14.9 || ^15.3.0 || ^16.0.0-rc || ^16.0 || ^17.0 || ^18.0.0", "react@^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0", "react@^15.3.0 || 16 || 17 || 18", "react@^16.0.0 || ^17.0.0 || ^18.0.0", "react@^16.6.0 || 17 || 18", "react@^16.8 || ^17.0 || ^18.0", "react@^16.8.0 || ^17 || ^18", "react@^16.8.0 || ^17.0.0", "react@^16.8.0 || ^17.0.0 || ^18.0.0", "react@^16.9.0 || ^17.0.0 || ^18", react@^17.0.0, "react@^17.0.0 || ^18.0.0", react@^17.0.2, "react@^17.0.2 || ^18.0.0", react@^18.0.0, react@^18.2.0, "react@>= 0.14.0", "react@>= 16", "react@>= 16.3.0", "react@>= 16.8.0", react@>=0.13, react@>=16, react@>=16.0.0, react@>=16.3.3, react@>=16.6.0, react@>=16.8, react@>=16.8.0, react@>=16.9.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-cache@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz" + integrity sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA== + dependencies: + pify "^2.3.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +readable-stream@^3.0.6: + version "3.6.2" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz" + integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA== + dependencies: + inherits "^2.0.3" + string_decoder "^1.1.1" + util-deprecate "^1.0.1" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +recursive-readdir@^2.2.2: + version "2.2.3" + resolved "https://registry.npmjs.org/recursive-readdir/-/recursive-readdir-2.2.3.tgz" + integrity sha512-8HrF5ZsXk5FAH9dgsx3BlUer73nIhuj+9OrQwEbLTPOBzGkL1lsFCR01am+v+0m2Cmbs1nP12hLDl5FA7EszKA== + dependencies: + minimatch "^3.0.5" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redux-thunk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-2.4.2.tgz" + integrity sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q== + +redux@^4, "redux@^4 || ^5.0.0-beta.0", redux@^4.2.0, redux@^4.2.1: + version "4.2.1" + resolved "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + +refractor@^3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/refractor/-/refractor-3.6.0.tgz" + integrity sha512-MY9W41IOWxxk31o+YvFCNyNzdkc9M20NoZK5vq6jkv4I/uh2zkWcfudj0Q1fovjUQJrNewS9NMzeTtqPf+n5EA== + dependencies: + hastscript "^6.0.0" + parse-entities "^2.0.0" + prismjs "~1.27.0" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.13.11, regenerator-runtime@^0.13.9: + version "0.13.11" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz" + integrity sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.1: + version "0.15.1" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz" + integrity sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.2.11" + resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz" + integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q== + +regexp.prototype.flags@^1.4.3, regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +relateurl@^0.2.7: + version "0.2.7" + resolved "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz" + integrity sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog== + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-directory@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" + integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q== + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +reselect@^4.1.8: + version "4.1.8" + resolved "https://registry.npmjs.org/reselect/-/reselect-4.1.8.tgz" + integrity sha512-ab9EmR80F/zQTMNeneUr4cv+jSwPJgIlvEmVwLerwrWVbpLlBuls9XHzIeTFy4cegU2NHBp3va0LKOzU5qFEYQ== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz" + integrity sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^7.0.35" + source-map "0.6.1" + +resolve.exports@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-1.1.1.tgz" + integrity sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ== + +resolve@^1.1.7, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.1, resolve@^1.22.2: + version "1.22.2" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz" + integrity sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g== + dependencies: + is-core-module "^2.11.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.12.0: + version "0.12.0" + resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" + integrity sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow== + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rifm@^0.7.0: + version "0.7.0" + resolved "https://registry.npmjs.org/rifm/-/rifm-0.7.0.tgz" + integrity sha512-DSOJTWHD67860I5ojetXdEQRIBvF6YcpNe53j0vn1vp9EUb9N80EiZTxgP+FkDKorWC8PZw052kTF4C1GOivCQ== + dependencies: + "@babel/runtime" "^7.3.1" + +rimraf@^3.0.0, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rollup-plugin-terser@^7.0.0: + version "7.0.2" + resolved "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz" + integrity sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ== + dependencies: + "@babel/code-frame" "^7.10.4" + jest-worker "^26.2.1" + serialize-javascript "^4.0.0" + terser "^5.0.0" + +"rollup@^1.20.0 || ^2.0.0", rollup@^1.20.0||^2.0.0, rollup@^2.0.0, rollup@^2.43.1: + version "2.79.1" + resolved "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz" + integrity sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw== + optionalDependencies: + fsevents "~2.3.2" + +run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@^5.1.0, safe-buffer@>=5.1.0, safe-buffer@5.2.1: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-buffer@~5.1.0: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sanitize.css@*: + version "13.0.0" + resolved "https://registry.npmjs.org/sanitize.css/-/sanitize.css-13.0.0.tgz" + integrity sha512-ZRwKbh/eQ6w9vmTjkuG0Ioi3HBwPFce0O+v//ve+aOq1oeCy7jMV2qzzAlpsNuqpqCBjjriM1lbtZbF/Q8jVyA== + +sass-loader@^12.3.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sax@>=0.6.0, sax@~1.2.4: + version "1.2.4" + resolved "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz" + integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== + +saxes@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz" + integrity sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + 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== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +schema-utils@2.7.0: + version "2.7.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.0.tgz" + integrity sha512-0ilKFI6QQF5nxDZLFn2dMjvc4hjg/Wkg7rHd3jK6/A4a1Hl9VFdQWvgB1UMGoU94pad1P/8N7fMcEnLnSiju8A== + dependencies: + "@types/json-schema" "^7.0.4" + ajv "^6.12.2" + ajv-keywords "^3.4.1" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +semver@^6.0.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^6.3.0: + version "6.3.0" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz" + integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== + +semver@^7.3.2, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8: + version "7.5.3" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz" + integrity sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + dependencies: + debug "2.6.9" + depd "2.0.0" + destroy "1.2.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + fresh "0.5.2" + http-errors "2.0.0" + mime "1.6.0" + ms "2.1.3" + on-finished "2.4.1" + range-parser "~1.2.1" + statuses "2.0.1" + +serialize-javascript@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz" + integrity sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw== + dependencies: + randombytes "^2.1.0" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + 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== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + dependencies: + accepts "~1.3.4" + batch "0.6.1" + debug "2.6.9" + escape-html "~1.0.3" + http-errors "~1.6.2" + mime-types "~2.1.17" + parseurl "~1.3.2" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.2, signal-exit@^3.0.3: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simplebar-react@^2.4.1: + version "2.4.3" + resolved "https://registry.npmjs.org/simplebar-react/-/simplebar-react-2.4.3.tgz" + integrity sha512-Ep8gqAUZAS5IC2lT5RE4t1ZFUIVACqbrSRQvFV9a6NbVUzXzOMnc4P82Hl8Ak77AnPQvmgUwZS7aUKLyBoMAcg== + dependencies: + prop-types "^15.6.1" + simplebar "^5.3.9" + +simplebar@^5.3.8, simplebar@^5.3.9: + version "5.3.9" + resolved "https://registry.npmjs.org/simplebar/-/simplebar-5.3.9.tgz" + integrity sha512-1vIIpjDvY9sVH14e0LGeiCiTFU3ILqAghzO6OI9axeG+mvU/vMSrvXeAXkBolqFFz3XYaY8n5ahH9MeP3sp2Ag== + dependencies: + "@juggle/resize-observer" "^3.3.1" + can-use-dom "^0.1.0" + core-js "^3.0.1" + lodash.debounce "^4.0.8" + lodash.memoize "^4.1.2" + lodash.throttle "^4.1.1" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +source-list-map@^2.0.0, source-list-map@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" + integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw== + +source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.0: + version "3.0.2" + resolved "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz" + integrity sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-support@^0.5.6, source-map-support@~0.5.20: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.6.1, source-map@0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +source-map@^0.8.0-beta.0: + version "0.8.0-beta.0" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.8.0-beta.0.tgz" + integrity sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA== + dependencies: + whatwg-url "^7.0.0" + +source-map@~0.6.0: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +sourcemap-codec@^1.4.8: + version "1.4.8" + resolved "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz" + integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA== + +space-separated-tokens@^1.0.0: + version "1.1.5" + resolved "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-1.1.5.tgz" + integrity sha512-q/JSVd1Lptzhf5bkYm4ob4iWPjx0KiRe3sRFBNrVqbJkFaBm5vbbowy1mymoPNLRa52+oadOhJ+K49wsSeSjTA== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + dependencies: + debug "^4.1.0" + detect-node "^2.0.4" + hpack.js "^2.1.6" + obuf "^1.1.2" + readable-stream "^3.0.6" + wbuf "^1.7.3" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + dependencies: + debug "^4.1.0" + handle-thing "^2.0.0" + http-deceiver "^1.2.7" + select-hose "^2.0.0" + spdy-transport "^3.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +ssf@~0.11.2: + version "0.11.2" + resolved "https://registry.npmjs.org/ssf/-/ssf-0.11.2.tgz" + integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g== + dependencies: + frac "~1.1.2" + +stable@^0.1.8: + version "0.1.8" + resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz" + integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +stop-iteration-iterator@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz" + integrity sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ== + dependencies: + internal-slot "^1.0.4" + +stream@0.0.2: + version "0.0.2" + resolved "https://registry.npmjs.org/stream/-/stream-0.0.2.tgz" + integrity sha512-gCq3NDI2P35B2n6t76YJuOp7d6cN/C7Rt0577l91wllh0sY9ZBuw9KaSGqH/b0hzn3CWWJbpbW0W0WvQ1H/Q7g== + dependencies: + emitter-component "^1.1.1" + +string_decoder@^1.1.1, string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-length@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/string-length/-/string-length-5.0.1.tgz" + integrity sha512-9Ep08KAMUn0OadnVaBuRdE2l615CQ508kr0XMadjClfYpdCyvrbFp6Taebo8yyxokQ4viUd/xPPUA4FGgUa0ow== + dependencies: + char-regex "^2.0.0" + strip-ansi "^7.0.1" + +string-natural-compare@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/string-natural-compare/-/string-natural-compare-3.0.1.tgz" + integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw== + +string-width@^4.1.0, string-width@^4.2.0: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.6, string.prototype.matchall@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz" + integrity sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + get-intrinsic "^1.1.3" + has-symbols "^1.0.3" + internal-slot "^1.0.3" + regexp.prototype.flags "^1.4.3" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz" + integrity sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +stringify-object@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/stringify-object/-/stringify-object-3.3.0.tgz" + integrity sha512-rHqiFh1elqCQ9WPLIC8I0Q/g/wj5J1eMkyoiD6eoQApWHP0FtlK7rqnhmabL5VUY9JQCcqwwvlOaSuutekgyrw== + dependencies: + get-own-enumerable-property-symbols "^3.0.0" + is-obj "^1.0.1" + is-regexp "^1.0.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-ansi@^7.0.1: + version "7.1.0" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" + integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== + dependencies: + ansi-regex "^6.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-comments@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz" + integrity sha512-ZprKx+bBLXv067WTCALv8SSz5l2+XhpYCsVtSqlMnkAXMWDq+/ekVbl1ghqP9rUHTzv6sm/DwCOiYutU/yp1fw== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz" + integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== + +style-loader@^3.3.1: + version "3.3.3" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz" + integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== + +stylehacks@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-5.1.1.tgz" + integrity sha512-sBpcd5Hx7G6seo7b1LkpttvTz7ikD0LlH5RmdcBNb6fFR0Fl7LQwHDFr300q4cwUqi+IYrFGmsIHieMBfnN/Bw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +sucrase@^3.32.0: + version "3.32.0" + resolved "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz" + integrity sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ== + 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" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +svg-parser@^2.0.2: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svg.draggable.js@^2.2.2: + version "2.2.2" + resolved "https://registry.npmjs.org/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz" + integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== + dependencies: + svg.js "^2.0.1" + +svg.easing.js@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/svg.easing.js/-/svg.easing.js-2.0.0.tgz" + integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== + dependencies: + svg.js ">=2.3.x" + +svg.filter.js@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/svg.filter.js/-/svg.filter.js-2.0.2.tgz" + integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== + dependencies: + svg.js "^2.2.5" + +svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5, svg.js@>=2.3.x: + version "2.7.1" + resolved "https://registry.npmjs.org/svg.js/-/svg.js-2.7.1.tgz" + integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== + +svg.pathmorphing.js@^0.1.3: + version "0.1.3" + resolved "https://registry.npmjs.org/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz" + integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== + dependencies: + svg.js "^2.4.0" + +svg.resize.js@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/svg.resize.js/-/svg.resize.js-1.4.3.tgz" + integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== + dependencies: + svg.js "^2.6.5" + svg.select.js "^2.1.2" + +svg.select.js@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-2.1.2.tgz" + integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== + dependencies: + svg.js "^2.2.5" + +svg.select.js@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/svg.select.js/-/svg.select.js-3.0.1.tgz" + integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== + dependencies: + svg.js "^2.6.5" + +svgo@^1.2.2: + version "1.3.2" + resolved "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz" + integrity sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw== + dependencies: + chalk "^2.4.1" + coa "^2.0.2" + css-select "^2.0.0" + css-select-base-adapter "^0.1.1" + css-tree "1.0.0-alpha.37" + csso "^4.0.2" + js-yaml "^3.13.1" + mkdirp "~0.5.1" + object.values "^1.1.0" + sax "~1.2.4" + stable "^0.1.8" + unquote "~1.1.1" + util.promisify "~1.0.0" + +svgo@^2.7.0: + version "2.8.0" + resolved "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz" + integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg== + 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" + +symbol-tree@^3.2.4: + version "3.2.4" + resolved "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz" + integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== + +tabbable@^6.0.1: + version "6.2.0" + resolved "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz" + integrity sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew== + +tailwindcss@^3.0.2: + version "3.3.2" + resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz" + integrity sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w== + 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.2.12" + glob-parent "^6.0.2" + is-glob "^4.0.3" + jiti "^1.18.2" + 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" + postcss-value-parser "^4.2.0" + resolve "^1.22.2" + sucrase "^3.32.0" + +tapable@^1.0.0: + version "1.1.3" + resolved "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz" + integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA== + +tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +temp-dir@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz" + integrity sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg== + +tempy@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/tempy/-/tempy-0.6.0.tgz" + integrity sha512-G13vtMYPT/J8A4X2SjdtBTphZlrp1gKv6hZiOjw14RCWg6GbHuQBGtjlx75xLbYV/wEc0D7G5K4rxKP/cXk8Bw== + dependencies: + is-stream "^2.0.0" + temp-dir "^2.0.0" + type-fest "^0.16.0" + unique-string "^2.0.0" + +terminal-link@^2.0.0: + version "2.1.1" + resolved "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz" + integrity sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ== + dependencies: + ansi-escapes "^4.2.1" + supports-hyperlinks "^2.0.0" + +terser-webpack-plugin@^5.2.5, terser-webpack-plugin@^5.3.7: + 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== + 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" + +terser@^5.0.0, terser@^5.10.0, terser@^5.16.8: + version "5.18.2" + resolved "https://registry.npmjs.org/terser/-/terser-5.18.2.tgz" + integrity sha512-Ah19JS86ypbJzTzvUCX7KOsEIhDaRONungA4aYBjEP3JZRf4ocuDzTg4QWZnPn9DEMiMYGJPiSOy7aykoCc70w== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" + integrity sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +thenify-all@^1.0.0: + 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== + dependencies: + thenify ">= 3.1.0 < 4" + +"thenify@>= 3.1.0 < 4": + version "3.3.1" + resolved "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz" + integrity sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw== + dependencies: + any-promise "^1.0.0" + +throat@^6.0.1: + version "6.0.2" + resolved "https://registry.npmjs.org/throat/-/throat-6.0.2.tgz" + integrity sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +timers@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/timers/-/timers-0.1.1.tgz" + integrity sha512-pkJC8uIP/gxDHxNQUBUbjHyl6oZfT+ofn7tbaHW+CFIUjI+Q2MBbHcx1JSBQfhDaTcO9bNg328q0i7Vk5PismQ== + +tiny-warning@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" + integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +toggle-selection@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz" + integrity sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ== + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +toposort@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/toposort/-/toposort-2.0.2.tgz" + integrity sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg== + +tough-cookie@^4.0.0: + version "4.1.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz" + integrity sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA== + dependencies: + punycode "^2.1.0" + +tr46@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz" + integrity sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw== + dependencies: + punycode "^2.1.1" + +tryer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/tryer/-/tryer-1.0.1.tgz" + integrity sha512-c3zayb8/kWWpycWYg87P71E1S1ZL6b6IJxfb5fvsUgsf0S2MVGaDhDXXjDMpdCpfWXqptc+4mXwmiy1ypXqRAA== + +ts-interface-checker@^0.1.9: + 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== + +tsconfig-paths@^3.14.1: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.1, tslib@^2.4.0: + version "2.6.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.0.tgz" + integrity sha512-7At1WUettjcSRHXCyYtTselblcHl9PJFFVKiCAy/bY97+BPZXSQ2wbq0P9s8tK2G7dFQfNnlJnPAiArVBVBsfA== + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +tus-js-client@^3.0.0: + version "3.1.1" + resolved "https://registry.npmjs.org/tus-js-client/-/tus-js-client-3.1.1.tgz" + integrity sha512-SZzWP62jEFLmROSRZx+uoGLKqsYWMGK/m+PiNehPVWbCm7/S9zRIMaDxiaOcKdMnFno4luaqP5E+Y1iXXPjP0A== + dependencies: + buffer-from "^1.1.2" + combine-errors "^3.0.3" + is-stream "^2.0.0" + js-base64 "^3.7.2" + lodash.throttle "^4.1.1" + proper-lockfile "^4.1.2" + url-parse "^1.5.7" + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz" + integrity sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g== + +type-fest@^0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz" + integrity sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg== + +type-fest@^0.20.2, "type-fest@>=0.17.0 <4.0.0": + version "0.20.2" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" + integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== + +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + +type-fest@^3.13.1: + version "3.13.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +typedarray-to-buffer@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz" + integrity sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q== + dependencies: + is-typedarray "^1.0.0" + +"typescript@^3.2.1 || ^4", "typescript@^4.7 || 5", "typescript@>= 2.7", "typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@4.8.3: + version "4.8.3" + resolved "https://registry.npmjs.org/typescript/-/typescript-4.8.3.tgz" + integrity sha512-goMHfm00nWPa8UvR/CPSvykqf6dVV8x/dp0c5mFTMTIu0u0FlGWRioyy7Nn0PGAdHxpJZnuO/ut+PpQ8UiHAig== + +ua-parser-js@^1.0.33: + version "1.0.35" + resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.35.tgz" + integrity sha512-fKnGuqmTBnIE+/KXSzCn4db8RTigUzw1AN0DmdU6hJovUTbYJKyqj+8Mt1c4VfRDnOVJnENmfYkIPZ946UrSAA== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +unique-string@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz" + integrity sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg== + dependencies: + crypto-random-string "^2.0.0" + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + +unpipe@~1.0.0, unpipe@1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +unquote@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz" + integrity sha512-vRCqFv6UhXpWxZPyGDh/F3ZpNv8/qo7w6iufLpQg9aKnQ71qM4B5KiI7Mia9COcjEhrO9LueHpMYjYzsWH3OIg== + +upath@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz" + integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-parse@^1.5.3, url-parse@^1.5.7: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-composed-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-composed-ref/-/use-composed-ref-1.3.0.tgz" + integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-latest@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/use-latest/-/use-latest-1.2.1.tgz" + integrity sha512-xA+AVm/Wlg3e2P/JiItTziwS7FK92LWrDB0p+hgXloIMuVCeJJ8v6f0eeHyPZaJrM+usM1FkFfbNCrJGs8A/zw== + dependencies: + use-isomorphic-layout-effect "^1.1.1" + +use-sidecar@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz" + integrity sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw== + dependencies: + detect-node-es "^1.1.0" + tslib "^2.0.0" + +use-sync-external-store@^1.0.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +util.promisify@~1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz" + integrity sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA== + dependencies: + define-properties "^1.1.3" + es-abstract "^1.17.2" + has-symbols "^1.0.1" + object.getownpropertydescriptors "^2.1.0" + +utila@~0.4: + version "0.4.0" + resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-to-istanbul@^8.1.0: + version "8.1.1" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-8.1.1.tgz" + integrity sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w== + dependencies: + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + source-map "^0.7.3" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +void-elements@3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/void-elements/-/void-elements-3.1.0.tgz" + integrity sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w== + +w3c-hr-time@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz" + integrity sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ== + dependencies: + browser-process-hrtime "^1.0.0" + +w3c-xmlserializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz" + integrity sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA== + dependencies: + xml-name-validator "^3.0.0" + +walker@^1.0.7: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +web-vitals@^3.0.2: + version "3.3.2" + resolved "https://registry.npmjs.org/web-vitals/-/web-vitals-3.3.2.tgz" + integrity sha512-qRkpmSeKfEWAzNhtX541xA8gCJ+pqCqBmUlDVkVDSCSYUvfvNqF+k9g8I+uyreRcDBdfiJrd0/aLbTy5ydo49Q== + +webidl-conversions@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz" + integrity sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg== + +webidl-conversions@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz" + integrity sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA== + +webidl-conversions@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz" + integrity sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w== + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.6.0, "webpack-dev-server@3.x || 4.x": + version "4.15.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + dependencies: + "@types/bonjour" "^3.5.9" + "@types/connect-history-api-fallback" "^1.3.5" + "@types/express" "^4.17.13" + "@types/serve-index" "^1.9.1" + "@types/serve-static" "^1.13.10" + "@types/sockjs" "^0.3.33" + "@types/ws" "^8.5.5" + ansi-html-community "^0.0.8" + bonjour-service "^1.0.11" + chokidar "^3.5.3" + colorette "^2.0.10" + compression "^1.7.4" + connect-history-api-fallback "^2.0.0" + default-gateway "^6.0.3" + express "^4.17.3" + graceful-fs "^4.2.6" + html-entities "^2.3.2" + http-proxy-middleware "^2.0.3" + ipaddr.js "^2.0.1" + launch-editor "^2.6.0" + open "^8.0.9" + p-retry "^4.5.0" + rimraf "^3.0.2" + schema-utils "^4.0.0" + selfsigned "^2.1.1" + serve-index "^1.9.1" + sockjs "^0.3.24" + spdy "^4.0.2" + webpack-dev-middleware "^5.3.1" + ws "^8.13.0" + +webpack-manifest-plugin@^4.0.2: + version "4.1.1" + resolved "https://registry.npmjs.org/webpack-manifest-plugin/-/webpack-manifest-plugin-4.1.1.tgz" + integrity sha512-YXUAwxtfKIJIKkhg03MKuiFAD72PlrqCiwdwO4VEXdRO5V0ORCNwaOwAZawPZalCbmH9kBDmXnNeQOw+BIEiow== + dependencies: + tapable "^2.0.0" + webpack-sources "^2.2.0" + +webpack-sources@^1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz" + integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ== + dependencies: + source-list-map "^2.0.0" + source-map "~0.6.1" + +webpack-sources@^2.2.0: + version "2.3.1" + resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.3.1.tgz" + integrity sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA== + dependencies: + source-list-map "^2.0.1" + source-map "^0.6.1" + +webpack-sources@^3.2.3: + 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== + +"webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", "webpack@^4.4.0 || ^5.9.0", "webpack@^4.44.2 || ^5.47.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.20.0, webpack@^5.64.4, "webpack@>= 4", webpack@>=2, "webpack@>=4.43.0 <6.0.0": + version "5.88.1" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.1.tgz" + integrity sha512-FROX3TxQnC/ox4N+3xQoWZzvGXSuscxR32rbzjpXgEzWudJFEJBpdlkkob2ylrv5yzzufD1zph1OoFsLtm6stQ== + 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" + +websocket-driver@^0.7.4, websocket-driver@>=0.5.1: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz" + integrity sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw== + dependencies: + iconv-lite "0.4.24" + +whatwg-fetch@^3.6.2: + version "3.6.2" + resolved "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.6.2.tgz" + integrity sha512-bJlen0FcuU/0EMLrdbJ7zOnW6ITZLrZMIarMUVmdKtsGvZna8vxKYaexICWPfZ8qwf9fzNq+UEIZrnSaApt6RA== + +whatwg-mimetype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz" + integrity sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g== + +whatwg-url@^7.0.0: + version "7.1.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz" + integrity sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg== + dependencies: + lodash.sortby "^4.7.0" + tr46 "^1.0.1" + webidl-conversions "^4.0.2" + +whatwg-url@^8.0.0, whatwg-url@^8.5.0: + version "8.7.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz" + integrity sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg== + dependencies: + lodash "^4.7.0" + tr46 "^2.1.0" + webidl-conversions "^6.1.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + dependencies: + is-bigint "^1.0.1" + is-boolean-object "^1.1.0" + is-number-object "^1.0.4" + is-string "^1.0.5" + is-symbol "^1.0.3" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-typed-array@^1.1.9: + version "1.1.9" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz" + integrity sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + is-typed-array "^1.1.10" + +which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-1.1.2.tgz" + integrity sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng== + +wmf@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/wmf/-/wmf-1.0.2.tgz" + integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw== + +word@~0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/word/-/word-0.3.0.tgz" + integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA== + +workbox-background-sync@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-6.6.0.tgz" + integrity sha512-jkf4ZdgOJxC9u2vztxLuPT/UjlH7m/nWRQ/MgGL0v8BJHoZdVGJd18Kck+a0e55wGXdqyHO+4IQTk0685g4MUw== + dependencies: + idb "^7.0.1" + workbox-core "6.6.0" + +workbox-broadcast-update@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-broadcast-update/-/workbox-broadcast-update-6.6.0.tgz" + integrity sha512-nm+v6QmrIFaB/yokJmQ/93qIJ7n72NICxIwQwe5xsZiV2aI93MGGyEyzOzDPVz5THEr5rC3FJSsO3346cId64Q== + dependencies: + workbox-core "6.6.0" + +workbox-build@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-build/-/workbox-build-6.6.0.tgz" + integrity sha512-Tjf+gBwOTuGyZwMz2Nk/B13Fuyeo0Q84W++bebbVsfr9iLkDSo6j6PST8tET9HYA58mlRXwlMGpyWO8ETJiXdQ== + dependencies: + "@apideck/better-ajv-errors" "^0.3.1" + "@babel/core" "^7.11.1" + "@babel/preset-env" "^7.11.0" + "@babel/runtime" "^7.11.2" + "@rollup/plugin-babel" "^5.2.0" + "@rollup/plugin-node-resolve" "^11.2.1" + "@rollup/plugin-replace" "^2.4.1" + "@surma/rollup-plugin-off-main-thread" "^2.2.3" + ajv "^8.6.0" + common-tags "^1.8.0" + fast-json-stable-stringify "^2.1.0" + fs-extra "^9.0.1" + glob "^7.1.6" + lodash "^4.17.20" + pretty-bytes "^5.3.0" + rollup "^2.43.1" + rollup-plugin-terser "^7.0.0" + source-map "^0.8.0-beta.0" + stringify-object "^3.3.0" + strip-comments "^2.0.1" + tempy "^0.6.0" + upath "^1.2.0" + workbox-background-sync "6.6.0" + workbox-broadcast-update "6.6.0" + workbox-cacheable-response "6.6.0" + workbox-core "6.6.0" + workbox-expiration "6.6.0" + workbox-google-analytics "6.6.0" + workbox-navigation-preload "6.6.0" + workbox-precaching "6.6.0" + workbox-range-requests "6.6.0" + workbox-recipes "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + workbox-streams "6.6.0" + workbox-sw "6.6.0" + workbox-window "6.6.0" + +workbox-cacheable-response@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-cacheable-response/-/workbox-cacheable-response-6.6.0.tgz" + integrity sha512-JfhJUSQDwsF1Xv3EV1vWzSsCOZn4mQ38bWEBR3LdvOxSPgB65gAM6cS2CX8rkkKHRgiLrN7Wxoyu+TuH67kHrw== + dependencies: + workbox-core "6.6.0" + +workbox-core@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-core/-/workbox-core-6.6.0.tgz" + integrity sha512-GDtFRF7Yg3DD859PMbPAYPeJyg5gJYXuBQAC+wyrWuuXgpfoOrIQIvFRZnQ7+czTIQjIr1DhLEGFzZanAT/3bQ== + +workbox-expiration@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-expiration/-/workbox-expiration-6.6.0.tgz" + integrity sha512-baplYXcDHbe8vAo7GYvyAmlS4f6998Jff513L4XvlzAOxcl8F620O91guoJ5EOf5qeXG4cGdNZHkkVAPouFCpw== + dependencies: + idb "^7.0.1" + workbox-core "6.6.0" + +workbox-google-analytics@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-google-analytics/-/workbox-google-analytics-6.6.0.tgz" + integrity sha512-p4DJa6OldXWd6M9zRl0H6vB9lkrmqYFkRQ2xEiNdBFp9U0LhsGO7hsBscVEyH9H2/3eZZt8c97NB2FD9U2NJ+Q== + dependencies: + workbox-background-sync "6.6.0" + workbox-core "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + +workbox-navigation-preload@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-navigation-preload/-/workbox-navigation-preload-6.6.0.tgz" + integrity sha512-utNEWG+uOfXdaZmvhshrh7KzhDu/1iMHyQOV6Aqup8Mm78D286ugu5k9MFD9SzBT5TcwgwSORVvInaXWbvKz9Q== + dependencies: + workbox-core "6.6.0" + +workbox-precaching@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-precaching/-/workbox-precaching-6.6.0.tgz" + integrity sha512-eYu/7MqtRZN1IDttl/UQcSZFkHP7dnvr/X3Vn6Iw6OsPMruQHiVjjomDFCNtd8k2RdjLs0xiz9nq+t3YVBcWPw== + dependencies: + workbox-core "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + +workbox-range-requests@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-range-requests/-/workbox-range-requests-6.6.0.tgz" + integrity sha512-V3aICz5fLGq5DpSYEU8LxeXvsT//mRWzKrfBOIxzIdQnV/Wj7R+LyJVTczi4CQ4NwKhAaBVaSujI1cEjXW+hTw== + dependencies: + workbox-core "6.6.0" + +workbox-recipes@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-recipes/-/workbox-recipes-6.6.0.tgz" + integrity sha512-TFi3kTgYw73t5tg73yPVqQC8QQjxJSeqjXRO4ouE/CeypmP2O/xqmB/ZFBBQazLTPxILUQ0b8aeh0IuxVn9a6A== + dependencies: + workbox-cacheable-response "6.6.0" + workbox-core "6.6.0" + workbox-expiration "6.6.0" + workbox-precaching "6.6.0" + workbox-routing "6.6.0" + workbox-strategies "6.6.0" + +workbox-routing@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-routing/-/workbox-routing-6.6.0.tgz" + integrity sha512-x8gdN7VDBiLC03izAZRfU+WKUXJnbqt6PG9Uh0XuPRzJPpZGLKce/FkOX95dWHRpOHWLEq8RXzjW0O+POSkKvw== + dependencies: + workbox-core "6.6.0" + +workbox-strategies@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-strategies/-/workbox-strategies-6.6.0.tgz" + integrity sha512-eC07XGuINAKUWDnZeIPdRdVja4JQtTuc35TZ8SwMb1ztjp7Ddq2CJ4yqLvWzFWGlYI7CG/YGqaETntTxBGdKgQ== + dependencies: + workbox-core "6.6.0" + +workbox-streams@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-streams/-/workbox-streams-6.6.0.tgz" + integrity sha512-rfMJLVvwuED09CnH1RnIep7L9+mj4ufkTyDPVaXPKlhi9+0czCu+SJggWCIFbPpJaAZmp2iyVGLqS3RUmY3fxg== + dependencies: + workbox-core "6.6.0" + workbox-routing "6.6.0" + +workbox-sw@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-sw/-/workbox-sw-6.6.0.tgz" + integrity sha512-R2IkwDokbtHUE4Kus8pKO5+VkPHD2oqTgl+XJwh4zbF1HyjAbgNmK/FneZHVU7p03XUt9ICfuGDYISWG9qV/CQ== + +workbox-webpack-plugin@^6.4.1: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-webpack-plugin/-/workbox-webpack-plugin-6.6.0.tgz" + integrity sha512-xNZIZHalboZU66Wa7x1YkjIqEy1gTR+zPM+kjrYJzqN7iurYZBctBLISyScjhkJKYuRrZUP0iqViZTh8rS0+3A== + dependencies: + fast-json-stable-stringify "^2.1.0" + pretty-bytes "^5.4.1" + upath "^1.2.0" + webpack-sources "^1.4.3" + workbox-build "6.6.0" + +workbox-window@6.6.0: + version "6.6.0" + resolved "https://registry.npmjs.org/workbox-window/-/workbox-window-6.6.0.tgz" + integrity sha512-L4N9+vka17d16geaJXXRjENLFldvkWy7JyGxElRD0JvBxvFEd8LOhr+uXCcar/NzAmIBRv9EZ+M+Qr4mOoBITw== + dependencies: + "@types/trusted-types" "^2.0.2" + workbox-core "6.6.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz" + integrity sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q== + dependencies: + imurmurhash "^0.1.4" + is-typedarray "^1.0.0" + signal-exit "^3.0.2" + typedarray-to-buffer "^3.1.5" + +ws@^7.4.6: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +xlsx@^0.18.5: + version "0.18.5" + resolved "https://registry.npmjs.org/xlsx/-/xlsx-0.18.5.tgz" + integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ== + dependencies: + adler-32 "~1.3.0" + cfb "~1.2.1" + codepage "~1.15.0" + crc-32 "~1.2.1" + ssf "~0.11.2" + wmf "~1.0.1" + word "~0.3.0" + +xml-name-validator@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz" + integrity sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw== + +xml2js@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz" + integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA== + dependencies: + sax ">=0.6.0" + xmlbuilder "~11.0.0" + +xmlbuilder@~11.0.0: + version "11.0.1" + resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" + integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +xtend@^4.0.0: + version "4.0.2" + resolved "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz" + integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0, yaml@^1.10.2, yaml@^1.7.2: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yaml@^2.1.1: + version "2.3.1" + resolved "https://registry.npmjs.org/yaml/-/yaml-2.3.1.tgz" + integrity sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ== + +yargs-parser@^20.2.2: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs@^16.2.0: + version "16.2.0" + resolved "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz" + integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== + dependencies: + cliui "^7.0.2" + escalade "^3.1.1" + get-caller-file "^2.0.5" + require-directory "^2.1.1" + string-width "^4.2.0" + y18n "^5.0.5" + yargs-parser "^20.2.2" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== + +yup@^0.32.11: + version "0.32.11" + resolved "https://registry.npmjs.org/yup/-/yup-0.32.11.tgz" + integrity sha512-Z2Fe1bn+eLstG8DRR6FTavGD+MeAwyfmouhHsIUgaADz8jvFKbO/fXc2trJKZg+5EBjh4gGm3iU/t3onKlXHIg== + dependencies: + "@babel/runtime" "^7.15.4" + "@types/lodash" "^4.14.175" + lodash "^4.17.21" + lodash-es "^4.17.21" + nanoclone "^0.2.1" + property-expr "^2.0.4" + toposort "^2.0.2"