From 1ccf479ba6e6d1f42e86b2b118516b46a02d3d66 Mon Sep 17 00:00:00 2001 From: USER Date: Wed, 21 Oct 2026 16:03:41 +0900 Subject: [PATCH] commit --- .classpath | 59 + ...t.jsdt.core.javascriptValidator (1).launch | 7 + .factorypath | 98 + .gitignore | 1 + .project | 58 + .settings/org.eclipse.core.resources.prefs | 3 + .settings/org.eclipse.jdt.apt.core.prefs | 4 + .settings/org.eclipse.jdt.core.prefs | 17 + .settings/org.eclipse.m2e.core.prefs | 4 + .settings/org.eclipse.wst.common.component | 53 + ....eclipse.wst.common.project.facet.core.xml | 7 + .settings/org.eclipse.wst.validation.prefs | 6 + ...ringframework.ide.eclipse.beans.core.prefs | 78 + ...org.springframework.ide.eclipse.core.prefs | 69 + .springBeans | 15 + pom.xml | 805 +++ src/main/front_end.zip | Bin 0 -> 220702 bytes .../React_Board_Development_Guide.md | 85 + .../Skeleton_Hint_and_File_Analysis.md | 55 + .../front_end/Vue_Board_Development_Guide.md | 64 + src/main/front_end/react_board/.env | 1 + src/main/front_end/react_board/.gitignore | 1 + src/main/front_end/react_board/README.md | 12 + .../front_end/react_board/eslint.config.js | 29 + src/main/front_end/react_board/index.html | 16 + .../front_end/react_board/package-lock.json | 3221 ++++++++++++ src/main/front_end/react_board/package.json | 33 + .../front_end/react_board/public/vite.svg | 1 + src/main/front_end/react_board/src/App.css | 0 src/main/front_end/react_board/src/App.tsx | 28 + .../front_end/react_board/src/Pagination.css | 31 + .../react_board/src/assets/react.svg | 1 + .../react_board/src/components/BoardList.tsx | 142 + .../react_board/src/components/Header.tsx | 29 + .../react_board/src/components/Pagination.tsx | 64 + .../react_board/src/components/PostForm.tsx | 121 + .../react_board/src/components/PostView.tsx | 107 + src/main/front_end/react_board/src/index.css | 65 + src/main/front_end/react_board/src/main.tsx | 11 + .../react_board/src/shared/api/axios.ts | 6 + .../front_end/react_board/src/types/board.ts | 18 + .../react_board/src/types/global.d.ts | 1 + .../front_end/react_board/src/vite-env.d.ts | 5 + src/main/front_end/react_board/tsconfig.json | 21 + .../front_end/react_board/tsconfig.node.json | 9 + src/main/front_end/react_board/vite.config.js | 7 + src/main/front_end/react_board_exam/.env | 1 + src/main/front_end/react_board_exam/README.md | 12 + .../react_board_exam/eslint.config.js | 29 + .../front_end/react_board_exam/index.html | 16 + .../react_board_exam/package-lock.json | 3221 ++++++++++++ .../front_end/react_board_exam/package.json | 33 + .../react_board_exam/public/vite.svg | 1 + .../front_end/react_board_exam/src/App.css | 0 .../front_end/react_board_exam/src/App.tsx | 26 + .../react_board_exam/src/Pagination.css | 31 + .../react_board_exam/src/assets/react.svg | 1 + .../src/components/BoardList.tsx | 118 + .../src/components/Header.tsx | 29 + .../src/components/Pagination.tsx | 75 + .../src/components/PostForm.tsx | 74 + .../src/components/PostView.tsx | 66 + .../front_end/react_board_exam/src/index.css | 65 + .../front_end/react_board_exam/src/main.tsx | 11 + .../react_board_exam/src/types/board.ts | 18 + .../front_end/react_board_exam/tsconfig.json | 21 + .../react_board_exam/tsconfig.node.json | 9 + .../front_end/react_board_exam/vite.config.js | 7 + src/main/front_end/test.sql | 7 + src/main/front_end/tictactoe/.gitignore | 24 + src/main/front_end/tictactoe/README.md | 78 + src/main/front_end/tictactoe/eslint.config.js | 22 + src/main/front_end/tictactoe/index.html | 13 + .../front_end/tictactoe/package-lock.json | 2881 +++++++++++ src/main/front_end/tictactoe/package.json | 34 + .../front_end/tictactoe/public/favicon.svg | 1 + src/main/front_end/tictactoe/public/icons.svg | 24 + src/main/front_end/tictactoe/src/App.tsx | 122 + .../front_end/tictactoe/src/assets/hero.png | Bin 0 -> 13057 bytes .../front_end/tictactoe/src/assets/react.svg | 1 + .../front_end/tictactoe/src/assets/vite.svg | 1 + src/main/front_end/tictactoe/src/index.css | 90 + src/main/front_end/tictactoe/src/main.tsx | 10 + .../front_end/tictactoe/tsconfig.app.json | 26 + src/main/front_end/tictactoe/tsconfig.json | 7 + .../front_end/tictactoe/tsconfig.node.json | 23 + src/main/front_end/tictactoe/vite.config.ts | 11 + src/main/front_end/vue_board/.editorconfig | 6 + src/main/front_end/vue_board/.env | 1 + src/main/front_end/vue_board/.gitignore | 30 + src/main/front_end/vue_board/.prettierrc.json | 7 + src/main/front_end/vue_board/README.md | 35 + src/main/front_end/vue_board/env.d.ts | 1 + src/main/front_end/vue_board/eslint.config.js | 19 + src/main/front_end/vue_board/index.html | 17 + src/main/front_end/vue_board/jsconfig.json | 8 + .../front_end/vue_board/package-lock.json | 4299 +++++++++++++++++ src/main/front_end/vue_board/package.json | 37 + .../front_end/vue_board/public/favicon.ico | Bin 0 -> 4286 bytes src/main/front_end/vue_board/public/w3.css | 235 + src/main/front_end/vue_board/src/App.vue | 43 + .../front_end/vue_board/src/assets/base.css | 86 + .../front_end/vue_board/src/assets/logo.svg | 1 + .../front_end/vue_board/src/assets/main.css | 35 + .../vue_board/src/components/Pagination.vue | 74 + src/main/front_end/vue_board/src/main.ts | 18 + .../front_end/vue_board/src/router/index.ts | 41 + .../front_end/vue_board/src/types/board.ts | 18 + .../vue_board/src/views/BoardDetail.vue | 118 + .../vue_board/src/views/BoardList.vue | 172 + .../vue_board/src/views/BoardUpdate.vue | 77 + .../vue_board/src/views/BoardWrite.vue | 88 + .../front_end/vue_board/tsconfig.app.json | 15 + src/main/front_end/vue_board/tsconfig.json | 7 + .../front_end/vue_board/tsconfig.node.json | 16 + src/main/front_end/vue_board/vite.config.js | 20 + .../front_end/vue_board_exam/.editorconfig | 6 + src/main/front_end/vue_board_exam/.env | 1 + src/main/front_end/vue_board_exam/.gitignore | 30 + .../front_end/vue_board_exam/.prettierrc.json | 7 + src/main/front_end/vue_board_exam/README.md | 35 + src/main/front_end/vue_board_exam/env.d.ts | 1 + .../front_end/vue_board_exam/eslint.config.js | 19 + src/main/front_end/vue_board_exam/index.html | 17 + .../front_end/vue_board_exam/jsconfig.json | 8 + .../vue_board_exam/package-lock.json | 4299 +++++++++++++++++ .../front_end/vue_board_exam/package.json | 37 + .../vue_board_exam/public/favicon.ico | Bin 0 -> 4286 bytes .../front_end/vue_board_exam/public/w3.css | 235 + src/main/front_end/vue_board_exam/src/App.vue | 43 + .../vue_board_exam/src/assets/base.css | 86 + .../vue_board_exam/src/assets/logo.svg | 1 + .../vue_board_exam/src/assets/main.css | 35 + .../src/components/Pagination.vue | 98 + src/main/front_end/vue_board_exam/src/main.ts | 18 + .../vue_board_exam/src/router/index.ts | 41 + .../vue_board_exam/src/types/board.ts | 18 + .../vue_board_exam/src/views/BoardDetail.vue | 110 + .../vue_board_exam/src/views/BoardList.vue | 154 + .../vue_board_exam/src/views/BoardUpdate.vue | 103 + .../vue_board_exam/src/views/BoardWrite.vue | 99 + .../vue_board_exam/tsconfig.app.json | 15 + .../front_end/vue_board_exam/tsconfig.json | 7 + .../vue_board_exam/tsconfig.node.json | 16 + .../front_end/vue_board_exam/vite.config.js | 20 + .../board/controller/BoardController.java | 45 + .../board/controller/BoardRestController.java | 113 + src/main/java/first/board/dao/BoardDAO.java | 47 + src/main/java/first/board/dto/BoardDTO.java | 18 + .../first/board/service/BoardService.java | 19 + .../first/board/service/BoardServiceImpl.java | 194 + .../java/first/common/common/CommandMap.java | 54 + .../common/controller/CommonController.java | 45 + .../common/controller/MemberController.java | 69 + .../java/first/common/dao/AbstractDAO.java | 143 + src/main/java/first/common/dao/CommonDAO.java | 17 + src/main/java/first/common/dao/MemberDAO.java | 19 + src/main/java/first/common/dto/MemberDTO.java | 35 + .../first/common/logger/LoggerAspect.java | 37 + .../common/logger/LoggerInterceptor.java | 37 + .../resolver/CustomMapArgumentResolver.java | 45 + .../first/common/service/CommonService.java | 8 + .../common/service/CommonServiceImpl.java | 26 + .../first/common/service/MemberService.java | 23 + .../common/service/MemberServiceImpl.java | 47 + .../java/first/common/util/CommonUtils.java | 11 + .../java/first/common/util/FileUtils.java | 85 + .../sample/controller/SampleController.java | 176 + src/main/java/first/sample/dao/SampleDAO.java | 79 + .../first/sample/service/SampleService.java | 25 + .../sample/service/SampleServiceImpl.java | 121 + src/main/java/test/test.java | 15 + .../config/spring/context-aspect.xml | 12 + .../config/spring/context-common.xml | 35 + .../config/spring/context-datasource.xml | 29 + .../config/spring/context-mapper.xml | 17 + src/main/resources/log4j.dtd | 237 + src/main/resources/log4j.xml | 42 + src/main/resources/mapper/board/Board_SQL.xml | 114 + .../resources/mapper/common/Common_SQL.xml | 40 + .../resources/mapper/common/member_SQL.xml | 23 + .../resources/mapper/sample/Sample_SQL.xml | 189 + src/main/resources/rebel.xml | 21 + .../webapp/WEB-INF/config/action-servlet.xml | 44 + .../webapp/WEB-INF/include/include-body.jspf | 2 + .../WEB-INF/include/include-header.jspf | 15 + .../WEB-INF/include/include-pagination.jspf | 109 + .../webapp/WEB-INF/jsp/board/boardDetail.jsp | 88 + .../webapp/WEB-INF/jsp/board/boardList.jsp | 129 + .../webapp/WEB-INF/jsp/board/boardUpdate.jsp | 135 + .../webapp/WEB-INF/jsp/board/boardWrite.jsp | 145 + src/main/webapp/WEB-INF/jsp/member/login.jsp | 61 + src/main/webapp/WEB-INF/jsp/sample/Test.jsp | 94 + src/main/webapp/WEB-INF/jsp/sample/Test01.jsp | 24 + .../webapp/WEB-INF/jsp/sample/boardDetail.jsp | 141 + .../webapp/WEB-INF/jsp/sample/boardList.jsp | 102 + .../webapp/WEB-INF/jsp/sample/boardSearch.jsp | 13 + .../webapp/WEB-INF/jsp/sample/boardUpdate.jsp | 164 + .../webapp/WEB-INF/jsp/sample/boardWrite.jsp | 98 + src/main/webapp/WEB-INF/jsp/sample/kk.jsp | 12 + src/main/webapp/WEB-INF/views/home.jsp | 15 + src/main/webapp/WEB-INF/web.xml | 54 + src/main/webapp/index.jsp | 12 + src/main/webapp/resources/css/ui.css | 23 + src/main/webapp/resources/js/common.js | 179 + 205 files changed, 27761 insertions(+) create mode 100644 .classpath create mode 100644 .externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator (1).launch create mode 100644 .factorypath create mode 100644 .gitignore create mode 100644 .project create mode 100644 .settings/org.eclipse.core.resources.prefs create mode 100644 .settings/org.eclipse.jdt.apt.core.prefs create mode 100644 .settings/org.eclipse.jdt.core.prefs create mode 100644 .settings/org.eclipse.m2e.core.prefs create mode 100644 .settings/org.eclipse.wst.common.component create mode 100644 .settings/org.eclipse.wst.common.project.facet.core.xml create mode 100644 .settings/org.eclipse.wst.validation.prefs create mode 100644 .settings/org.springframework.ide.eclipse.beans.core.prefs create mode 100644 .settings/org.springframework.ide.eclipse.core.prefs create mode 100644 .springBeans create mode 100644 pom.xml create mode 100644 src/main/front_end.zip create mode 100644 src/main/front_end/React_Board_Development_Guide.md create mode 100644 src/main/front_end/Skeleton_Hint_and_File_Analysis.md create mode 100644 src/main/front_end/Vue_Board_Development_Guide.md create mode 100644 src/main/front_end/react_board/.env create mode 100644 src/main/front_end/react_board/.gitignore create mode 100644 src/main/front_end/react_board/README.md create mode 100644 src/main/front_end/react_board/eslint.config.js create mode 100644 src/main/front_end/react_board/index.html create mode 100644 src/main/front_end/react_board/package-lock.json create mode 100644 src/main/front_end/react_board/package.json create mode 100644 src/main/front_end/react_board/public/vite.svg create mode 100644 src/main/front_end/react_board/src/App.css create mode 100644 src/main/front_end/react_board/src/App.tsx create mode 100644 src/main/front_end/react_board/src/Pagination.css create mode 100644 src/main/front_end/react_board/src/assets/react.svg create mode 100644 src/main/front_end/react_board/src/components/BoardList.tsx create mode 100644 src/main/front_end/react_board/src/components/Header.tsx create mode 100644 src/main/front_end/react_board/src/components/Pagination.tsx create mode 100644 src/main/front_end/react_board/src/components/PostForm.tsx create mode 100644 src/main/front_end/react_board/src/components/PostView.tsx create mode 100644 src/main/front_end/react_board/src/index.css create mode 100644 src/main/front_end/react_board/src/main.tsx create mode 100644 src/main/front_end/react_board/src/shared/api/axios.ts create mode 100644 src/main/front_end/react_board/src/types/board.ts create mode 100644 src/main/front_end/react_board/src/types/global.d.ts create mode 100644 src/main/front_end/react_board/src/vite-env.d.ts create mode 100644 src/main/front_end/react_board/tsconfig.json create mode 100644 src/main/front_end/react_board/tsconfig.node.json create mode 100644 src/main/front_end/react_board/vite.config.js create mode 100644 src/main/front_end/react_board_exam/.env create mode 100644 src/main/front_end/react_board_exam/README.md create mode 100644 src/main/front_end/react_board_exam/eslint.config.js create mode 100644 src/main/front_end/react_board_exam/index.html create mode 100644 src/main/front_end/react_board_exam/package-lock.json create mode 100644 src/main/front_end/react_board_exam/package.json create mode 100644 src/main/front_end/react_board_exam/public/vite.svg create mode 100644 src/main/front_end/react_board_exam/src/App.css create mode 100644 src/main/front_end/react_board_exam/src/App.tsx create mode 100644 src/main/front_end/react_board_exam/src/Pagination.css create mode 100644 src/main/front_end/react_board_exam/src/assets/react.svg create mode 100644 src/main/front_end/react_board_exam/src/components/BoardList.tsx create mode 100644 src/main/front_end/react_board_exam/src/components/Header.tsx create mode 100644 src/main/front_end/react_board_exam/src/components/Pagination.tsx create mode 100644 src/main/front_end/react_board_exam/src/components/PostForm.tsx create mode 100644 src/main/front_end/react_board_exam/src/components/PostView.tsx create mode 100644 src/main/front_end/react_board_exam/src/index.css create mode 100644 src/main/front_end/react_board_exam/src/main.tsx create mode 100644 src/main/front_end/react_board_exam/src/types/board.ts create mode 100644 src/main/front_end/react_board_exam/tsconfig.json create mode 100644 src/main/front_end/react_board_exam/tsconfig.node.json create mode 100644 src/main/front_end/react_board_exam/vite.config.js create mode 100644 src/main/front_end/test.sql create mode 100644 src/main/front_end/tictactoe/.gitignore create mode 100644 src/main/front_end/tictactoe/README.md create mode 100644 src/main/front_end/tictactoe/eslint.config.js create mode 100644 src/main/front_end/tictactoe/index.html create mode 100644 src/main/front_end/tictactoe/package-lock.json create mode 100644 src/main/front_end/tictactoe/package.json create mode 100644 src/main/front_end/tictactoe/public/favicon.svg create mode 100644 src/main/front_end/tictactoe/public/icons.svg create mode 100644 src/main/front_end/tictactoe/src/App.tsx create mode 100644 src/main/front_end/tictactoe/src/assets/hero.png create mode 100644 src/main/front_end/tictactoe/src/assets/react.svg create mode 100644 src/main/front_end/tictactoe/src/assets/vite.svg create mode 100644 src/main/front_end/tictactoe/src/index.css create mode 100644 src/main/front_end/tictactoe/src/main.tsx create mode 100644 src/main/front_end/tictactoe/tsconfig.app.json create mode 100644 src/main/front_end/tictactoe/tsconfig.json create mode 100644 src/main/front_end/tictactoe/tsconfig.node.json create mode 100644 src/main/front_end/tictactoe/vite.config.ts create mode 100644 src/main/front_end/vue_board/.editorconfig create mode 100644 src/main/front_end/vue_board/.env create mode 100644 src/main/front_end/vue_board/.gitignore create mode 100644 src/main/front_end/vue_board/.prettierrc.json create mode 100644 src/main/front_end/vue_board/README.md create mode 100644 src/main/front_end/vue_board/env.d.ts create mode 100644 src/main/front_end/vue_board/eslint.config.js create mode 100644 src/main/front_end/vue_board/index.html create mode 100644 src/main/front_end/vue_board/jsconfig.json create mode 100644 src/main/front_end/vue_board/package-lock.json create mode 100644 src/main/front_end/vue_board/package.json create mode 100644 src/main/front_end/vue_board/public/favicon.ico create mode 100644 src/main/front_end/vue_board/public/w3.css create mode 100644 src/main/front_end/vue_board/src/App.vue create mode 100644 src/main/front_end/vue_board/src/assets/base.css create mode 100644 src/main/front_end/vue_board/src/assets/logo.svg create mode 100644 src/main/front_end/vue_board/src/assets/main.css create mode 100644 src/main/front_end/vue_board/src/components/Pagination.vue create mode 100644 src/main/front_end/vue_board/src/main.ts create mode 100644 src/main/front_end/vue_board/src/router/index.ts create mode 100644 src/main/front_end/vue_board/src/types/board.ts create mode 100644 src/main/front_end/vue_board/src/views/BoardDetail.vue create mode 100644 src/main/front_end/vue_board/src/views/BoardList.vue create mode 100644 src/main/front_end/vue_board/src/views/BoardUpdate.vue create mode 100644 src/main/front_end/vue_board/src/views/BoardWrite.vue create mode 100644 src/main/front_end/vue_board/tsconfig.app.json create mode 100644 src/main/front_end/vue_board/tsconfig.json create mode 100644 src/main/front_end/vue_board/tsconfig.node.json create mode 100644 src/main/front_end/vue_board/vite.config.js create mode 100644 src/main/front_end/vue_board_exam/.editorconfig create mode 100644 src/main/front_end/vue_board_exam/.env create mode 100644 src/main/front_end/vue_board_exam/.gitignore create mode 100644 src/main/front_end/vue_board_exam/.prettierrc.json create mode 100644 src/main/front_end/vue_board_exam/README.md create mode 100644 src/main/front_end/vue_board_exam/env.d.ts create mode 100644 src/main/front_end/vue_board_exam/eslint.config.js create mode 100644 src/main/front_end/vue_board_exam/index.html create mode 100644 src/main/front_end/vue_board_exam/jsconfig.json create mode 100644 src/main/front_end/vue_board_exam/package-lock.json create mode 100644 src/main/front_end/vue_board_exam/package.json create mode 100644 src/main/front_end/vue_board_exam/public/favicon.ico create mode 100644 src/main/front_end/vue_board_exam/public/w3.css create mode 100644 src/main/front_end/vue_board_exam/src/App.vue create mode 100644 src/main/front_end/vue_board_exam/src/assets/base.css create mode 100644 src/main/front_end/vue_board_exam/src/assets/logo.svg create mode 100644 src/main/front_end/vue_board_exam/src/assets/main.css create mode 100644 src/main/front_end/vue_board_exam/src/components/Pagination.vue create mode 100644 src/main/front_end/vue_board_exam/src/main.ts create mode 100644 src/main/front_end/vue_board_exam/src/router/index.ts create mode 100644 src/main/front_end/vue_board_exam/src/types/board.ts create mode 100644 src/main/front_end/vue_board_exam/src/views/BoardDetail.vue create mode 100644 src/main/front_end/vue_board_exam/src/views/BoardList.vue create mode 100644 src/main/front_end/vue_board_exam/src/views/BoardUpdate.vue create mode 100644 src/main/front_end/vue_board_exam/src/views/BoardWrite.vue create mode 100644 src/main/front_end/vue_board_exam/tsconfig.app.json create mode 100644 src/main/front_end/vue_board_exam/tsconfig.json create mode 100644 src/main/front_end/vue_board_exam/tsconfig.node.json create mode 100644 src/main/front_end/vue_board_exam/vite.config.js create mode 100644 src/main/java/first/board/controller/BoardController.java create mode 100644 src/main/java/first/board/controller/BoardRestController.java create mode 100644 src/main/java/first/board/dao/BoardDAO.java create mode 100644 src/main/java/first/board/dto/BoardDTO.java create mode 100644 src/main/java/first/board/service/BoardService.java create mode 100644 src/main/java/first/board/service/BoardServiceImpl.java create mode 100644 src/main/java/first/common/common/CommandMap.java create mode 100644 src/main/java/first/common/controller/CommonController.java create mode 100644 src/main/java/first/common/controller/MemberController.java create mode 100644 src/main/java/first/common/dao/AbstractDAO.java create mode 100644 src/main/java/first/common/dao/CommonDAO.java create mode 100644 src/main/java/first/common/dao/MemberDAO.java create mode 100644 src/main/java/first/common/dto/MemberDTO.java create mode 100644 src/main/java/first/common/logger/LoggerAspect.java create mode 100644 src/main/java/first/common/logger/LoggerInterceptor.java create mode 100644 src/main/java/first/common/resolver/CustomMapArgumentResolver.java create mode 100644 src/main/java/first/common/service/CommonService.java create mode 100644 src/main/java/first/common/service/CommonServiceImpl.java create mode 100644 src/main/java/first/common/service/MemberService.java create mode 100644 src/main/java/first/common/service/MemberServiceImpl.java create mode 100644 src/main/java/first/common/util/CommonUtils.java create mode 100644 src/main/java/first/common/util/FileUtils.java create mode 100644 src/main/java/first/sample/controller/SampleController.java create mode 100644 src/main/java/first/sample/dao/SampleDAO.java create mode 100644 src/main/java/first/sample/service/SampleService.java create mode 100644 src/main/java/first/sample/service/SampleServiceImpl.java create mode 100644 src/main/java/test/test.java create mode 100644 src/main/resources/config/spring/context-aspect.xml create mode 100644 src/main/resources/config/spring/context-common.xml create mode 100644 src/main/resources/config/spring/context-datasource.xml create mode 100644 src/main/resources/config/spring/context-mapper.xml create mode 100644 src/main/resources/log4j.dtd create mode 100644 src/main/resources/log4j.xml create mode 100644 src/main/resources/mapper/board/Board_SQL.xml create mode 100644 src/main/resources/mapper/common/Common_SQL.xml create mode 100644 src/main/resources/mapper/common/member_SQL.xml create mode 100644 src/main/resources/mapper/sample/Sample_SQL.xml create mode 100644 src/main/resources/rebel.xml create mode 100644 src/main/webapp/WEB-INF/config/action-servlet.xml create mode 100644 src/main/webapp/WEB-INF/include/include-body.jspf create mode 100644 src/main/webapp/WEB-INF/include/include-header.jspf create mode 100644 src/main/webapp/WEB-INF/include/include-pagination.jspf create mode 100644 src/main/webapp/WEB-INF/jsp/board/boardDetail.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/board/boardList.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/board/boardUpdate.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/board/boardWrite.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/member/login.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/Test.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/Test01.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/boardDetail.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/boardList.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/boardSearch.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/boardUpdate.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/boardWrite.jsp create mode 100644 src/main/webapp/WEB-INF/jsp/sample/kk.jsp create mode 100644 src/main/webapp/WEB-INF/views/home.jsp create mode 100644 src/main/webapp/WEB-INF/web.xml create mode 100644 src/main/webapp/index.jsp create mode 100644 src/main/webapp/resources/css/ui.css create mode 100644 src/main/webapp/resources/js/common.js diff --git a/.classpath b/.classpath new file mode 100644 index 0000000..e4be605 --- /dev/null +++ b/.classpath @@ -0,0 +1,59 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator (1).launch b/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator (1).launch new file mode 100644 index 0000000..501afef --- /dev/null +++ b/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator (1).launch @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.factorypath b/.factorypath new file mode 100644 index 0000000..25d86ff --- /dev/null +++ b/.factorypath @@ -0,0 +1,98 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/.project b/.project new file mode 100644 index 0000000..642cd55 --- /dev/null +++ b/.project @@ -0,0 +1,58 @@ + + + RestBoard + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.wst.common.project.facet.core.builder + + + + + org.springframework.ide.eclipse.core.springbuilder + + + + + org.eclipse.ui.externaltools.ExternalToolBuilder + full,incremental, + + + LaunchConfigHandle + <project>/.externalToolBuilders/org.eclipse.wst.jsdt.core.javascriptValidator (1).launch + + + + + org.eclipse.wst.validation.validationbuilder + + + + + org.zeroturnaround.eclipse.rebelXmlBuilder + + + + + org.eclipse.m2e.core.maven2Builder + + + + + + org.springframework.ide.eclipse.core.springnature + org.eclipse.jdt.core.javanature + org.eclipse.m2e.core.maven2Nature + org.eclipse.wst.common.project.facet.core.nature + org.eclipse.wst.common.modulecore.ModuleCoreNature + org.eclipse.wst.jsdt.core.jsNature + org.zeroturnaround.eclipse.jrebelNature + + diff --git a/.settings/org.eclipse.core.resources.prefs b/.settings/org.eclipse.core.resources.prefs new file mode 100644 index 0000000..2e67b95 --- /dev/null +++ b/.settings/org.eclipse.core.resources.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +encoding//src/main/java=UTF-8 +encoding//src/test/java=UTF-8 diff --git a/.settings/org.eclipse.jdt.apt.core.prefs b/.settings/org.eclipse.jdt.apt.core.prefs new file mode 100644 index 0000000..8963047 --- /dev/null +++ b/.settings/org.eclipse.jdt.apt.core.prefs @@ -0,0 +1,4 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.apt.aptEnabled=true +org.eclipse.jdt.apt.genSrcDir=target/generated-sources/annotations +org.eclipse.jdt.apt.genTestSrcDir=target/generated-test-sources/test-annotations diff --git a/.settings/org.eclipse.jdt.core.prefs b/.settings/org.eclipse.jdt.core.prefs new file mode 100644 index 0000000..979a8c9 --- /dev/null +++ b/.settings/org.eclipse.jdt.core.prefs @@ -0,0 +1,17 @@ +eclipse.preferences.version=1 +org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled +org.eclipse.jdt.core.compiler.codegen.methodParameters=do not generate +org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8 +org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve +org.eclipse.jdt.core.compiler.compliance=1.8 +org.eclipse.jdt.core.compiler.debug.lineNumber=generate +org.eclipse.jdt.core.compiler.debug.localVariable=generate +org.eclipse.jdt.core.compiler.debug.sourceFile=generate +org.eclipse.jdt.core.compiler.problem.assertIdentifier=error +org.eclipse.jdt.core.compiler.problem.enablePreviewFeatures=disabled +org.eclipse.jdt.core.compiler.problem.enumIdentifier=error +org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning +org.eclipse.jdt.core.compiler.problem.reportPreviewFeatures=warning +org.eclipse.jdt.core.compiler.processAnnotations=enabled +org.eclipse.jdt.core.compiler.release=disabled +org.eclipse.jdt.core.compiler.source=1.8 diff --git a/.settings/org.eclipse.m2e.core.prefs b/.settings/org.eclipse.m2e.core.prefs new file mode 100644 index 0000000..f897a7f --- /dev/null +++ b/.settings/org.eclipse.m2e.core.prefs @@ -0,0 +1,4 @@ +activeProfiles= +eclipse.preferences.version=1 +resolveWorkspaceProjects=true +version=1 diff --git a/.settings/org.eclipse.wst.common.component b/.settings/org.eclipse.wst.common.component new file mode 100644 index 0000000..92d47a6 --- /dev/null +++ b/.settings/org.eclipse.wst.common.component @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/.settings/org.eclipse.wst.common.project.facet.core.xml b/.settings/org.eclipse.wst.common.project.facet.core.xml new file mode 100644 index 0000000..2634509 --- /dev/null +++ b/.settings/org.eclipse.wst.common.project.facet.core.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/.settings/org.eclipse.wst.validation.prefs b/.settings/org.eclipse.wst.validation.prefs new file mode 100644 index 0000000..ca90b67 --- /dev/null +++ b/.settings/org.eclipse.wst.validation.prefs @@ -0,0 +1,6 @@ +DELEGATES_PREFERENCE=delegateValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator\=org.eclipse.wst.wsdl.validation.internal.eclipse.Validator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator\=org.eclipse.wst.xsd.core.internal.validation.eclipse.Validator; +USER_BUILD_PREFERENCE=enabledBuildValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;org.eclipse.jst.jsf.validation.internal.JSPSemanticsValidator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator;org.eclipse.jst.jsp.core.internal.validation.JSPBatchValidator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.jst.jsp.core.internal.validation.JSPContentValidator;org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator; +USER_MANUAL_PREFERENCE=enabledManualValidatorListorg.eclipse.wst.wsdl.validation.internal.eclipse.WSDLDelegatingValidator;org.eclipse.wst.xsd.core.internal.validation.eclipse.XSDDelegatingValidator;org.eclipse.jst.jsf.validation.internal.JSPSemanticsValidator;org.eclipse.wst.dtd.core.internal.validation.eclipse.Validator;org.eclipse.wst.xml.core.internal.validation.eclipse.Validator;org.eclipse.wst.common.componentcore.internal.ModuleCoreValidator;org.eclipse.jst.jsf.validation.internal.appconfig.AppConfigValidator;org.eclipse.jst.jsp.core.internal.validation.JSPBatchValidator;org.eclipse.wst.html.internal.validation.HTMLValidator;org.eclipse.jst.jsp.core.internal.validation.JSPContentValidator;org.eclipse.jst.j2ee.internal.classpathdep.ClasspathDependencyValidator;org.eclipse.wst.wsi.ui.internal.WSIMessageValidator; +USER_PREFERENCE=overrideGlobalPreferencesfalse +disabled=06target +eclipse.preferences.version=1 diff --git a/.settings/org.springframework.ide.eclipse.beans.core.prefs b/.settings/org.springframework.ide.eclipse.beans.core.prefs new file mode 100644 index 0000000..bb50bcf --- /dev/null +++ b/.settings/org.springframework.ide.eclipse.beans.core.prefs @@ -0,0 +1,78 @@ +#Mon Oct 18 12:37:52 EDT 2010 +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.osgi.org/xmlns/blueprint/v1.0.0= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/aop= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/batch= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/beans= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/context= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/faces= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/flex= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/file= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/http= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/httpinvoker= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/ip= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/jdbc= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/jms= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/jmx= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/mail= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/rmi= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/security= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/stream= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/ws= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/integration/xml= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/jdbc= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/jee= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/jms= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/lang= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/mvc= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/osgi= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/osgi-compendium= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/oxm= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/p= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/security= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/task= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/tx= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/util= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/web-services= +//org.springframework.ide.eclipse.beans.core.default.version.http\://www.springframework.org/schema/webflow-config= +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.osgi.org/xmlns/blueprint/v1.0.0=bp +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/aop=aop +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/batch=batch +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/beans=beans +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/context=context +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/faces=faces +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/flex=flex +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration=int +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/file=int-file +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/http=int-http +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/httpinvoker=int-httpinvoker +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/ip=int-ip +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/jdbc=int-jdbc +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/jms=int-jms +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/jmx=int-jmx +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/mail=int-mail +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/rmi=int-rmi +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/security=int-security +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/stream=int-stream +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/ws=int-ws +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/integration/xml=int-xml +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/jdbc=jdbc +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/jee=jee +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/jms=jms +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/lang=lang +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/mvc=mvc +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/osgi=osgi +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/osgi-compendium=osgix +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/oxm=oxm +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/p=p +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/security=sec +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/task=task +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/tx=tx +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/util=util +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/web-services=ws +//org.springframework.ide.eclipse.beans.core.prefix.http\://www.springframework.org/schema/webflow-config=flow +eclipse.preferences.version=1 +org.springframework.ide.eclipse.beans.core.default.version.check.classpath=true +org.springframework.ide.eclipse.beans.core.enable.project.preferences=false +org.springframework.ide.eclipse.beans.core.ignoreMissingNamespaceHandler=false +org.springframework.ide.eclipse.beans.core.loadNamespaceHandlerFromClasspath=false diff --git a/.settings/org.springframework.ide.eclipse.core.prefs b/.settings/org.springframework.ide.eclipse.core.prefs new file mode 100644 index 0000000..0f65cd5 --- /dev/null +++ b/.settings/org.springframework.ide.eclipse.core.prefs @@ -0,0 +1,69 @@ +#Tue Apr 20 16:59:06 EDT 2010 +eclipse.preferences.version=1 +org.springframework.ide.eclipse.core.builders.enable.aopreferencemodelbuilder=true +org.springframework.ide.eclipse.core.builders.enable.beanmetadatabuilder=true +org.springframework.ide.eclipse.core.builders.enable.osgibundleupdater=false +org.springframework.ide.eclipse.core.enable.project.preferences=false +org.springframework.ide.eclipse.core.validator.enable.com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.enable.com.springsource.sts.server.quickfix.manifestvalidator=false +org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.core.springvalidator=false +org.springframework.ide.eclipse.core.validator.enable.org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.applicationVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivationPolicyRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleActivatorRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleManifestVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleSymbolicNameRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.bundleVersionRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.exportPackageRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.importRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.parsingProblemsRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.server.ide.manifest.core.requireBundleRule-com.springsource.server.ide.manifest.core.manifestvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.AvoidDriverManagerDataSource-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ImportElementsAtTopRulee-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.ParentBeanSpecifiesAbstractClassRule-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.RefElementRule-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.TooManyBeansInFileRule-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UnnecessaryValueElementRule-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.com.springsource.sts.bestpractices.UseBeanInheritance-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.bestpractices.legacyxmlusage.jndiobjectfactory-com.springsource.sts.bestpractices.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importLibraryVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.importPackageVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.com.springsource.sts.server.quickfix.requireBundleVersionRule-com.springsource.sts.server.quickfix.manifestvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.autowire.autowire-org.springframework.ide.eclipse.beans.core.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanAlias-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanClass-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanConstructorArgument-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinition-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanDefinitionHolder-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanFactory-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanInitDestroyMethod-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.beanReference-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.methodOverride-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.parsingProblems-org.springframework.ide.eclipse.beans.core.beansvalidator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.requiredProperty-org.springframework.ide.eclipse.beans.core.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.beans.core.toolAnnotation-org.springframework.ide.eclipse.beans.core.beansvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.core.springClasspath-org.springframework.ide.eclipse.core.springvalidator=false +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.action-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.actionstate-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attribute-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.attributemapper-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.beanaction-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationaction-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.evaluationresult-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.exceptionhandler-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.import-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.inputattribute-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.mapping-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.outputattribute-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.set-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.state-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.subflowstate-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.transition-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.variable-org.springframework.ide.eclipse.webflow.core.validator=true +org.springframework.ide.eclipse.core.validator.rule.enable.org.springframework.ide.eclipse.webflow.core.validation.webflowstate-org.springframework.ide.eclipse.webflow.core.validator=true diff --git a/.springBeans b/.springBeans new file mode 100644 index 0000000..e9d6c97 --- /dev/null +++ b/.springBeans @@ -0,0 +1,15 @@ + + + 1 + + + + + + + + + + + + diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..4123269 --- /dev/null +++ b/pom.xml @@ -0,0 +1,805 @@ + + + + 4.0.0 + +com.company + +RestBoard + +RestBoard + +war + +1.0.0-BUILD-SNAPSHOT + + + +1.8 + +4.3.25.RELEASE + +1.7.3 + +1.6.6 + + + + + + + + +mvn2 + +http://repo1.maven.org/maven2/ + + + +true + + + + + +true + + + + + + + + +egovframe + +https://maven.egovframe.go.kr/maven + + + +true + + + + + +false + + + + + + + + + + + + +codelds + +https://code.lds.org/nexus/content/groups/main-repo + + + + + + + + + + + + + + + +org.projectlombok + +lombok + +1.18.32 + +provided + + + + + + + + +org.springframework + +spring-context + +${org.springframework-version} + + + + + + + +commons-logging + +commons-logging + + + + + + + + + + +org.springframework + +spring-web + +${org.springframework-version} + + + + + + +org.springframework + +spring-webmvc + +${org.springframework-version} + + + + + + +org.springframework + +spring-aop + +${org.springframework-version} + + + + + + +org.springframework + +spring-beans + +${org.springframework-version} + + + + + + +org.springframework + +spring-context-support + +${org.springframework-version} + + + + + + +org.springframework + +spring-core + +${org.springframework-version} + + + + + + +org.springframework + +spring-jdbc + +${org.springframework-version} + + + + + + +org.springframework + +spring-tx + +${org.springframework-version} + + + + + + + com.nexacro + nexacro17-xapi + 1.0 + + + + com.nexacro + nexacro-xapi + 1.0 + + + + com.tobesoft + xplatform-xapi + 1.0 + + + + + + +aopalliance + +aopalliance + +1.0 + + + + + + + + +org.mybatis + +mybatis + +3.2.2 + + + + + + +org.mybatis + +mybatis-spring + +1.2.0 + + + + + + + + +org.apache.tomcat + +tomcat-dbcp + +provided + +7.0.53 + + + + + + +commons-dbcp + +commons-dbcp + +1.4 + + + + + + + + +mysql + +mysql-connector-java + +5.1.31 + + + + + + + + +com.oracle + +ojdbc14 + +10.2.0.4.0 + + + + + + + + +com.oracle + +ojdbc6 + +11.2.0.3 + + + + + + + + +org.aspectj + +aspectjrt + +${org.aspectj-version} + + + + + + +org.aspectj + +aspectjweaver + +${org.aspectj-version} + + + + + + +org.aspectj + +aspectjtools + +${org.aspectj-version} + + + + + + + + +javax.servlet + +servlet-api + +provided + +2.5 + + + + + + +javax.servlet.jsp + +jsp-api + +provided + +2.1 + + + + + + +javax.servlet + +jstl + +1.2 + + + + + + +javax.annotation + +jsr250-api + +1.0 + + + + + + + + +org.slf4j + +slf4j-api + +${org.slf4j-version} + + + + + +org.slf4j + +jcl-over-slf4j + +${org.slf4j-version} + + + + + +org.slf4j + +slf4j-log4j12 + +${org.slf4j-version} + + + + + +log4j + +log4j + +1.3alpha-8 + + + + + +org.lazyluke + +log4jdbc-remix + +0.2.7 + + + + + + + + +org.codehaus.jackson + +jackson-mapper-asl + +1.9.13 + + + + + + +org.codehaus.jackson + +jackson-core-asl + +1.9.13 + + + + + + +com.fasterxml.jackson.core + +jackson-core + +2.6.4 + + + + + + +com.fasterxml.jackson.core + +jackson-databind + +2.6.4 + + + + + + + + +commons-io + +commons-io + +2.11.0 + + + + + + +commons-fileupload + +commons-fileupload + +1.4 + + + + + + + + +commons-codec + +commons-codec + +1.10 + + + + + + + + +egovframework.rte + +egovframework.rte.fdl.property + +2.7.0 + + + + + + +egovframework.rte + +egovframework.rte.ptl.mvc + +3.5.0 + + + + + + + org.json + json + 20250517 + + + + + + + +log4j + +log4j + +1.2.15 + + + + + +javax.mail + +mail + + + + + +javax.jms + +jms + + + + + +com.sun.jdmk + +jmxtools + + + + + +com.sun.jmx + +jmxri + + + + + + + + + + + + +javax.inject + +javax.inject + +1 + + + + + + +org.apache.maven.plugins + +maven-war-plugin + +2.3 + + + + + + + + +junit + +junit + +4.7 + +test + + + + + + + + + +install + +${basedir}/target + +RestBoard + + + + + +maven-eclipse-plugin + +2.9 + + + + + +org.springframework.ide.eclipse.core.springnature + + + + + +org.springframework.ide.eclipse.core.springbuilder + + + +true + +true + + + + + + + +org.apache.maven.plugins + +maven-compiler-plugin + +2.5.1 + + + +${java-version} + +${java-version} + +UTF-8 + +-Xlint:all + +true + +true + + + + + + + +org.codehaus.mojo + +exec-maven-plugin + +1.2.1 + + + +org.test.int1.Main + + + + + + + + + + +org.apache.maven.plugins + +maven-javadoc-plugin + +2.5 + + + + + +maven-war-plugin + +3.2.2 + + + + + + + + \ No newline at end of file diff --git a/src/main/front_end.zip b/src/main/front_end.zip new file mode 100644 index 0000000000000000000000000000000000000000..5f6a24cf427b0a39af4a2362d33d10fcee8e9a01 GIT binary patch literal 220702 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

_ci$cjGNXAcN_P+!EYJp5q3} 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 z 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 H9jN~Yx&C#v literal 0 HcmV?d00001 diff --git a/src/main/front_end/React_Board_Development_Guide.md b/src/main/front_end/React_Board_Development_Guide.md new file mode 100644 index 0000000..414e9e1 --- /dev/null +++ b/src/main/front_end/React_Board_Development_Guide.md @@ -0,0 +1,85 @@ +# React 게시판 프로젝트 개발 가이드 (실무 실습용) + +이 가이드는 `react_board` 프로젝트의 스켈레톤 코드를 완성해 나가는 과정에서 필요한 기술 스펙과 구현 팁을 담고 있습니다. + +--- + +## 1. 프로젝트 환경 +- **Framework**: React 19 (Vite 기반) +- **Language**: TypeScript +- **Styling**: Bootstrap (CDN 방식) +- **API Client**: Axios +- **Routing**: React Router DOM (v7) + +--- + +## 2. API 명세서 (Backend Specification) +백엔드 서버 주소는 `.env` 파일의 `VITE_API_BASE_URL`을 사용합니다. (기본값: `http://localhost:8080/RestBoard`) + +### 📋 게시글 목록 조회 +- **Method**: `GET` +- **Path**: `/board/api/list` +- **Query Params**: + - `type`: 검색 타입 (`title`, `content`, `creaNm`) + - `keyword`: 검색어 + - `page`: 페이지 번호 (1부터 시작) +- **Response Structure**: + ```json + { + "list": [ { "idx": 1, "title": "제목", ... }, ... ], + "totalpage": 10 + } + ``` + +### 📋 게시글 상세 조회 +- **Method**: `GET` +- **Path**: `/board/api/detail/{id}` +- **Response Structure**: + ```json + { "detail": { "idx": 1, "title": "제목", "contents": "내용", ... } } + ``` + +### 📋 게시글 등록 +- **Method**: `POST` +- **Path**: `/board/api/write` +- **Request Body**: `{ "title": "string", "creaNm": "string", "contents": "string" }` + +--- + +## 3. 데이터 타입 (Data Types) +`src/types/board.ts`에 정의된 인터페이스를 적극 활용하세요. + +- **IBoardItem**: 게시글 하나의 정보를 담는 객체. +- **IBoardResponse**: 목록 조회 시 서버로부터 받는 전체 데이터 구조. +- **IBoardDetailResponse**: 상세 조회 시의 데이터 구조. + +--- + +## 4. 컴포넌트별 구현 가이드 + +### 📍 [BoardList.tsx](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/react_board/src/components/BoardList.tsx) +- **핵심 로직**: `currentPage`와 `submittedSearchTerm`이 변경될 때마다 `retriveBoard()` 함수를 호출하도록 `useEffect`를 구성하세요. +- **팁**: 검색 버튼을 눌렀을 때만 검색이 실행되도록 하려면, 입력 중인 상태(`searchTerm`)와 실제 검색에 사용될 상태(`submittedSearchTerm`)를 분리하는 것이 좋습니다. + +### 📍 [Pagination.tsx](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/react_board/src/components/Pagination.tsx) +- **핵심 로직**: 한 그룹에 10페이지씩 보여준다면, 현재 페이지(`currentPage`)를 기준으로 그룹의 `startPage`를 계산하세요. +- **계산식**: `startPage = Math.floor((currentPage - 1) / 10) * 10 + 1` +- **팁**: `endPage`는 `startPage + 9`와 `totalPages` 중 더 작은 값을 택해야 에러가 나지 않습니다. + +### 📍 [PostView.tsx](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/react_board/src/components/PostView.tsx) +- **핵심 로직**: `useParams()`로 전달받은 `id` 값을 `useEffect`의 의존성 배열에 넣어 ID가 바뀔 때마다 데이터를 새로 불러옵니다. +- **UX**: 로딩 중일 때 사용자에게 피드백을 주기 위해 `loading` 상태 변수를 `boolean`으로 관리하세요. + +### 📍 [PostForm.tsx](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/react_board/src/components/PostForm.tsx) +- **핵심 로직**: React의 **제어 컴포넌트(Controlled Components)** 패턴을 사용하여 폼 데이터를 관리하세요. +- **주의사항**: `axios.post` 시 데이터 전송이 성공(`try`)하면 반드시 목록으로 이동(`useNavigate`)하게 하여 이중 등록되지 않도록 하세요. + +--- + +## 5. 학습 포인트 +> [!IMPORTANT] +> - **불변성(Immutability)**: React 상태를 업데이트할 때는 기존 배열이나 객체를 직접 수정하지 말고, 구조 분해 할당(`[...]`)이나 복사본을 만들어 새 값을 설정하세요. +> - **의존성 배열(Dependency Array)**: `useEffect`의 두 번째 인자인 배열을 잘못 설정하면 무한 루프에 빠지거나 데이터가 갱신되지 않을 수 있습니다. 항상 "어떤 값이 변할 때 이 함수를 불러야 하는가"를 고민하세요. + +--- +가이드 문서의 내용이 이해되지 않거나 더 구체적인 코드가 필요하시면 언제든 **AI 튜터**에게 물어보세요! diff --git a/src/main/front_end/Skeleton_Hint_and_File_Analysis.md b/src/main/front_end/Skeleton_Hint_and_File_Analysis.md new file mode 100644 index 0000000..95811eb --- /dev/null +++ b/src/main/front_end/Skeleton_Hint_and_File_Analysis.md @@ -0,0 +1,55 @@ +# 프론트엔드 실습용 백엔드 연동 힌트 및 첨부 파일 이슈 분석 + +이 문서는 `BoardRestController` 분석을 통해 도출된 프론트엔드 구현 힌트와, 현재 시스템 구조에서 첨부 파일 기능을 추가할 때 발생하는 기술적 병목 지점을 정리한 리포트입니다. + +--- + +## 1. 프론트엔드 구현을 위한 API 매핑 힌트 +프론트엔드 스켈레톤 코드의 `TODO:` 부분을 채울 때 다음 매핑 테이블을 참고하세요. + +| 기능 | API 경로 (Endpoint) | HTTP 메서드 | 프론트엔드 전달 데이터 | 주의사항 | +| :--- | :--- | :--- | :--- | :--- | +| **목록 조회** | `/board/api/list` | `GET` | Query Params: `page`, `type`, `keyword` | `res.data.list`와 `res.data.totalpage` 바인딩 | +| **상세 조회** | `/board/api/detail/{idx}` | `GET` | Path Variable: `idx` | 조회수 자동 증가 로직 포함됨 | +| **게시물 등록** | `/board/api/detail` | **`POST`** | **JSON Body**: `{ title, creaNm, contents }` | **주의**: URL이 `/write`가 아닌 `/detail`임 | +| **게시물 수정** | `/board/api/detail/{idx}` | `POST` | JSON Body + Path Variable | 수정 성공 시 `code: "0"` 반환 | +| **게시물 삭제** | `/board/api/detail/{idx}` | `DELETE` | Path Variable: `idx` | Soft Delete (DEL_GB='Y') 방식 | + +> [!TIP] +> 백엔드 응답에서 게시글 번호는 소문자 `idx`로 내려옵니다. (DB 컬럼명은 대문자이나 `BoardRestController`에서 소문자로 맵핑함) + +--- + +## 2. 첨부 파일 기능 구현의 구조적 문제 분석 + +현재 프로젝트 구조에서 첨부 파일 기능을 구현하려고 하면 다음과 같은 **"기술적 장벽"**에 부딪히게 됩니다. + +### 🚫 문제 1: Media Type 충돌 (JSON vs Multipart) +- **현상**: `BoardRestController`의 등록/수정 메서드는 `consumes = {MediaType.APPLICATION_JSON_VALUE}`로 선언되어 있습니다. +- **원인**: 이 설정은 **오직 JSON 데이터만** 받겠다는 뜻입니다. 파일 업로드에 필수적인 `multipart/form-data` 형식의 요청을 보내면 `415 Unsupported Media Type` 에러가 발생합니다. +- **해결**: `consumes` 설정을 제거하거나 `MULTIPART_FORM_DATA_VALUE`를 지원하도록 확장해야 합니다. + +### 🚫 문제 2: 컨트롤러 파라미터 설계 미흡 +- **현상**: `FileUtils.java`에서 파일을 추출하려면 `HttpServletRequest` 객체가 필요합니다. +- **원인**: 현재 `BoardRestController`의 메서드들은 `HttpServletRequest`를 인자로 받고 있지 않고, 오직 `@RequestBody Map`만 받고 있습니다. 파일 데이터가 담긴 요청 객체에 접근할 방법이 없습니다. + +### 🚫 문제 3: 서비스 계층의 로직 부재 (Business Logic Gap) +- **현상**: 게시글 저장 기능인 `insertBoardDetail` 메서드 내부에 파일 저장 호출 코드가 없습니다. +- **원인**: 단순히 `boardDAO.insertBoardDetail`만 호출하고 끝납니다. 원래는 `FileUtils.parseInsertFileInfo`를 호출하여 리턴된 파일 리스트를 다시 `boardDAO.insertFile`과 같은 메서드로 전달하는 로직이 추가되어야 합니다. + +### 🚫 문제 4: MyBatis 매퍼 및 DB 테이블 정의 부족 +- **현상**: `Board_SQL.xml`에 게시글과 연관된 파일 정보를 저장하거나 조회하는 쿼리가 없습니다. +- **원인**: 파일 정보를 저장할 `TB_FILE`과 같은 테이블 정의와 이를 처리할 전용 SQL문이 누락되어 있습니다. + +--- + +## 3. 해결 방안 제언 (Refactoring Path) + +첨부 파일 기능을 학습 목적으로 구현하고 싶다면 다음 순서로 코드를 수정해 보세요. + +1. **Backend (Controller)**: `consumes` 설정을 풀고, 인자에 `MultipartHttpServletRequest`를 추가합니다. +2. **Backend (Service)**: 게시물 저장 후 리턴된 `idx`를 사용하여 `fileUtils.parseInsertFileInfo`를 호출하고, 그 결과를 파일 전용 테이블에 저장하는 SQL을 호출합니다. +3. **Frontend**: `axios` 요청 시 데이터를 객체(`{}`)가 아닌 **`new FormData()`** 객체로 감싸서 보내야 합니다. + +--- +현재 구조는 **"기본 CRUD 실습"**에는 매우 최적화되어 있으나, **"파일 업로드"**는 별도의 심화 단계로 다루는 것이 적절해 보입니다. diff --git a/src/main/front_end/Vue_Board_Development_Guide.md b/src/main/front_end/Vue_Board_Development_Guide.md new file mode 100644 index 0000000..12705a7 --- /dev/null +++ b/src/main/front_end/Vue_Board_Development_Guide.md @@ -0,0 +1,64 @@ +# Vue 게시판 프로젝트 개발 가이드 (실무 실습용) + +이 가이드는 `vue_board` 프로젝트의 스켈레톤 코드를 완성해 나가는 과정에서 필요한 기술 스펙과 Vue 고유의 구현 전략을 담고 있습니다. + +--- + +## 1. 프로젝트 환경 +- **Framework**: Vue 3 (Options API 방식) +- **Language**: TypeScript +- **Styling**: W3.CSS (CDN 방식) +- **API Client**: Axios (Global Plug-in 등록) +- **Routing**: Vue Router (v4) + +--- + +## 2. API 명세서 (Backend Specification) +백엔드 주소는 전역 변수인 `this.$serverUrl`을 사용하여 접근합니다. + +### 📋 API 엔드포인트 목록 +- **목록 조회**: `GET /board/api/list` (params: type, keyword, page) +- **상세 조회**: `GET /board/api/detail/{idx}` +- **글 등록**: `POST /board/api/write` (body: JSON) +- **글 삭제**: `DELETE /board/api/delete/{idx}` + +--- + +## 3. 전역 속성 활용 (this.$...) +`main.ts`에 등록된 다음 속성들을 사용하여 코드를 간결하게 작성하세요. + +- **`this.$axios`**: Axios 별칭. 별도의 import 없이 `this.$axios.get(...)` 형태로 사용합니다. +- **`this.$serverUrl`**: 백엔드 API 서버의 기본 경로입니다. +- **`this.$router`**: 페이지 이동 제어 (예: `this.$router.push(...)`). +- **`this.$route`**: 현재 라우트 정보 접근 (예: `this.$route.params.idx`). + +--- + +## 4. 컴포넌트별 구현 가이드 + +### 📍 [BoardList.vue](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/vue_board/src/views/BoardList.vue) +- **핵심 로직**: `v-for` 디렉티브를 사용하여 `boardItems` 배열을 반복 렌더링하세요. +- **팁**: 검색 버튼 클릭 시 `currentPage`를 1로 초기화하고 데이터를 다시 불러오도록 `handleSearch` 메서드를 작성하세요. + +### 📍 [Pagination.vue](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/vue_board/src/components/Pagination.vue) +- **핵심 로직**: `props`로 받은 `currentPage`와 `totalPages`를 기반으로 페이지 번호를 생성하세요. +- **통신**: 페이지 번호 클릭 시 `this.$emit('page-change', pageNumber)`를 통해 부모(BoardList)에게 알리세요. +- **팁**: 반복되는 페이지 번호 배열은 `computed` 속성을 사용하여 가공하는 것이 성능상 유리합니다. + +### 📍 [BoardDetail.vue](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/vue_board/src/views/BoardDetail.vue) +- **핵심 로직**: `this.$route.params.idx`를 통해 URL의 ID 값을 가져와 `mounted()` 시점에 상세 조회를 실행합니다. +- **삭제**: `this.$axios.delete()`를 호출한 뒤 성공 시 목록으로 이동하도록 구현하세요. + +### 📍 [BoardWrite.vue](file:///c:/DEV/spring-workspace/RestBoard/src/main/front_end/vue_board/src/views/BoardWrite.vue) +- **핵심 로직**: `v-model` 디렉티브를 사용하여 `input`과 `textarea`의 값을 `data()` 객체와 실시간으로 동기화하세요. +- **팁**: 작성 완료 후 `this.$router.push({ name: 'board' })`를 사용하여 목록으로 돌아갑니다. + +--- + +## 5. 학습 포인트 +> [!IMPORTANT] +> - **Reactivity**: `data()` 함수에서 반환하는 객체의 속성들은 Vue가 자동으로 변화를 감지하여 화면을 업데이트합니다. +> - **Directives**: `v-if`(조건부), `v-for`(반복), `v-on`(@ 기호로 대체), `v-bind`(: 기호로 대체) 등 전용 문법의 사용법에 익숙해지세요. + +--- +Vue의 선언적인 문법과 강력한 데이터 바인딩 기능을 활용해 멋진 게시판을 완성해 보세요! diff --git a/src/main/front_end/react_board/.env b/src/main/front_end/react_board/.env new file mode 100644 index 0000000..6c88fe8 --- /dev/null +++ b/src/main/front_end/react_board/.env @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:8080/RestBoard diff --git a/src/main/front_end/react_board/.gitignore b/src/main/front_end/react_board/.gitignore new file mode 100644 index 0000000..2ccbe46 --- /dev/null +++ b/src/main/front_end/react_board/.gitignore @@ -0,0 +1 @@ +/node_modules/ diff --git a/src/main/front_end/react_board/README.md b/src/main/front_end/react_board/README.md new file mode 100644 index 0000000..7059a96 --- /dev/null +++ b/src/main/front_end/react_board/README.md @@ -0,0 +1,12 @@ +# React + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/src/main/front_end/react_board/eslint.config.js b/src/main/front_end/react_board/eslint.config.js new file mode 100644 index 0000000..cee1e2c --- /dev/null +++ b/src/main/front_end/react_board/eslint.config.js @@ -0,0 +1,29 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import { defineConfig, globalIgnores } from 'eslint/config' + +export default defineConfig([ + globalIgnores(['dist']), + { + files: ['**/*.{js,jsx}'], + extends: [ + js.configs.recommended, + reactHooks.configs['recommended-latest'], + reactRefresh.configs.vite, + ], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + parserOptions: { + ecmaVersion: 'latest', + ecmaFeatures: { jsx: true }, + sourceType: 'module', + }, + }, + rules: { + 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], + }, + }, +]) diff --git a/src/main/front_end/react_board/index.html b/src/main/front_end/react_board/index.html new file mode 100644 index 0000000..928b00e --- /dev/null +++ b/src/main/front_end/react_board/index.html @@ -0,0 +1,16 @@ + + + + + + + + Vite + React + + + +

+ + + + \ No newline at end of file diff --git a/src/main/front_end/react_board/package-lock.json b/src/main/front_end/react_board/package-lock.json new file mode 100644 index 0000000..1378da5 --- /dev/null +++ b/src/main/front_end/react_board/package-lock.json @@ -0,0 +1,3221 @@ +{ + "name": "react_board", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "react_board", + "version": "0.0.0", + "dependencies": { + "axios": "^1.12.2", + "bootstrap": "^5.3.8", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.1" + }, + "devDependencies": { + "@eslint/js": "^9.35.0", + "@types/node": "^22.13.9", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", + "eslint": "^9.35.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.4.0", + "typescript": "^5.7.3", + "vite": "^7.1.6" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz", + "integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", + "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-compilation-targets": "^7.27.2", + "@babel/helper-module-transforms": "^7.28.3", + "@babel/helpers": "^7.28.4", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/traverse": "^7.28.4", + "@babel/types": "^7.28.4", + "@jridgewell/remapping": "^2.3.5", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", + "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.3", + "@babel/types": "^7.28.2", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", + "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.27.2", + "@babel/helper-validator-option": "^7.27.1", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", + "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.27.1", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.28.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", + "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1", + "@babel/traverse": "^7.28.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", + "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", + "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz", + "integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz", + "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.4" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-self": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", + "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-source": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", + "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz", + "integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.3", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.4", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.4", + "debug": "^4.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz", + "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.10.tgz", + "integrity": "sha512-0NFWnA+7l41irNuaSVlLfgNT12caWJVLzp5eAVhZ0z1qpxbockccEt3s+149rE64VUI3Ml2zt8Nv5JVc4QXTsw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.10.tgz", + "integrity": "sha512-dQAxF1dW1C3zpeCDc5KqIYuZ1tgAdRXNoZP7vkBIRtKZPYe2xVr/d3SkirklCHudW1B45tGiUlz2pUWDfbDD4w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.10.tgz", + "integrity": "sha512-LSQa7eDahypv/VO6WKohZGPSJDq5OVOo3UoFR1E4t4Gj1W7zEQMUhI+lo81H+DtB+kP+tDgBp+M4oNCwp6kffg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.10.tgz", + "integrity": "sha512-MiC9CWdPrfhibcXwr39p9ha1x0lZJ9KaVfvzA0Wxwz9ETX4v5CHfF09bx935nHlhi+MxhA63dKRRQLiVgSUtEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.10.tgz", + "integrity": "sha512-JC74bdXcQEpW9KkV326WpZZjLguSZ3DfS8wrrvPMHgQOIEIG/sPXEN/V8IssoJhbefLRcRqw6RQH2NnpdprtMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.10.tgz", + "integrity": "sha512-tguWg1olF6DGqzws97pKZ8G2L7Ig1vjDmGTwcTuYHbuU6TTjJe5FXbgs5C1BBzHbJ2bo1m3WkQDbWO2PvamRcg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.10.tgz", + "integrity": "sha512-3ZioSQSg1HT2N05YxeJWYR+Libe3bREVSdWhEEgExWaDtyFbbXWb49QgPvFH8u03vUPX10JhJPcz7s9t9+boWg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.10.tgz", + "integrity": "sha512-LLgJfHJk014Aa4anGDbh8bmI5Lk+QidDmGzuC2D+vP7mv/GeSN+H39zOf7pN5N8p059FcOfs2bVlrRr4SK9WxA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.10.tgz", + "integrity": "sha512-oR31GtBTFYCqEBALI9r6WxoU/ZofZl962pouZRTEYECvNF/dtXKku8YXcJkhgK/beU+zedXfIzHijSRapJY3vg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.10.tgz", + "integrity": "sha512-5luJWN6YKBsawd5f9i4+c+geYiVEw20FVW5x0v1kEMWNq8UctFjDiMATBxLvmmHA4bf7F6hTRaJgtghFr9iziQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.10.tgz", + "integrity": "sha512-NrSCx2Kim3EnnWgS4Txn0QGt0Xipoumb6z6sUtl5bOEZIVKhzfyp/Lyw4C1DIYvzeW/5mWYPBFJU3a/8Yr75DQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.10.tgz", + "integrity": "sha512-xoSphrd4AZda8+rUDDfD9J6FUMjrkTz8itpTITM4/xgerAZZcFW7Dv+sun7333IfKxGG8gAq+3NbfEMJfiY+Eg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.10.tgz", + "integrity": "sha512-ab6eiuCwoMmYDyTnyptoKkVS3k8fy/1Uvq7Dj5czXI6DF2GqD2ToInBI0SHOp5/X1BdZ26RKc5+qjQNGRBelRA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.10.tgz", + "integrity": "sha512-NLinzzOgZQsGpsTkEbdJTCanwA5/wozN9dSgEl12haXJBzMTpssebuXR42bthOF3z7zXFWH1AmvWunUCkBE4EA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.10.tgz", + "integrity": "sha512-FE557XdZDrtX8NMIeA8LBJX3dC2M8VGXwfrQWU7LB5SLOajfJIxmSdyL/gU1m64Zs9CBKvm4UAuBp5aJ8OgnrA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.10.tgz", + "integrity": "sha512-3BBSbgzuB9ajLoVZk0mGu+EHlBwkusRmeNYdqmznmMc9zGASFjSsxgkNsqmXugpPk00gJ0JNKh/97nxmjctdew==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.10.tgz", + "integrity": "sha512-QSX81KhFoZGwenVyPoberggdW1nrQZSvfVDAIUXr3WqLRZGZqWk/P4T8p2SP+de2Sr5HPcvjhcJzEiulKgnxtA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.10.tgz", + "integrity": "sha512-AKQM3gfYfSW8XRk8DdMCzaLUFB15dTrZfnX8WXQoOUpUBQ+NaAFCP1kPS/ykbbGYz7rxn0WS48/81l9hFl3u4A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.10.tgz", + "integrity": "sha512-7RTytDPGU6fek/hWuN9qQpeGPBZFfB4zZgcz2VK2Z5VpdUxEI8JKYsg3JfO0n/Z1E/6l05n0unDCNc4HnhQGig==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.10.tgz", + "integrity": "sha512-5Se0VM9Wtq797YFn+dLimf2Zx6McttsH2olUBsDml+lm0GOCRVebRWUvDtkY4BWYv/3NgzS8b/UM3jQNh5hYyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.10.tgz", + "integrity": "sha512-XkA4frq1TLj4bEMB+2HnI0+4RnjbuGZfet2gs/LNs5Hc7D89ZQBHQ0gL2ND6Lzu1+QVkjp3x1gIcPKzRNP8bXw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.10.tgz", + "integrity": "sha512-AVTSBhTX8Y/Fz6OmIVBip9tJzZEUcY8WLh7I59+upa5/GPhh2/aM6bvOMQySspnCCHvFi79kMtdJS1w0DXAeag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.10.tgz", + "integrity": "sha512-fswk3XT0Uf2pGJmOpDB7yknqhVkJQkAQOcW/ccVOtfx05LkbWOaRAtn5SaqXypeKQra1QaEa841PgrSL9ubSPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.10.tgz", + "integrity": "sha512-ah+9b59KDTSfpaCg6VdJoOQvKjI33nTaQr4UluQwW7aEwZQsbMCfTmfEO4VyewOxx4RaDT/xCy9ra2GPWmO7Kw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.10.tgz", + "integrity": "sha512-QHPDbKkrGO8/cz9LKVnJU22HOi4pxZnZhhA2HYHez5Pz4JeffhDjf85E57Oyco163GnzNCVkZK0b/n4Y0UHcSw==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.10.tgz", + "integrity": "sha512-9KpxSVFCu0iK1owoez6aC/s/EdUQLDN3adTxGCqxMVhrPDj6bt5dbrHDXUuq+Bs2vATFBBrQS5vdQ/Ed2P+nbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz", + "integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==", + "dev": true, + "license": "MIT", + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", + "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/object-schema": "^2.1.6", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/config-helpers": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.1.tgz", + "integrity": "sha512-xR93k9WhrDYpXHORXpxVL5oHj3Era7wo6k/Wd8/IsQNnZUTzkGS29lyn3nAT05v6ltUuTFVCCYDEGfy2Or/sPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.2.tgz", + "integrity": "sha512-78Md3/Rrxh83gCxoUc0EiciuOHsIITzLy53m3d9UyiW8y9Dj2D29FeETqyKA+BRK76tnTp6RXWb3pCay8Oyomg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", + "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.36.0.tgz", + "integrity": "sha512-uhCbYtYynH30iZErszX78U+nR3pJU3RHGQ57NXy5QupD4SBVwDeU8TNBy+MjMngc1UyIW9noKqsRqfjQTBU2dw==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", + "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.5.tgz", + "integrity": "sha512-Z5kJ+wU3oA7MMIqVR9tyZRtjYPr4OC004Q4Rw7pgOKUOKkJfZ3O24nz3WYfGRpMDNmcOi3TwQOmgm7B7Tpii0w==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@eslint/core": "^0.15.2", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.7", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz", + "integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.4.0" + }, + "engines": { + "node": ">=18.18.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==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", + "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.13", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", + "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/remapping": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "dev": true, + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.31", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", + "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "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==", + "license": "MIT", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.35", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.35.tgz", + "integrity": "sha512-slYrCpoxJUqzFDDNlvrOYRazQUNRvWPjXA17dAOISY3rDMxX6k8K4cj2H+hEYMHF81HO3uNd5rHVigAWRM5dSg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.0.tgz", + "integrity": "sha512-VxDYCDqOaR7NXzAtvRx7G1u54d2kEHopb28YH/pKzY6y0qmogP3gG7CSiWsq9WvDFxOQMpNEyjVAHZFXfH3o/A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.0.tgz", + "integrity": "sha512-pqDirm8koABIKvzL59YI9W9DWbRlTX7RWhN+auR8HXJxo89m4mjqbah7nJZjeKNTNYopqL+yGg+0mhCpf3xZtQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.0.tgz", + "integrity": "sha512-YCdWlY/8ltN6H78HnMsRHYlPiKvqKagBP1r+D7SSylxX+HnsgXGCmLiV3Y4nSyY9hW8qr8U9LDUx/Lo7M6MfmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.0.tgz", + "integrity": "sha512-z4nw6y1j+OOSGzuVbSWdIp1IUks9qNw4dc7z7lWuWDKojY38VMWBlEN7F9jk5UXOkUcp97vA1N213DF+Lz8BRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.0.tgz", + "integrity": "sha512-Q/dv9Yvyr5rKlK8WQJZVrp5g2SOYeZUs9u/t2f9cQ2E0gJjYB/BWoedXfUT0EcDJefi2zzVfhcOj8drWCzTviw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.0.tgz", + "integrity": "sha512-kdBsLs4Uile/fbjZVvCRcKB4q64R+1mUq0Yd7oU1CMm1Av336ajIFqNFovByipciuUQjBCPMxwJhCgfG2re3rg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.0.tgz", + "integrity": "sha512-aL6hRwu0k7MTUESgkg7QHY6CoqPgr6gdQXRJI1/VbFlUMwsSzPGSR7sG5d+MCbYnJmJwThc2ol3nixj1fvI/zQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.0.tgz", + "integrity": "sha512-BTs0M5s1EJejgIBJhCeiFo7GZZ2IXWkFGcyZhxX4+8usnIo5Mti57108vjXFIQmmJaRyDwmV59Tw64Ap1dkwMw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.0.tgz", + "integrity": "sha512-uj672IVOU9m08DBGvoPKPi/J8jlVgjh12C9GmjjBxCTQc3XtVmRkRKyeHSmIKQpvJ7fIm1EJieBUcnGSzDVFyw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.0.tgz", + "integrity": "sha512-/+IVbeDMDCtB/HP/wiWsSzduD10SEGzIZX2945KSgZRNi4TSkjHqRJtNTVtVb8IRwhJ65ssI56krlLik+zFWkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.0.tgz", + "integrity": "sha512-U1vVzvSWtSMWKKrGoROPBXMh3Vwn93TA9V35PldokHGqiUbF6erSzox/5qrSMKp6SzakvyjcPiVF8yB1xKr9Pg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.0.tgz", + "integrity": "sha512-X/4WfuBAdQRH8cK3DYl8zC00XEE6aM472W+QCycpQJeLWVnHfkv7RyBFVaTqNUMsTgIX8ihMjCvFF9OUgeABzw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.0.tgz", + "integrity": "sha512-xIRYc58HfWDBZoLmWfWXg2Sq8VCa2iJ32B7mqfWnkx5mekekl0tMe7FHpY8I72RXEcUkaWawRvl3qA55og+cwQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.0.tgz", + "integrity": "sha512-mbsoUey05WJIOz8U1WzNdf+6UMYGwE3fZZnQqsM22FZ3wh1N887HT6jAOjXs6CNEK3Ntu2OBsyQDXfIjouI4dw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.0.tgz", + "integrity": "sha512-qP6aP970bucEi5KKKR4AuPFd8aTx9EF6BvutvYxmZuWLJHmnq4LvBfp0U+yFDMGwJ+AIJEH5sIP+SNypauMWzg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.0.tgz", + "integrity": "sha512-nmSVN+F2i1yKZ7rJNKO3G7ZzmxJgoQBQZ/6c4MuS553Grmr7WqR7LLDcYG53Z2m9409z3JLt4sCOhLdbKQ3HmA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.0.tgz", + "integrity": "sha512-2d0qRo33G6TfQVjaMR71P+yJVGODrt5V6+T0BDYH4EMfGgdC/2HWDVjSSFw888GSzAZUwuska3+zxNUCDco6rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.0.tgz", + "integrity": "sha512-A1JalX4MOaFAAyGgpO7XP5khquv/7xKzLIyLmhNrbiCxWpMlnsTYr8dnsWM7sEeotNmxvSOEL7F65j0HXFcFsw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.0.tgz", + "integrity": "sha512-YQugafP/rH0eOOHGjmNgDURrpYHrIX0yuojOI8bwCyXwxC9ZdTd3vYkmddPX0oHONLXu9Rb1dDmT0VNpjkzGGw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.0.tgz", + "integrity": "sha512-zYdUYhi3Qe2fndujBqL5FjAFzvNeLxtIqfzNEVKD1I7C37/chv1VxhscWSQHTNfjPCrBFQMnynwA3kpZpZ8w4A==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.0.tgz", + "integrity": "sha512-fGk03kQylNaCOQ96HDMeT7E2n91EqvCDd3RwvT5k+xNdFCeMGnj5b5hEgTGrQuyidqSsD3zJDQ21QIaxXqTBJw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.0.tgz", + "integrity": "sha512-6iKDCVSIUQ8jPMoIV0OytRKniaYyy5EbY/RRydmLW8ZR3cEBhxbWl5ro0rkUNe0ef6sScvhbY79HrjRm8i3vDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/babel__core": { + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", + "dev": true, + "license": "MIT", + "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.27.0", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", + "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__template": { + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.1.0", + "@babel/types": "^7.0.0" + } + }, + "node_modules/@types/babel__traverse": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", + "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.2" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@types/react": { + "version": "19.1.13", + "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.13.tgz", + "integrity": "sha512-hHkbU/eoO3EG5/MZkuFSKmYqPbSVk5byPFa3e7y/8TybHiLMACgI8seVYlicwk7H5K/rI2px9xrQp/C+AUDTiQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-dom": { + "version": "19.1.9", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.9.tgz", + "integrity": "sha512-qXRuZaOsAdXKFyOhRBg6Lqqc0yay13vN7KrIg4L7N4aaHN68ma9OK3NE1BoDFgFOTfM7zg+3/8+2n8rLUH3OKQ==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "@types/react": "^19.0.0" + } + }, + "node_modules/@vitejs/plugin-react": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.3.tgz", + "integrity": "sha512-PFVHhosKkofGH0Yzrw1BipSedTH68BFF8ZWy1kfUpCtJcouXXY0+racG8sExw7hw0HoX36813ga5o3LTWZ4FUg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/core": "^7.28.4", + "@babel/plugin-transform-react-jsx-self": "^7.27.1", + "@babel/plugin-transform-react-jsx-source": "^7.27.1", + "@rolldown/pluginutils": "1.0.0-beta.35", + "@types/babel__core": "^7.20.5", + "react-refresh": "^0.17.0" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0" + } + }, + "node_modules/acorn": { + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.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==", + "dev": true, + "license": "MIT", + "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/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true, + "license": "Python-2.0" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.12.2.tgz", + "integrity": "sha512-vMJzPewAlRyOgxV2dU0Cuz2O8zzzx9VYtbJOaBgXFeLc4IV/Eg50n4LowmehOOR61S8ZMpc2K5Sa7g6A4jfkUw==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/baseline-browser-mapping": { + "version": "2.8.6", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.6.tgz", + "integrity": "sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "baseline-browser-mapping": "dist/cli.js" + } + }, + "node_modules/bootstrap": { + "version": "5.3.8", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.8.tgz", + "integrity": "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "license": "MIT", + "peerDependencies": { + "@popperjs/core": "^2.11.8" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.26.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.2.tgz", + "integrity": "sha512-ECFzp6uFOSB+dcZ5BK/IBaGWssbSYBHvuMeMt3MMFyhI0Z8SqGgEkBLARgpRH3hutIgPVsALcMwbDrJqPxQ65A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "baseline-browser-mapping": "^2.8.3", + "caniuse-lite": "^1.0.30001741", + "electron-to-chromium": "^1.5.218", + "node-releases": "^2.0.21", + "update-browserslist-db": "^1.1.3" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001743", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001743.tgz", + "integrity": "sha512-e6Ojr7RV14Un7dz6ASD0aZDmQPT/A+eZU+nuTNfjqmRrmkmQlnTNWH0SKmqagx9PeW87UVqapSurtAXifmtdmw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "license": "MIT", + "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/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==", + "dev": true, + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true, + "license": "MIT" + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true, + "license": "MIT" + }, + "node_modules/cookie": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", + "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.5.222", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.222.tgz", + "integrity": "sha512-gA7psSwSwQRE60CEoLz6JBCQPIxNeuzB2nL8vE03GK/OHxlvykbLyeiumQy1iH5C2f3YbRAZpGCMT12a/9ih9w==", + "dev": true, + "license": "ISC" + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.10", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.10.tgz", + "integrity": "sha512-9RiGKvCwaqxO2owP61uQ4BgNborAQskMR6QusfWzQqv7AZOg5oGehdY2pRJMTKuwxd1IDBP4rSbI5lHzU7SMsQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.10", + "@esbuild/android-arm": "0.25.10", + "@esbuild/android-arm64": "0.25.10", + "@esbuild/android-x64": "0.25.10", + "@esbuild/darwin-arm64": "0.25.10", + "@esbuild/darwin-x64": "0.25.10", + "@esbuild/freebsd-arm64": "0.25.10", + "@esbuild/freebsd-x64": "0.25.10", + "@esbuild/linux-arm": "0.25.10", + "@esbuild/linux-arm64": "0.25.10", + "@esbuild/linux-ia32": "0.25.10", + "@esbuild/linux-loong64": "0.25.10", + "@esbuild/linux-mips64el": "0.25.10", + "@esbuild/linux-ppc64": "0.25.10", + "@esbuild/linux-riscv64": "0.25.10", + "@esbuild/linux-s390x": "0.25.10", + "@esbuild/linux-x64": "0.25.10", + "@esbuild/netbsd-arm64": "0.25.10", + "@esbuild/netbsd-x64": "0.25.10", + "@esbuild/openbsd-arm64": "0.25.10", + "@esbuild/openbsd-x64": "0.25.10", + "@esbuild/openharmony-arm64": "0.25.10", + "@esbuild/sunos-x64": "0.25.10", + "@esbuild/win32-arm64": "0.25.10", + "@esbuild/win32-ia32": "0.25.10", + "@esbuild/win32-x64": "0.25.10" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.36.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.36.0.tgz", + "integrity": "sha512-hB4FIzXovouYzwzECDcUkJ4OcfOEkXTv2zRY6B9bkwjx/cprAq0uvm1nl7zvQ0/TsUk0zQiN4uPfJpB9m+rPMQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.8.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.21.0", + "@eslint/config-helpers": "^0.3.1", + "@eslint/core": "^0.15.2", + "@eslint/eslintrc": "^3.3.1", + "@eslint/js": "9.36.0", + "@eslint/plugin-kit": "^0.3.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.2", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.4.0", + "eslint-visitor-keys": "^4.2.1", + "espree": "^10.4.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-react-hooks": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", + "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", + "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "eslint": ">=8.40" + } + }, + "node_modules/eslint-scope": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", + "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", + "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", + "dev": true, + "license": "Apache-2.0", + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.4.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", + "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "acorn": "^8.15.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "license": "BSD-3-Clause", + "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==", + "dev": true, + "license": "BSD-2-Clause", + "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==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", + "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "16.4.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz", + "integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.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==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "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==", + "dev": true, + "license": "MIT" + }, + "node_modules/node-releases": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.21.tgz", + "integrity": "sha512-5b0pgg78U3hwXkCM8Z9b2FJdPZlr9Psr9V2gQPESdGHqbntyFJKFW4r5TeWGFzafGY3hzs1JC62VEQMbl1JFkw==", + "dev": true, + "license": "MIT" + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "license": "MIT", + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "dev": true, + "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" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "license": "MIT" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/react": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react/-/react-19.1.1.tgz", + "integrity": "sha512-w8nqGImo45dmMIfljjMwOGtbmC/mk4CMYhWIicdSflH91J9TyCyczcPFXJzrZ/ZXcgGRFeP6BU0BEJTw6tZdfQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dom": { + "version": "19.1.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.1.tgz", + "integrity": "sha512-Dlq/5LAZgF0Gaz6yiqZCf6VCcZs1ghAJyrsu84Q/GT0gV+mCxbfmKNoGRKBYMJ8IEdGPqu49YWXD02GCknEDkw==", + "license": "MIT", + "dependencies": { + "scheduler": "^0.26.0" + }, + "peerDependencies": { + "react": "^19.1.1" + } + }, + "node_modules/react-refresh": { + "version": "0.17.0", + "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", + "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-router": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.9.1.tgz", + "integrity": "sha512-pfAByjcTpX55mqSDGwGnY9vDCpxqBLASg0BMNAuMmpSGESo/TaOUG6BllhAtAkCGx8Rnohik/XtaqiYUJtgW2g==", + "license": "MIT", + "dependencies": { + "cookie": "^1.0.1", + "set-cookie-parser": "^2.6.0" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + }, + "peerDependenciesMeta": { + "react-dom": { + "optional": true + } + } + }, + "node_modules/react-router-dom": { + "version": "7.9.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.9.1.tgz", + "integrity": "sha512-U9WBQssBE9B1vmRjo9qTM7YRzfZ3lUxESIZnsf4VjR/lXYz9MHjvOxHzr/aUm4efpktbVOrF09rL/y4VHa8RMw==", + "license": "MIT", + "dependencies": { + "react-router": "7.9.1" + }, + "engines": { + "node": ">=20.0.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/rollup": { + "version": "4.52.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.0.tgz", + "integrity": "sha512-+IuescNkTJQgX7AkIDtITipZdIGcWF0pnVvZTWStiazUmcGA2ag8dfg0urest2XlXUi9kuhfQ+qmdc5Stc3z7g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.52.0", + "@rollup/rollup-android-arm64": "4.52.0", + "@rollup/rollup-darwin-arm64": "4.52.0", + "@rollup/rollup-darwin-x64": "4.52.0", + "@rollup/rollup-freebsd-arm64": "4.52.0", + "@rollup/rollup-freebsd-x64": "4.52.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.52.0", + "@rollup/rollup-linux-arm-musleabihf": "4.52.0", + "@rollup/rollup-linux-arm64-gnu": "4.52.0", + "@rollup/rollup-linux-arm64-musl": "4.52.0", + "@rollup/rollup-linux-loong64-gnu": "4.52.0", + "@rollup/rollup-linux-ppc64-gnu": "4.52.0", + "@rollup/rollup-linux-riscv64-gnu": "4.52.0", + "@rollup/rollup-linux-riscv64-musl": "4.52.0", + "@rollup/rollup-linux-s390x-gnu": "4.52.0", + "@rollup/rollup-linux-x64-gnu": "4.52.0", + "@rollup/rollup-linux-x64-musl": "4.52.0", + "@rollup/rollup-openharmony-arm64": "4.52.0", + "@rollup/rollup-win32-arm64-msvc": "4.52.0", + "@rollup/rollup-win32-ia32-msvc": "4.52.0", + "@rollup/rollup-win32-x64-gnu": "4.52.0", + "@rollup/rollup-win32-x64-msvc": "4.52.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/scheduler": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", + "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", + "license": "MIT" + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", + "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", + "license": "MIT" + }, + "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==", + "dev": true, + "license": "MIT", + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "dev": true, + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "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==", + "dev": true, + "license": "MIT", + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/update-browserslist-db": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/vite": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.1.6.tgz", + "integrity": "sha512-SRYIB8t/isTwNn8vMB3MR6E+EQZM/WG1aKmmIUCfDXfVvKfc20ZpamngWHKzAmmu9ppsgxsg4b2I7c90JZudIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true, + "license": "ISC" + }, + "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==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/main/front_end/react_board/package.json b/src/main/front_end/react_board/package.json new file mode 100644 index 0000000..fd9cf50 --- /dev/null +++ b/src/main/front_end/react_board/package.json @@ -0,0 +1,33 @@ +{ + "name": "react_board", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "lint": "eslint .", + "preview": "vite preview", + "type-check": "tsc --noEmit" + }, + "dependencies": { + "axios": "^1.12.2", + "bootstrap": "^5.3.8", + "react": "^19.1.1", + "react-dom": "^19.1.1", + "react-router-dom": "^7.9.1" + }, + "devDependencies": { + "@eslint/js": "^9.35.0", + "@types/node": "^22.13.9", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.2", + "eslint": "^9.35.0", + "eslint-plugin-react-hooks": "^5.2.0", + "eslint-plugin-react-refresh": "^0.4.20", + "globals": "^16.4.0", + "typescript": "^5.7.3", + "vite": "^7.1.6" + } +} diff --git a/src/main/front_end/react_board/public/vite.svg b/src/main/front_end/react_board/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/src/main/front_end/react_board/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/front_end/react_board/src/App.css b/src/main/front_end/react_board/src/App.css new file mode 100644 index 0000000..e69de29 diff --git a/src/main/front_end/react_board/src/App.tsx b/src/main/front_end/react_board/src/App.tsx new file mode 100644 index 0000000..3148d40 --- /dev/null +++ b/src/main/front_end/react_board/src/App.tsx @@ -0,0 +1,28 @@ +import React from 'react'; +import { BrowserRouter as Router, Routes, Route } from 'react-router-dom'; +import Header from './components/Header'; +import BoardList from './components/BoardList'; +import PostView from './components/PostView'; +import PostForm from './components/PostForm'; +import './App.css'; + +const App: React.FC = () => { + + + return ( + +
+
+
+ + } /> + } /> + } /> + +
+
+ + ); +} + +export default App; \ No newline at end of file diff --git a/src/main/front_end/react_board/src/Pagination.css b/src/main/front_end/react_board/src/Pagination.css new file mode 100644 index 0000000..1c48dcc --- /dev/null +++ b/src/main/front_end/react_board/src/Pagination.css @@ -0,0 +1,31 @@ +.pagination { + display: flex; + justify-content: center; + margin-top: 20px; +} + +.pagination button { + margin: 0 5px; + padding: 8px 12px; + border: 1px solid #ddd; + background-color: #fff; + cursor: pointer; + border-radius: 4px; + font-size: 16px; +} + +.pagination button:hover { + background-color: #f0f0f0; +} + +.pagination button:disabled { + color: #ccc; + cursor: not-allowed; +} + +.pagination button.active { + background-color: #007bff; + color: white; + border-color: #007bff; + font-weight: bold; +} \ No newline at end of file diff --git a/src/main/front_end/react_board/src/assets/react.svg b/src/main/front_end/react_board/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/src/main/front_end/react_board/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/main/front_end/react_board/src/components/BoardList.tsx b/src/main/front_end/react_board/src/components/BoardList.tsx new file mode 100644 index 0000000..f903b61 --- /dev/null +++ b/src/main/front_end/react_board/src/components/BoardList.tsx @@ -0,0 +1,142 @@ +import React, { useState, useEffect } from 'react'; +import { Link } from 'react-router-dom'; +import axios from 'axios'; +import Pagination from './Pagination'; +import { IBoardItem, IBoardResponse } from '../types/board'; + +/** + * [실습 Phase 1 & 5] 게시판 목록 및 검색 컴포넌트 + * + * 가이드: + * 1. useState를 사용하여 게시글 목록(posts), 검색어(searchTerm), 현재 페이지(currentPage), 전체 페이지(totalPages) 상태를 정의하세요. + * 2. useEffect를 사용하여 컴포넌트 마운트 시와 페이지/검색어 변경 시 데이터를 가져오는 로직을 구현하세요. + * 3. axios를 사용하여 `${import.meta.env.VITE_API_BASE_URL}/board/api/list`에 GET 요청을 보내세요. + * - 파라미터: type (검색타입), keyword (검색어), page (현재페이지) + * 4. 검색 버튼 클릭 및 엔터키 입력 시 검색이 실행되도록 핸들러를 작성하세요. + */ +const BoardList: React.FC = () => { + // TODO: 실습에 필요한 상태(State)를 정의하세요. + const [posts, setPosts] = useState([]); + const [searchTerm, setSearchTerm] = useState(''); + const [submittedSearchTerm, setSubmittedSearchTerm] = useState(''); + const [searchType, setSearchType] = useState('title'); + const [currentPage, setCurrentPage] = useState(1); + const [totalPages, setTotalPages] = useState(1); + const URL:String = import.meta.env.VITE_API_BASE_URL; + + // TODO: API 호출 함수(retriveBoard)를 작성하세요. + const retriveBoard = () => { + /* + axios.get(URL, { params: { ... } }) + .then(response => { ... }) + */ + const params = {page:currentPage,type:searchType,keyword:submittedSearchTerm}; + axios.get( URL+"/board/api/list",{params}) + .then(response => { + console.log(response.data); + setPosts(response.data.list); + setTotalPages(response.data.totalpage); + }) + }; + + // TODO: useEffect를 사용하여 데이터 로드 시점을 제어하세요. + useEffect(() => { + // retriveBoard 호출 + retriveBoard(); + }, [currentPage,submittedSearchTerm]); + + const handleSearch = () => { + setSubmittedSearchTerm(searchTerm); + }; + + const handlePageChange = (page: number) => { + setCurrentPage(page); + }; + + const handleEnter = (e:any) =>{ + if(e.key == "Enter"){ + handleSearch(); + } + } + + return ( + <> +

Board

+ + {/* 검색 바 영역 */} +
+
+ New Post +
+
+
+ + setSearchTerm(e.target.value)} + onKeyDown={handleEnter} + /* TODO: 엔터키 입력 시 검색 실행 (onKeyDown) */ + /> + +
+
+
+ + {/* 목록 테이블 영역 */} +
+ + + + + + + + + + + + {/* TODO: posts 배열을 순회하며 목록을 출력하세요. (.map 활용) */} + {posts.length > 0 ? ( + posts.map((post) => ( + + + + + + + + )) + ) : ( + + + + )} + +
No.TitleAuthorDateHits
{post.rnum} + {post.title} + {post.creaNm}{post.creaDtm}{post.hitCnt}
데이터가 없습니다. 로직을 구현해 보세요!
+
+ + {/* 페이징 컴포넌트 호출 */} + + + ); +}; + +export default BoardList; \ No newline at end of file diff --git a/src/main/front_end/react_board/src/components/Header.tsx b/src/main/front_end/react_board/src/components/Header.tsx new file mode 100644 index 0000000..991a620 --- /dev/null +++ b/src/main/front_end/react_board/src/components/Header.tsx @@ -0,0 +1,29 @@ +import React from 'react'; +import { Link } from 'react-router-dom'; + +const Header: React.FC = () => { + return ( +
+ +
+ ); +}; + +export default Header; diff --git a/src/main/front_end/react_board/src/components/Pagination.tsx b/src/main/front_end/react_board/src/components/Pagination.tsx new file mode 100644 index 0000000..459fe33 --- /dev/null +++ b/src/main/front_end/react_board/src/components/Pagination.tsx @@ -0,0 +1,64 @@ +import React from 'react'; + +interface PaginationProps { + currentPage: number; + totalPages: number; + onPageChange: (page: number) => void; +} + +/** + * [실습 Phase 2] 공통 페이징 컴포넌트 + * + * 가이드: + * 1. pagesPerGroup(예: 10)을 정의하여 한 번에 보여줄 페이지 갯수를 설정하세요. + * 2. startPage(그룹 시작 페이지)와 endPage(그룹 끝 페이지)를 현재 페이지를 기준으로 계산하세요. + * - 공식: Math.floor((currentPage - 1) / 10) * 10 + 1 + * 3. 반복문(for)을 사용하여 startPage부터 endPage까지의 번호를 배열에 담으세요. + * 4. 이전 그룹, 다음 그룹, 개별 페이지 번호 클릭 시 onPageChange(번호)를 호출하도록 구현하세요. + */ +const Pagination: React.FC = ({ currentPage, totalPages, onPageChange }) => { + // TODO: 페이징 그룹 로직을 구현하세요. + const pagesPerGroup = 10; + const startPage = Math.floor((currentPage - 1) / 10) * 10 + 1; // 계산 필요 + const endPage = startPage+9<=totalPages?startPage+9:totalPages; // 계산 필요 + + const pageNumbers: number[] = []; + for(let i=startPage ;i<=endPage;i++){ + pageNumbers.push(i); + } + // TODO: for문을 사용하여 pageNumbers 배열을 구성하세요. + + return ( + + ); +}; + +export default Pagination; \ No newline at end of file diff --git a/src/main/front_end/react_board/src/components/PostForm.tsx b/src/main/front_end/react_board/src/components/PostForm.tsx new file mode 100644 index 0000000..1b823fa --- /dev/null +++ b/src/main/front_end/react_board/src/components/PostForm.tsx @@ -0,0 +1,121 @@ +import React, { useState } from 'react'; +import { useNavigate } from 'react-router-dom'; +import axios from 'axios'; + +/** + * [실습 Phase 4] 게시글 작성 컴포넌트 + * + * 가이드: + * 1. useState를 사용하여 제목(title), 작성자(creaNm), 내용(contents) 상태를 각각 정의하세요. + * 2. Input 태그의 value를 상태와 연결하고, onChange 이벤트를 통해 상태가 업데이트되도록 구현하세요. (제어 컴포넌트) + * 3. 폼 제출 시(onSubmit) handleSubmit 함수를 실행하여 axios.post를 호출하세요. + * - 엔드포인트: `${import.meta.env.VITE_API_BASE_URL}/board/api/write` + * - 보낼 데이터: { title, creaNm, contents } + * 4. 등록 성공 후, navigate('/')를 사용하여 홈(목록) 화면으로 이동하세요. + */ +const PostForm: React.FC = () => { + // TODO: 폼 데이터를 위한 상태를 정의하세요 (useState) + const [title, setTitle] = useState(''); + const [creaNm, setCreaNm] = useState(''); + const [creaPass, setCreaPass] = useState(''); + const [contents, setContents] = useState(''); + const navigate = useNavigate(); + const URL:String = import.meta.env.VITE_API_BASE_URL; + + // TODO: 폼 전송 핸들러를 작성하세요. + const handleSubmit = async (e: React.FormEvent) => { + // e.preventDefault(); 호출 필요 + e.preventDefault(); + /* + try { + await axios.post(URL, { ... }); + alert('성공!'); + navigate('/'); + } catch { ... } + */ + const params ={ title:title, creaId:creaNm, contents:contents, password: creaPass }; + + try { + await axios.post(URL+"/board/api/detail", params).then( + response=>{ + if(response.data.code != "0"){ + throw new Error("실패"); + } + }); + alert('성공!'); + navigate('/'); + } catch { + alert('실패!'); + } + }; + + return ( + <> +

New Post

+
+
+
+
+ + setTitle(e.target.value)} + /* TODO: value와 onChange를 연결하세요 */ + /> +
+
+ + setCreaNm(e.target.value)} + + /* TODO: value와 onChange를 연결하세요 */ + /> +
+
+ + setCreaPass(e.target.value)} + + /* TODO: value와 onChange를 연결하세요 */ + /> +
+
+ + + +
+ + +
+ +
+
+ + + \ No newline at end of file diff --git a/src/main/front_end/vue_board/src/views/BoardWrite.vue b/src/main/front_end/vue_board/src/views/BoardWrite.vue new file mode 100644 index 0000000..591cf5c --- /dev/null +++ b/src/main/front_end/vue_board/src/views/BoardWrite.vue @@ -0,0 +1,88 @@ + + + \ No newline at end of file diff --git a/src/main/front_end/vue_board/tsconfig.app.json b/src/main/front_end/vue_board/tsconfig.app.json new file mode 100644 index 0000000..f809bb6 --- /dev/null +++ b/src/main/front_end/vue_board/tsconfig.app.json @@ -0,0 +1,15 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "module": "ESNext", + "moduleResolution": "bundler", + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/src/main/front_end/vue_board/tsconfig.json b/src/main/front_end/vue_board/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/src/main/front_end/vue_board/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/src/main/front_end/vue_board/tsconfig.node.json b/src/main/front_end/vue_board/tsconfig.node.json new file mode 100644 index 0000000..5cbc713 --- /dev/null +++ b/src/main/front_end/vue_board/tsconfig.node.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.config.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "types": ["node"] + } +} diff --git a/src/main/front_end/vue_board/vite.config.js b/src/main/front_end/vue_board/vite.config.js new file mode 100644 index 0000000..d49d708 --- /dev/null +++ b/src/main/front_end/vue_board/vite.config.js @@ -0,0 +1,20 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) diff --git a/src/main/front_end/vue_board_exam/.editorconfig b/src/main/front_end/vue_board_exam/.editorconfig new file mode 100644 index 0000000..ecea360 --- /dev/null +++ b/src/main/front_end/vue_board_exam/.editorconfig @@ -0,0 +1,6 @@ +[*.{js,jsx,mjs,cjs,ts,tsx,mts,cts,vue}] +charset = utf-8 +indent_size = 2 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/src/main/front_end/vue_board_exam/.env b/src/main/front_end/vue_board_exam/.env new file mode 100644 index 0000000..6c88fe8 --- /dev/null +++ b/src/main/front_end/vue_board_exam/.env @@ -0,0 +1 @@ +VITE_API_BASE_URL=http://localhost:8080/RestBoard diff --git a/src/main/front_end/vue_board_exam/.gitignore b/src/main/front_end/vue_board_exam/.gitignore new file mode 100644 index 0000000..8ee54e8 --- /dev/null +++ b/src/main/front_end/vue_board_exam/.gitignore @@ -0,0 +1,30 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +dist-ssr +coverage +*.local + +/cypress/videos/ +/cypress/screenshots/ + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +*.tsbuildinfo diff --git a/src/main/front_end/vue_board_exam/.prettierrc.json b/src/main/front_end/vue_board_exam/.prettierrc.json new file mode 100644 index 0000000..17a23d0 --- /dev/null +++ b/src/main/front_end/vue_board_exam/.prettierrc.json @@ -0,0 +1,7 @@ + +{ + "$schema": "https://json.schemastore.org/prettierrc", + "semi": false, + "singleQuote": true, + "printWidth": 100 +} diff --git a/src/main/front_end/vue_board_exam/README.md b/src/main/front_end/vue_board_exam/README.md new file mode 100644 index 0000000..9319001 --- /dev/null +++ b/src/main/front_end/vue_board_exam/README.md @@ -0,0 +1,35 @@ +# vue_board + +This template should help get you started developing with Vue 3 in Vite. + +## Recommended IDE Setup + +[VSCode](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur). + +## Customize configuration + +See [Vite Configuration Reference](https://vite.dev/config/). + +## Project Setup + +```sh +npm install +``` + +### Compile and Hot-Reload for Development + +```sh +npm run dev +``` + +### Compile and Minify for Production + +```sh +npm run build +``` + +### Lint with [ESLint](https://eslint.org/) + +```sh +npm run lint +``` diff --git a/src/main/front_end/vue_board_exam/env.d.ts b/src/main/front_end/vue_board_exam/env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/src/main/front_end/vue_board_exam/env.d.ts @@ -0,0 +1 @@ +/// diff --git a/src/main/front_end/vue_board_exam/eslint.config.js b/src/main/front_end/vue_board_exam/eslint.config.js new file mode 100644 index 0000000..76c70ec --- /dev/null +++ b/src/main/front_end/vue_board_exam/eslint.config.js @@ -0,0 +1,19 @@ +import js from '@eslint/js' +import pluginVue from 'eslint-plugin-vue' +import skipFormatting from '@vue/eslint-config-prettier/skip-formatting' + +export default [ + { + name: 'app/files-to-lint', + files: ['**/*.{js,mjs,jsx,vue}'], + }, + + { + name: 'app/files-to-ignore', + ignores: ['**/dist/**', '**/dist-ssr/**', '**/coverage/**'], + }, + + js.configs.recommended, + ...pluginVue.configs['flat/essential'], + skipFormatting, +] diff --git a/src/main/front_end/vue_board_exam/index.html b/src/main/front_end/vue_board_exam/index.html new file mode 100644 index 0000000..e3441fe --- /dev/null +++ b/src/main/front_end/vue_board_exam/index.html @@ -0,0 +1,17 @@ + + + + + + + + + Vite App + + + +
+ + + + \ No newline at end of file diff --git a/src/main/front_end/vue_board_exam/jsconfig.json b/src/main/front_end/vue_board_exam/jsconfig.json new file mode 100644 index 0000000..5a1f2d2 --- /dev/null +++ b/src/main/front_end/vue_board_exam/jsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "paths": { + "@/*": ["./src/*"] + } + }, + "exclude": ["node_modules", "dist"] +} diff --git a/src/main/front_end/vue_board_exam/package-lock.json b/src/main/front_end/vue_board_exam/package-lock.json new file mode 100644 index 0000000..9936a1f --- /dev/null +++ b/src/main/front_end/vue_board_exam/package-lock.json @@ -0,0 +1,4299 @@ +{ + "name": "vue_board", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "vue_board", + "version": "0.0.0", + "dependencies": { + "axios": "^1.7.9", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@eslint/js": "^9.14.0", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^22.13.9", + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "@vue/eslint-config-prettier": "^10.1.0", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.14.0", + "eslint-plugin-vue": "^9.30.0", + "npm-run-all2": "^7.0.2", + "prettier": "^3.3.3", + "typescript": "~5.7.3", + "vite": "^6.0.5", + "vite-plugin-vue-devtools": "^7.6.8", + "vue-tsc": "^2.2.4" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz", + "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.26.0", + "@babel/generator": "^7.26.0", + "@babel/helper-compilation-targets": "^7.25.9", + "@babel/helper-module-transforms": "^7.26.0", + "@babel/helpers": "^7.26.0", + "@babel/parser": "^7.26.0", + "@babel/template": "^7.25.9", + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.26.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", + "dev": true, + "dependencies": { + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz", + "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.26.5", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz", + "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/helper-replace-supers": "^7.25.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/traverse": "^7.25.9", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz", + "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz", + "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", + "dev": true, + "dependencies": { + "@babel/helper-member-expression-to-functions": "^7.25.9", + "@babel/helper-optimise-call-expression": "^7.25.9", + "@babel/traverse": "^7.26.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz", + "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==", + "dev": true, + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", + "dev": true, + "dependencies": { + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", + "dependencies": { + "@babel/types": "^7.26.5" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-proposal-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.25.9.tgz", + "integrity": "sha512-smkNLL/O1ezy9Nhy4CNosc4Va+1wo5w4gzSZeLe6y6dM4mmHfYOCPolXQPHQxonZCF+ZyebxN9vqOolkYrSn5g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.25.9", + "@babel/plugin-syntax-decorators": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-decorators": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.25.9.tgz", + "integrity": "sha512-ryzI0McXUPJnRCvMo4lumIKZUzhYUO/ScI+Mz4YVaTLt04DHNSjEUjKVvbzQjZFLuod/cYEc07mJWhzl6v4DPg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz", + "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "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==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz", + "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz", + "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz", + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.25.9", + "@babel/helper-create-class-features-plugin": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", + "@babel/plugin-syntax-typescript": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/template": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.5", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.24.2.tgz", + "integrity": "sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.24.2.tgz", + "integrity": "sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.24.2.tgz", + "integrity": "sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.24.2.tgz", + "integrity": "sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.24.2.tgz", + "integrity": "sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.24.2.tgz", + "integrity": "sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.2.tgz", + "integrity": "sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.24.2.tgz", + "integrity": "sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.24.2.tgz", + "integrity": "sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.24.2.tgz", + "integrity": "sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.24.2.tgz", + "integrity": "sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.24.2.tgz", + "integrity": "sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.24.2.tgz", + "integrity": "sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.24.2.tgz", + "integrity": "sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.24.2.tgz", + "integrity": "sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.24.2.tgz", + "integrity": "sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.24.2.tgz", + "integrity": "sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.24.2.tgz", + "integrity": "sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.24.2.tgz", + "integrity": "sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.2.tgz", + "integrity": "sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.24.2.tgz", + "integrity": "sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.24.2.tgz", + "integrity": "sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.24.2.tgz", + "integrity": "sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.24.2.tgz", + "integrity": "sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.24.2.tgz", + "integrity": "sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz", + "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", + "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/config-array": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz", + "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==", + "dev": true, + "dependencies": { + "@eslint/object-schema": "^2.1.5", + "debug": "^4.3.1", + "minimatch": "^3.1.2" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/core": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.10.0.tgz", + "integrity": "sha512-gFHJ+xBOo4G3WRlR1e/3G8A6/KZAH6zcE/hkLRCZTi/B9avAG365QhFA8uOGzTMqgTghpn7/fSnscW++dpMSAw==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.15" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz", + "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^10.0.1", + "globals": "^14.0.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": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "14.0.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", + "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@eslint/js": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.18.0.tgz", + "integrity": "sha512-fK6L7rxcq6/z+AaQMtiFTkvbHkBLNlwyRxHpKawP0x3u9+NC6MQTnFW+AdpwC6gfHTW0051cokQgtTN2FqlxQA==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/object-schema": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz", + "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@eslint/plugin-kit": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.5.tgz", + "integrity": "sha512-lB05FkqEdUg2AA0xEbUz0SnkXT1LcCTa438W4IWTUh4hdOnVbQyOJ81OrDXsJk/LSiJHubgGEFoR5EHq1NsH1A==", + "dev": true, + "dependencies": { + "@eslint/core": "^0.10.0", + "levn": "^0.4.1" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + } + }, + "node_modules/@humanfs/core": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", + "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node": { + "version": "0.16.6", + "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", + "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", + "dev": true, + "dependencies": { + "@humanfs/core": "^0.19.1", + "@humanwhocodes/retry": "^0.3.0" + }, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", + "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/retry": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz", + "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==", + "dev": true, + "engines": { + "node": ">=18.18" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@pkgr/core": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", + "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.28", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz", + "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==", + "dev": true + }, + "node_modules/@rollup/pluginutils": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", + "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", + "dev": true, + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.31.0.tgz", + "integrity": "sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.31.0.tgz", + "integrity": "sha512-iBbODqT86YBFHajxxF8ebj2hwKm1k8PTBQSojSt3d1FFt1gN+xf4CowE47iN0vOSdnd+5ierMHBbu/rHc7nq5g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.31.0.tgz", + "integrity": "sha512-WHIZfXgVBX30SWuTMhlHPXTyN20AXrLH4TEeH/D0Bolvx9PjgZnn4H677PlSGvU6MKNsjCQJYczkpvBbrBnG6g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.31.0.tgz", + "integrity": "sha512-hrWL7uQacTEF8gdrQAqcDy9xllQ0w0zuL1wk1HV8wKGSGbKPVjVUv/DEwT2+Asabf8Dh/As+IvfdU+H8hhzrQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.31.0.tgz", + "integrity": "sha512-S2oCsZ4hJviG1QjPY1h6sVJLBI6ekBeAEssYKad1soRFv3SocsQCzX6cwnk6fID6UQQACTjeIMB+hyYrFacRew==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.31.0.tgz", + "integrity": "sha512-pCANqpynRS4Jirn4IKZH4tnm2+2CqCNLKD7gAdEjzdLGbH1iO0zouHz4mxqg0uEMpO030ejJ0aA6e1PJo2xrPA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.31.0.tgz", + "integrity": "sha512-0O8ViX+QcBd3ZmGlcFTnYXZKGbFu09EhgD27tgTdGnkcYXLat4KIsBBQeKLR2xZDCXdIBAlWLkiXE1+rJpCxFw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.31.0.tgz", + "integrity": "sha512-w5IzG0wTVv7B0/SwDnMYmbr2uERQp999q8FMkKG1I+j8hpPX2BYFjWe69xbhbP6J9h2gId/7ogesl9hwblFwwg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.31.0.tgz", + "integrity": "sha512-JyFFshbN5xwy6fulZ8B/8qOqENRmDdEkcIMF0Zz+RsfamEW+Zabl5jAb0IozP/8UKnJ7g2FtZZPEUIAlUSX8cA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.31.0.tgz", + "integrity": "sha512-kpQXQ0UPFeMPmPYksiBL9WS/BDiQEjRGMfklVIsA0Sng347H8W2iexch+IEwaR7OVSKtr2ZFxggt11zVIlZ25g==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loongarch64-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.31.0.tgz", + "integrity": "sha512-pMlxLjt60iQTzt9iBb3jZphFIl55a70wexvo8p+vVFK+7ifTRookdoXX3bOsRdmfD+OKnMozKO6XM4zR0sHRrQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.31.0.tgz", + "integrity": "sha512-D7TXT7I/uKEuWiRkEFbed1UUYZwcJDU4vZQdPTcepK7ecPhzKOYk4Er2YR4uHKme4qDeIh6N3XrLfpuM7vzRWQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.31.0.tgz", + "integrity": "sha512-wal2Tc8O5lMBtoePLBYRKj2CImUCJ4UNGJlLwspx7QApYny7K1cUYlzQ/4IGQBLmm+y0RS7dwc3TDO/pmcneTw==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.31.0.tgz", + "integrity": "sha512-O1o5EUI0+RRMkK9wiTVpk2tyzXdXefHtRTIjBbmFREmNMy7pFeYXCFGbhKFwISA3UOExlo5GGUuuj3oMKdK6JQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.31.0.tgz", + "integrity": "sha512-zSoHl356vKnNxwOWnLd60ixHNPRBglxpv2g7q0Cd3Pmr561gf0HiAcUBRL3S1vPqRC17Zo2CX/9cPkqTIiai1g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.31.0.tgz", + "integrity": "sha512-ypB/HMtcSGhKUQNiFwqgdclWNRrAYDH8iMYH4etw/ZlGwiTVxBz2tDrGRrPlfZu6QjXwtd+C3Zib5pFqID97ZA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.31.0.tgz", + "integrity": "sha512-JuhN2xdI/m8Hr+aVO3vspO7OQfUFO6bKLIRTAy0U15vmWjnZDLrEgCZ2s6+scAYaQVpYSh9tZtRijApw9IXyMw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.31.0.tgz", + "integrity": "sha512-U1xZZXYkvdf5MIWmftU8wrM5PPXzyaY1nGCI4KI4BFfoZxHamsIe+BtnPLIvvPykvQWlVbqUXdLa4aJUuilwLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.31.0.tgz", + "integrity": "sha512-ul8rnCsUumNln5YWwz0ted2ZHFhzhRRnkpBZ+YRuHoRAlUji9KChpOUOndY7uykrPEPXVbHLlsdo6v5yXo/TXw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sec-ant/readable-stream": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", + "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", + "dev": true + }, + "node_modules/@sindresorhus/merge-streams": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", + "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@tsconfig/node22": { + "version": "22.0.5", + "resolved": "https://registry.npmjs.org/@tsconfig/node22/-/node22-22.0.5.tgz", + "integrity": "sha512-hLf2ld+sYN/BtOJjHUWOk568dvjFQkHnLNa6zce25GIH+vxKfvTgm3qpaH6ToF5tu/NN0IH66s+Bb5wElHrLcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/estree": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/node": { + "version": "22.19.17", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.19.17.tgz", + "integrity": "sha512-wGdMcf+vPYM6jikpS/qhg6WiqSV/OhG+jeeHT/KlVqxYfD40iYJf9/AE1uQxVWFvU7MipKRkRv8NSHiCGgPr8Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~6.21.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz", + "integrity": "sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==", + "dev": true, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-4.1.1.tgz", + "integrity": "sha512-uMJqv/7u1zz/9NbWAD3XdjaY20tKTf17XVfQ9zq4wY1BjsB/PjpJPMe2xiG39QpP4ZdhYNhm4Hvo66uJrykNLA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.26.0", + "@babel/plugin-transform-typescript": "^7.25.9", + "@vue/babel-plugin-jsx": "^1.2.5" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.2.5.tgz", + "integrity": "sha512-lOz4t39ZdmU4DJAa2hwPYmKc8EsuGa2U0L9KaZaOJUt0UwQNjNA3AZTq6uEivhOKhhG1Wvy96SvYBoFmCg3uuw==", + "dev": true + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.2.5.tgz", + "integrity": "sha512-zTrNmOd4939H9KsRIGmmzn3q2zvv1mjxkYZHgqHZgDrXz5B1Q3WyGEjO2f+JrmKghvl1JIRcvo63LgM1kH5zFg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.6", + "@babel/types": "^7.25.6", + "@vue/babel-helper-vue-transform-on": "1.2.5", + "@vue/babel-plugin-resolve-type": "1.2.5", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + } + } + }, + "node_modules/@vue/babel-plugin-resolve-type": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@vue/babel-plugin-resolve-type/-/babel-plugin-resolve-type-1.2.5.tgz", + "integrity": "sha512-U/ibkQrf5sx0XXRnUZD1mo5F7PkpKyTbfXM3a3rC4YnUz6crHEz9Jg09jzzL6QYlXNto/9CePdOg/c87O4Nlfg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/parser": "^7.25.6", + "@vue/compiler-sfc": "^3.5.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.13.tgz", + "integrity": "sha512-oOdAkwqUfW1WqpwSYJce06wvt6HljgY3fGeM9NcVA1HaYOij3mZG9Rkysn0OHuyUAGMbEbARIpsG+LPVlBJ5/Q==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/shared": "3.5.13", + "entities": "^4.5.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.13.tgz", + "integrity": "sha512-ZOJ46sMOKUjO3e94wPdCzQ6P1Lx/vhp2RSvfaab88Ajexs0AHeV0uasYhi99WPaogmBlRHNRuly8xV75cNTMDA==", + "dependencies": { + "@vue/compiler-core": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.13.tgz", + "integrity": "sha512-6VdaljMpD82w6c2749Zhf5T9u5uLBWKnVue6XWxprDobftnletJ8+oel7sexFfM3qIxNmVE7LSFGTpv6obNyaQ==", + "dependencies": { + "@babel/parser": "^7.25.3", + "@vue/compiler-core": "3.5.13", + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.11", + "postcss": "^8.4.48", + "source-map-js": "^1.2.0" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.13.tgz", + "integrity": "sha512-wMH6vrYHxQl/IybKJagqbquvxpWCuVYpoUJfCqFZwa/JY1GdATAQ+TgVtgrwwMZ0D07QhA99rs/EAAWfvG6KpA==", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==" + }, + "node_modules/@vue/devtools-core": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-core/-/devtools-core-7.7.0.tgz", + "integrity": "sha512-tSO3pghV5RZGSonZ87S2fOGru3X93epmar5IjZOWjHxH6XSwnK5UbR2aW5puZV+LgLoVYrcNou3krSo5k1F31g==", + "dev": true, + "dependencies": { + "@vue/devtools-kit": "^7.7.0", + "@vue/devtools-shared": "^7.7.0", + "mitt": "^3.0.1", + "nanoid": "^5.0.9", + "pathe": "^1.1.2", + "vite-hot-client": "^0.2.4" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/@vue/devtools-core/node_modules/nanoid": { + "version": "5.0.9", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.9.tgz", + "integrity": "sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@vue/devtools-kit": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-kit/-/devtools-kit-7.7.0.tgz", + "integrity": "sha512-5cvZ+6SA88zKC8XiuxUfqpdTwVjJbvYnQZY5NReh7qlSGPvVDjjzyEtW+gdzLXNSd8tStgOjAdMCpvDQamUXtA==", + "dev": true, + "dependencies": { + "@vue/devtools-shared": "^7.7.0", + "birpc": "^0.2.19", + "hookable": "^5.5.3", + "mitt": "^3.0.1", + "perfect-debounce": "^1.0.0", + "speakingurl": "^14.0.1", + "superjson": "^2.2.1" + } + }, + "node_modules/@vue/devtools-shared": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-shared/-/devtools-shared-7.7.0.tgz", + "integrity": "sha512-jtlQY26R5thQxW9YQTpXbI0HoK0Wf9Rd4ekidOkRvSy7ChfK0kIU6vvcBtjj87/EcpeOSK49fZAicaFNJcoTcQ==", + "dev": true, + "dependencies": { + "rfdc": "^1.4.1" + } + }, + "node_modules/@vue/eslint-config-prettier": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-10.2.0.tgz", + "integrity": "sha512-GL3YBLwv/+b86yHcNNfPJxOTtVFJ4Mbc9UU3zR+KVoG7SwGTjPT+32fXamscNumElhcpXW3mT0DgzS9w32S7Bw==", + "dev": true, + "dependencies": { + "eslint-config-prettier": "^10.0.1", + "eslint-plugin-prettier": "^5.2.2" + }, + "peerDependencies": { + "eslint": ">= 8.21.0", + "prettier": ">= 3.0.0" + } + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.13.tgz", + "integrity": "sha512-NaCwtw8o48B9I6L1zl2p41OHo/2Z4wqYGGIK1Khu5T7yxrn+ATOixn/Udn2m+6kZKB/J7cuT9DbWWhRxqixACg==", + "dependencies": { + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.13.tgz", + "integrity": "sha512-Fj4YRQ3Az0WTZw1sFe+QDb0aXCerigEpw418pw1HBUKFtnQHWzwojaukAs2X/c9DQz4MQ4bsXTGlcpGxU/RCIw==", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/shared": "3.5.13" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.13.tgz", + "integrity": "sha512-dLaj94s93NYLqjLiyFzVs9X6dWhTdAlEAciC3Moq7gzAc13VJUdCnjjRurNM6uTLFATRHexHCTu/Xp3eW6yoog==", + "dependencies": { + "@vue/reactivity": "3.5.13", + "@vue/runtime-core": "3.5.13", + "@vue/shared": "3.5.13", + "csstype": "^3.1.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.13.tgz", + "integrity": "sha512-wAi4IRJV/2SAW3htkTlB+dHeRmpTiVIK1OGLWV1yeStVSebSQQOwGwIq0D3ZIoBj2C2qpgz5+vX9iEBkTdk5YA==", + "dependencies": { + "@vue/compiler-ssr": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "vue": "3.5.13" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.13.tgz", + "integrity": "sha512-/hnE/qP5ZoGpol0a5mDi45bOd7t3tjYJBjsgCsivow7D48cJeV5l05RD82lPqi7gRiphZM37rnhW1l6ZoCNNnQ==" + }, + "node_modules/@vue/tsconfig": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.7.0.tgz", + "integrity": "sha512-ku2uNz5MaZ9IerPPUyOHzyjhXoX2kVJaVf7hL315DC17vS6IiZRmmCPfggNbU16QTvM80+uYYy3eYJB59WCtvg==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "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==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.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==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "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==", + "dev": true + }, + "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/axios": { + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/birpc": { + "version": "0.2.19", + "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.19.tgz", + "integrity": "sha512-5WeXXAvTmitV1RqJFppT5QtUiz2p1mRSYU000Jkft5ZUCLJIk4uQriYNO50HknxKwM6jd8utNc66K1qGIwwWBQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/browserslist": { + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/bundle-name": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", + "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", + "dev": true, + "dependencies": { + "run-applescript": "^7.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001695", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001695.tgz", + "integrity": "sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "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/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==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "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==", + "dev": true + }, + "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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "dev": true, + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "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==", + "dev": true + }, + "node_modules/default-browser": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", + "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", + "dev": true, + "dependencies": { + "bundle-name": "^4.1.0", + "default-browser-id": "^5.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/default-browser-id": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", + "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/define-lazy-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", + "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/electron-to-chromium": { + "version": "1.5.84", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.84.tgz", + "integrity": "sha512-I+DQ8xgafao9Ha6y0qjHHvpZ9OfyA1qKlkHkjywxzniORU2awxyz7f/iVJcULmrF2yrM3nHQf+iDjJtbbexd/g==", + "dev": true + }, + "node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/error-stack-parser-es": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/error-stack-parser-es/-/error-stack-parser-es-0.1.5.tgz", + "integrity": "sha512-xHku1X40RO+fO8yJ8Wh2f2rZWVjqyhb1zgq1yZ8aZRQkv6OOKhKWRUaht3eSCUbAOBaKIgM+ykwFLE+QUxgGeg==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/esbuild": { + "version": "0.24.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.24.2.tgz", + "integrity": "sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.24.2", + "@esbuild/android-arm": "0.24.2", + "@esbuild/android-arm64": "0.24.2", + "@esbuild/android-x64": "0.24.2", + "@esbuild/darwin-arm64": "0.24.2", + "@esbuild/darwin-x64": "0.24.2", + "@esbuild/freebsd-arm64": "0.24.2", + "@esbuild/freebsd-x64": "0.24.2", + "@esbuild/linux-arm": "0.24.2", + "@esbuild/linux-arm64": "0.24.2", + "@esbuild/linux-ia32": "0.24.2", + "@esbuild/linux-loong64": "0.24.2", + "@esbuild/linux-mips64el": "0.24.2", + "@esbuild/linux-ppc64": "0.24.2", + "@esbuild/linux-riscv64": "0.24.2", + "@esbuild/linux-s390x": "0.24.2", + "@esbuild/linux-x64": "0.24.2", + "@esbuild/netbsd-arm64": "0.24.2", + "@esbuild/netbsd-x64": "0.24.2", + "@esbuild/openbsd-arm64": "0.24.2", + "@esbuild/openbsd-x64": "0.24.2", + "@esbuild/sunos-x64": "0.24.2", + "@esbuild/win32-arm64": "0.24.2", + "@esbuild/win32-ia32": "0.24.2", + "@esbuild/win32-x64": "0.24.2" + } + }, + "node_modules/escalade": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.18.0.tgz", + "integrity": "sha512-+waTfRWQlSbpt3KWE+CjrPPYnbq9kfZIYUqapc0uBXyjTp8aYXZDsUH16m39Ryq3NjAVP4tjuF7KaukeqoCoaA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.12.1", + "@eslint/config-array": "^0.19.0", + "@eslint/core": "^0.10.0", + "@eslint/eslintrc": "^3.2.0", + "@eslint/js": "9.18.0", + "@eslint/plugin-kit": "^0.2.5", + "@humanfs/node": "^0.16.6", + "@humanwhocodes/module-importer": "^1.0.1", + "@humanwhocodes/retry": "^0.4.1", + "@types/estree": "^1.0.6", + "@types/json-schema": "^7.0.15", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.6", + "debug": "^4.3.2", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^8.2.0", + "eslint-visitor-keys": "^4.2.0", + "espree": "^10.3.0", + "esquery": "^1.5.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^8.0.0", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://eslint.org/donate" + }, + "peerDependencies": { + "jiti": "*" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + } + } + }, + "node_modules/eslint-config-prettier": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-10.0.1.tgz", + "integrity": "sha512-lZBts941cyJyeaooiKxAtzoPHTN+GbQTJFAIdQbRhA4/8whaAraEh47Whw/ZFfrjNSnlAxqfm9i0XVAEkULjCw==", + "dev": true, + "bin": { + "eslint-config-prettier": "build/bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-prettier": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.3.tgz", + "integrity": "sha512-qJ+y0FfCp/mQYQ/vWQ3s7eUlFEL4PyKfAJxsnYTJ4YT73nsJBWqmEpFryxV9OeUiqmsTsYJ5Y+KDNaeP31wrRw==", + "dev": true, + "dependencies": { + "prettier-linter-helpers": "^1.0.0", + "synckit": "^0.9.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint-plugin-prettier" + }, + "peerDependencies": { + "@types/eslint": ">=8.0.0", + "eslint": ">=8.0.0", + "eslint-config-prettier": "*", + "prettier": ">=3.0.0" + }, + "peerDependenciesMeta": { + "@types/eslint": { + "optional": true + }, + "eslint-config-prettier": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.32.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.32.0.tgz", + "integrity": "sha512-b/Y05HYmnB/32wqVcjxjHZzNpwxj1onBOvqW89W+V+XNG1dRuaFbNd3vT9CLbr2LXjEoq+3vn8DanWf7XU22Ug==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "globals": "^13.24.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.15", + "semver": "^7.6.3", + "vue-eslint-parser": "^9.4.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0" + } + }, + "node_modules/eslint-plugin-vue/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-vue/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-scope": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", + "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", + "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", + "dev": true, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", + "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", + "dev": true, + "dependencies": { + "acorn": "^8.14.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^4.2.0" + }, + "engines": { + "node": "^18.18.0 || ^20.9.0 || >=21.1.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", + "dev": true, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/execa/-/execa-9.5.2.tgz", + "integrity": "sha512-EHlpxMCpHWSAh1dgS6bVeoLAXGnJNdR93aabr4QCGbzOM73o5XmRfM/e5FUqsw3aagP8S8XEWUWFAxnRBnAF0Q==", + "dev": true, + "dependencies": { + "@sindresorhus/merge-streams": "^4.0.0", + "cross-spawn": "^7.0.3", + "figures": "^6.1.0", + "get-stream": "^9.0.0", + "human-signals": "^8.0.0", + "is-plain-obj": "^4.1.0", + "is-stream": "^4.0.1", + "npm-run-path": "^6.0.0", + "pretty-ms": "^9.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^4.0.0", + "yoctocolors": "^2.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.5.0" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "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-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/figures": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", + "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", + "dev": true, + "dependencies": { + "is-unicode-supported": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/file-entry-cache": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", + "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", + "dev": true, + "dependencies": { + "flat-cache": "^4.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "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==", + "dev": true, + "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": "4.0.1", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", + "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/flatted": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz", + "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fs-extra": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.3.0.tgz", + "integrity": "sha512-Z4XaCL6dUDHfP/jT25jJKMmtxvuwbkrD1vNSMFlo9lNLY2c5FHYSQgHPRZUjAB26TpDEoW9HCOgplrdbaPV/ew==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-stream": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", + "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", + "dev": true, + "dependencies": { + "@sec-ant/readable-stream": "^0.4.1", + "is-stream": "^4.0.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/hookable": { + "version": "5.5.3", + "resolved": "https://registry.npmjs.org/hookable/-/hookable-5.5.3.tgz", + "integrity": "sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==", + "dev": true + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/human-signals": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.0.tgz", + "integrity": "sha512-/1/GPCpDUCCYwlERiYjxoczfP0zfvZMU/OWgQPMya9AbAE24vseigFdhAMObpc8Q4lc/kjutPfUddDYyAmejnA==", + "dev": true, + "engines": { + "node": ">=18.18.0" + } + }, + "node_modules/ignore": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "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==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "dev": true, + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", + "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-stream": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", + "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", + "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "dev": true, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "dev": true, + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-4.0.0.tgz", + "integrity": "sha512-lR4MXjGNgkJc7tkQ97kb2nuEMnNCyU//XYVH0MKTGcXEiSudQ5MKGKen3C5QubYy0vmq+JGitUg92uuywGEwIA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kolorist": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/kolorist/-/kolorist-1.8.0.tgz", + "integrity": "sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.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==", + "dev": true, + "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==", + "dev": true + }, + "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==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/magic-string": { + "version": "0.30.17", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", + "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.0" + } + }, + "node_modules/memorystream": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", + "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", + "dev": true, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "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==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", + "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==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true + }, + "node_modules/npm-normalize-package-bin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-4.0.0.tgz", + "integrity": "sha512-TZKxPvItzai9kN9H/TkmCtx/ZN/hvr3vUycjlfmH0ootY9yFBzNOpiXAdIn1Iteqsvk4lQn6B5PTrt+n6h8k/w==", + "dev": true, + "license": "ISC", + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-all2": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/npm-run-all2/-/npm-run-all2-7.0.2.tgz", + "integrity": "sha512-7tXR+r9hzRNOPNTvXegM+QzCuMjzUIIq66VDunL6j60O4RrExx32XUhlrS7UK4VcdGw5/Wxzb3kfNcFix9JKDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.2.1", + "cross-spawn": "^7.0.6", + "memorystream": "^0.3.1", + "minimatch": "^9.0.0", + "pidtree": "^0.6.0", + "read-package-json-fast": "^4.0.0", + "shell-quote": "^1.7.3", + "which": "^5.0.0" + }, + "bin": { + "npm-run-all": "bin/npm-run-all/index.js", + "npm-run-all2": "bin/npm-run-all/index.js", + "run-p": "bin/run-p/index.js", + "run-s": "bin/run-s/index.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0", + "npm": ">= 9" + } + }, + "node_modules/npm-run-all2/node_modules/ansi-styles": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.3.tgz", + "integrity": "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/npm-run-all2/node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-run-all2/node_modules/isexe": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-3.1.5.tgz", + "integrity": "sha512-6B3tLtFqtQS4ekarvLVMZ+X+VlvQekbe4taUkf/rhVO3d/h0M2rfARm/pXLcPEsjjMsFgrFgSrhQIxcSVrBz8w==", + "dev": true, + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=18" + } + }, + "node_modules/npm-run-all2/node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-run-all2/node_modules/which": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/which/-/which-5.0.0.tgz", + "integrity": "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^3.1.1" + }, + "bin": { + "node-which": "bin/which.js" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "node_modules/npm-run-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", + "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0", + "unicorn-magic": "^0.3.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/open": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", + "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", + "dev": true, + "dependencies": { + "default-browser": "^5.2.1", + "define-lazy-prop": "^3.0.0", + "is-inside-container": "^1.0.0", + "is-wsl": "^3.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "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==", + "dev": true, + "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==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-ms": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", + "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "dev": true + }, + "node_modules/perfect-debounce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/perfect-debounce/-/perfect-debounce-1.0.0.tgz", + "integrity": "sha512-xCy9V055GLEqoFaHoC1SoLIaLmWctgCUaBaWxDZ7/Zx4CTyX7cJQLJOok/orfjZAh9kEYpjJa4d0KcJmCbctZA==", + "dev": true + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==" + }, + "node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pidtree": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.6.0.tgz", + "integrity": "sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==", + "dev": true, + "license": "MIT", + "bin": { + "pidtree": "bin/pidtree.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/postcss": { + "version": "8.5.1", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.1.tgz", + "integrity": "sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==", + "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.8", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.2.tgz", + "integrity": "sha512-e9MewbtFo+Fevyuxn/4rrcDAaq0IYxPGLvObpQjiZBMAzB9IGmzlnG9RZy3FFas+eBMu2vA0CszMeduow5dIuQ==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "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-ms": { + "version": "9.2.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.2.0.tgz", + "integrity": "sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==", + "dev": true, + "dependencies": { + "parse-ms": "^4.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/read-package-json-fast": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-4.0.0.tgz", + "integrity": "sha512-qpt8EwugBWDw2cgE2W+/3oxC+KTez2uSVR8JU9Q36TXPAGCaozfQUs59v4j4GFpWTaw0i6hAZSvOmu1J0uOEUg==", + "dev": true, + "license": "ISC", + "dependencies": { + "json-parse-even-better-errors": "^4.0.0", + "npm-normalize-package-bin": "^4.0.0" + }, + "engines": { + "node": "^18.17.0 || >=20.5.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/rfdc": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", + "dev": true + }, + "node_modules/rollup": { + "version": "4.31.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.31.0.tgz", + "integrity": "sha512-9cCE8P4rZLx9+PjoyqHLs31V9a9Vpvfo4qNcs6JCiGWYhw2gijSetFbH6SSy1whnkgcefnUwr8sad7tgqsGvnw==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.6" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.31.0", + "@rollup/rollup-android-arm64": "4.31.0", + "@rollup/rollup-darwin-arm64": "4.31.0", + "@rollup/rollup-darwin-x64": "4.31.0", + "@rollup/rollup-freebsd-arm64": "4.31.0", + "@rollup/rollup-freebsd-x64": "4.31.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.31.0", + "@rollup/rollup-linux-arm-musleabihf": "4.31.0", + "@rollup/rollup-linux-arm64-gnu": "4.31.0", + "@rollup/rollup-linux-arm64-musl": "4.31.0", + "@rollup/rollup-linux-loongarch64-gnu": "4.31.0", + "@rollup/rollup-linux-powerpc64le-gnu": "4.31.0", + "@rollup/rollup-linux-riscv64-gnu": "4.31.0", + "@rollup/rollup-linux-s390x-gnu": "4.31.0", + "@rollup/rollup-linux-x64-gnu": "4.31.0", + "@rollup/rollup-linux-x64-musl": "4.31.0", + "@rollup/rollup-win32-arm64-msvc": "4.31.0", + "@rollup/rollup-win32-ia32-msvc": "4.31.0", + "@rollup/rollup-win32-x64-msvc": "4.31.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-applescript": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", + "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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==", + "dev": true, + "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==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", + "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-3.0.0.tgz", + "integrity": "sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/speakingurl": { + "version": "14.0.1", + "resolved": "https://registry.npmjs.org/speakingurl/-/speakingurl-14.0.1.tgz", + "integrity": "sha512-1POYv7uv2gXoyGFpBCmpDVSNV74IfsWlDW216UPjbWufNf+bSU6GdbDsxdcxtfwb4xlI3yxzOTKClUosxARYrQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", + "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/superjson": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-2.2.2.tgz", + "integrity": "sha512-5JRxVqC8I8NuOUjzBbvVJAKNM8qoVuH0O77h4WInc/qC2q5IreqKxYwgkga3PfA22OayK2ikceb/B26dztPl+Q==", + "dev": true, + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=16" + } + }, + "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==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==", + "dev": true + }, + "node_modules/synckit": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz", + "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==", + "dev": true, + "dependencies": { + "@pkgr/core": "^0.1.0", + "tslib": "^2.6.2" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/unts" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tslib": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", + "dev": true + }, + "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==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "6.21.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.21.0.tgz", + "integrity": "sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unicorn-magic": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", + "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.2.0", + "picocolors": "^1.1.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/vite": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.0.10.tgz", + "integrity": "sha512-MEszunEcMo6pFsfXN1GhCFQqnE25tWRH0MA4f0Q7uanACi4y1Us+ZGpTMnITwCTnYzB2b9cpmnelTlxgTBmaBA==", + "dev": true, + "dependencies": { + "esbuild": "^0.24.2", + "postcss": "^8.4.49", + "rollup": "^4.23.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vite-hot-client": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/vite-hot-client/-/vite-hot-client-0.2.4.tgz", + "integrity": "sha512-a1nzURqO7DDmnXqabFOliz908FRmIppkBKsJthS8rbe8hBEXwEwe4C3Pp33Z1JoFCYfVL4kTOMLKk0ZZxREIeA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.6.0 || ^3.0.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-inspect": { + "version": "0.8.9", + "resolved": "https://registry.npmjs.org/vite-plugin-inspect/-/vite-plugin-inspect-0.8.9.tgz", + "integrity": "sha512-22/8qn+LYonzibb1VeFZmISdVao5kC22jmEKm24vfFE8siEn47EpVcCLYMv6iKOYMJfjSvSJfueOwcFCkUnV3A==", + "dev": true, + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "debug": "^4.3.7", + "error-stack-parser-es": "^0.1.5", + "fs-extra": "^11.2.0", + "open": "^10.1.0", + "perfect-debounce": "^1.0.0", + "picocolors": "^1.1.1", + "sirv": "^3.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0 || ^5.0.0-0 || ^6.0.1" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-devtools": { + "version": "7.7.0", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-devtools/-/vite-plugin-vue-devtools-7.7.0.tgz", + "integrity": "sha512-1dWiREwIl4JELwXGHXih80hIgjcViMcZGr3j0edo6NQ9kNzAOxMIUgFqc/TO1ary4ZroJUxoB0YDI6jnDf13iQ==", + "dev": true, + "dependencies": { + "@vue/devtools-core": "^7.7.0", + "@vue/devtools-kit": "^7.7.0", + "@vue/devtools-shared": "^7.7.0", + "execa": "^9.5.1", + "sirv": "^3.0.0", + "vite-plugin-inspect": "0.8.9", + "vite-plugin-vue-inspector": "^5.3.1" + }, + "engines": { + "node": ">=v14.21.3" + }, + "peerDependencies": { + "vite": "^3.1.0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vite-plugin-vue-inspector": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/vite-plugin-vue-inspector/-/vite-plugin-vue-inspector-5.3.1.tgz", + "integrity": "sha512-cBk172kZKTdvGpJuzCCLg8lJ909wopwsu3Ve9FsL1XsnLBiRT9U3MePcqrgGHgCX2ZgkqZmAGR8taxw+TV6s7A==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.0", + "@babel/plugin-proposal-decorators": "^7.23.0", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-transform-typescript": "^7.22.15", + "@vue/babel-plugin-jsx": "^1.1.5", + "@vue/compiler-dom": "^3.3.4", + "kolorist": "^1.8.0", + "magic-string": "^0.30.4" + }, + "peerDependencies": { + "vite": "^3.0.0-0 || ^4.0.0-0 || ^5.0.0-0 || ^6.0.0-0" + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.13", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.13.tgz", + "integrity": "sha512-wmeiSMxkZCSc+PM2w2VRsOYAZC8GdipNFRTsLSfodVqI9mbejKeXEGr8SckuLnrQPGe3oJN5c3K0vpoU9q/wCQ==", + "dependencies": { + "@vue/compiler-dom": "3.5.13", + "@vue/compiler-sfc": "3.5.13", + "@vue/runtime-dom": "3.5.13", + "@vue/server-renderer": "3.5.13", + "@vue/shared": "3.5.13" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.4.3", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz", + "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "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/vue-eslint-parser/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/vue-eslint-parser/node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "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/vue-eslint-parser/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/vue-router": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.5.0.tgz", + "integrity": "sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + }, + "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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/yoctocolors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.1.tgz", + "integrity": "sha512-GQHQqAopRhwU8Kt1DDM8NjibDXHC8eoh1erhGAJPEyveY9qqVeXvVikNKrDz69sHowPMorbPUrH/mx8c50eiBQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/src/main/front_end/vue_board_exam/package.json b/src/main/front_end/vue_board_exam/package.json new file mode 100644 index 0000000..3af7e72 --- /dev/null +++ b/src/main/front_end/vue_board_exam/package.json @@ -0,0 +1,37 @@ +{ + "name": "vue_board", + "version": "0.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "run-p type-check \"build-only {@}\" --", + "preview": "vite preview", + "build-only": "vite build", + "type-check": "vue-tsc --build", + "lint": "eslint . --fix", + "format": "prettier --write src/" + }, + "dependencies": { + "axios": "^1.7.9", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@eslint/js": "^9.14.0", + "@tsconfig/node22": "^22.0.5", + "@types/node": "^22.13.9", + "@vitejs/plugin-vue": "^5.2.1", + "@vitejs/plugin-vue-jsx": "^4.1.1", + "@vue/eslint-config-prettier": "^10.1.0", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.14.0", + "eslint-plugin-vue": "^9.30.0", + "npm-run-all2": "^7.0.2", + "prettier": "^3.3.3", + "typescript": "~5.7.3", + "vite": "^6.0.5", + "vite-plugin-vue-devtools": "^7.6.8", + "vue-tsc": "^2.2.4" + } +} diff --git a/src/main/front_end/vue_board_exam/public/favicon.ico b/src/main/front_end/vue_board_exam/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df36fcfb72584e00488330b560ebcf34a41c64c2 GIT binary patch literal 4286 zcmds*O-Phc6o&64GDVCEQHxsW(p4>LW*W<827=Unuo8sGpRux(DN@jWP-e29Wl%wj zY84_aq9}^Am9-cWTD5GGEo#+5Fi2wX_P*bo+xO!)p*7B;iKlbFd(U~_d(U?#hLj56 zPhFkj-|A6~Qk#@g^#D^U0XT1cu=c-vu1+SElX9NR;kzAUV(q0|dl0|%h|dI$%VICy zJnu2^L*Te9JrJMGh%-P79CL0}dq92RGU6gI{v2~|)p}sG5x0U*z<8U;Ij*hB9z?ei z@g6Xq-pDoPl=MANPiR7%172VA%r)kevtV-_5H*QJKFmd;8yA$98zCxBZYXTNZ#QFk2(TX0;Y2dt&WitL#$96|gJY=3xX zpCoi|YNzgO3R`f@IiEeSmKrPSf#h#Qd<$%Ej^RIeeYfsxhPMOG`S`Pz8q``=511zm zAm)MX5AV^5xIWPyEu7u>qYs?pn$I4nL9J!=K=SGlKLXpE<5x+2cDTXq?brj?n6sp= zphe9;_JHf40^9~}9i08r{XM$7HB!`{Ys~TK0kx<}ZQng`UPvH*11|q7&l9?@FQz;8 zx!=3<4seY*%=OlbCbcae?5^V_}*K>Uo6ZWV8mTyE^B=DKy7-sdLYkR5Z?paTgK-zyIkKjIcpyO z{+uIt&YSa_$QnN_@t~L014dyK(fOOo+W*MIxbA6Ndgr=Y!f#Tokqv}n<7-9qfHkc3 z=>a|HWqcX8fzQCT=dqVbogRq!-S>H%yA{1w#2Pn;=e>JiEj7Hl;zdt-2f+j2%DeVD zsW0Ab)ZK@0cIW%W7z}H{&~yGhn~D;aiP4=;m-HCo`BEI+Kd6 z={Xwx{TKxD#iCLfl2vQGDitKtN>z|-AdCN|$jTFDg0m3O`WLD4_s#$S literal 0 HcmV?d00001 diff --git a/src/main/front_end/vue_board_exam/public/w3.css b/src/main/front_end/vue_board_exam/public/w3.css new file mode 100644 index 0000000..fd89e8d --- /dev/null +++ b/src/main/front_end/vue_board_exam/public/w3.css @@ -0,0 +1,235 @@ +/* W3.CSS 4.15 December 2020 by Jan Egil and Borge Refsnes */ +html{box-sizing:border-box}*,*:before,*:after{box-sizing:inherit} +/* Extract from normalize.css by Nicolas Gallagher and Jonathan Neal git.io/normalize */ +html{-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0} +article,aside,details,figcaption,figure,footer,header,main,menu,nav,section{display:block}summary{display:list-item} +audio,canvas,progress,video{display:inline-block}progress{vertical-align:baseline} +audio:not([controls]){display:none;height:0}[hidden],template{display:none} +a{background-color:transparent}a:active,a:hover{outline-width:0} +abbr[title]{border-bottom:none;text-decoration:underline;text-decoration:underline dotted} +b,strong{font-weight:bolder}dfn{font-style:italic}mark{background:#ff0;color:#000} +small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline} +sub{bottom:-0.25em}sup{top:-0.5em}figure{margin:1em 40px}img{border-style:none} +code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}hr{box-sizing:content-box;height:0;overflow:visible} +button,input,select,textarea,optgroup{font:inherit;margin:0}optgroup{font-weight:bold} +button,input{overflow:visible}button,select{text-transform:none} +button,[type=button],[type=reset],[type=submit]{-webkit-appearance:button} +button::-moz-focus-inner,[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner{border-style:none;padding:0} +button:-moz-focusring,[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring{outline:1px dotted ButtonText} +fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em} +legend{color:inherit;display:table;max-width:100%;padding:0;white-space:normal}textarea{overflow:auto} +[type=checkbox],[type=radio]{padding:0} +[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto} +[type=search]{-webkit-appearance:textfield;outline-offset:-2px} +[type=search]::-webkit-search-decoration{-webkit-appearance:none} +::-webkit-file-upload-button{-webkit-appearance:button;font:inherit} +/* End extract */ +html,body{font-family:Verdana,sans-serif;font-size:15px;line-height:1.5}html{overflow-x:hidden} +h1{font-size:36px}h2{font-size:30px}h3{font-size:24px}h4{font-size:20px}h5{font-size:18px}h6{font-size:16px} +.w3-serif{font-family:serif}.w3-sans-serif{font-family:sans-serif}.w3-cursive{font-family:cursive}.w3-monospace{font-family:monospace} +h1,h2,h3,h4,h5,h6{font-family:"Segoe UI",Arial,sans-serif;font-weight:400;margin:10px 0}.w3-wide{letter-spacing:4px} +hr{border:0;border-top:1px solid #eee;margin:20px 0} +.w3-image{max-width:100%;height:auto}img{vertical-align:middle}a{color:inherit} +.w3-table,.w3-table-all{border-collapse:collapse;border-spacing:0;width:100%;display:table}.w3-table-all{border:1px solid #ccc} +.w3-bordered tr,.w3-table-all tr{border-bottom:1px solid #ddd}.w3-striped tbody tr:nth-child(even){background-color:#f1f1f1} +.w3-table-all tr:nth-child(odd){background-color:#fff}.w3-table-all tr:nth-child(even){background-color:#f1f1f1} +.w3-hoverable tbody tr:hover,.w3-ul.w3-hoverable li:hover{background-color:#ccc}.w3-centered tr th,.w3-centered tr td{text-align:center} +.w3-table td,.w3-table th,.w3-table-all td,.w3-table-all th{padding:8px 8px;display:table-cell;text-align:left;vertical-align:top} +.w3-table th:first-child,.w3-table td:first-child,.w3-table-all th:first-child,.w3-table-all td:first-child{padding-left:16px} +.w3-btn,.w3-button{border:none;display:inline-block;padding:8px 16px;vertical-align:middle;overflow:hidden;text-decoration:none;color:inherit;background-color:inherit;text-align:center;cursor:pointer;white-space:nowrap} +.w3-btn:hover{box-shadow:0 8px 16px 0 rgba(0,0,0,0.2),0 6px 20px 0 rgba(0,0,0,0.19)} +.w3-btn,.w3-button{-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none} +.w3-disabled,.w3-btn:disabled,.w3-button:disabled{cursor:not-allowed;opacity:0.3}.w3-disabled *,:disabled *{pointer-events:none} +.w3-btn.w3-disabled:hover,.w3-btn:disabled:hover{box-shadow:none} +.w3-badge,.w3-tag{background-color:#000;color:#fff;display:inline-block;padding-left:8px;padding-right:8px;text-align:center}.w3-badge{border-radius:50%} +.w3-ul{list-style-type:none;padding:0;margin:0}.w3-ul li{padding:8px 16px;border-bottom:1px solid #ddd}.w3-ul li:last-child{border-bottom:none} +.w3-tooltip,.w3-display-container{position:relative}.w3-tooltip .w3-text{display:none}.w3-tooltip:hover .w3-text{display:inline-block} +.w3-ripple:active{opacity:0.5}.w3-ripple{transition:opacity 0s} +.w3-input{padding:8px;display:block;border:none;border-bottom:1px solid #ccc;width:100%} +.w3-select{padding:9px 0;width:100%;border:none;border-bottom:1px solid #ccc} +.w3-dropdown-click,.w3-dropdown-hover{position:relative;display:inline-block;cursor:pointer} +.w3-dropdown-hover:hover .w3-dropdown-content{display:block} +.w3-dropdown-hover:first-child,.w3-dropdown-click:hover{background-color:#ccc;color:#000} +.w3-dropdown-hover:hover > .w3-button:first-child,.w3-dropdown-click:hover > .w3-button:first-child{background-color:#ccc;color:#000} +.w3-dropdown-content{cursor:auto;color:#000;background-color:#fff;display:none;position:absolute;min-width:160px;margin:0;padding:0;z-index:1} +.w3-check,.w3-radio{width:24px;height:24px;position:relative;top:6px} +.w3-sidebar{height:100%;width:200px;background-color:#fff;position:fixed!important;z-index:1;overflow:auto} +.w3-bar-block .w3-dropdown-hover,.w3-bar-block .w3-dropdown-click{width:100%} +.w3-bar-block .w3-dropdown-hover .w3-dropdown-content,.w3-bar-block .w3-dropdown-click .w3-dropdown-content{min-width:100%} +.w3-bar-block .w3-dropdown-hover .w3-button,.w3-bar-block .w3-dropdown-click .w3-button{width:100%;text-align:left;padding:8px 16px} +.w3-main,#main{transition:margin-left .4s} +.w3-modal{z-index:3;display:none;padding-top:100px;position:fixed;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:rgb(0,0,0);background-color:rgba(0,0,0,0.4)} +.w3-modal-content{margin:auto;background-color:#fff;position:relative;padding:0;outline:0;width:600px} +.w3-bar{width:100%;overflow:hidden}.w3-center .w3-bar{display:inline-block;width:auto} +.w3-bar .w3-bar-item{padding:8px 16px;float:left;width:auto;border:none;display:block;outline:0} +.w3-bar .w3-dropdown-hover,.w3-bar .w3-dropdown-click{position:static;float:left} +.w3-bar .w3-button{white-space:normal} +.w3-bar-block .w3-bar-item{width:100%;display:block;padding:8px 16px;text-align:left;border:none;white-space:normal;float:none;outline:0} +.w3-bar-block.w3-center .w3-bar-item{text-align:center}.w3-block{display:block;width:100%} +.w3-responsive{display:block;overflow-x:auto} +.w3-container:after,.w3-container:before,.w3-panel:after,.w3-panel:before,.w3-row:after,.w3-row:before,.w3-row-padding:after,.w3-row-padding:before, +.w3-cell-row:before,.w3-cell-row:after,.w3-clear:after,.w3-clear:before,.w3-bar:before,.w3-bar:after{content:"";display:table;clear:both} +.w3-col,.w3-half,.w3-third,.w3-twothird,.w3-threequarter,.w3-quarter{float:left;width:100%} +.w3-col.s1{width:8.33333%}.w3-col.s2{width:16.66666%}.w3-col.s3{width:24.99999%}.w3-col.s4{width:33.33333%} +.w3-col.s5{width:41.66666%}.w3-col.s6{width:49.99999%}.w3-col.s7{width:58.33333%}.w3-col.s8{width:66.66666%} +.w3-col.s9{width:74.99999%}.w3-col.s10{width:83.33333%}.w3-col.s11{width:91.66666%}.w3-col.s12{width:99.99999%} +@media (min-width:601px){.w3-col.m1{width:8.33333%}.w3-col.m2{width:16.66666%}.w3-col.m3,.w3-quarter{width:24.99999%}.w3-col.m4,.w3-third{width:33.33333%} +.w3-col.m5{width:41.66666%}.w3-col.m6,.w3-half{width:49.99999%}.w3-col.m7{width:58.33333%}.w3-col.m8,.w3-twothird{width:66.66666%} +.w3-col.m9,.w3-threequarter{width:74.99999%}.w3-col.m10{width:83.33333%}.w3-col.m11{width:91.66666%}.w3-col.m12{width:99.99999%}} +@media (min-width:993px){.w3-col.l1{width:8.33333%}.w3-col.l2{width:16.66666%}.w3-col.l3{width:24.99999%}.w3-col.l4{width:33.33333%} +.w3-col.l5{width:41.66666%}.w3-col.l6{width:49.99999%}.w3-col.l7{width:58.33333%}.w3-col.l8{width:66.66666%} +.w3-col.l9{width:74.99999%}.w3-col.l10{width:83.33333%}.w3-col.l11{width:91.66666%}.w3-col.l12{width:99.99999%}} +.w3-rest{overflow:hidden}.w3-stretch{margin-left:-16px;margin-right:-16px} +.w3-content,.w3-auto{margin-left:auto;margin-right:auto}.w3-content{max-width:980px}.w3-auto{max-width:1140px} +.w3-cell-row{display:table;width:100%}.w3-cell{display:table-cell} +.w3-cell-top{vertical-align:top}.w3-cell-middle{vertical-align:middle}.w3-cell-bottom{vertical-align:bottom} +.w3-hide{display:none!important}.w3-show-block,.w3-show{display:block!important}.w3-show-inline-block{display:inline-block!important} +@media (max-width:1205px){.w3-auto{max-width:95%}} +@media (max-width:600px){.w3-modal-content{margin:0 10px;width:auto!important}.w3-modal{padding-top:30px} +.w3-dropdown-hover.w3-mobile .w3-dropdown-content,.w3-dropdown-click.w3-mobile .w3-dropdown-content{position:relative} +.w3-hide-small{display:none!important}.w3-mobile{display:block;width:100%!important}.w3-bar-item.w3-mobile,.w3-dropdown-hover.w3-mobile,.w3-dropdown-click.w3-mobile{text-align:center} +.w3-dropdown-hover.w3-mobile,.w3-dropdown-hover.w3-mobile .w3-btn,.w3-dropdown-hover.w3-mobile .w3-button,.w3-dropdown-click.w3-mobile,.w3-dropdown-click.w3-mobile .w3-btn,.w3-dropdown-click.w3-mobile .w3-button{width:100%}} +@media (max-width:768px){.w3-modal-content{width:500px}.w3-modal{padding-top:50px}} +@media (min-width:993px){.w3-modal-content{width:900px}.w3-hide-large{display:none!important}.w3-sidebar.w3-collapse{display:block!important}} +@media (max-width:992px) and (min-width:601px){.w3-hide-medium{display:none!important}} +@media (max-width:992px){.w3-sidebar.w3-collapse{display:none}.w3-main{margin-left:0!important;margin-right:0!important}.w3-auto{max-width:100%}} +.w3-top,.w3-bottom{position:fixed;width:100%;z-index:1}.w3-top{top:0}.w3-bottom{bottom:0} +.w3-overlay{position:fixed;display:none;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,0.5);z-index:2} +.w3-display-topleft{position:absolute;left:0;top:0}.w3-display-topright{position:absolute;right:0;top:0} +.w3-display-bottomleft{position:absolute;left:0;bottom:0}.w3-display-bottomright{position:absolute;right:0;bottom:0} +.w3-display-middle{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)} +.w3-display-left{position:absolute;top:50%;left:0%;transform:translate(0%,-50%);-ms-transform:translate(-0%,-50%)} +.w3-display-right{position:absolute;top:50%;right:0%;transform:translate(0%,-50%);-ms-transform:translate(0%,-50%)} +.w3-display-topmiddle{position:absolute;left:50%;top:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-bottommiddle{position:absolute;left:50%;bottom:0;transform:translate(-50%,0%);-ms-transform:translate(-50%,0%)} +.w3-display-container:hover .w3-display-hover{display:block}.w3-display-container:hover span.w3-display-hover{display:inline-block}.w3-display-hover{display:none} +.w3-display-position{position:absolute} +.w3-circle{border-radius:50%} +.w3-round-small{border-radius:2px}.w3-round,.w3-round-medium{border-radius:4px}.w3-round-large{border-radius:8px}.w3-round-xlarge{border-radius:16px}.w3-round-xxlarge{border-radius:32px} +.w3-row-padding,.w3-row-padding>.w3-half,.w3-row-padding>.w3-third,.w3-row-padding>.w3-twothird,.w3-row-padding>.w3-threequarter,.w3-row-padding>.w3-quarter,.w3-row-padding>.w3-col{padding:0 8px} +.w3-container,.w3-panel{padding:0.01em 16px}.w3-panel{margin-top:16px;margin-bottom:16px} +.w3-code,.w3-codespan{font-family:Consolas,"courier new";font-size:16px} +.w3-code{width:auto;background-color:#fff;padding:8px 12px;border-left:4px solid #4CAF50;word-wrap:break-word} +.w3-codespan{color:crimson;background-color:#f1f1f1;padding-left:4px;padding-right:4px;font-size:110%} +.w3-card,.w3-card-2{box-shadow:0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12)} +.w3-card-4,.w3-hover-shadow:hover{box-shadow:0 4px 10px 0 rgba(0,0,0,0.2),0 4px 20px 0 rgba(0,0,0,0.19)} +.w3-spin{animation:w3-spin 2s infinite linear}@keyframes w3-spin{0%{transform:rotate(0deg)}100%{transform:rotate(359deg)}} +.w3-animate-fading{animation:fading 10s infinite}@keyframes fading{0%{opacity:0}50%{opacity:1}100%{opacity:0}} +.w3-animate-opacity{animation:opac 0.8s}@keyframes opac{from{opacity:0} to{opacity:1}} +.w3-animate-top{position:relative;animation:animatetop 0.4s}@keyframes animatetop{from{top:-300px;opacity:0} to{top:0;opacity:1}} +.w3-animate-left{position:relative;animation:animateleft 0.4s}@keyframes animateleft{from{left:-300px;opacity:0} to{left:0;opacity:1}} +.w3-animate-right{position:relative;animation:animateright 0.4s}@keyframes animateright{from{right:-300px;opacity:0} to{right:0;opacity:1}} +.w3-animate-bottom{position:relative;animation:animatebottom 0.4s}@keyframes animatebottom{from{bottom:-300px;opacity:0} to{bottom:0;opacity:1}} +.w3-animate-zoom {animation:animatezoom 0.6s}@keyframes animatezoom{from{transform:scale(0)} to{transform:scale(1)}} +.w3-animate-input{transition:width 0.4s ease-in-out}.w3-animate-input:focus{width:100%!important} +.w3-opacity,.w3-hover-opacity:hover{opacity:0.60}.w3-opacity-off,.w3-hover-opacity-off:hover{opacity:1} +.w3-opacity-max{opacity:0.25}.w3-opacity-min{opacity:0.75} +.w3-greyscale-max,.w3-grayscale-max,.w3-hover-greyscale:hover,.w3-hover-grayscale:hover{filter:grayscale(100%)} +.w3-greyscale,.w3-grayscale{filter:grayscale(75%)}.w3-greyscale-min,.w3-grayscale-min{filter:grayscale(50%)} +.w3-sepia{filter:sepia(75%)}.w3-sepia-max,.w3-hover-sepia:hover{filter:sepia(100%)}.w3-sepia-min{filter:sepia(50%)} +.w3-tiny{font-size:10px!important}.w3-small{font-size:12px!important}.w3-medium{font-size:15px!important}.w3-large{font-size:18px!important} +.w3-xlarge{font-size:24px!important}.w3-xxlarge{font-size:36px!important}.w3-xxxlarge{font-size:48px!important}.w3-jumbo{font-size:64px!important} +.w3-left-align{text-align:left!important}.w3-right-align{text-align:right!important}.w3-justify{text-align:justify!important}.w3-center{text-align:center!important} +.w3-border-0{border:0!important}.w3-border{border:1px solid #ccc!important} +.w3-border-top{border-top:1px solid #ccc!important}.w3-border-bottom{border-bottom:1px solid #ccc!important} +.w3-border-left{border-left:1px solid #ccc!important}.w3-border-right{border-right:1px solid #ccc!important} +.w3-topbar{border-top:6px solid #ccc!important}.w3-bottombar{border-bottom:6px solid #ccc!important} +.w3-leftbar{border-left:6px solid #ccc!important}.w3-rightbar{border-right:6px solid #ccc!important} +.w3-section,.w3-code{margin-top:16px!important;margin-bottom:16px!important} +.w3-margin{margin:16px!important}.w3-margin-top{margin-top:16px!important}.w3-margin-bottom{margin-bottom:16px!important} +.w3-margin-left{margin-left:16px!important}.w3-margin-right{margin-right:16px!important} +.w3-padding-small{padding:4px 8px!important}.w3-padding{padding:8px 16px!important}.w3-padding-large{padding:12px 24px!important} +.w3-padding-16{padding-top:16px!important;padding-bottom:16px!important}.w3-padding-24{padding-top:24px!important;padding-bottom:24px!important} +.w3-padding-32{padding-top:32px!important;padding-bottom:32px!important}.w3-padding-48{padding-top:48px!important;padding-bottom:48px!important} +.w3-padding-64{padding-top:64px!important;padding-bottom:64px!important} +.w3-padding-top-64{padding-top:64px!important}.w3-padding-top-48{padding-top:48px!important} +.w3-padding-top-32{padding-top:32px!important}.w3-padding-top-24{padding-top:24px!important} +.w3-left{float:left!important}.w3-right{float:right!important} +.w3-button:hover{color:#000!important;background-color:#ccc!important} +.w3-transparent,.w3-hover-none:hover{background-color:transparent!important} +.w3-hover-none:hover{box-shadow:none!important} +/* Colors */ +.w3-amber,.w3-hover-amber:hover{color:#000!important;background-color:#ffc107!important} +.w3-aqua,.w3-hover-aqua:hover{color:#000!important;background-color:#00ffff!important} +.w3-blue,.w3-hover-blue:hover{color:#fff!important;background-color:#2196F3!important} +.w3-light-blue,.w3-hover-light-blue:hover{color:#000!important;background-color:#87CEEB!important} +.w3-brown,.w3-hover-brown:hover{color:#fff!important;background-color:#795548!important} +.w3-cyan,.w3-hover-cyan:hover{color:#000!important;background-color:#00bcd4!important} +.w3-blue-grey,.w3-hover-blue-grey:hover,.w3-blue-gray,.w3-hover-blue-gray:hover{color:#fff!important;background-color:#607d8b!important} +.w3-green,.w3-hover-green:hover{color:#fff!important;background-color:#4CAF50!important} +.w3-light-green,.w3-hover-light-green:hover{color:#000!important;background-color:#8bc34a!important} +.w3-indigo,.w3-hover-indigo:hover{color:#fff!important;background-color:#3f51b5!important} +.w3-khaki,.w3-hover-khaki:hover{color:#000!important;background-color:#f0e68c!important} +.w3-lime,.w3-hover-lime:hover{color:#000!important;background-color:#cddc39!important} +.w3-orange,.w3-hover-orange:hover{color:#000!important;background-color:#ff9800!important} +.w3-deep-orange,.w3-hover-deep-orange:hover{color:#fff!important;background-color:#ff5722!important} +.w3-pink,.w3-hover-pink:hover{color:#fff!important;background-color:#e91e63!important} +.w3-purple,.w3-hover-purple:hover{color:#fff!important;background-color:#9c27b0!important} +.w3-deep-purple,.w3-hover-deep-purple:hover{color:#fff!important;background-color:#673ab7!important} +.w3-red,.w3-hover-red:hover{color:#fff!important;background-color:#f44336!important} +.w3-sand,.w3-hover-sand:hover{color:#000!important;background-color:#fdf5e6!important} +.w3-teal,.w3-hover-teal:hover{color:#fff!important;background-color:#009688!important} +.w3-yellow,.w3-hover-yellow:hover{color:#000!important;background-color:#ffeb3b!important} +.w3-white,.w3-hover-white:hover{color:#000!important;background-color:#fff!important} +.w3-black,.w3-hover-black:hover{color:#fff!important;background-color:#000!important} +.w3-grey,.w3-hover-grey:hover,.w3-gray,.w3-hover-gray:hover{color:#000!important;background-color:#9e9e9e!important} +.w3-light-grey,.w3-hover-light-grey:hover,.w3-light-gray,.w3-hover-light-gray:hover{color:#000!important;background-color:#f1f1f1!important} +.w3-dark-grey,.w3-hover-dark-grey:hover,.w3-dark-gray,.w3-hover-dark-gray:hover{color:#fff!important;background-color:#616161!important} +.w3-pale-red,.w3-hover-pale-red:hover{color:#000!important;background-color:#ffdddd!important} +.w3-pale-green,.w3-hover-pale-green:hover{color:#000!important;background-color:#ddffdd!important} +.w3-pale-yellow,.w3-hover-pale-yellow:hover{color:#000!important;background-color:#ffffcc!important} +.w3-pale-blue,.w3-hover-pale-blue:hover{color:#000!important;background-color:#ddffff!important} +.w3-text-amber,.w3-hover-text-amber:hover{color:#ffc107!important} +.w3-text-aqua,.w3-hover-text-aqua:hover{color:#00ffff!important} +.w3-text-blue,.w3-hover-text-blue:hover{color:#2196F3!important} +.w3-text-light-blue,.w3-hover-text-light-blue:hover{color:#87CEEB!important} +.w3-text-brown,.w3-hover-text-brown:hover{color:#795548!important} +.w3-text-cyan,.w3-hover-text-cyan:hover{color:#00bcd4!important} +.w3-text-blue-grey,.w3-hover-text-blue-grey:hover,.w3-text-blue-gray,.w3-hover-text-blue-gray:hover{color:#607d8b!important} +.w3-text-green,.w3-hover-text-green:hover{color:#4CAF50!important} +.w3-text-light-green,.w3-hover-text-light-green:hover{color:#8bc34a!important} +.w3-text-indigo,.w3-hover-text-indigo:hover{color:#3f51b5!important} +.w3-text-khaki,.w3-hover-text-khaki:hover{color:#b4aa50!important} +.w3-text-lime,.w3-hover-text-lime:hover{color:#cddc39!important} +.w3-text-orange,.w3-hover-text-orange:hover{color:#ff9800!important} +.w3-text-deep-orange,.w3-hover-text-deep-orange:hover{color:#ff5722!important} +.w3-text-pink,.w3-hover-text-pink:hover{color:#e91e63!important} +.w3-text-purple,.w3-hover-text-purple:hover{color:#9c27b0!important} +.w3-text-deep-purple,.w3-hover-text-deep-purple:hover{color:#673ab7!important} +.w3-text-red,.w3-hover-text-red:hover{color:#f44336!important} +.w3-text-sand,.w3-hover-text-sand:hover{color:#fdf5e6!important} +.w3-text-teal,.w3-hover-text-teal:hover{color:#009688!important} +.w3-text-yellow,.w3-hover-text-yellow:hover{color:#d2be0e!important} +.w3-text-white,.w3-hover-text-white:hover{color:#fff!important} +.w3-text-black,.w3-hover-text-black:hover{color:#000!important} +.w3-text-grey,.w3-hover-text-grey:hover,.w3-text-gray,.w3-hover-text-gray:hover{color:#757575!important} +.w3-text-light-grey,.w3-hover-text-light-grey:hover,.w3-text-light-gray,.w3-hover-text-light-gray:hover{color:#f1f1f1!important} +.w3-text-dark-grey,.w3-hover-text-dark-grey:hover,.w3-text-dark-gray,.w3-hover-text-dark-gray:hover{color:#3a3a3a!important} +.w3-border-amber,.w3-hover-border-amber:hover{border-color:#ffc107!important} +.w3-border-aqua,.w3-hover-border-aqua:hover{border-color:#00ffff!important} +.w3-border-blue,.w3-hover-border-blue:hover{border-color:#2196F3!important} +.w3-border-light-blue,.w3-hover-border-light-blue:hover{border-color:#87CEEB!important} +.w3-border-brown,.w3-hover-border-brown:hover{border-color:#795548!important} +.w3-border-cyan,.w3-hover-border-cyan:hover{border-color:#00bcd4!important} +.w3-border-blue-grey,.w3-hover-border-blue-grey:hover,.w3-border-blue-gray,.w3-hover-border-blue-gray:hover{border-color:#607d8b!important} +.w3-border-green,.w3-hover-border-green:hover{border-color:#4CAF50!important} +.w3-border-light-green,.w3-hover-border-light-green:hover{border-color:#8bc34a!important} +.w3-border-indigo,.w3-hover-border-indigo:hover{border-color:#3f51b5!important} +.w3-border-khaki,.w3-hover-border-khaki:hover{border-color:#f0e68c!important} +.w3-border-lime,.w3-hover-border-lime:hover{border-color:#cddc39!important} +.w3-border-orange,.w3-hover-border-orange:hover{border-color:#ff9800!important} +.w3-border-deep-orange,.w3-hover-border-deep-orange:hover{border-color:#ff5722!important} +.w3-border-pink,.w3-hover-border-pink:hover{border-color:#e91e63!important} +.w3-border-purple,.w3-hover-border-purple:hover{border-color:#9c27b0!important} +.w3-border-deep-purple,.w3-hover-border-deep-purple:hover{border-color:#673ab7!important} +.w3-border-red,.w3-hover-border-red:hover{border-color:#f44336!important} +.w3-border-sand,.w3-hover-border-sand:hover{border-color:#fdf5e6!important} +.w3-border-teal,.w3-hover-border-teal:hover{border-color:#009688!important} +.w3-border-yellow,.w3-hover-border-yellow:hover{border-color:#ffeb3b!important} +.w3-border-white,.w3-hover-border-white:hover{border-color:#fff!important} +.w3-border-black,.w3-hover-border-black:hover{border-color:#000!important} +.w3-border-grey,.w3-hover-border-grey:hover,.w3-border-gray,.w3-hover-border-gray:hover{border-color:#9e9e9e!important} +.w3-border-light-grey,.w3-hover-border-light-grey:hover,.w3-border-light-gray,.w3-hover-border-light-gray:hover{border-color:#f1f1f1!important} +.w3-border-dark-grey,.w3-hover-border-dark-grey:hover,.w3-border-dark-gray,.w3-hover-border-dark-gray:hover{border-color:#616161!important} +.w3-border-pale-red,.w3-hover-border-pale-red:hover{border-color:#ffe7e7!important}.w3-border-pale-green,.w3-hover-border-pale-green:hover{border-color:#e7ffe7!important} +.w3-border-pale-yellow,.w3-hover-border-pale-yellow:hover{border-color:#ffffcc!important}.w3-border-pale-blue,.w3-hover-border-pale-blue:hover{border-color:#e7ffff!important} \ No newline at end of file diff --git a/src/main/front_end/vue_board_exam/src/App.vue b/src/main/front_end/vue_board_exam/src/App.vue new file mode 100644 index 0000000..070864d --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/App.vue @@ -0,0 +1,43 @@ + + + + + diff --git a/src/main/front_end/vue_board_exam/src/assets/base.css b/src/main/front_end/vue_board_exam/src/assets/base.css new file mode 100644 index 0000000..8816868 --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/assets/base.css @@ -0,0 +1,86 @@ +/* color palette from */ +:root { + --vt-c-white: #ffffff; + --vt-c-white-soft: #f8f8f8; + --vt-c-white-mute: #f2f2f2; + + --vt-c-black: #181818; + --vt-c-black-soft: #222222; + --vt-c-black-mute: #282828; + + --vt-c-indigo: #2c3e50; + + --vt-c-divider-light-1: rgba(60, 60, 60, 0.29); + --vt-c-divider-light-2: rgba(60, 60, 60, 0.12); + --vt-c-divider-dark-1: rgba(84, 84, 84, 0.65); + --vt-c-divider-dark-2: rgba(84, 84, 84, 0.48); + + --vt-c-text-light-1: var(--vt-c-indigo); + --vt-c-text-light-2: rgba(60, 60, 60, 0.66); + --vt-c-text-dark-1: var(--vt-c-white); + --vt-c-text-dark-2: rgba(235, 235, 235, 0.64); +} + +/* semantic color variables for this project */ +:root { + --color-background: var(--vt-c-white); + --color-background-soft: var(--vt-c-white-soft); + --color-background-mute: var(--vt-c-white-mute); + + --color-border: var(--vt-c-divider-light-2); + --color-border-hover: var(--vt-c-divider-light-1); + + --color-heading: var(--vt-c-text-light-1); + --color-text: var(--vt-c-text-light-1); + + --section-gap: 160px; +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--vt-c-black); + --color-background-soft: var(--vt-c-black-soft); + --color-background-mute: var(--vt-c-black-mute); + + --color-border: var(--vt-c-divider-dark-2); + --color-border-hover: var(--vt-c-divider-dark-1); + + --color-heading: var(--vt-c-text-dark-1); + --color-text: var(--vt-c-text-dark-2); + } +} + +*, +*::before, +*::after { + box-sizing: border-box; + margin: 0; + font-weight: normal; +} + +body { + min-height: 100vh; + color: var(--color-text); + background: var(--color-background); + transition: + color 0.5s, + background-color 0.5s; + line-height: 1.6; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Fira Sans', + 'Droid Sans', + 'Helvetica Neue', + sans-serif; + font-size: 15px; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} diff --git a/src/main/front_end/vue_board_exam/src/assets/logo.svg b/src/main/front_end/vue_board_exam/src/assets/logo.svg new file mode 100644 index 0000000..7565660 --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/assets/logo.svg @@ -0,0 +1 @@ + diff --git a/src/main/front_end/vue_board_exam/src/assets/main.css b/src/main/front_end/vue_board_exam/src/assets/main.css new file mode 100644 index 0000000..36fb845 --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/assets/main.css @@ -0,0 +1,35 @@ +@import './base.css'; + +#app { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + font-weight: normal; +} + +a, +.green { + text-decoration: none; + color: hsla(160, 100%, 37%, 1); + transition: 0.4s; + padding: 3px; +} + +@media (hover: hover) { + a:hover { + background-color: hsla(160, 100%, 37%, 0.2); + } +} + +@media (min-width: 1024px) { + body { + display: flex; + place-items: center; + } + + #app { + display: grid; + grid-template-columns: 1fr 1fr; + padding: 0 2rem; + } +} diff --git a/src/main/front_end/vue_board_exam/src/components/Pagination.vue b/src/main/front_end/vue_board_exam/src/components/Pagination.vue new file mode 100644 index 0000000..1f934c4 --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/components/Pagination.vue @@ -0,0 +1,98 @@ + + + + + diff --git a/src/main/front_end/vue_board_exam/src/main.ts b/src/main/front_end/vue_board_exam/src/main.ts new file mode 100644 index 0000000..56e300c --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/main.ts @@ -0,0 +1,18 @@ +import { createApp } from 'vue' +import App from './App.vue' +import router from './router' +import axios, { type AxiosInstance } from 'axios' + +declare module '@vue/runtime-core' { + interface ComponentCustomProperties { + $axios: AxiosInstance; + $serverUrl: string; + } +} + +const app = createApp(App) +app.config.globalProperties.$axios = axios +app.config.globalProperties.$serverUrl = import.meta.env.VITE_API_BASE_URL +app.use(router) + +app.mount('#app') diff --git a/src/main/front_end/vue_board_exam/src/router/index.ts b/src/main/front_end/vue_board_exam/src/router/index.ts new file mode 100644 index 0000000..63b933e --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/router/index.ts @@ -0,0 +1,41 @@ +import { createRouter, createWebHistory, type RouteRecordRaw } from 'vue-router' +import BoardList from '@/views/BoardList.vue' +import BoardDetail from '@/views/BoardDetail.vue' +import BoardWrite from '@/views/BoardWrite.vue' +import BoardUpdate from '@/views/BoardUpdate.vue' + +const routes: Array = [ + { + path: '/', + name: 'main', + component: BoardList, + }, + { + path: '/board', + name: 'board', + component: BoardList, + }, + { + path: '/board/detail/:idx', + name: 'boardDetail', + component: BoardDetail, + }, + { + path: '/board/write', + name: 'boardWrite', + component: BoardWrite, + }, + { + path: '/board/update', + name: 'boardUpdate', + component: BoardUpdate, + props: true, + }, +] + +const router = createRouter({ + history: createWebHistory(import.meta.env.BASE_URL), + routes, +}) + +export default router diff --git a/src/main/front_end/vue_board_exam/src/types/board.ts b/src/main/front_end/vue_board_exam/src/types/board.ts new file mode 100644 index 0000000..11db5dd --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/types/board.ts @@ -0,0 +1,18 @@ +export interface IBoardItem { + idx: number | string; + title: string; + contents: string; + creaNm: string; + creaDtm: string; + hitCnt: number | string; + rnum?: number; +} + +export interface IBoardResponse { + list: IBoardItem[]; + totalpage: number; +} + +export interface IBoardDetailResponse { + detail: IBoardItem; +} diff --git a/src/main/front_end/vue_board_exam/src/views/BoardDetail.vue b/src/main/front_end/vue_board_exam/src/views/BoardDetail.vue new file mode 100644 index 0000000..7baa4e4 --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/views/BoardDetail.vue @@ -0,0 +1,110 @@ + + + + + + diff --git a/src/main/front_end/vue_board_exam/src/views/BoardList.vue b/src/main/front_end/vue_board_exam/src/views/BoardList.vue new file mode 100644 index 0000000..53ae63b --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/views/BoardList.vue @@ -0,0 +1,154 @@ + + + + + \ No newline at end of file diff --git a/src/main/front_end/vue_board_exam/src/views/BoardUpdate.vue b/src/main/front_end/vue_board_exam/src/views/BoardUpdate.vue new file mode 100644 index 0000000..f43a368 --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/views/BoardUpdate.vue @@ -0,0 +1,103 @@ + + + + + \ No newline at end of file diff --git a/src/main/front_end/vue_board_exam/src/views/BoardWrite.vue b/src/main/front_end/vue_board_exam/src/views/BoardWrite.vue new file mode 100644 index 0000000..325f36c --- /dev/null +++ b/src/main/front_end/vue_board_exam/src/views/BoardWrite.vue @@ -0,0 +1,99 @@ + + + + + \ No newline at end of file diff --git a/src/main/front_end/vue_board_exam/tsconfig.app.json b/src/main/front_end/vue_board_exam/tsconfig.app.json new file mode 100644 index 0000000..f809bb6 --- /dev/null +++ b/src/main/front_end/vue_board_exam/tsconfig.app.json @@ -0,0 +1,15 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "include": ["env.d.ts", "src/**/*", "src/**/*.vue"], + "exclude": ["src/**/__tests__/*"], + "compilerOptions": { + "composite": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "module": "ESNext", + "moduleResolution": "bundler", + "baseUrl": ".", + "paths": { + "@/*": ["./src/*"] + } + } +} diff --git a/src/main/front_end/vue_board_exam/tsconfig.json b/src/main/front_end/vue_board_exam/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/src/main/front_end/vue_board_exam/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/src/main/front_end/vue_board_exam/tsconfig.node.json b/src/main/front_end/vue_board_exam/tsconfig.node.json new file mode 100644 index 0000000..5cbc713 --- /dev/null +++ b/src/main/front_end/vue_board_exam/tsconfig.node.json @@ -0,0 +1,16 @@ +{ + "extends": "@tsconfig/node22/tsconfig.json", + "include": [ + "vite.config.*", + "vitest.config.*", + "cypress.config.*", + "nightwatch.config.*", + "playwright.config.*" + ], + "compilerOptions": { + "composite": true, + "noEmit": true, + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "types": ["node"] + } +} diff --git a/src/main/front_end/vue_board_exam/vite.config.js b/src/main/front_end/vue_board_exam/vite.config.js new file mode 100644 index 0000000..d49d708 --- /dev/null +++ b/src/main/front_end/vue_board_exam/vite.config.js @@ -0,0 +1,20 @@ +import { fileURLToPath, URL } from 'node:url' + +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import vueJsx from '@vitejs/plugin-vue-jsx' +import vueDevTools from 'vite-plugin-vue-devtools' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [ + vue(), + vueJsx(), + vueDevTools(), + ], + resolve: { + alias: { + '@': fileURLToPath(new URL('./src', import.meta.url)) + }, + }, +}) diff --git a/src/main/java/first/board/controller/BoardController.java b/src/main/java/first/board/controller/BoardController.java new file mode 100644 index 0000000..e91a04e --- /dev/null +++ b/src/main/java/first/board/controller/BoardController.java @@ -0,0 +1,45 @@ +package first.board.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import first.common.common.CommandMap; + +/**/ + +@Controller +public class BoardController { + + + @RequestMapping(value="/board/list") + public ModelAndView openBoardList(CommandMap commandMap) throws Exception + { + ModelAndView mv = new ModelAndView("/board/boardList"); + return mv; + } + + @RequestMapping(value="/board/detail") + public ModelAndView openBoardDetail(CommandMap commandMap) throws Exception + { + ModelAndView mv = new ModelAndView("/board/boardDetail"); + mv.addObject("idx",commandMap.get("idx")); + return mv; + } + + @RequestMapping(value="/board/write") + public ModelAndView openBoardWrite(CommandMap commandMap) throws Exception + { + ModelAndView mv = new ModelAndView("/board/boardWrite"); + return mv; + } + + @RequestMapping(value="/board/update") + public ModelAndView openBoardUpdate(CommandMap commandMap) throws Exception + { + ModelAndView mv = new ModelAndView("/board/boardUpdate"); + mv.addObject("idx",commandMap.get("idx")); + return mv; + } + +} diff --git a/src/main/java/first/board/controller/BoardRestController.java b/src/main/java/first/board/controller/BoardRestController.java new file mode 100644 index 0000000..5104ac7 --- /dev/null +++ b/src/main/java/first/board/controller/BoardRestController.java @@ -0,0 +1,113 @@ +package first.board.controller; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.http.MediaType; +import org.springframework.web.bind.annotation.CrossOrigin; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestPart; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import first.board.dto.BoardDTO; +import first.board.service.BoardService; +import first.common.common.CommandMap; + +@CrossOrigin(origins = "*") +@RestController +public class BoardRestController { + + Logger log = Logger.getLogger(this.getClass()); //로그 찍고 + + @Resource(name="boardService") + private BoardService boardService; //서비스 선언 + + /** + * Rest BoardList조회 + * @param commandMap + * @return + */ + @GetMapping(value = "/board/api/list",produces = "text/plain;charset=utf-8") + public String selectBoardList(CommandMap commandMap) { + Map map = commandMap.getMap(); + + + //Map resultObj = boardService.board_list_vue(map); + JSONObject resultObj = boardService.selectBoardList(map); + String result = resultObj.toString(); + + return result; + } + + /** + * 상세글 보기 + * @param commandMap + * @return + */ + @GetMapping(value="/board/api/detail/{idx}",produces = "text/plain;charset=utf-8") + public String selectBoardDetail(@PathVariable("idx") String idx) { + String result=""; + Map map =new HashMap(); + map.put("idx", idx); + + + JSONObject resultObj = boardService.selectBoardDetail(map); + result = resultObj.toString(); + + + return result; + } + + + + @PostMapping(value="/board/api/detail", consumes = {MediaType.APPLICATION_JSON_VALUE}, produces = "text/plain;charset=utf-8") + public String insertBoardDetail( @RequestBody Map param) { + String result = ""; + log.debug(param); + + JSONObject resultObj = boardService.insertBoardDetail(param); + result = resultObj.toString(); + + return result; + } + + @PostMapping(value="/board/api/detail/{idx}", consumes = {MediaType.APPLICATION_JSON_VALUE}, produces = "text/plain;charset=utf-8") + public String updateBoardDetail( @RequestBody Map param , @PathVariable("idx") String idx) { + String result = ""; + log.debug("TEST : " + param); + + JSONObject resultObj = boardService.updateBoardDetail(param); + result = resultObj.toString(); + + return result; + + } + + @DeleteMapping(value="/board/api/detail/{idx}",produces = "text/plain;charset=utf-8") + public String deleteBoardDetail(@PathVariable("idx") String idx) { + String result = ""; + Map param = new HashMap(); + param.put("idx", idx); + + JSONObject resultObj = boardService.deleteBoardDetail(param); + result = resultObj.toString(); + + return result; + + } + +} + + diff --git a/src/main/java/first/board/dao/BoardDAO.java b/src/main/java/first/board/dao/BoardDAO.java new file mode 100644 index 0000000..c255d03 --- /dev/null +++ b/src/main/java/first/board/dao/BoardDAO.java @@ -0,0 +1,47 @@ +package first.board.dao; + +import java.util.List; +import java.util.Map; + +import org.json.JSONObject; +import org.springframework.stereotype.Repository; + +import first.common.dao.AbstractDAO; + +@Repository("boardDAO") +public class BoardDAO extends AbstractDAO { + + public List selectBoardList(Map map) { + // TODO Auto-generated method stub + return selectList("board.selectBoardList", map); + } + + public String selectBoardTotalPage(Map map) { + // TODO Auto-generated method stub + String strResult = String.valueOf(selectOne("board.selectBoardTotalPage", map)); + return strResult; + } + + public void updateBoardHitCnt(Map map) { + update("board.updateBoardDetailHit", map); + + } + + public Object selectBoardDetail(Map map) { + return selectOne("board.selectBoardDetail",map); + } + + public Object insertBoardDetail(Map param) { + return insert("board.insertBoardDetail", param); + } + + public Object updateBoardDetail(Map param) { + return update("board.updateBoardDetail", param); + } + + public Object deleteBoardDetail(Map map) { + return update("board.deleteBoardDetail", map); + } + + +} diff --git a/src/main/java/first/board/dto/BoardDTO.java b/src/main/java/first/board/dto/BoardDTO.java new file mode 100644 index 0000000..6e64257 --- /dev/null +++ b/src/main/java/first/board/dto/BoardDTO.java @@ -0,0 +1,18 @@ +package first.board.dto; + +import java.io.Serializable; + +import org.json.JSONObject; + +import lombok.Getter; + +@SuppressWarnings("serial") +@Getter +public class BoardDTO implements Serializable{ + private String idx; + private String title; + private String contents; + private String creaNm; + private String passWord; + +} diff --git a/src/main/java/first/board/service/BoardService.java b/src/main/java/first/board/service/BoardService.java new file mode 100644 index 0000000..ab190a3 --- /dev/null +++ b/src/main/java/first/board/service/BoardService.java @@ -0,0 +1,19 @@ +package first.board.service; + +import java.util.Map; + +import org.json.JSONObject; + +public interface BoardService { + + JSONObject selectBoardList(Map map); + + JSONObject selectBoardDetail(Map map); + + JSONObject insertBoardDetail(Map map); + + JSONObject updateBoardDetail(Map map); + + JSONObject deleteBoardDetail(Map map); + +} diff --git a/src/main/java/first/board/service/BoardServiceImpl.java b/src/main/java/first/board/service/BoardServiceImpl.java new file mode 100644 index 0000000..44a4183 --- /dev/null +++ b/src/main/java/first/board/service/BoardServiceImpl.java @@ -0,0 +1,194 @@ +package first.board.service; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.commons.collections.map.HashedMap; +import org.apache.log4j.Logger; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.stereotype.Service; + +import first.board.dao.BoardDAO; + +@Service("boardService") +public class BoardServiceImpl implements BoardService { + + Logger log = Logger.getLogger(this.getClass()); //로그 한번 찍어주고 + + + @Resource(name="boardDAO") + private BoardDAO boardDAO; + + @Override + public JSONObject selectBoardList(Map map) { + Map result = new HashMap(); + + String page = (String) map.get("page"); + if(page==null) + page="1"; + + int curpage=Integer.parseInt(page); + int rowSize=10; + int start=(rowSize*curpage)-(rowSize-1); + int end=rowSize*curpage; + map.put("curpage", curpage); + map.put("start", start); + map.put("end", end); + + + // 조회 값 출력 + List> list = boardDAO.selectBoardList(map); + + // 전체 리스트 출력 + String strTotalCount = boardDAO.selectBoardTotalPage(map); + + if(strTotalCount == null) { + strTotalCount="0"; + } + + int totalpage = Integer.parseInt(strTotalCount); + String strCode = "0"; + String strMsg = ""; + + + + JSONArray arr=new JSONArray(); + try { + for(Map vo:list) + { + + JSONObject obj=new JSONObject(); + obj.put("rnum", vo.get("RNUM")); + obj.put("idx", vo.get("IDX")); + obj.put("title", vo.get("TITLE")); + obj.put("hitCnt", vo.get("HIT_CNT")); + obj.put("creaNm", vo.get("CREA_NM")); + obj.put("creaDtm", vo.get("CREA_DTM")); + arr.put(obj); + } + } catch (Exception e) { + strCode = "-1"; + strMsg = e.getMessage(); + + } + + //result=arr.toJSONString(); + JSONObject resultObject = new JSONObject(); + resultObject.put("curpage", curpage); + resultObject.put("totalpage",totalpage); + resultObject.put("code", strCode); + resultObject.put("msg", strMsg); + resultObject.put("list", arr); + + return resultObject; + } + + @Override + public JSONObject selectBoardDetail(Map map) { + //idx값이 없는경우 + String strCode = "0"; + String strMsg = ""; + JSONObject resultObject = new JSONObject(); + JSONObject detailObject = new JSONObject(); + if(!map.containsKey("idx")) { + strCode = "-1"; + strMsg = "필수값이 누락되었습니다."; + } else { + try { + + //게시글 카운트 업데이트 + boardDAO.updateBoardHitCnt(map); + + //게시글 상세정보 읽기 + Map detail = (Map)boardDAO.selectBoardDetail(map); + + + detailObject.put("idx", detail.get("IDX")); + detailObject.put("title", detail.get("TITLE")); + detailObject.put("contents", detail.get("CONTENTS")); + detailObject.put("hitCnt", detail.get("HIT_CNT")); + detailObject.put("creaDtm", detail.get("CREA_DTM")); + detailObject.put("creaNm", detail.get("CREA_NM")); + + resultObject.put("detail", detailObject); + + //게시글 첨부파일(예정) + + }catch (Exception e) { + // TODO: handle exception + strCode = "-999"; + strMsg = e.getMessage(); + } + + } + resultObject.put("code", strCode); + resultObject.put("msg", strMsg); + + return resultObject; + } + + @Override + public JSONObject insertBoardDetail(Map param) { + JSONObject resultObject = new JSONObject(); + String strCode = "0"; + String strMsg = ""; + + try { + + + boardDAO.insertBoardDetail(param); + } catch (Exception e) { + strCode = "-1"; + strMsg = e.getMessage(); + } + resultObject.put("code", strCode); + resultObject.put("msg", strMsg); + + + return resultObject; + } + + @Override + public JSONObject updateBoardDetail(Map param) { + JSONObject resultObject = new JSONObject(); + String strCode = "0"; + String strMsg = ""; + try { + + boardDAO.updateBoardDetail(param) ; + } catch (Exception e) { + strCode = "-1"; + strMsg = e.getMessage(); + } + resultObject.put("code", strCode); + resultObject.put("msg", strMsg); + + return resultObject; + } + + @Override + public JSONObject deleteBoardDetail(Map param) { + JSONObject resultObject = new JSONObject(); + String strCode = "0"; + String strMsg = ""; + try { + int daoResult = (int) boardDAO.deleteBoardDetail(param) ; + if(daoResult > 0 ) { + + }else { + strCode = "-1"; + } + } catch (Exception e) { + strCode = "-1"; + strMsg = e.getMessage(); + } + resultObject.put("code", strCode); + resultObject.put("msg", strMsg); + return resultObject; + } + +} diff --git a/src/main/java/first/common/common/CommandMap.java b/src/main/java/first/common/common/CommandMap.java new file mode 100644 index 0000000..5108be1 --- /dev/null +++ b/src/main/java/first/common/common/CommandMap.java @@ -0,0 +1,54 @@ +package first.common.common; + +import java.util.HashMap; +import java.util.Map; +import java.util.Map.Entry; +import java.util.Set; + +public class CommandMap { + Map map = new HashMap(); + + public Object get(String key){ + return map.get(key); + } + + public void put(String key, Object value){ + map.put(key, value); + } + + public Object remove(String key){ + return map.remove(key); + } + + public boolean containsKey(String key){ + return map.containsKey(key); + } + + public boolean containsValue(Object value){ + return map.containsValue(value); + } + + public void clear(){ + map.clear(); + } + + public Set> entrySet(){ + return map.entrySet(); + } + + public Set keySet(){ + return map.keySet(); + } + + public boolean isEmpty(){ + return map.isEmpty(); + } + + public void putAll(Map m){ + map.putAll(m); + } + + public Map getMap(){ + return map; + } +} \ No newline at end of file diff --git a/src/main/java/first/common/controller/CommonController.java b/src/main/java/first/common/controller/CommonController.java new file mode 100644 index 0000000..9ca2ec1 --- /dev/null +++ b/src/main/java/first/common/controller/CommonController.java @@ -0,0 +1,45 @@ +package first.common.controller; + +import java.io.File; +import java.net.URLEncoder; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.io.FileUtils; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +import first.common.common.CommandMap; +import first.common.service.CommonService; + + +@Controller +public class CommonController +{ + Logger log = Logger.getLogger(this.getClass()); + + @Resource(name="commonService") + private CommonService commonService; + + + @RequestMapping(value="/common/downloadFile.do") + public void downloadFile(CommandMap commandMap, HttpServletResponse response) throws Exception + { //서버에서 화면으로 응답할때 response + Map map = commonService.selectFileInfo(commandMap.getMap()); + String storedFileName = (String)map.get("STORED_FILE_NAME"); + String originalFileName = (String)map.get("ORIGINAL_FILE_NAME"); + + byte fileByte[] = FileUtils.readFileToByteArray(new File("C:\\dev\\file\\"+storedFileName)); + + response.setContentType("application/octet-stream"); + response.setContentLength(fileByte.length); + response.setHeader("Content-Disposition", "attachment; fileName=\"" + URLEncoder.encode(originalFileName,"UTF-8")+"\";"); + response.getOutputStream().write(fileByte); + + response.getOutputStream().flush(); + response.getOutputStream().close(); + } +} diff --git a/src/main/java/first/common/controller/MemberController.java b/src/main/java/first/common/controller/MemberController.java new file mode 100644 index 0000000..ed4c7dc --- /dev/null +++ b/src/main/java/first/common/controller/MemberController.java @@ -0,0 +1,69 @@ +package first.common.controller; + +import javax.annotation.Resource; +import javax.servlet.http.HttpSession; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import first.common.common.CommandMap; +import first.common.dto.MemberDTO; +import first.common.service.MemberService; + +@Controller +public class MemberController { + + private static final Logger logger = LoggerFactory.getLogger(MemberController.class); + + @Resource(name = "memberService") + private MemberService memberService; + + + @RequestMapping("/member/login.do") + public ModelAndView login() { + ModelAndView mv = new ModelAndView("/member/login"); + return mv; + } + + //로그인 페이지 + @RequestMapping("/member/login_check.do") + public ModelAndView login_check (CommandMap commandMap , HttpSession session) { + ModelAndView mav = new ModelAndView(); + String name = memberService.loginCheck(commandMap.getMap(), session); + if(name != null && !name.isEmpty()) { + mav.setViewName("redirect:/sample/openBoardList.do"); + }else { + mav.setViewName("redirect:/member/login.do"); + mav.addObject("message", "Error"); + } + return mav; + } + + + @RequestMapping("/member/logout.do") + public ModelAndView logout( HttpSession session){ + ModelAndView mav = new ModelAndView(); + + session.invalidate(); + + mav.setViewName("redirect:/member/login.do"); + + return mav; + } + + //비밀번호 체크 + + //회원 정보 변경 + + //로그아웃 + + //가입 + + //탈퇴 + + +} diff --git a/src/main/java/first/common/dao/AbstractDAO.java b/src/main/java/first/common/dao/AbstractDAO.java new file mode 100644 index 0000000..4608fab --- /dev/null +++ b/src/main/java/first/common/dao/AbstractDAO.java @@ -0,0 +1,143 @@ +package first.common.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.mybatis.spring.SqlSessionTemplate; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.util.StringUtils; + +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; + +public class AbstractDAO { + protected Log log = LogFactory.getLog(AbstractDAO.class); + + @Autowired + private SqlSessionTemplate sqlSession; /* SqlSessionTemplate 는 context-mapper.xml에 정의됨*/ + + protected void printQueryId(String queryId) { + if(log.isDebugEnabled()){ + log.debug("\t QueryId \t: " + queryId); + } + } + + public Object insert(String queryId, Object params){ + printQueryId(queryId); + return sqlSession.insert(queryId, params); + } + + public Object update(String queryId, Object params){ + printQueryId(queryId); + return sqlSession.update(queryId, params); + } + + public Object delete(String queryId, Object params){ + printQueryId(queryId); + return sqlSession.delete(queryId, params); + } + + public Object selectOne(String queryId){ + printQueryId(queryId); + return sqlSession.selectOne(queryId); + } + + public Object selectOne(String queryId, Object params){ + printQueryId(queryId); + return sqlSession.selectOne(queryId, params); + } + + @SuppressWarnings("rawtypes") + public List selectList(String queryId){ + printQueryId(queryId); + return sqlSession.selectList(queryId); + } + + @SuppressWarnings("rawtypes") + public List selectList(String queryId, Object params){ + printQueryId(queryId); + return sqlSession.selectList(queryId,params); + } + + @SuppressWarnings({ "rawtypes", "unchecked" }) + public Map selectPagingList(String queryId, Object params) + { + printQueryId(queryId); + + Map map = (Map) params; + PaginationInfo paginationInfo = null; + + //containsKey 일치여부 + if(map.containsKey("currentPageNo") == false || StringUtils.isEmpty(map.get("currentPageNo")) == true) + map.put("currentPageNo", "1"); + + paginationInfo = new PaginationInfo(); + paginationInfo.setCurrentPageNo(Integer.parseInt(map.get("currentPageNo").toString())); + if(map.containsKey("PAGE_ROW") == false || StringUtils.isEmpty(map.get("PAGE_ROW")) == true) + { + paginationInfo.setRecordCountPerPage(15); //몇개의 행을 보여줄지 셋 + }else{ + paginationInfo.setRecordCountPerPage(Integer.parseInt(map.get("PAGE_ROW").toString())); + } + paginationInfo.setPageSize(10); //페이지 크기 지정 1~10 + + int start = paginationInfo.getFirstRecordIndex(); + int end = start + paginationInfo.getRecordCountPerPage(); + map.put("START",start+1); + map.put("END",end); + + params = map; + + Map returnMap = new HashMap(); + List> list = sqlSession.selectList(queryId,params); + + if(list.size() == 0){ + map = new HashMap(); + map.put("TOTAL_COUNT",0); + list.add(map); + + if(paginationInfo != null){ + paginationInfo.setTotalRecordCount(0); + returnMap.put("paginationInfo", paginationInfo); + } + } + else{ + if(paginationInfo != null){ + paginationInfo.setTotalRecordCount(Integer.parseInt(list.get(0).get("TOTAL_COUNT").toString())); + returnMap.put("paginationInfo", paginationInfo); + } + } + returnMap.put("result", list); + return returnMap; + } + + /*@SuppressWarnings("unchecked") + public Object selectPagingList(String queryId, Object params) + { + printQueryId(queryId); + Map map = (Map)params; + + String strPageIndex = (String)map.get("PAGE_INDEX"); //페이지 번호 + String strPageRow = (String)map.get("PAGE_ROW"); //페이지 행수 + int nPageIndex = 0; + int nPageRow = 20; + + if(StringUtils.isEmpty(strPageIndex) == false) + { + nPageIndex = Integer.parseInt(strPageIndex)-1; + } + if(StringUtils.isEmpty(strPageRow) == false) + { + nPageRow = Integer.parseInt(strPageRow); + } + + map.put("START", (nPageIndex * nPageRow) + 1); + map.put("END", (nPageIndex * nPageRow) + nPageRow); + + return sqlSession.selectList(queryId, map); + }*/ +} + + diff --git a/src/main/java/first/common/dao/CommonDAO.java b/src/main/java/first/common/dao/CommonDAO.java new file mode 100644 index 0000000..f6f2ab5 --- /dev/null +++ b/src/main/java/first/common/dao/CommonDAO.java @@ -0,0 +1,17 @@ +package first.common.dao; + +import java.util.Map; + +import org.springframework.stereotype.Repository; + +@Repository("commonDAO") +public class CommonDAO extends AbstractDAO +{ + + @SuppressWarnings("unchecked") + public Map selectFileInfo(Map map) throws Exception + { + return (Map)selectOne("common.selectFileInfo", map); + } + +} diff --git a/src/main/java/first/common/dao/MemberDAO.java b/src/main/java/first/common/dao/MemberDAO.java new file mode 100644 index 0000000..6f70da2 --- /dev/null +++ b/src/main/java/first/common/dao/MemberDAO.java @@ -0,0 +1,19 @@ +package first.common.dao; + + +import java.util.Map; + +import org.springframework.stereotype.Repository; + +import first.common.dto.MemberDTO; + +@Repository("memberDAO") +public class MemberDAO extends AbstractDAO { + + public Map loginCheck(Map map) { + Map result = (Map )selectOne("member.retrieveMember", map); + + return result; + } + +} diff --git a/src/main/java/first/common/dto/MemberDTO.java b/src/main/java/first/common/dto/MemberDTO.java new file mode 100644 index 0000000..9282702 --- /dev/null +++ b/src/main/java/first/common/dto/MemberDTO.java @@ -0,0 +1,35 @@ +package first.common.dto; + + +public class MemberDTO { + private String id; + private String passWd; + private String name; + private String loginTime; + public String getId() { + return id; + } + public void setId(String id) { + this.id = id; + } + public String getPassWd() { + return passWd; + } + public void setPassWd(String passWd) { + this.passWd = passWd; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public String getLoginTime() { + return loginTime; + } + public void setLoginTime(String loginTime) { + this.loginTime = loginTime; + } + + +} diff --git a/src/main/java/first/common/logger/LoggerAspect.java b/src/main/java/first/common/logger/LoggerAspect.java new file mode 100644 index 0000000..dda0c3d --- /dev/null +++ b/src/main/java/first/common/logger/LoggerAspect.java @@ -0,0 +1,37 @@ +package first.common.logger; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; + +@Aspect +public class LoggerAspect +{ + protected Log log = LogFactory.getLog(LoggerAspect.class); + static String name = ""; + static String type = ""; + + @Around("execution(* first..controller.*Controller.*(..)) or execution(* first..service.*Imple.*(..)) or execution(* first..dao.*DAO.*(..))") + public Object logPrint(ProceedingJoinPoint joinPoint) throws Throwable + { + type = joinPoint.getSignature().getDeclaringTypeName(); + + if(type.indexOf("Controller") > -1) + { + name = "Controller \t: "; + } + else if(type.indexOf("Service") > -1) + { + name = "ServiceImpl \t: "; + } + else if(type.indexOf("DAO") > -1) + { + name = "DAO \t\t: "; + } + log.debug(name + type + "." + joinPoint.getSignature().getName() + "()"); + + return joinPoint.proceed(); + } +} diff --git a/src/main/java/first/common/logger/LoggerInterceptor.java b/src/main/java/first/common/logger/LoggerInterceptor.java new file mode 100644 index 0000000..0a77fd6 --- /dev/null +++ b/src/main/java/first/common/logger/LoggerInterceptor.java @@ -0,0 +1,37 @@ +package first.common.logger; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + + +public class LoggerInterceptor extends HandlerInterceptorAdapter +{ + protected Log log = LogFactory.getLog(LoggerInterceptor.class); + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception + { + if(log.isDebugEnabled()) + { + log.debug("================== START ======================"); + System.out.println("dddddd"); + log.debug(" Request URI \t : "+request.getRequestURI()); + } + + return super.preHandle(request, response, handler); + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception + { + if(log.isDebugEnabled()) + { + log.debug("=================== END ======================="); + } + } +} diff --git a/src/main/java/first/common/resolver/CustomMapArgumentResolver.java b/src/main/java/first/common/resolver/CustomMapArgumentResolver.java new file mode 100644 index 0000000..c5d018c --- /dev/null +++ b/src/main/java/first/common/resolver/CustomMapArgumentResolver.java @@ -0,0 +1,45 @@ +package first.common.resolver; + +import java.util.Enumeration; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.core.MethodParameter; +import org.springframework.web.bind.support.WebDataBinderFactory; +import org.springframework.web.context.request.NativeWebRequest; +import org.springframework.web.method.support.HandlerMethodArgumentResolver; +import org.springframework.web.method.support.ModelAndViewContainer; + +import first.common.common.CommandMap; + +public class CustomMapArgumentResolver implements HandlerMethodArgumentResolver +{ + @Override + public boolean supportsParameter(MethodParameter parameter) + { + return CommandMap.class.isAssignableFrom(parameter.getParameterType()); + } //컨트롤러의 파라미터가 CommandMap클래스인지 검사 + + @Override + public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception + { + CommandMap commandMap = new CommandMap(); //객체생성 + + HttpServletRequest request = (HttpServletRequest)webRequest.getNativeRequest(); + Enumeration enumeration = request.getParameterNames(); + + String key = null; + String[] values = null; + while(enumeration.hasMoreElements()) + { + key = (String)enumeration.nextElement(); + values = request.getParameterValues(key); + + if(values != null) + { + commandMap.put(key, (values.length > 1)?values:values[0]); + } + } + return commandMap; + } +} diff --git a/src/main/java/first/common/service/CommonService.java b/src/main/java/first/common/service/CommonService.java new file mode 100644 index 0000000..3250776 --- /dev/null +++ b/src/main/java/first/common/service/CommonService.java @@ -0,0 +1,8 @@ +package first.common.service; + +import java.util.Map; + +public interface CommonService +{ + Map selectFileInfo(Map map) throws Exception; +} diff --git a/src/main/java/first/common/service/CommonServiceImpl.java b/src/main/java/first/common/service/CommonServiceImpl.java new file mode 100644 index 0000000..693630b --- /dev/null +++ b/src/main/java/first/common/service/CommonServiceImpl.java @@ -0,0 +1,26 @@ +package first.common.service; + +import java.util.Map; + +import javax.annotation.Resource; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Service; + +import first.common.dao.CommonDAO; + + +@Service("commonService") +public class CommonServiceImpl implements CommonService +{ + Logger log = Logger.getLogger(this.getClass()); + + @Resource(name="commonDAO") + private CommonDAO commonDAO; + + @Override + public Map selectFileInfo(Map map) throws Exception + { + return commonDAO.selectFileInfo(map); + } +} diff --git a/src/main/java/first/common/service/MemberService.java b/src/main/java/first/common/service/MemberService.java new file mode 100644 index 0000000..b371d19 --- /dev/null +++ b/src/main/java/first/common/service/MemberService.java @@ -0,0 +1,23 @@ +package first.common.service; + +import java.util.Map; + +import javax.servlet.http.HttpSession; + +import first.common.dto.MemberDTO; + +public interface MemberService { + + + //로그인 체크 + public String loginCheck(Map dto, HttpSession session); + //로그인 + + //로그아웃 + public void logout(HttpSession session); + //가입 + + //탈퇴 + + //회원 수정 +} diff --git a/src/main/java/first/common/service/MemberServiceImpl.java b/src/main/java/first/common/service/MemberServiceImpl.java new file mode 100644 index 0000000..f5decab --- /dev/null +++ b/src/main/java/first/common/service/MemberServiceImpl.java @@ -0,0 +1,47 @@ +package first.common.service; + +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpSession; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import first.common.dao.MemberDAO; +import first.common.dto.MemberDTO; + +@Service("memberService") +public class MemberServiceImpl implements MemberService { + + private static final Logger logger = LoggerFactory.getLogger(MemberService.class); + + @Resource(name="memberDAO") + private MemberDAO memberDAO; + + + + @Override + public String loginCheck(Map dto, HttpSession session) { + Map member = memberDAO.loginCheck(dto); + String name = ""; + if(member != null && member.containsKey("ID")) { + session.setAttribute("userId", member.get("ID")); + session.setAttribute("name", member.get("NAME")); + + logger.debug("UserId : " + String.valueOf( session.getAttribute("userId") ) ); + logger.debug("Name : " + String.valueOf( session.getAttribute("name") ) ); + + name = String.valueOf(member.get("NAME")); + } + + return name; + } + + @Override + public void logout(HttpSession session) { + session.invalidate(); + } + +} diff --git a/src/main/java/first/common/util/CommonUtils.java b/src/main/java/first/common/util/CommonUtils.java new file mode 100644 index 0000000..726e685 --- /dev/null +++ b/src/main/java/first/common/util/CommonUtils.java @@ -0,0 +1,11 @@ +package first.common.util; + +import java.util.UUID; + +public class CommonUtils +{ + public static String getRandomString() + { + return UUID.randomUUID().toString().replaceAll("-", ""); + } +} diff --git a/src/main/java/first/common/util/FileUtils.java b/src/main/java/first/common/util/FileUtils.java new file mode 100644 index 0000000..aa1a7b5 --- /dev/null +++ b/src/main/java/first/common/util/FileUtils.java @@ -0,0 +1,85 @@ +package first.common.util; + +import java.io.File; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.stereotype.Component; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +@Component("fileUtils") +public class FileUtils +{ + private static final String filePath = "c:\\dev\\file\\"; //파일 저장위치 선언 + + public List> parseInsertFileInfo(Map map, HttpServletRequest request) throws Exception + { + MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest)request; + Iterator iterator = multipartHttpServletRequest.getFileNames(); + + MultipartFile multipartFile = null; + String originalFileName = null; + String originalFileExtension = null; + String storedFileName = null; + + List> list = new ArrayList>(); + Map listMap = null; + + String boardIdx = (String)map.get("IDX"); //게시글 번호 받아오는 부분 + String requestName = null; + String idx = null; + + /*File file = new File(filePath); + if(file.exists() == false) + { + file.mkdirs(); + } //경로 없으면 만들어줘라 +*/ + while(iterator.hasNext()) + { + multipartFile = multipartHttpServletRequest.getFile(iterator.next()); + if(multipartFile.isEmpty() == false) + { + originalFileName = multipartFile.getOriginalFilename(); + originalFileExtension = originalFileName.substring(originalFileName.lastIndexOf(".")); //확장자명을 짤라서 저장하고 + storedFileName = CommonUtils.getRandomString() + originalFileExtension; //파일이름 랜덤하고 돌리고 짤랐던거 확장자 붙이고, + + /*file = new File(filePath + storedFileName); + multipartFile.transferTo(file);*/ + + multipartFile.transferTo(new File(filePath + storedFileName)); + + listMap = new HashMap(); + /*listMap.put("BOARD_IDX", boardIdx); + listMap.put("ORIGINAL_FILE_NAME", originalFileName); + listMap.put("STORED_FILE_NAME", storedFileName); + listMap.put("FILE_SIZE", multipartFile.getSize());*/ + + listMap.put("IS_NEW", "Y"); + listMap.put("BOARD_IDX", boardIdx); + listMap.put("ORIGINAL_FILE_NAME", originalFileName); + listMap.put("STORED_FILE_NAME", storedFileName); + listMap.put("FILE_SIZE", multipartFile.getSize()); + list.add(listMap); + }else{ + requestName = multipartFile.getName(); + idx = "IDX_" + requestName.substring(requestName.indexOf("_")+1); + if(map.containsKey(idx)==true&&map.get(idx)!=null) + { + listMap = new HashMap(); + listMap.put("IS_NEW", "N"); + listMap.put("FILE_IDX", map.get(idx)); + list.add(listMap); + } + } + } + + return list; + } +} diff --git a/src/main/java/first/sample/controller/SampleController.java b/src/main/java/first/sample/controller/SampleController.java new file mode 100644 index 0000000..83466e7 --- /dev/null +++ b/src/main/java/first/sample/controller/SampleController.java @@ -0,0 +1,176 @@ +package first.sample.controller; + +import java.util.Iterator; +import java.util.Map; +import java.util.Map.Entry; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.fasterxml.jackson.annotation.JsonCreator.Mode; + +import egovframework.rte.ptl.mvc.tags.ui.pagination.PaginationInfo; +import first.common.common.CommandMap; +import first.sample.service.SampleService; + +@Controller +public class SampleController +{ + Logger log = Logger.getLogger(this.getClass()); //로그 찍고 + + @Resource(name="sampleService") + private SampleService sampleService; //샘플서비스 선언하고 + + + + @RequestMapping(value="/sample/openBoardSearch.do") + public ModelAndView openBoardSearch(CommandMap commandMap) throws Exception + { + ModelAndView mv = new ModelAndView("/sample/boardSearch"); + return mv; + } + + + @RequestMapping(value="/sample/openBoardList.do") //경로 맵핑해주고~ + public ModelAndView openBoardList(CommandMap commandMap, HttpSession session) throws Exception + { //모델뷰 만들고 openSampleBoardList 메서드 만들고 + String userId = String.valueOf(session.getAttribute("userId")); + log.debug(userId); + ModelAndView mv = null; + if(userId != null && userId.isEmpty()) { + mv = new ModelAndView("redirect:/member/login.do"); //모델뷰 객체 선언뒤 jsp파일 지정 + }else { + + mv = new ModelAndView("/sample/boardList"); //모델뷰 객체 선언뒤 jsp파일 지정 + + Map resultMap = sampleService.selectBoardList(commandMap.getMap()); + //List> list = sampleService.selectBoardList(commandMap); + //앞에서 샘플서비스 선언한것 뒤에 selectBoardList라는 메서드 만들고 + //mv.addObject("list", list); //앞에서 실행 다하고 list에 담긴건 list라고 선언하고 + + mv.addObject("paginationInfo", (PaginationInfo)resultMap.get("paginationInfo")); + mv.addObject("list", resultMap.get("result")); + + System.out.println("========JRebel Test============"); + log.debug("======JRebel Test2======"); + } + return mv; + + + } + + @RequestMapping(value="/sample/testMapArgumentResolver.do") + public ModelAndView testMapArgumentResolver(CommandMap commandMap, HttpSession session) throws Exception + { + ModelAndView mv = new ModelAndView(""); + + if(commandMap.isEmpty() == false) + { + Iterator> iterator = commandMap.getMap().entrySet().iterator(); + Entry entry = null; + while(iterator.hasNext()) + { + entry = iterator.next(); + log.debug("key :"+entry.getKey()+", value :"+entry.getValue()); + } + } + + return mv; + } + + + @RequestMapping(value="/sample/openBoardWrite.do") + public ModelAndView openBoardWrite(CommandMap commandMap, HttpSession session) throws Exception + { + + ModelAndView mv = new ModelAndView("/sample/boardWrite"); //JSP 파일 지정 + System.out.println("========JRebel Test============"); + return mv; + } + + @RequestMapping(value="/sample/Test.do") + public ModelAndView Test(CommandMap commandMap) throws Exception + { + + ModelAndView mv = new ModelAndView("/sample/Test"); //JSP 파일 지정 + System.out.println("========Test Test============"); + return mv; + } + + @RequestMapping(value="/sample/kk.do") + public ModelAndView kk(CommandMap commandMap) throws Exception + { + + ModelAndView mv = new ModelAndView("/sample/kk"); //JSP 파일 지정 + System.out.println("========kk Test============"); + return mv; + } + + + + + @RequestMapping(value="/sample/insertBoard.do") + public ModelAndView insertBoard(CommandMap commandMap, HttpServletRequest request, HttpSession session) throws Exception + { + ModelAndView mv = new ModelAndView("redirect:/sample/openBoardList.do"); + + sampleService.insertBoard(commandMap.getMap(), request); + + return mv; + } + + @RequestMapping(value="/sample/openBoardDetail.do") + public ModelAndView openBoardDetail(CommandMap commandMap, HttpSession session) throws Exception + { + ModelAndView mv = new ModelAndView("/sample/boardDetail"); + + Map map = sampleService.selectBoardDetail(commandMap.getMap()); + + mv.addObject("map", map.get("map")); + mv.addObject("list", map.get("list")); //요건 첨부파일 목록 부를때 쓸거임 + + return mv; + } + + @RequestMapping(value="/sample/openBoardUpdate.do") //수정디테일화면 + public ModelAndView openBoardUpdate(CommandMap commandMap, HttpSession session) throws Exception + { + ModelAndView mv = new ModelAndView("/sample/boardUpdate"); + + Map map = sampleService.boardUpdate(commandMap.getMap()); + + mv.addObject("map", map.get("map")); //내용 + mv.addObject("list", map.get("list")); //첨부파일 + + return mv; + } + + @RequestMapping(value="/sample/updateBoard.do") //수정하기 누르는~~ 혹은 저장하기 누르는~~ + public ModelAndView updateBoard(CommandMap commandMap, HttpServletRequest request, HttpSession session) throws Exception + { + ModelAndView mv = new ModelAndView("redirect:/sample/openBoardDetail.do"); + + sampleService.updateBoard(commandMap.getMap(), request); + + mv.addObject("IDX", commandMap.get("IDX")); + return mv; + } + + @RequestMapping(value="/sample/deleteBoard.do") + public ModelAndView deleteBoard(CommandMap commandMap, HttpSession session) throws Exception + { + ModelAndView mv = new ModelAndView("redirect:/sample/openBoardList.do"); + + sampleService.deleteBoard(commandMap.getMap()); + + return mv; + } + + +} diff --git a/src/main/java/first/sample/dao/SampleDAO.java b/src/main/java/first/sample/dao/SampleDAO.java new file mode 100644 index 0000000..84a836a --- /dev/null +++ b/src/main/java/first/sample/dao/SampleDAO.java @@ -0,0 +1,79 @@ +package first.sample.dao; + +import java.util.List; +import java.util.Map; + +import org.springframework.stereotype.Repository; + +import first.common.dao.AbstractDAO; + +@Repository("sampleDAO") //@Repository DAO선언시 주로 사용 +public class SampleDAO extends AbstractDAO //오 요건 extends로 상속 받았으니 그대로 쓰면됨 +{ + + @SuppressWarnings("unchecked") //에러 경고문 필요없음 + public Map selectBoardList(Map map) throws Exception + { + //return (List>) selectList("sample.selectBoardList", map); + //첫번째 인자값이 쿼리 이름 -> sample.selectBoardList + return (Map) selectPagingList("sample.selectBoardList", map); + } + + public void insertBoard(Map map) throws Exception + { + insert("sample.insertBoard", map); + } + + public void insertFile(Map map) throws Exception + { + insert("sample.insertFile", map); + } + + /*public void updateHitCnt(Map map) throws Exception + { + update("sample.updateHitCnt", map); + }*/ + + @SuppressWarnings("unchecked") + public Map selectBoardDetail(Map map) throws Exception{ + return (Map) selectOne("sample.selectBoardDetail", map); + } + + @SuppressWarnings("unchecked") + public List> selectFileList(Map map) throws Exception + { + return (List>) selectList("sample.selectFileList", map); + } + + @SuppressWarnings("unchecked") + public Map boardUpdate(Map map) throws Exception + { + return (Map) selectOne("sample.boardUpdate", map); + } + + public void updateBoard(Map map) throws Exception + { + update("sample.updateBoard", map); + } + + public void deleteBoard(Map map) throws Exception + { + delete("sample.deleteBoard", map); + } + + public void updateHitCnt(Map map) + { + update("sample.updateHitCnt", map); + } + + public void deleteFileList(Map map) + { + update("sample.deleteFileList", map); + } + + public void updateFile(Map map) + { + update("sample.updateFile", map); + } + +} diff --git a/src/main/java/first/sample/service/SampleService.java b/src/main/java/first/sample/service/SampleService.java new file mode 100644 index 0000000..bc46f01 --- /dev/null +++ b/src/main/java/first/sample/service/SampleService.java @@ -0,0 +1,25 @@ +package first.sample.service; + +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +public interface SampleService { + + Map selectBoardList(Map map) throws Exception; + + void insertBoard(Map map, HttpServletRequest request) throws Exception; + + Map selectBoardDetail(Map map) throws Exception; + + Map boardUpdate(Map map) throws Exception; + + void updateBoard(Map map, HttpServletRequest request) throws Exception; + + void deleteBoard(Map map) throws Exception; + + + + + +} diff --git a/src/main/java/first/sample/service/SampleServiceImpl.java b/src/main/java/first/sample/service/SampleServiceImpl.java new file mode 100644 index 0000000..4ef92e1 --- /dev/null +++ b/src/main/java/first/sample/service/SampleServiceImpl.java @@ -0,0 +1,121 @@ +package first.sample.service; + +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; + +import first.common.util.FileUtils; +import first.sample.dao.SampleDAO; + + +@Service("sampleService") +public class SampleServiceImpl implements SampleService //인터페이스 상속시 implements +{ //SampleSeriveImpl 클래스 선언하는데 SampleSerive + Logger log = Logger.getLogger(this.getClass()); //로그 한번 찍어주고 + + @Resource(name="fileUtils") + private FileUtils fileUtils; + + @Resource(name="sampleDAO") + private SampleDAO sampleDAO; //SampleDAO 선언해주고 + + @Override //implements로 상속 받았으니 @Override로 재 정의해줌(SampleService에서 정의한놈) + public Map selectBoardList(Map map) throws Exception { + + return sampleDAO.selectBoardList(map); + } + + @Override + public void insertBoard(Map map, HttpServletRequest request) throws Exception + { + sampleDAO.insertBoard(map); + + List> list = fileUtils.parseInsertFileInfo(map, request); + for(int i=0,size=list.size();i iterator = multipartHttpServletRequest.getFileNames(); + MultipartFile multipartFile = null; + + while(iterator.hasNext()) + { + multipartFile = multipartHttpServletRequest.getFile(iterator.next()); + + if(multipartFile.isEmpty() == false) + { + log.debug("--------------file start------------"); + log.debug("name :" + multipartFile.getName()); + log.debug("filename :" + multipartFile.getOriginalFilename()); + log.debug("size :" + multipartFile.getSize()); + log.debug("--------------file end--------------\n"); + } + } + } + + @Override + public Map selectBoardDetail(Map map) throws Exception + { + sampleDAO.updateHitCnt(map); + + Map resultMap = new HashMap(); + Map tempMap = sampleDAO.selectBoardDetail(map); + resultMap.put("map", tempMap); + + List> list = sampleDAO.selectFileList(map); + resultMap.put("list", list); + + return resultMap; + } + + @Override + public Map boardUpdate(Map map) throws Exception + { + Map resultMap = new HashMap(); + Map tempMap = sampleDAO.boardUpdate(map); + resultMap.put("map", tempMap); + + List> list = sampleDAO.selectFileList(map); + resultMap.put("list", list); + + return resultMap; + } + + @Override + public void updateBoard(Map map, HttpServletRequest request) throws Exception + { + sampleDAO.updateBoard(map); //기존 글만 수정(업데이트) + + sampleDAO.deleteFileList(map); // (DEL_GB = 'Y') 로 처리하는 부분 + List> list = fileUtils.parseInsertFileInfo(map, request); + Map tempMap = null; + for(int i=0,size=list.size();i map) throws Exception { + + sampleDAO.deleteBoard(map); + + } +} diff --git a/src/main/java/test/test.java b/src/main/java/test/test.java new file mode 100644 index 0000000..edbea35 --- /dev/null +++ b/src/main/java/test/test.java @@ -0,0 +1,15 @@ +package test; + +public class test { + + public static void main(String[] args) + { + try{ + String str = "abc"; + Integer.parseInt(str); + }catch(Exception e){ + System.out.println("Error"); + } + } + +} diff --git a/src/main/resources/config/spring/context-aspect.xml b/src/main/resources/config/spring/context-aspect.xml new file mode 100644 index 0000000..3eabef7 --- /dev/null +++ b/src/main/resources/config/spring/context-aspect.xml @@ -0,0 +1,12 @@ + + + + + + \ No newline at end of file diff --git a/src/main/resources/config/spring/context-common.xml b/src/main/resources/config/spring/context-common.xml new file mode 100644 index 0000000..242acbb --- /dev/null +++ b/src/main/resources/config/spring/context-common.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/config/spring/context-datasource.xml b/src/main/resources/config/spring/context-datasource.xml new file mode 100644 index 0000000..d0b46fb --- /dev/null +++ b/src/main/resources/config/spring/context-datasource.xml @@ -0,0 +1,29 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/config/spring/context-mapper.xml b/src/main/resources/config/spring/context-mapper.xml new file mode 100644 index 0000000..01649fe --- /dev/null +++ b/src/main/resources/config/spring/context-mapper.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/log4j.dtd b/src/main/resources/log4j.dtd new file mode 100644 index 0000000..4cba758 --- /dev/null +++ b/src/main/resources/log4j.dtd @@ -0,0 +1,237 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/log4j.xml b/src/main/resources/log4j.xml new file mode 100644 index 0000000..20344d4 --- /dev/null +++ b/src/main/resources/log4j.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/mapper/board/Board_SQL.xml b/src/main/resources/mapper/board/Board_SQL.xml new file mode 100644 index 0000000..9a8e2a3 --- /dev/null +++ b/src/main/resources/mapper/board/Board_SQL.xml @@ -0,0 +1,114 @@ + + + + + + + + + + + + + + + + + SELECT SEQ_TB_BOARD_IDX.NEXTVAL FROM DUAL + + + + + + UPDATE SCOTT.TB_BOARD SET + TITLE = #{title} + , CONTENTS = #{contents} + WHERE DEL_GB = 'N' + AND IDX = #{idx} + + + + + UPDATE SCOTT.TB_BOARD SET + DEL_GB = 'Y' + WHERE DEL_GB = 'N' + AND IDX = #{idx} + + + \ No newline at end of file diff --git a/src/main/resources/mapper/common/Common_SQL.xml b/src/main/resources/mapper/common/Common_SQL.xml new file mode 100644 index 0000000..0800293 --- /dev/null +++ b/src/main/resources/mapper/common/Common_SQL.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/mapper/common/member_SQL.xml b/src/main/resources/mapper/common/member_SQL.xml new file mode 100644 index 0000000..2c78e23 --- /dev/null +++ b/src/main/resources/mapper/common/member_SQL.xml @@ -0,0 +1,23 @@ + + + + + + + + + + diff --git a/src/main/resources/mapper/sample/Sample_SQL.xml b/src/main/resources/mapper/sample/Sample_SQL.xml new file mode 100644 index 0000000..3e07b05 --- /dev/null +++ b/src/main/resources/mapper/sample/Sample_SQL.xml @@ -0,0 +1,189 @@ + + + + + + + + + SELECT SEQ_TB_BOARD_IDX.NEXTVAL FROM DUAL + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/rebel.xml b/src/main/resources/rebel.xml new file mode 100644 index 0000000..644022d --- /dev/null +++ b/src/main/resources/rebel.xml @@ -0,0 +1,21 @@ + + + + +
+ + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/config/action-servlet.xml b/src/main/webapp/WEB-INF/config/action-servlet.xml new file mode 100644 index 0000000..754db82 --- /dev/null +++ b/src/main/webapp/WEB-INF/config/action-servlet.xml @@ -0,0 +1,44 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/WEB-INF/include/include-body.jspf b/src/main/webapp/WEB-INF/include/include-body.jspf new file mode 100644 index 0000000..899a7c6 --- /dev/null +++ b/src/main/webapp/WEB-INF/include/include-body.jspf @@ -0,0 +1,2 @@ +<%@ page pageEncoding="UTF-8"%> +
\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/include/include-header.jspf b/src/main/webapp/WEB-INF/include/include-header.jspf new file mode 100644 index 0000000..3eac616 --- /dev/null +++ b/src/main/webapp/WEB-INF/include/include-header.jspf @@ -0,0 +1,15 @@ +<%@ page pageEncoding="UTF-8"%> + + + +bloggers + +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="ui" uri="http://egovframework.gov/ctl/ui" %> + + + + + + diff --git a/src/main/webapp/WEB-INF/include/include-pagination.jspf b/src/main/webapp/WEB-INF/include/include-pagination.jspf new file mode 100644 index 0000000..20db3aa --- /dev/null +++ b/src/main/webapp/WEB-INF/include/include-pagination.jspf @@ -0,0 +1,109 @@ + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/board/boardDetail.jsp b/src/main/webapp/WEB-INF/jsp/board/boardDetail.jsp new file mode 100644 index 0000000..6f23d17 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/board/boardDetail.jsp @@ -0,0 +1,88 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + +Insert title here + + + + + + +
+

상세보기

+
+ + + + + + + + + + + + + + + + + + + + + + + +
번호{{vo.idx }}작성일{{vo.creaDtm }}
이름{{vo.creaNm }}조회수{{vo.hitCnt }}
제목{{vo.title }}
+
{{vo.contents }}
+
+ 수정 + 삭제 + 목록 +
+
+
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/board/boardList.jsp b/src/main/webapp/WEB-INF/jsp/board/boardList.jsp new file mode 100644 index 0000000..5f849f1 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/board/boardList.jsp @@ -0,0 +1,129 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + +게시판 목록 + + + + + +<%/* 페이지 처리에 필요한 코드 뭉치 */%> +<%@ include file ="/WEB-INF/include/include-pagination.jspf" %> + + + +
+ +
+ + + + + + + + + + + + + + + + + + +
번호IDX제목이름작성일조회수
{{vo.rnum}}{{vo.idx}}{{vo.title}}{{vo.creaNm}}{{vo.creaDtm}}{{vo.hitCnt}}
+ + +
+
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/board/boardUpdate.jsp b/src/main/webapp/WEB-INF/jsp/board/boardUpdate.jsp new file mode 100644 index 0000000..ffabe43 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/board/boardUpdate.jsp @@ -0,0 +1,135 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + +게시글 수정 + + + + + + +
+

수정하기

+
+ + + + + + + + + + + + + + + + + + + + +
이름 + + <%-- + v-bind:value="" + --%> + +
제목 + +
내용 + +
비밀번호 + +
+ + +
+
+
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/board/boardWrite.jsp b/src/main/webapp/WEB-INF/jsp/board/boardWrite.jsp new file mode 100644 index 0000000..8ad83f2 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/board/boardWrite.jsp @@ -0,0 +1,145 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> + + + + + +게시판 목록 + + + + + + +
+

글쓰기

+
+ + + + + + + + + + + + + + + + + + + + + + + + +
이름 + +
비밀번호 + +
비밀번호 검증 + +
제목 + +
내용 + +
+ + <%-- + v-on:click="aaa()" + @click="aaa()" + --%> + +
+
+
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/member/login.jsp b/src/main/webapp/WEB-INF/jsp/member/login.jsp new file mode 100644 index 0000000..9ddd2f4 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/member/login.jsp @@ -0,0 +1,61 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> + + + + +로그인 +<%@ include file ="/WEB-INF/include/include-header.jspf" %> + + + + +

로그인

+
+ + + + + + + + + + + + +
아이디
비밀번호
+ + +
아이디 또는 비밀번호가 일치하지 않습니다. +
+
+ +
로그아웃되었습니다. +
+
+
+
+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/Test.jsp b/src/main/webapp/WEB-INF/jsp/sample/Test.jsp new file mode 100644 index 0000000..db519ad --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/Test.jsp @@ -0,0 +1,94 @@ +<%@ page language="java" contentType="text/html; charset=EUC-KR" + pageEncoding="EUC-KR"%> + + + + +Insert title here +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file ="/WEB-INF/include/include-header.jspf" %> + + + +

게시판 목록

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
글번호제목
${row.IDX } + ${row.TITLE } + +
조회된 결과가 없습니다.
+ + + + + +
+ 글쓰기 + + <%@ include file="/WEB-INF/include/include-body.jspf" %> + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/Test01.jsp b/src/main/webapp/WEB-INF/jsp/sample/Test01.jsp new file mode 100644 index 0000000..9474e16 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/Test01.jsp @@ -0,0 +1,24 @@ +<%@ page language="java" contentType="text/html; charset=EUC-KR" + pageEncoding="EUC-KR"%> + + + + + + +Insert title here + + + +

+ + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/boardDetail.jsp b/src/main/webapp/WEB-INF/jsp/sample/boardDetail.jsp new file mode 100644 index 0000000..27cca47 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/boardDetail.jsp @@ -0,0 +1,141 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +Insert title here +<%@ include file="/WEB-INF/include/include-header.jspf" %> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시글 상세
글 번호${map.IDX }조회수${map.HIT_CNT }
작성자${map.CREA_ID }작성시간${map.CREA_DTM }
제목${map.TITLE }
${map.CONTENTS }
첨부파일 + + + + + ${row.ORIGINAL_FILE_NAME } + (${row.FILE_SIZE }kb) + + + 첨부된 파일이 없습니다.! + +
+ + + + + + + + + + + + + + + + + + + + + + +
댓글 상세
+ 내용1 + + + 삭제 +
+ 내용2 + + + 삭제 +
댓글 + + +
+ + 목록으로 + 수정하기 + + 댓글쓰기 + + <%@ include file="/WEB-INF/include/include-body.jspf" %> + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/boardList.jsp b/src/main/webapp/WEB-INF/jsp/sample/boardList.jsp new file mode 100644 index 0000000..2b87bba --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/boardList.jsp @@ -0,0 +1,102 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +Insert title here +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ include file ="/WEB-INF/include/include-header.jspf" %> + + + +

게시판 목록

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
글번호제목조회수작성자작성일
${row.IDX } + ${row.TITLE } + + ${row.HIT_CNT }${row.CREA_NM }${row.CREA_DTM }
조회된 결과가 없습니다.
+ + + + + + +
+ 글쓰기 + + <%@ include file="/WEB-INF/include/include-body.jspf" %> + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/boardSearch.jsp b/src/main/webapp/WEB-INF/jsp/sample/boardSearch.jsp new file mode 100644 index 0000000..0fdc17e --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/boardSearch.jsp @@ -0,0 +1,13 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + +Insert title here +<%@ include file="/WEB-INF/include/include-header.jspf" %> + + +HI~ +<%@ include file="/WEB-INF/include/include-body.jspf" %> + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/boardUpdate.jsp b/src/main/webapp/WEB-INF/jsp/sample/boardUpdate.jsp new file mode 100644 index 0000000..fc56409 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/boardUpdate.jsp @@ -0,0 +1,164 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + + +Insert title here +<%@ include file="/WEB-INF/include/include-header.jspf" %> + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
게시글 상세
글 번호 + ${map.IDX } + + 조회수${map.HIT_CNT }
작성자${map.CREA_ID }작성시간${map.CREA_DTM }
제목 + +
+ +
첨부파일 +
+ + + +

+ + ${row.ORIGINAL_FILE_NAME } + + (${row.FILE_SIZE }kb) + 삭제 +

+
+
+ 첨부된 파일이 없습니다! +
+
+
+
+ 파일추가 + 목록으로 + 저장하기 + 삭제하기 + + <%@ include file="/WEB-INF/include/include-body.jspf" %> + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/boardWrite.jsp b/src/main/webapp/WEB-INF/jsp/sample/boardWrite.jsp new file mode 100644 index 0000000..dca4303 --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/boardWrite.jsp @@ -0,0 +1,98 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" + pageEncoding="UTF-8"%> + + + +<%@ include file="/WEB-INF/include/include-header.jspf" %> +Insert title here + + +
+ + + + + + + + + + + + + + + +
게시글 작성
제목
+ +
+ + +
+

+ + 삭제 +

+
+

+ 파일추가 + 작성하기 + 목록으로 +
+ + <%@ include file="/WEB-INF/include/include-body.jspf" %> + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/jsp/sample/kk.jsp b/src/main/webapp/WEB-INF/jsp/sample/kk.jsp new file mode 100644 index 0000000..f5b6daa --- /dev/null +++ b/src/main/webapp/WEB-INF/jsp/sample/kk.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=EUC-KR" + pageEncoding="EUC-KR"%> + + + + +Insert title here + + +kkkk + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/views/home.jsp b/src/main/webapp/WEB-INF/views/home.jsp new file mode 100644 index 0000000..d1f8a0f --- /dev/null +++ b/src/main/webapp/WEB-INF/views/home.jsp @@ -0,0 +1,15 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ page session="false" %> + + + Home + + +

+ Hello world! +

+ +

The time on the server is ${serverTime}.

+ + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..dcf8d39 --- /dev/null +++ b/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,54 @@ + + + + + + /index.jsp + + + + encodingFilter + + org.springframework.web.filter.CharacterEncodingFilter + + + encoding + utf-8 + + + + encodingFilter + / + + + + org.springframework.web.context.ContextLoaderListener + + + + action + + org.springframework.web.servlet.DispatcherServlet + + + contextConfigLocation + + /WEB-INF/config/*-servlet.xml + + + 1 + + + action + / + + + + + + contextConfigLocation + classpath*:config/spring/context-*.xml + + \ No newline at end of file diff --git a/src/main/webapp/index.jsp b/src/main/webapp/index.jsp new file mode 100644 index 0000000..c1f9743 --- /dev/null +++ b/src/main/webapp/index.jsp @@ -0,0 +1,12 @@ +<%@ page language="java" contentType="text/html; charset=EUC-KR" + pageEncoding="EUC-KR"%> + + + + +Insert title here + + + + + \ No newline at end of file diff --git a/src/main/webapp/resources/css/ui.css b/src/main/webapp/resources/css/ui.css new file mode 100644 index 0000000..b9ca9b0 --- /dev/null +++ b/src/main/webapp/resources/css/ui.css @@ -0,0 +1,23 @@ +@CHARSET "UTF-8"; + +a:link, a:visited {text-decoration: none; color: #656565;} + +.board_list {width:100%;border-top:2px solid #252525;border-bottom:1px solid #ccc} +.board_list thead th:first-child{background-image:none} +.board_list thead th {border-bottom:1px solid #ccc;padding:12px 0 13px 0;color:#3b3a3a;vertical-align:middle} +.board_list tbody td {border-top:1px solid #ccc;padding:10px 0;text-align:center;vertical-align:middle} +.board_list tbody tr:first-child td {border:none} +.board_list tbody td.title {text-align:left; padding-left:20px} +.board_list tbody td a {display:inline-block} + +.board_view {width:30%;border-top:2px solid #252525;border-bottom:1px solid #ccc} +.board_view tbody th {text-align:left;background:#f7f7f7;color:#3b3a3a} +.board_view tbody th.list_tit {font-size:13px;color:#000;letter-spacing:0.1px} +.board_view tbody .no_line_b th, .board_view tbody .no_line_b td {border-bottom:none} +.board_view tbody th, .board_view tbody td {padding:15px 0 16px 16px;border-bottom:1px solid #ccc} +.board_view tbody td.view_text {border-top:1px solid #ccc; border-bottom:1px solid #ccc;padding:45px 18px 45px 18px} +.board_view tbody th.th_file {padding:0 0 0 15px; vertical-align:middle} + +.wdp_90 {width:60%} +.btn {border-radius:3px;padding:5px 11px;color:#fff !important; display:inline-block; background-color:#6b9ab8; border:1px solid #56819d;vertical-align:middle} +.pad_5 {padding: 5px} \ No newline at end of file diff --git a/src/main/webapp/resources/js/common.js b/src/main/webapp/resources/js/common.js new file mode 100644 index 0000000..e485ea3 --- /dev/null +++ b/src/main/webapp/resources/js/common.js @@ -0,0 +1,179 @@ +function gfn_isNull(str) { + if (str == null) return true; + if (str == "NaN") return true; + if (new String(str).valueOf() == "undefined") return true; + var chkStr = new String(str); + if( chkStr.valueOf() == "undefined" ) return true; + if (chkStr == null) return true; + if (chkStr.toString().length == 0 ) return true; + return false; +} + +/** + * 공통 서브밋 객체 (Target/Popup 대응 버전) + */ +function ComSubmit(opt_formId) { + this.formId = (typeof opt_formId === "undefined" || opt_formId === null || opt_formId === "") ? "commonForm" : opt_formId; + this.url = ""; + this.target = "_self"; // 기본값은 현재 창 + + var $targetForm = $("#" + this.formId); + + // [1] 초기화: commonForm일 경우 내부를 비우고 target도 기본값으로 리셋 + if ($targetForm.length > 0 && this.formId === "commonForm") { + $targetForm.empty(); + $targetForm.attr("target", "_self"); // 이전 타겟 설정 제거 + } + + this.setUrl = function setUrl(url) { + this.url = url; + }; + + /** + * [2] 타겟 설정 (팝업창 이름이나 _blank 등) + */ + this.setTarget = function setTarget(target) { + this.target = target; + }; + + this.addParam = function addParam(key, value) { + if ($targetForm.length === 0) return; + var $existingParam = $targetForm.find("input[name='" + key + "']"); + + if ($existingParam.length > 0) { + $existingParam.val(value); + } else { + var inputHtml = $("", { type: "hidden", name: key, id: key, value: value }); + $targetForm.append(inputHtml); + } + }; + + /** + * [3] 서버 전송 + */ + this.submit = function submit() { + if ($targetForm.length === 0) return; + + var frm = $targetForm[0]; + if (!this.url) { + alert("전송할 URL이 설정되지 않았습니다."); + return; + } + + frm.action = this.url; + frm.method = "post"; + frm.target = this.target; // 설정된 타겟 적용 + frm.submit(); + }; +} + + var gfv_ajaxCallback = ""; + + function ComAjax(opt_formId) + { + this.url = ""; + this.formId = gfn_isNull(opt_formId) == true?"commonForm":opt_formId; + this.param = ""; + + if(this.formId == "commonForm") + { + var frm = $("#commonForm"); + if(frm.length>0){ + frm.remove(); + } + + var str = "
"; + $('body').append(str); + } + + this.setUrl = function setUrl(url) + { + this.url = url; + }; + + this.setCallback = function setCallback(callBack) + { + fv_ajaxCallback = callBack; + }; + + this.addParam = function addParam(key, value) + { + this.param = this.param + "&" + key + "=" + value; + }; + + this.ajax = function ajax() + { + if(this.formId != "commonForm"){ + this.param += "&" + $("#" + this.formId).serialize(); + } + $.ajax({ + url : this.url, + type : "post", + data : this.param, + async : false, + success : function(data, status){ + if(typeof(fv_ajaxCallback) == "function"){ + fv_ajaxCallback(data); + }else{ + eval(fv_ajaxCallback + "(data);"); + } + } + }); + }; + } + + //페이징 태그부분 + /* + * divId : 페이징 태그가 그려질 div + * pageIndx : 현재 페이지 위치가 저장될 input 태그 id + * recordCount : 페이지당 레코드 수 + * totalCount : 전체 조회 건수 + * eventName : 페이징 하단의 숫자 등의 버튼이 클릭되었을때 호출될 함수 이름 + */ + + var gfv_pageIndex = null; + var gfv_eventName = null; + + function gfn_renderPaging(params) + { + var divId = params.divId; //페이징이 그려질 div id + gfv_pageIndex = params.pageIndex; //현재 위치가 저장될 input 태그 + var totalCount = params.totalCount; //전체 조회 건수 + var currentIndex = $("#"+params.pageIndex).val(); //현재 위치 + if($("#"+params.pageIndex).length == 0 || gfn_isNull(currentIndex) == true){ + currentIndex = 1; + } + + var recordCount = params.recordCount; //페이지당 레코드 수 + if(gfn_isNull(recordCount) == true){ + recordCount = 20; + } + + var totalIndexCount = Math.ceil(totalCount/recordCount); //전체 인덱스 수 + gfn_eventName = params.eventName; + /* + * Math.floor : 소수점 버림 + * Math.ceil : 소수점 올림 + * Math.round : 반올림 + * Math.random : 랜덤함수 + * Math.sqrt : 제곱근 + * Math.pow : 제곱 + * Math.abs : 절대값 + */ + + $("#"+divId).empty(); + var preStr = ""; + var postStr = ""; + var str = ""; + + var first = (parseInt((currentIndex-1)/10)*10) + 1; + var last = (parseInt(totalCount/10)==parseInt(currentIndex/10))?totalIndexCount%10:10; + var prev = (parseInt((currentIndex-1)/10)*10) - 9 > 0 ? (parseInt((currentIndex-1)/10)*10) - 9 : 1; + var next = (parseInt((currentIndex-1)/10)+1) * 10 + 1 < totalIndexCount ? (parseInt((currentIndex-1)/10)+1) * 10 + 1 : totalIndexCount; + + if(totalIndexCount>10){ + preStr += "[<<]" + } + + + } \ No newline at end of file