yjryu / KERIS star
류윤주 2023-10-24
231024 류윤주 front-end 사용자단 커밋
@33f982c13cd8ed33aa8776e76a8a73d9dc3a21e6
 
.gitignore (added)
+++ .gitignore
@@ -0,0 +1,3 @@
+client/build/
+server/logs/
+node_modules
 
Global.js (added)
+++ Global.js
@@ -0,0 +1,17 @@
+const PROJECT_NAME = 'NodeJS Web Server Framework(Vue)';
+const PROJECT_VERSION = '1.0';
+const BASE_DIR = __dirname;
+const LOG_BASE_DIR = `${__dirname}/server/logs`;
+const SERVICE_STATUS = process.env.NODE_ENV;//development, production
+const PORT = 80;
+const API_SERVER_HOST = "localhost:8080";
+
+module.exports = {
+    PROJECT_NAME,
+    PROJECT_VERSION,
+    BASE_DIR,
+    LOG_BASE_DIR,
+    SERVICE_STATUS,
+    PORT,
+    API_SERVER_HOST
+}(No newline at end of file)
 
client/resources/css/Data.css (added)
+++ client/resources/css/Data.css
@@ -0,0 +1,209 @@
+@charset "utf-8";
+.data-main {
+  width: 100%;
+}
+
+.data-b {
+  width: 100%;
+}
+.data-b-b {
+  width: 100%;
+  padding: 6rem;
+  font-size: 3rem;
+  font-family: SBaggroM;
+}
+
+.data-text p {
+  position: relative;
+}
+.data-text p::before {
+  content: "";
+  position: absolute;
+  top: -30px;
+  background-size: 60px 30px;
+  background-image: url("../jpg/data-img-text.png");
+  width: 60px;
+  height: 30px;
+}
+
+.data-b-main {
+  width: 100%;
+}
+
+.data-b-grid {
+  width: 100%;
+  padding: 3rem;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+
+.data-table {
+  width: 100%;
+}
+.da1 {
+  width: 80%;
+  height: 40rem;
+  background-color: #007aff;
+  margin: 0 auto;
+}
+.data-select {
+  width: 50%;
+  float: right;
+  display: flex;
+  justify-content: flex-end;
+  padding: 3rem 6rem;
+}
+
+#data-table-sild {
+  padding: 0.5rem;
+  margin-right: 1rem;
+  border-radius: 0.7rem;
+}
+
+.data-table-tr {
+  padding: 6rem;
+}
+.data-table-tr th {
+  font-size: 1.5rem;
+  background-color: #007aff;
+  color: white;
+  padding: 1.1rem;
+  font-family: "Pretendard-Regular";
+}
+.data-table-tr td {
+  padding: 2rem;
+  border-top: 1px solid rgb(187, 187, 187);
+  text-align: center;
+  font-size: 2rem;
+  font-family: "Pretendard-Regular";
+}
+
+.data-b-1 {
+  background: url(../jpg/data-img.png) no-repeat center center;
+  background-size: contain;
+  position: relative;
+  text-align: center;
+}
+.data-b-1 p {
+  font-size: 2rem;
+  padding: 3rem;
+  padding-top: 5rem;
+  width: 100%;
+  font-family: SBaggroM;
+  text-align: left;
+  color: #014099;
+  cursor: pointer;
+}
+
+.data-b-1 p span {
+  font-size: 3.5rem;
+}
+.data-b-1::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  right: -90px;
+  top: 40%;
+
+  background-color: #e2ecfc;
+  border-radius: 45px;
+  transform: translateX(-50%);
+  z-index: -1;
+}
+.data-b-2 {
+  background: url(../jpg/data-img3.png) no-repeat center center;
+  background-size: contain;
+  position: relative;
+  text-align: center;
+  cursor: pointer;
+}
+.data-b-2 p {
+  font-size: 2rem;
+  padding: 3rem;
+
+  padding-top: 5rem;
+  font-family: SBaggroM;
+  text-align: center;
+  color: #1a8445;
+}
+.data-b-2 p span {
+  font-size: 3.5rem;
+  color: #0e5e2e;
+}
+
+.data-b-3 {
+  background: url(../jpg/data-img2.png) no-repeat center center;
+  background-size: contain;
+  position: relative;
+  text-align: center;
+  cursor: pointer;
+
+  /* border: 1px solid red; */
+}
+.data-b-3::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  left: 0px;
+  top: 40%;
+
+  background-color: #f8e7cd;
+  border-radius: 45px;
+  transform: translateX(-50%);
+  z-index: -1;
+}
+.data-b-3 p {
+  font-size: 2rem;
+  padding: 3rem;
+  padding-top: 5rem;
+  width: 100%;
+
+  font-family: SBaggroM;
+  text-align: right;
+  color: #e07e27;
+}
+.data-b-3 p span {
+  font-size: 3.5rem;
+  color: #c26400;
+}
+
+/* 버튼 서치 */
+.input-group {
+  display: flex;
+  align-items: center;
+}
+
+.input {
+  min-height: 4rem;
+  max-width: 200px;
+  padding: 0.5em 1rem;
+  color: #000000;
+  font-size: 1.5rem;
+  border: 1px solid #007aff;
+  border-radius: 6px 0 0 6px;
+  background-color: transparent;
+}
+
+.button--submit {
+  min-height: 4rem;
+  padding: 0.5em 1em;
+  border: none;
+  border-radius: 0 6px 6px 0;
+  background-color: #007aff;
+  color: #fff;
+  font-size: 15px;
+  cursor: pointer;
+  transition: background-color 0.3s ease-in-out;
+}
+
+.button--submit:hover {
+  background-color: #007aff;
+}
+
+.input:focus,
+.input:focus-visible {
+  border-color: #3898ec;
+  outline: none;
+}
 
client/resources/css/Main.css (added)
+++ client/resources/css/Main.css
@@ -0,0 +1,410 @@
+@charset "utf-8";
+
+table {
+  width: 100%;
+  border-collapse: collapse;
+  padding: 0;
+  border: 0;
+  border-spacing: 0px;
+}
+
+.w1400 {
+  max-width: 1300px;
+  margin: 0 auto;
+  /* overflow-x: hidden */
+  position: relative;
+  clear: both;
+  min-height: inherit;
+}
+
+/* 메뉴 */
+.sub-nav,
+.toggle {
+  opacity: 0;
+}
+.header-wrap {
+  display: flex;
+  justify-content: space-between;
+  box-shadow: 2px 2px 2px #33333300;
+
+  align-items: center;
+  position: relative;
+  flex-wrap: wrap;
+}
+
+.sub-menu {
+  flex: 0 0 72%;
+}
+
+.sub-menu ul {
+  display: flex;
+  justify-content: end;
+}
+.sub-menu ul li a {
+  display: block;
+  color: #2c407f;
+  line-height: 40px;
+  margin-left: 50px;
+  font-size: 1.5rem;
+  text-align: right;
+  font-weight: 600;
+}
+
+/* 메인 */
+.m-b {
+  width: 100%;
+  background: linear-gradient(#425fed, #5dadf6);
+}
+.m-b-b {
+  padding-top: 108px;
+  padding-bottom: 90px;
+  display: flex;
+}
+.m-text {
+  flex: 0 0 39.5%;
+  color: white;
+}
+.m-text p {
+  width: 45rem;
+  margin-top: 15%;
+  font-family: SBaggroM;
+  font-weight: 300 !important;
+  text-shadow: 2px 2px 2px #33333382;
+  font-size: 3rem;
+}
+.m-text span {
+  font-size: 60px;
+  font-weight: 300 !important;
+  text-shadow: 2px 2px 2px #33333382;
+}
+.m-benner {
+  flex: 0 0 60%;
+  height: 365px;
+  background: url(../jpg/main.png) no-repeat;
+  background-size: cover;
+  box-shadow: 2px 2px 4px #33333382;
+}
+
+/* 퍼즐 */
+.m-p {
+  width: 100%;
+  height: 100%;
+  padding: 60px;
+}
+.m-p-container {
+  margin: 0 auto;
+  display: grid;
+  overflow: visible;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+.m-p-container > div:nth-child(4) {
+  position: relative;
+}
+.m-p-container > div:nth-child(4)::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  bottom: -45px;
+  left: 50%;
+  background-color: #009d46;
+  border-radius: 45px;
+  transform: translateX(-50%);
+  z-index: -1;
+}
+.m-p-name {
+  width: 100%;
+  height: 7rem;
+  display: flex;
+  font-family: SBaggroM;
+  background: url(../jpg/notice-banner.png) no-repeat center center;
+  background-size: cover;
+  position: relative;
+}
+.m-p-name::after {
+  position: absolute;
+  content: "";
+  width: 90px;
+  height: 90px;
+  top: -45px;
+  left: 50%;
+  background-color: #3f87f7;
+  border-radius: 45px;
+  transform: translateX(-50%);
+}
+
+.m-p-name h3 {
+  width: 100%;
+  height: 7rem;
+  padding-left: 1rem;
+  line-height: 7rem;
+  font-size: 2.4rem;
+  color: white;
+  background-size: cover;
+  position: relative;
+}
+
+.m-p-name input {
+  border: 0;
+  padding: 1rem;
+  font-family: "Pretendard-Regular";
+  font-size: 1.3rem;
+  font-weight: 800;
+  text-shadow: 2px 2px 2px #33333382;
+  color: white;
+  background-color: #009d4700;
+}
+
+.m-p-table tr {
+  width: 100%;
+  height: 10%;
+  border-top: 1px solid #333;
+}
+
+.m-p-table {
+  overflow: hidden;
+}
+.m-p-table td {
+  padding: 1rem;
+  font-size: 1.5rem;
+  color: #333;
+  font-family: "Pretendard-Regular";
+  font-weight: 700;
+}
+.m-p-table td p {
+  font-size: 1.3rem;
+  padding-top: 1rem;
+  font-family: "Pretendard-Regular";
+  font-weight: 500;
+}
+
+.m-p-c-1 {
+  grid-row: 1 / span 3;
+  border: 1px solid #3f87f7;
+}
+
+.m-p-c-2 {
+  background: url(../jpg/m-2.png) no-repeat;
+  background-size: cover;
+
+  z-index: 1;
+}
+
+.m-p-c-2 div,
+.m-p-c-3 div,
+.m-p-c-4 div,
+.m-p-c-5 div {
+  width: 100%;
+  height: 100%;
+
+  background-size: 123px 123px;
+  margin: 0 auto;
+}
+.m-p-c-2 input,
+.m-p-c-3 input,
+.m-p-c-4 input,
+.m-p-c-5 input {
+  border: 0;
+  font-size: 2.5rem;
+  font-weight: 300;
+  color: white;
+  font-family: SBaggroM;
+  cursor: pointer;
+  text-shadow: 2px 2px 2px #3333335b;
+  background-color: #33333300;
+  text-align: center;
+  width: 100%;
+  padding-bottom: 2.8rem;
+}
+.m-p-c-3 div img {
+  width: 150px !important;
+  text-align: center;
+  margin: 0 auto;
+  padding-top: 5rem;
+  padding-bottom: 2.5rem;
+}
+
+.m-p-c-2 div img,
+.m-p-c-4 div img,
+.m-p-c-5 div img {
+  width: 60px !important;
+  text-align: center;
+  margin: 0 auto;
+  padding-top: 5rem;
+  padding-bottom: 2.5rem;
+}
+
+.m-p-c-3 {
+  background: url(../jpg/m3.png) no-repeat center right;
+  background-size: cover;
+}
+.m-p-c-4 {
+  background: url(../jpg/m4.png) no-repeat;
+}
+.m-p-c-5 {
+  background: url(../jpg/ki.jpg) no-repeat center center;
+  background-size: cover;
+}
+
+/* 메인 홍보/뉴스 */
+
+.m-n {
+  width: 100%;
+  padding: 1rem;
+  background: url(../jpg/123.png) no-repeat center center;
+  background-size: cover;
+}
+.m-n-n {
+  width: 100%;
+  height: 100%;
+  padding: 30px;
+}
+.m-n-hidden {
+  width: 100%;
+  margin: 0 auto;
+}
+.m-n-n h3 {
+  width: 100%;
+  padding: 30px;
+  font-size: 2rem;
+  color: white;
+}
+
+/* 히스토리 */
+.m-h {
+  width: 100%;
+  padding: 3rem;
+  background-color: #ededed;
+}
+.m-h-h {
+  text-align: center;
+}
+.m-h-h h3,
+.m-h-h h1 {
+  text-align: center;
+  font-size: 3rem;
+  padding: 1rem;
+  font-family: SBaggroM;
+}
+.m-h-h h1 {
+  color: #3f87f7;
+}
+
+.m-h-g {
+  width: 100%;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+.m-h-g div {
+  height: 300px;
+}
+
+.m-h-g-1,
+.m-h-g-2,
+.m-h-g-3 {
+  width: 100%;
+  display: flex;
+  flex-wrap: wrap;
+  padding: 6rem;
+  justify-content: center;
+}
+.m-h-g-1 div,
+.m-h-g-2 div,
+.m-h-g-3 div {
+  width: 100%;
+  height: 100%;
+}
+.m-h-g-1 div span,
+.m-h-g-2 div span,
+.m-h-g-3 div span {
+  font-size: 1.8rem;
+  font-family: "Pretendard-Regular";
+}
+.m-h-g-1 p:nth-child(2),
+.m-h-g-2 p:nth-child(2),
+.m-h-g-3 p:nth-child(2) {
+  width: 10rem;
+  margin: 0 auto;
+  justify-content: center;
+
+  background: url(../jpg/m-h-g-1.png) no-repeat;
+  height: 10rem;
+  background-size: contain;
+}
+.m-h-g-1 h3,
+.m-h-g-2 h3,
+.m-h-g-3 h3 {
+  padding: 1rem;
+  font-size: 20px;
+  font-family: "Pretendard-Regular";
+}
+
+.m-h-g-1 p:nth-child(3),
+.m-h-g-2 p:nth-child(3),
+.m-h-g-3 p:nth-child(3) {
+  padding: 1rem;
+  font-size: 3rem;
+  font-family: SBaggroM;
+  color: #09365e;
+}
+
+/* 파트너사 */
+.m-partner {
+  width: 100%;
+  height: 100%;
+}
+.m-pa {
+  width: 100%;
+  padding-top: 60px;
+  margin: 0 auto;
+  text-align: center;
+}
+.m-pa h3,
+.m-pa h1 {
+  text-align: center;
+  font-size: 3rem;
+}
+.m-pa h1 {
+  font-family: SBaggroM;
+
+  color: #3f87f7;
+}
+.m-pa-pa {
+  width: 100%;
+  display: flex;
+  flex-wrap: nowrap;
+  justify-content: space-between;
+}
+.m-pa-logo {
+  width: 20%;
+  height: 16rem;
+  padding: 1.5rem;
+}
+.lo1 {
+  background: url(../jpg/logo/ko-w.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo2 {
+  background: url(../jpg/logo/keris.gif) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo3 {
+  background: url(../jpg/logo/kefa.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo4 {
+  background: url(../jpg/logo/ko-go.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+.lo5 {
+  background: url(../jpg/logo/edutech.png) no-repeat;
+  background-position: center;
+  background-size: 40%;
+}
+/* 스와이퍼--------------------------------------- */
+
+/*--------------------------------------- */
 
client/resources/css/common.css (added)
+++ client/resources/css/common.css
@@ -0,0 +1,45 @@
+@charset "utf-8";
+.flex {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+}
+
+.pad-10 {
+  padding: 10px;
+}
+
+.pad-20 {
+  padding: 20px;
+}
+.pad-30 {
+  padding: 30px;
+}
+
+/* 박스공통 */
+.border-r {
+  border-radius: 2.5rem;
+  box-shadow: 2px 2px 5px #33333333;
+}
+
+.main-content {
+  padding: 60px 0;
+}
+
+/* 자료실 해시태그 */
+.mat-span span {
+  background-color: #d4d4d4;
+  color: rgb(90, 90, 90);
+  padding: 1rem 2rem 1rem 2rem;
+  margin: 0.2rem;
+  border-radius: 0.5rem;
+  font-size: 1.3rem;
+  font-weight: 600;
+  font-family: "Pretendard-Regular";
+}
+
+.mat-span {
+  width: 100%;
+  padding-top: 1rem;
+  box-shadow: 2px 2px 2px #33333300 !important;
+}
 
client/resources/css/header.css (added)
+++ client/resources/css/header.css
@@ -0,0 +1,68 @@
+@charset "utf-8";
+
+/* 헤더 */
+.header {
+  width: 100%;
+  /* height: 4.8rem; */
+  float: right;
+
+  background-color: #063a6d;
+}
+.b1400 {
+  width: 1300px;
+  display: flex;
+  margin: 0 auto;
+  /* border: 1px solid red; */
+  justify-content: flex-end;
+  /* padding-right: 30px 0; */
+}
+
+#input {
+  /* border: 0; */
+  border: 1px solid red;
+  font-size: 1rem;
+  /* background-color: rgba(25, 25, 25, 0); */
+  cursor: pointer;
+  font-family: "Pretendard-Regular";
+
+  color: white;
+}
+.sub-menu ul li span {
+  font-family: "Pretendard-Regular";
+}
+
+.logo {
+  flex: 0 0 25%;
+  font-family: "Pretendard-Regular";
+  transform: translateY(20px);
+  font-size: 2rem;
+  font-weight: 900;
+  /* border: 1px solid red; */
+}
+.logo span {
+  color: #2c407f;
+}
+.login,
+.join {
+  width: 7rem;
+  height: 3rem;
+  /* font-size: 0.5rem; */
+  line-height: 3rem;
+  text-align: right;
+  /* border: 1px solid red; */
+}
+.login i,
+.join i {
+  font-size: 1rem;
+  /* height: 3rem; */
+  /* border: 1px solid red; */
+  margin-right: 0.5rem;
+}
+
+.login::after {
+  content: "";
+  width: 1px;
+  border-right: 1px solid white;
+  margin-left: 10px;
+  /* border: 1px solid #ffffff; */
+}
 
client/resources/css/matching.css (added)
+++ client/resources/css/matching.css
@@ -0,0 +1,168 @@
+.mat-b {
+  width: 100%;
+  background: linear-gradient(#5dadf6, #2e87da, #5dadf6);
+}
+.mat-b-b {
+  padding: 30px 30px;
+  display: flex;
+  align-items: flex-end;
+}
+.mat-b-b div {
+  width: 40%;
+}
+.mat-text {
+  margin: 0 auto;
+  text-align: center;
+  font-size: 5rem;
+  padding-bottom: 50px;
+  font-family: SBaggroM;
+  color: white;
+}
+
+.mat-b-1 {
+  width: 100%;
+  height: 100%;
+  padding: 3rem;
+  margin: 0 auto;
+  text-align: center;
+  color: #3f87f7;
+  background-color: #e2e2e2;
+}
+
+.mat-b-grid > h3 {
+  font-size: 2.6rem;
+  padding: 3rem;
+  font-family: SBaggroM;
+}
+.mat-b-g-g {
+  width: 100%;
+  place-items: center;
+  margin: 0 auto;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+}
+.g1 {
+  width: 90%;
+  padding: 2rem;
+}
+.g1 h3 {
+  padding: 1rem;
+  font-size: 2rem;
+  color: #3f87f7;
+  font-family: "Pretendard-Regular";
+}
+.g1 img {
+  /* padding: 2rem; */
+  height: 119px;
+  width: 80%;
+  margin: 0 auto;
+  object-fit: contain;
+}
+.g1 p:nth-child(3) {
+  text-align: left;
+  color: #333;
+  font-size: 1.5rem;
+  padding: 1rem;
+}
+.g1 p:nth-child(4) {
+  text-align: right;
+  font-size: 1.5rem;
+  color: #333;
+
+  padding: 1rem;
+}
+.g1 div {
+  padding: 1rem;
+  background-color: #ffffff;
+  box-shadow: 2px 2px 2px #33333332;
+  position: relative;
+}
+.g1 div:nth-child(1):before {
+  position: absolute;
+  content: "AA등급";
+  line-height: 40px;
+  color: white;
+  font-size: 1.5rem;
+  font-weight: 800;
+  width: 90px;
+  height: 40px;
+  top: -25px;
+  right: -5%;
+  background-color: #3f87f7;
+  border-radius: 45px;
+  transform: translateX(-50%);
+}
+.g1-1 {
+  display: flex;
+  box-shadow: 0px 0px 0px white !important;
+  flex-direction: row;
+  justify-content: flex-end;
+}
+.g1-1 p {
+  text-align: right;
+  font-size: 1.5rem;
+  padding: 1rem;
+  color: rgb(6, 6, 6);
+}
+.g-2 {
+  text-align: right;
+  font-size: 1.3rem;
+  padding: 1rem;
+  font-weight: 700;
+  color: rgb(6, 6, 6);
+}
+.g-2 span {
+  font-weight: 400;
+}
+.mat-sec-a {
+  width: 100%;
+  margin: 0 auto;
+}
+.mat-sec-a-1 {
+  width: 100%;
+  display: grid;
+  grid-template-columns: 1fr 1fr 1fr;
+  margin: 0 auto;
+  place-items: center;
+
+  padding: 3rem;
+}
+
+.mat-sec-b {
+  padding: 2rem;
+  margin: 1rem;
+  background-color: #f9f9f9;
+  box-shadow: 2px 2px 5px #33333332;
+}
+
+.mat-sec-b div {
+  display: flex;
+  flex-wrap: wrap;
+}
+
+.mat-sec-b h5 {
+  width: 100%;
+  font-size: 1.5rem;
+  font-family: "Pretendard-Regular";
+}
+
+.mat-sec-b p {
+  width: 100%;
+  font-size: 1.5rem;
+  text-align: right;
+  justify-content: right;
+  font-family: "Pretendard-Regular";
+}
+
+.mat-2 {
+  width: 100%;
+
+  display: flex;
+  padding: 1.5rem 0px;
+  flex-wrap: nowrap;
+  justify-content: flex-end;
+  flex-direction: row !important;
+}
+.mat-2 p {
+  width: 25%;
+}
 
client/resources/css/reset.css (added)
+++ client/resources/css/reset.css
@@ -0,0 +1,66 @@
+@charset "utf-8";
+
+@font-face {
+  font-family: "SBAggroB";
+  src: url("https://cdn.jsdelivr.net/gh/projectnoonnu/noonfonts_2108@1.1/SBAggroB.woff")
+    format("woff");
+  /* font-weight: normal; */
+  font-style: normal;
+}
+
+@font-face {
+  font-family: "Pretendard-Regular";
+  src: url("https://cdn.jsdelivr.net/gh/Project-Noonnu/noonfonts_2107@1.1/Pretendard-Regular.woff")
+    format("woff");
+  font-weight: 400;
+  font-style: normal;
+}
+@font-face {
+  font-family: SBaggroM;
+  src: url(../font/SBaggroM.ttf);
+}
+@font-face {
+  font-family: SBaggrol;
+  src: url(../font/SBaggroL.ttf);
+}
+
+* {
+  margin: 0;
+  padding: 0;
+  box-sizing: border-box;
+}
+
+html {
+  font-size: 10px;
+  width: 100%;
+  height: 100%;
+  font-family: "Pretendard-Regular";
+
+  overflow-x: hidden;
+  overflow-y: scroll;
+}
+
+body {
+  width: 100%;
+  height: 100%;
+}
+
+ul,
+ol,
+li {
+  list-style: none;
+}
+
+a {
+  color: #333;
+  text-decoration: none;
+}
+
+button {
+  border: none;
+}
+
+img {
+  display: block;
+  width: 100%;
+}
 
client/resources/css/responsive.css (added)
+++ client/resources/css/responsive.css
@@ -0,0 +1,720 @@
+@media all and (min-width: 1023px) and (max-width: 1268px){
+  .data-b-1 p span,.data-b-3 p span{
+    font-size: 2.5rem;
+  }
+  .data-b-1 p span,.data-b-3 p span,.data-b-2 p span{
+    border: 1px solid red;
+    padding: 2rem;
+  }
+  .m-benner{
+    flex: 0 0 52%;
+
+  }
+  .m-text p{
+    padding: 2rem;
+  }
+  .logo span{
+    padding: 2rem;
+  }
+  .b1400 {
+    width: 85%;
+    padding: 1rem;
+  }
+ 
+}
+
+
+/* 테블릿 세로*/
+@media all and (min-width: 768px) and (max-width: 1023px) {
+ 
+  html {
+    font-size: 8px;
+    overflow-x: hidden;
+  }
+
+  .w1400 {
+    max-width: 100%;
+  }
+  .sub-nav,
+  .toggle {
+    opacity: 1;
+  }
+
+  .b1400 {
+    width: 85%;
+    padding: 1rem;
+  }
+  #input {
+    font-size: 1.5rem;
+  }
+  .login,
+  .join {
+    width: 11rem;
+    margin-right: 1rem;
+  }
+  .login i,
+  .join i {
+    font-size: 13px !important;
+  }
+  .logo {
+    flex: 0 0 80%;
+    /* padding: 3rem; */
+    transform: translateY(0px);
+  }
+  .logo span {
+    margin-left: 2rem;
+    font-size: 3rem;
+  }
+  .fa-solid {
+    font-size: 3rem !important;
+  }
+  /* 햄버거 */
+  .mobile1 {
+    flex: 0 0 10%;
+    text-align: center;
+    font-size: 3rem;
+    color: #2c407f;
+  }
+  .sub-nav {
+    height: 100%;
+    opacity: 1;
+  }
+  .header-wrap {
+    padding: 3rem;
+    justify-content: center;
+  }
+  .logo {
+    flex: 0 0 90%;
+  }
+  .logo span {
+    font-family: "Pretendard-Regular";
+    width: 100%;
+    text-align: center;
+    font-size: 3rem;
+    flex: 0 0 90%;
+  }
+  .logo-toggle {
+    width: 100%;
+    display: flex;
+  }
+  .toggle {
+    flex: 0 0 6%;
+    display: block;
+  }
+  .data-b-1 p span{
+    font-size: 2.5rem;
+  }
+
+  .main-menu-1 {
+    display: none !important;
+  }
+  .main-sub-menu {
+    /* width: 100%; */
+    flex: 0 0 100% !important;
+    flex-direction: column;
+    justify-content: end;
+    list-style: none;
+    padding: 5rem;
+    display: none;
+  }
+  .main-sub-menu.open {
+    display: block;
+  }
+  .main-sub-menu li {
+    padding: 1rem;
+  }
+  .accordion-header {
+    cursor: pointer;
+    padding: 10px;
+    text-align: center;
+    font-size: 2rem;
+    font-family: "Pretendard-Regular";
+    font-weight: 700;
+    color: #2c407f;
+  }
+  .accordion-header li {
+    padding: 1rem;
+  }
+
+  .accordion-header.active {
+    padding: 1rem;
+    background-color: #ffffff;
+  }
+
+  .main-sub-menu-sb {
+    list-style: none;
+    padding: 1rem;
+    margin: 0;
+    text-align: center;
+    font-size: 1.5rem;
+    font-family: "Pretendard-Regular";
+  }
+  .main-sub-menu-sb li {
+    padding: 1rem;
+    color: #2c407f;
+  }
+
+  .router-link {
+    text-decoration: none;
+    color: #333;
+    display: block;
+    padding: 10px;
+    transition: background-color 0.3s;
+  }
+
+  .router-link:hover {
+    background-color: #e0e0e0;
+  }
+  /* 햄버거 끝! */
+  .m-b {
+    height: auto;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 0;
+    height: 40rem;
+    padding: 2rem;
+  }
+  .m-benner {
+    flex: 100%;
+  }
+  ul.main-menu > li > a {
+    padding: 21px;
+  }
+  .main-content {
+    padding: 40px 0;
+  }
+
+  .m-text {
+    flex: 100%;
+    height: 20rem;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 5rem;
+    height: 60rem;
+  }
+  .m-text p {
+    width: 100%;
+    padding-top: 5rem;
+    margin-top: 0;
+  }
+  .m-text p span {
+    text-align: center;
+    font-size: 5rem;
+  }
+  .m-benner {
+    height: 50px;
+    padding: 16rem;
+    background-size: contain;
+    box-shadow: 0 0 0;
+  }
+  .m-p-container {
+    grid-template-columns: 1fr;
+  }
+  .m-p-c-3 {
+    background: url(../jpg/m3-1.png) no-repeat;
+    background-size: cover;
+  }
+  .m-n-hidden {
+    width: 100%;
+  }
+  .swiper {
+    width: 100%;
+  }
+  .swiper-slide {
+    width: 1000px;
+  }
+
+  /* 매칭서비스 */
+  .mat-b-g-g {
+    width: 100%;
+    grid-template-columns: 1fr 1fr;
+  }
+  .mat-sec-a-1 {
+    grid-template-columns: 1fr 1fr;
+  }
+  .mat-sec-b {
+    width: 90%;
+  }
+  /* 자료집 */
+  .data-b-1 p,
+  .data-b-2 p,
+  .data-b-3 p {
+    margin-top: 5rem;
+  }
+  .data-b-1 p span,
+  .data-b-2 p span,
+  .data-b-3 p span {
+    font-size: 2.5rem;
+  }
+  .data-b-1::after,
+  .data-b-3::after {
+    width: 60px;
+    height: 60px;
+  }
+  .data-b-1::after {
+    right: -60px;
+  }
+  .data-b-1 p span {
+    font-size: 2.5rem;
+  }
+  .mat-text {
+    font-size: 3rem;
+  }
+}
+/* 모바일 가로, 테블릿 세로 */
+@media all and (min-width: 480px) and (max-width: 767px) {
+  .w1400 {
+    max-width: 100%;
+    overflow-x: hidden;
+  }
+  .sub-nav,
+  .toggle {
+    opacity: 1;
+  }
+  .b1400 {
+    width: 90%;
+    padding: 1rem;
+  }
+  .da1 {
+    width: 100%;
+    margin-top: 20px;
+  }
+  /* 햄버거 */
+  .header-wrap {
+    padding: 3rem;
+    justify-content: center;
+  }
+  .sub-nav {
+    height: 100%;
+    opacity: 1;
+  }
+  .logo {
+    flex: 0 0 90%;
+    transform: translateY(0px);
+  }
+  .logo span {
+    font-family: "Pretendard-Regular";
+    width: 100%;
+    text-align: center;
+    font-size: 2rem;
+    flex: 0 0 90%;
+  }
+  .logo-toggle {
+    width: 100%;
+    display: flex;
+  }
+  .toggle {
+    flex: 0 0 6%;
+    display: block;
+  }
+
+  .main-menu-1 {
+    display: none !important;
+  }
+  .main-sub-menu {
+    flex: 0 0 100% !important;
+    flex-direction: column;
+    justify-content: end;
+    list-style: none;
+    padding: 5rem;
+    display: none;
+  }
+  .main-sub-menu.open {
+    display: block;/
+  }
+  .main-sub-menu li {
+    padding: 1rem;
+  }
+  .accordion-header {
+    cursor: pointer;
+    padding: 10px;
+    text-align: center;
+    font-size: 2rem;
+    font-family: "Pretendard-Regular";
+    font-weight: 700;
+    color: #2c407f;
+  }
+  .accordion-header li {
+    padding: 1rem;
+  }
+
+  .accordion-header.active {
+    padding: 1rem;
+    background-color: #ffffff;
+  }
+
+  .main-sub-menu-sb {
+    list-style: none;
+    padding: 1rem;
+    margin: 0;
+    text-align: center;
+    font-size: 1.5rem;
+    font-family: "Pretendard-Regular";
+  }
+  .main-sub-menu-sb li {
+    padding: 1rem;
+    color: #2c407f;
+  }
+
+  .router-link {
+    text-decoration: none;
+    color: #333;
+    display: block;
+    padding: 10px;
+    transition: background-color 0.3s;
+  }
+
+  .router-link:hover {
+    background-color: #e0e0e0;
+  }
+  /* 햄버거 끝! */
+  .mobile1 {
+    flex: 0 0 10%;
+    text-align: center;
+    font-size: 3rem;
+    color: #2c407f;
+  }
+  .m-text p {
+    font-size: 1rem;
+  }
+  .m-text {
+    display: none;
+  }
+  .m-text p {
+    font-size: 1rem;
+  }
+  .m-b {
+    background: url(../jpg/main.png) no-repeat center center;
+    background-size: cover;
+    height: auto;
+  }
+  .m-text span {
+    font-size: 25px;
+  }
+  .logo {
+    flex: 0 0 90%;
+  }
+  .m-p {
+    padding: 3rem;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 0;
+    height: 40rem;
+    padding: 2rem;
+  }
+  .m-benner {
+    display: none;
+  }
+  .m-p-container {
+    grid-template-columns: 1fr;
+  }
+  .m-h-g {
+    grid-template-columns: 1fr;
+  }
+  .m-pa-pa {
+    width: 100%;
+    flex-direction: column;
+  }
+  .m-pa-pa div {
+    justify-content: center;
+  }
+  .m-p-c-3 {
+    background: url(../jpg/m3-1.png) no-repeat;
+    background-size: cover;
+  }
+  .m-pa-logo {
+    width: 100%;
+    align-items: center;
+    height: 5rem;
+    margin: 2rem;
+  }
+
+  .lo1,
+  .lo2,
+  .lo3,
+  .lo4,
+  .lo5 {
+    background-size: contain;
+  }
+  /* 매칭서비스 */
+  .mat-b-g-g {
+    grid-template-columns: 1fr;
+  }
+  .mat-sec-a-1 {
+    grid-template-columns: 1fr;
+  }
+  .mat-sec-b {
+    width: 90%;
+  }
+  .mat-text {
+    font-size: 3rem;
+  }
+  /* 자료집 */
+  .data-main {
+    width: 100%;
+  }
+  .data-b-grid {
+    grid-template-columns: 1fr;
+  }
+  .data-b-b {
+    padding: 4rem;
+    text-align: center;
+  }
+  .data-b-1 p {
+    font-size: 2rem;
+    padding: 3rem;
+    padding-top: 5rem;
+    width: 50%;
+    font-family: SBaggroM;
+    text-align: left;
+    color: #014099;
+    margin: 0 auto;
+    cursor: pointer;
+  }
+  .data-b-3 p {
+    font-size: 2rem;
+    padding: 3rem;
+    padding-top: 5rem;
+    width: 50%;
+    margin: 0 auto;
+    cursor: pointer;
+    font-family: SBaggroM;
+    text-align: right;
+    color: #e07e27;
+  }
+  .data-b-1 p span {
+    font-size: 2.5rem;
+  }
+  .data-b-3::after,
+  .data-b-1::after {
+    display: none;
+  }
+}
+
+/* 모바일 가로, 테블릿 세로 */
+@media all and (max-width: 479px) {
+  .w1400 {
+    margin: 0 auto;
+    max-width: 100%;
+    overflow-x: hidden;
+  }
+
+  .sub-nav,
+  .toggle {
+    opacity: 1;
+  }
+  .b1400 {
+    width: 90%;
+    padding: 1rem;
+  }
+
+  .header-wrap {
+    padding: 3rem;
+    flex-direction: column;
+    box-shadow: 2px 2px 2px #3333330e;
+  }
+  .logo-toggle {
+    width: 100%;
+    display: flex;
+  }
+  .logo {
+    flex: 0 0 80%;
+    transform: translateY(0px);
+  }
+  .logo span {
+    font-family: "Pretendard-Regular";
+    width: 100%;
+    text-align: center;
+    font-size: 2.6rem;
+    flex: 0 0 90%;
+    margin: 1rem;
+    /* border: 1px solid red; */
+  }
+  .mobile1 {
+    flex: 0 0 10%;
+    text-align: center;
+    font-size: 3rem;
+    color: #2c407f;
+    /* border: 1px solid red; */
+  }
+  /* 메뉴 반응형 */
+  .sub-nav {
+    position: relative;
+    height: 100%;
+    opacity: 1;
+  }
+
+  .toggle {
+    flex: 0 0 6%;
+    display: block;
+    height: 10px;
+ 
+  }
+
+  .main-menu-1 {
+    display: none !important;
+  }
+  .main-sub-menu {
+    flex: 0 0 100% !important;
+    flex-direction: column;
+    justify-content: end;
+    list-style: none;
+    padding: 5rem;
+    display: none;
+  }
+  .main-sub-menu.open {
+    display: block;
+  }
+  .m-text {
+    display: none;
+  }
+  .m-text p {
+    font-size: 1rem;
+  }
+  .m-b {
+    background: url(../jpg/main.png) no-repeat center center;
+    background-size: cover;
+    height: auto;
+  }
+  .m-text span {
+    font-size: 25px;
+  }
+
+  .m-p {
+    padding: 3rem;
+  }
+  .m-b-b {
+    flex-direction: column;
+    padding-top: 0;
+    height: 40rem;
+  }
+  .m-benner {
+    width: 100%;
+    flex: 100%;
+    background-size: cover;
+    box-shadow: 0px 0px 0px;
+    display: none;
+  }
+  .m-p-container {
+    grid-template-columns: 1fr;
+  }
+  .m-h-g {
+    grid-template-columns: 1fr;
+  }
+  .m-pa-pa {
+    width: 100%;
+    flex-direction: column;
+  }
+  .m-pa-pa div {
+    justify-content: center;
+  }
+  .m-p-c-3 {
+    background: url(../jpg/m3-1.png) no-repeat;
+    background-size: cover;
+  }
+  .m-pa-logo {
+    width: 100%;
+    align-items: center;
+    height: 5rem;
+    margin: 2rem;
+  }
+  .lo1,
+  .lo2,
+  .lo3,
+  .lo4,
+  .lo5 {
+    background-size: contain;
+  }
+  .call p {
+    flex: 0 0 100%;
+  }
+  .call img {
+    flex-direction: column;
+    margin-top: 30px;
+    margin-left: -213px;
+  }
+  /* 매칭서비스 */
+  .mat-b-g-g {
+    grid-template-columns: 1fr;
+  }
+  .mat-sec-a-1 {
+    grid-template-columns: 1fr;
+    width: 100%;
+  }
+  .mat-text {
+    display: none;
+    font-size: 2rem;
+  }
+
+  /* 자료집 */
+  .data-main {
+    width: 100%;
+  }
+  .data-b-grid {
+    grid-template-columns: 1fr;
+  }
+  .data-b-b {
+    padding: 4rem;
+    text-align: center;
+  }
+
+  .main-sub-menu li {
+    padding: 1rem;
+  }
+  .accordion-header {
+    cursor: pointer;
+    padding: 10px;
+    text-align: center;
+    font-size: 2rem;
+    font-family: "Pretendard-Regular";
+    font-weight: 700;
+    color: #2c407f;
+  }
+  .accordion-header li {
+    padding: 1rem;
+  }
+
+  .accordion-header.active {
+    padding: 1rem;
+    background-color: #ffffff;
+  }
+
+  .main-sub-menu-sb {
+    list-style: none;
+    padding: 1rem;
+    margin: 0;
+    text-align: center;
+    font-size: 1.5rem;
+    font-family: "Pretendard-Regular";
+  }
+  .main-sub-menu-sb li {
+    padding: 1rem;
+    color: #2c407f;
+  }
+
+  .router-link {
+    text-decoration: none;
+    color: #333;
+    display: block;
+    padding: 10px;
+    transition: background-color 0.3s;
+  }
+
+  .router-link:hover {
+    background-color: #e0e0e0;
+  }
+  .data-b-1 p span {
+    font-size: 2.5rem;
+  }
+
+  .data-select {
+    width: 100%;
+    flex-direction: column;
+  }
+  .data-table-tr {
+    width: 100%;
+  }
+}
 
client/resources/font/SBaggroB.ttf (Binary) (added)
+++ client/resources/font/SBaggroB.ttf
Binary file is not shown
 
client/resources/font/SBaggroL.ttf (Binary) (added)
+++ client/resources/font/SBaggroL.ttf
Binary file is not shown
 
client/resources/font/SBaggroM.ttf (Binary) (added)
+++ client/resources/font/SBaggroM.ttf
Binary file is not shown
 
client/resources/jpg/123.png (Binary) (added)
+++ client/resources/jpg/123.png
Binary file is not shown
 
client/resources/jpg/PNG/hss자산 5dfd.png (Binary) (added)
+++ client/resources/jpg/PNG/hss자산 5dfd.png
Binary file is not shown
 
client/resources/jpg/PNG/ps4301.tmp (added)
+++ client/resources/jpg/PNG/ps4301.tmp
@@ -0,0 +1,0 @@
 
client/resources/jpg/data-img-text.png (Binary) (added)
+++ client/resources/jpg/data-img-text.png
Binary file is not shown
 
client/resources/jpg/data-img.png (Binary) (added)
+++ client/resources/jpg/data-img.png
Binary file is not shown
 
client/resources/jpg/data-img2.png (Binary) (added)
+++ client/resources/jpg/data-img2.png
Binary file is not shown
 
client/resources/jpg/data-img3.png (Binary) (added)
+++ client/resources/jpg/data-img3.png
Binary file is not shown
 
client/resources/jpg/fille.png (Binary) (added)
+++ client/resources/jpg/fille.png
Binary file is not shown
 
client/resources/jpg/hss자산 14dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 14dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 15dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 15dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 16dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 16dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 17dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 17dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 19dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 19dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 20dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 20dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 21dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 21dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 23dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 23dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 2dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 2dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 4dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 4dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 6dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 6dfd.png
Binary file is not shown
 
client/resources/jpg/hss자산 8dfd.png (Binary) (added)
+++ client/resources/jpg/hss자산 8dfd.png
Binary file is not shown
 
client/resources/jpg/ki-i.png (Binary) (added)
+++ client/resources/jpg/ki-i.png
Binary file is not shown
 
client/resources/jpg/ki.jpg (Binary) (added)
+++ client/resources/jpg/ki.jpg
Binary file is not shown
 
client/resources/jpg/logo/edutech.png (Binary) (added)
+++ client/resources/jpg/logo/edutech.png
Binary file is not shown
 
client/resources/jpg/logo/kefa.png (Binary) (added)
+++ client/resources/jpg/logo/kefa.png
Binary file is not shown
 
client/resources/jpg/logo/keris.gif (Binary) (added)
+++ client/resources/jpg/logo/keris.gif
Binary file is not shown
 
client/resources/jpg/logo/ketis.png (Binary) (added)
+++ client/resources/jpg/logo/ketis.png
Binary file is not shown
 
client/resources/jpg/logo/ko-go.jpg (Binary) (added)
+++ client/resources/jpg/logo/ko-go.jpg
Binary file is not shown
 
client/resources/jpg/logo/ko-go.png (Binary) (added)
+++ client/resources/jpg/logo/ko-go.png
Binary file is not shown
 
client/resources/jpg/logo/ko-w.png (Binary) (added)
+++ client/resources/jpg/logo/ko-w.png
Binary file is not shown
 
client/resources/jpg/logo/ko.png (Binary) (added)
+++ client/resources/jpg/logo/ko.png
Binary file is not shown
 
client/resources/jpg/m-1.png (Binary) (added)
+++ client/resources/jpg/m-1.png
Binary file is not shown
 
client/resources/jpg/m-2.png (Binary) (added)
+++ client/resources/jpg/m-2.png
Binary file is not shown
 
client/resources/jpg/m-h-g-1.png (Binary) (added)
+++ client/resources/jpg/m-h-g-1.png
Binary file is not shown
 
client/resources/jpg/m-h-g-3.png (Binary) (added)
+++ client/resources/jpg/m-h-g-3.png
Binary file is not shown
 
client/resources/jpg/m-h-g.png (Binary) (added)
+++ client/resources/jpg/m-h-g.png
Binary file is not shown
 
client/resources/jpg/m-p-ai.png (Binary) (added)
+++ client/resources/jpg/m-p-ai.png
Binary file is not shown
 
client/resources/jpg/m-p-ai2.png (Binary) (added)
+++ client/resources/jpg/m-p-ai2.png
Binary file is not shown
 
client/resources/jpg/m-p-ai3.png (Binary) (added)
+++ client/resources/jpg/m-p-ai3.png
Binary file is not shown
 
client/resources/jpg/m-w.png (Binary) (added)
+++ client/resources/jpg/m-w.png
Binary file is not shown
 
client/resources/jpg/m2.png (Binary) (added)
+++ client/resources/jpg/m2.png
Binary file is not shown
 
client/resources/jpg/m3-1.png (Binary) (added)
+++ client/resources/jpg/m3-1.png
Binary file is not shown
 
client/resources/jpg/m3.png (Binary) (added)
+++ client/resources/jpg/m3.png
Binary file is not shown
 
client/resources/jpg/m4.png (Binary) (added)
+++ client/resources/jpg/m4.png
Binary file is not shown
 
client/resources/jpg/main.png (Binary) (added)
+++ client/resources/jpg/main.png
Binary file is not shown
 
client/resources/jpg/mat-img.png (Binary) (added)
+++ client/resources/jpg/mat-img.png
Binary file is not shown
 
client/resources/jpg/mat-img1.png (Binary) (added)
+++ client/resources/jpg/mat-img1.png
Binary file is not shown
 
client/resources/jpg/moc.png (Binary) (added)
+++ client/resources/jpg/moc.png
Binary file is not shown
 
client/resources/jpg/notice-banner.png (Binary) (added)
+++ client/resources/jpg/notice-banner.png
Binary file is not shown
 
client/resources/jpg/swiper.png (Binary) (added)
+++ client/resources/jpg/swiper.png
Binary file is not shown
 
client/resources/jpg/swiper2.png (Binary) (added)
+++ client/resources/jpg/swiper2.png
Binary file is not shown
 
client/resources/jpg/zigaksa.jpg (Binary) (added)
+++ client/resources/jpg/zigaksa.jpg
Binary file is not shown
 
client/views/component/test/TestCompoent.vue (added)
+++ client/views/component/test/TestCompoent.vue
@@ -0,0 +1,24 @@
+<template>
+    <div>TestCompoent.vue</div>
+</template>
+
+<script>
+export default {
+    data () {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('TestCompoent mounted');
+    }
+}
+</script>(No newline at end of file)
 
client/views/index.html (added)
+++ client/views/index.html
@@ -0,0 +1,35 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <meta charset="UTF-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
+    <meta name="viewport" content="width=device-width, initial-scale=1">
+    <meta name="description" content="Node Vue Web">
+    <link rel="icon" href="" />
+    <link rel="stylesheet" href="/client/resources/css/Main.css">
+    <link rel="stylesheet" href="/client/resources/css/reset.css">
+    <link rel="stylesheet" href="/client/resources/css/common.css">
+    <link rel="stylesheet" href="/client/resources/css/footer.css">
+    <link rel="stylesheet" href="/client/resources/css/header.css">
+    <link rel="stylesheet" href="/client/resources/css/matching.css">
+    <link rel="stylesheet" href="/client/resources/css/Data.css">
+    <link rel="stylesheet" href="/client/resources/css/responsive.css">
+
+    <script src="https://kit.fontawesome.com/9f862d56b3.js" crossorigin="anonymous"></script>
+
+    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
+    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
+
+    <title>KERIS</title>
+
+
+</head>
+
+<body>
+    <div id="root"></div>
+    <script src="/client/build/bundle.js"></script>
+</body>
+
+</html>(No newline at end of file)
 
client/views/index.js (added)
+++ client/views/index.js
@@ -0,0 +1,13 @@
+/**
+ * @author : 최정우
+ * @since : 2022.10.19
+ * @dscription : Vue를 활용한 Client단 구현의 시작점(Index) Component 입니다.
+ */
+import { createApp } from 'vue';
+
+import AppRouter from './pages/AppRouter.js';
+import App from './pages/App.vue';
+
+const vue = createApp(App).use(AppRouter).mount('#root');
+
+
 
client/views/layout/Header.vue (added)
+++ client/views/layout/Header.vue
@@ -0,0 +1,58 @@
+<template>
+    <div class="header">
+        <div class="b1400">
+
+            <div class="login">
+                <i class="fa-solid fa-user fa-lg" style="color: #ffffff;"></i>
+                <router-link to="/Login.page"><input type="button" value="로그인" name="" id="input"></router-link>
+
+            </div>
+
+            <div class="join">
+                <i class="fa-solid fa-user-plus fa-lg" style="color: #ffffff;"></i>
+                <router-link to="/Join.page"><input type="button" value="회원가입" name="" id="input"></router-link>
+            </div>
+            <Menu class="menu" :isActive="isActive"></Menu>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Header mounted');
+    }
+}
+</script>
+<style scoped>
+.header {
+    width: 100%;
+    /* height: 40px; */
+    display: flex;
+    justify-content: flex-end;
+    padding: 0.5rem;
+    float: right;
+    background-color: #3f87f7;
+    /* border: 1px solid red; */
+}
+
+#input {
+    border: 0;
+    background-color: rgba(240, 248, 255, 0);
+    cursor: pointer;
+    color: white;
+}
+</style>(No newline at end of file)
 
client/views/layout/Menu copy.vue (added)
+++ client/views/layout/Menu copy.vue
@@ -0,0 +1,284 @@
+<template>
+    <div class="w1400 header-wrap">
+        <div class="logo">
+            <router-link to="/"><span>AI 디지털교과서 통합지원센터</span></router-link>
+        </div>
+        <header>
+            <nav>
+                <ul class="clearfix">
+                    <li @mouseenter="toggleSubMenu" @mouseleave="toggleSubMenu">통합지원센터 소개
+                        <ul v-if="showSubMenu">
+                            <li>통합지원센터란?</li>
+                            <li>협력 기업</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">자료실
+                        <ul>
+                            <li>기술문서</li>
+                            <li>자료집</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">내트워킹
+                        <ul>
+                            <li>기업 홍보관</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">커뮤니티
+                        <ul>
+                            <li>공지사항</li>
+                            <li>홍보/뉴스</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+                <ul class="clearfix">
+                    <li @mouseenter="expandHeader" @mouseleave="collapseHeader">마이페이지
+                        <ul>
+                            <li>내 정보 수정</li>
+                            <li>매칭 관리</li>
+                        </ul>
+                    </li>
+                    <!-- Add more menu items here -->
+                </ul>
+            </nav>
+        </header>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            showSubMenu: false,
+        }
+    },
+    methods: {
+        toggleSubMenu() {
+            this.showSubMenu = !this.showSubMenu;
+        },
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Menu mounted');
+    }
+}
+</script>
+
+<style scoped>
+.sub-menu {
+    width: 100%;
+}
+
+header {
+    display: flex
+}
+
+
+/*  폰트 적용 */
+@import url(//fonts.googleapis.com/earlyaccess/notosanskr.css);
+
+html {
+    font-family: "Noto Sans KR", sans-serif;
+}
+
+/* 노말라이즈 */
+body,
+ul,
+li,
+h1 {
+    margin: 0;
+    padding: 0;
+    list-style: none;
+}
+
+a {
+    color: inherit;
+    text-decoration: none;
+}
+
+/* 라이브러리 */
+.con {
+    margin: 0 auto;
+}
+
+.img-box>img {
+    width: 100%;
+    display: block;
+}
+
+.row::after {
+    content: "";
+    display: block;
+    clear: both;
+}
+
+.cell {
+    float: left;
+    box-sizing: border-box;
+}
+
+.cell-right {
+    float: right;
+    box-sizing: border-box;
+}
+
+.margin-0-auto {
+    margin: 0 auto;
+}
+
+.block {
+    display: block;
+}
+
+.inline-block {
+    display: inline-block;
+}
+
+.text-align-center {
+    text-align: center;
+}
+
+.line-height-0-ch-only {
+    line-height: 0;
+}
+
+.line-height-0-ch-only>* {
+    line-height: normal;
+}
+
+.relative {
+    position: relative;
+}
+
+.absolute-left {
+    position: absolute;
+    left: 0;
+}
+
+.absolute-right {
+    position: absolute;
+    right: 0;
+}
+
+.absolute-middle {
+    position: absolute;
+    top: 50%;
+    transform: translateY(-50%);
+}
+
+.width-100p {
+    width: 100%;
+}
+
+.table {
+    display: table;
+}
+
+.table-cell {
+    display: table-cell;
+}
+
+.vertical-align-top {
+    vertical-align: top;
+}
+
+.vertical-align-middle {
+    vertical-align: middle;
+}
+
+.vertical-align-bottom {
+    vertical-align: bottom;
+}
+
+/* 커스텀 */
+
+.con {
+    width: 1180px;
+}
+
+.con-min-width {
+    min-width: 1180px;
+}
+
+/* 반응형 레이아웃 */
+/*
+.con {
+    max-width:1150px;
+}
+
+.con-min-width {
+    min-width:320px;
+}
+
+html, body {
+    overflow-x:hidden;
+}
+*/
+
+body {
+    background: rgb(255, 255, 255);
+}
+
+header {
+
+    /* border: 1px solid red; */
+    /* background: -webkit-linear-gradient(rgb(255, 255, 255) 50px, rgb(255, 255, 255) 50px); */
+    transition: 0.3s ease-in;
+    height: 50px;
+    /* overflow: hidden; */
+}
+
+
+nav {
+    width: 960px;
+    margin: 0 auto;
+    display: flex;
+    justify-content: flex-end;
+}
+
+nav>ul>li {
+    display: inline-block;
+    /* float: lef/t;  */
+    right: 0;
+
+    line-height: 50px;
+    margin-left: 40px;
+    font-size: 1.4rem;
+    /* position: relative; */
+    font-family: "Pretendard-Regular";
+
+}
+
+nav>ul>li ul {
+    width: 100%;
+    opacity: 0;
+    position: absolute;
+    transition: 0.3s 0.2s;
+}
+
+nav>ul>li ul li {
+    white-space: nowrap;
+}
+
+nav>ul>li:hover ul {
+    opacity: 1;
+    transition: 0.3s 0.2s;
+    z-index: 1;
+    background-color: white;
+
+}
+</style>(No newline at end of file)
 
client/views/layout/Menu.vue (added)
+++ client/views/layout/Menu.vue
@@ -0,0 +1,249 @@
+<template>
+    <div class="w1400 header-wrap">
+        <div class="logo-toggle">
+
+            <div class="logo">
+                <router-link to="/"><span>AI 디지털교과서 통합지원센터</span></router-link>
+            </div>
+            <input type="checkbox" id="checkbox" v-model="check">
+            <label for="checkbox" class="toggle" @click="toggleMenu">
+                <div class="bar bar--top"></div>
+                <div class="bar bar--middle"></div>
+                <div class="bar bar--bottom"></div>
+            </label>
+            <!-- <i v-if="!isOpened" class="fa-solid fa-bars mobile1" @click="toggleMenu"></i>
+            <i v-else class="fa-solid fa-times mobile1" @click="toggleMenu"></i> -->
+        </div>
+        <!-- 모바일 -->
+        <nav class=" sub-nav">
+            <ul class="main-sub-menu" :class="{ open: isOpened }">
+                <li v-for="menuItem in menuItems" :key="menuItem.text">
+                    <div @click="toggleAccordion(menuItem)" class="accordion-header"
+                        :class="{ 'active': menuItem.isExpanded }">
+                        {{ menuItem.text }}
+                    </div>
+                    <ul class="main-sub-menu-sb" v-if="menuItem.isExpanded">
+                        <li v-for="subMenuItem in menuItem.subMenu" :key="subMenuItem.text" @click="navClose(menuItem)">
+                            <router-link :to="subMenuItem.link">{{ subMenuItem.text }}</router-link>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+        </nav>
+        <!-- PC -->
+        <nav>
+            <ul class="main-menu main-menu-1">
+                <li v-for="menuItem in menuItems" :key="menuItem.text" :class="{ 'active': menuItem.isHovered }"
+                    @mouseover="menuItem.isHovered = true" @mouseout="menuItem.isHovered = false">
+                    <router-link :to="menuItem.link">{{ menuItem.text }}</router-link>
+                    <ul class="sub-menu sub-menu-1">
+                        <li v-for="subMenuItem in menuItem.subMenu" :key="subMenuItem.text" @click="navClose(menuItem)">
+                            <router-link :to="subMenuItem.link">{{ subMenuItem.text }}</router-link>
+                        </li>
+                    </ul>
+                </li>
+            </ul>
+        </nav>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+            check: false,
+            isOpened: false,
+            menuItems: [
+                {
+                    text: "통합지원센터 소개",
+                    link: "/",
+                    subMenu: [
+                        { text: "통합지원센터란?", link: "" },
+                        { text: "협력 기업", link: "" }
+                    ]
+                },
+                {
+                    text: "자료실",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "기술문서", link: "" },
+                        { text: "자료집", link: "/Data.page" }
+                    ]
+                },
+                {
+                    text: "네트워킹",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "기업 홍보관", link: "/Matching.page" },
+                    ]
+                },
+                {
+                    text: "커뮤니티",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "공지사항", link: "" },
+                        { text: "홍보/뉴스", link: "" }
+                    ]
+                },
+                {
+                    text: "마이페이지",
+                    link: "",
+                    isHovered: false,
+                    subMenu: [
+                        { text: "내 정보 수정", link: "" },
+                        { text: "매칭 관리", link: "" }
+                    ]
+                }
+            ]
+        };
+    },
+    methods: {
+        toggleAccordion(menuItem) {
+            menuItem.isExpanded = !menuItem.isExpanded;
+            console.log(menuItem.isExpanded);
+            this.isOpened = true;
+        },
+        toggleMenu() {
+            this.isOpened = !this.isOpened;
+        },
+        navClose(menuItem) {
+            this.isOpened = false;
+            menuItem.isExpanded = false;
+            this.check = false;
+        },
+        // mouseouts() {
+        //     this.isOpened = false;
+        //     console.log("active");
+        // }
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Menu mounted');
+    }
+}
+</script>
+
+<style scoped>
+ul.main-menu {
+    display: flex;
+    justify-content: flex-start;
+    align-items: center;
+}
+
+ul.main-menu>li {
+    position: relative;
+}
+
+ul.main-menu>li>a {
+    display: block;
+    padding: 25px;
+    font-size: 1.6rem;
+    font-weight: 500;
+    font-family: "Pretendard-Regular";
+
+}
+
+ul.sub-menu {
+    height: 0;
+    overflow: hidden;
+    transition: all 0.8s;
+    position: absolute;
+    top: 69px;
+    left: 0;
+    width: 100%;
+    z-index: 100000;
+    background-color: #fff;
+    box-shadow: 0px 2px 2px #3333331b;
+}
+
+ul.main-menu>li.active ul.sub-menu {
+    height: auto;
+}
+
+
+ul.sub-menu>li>a {
+    display: block;
+    padding: 15px;
+    font-size: 1.5rem !important;
+    font-weight: 500;
+    font-family: "Pretendard-Regular";
+    padding-bottom: 2rem;
+    text-align: center;
+    font-size: 1.2rem;
+}
+
+
+
+
+
+#checkbox {
+    display: none;
+}
+
+.toggle {
+    position: relative;
+    width: 30px;
+    cursor: pointer;
+    margin: auto;
+    display: block;
+    height: calc(4px * 3 + 11px * 2);
+}
+
+.bar {
+    position: absolute;
+    left: 0;
+    right: 0;
+    height: 3px;
+    border-radius: calc(4px / 2);
+    background: #2c407f;
+    color: inherit;
+    opacity: 1;
+    transition: none 0.35s cubic-bezier(.5, -0.35, .35, 1.5) 0s;
+}
+
+/***** Spin Animation *****/
+
+.bar--top {
+    bottom: calc(50% + 11px + 4px/ 2);
+    transition-property: bottom, transform;
+    transition-delay: calc(0s + 0.35s), 0s;
+}
+
+.bar--middle {
+    top: calc(50% - 4px/ 2);
+    transition-property: opacity;
+    transition-delay: calc(0s + 0.35s);
+}
+
+.bar--bottom {
+    top: calc(50% + 11px + 4px/ 2);
+    transition-property: top, transform;
+    transition-delay: calc(0s + 0.35s), 0s;
+}
+
+#checkbox:checked+.toggle .bar--top {
+    bottom: calc(50% - 4px/ 2);
+    transform: rotate(135deg);
+    transition-delay: 0s, calc(0s + 0.35s);
+}
+
+#checkbox:checked+.toggle .bar--middle {
+    opacity: 0;
+    transition-duration: 0s;
+    transition-delay: calc(0s + 0.35s);
+}
+
+#checkbox:checked+.toggle .bar--bottom {
+    top: calc(50% - 4px/ 2);
+    transform: rotate(225deg);
+    transition-delay: 0s, calc(0s + 0.35s);
+}
+</style>(No newline at end of file)
 
client/views/layout/Menusub.vue (added)
+++ client/views/layout/Menusub.vue
@@ -0,0 +1,44 @@
+<template>
+    <div class="w1400 header-sub-wrap">
+        <div>
+            <div class="sub-sub-menu">
+                <ul>
+                    <li><router-link to="/"> <span>통합지원센터 소개</span></router-link></li>
+                    <li><router-link to="/"> <span>자료실</span></router-link></li>
+                    <li><router-link to="/"> <span>네트워킹</span></router-link></li>
+                    <li><router-link to="/"> <span>커뮤니티</span></router-link></li>
+                    <li><router-link to="/main2"> <span>마이페이지</span></router-link></li>
+                </ul>
+            </div>
+
+        </div>
+
+    </div>
+</template>
+ 
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Menu mounted');
+    }
+}
+</script>
+
+<style scoped>
+.sub-menu {
+    width: 100%;
+}
+</style>(No newline at end of file)
 
client/views/pages/App.vue (added)
+++ client/views/pages/App.vue
@@ -0,0 +1,44 @@
+<template>
+   <div v-cloak>
+      <Header></Header>
+      <Menu></Menu>
+      <div class="main-warp">
+         <router-view />
+      </div>
+      <Footer></Footer>
+   </div>
+</template>
+
+<script>
+import Header from '../layout/Header.vue';
+import Menu from '../layout/Menu.vue';
+import Footer from '../layout/Footer.vue';
+
+const App = {
+   data: () => {
+      return {
+      }
+   },
+   methods: {
+
+   },
+   watch: {
+
+   },
+   computed: {
+
+   },
+   components: {
+      'Header': Header,
+      'Menu': Menu,
+      'Footer': Footer,
+   },
+   mounted: () => {
+      console.log('Vue mounted');
+   }
+}
+
+export default App;
+</script>
+
+<style></style>
 
client/views/pages/AppRouter.js (added)
+++ client/views/pages/AppRouter.js
@@ -0,0 +1,23 @@
+import { createWebHistory, createRouter } from "vue-router";
+
+import Main from "../pages/main/Main.vue";
+import Matching from "../pages/matching/Matching.vue";
+import Data from "../pages/Data/Data.vue";
+import Login from "../pages/login/Login.vue";
+import Join from "../pages/Join/Join.vue";
+
+const routes = [
+  /* 메인화면 */
+  { path: "/", name: "Main", component: Main },
+  { path: "/Data.page", name: "Data", component: Data },
+  { path: "/Matching.page", name: "Matching", component: Matching },
+  { path: "/Login.page", name: "Login", component: Login },
+  { path: "/Join.page", name: "Join", component: Join },
+];
+
+const AppRouter = createRouter({
+  history: createWebHistory(),
+  routes,
+});
+
+export default AppRouter;
 
client/views/pages/Data/Data.vue (added)
+++ client/views/pages/Data/Data.vue
@@ -0,0 +1,133 @@
+<template>
+    <div class="data-main">
+        <section class="main-sec sec1">
+            <!-- <div class="main-content"> -->
+            <div class="flex">
+                <!-- 자료집 비주얼 -->
+                <div class="data-b">
+                    <div class="w1400">
+                        <div class="data-b-b">
+                            <!-- 자료집 텍스트 -->
+                            <div class="data-text">
+
+                                <p>자료집</p>
+                            </div>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </section>
+
+        <!-- 자료집 메인 -->
+        <section class="data-b-main">
+            <div class="data-b">
+                <div class="w1400">
+                    <div class="data-b-grid">
+                        <!-- 윗쪽 아이콘 -->
+                        <div class="data-b-1 da1">
+                            <p>AI 디지털교과서<br><span>개발 가이드 라인<br> 설명회 발표자료</span></p>
+                        </div>
+                        <div class="data-b-2 da1">
+                            <p>AI 디지털교과서<br><span>정책</span></p>
+                        </div>
+                        <div class="data-b-3 da1">
+                            <p>AI 디지털교과서<br><span>개발아이디어<br> 해커톤 작품집</span></p>
+                        </div>
+                    </div>
+                </div>
+            </div>
+        </section>
+
+        <!-- 자료집 테이블 -->
+
+        <section class="data-table">
+            <div class="data-b">
+                <div class="w1400">
+                    <div class="data-select">
+
+
+                        <select name="data-table-sild" id="data-table-sild">
+                            <option value="전체" selected>전체</option>
+                            <option value="기본순">기본순</option>
+                            <option value="업로드순" disabled>업로드순</option>
+                            <option value="조회순">조회순</option>
+                        </select>
+                        <div class="input-group">
+                            <input type="text" class="input" onfocus="this.value=''; return true;" value="검색어를 입력해주세요.">
+                            <input class="button--submit" value="검색" type="submit">
+                        </div>
+                    </div>
+                    <div class="data-table-tr">
+                        <table>
+                            <th>NO</th>
+                            <th>공지사항</th>
+                            <th>날짜</th>
+
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                            <tr>
+                                <td>588</td>
+                                <td>[자료집] K-MOOC 마이크로러닝 강좌 개발 가이드라인</td>
+                                <td>2023/10/19</td>
+                            </tr>
+                        </table>
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Data mounted');
+    }
+}
+</script>(No newline at end of file)
 
client/views/pages/join/Join.vue (added)
+++ client/views/pages/join/Join.vue
@@ -0,0 +1,111 @@
+<template>
+    <div class="w1400">
+        <div>
+            <section class="join-logo">
+                <h1>회원가입</h1>
+            </section>
+
+            <section class="join-sec1">
+                <div class="join-sec-sub">
+                    <span>아이디</span>
+                    <input type="text">
+                    <button>중복확인</button>
+                </div>
+            </section>
+
+
+            <section class="join-sec2">
+                <div class="join-sec-sub">
+                    <span>기관업체</span>
+                    <input type="text" value="기관 및 업체명을 입력하세요.">
+                </div>
+            </section>
+
+
+            <section class="join-sec3">
+                <div class="join-sec-sub">
+                    <span>비밀번호</span>
+                    <input type="text">
+                </div>
+            </section>
+
+
+            <section class="join-sec4">
+                <div class="join-sec-sub">
+                    <span>비밀번호 확인</span>
+                    <input type="text">
+                </div>
+            </section>
+
+
+            <section class="join-sec5">
+                <div class="join-sec-sub">
+                    <span>담당자명</span>
+                    <input type="text">
+                </div>
+            </section>
+
+
+            <section class="join-sec6">
+                <div class="join-sec-sub">
+                    <label for="email_id">이메일</label>
+                    <input type="text" name="email_id" id="email_id"> @
+                    <input type="text" name="email_dns" id="email_dns">
+                    <select name="email_sel" id="email_sel">
+                        <option value="">직접 입력</option>
+                        <option value="naver.com">NAVER</option>
+                        <option value="hanmail.net">DAUM</option>
+                        <option value="gmail.com">GOOGLE</option>
+                    </select>
+                </div>
+            </section>
+        </div>
+
+
+
+        <!---------------------------------------------------------------------------------------------------------------->
+
+        <div>
+            <section class="join-sec">
+                <div class="join-sec-a">
+                    <h1>회사소개</h1>
+                </div>
+            </section>
+
+            <section class="join-sec-a-1">
+                <span>회사명</span>
+                <input type="text">
+            </section>
+            <section class="join-sec-a-1">
+                <span>우리회사 키워드</span>
+                <input type="text">
+            </section>
+            <section class="join-sec-a-1">
+                <span>회사 소개글</span>
+                <input type="text">
+            </section>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Join mounted');
+    }
+}
+</script>
+
 
client/views/pages/login/Login.vue (added)
+++ client/views/pages/login/Login.vue
@@ -0,0 +1,185 @@
+<template>
+    <div class="w1400">
+        <div class=" login-sec">
+            <section class="login-logo">
+                <div class="login-logo-d">
+                    <img src="../../../resources/jpg/logo/keris.gif" alt="">
+                    <h1>AI 디지털교과서 통합지원센터</h1>
+                </div>
+            </section>
+
+            <section class="login-input">
+                <div class="login-input-d">
+                    <div class="ID">
+                        <input type="text" class="id" value="아이디를 입력하세요.">
+                    </div>
+                    <div class="PW">
+                        <input type="password" class="password" value="비밀번호를 입력하세요.">
+                    </div>
+                </div>
+            </section>
+
+            <section class="login-checkbox">
+                <div class="login-checkbox-i">
+                    <input type="checkbox">
+                    <span>
+                        로그인상태 유지
+                    </span>
+                </div>
+                <div class="login-checkbox-b">
+                    <button>아이디 찾기</button>
+                    <button>비밀번호찾기</button>
+                    <button>회원가입</button>
+                </div>
+            </section>
+            <section class="login-button">
+                <button>로그인</button>
+            </section>
+        </div>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Login mounted');
+    }
+}
+</script>
+
+
+<style scoped>
+.w1400 {
+    overflow-y: hidden;
+    margin: 0 auto;
+    text-align: center;
+}
+
+.login-sec section {
+    /* border: 1px solid red; */
+}
+
+.login-logo {
+    width: 100%;
+    padding-top: 11rem;
+
+}
+
+.login-logo-d img {
+    width: 300px;
+    text-align: center;
+    /* border: 1px solid red; */
+    margin: 0 auto;
+    padding: 3rem;
+}
+
+.login-logo-d h1 {
+    /* border: 1px solid red; */
+    font-family: SBaggroM;
+    font-weight: 500;
+    color: #063a6d;
+    font-size: 2.5rem;
+}
+
+.login-input {
+    width: 100%;
+    display: flex;
+    flex-direction: column;
+
+
+}
+
+.login-input-d div {
+    width: 100%;
+
+    padding: 1rem;
+}
+
+.ID input,
+.PW input {
+    width: 40rem;
+    height: 6rem;
+    border: 1px solid #9a9a9a;
+    border-radius: 1.2rem;
+    padding: 1rem;
+    color: #9a9a9a;
+}
+
+.login-checkbox {
+
+    width: 100%;
+}
+
+.login-checkbox-i {
+    width: 40rem;
+    text-align: left;
+    margin: 0 auto;
+    /* border: 1px solid red; */
+
+}
+
+.login-checkbox-i input[type=checkbox] {
+    text-align: left;
+    margin: 1rem;
+    /* border: 1px solid red; */
+    transform: scale(1.5);
+}
+
+.login-checkbox-i span {
+    font-size: 1.5rem;
+}
+
+.login-checkbox-b {
+    padding: 6rem;
+}
+
+.login-checkbox-b button {
+    padding: 1rem;
+    /* margin: 1rem; */
+    color: #333;
+    font-family: "Pretendard-Regular";
+    font-weight: 500;
+    font-size: 1.5rem;
+    background-color: #06396d00;
+}
+
+.login-checkbox-b button:nth-child(1) {
+    position: relative;
+}
+
+.login-checkbox-b button:nth-child(1)::after,
+.login-checkbox-b button:nth-child(2)::after {
+    content: 'ㅣ';
+    float: right;
+    display: block;
+    margin-left: 20px;
+}
+
+.login-button {
+    width: 100%;
+    padding: 0rem 0rem 10rem 0rem;
+}
+
+.login-button button {
+    width: 40rem;
+    padding: 2rem;
+    background-color: #3f87f7;
+    color: white;
+    font-size: 1.7rem;
+    border-radius: 1.2rem;
+    cursor: pointer;
+}
+</style>(No newline at end of file)
 
client/views/pages/main/Main.vue (added)
+++ client/views/pages/main/Main.vue
@@ -0,0 +1,426 @@
+<template>
+    <div class="main-page">
+        <section class="main-sec sec1">
+            <!-- <div class="main-content"> -->
+            <div class="flex">
+                <!-- 메인비주얼 -->
+                <div class="m-b">
+                    <div class="w1400">
+                        <div class="m-b-b">
+                            <!-- 메인 텍스트 -->
+                            <div class="m-text">
+                                <p>신나고 재미있는 수업의 시작<br><span>디지털 교과서와 함께합니다.</span></p>
+                            </div>
+                            <!-- 메인 배너 -->
+                            <div class="m-benner">
+
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+
+                <!-- </div> -->
+            </div>
+        </section>
+        <section class="main-sec sec1">
+            <div class="main-content">
+                <div class="flex">
+                    <!-- 메인 퍼즐 -->
+                    <div class="m-p">
+                        <div class="w1400">
+                            <div class="m-p-container">
+                                <div class="m-p-c-1">
+                                    <div class="m-p-name">
+                                        <h3>공지사항</h3>
+                                        <input type="button" value="+ 더보기">
+                                    </div>
+                                    <div class="m-p-table">
+                                        <table>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <!-- <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr>
+                                            <tr>
+                                                <td>[공유] AI디지털교과서 개발 가이드 라인 설명회 발표자료
+                                                    <p>공지사항 l 2023.10.17 </p>
+                                                </td>
+                                            </tr> -->
+
+
+                                        </table>
+                                    </div>
+                                </div>
+
+                                <div class="m-p-c-2">
+                                    <div>
+                                        <img src="../../../resources/jpg/fille.png" alt="">
+                                        <input type="button" value="매칭서비스" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                                <div class="m-p-c-3">
+                                    <div>
+                                        <img src="../../../resources/jpg/m-p-ai2.png" alt="">
+                                        <input type="button" value="자료집" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                                <div class="m-p-c-4">
+                                    <div>
+                                        <img src="../../../resources/jpg/m-p-ai.png" alt="">
+                                        <input type="button" value="AI 디지털교과서 정책소개 다운" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                                <div class="m-p-c-5">
+                                    <div>
+                                        <img src="../../../resources/jpg/ki-i.png" alt="">
+                                        <input type="button" value="기술문서" class="m-p-ai">
+
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+        </section>
+        <section class="main-sec sec1">
+
+            <div class=" flex">
+                <!-- 메인 홍보/뉴스 -->
+
+                <div class="m-n">
+                    <div class="w1400">
+                        <div class="m-n-n">
+
+                            <h3>홍보/뉴스</h3>
+                            <div class="m-n-hidden">
+                                <!-- 
+                                <swiper ref="{swiperRef}" :slidesPerView="3" :initialSlide="2" :centeredSlides="true"
+                                    :spaceBetween="30" :loop="true" :breakpoints="{
+                                        300: { slidesPerView: 1 },
+                                        479: { slidesPerView: 1 },
+                                        768: { slidesPerView: 2 },
+                                        1023: { slidesPerView: 3 }
+                                    }" :autoplay="{
+    delay: 4500,
+    disableOnInteraction: false,
+}" :pagination="{
+    type: 'fraction',
+}" :navigation="true" :modules="modules" class="mySwiper">
+                                    <swiper-slide>
+                                        <div class="vedio">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                                height="100px" type="">
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+                                    <swiper-slide><embed src="https://webst.edunet.net/AIDT/playertest.mp4" width="100%"
+                                            height="100px" type=""></swiper-slide>
+
+                                </swiper> -->
+                                <swiper :navigation="true" :pagination="false" :slidesPerView="3" :mousewheel="true"
+                                    :initialSlide="2" :centeredSlides="false" :spaceBetween="55" :loop="true" :breakpoints="{
+                                        300: { slidesPerView: 1 },
+                                        479: { slidesPerView: 1 },
+                                        768: { slidesPerView: 2 },
+                                        1023: { slidesPerView: 3 }
+                                    }" :modules="modules" class="mySwiper">
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+                                    <swiper-slide>
+                                        <div class="swiper-div">
+                                            <embed src="https://webst.edunet.net/AIDT/playertest.mp4" type="">
+                                            <p>홍보영상</p>
+                                        </div>
+                                    </swiper-slide>
+
+                                </swiper>
+
+
+                            </div>
+                        </div>
+
+
+                    </div>
+                </div>
+
+            </div>
+
+        </section>
+        <section class="main-sec sec1">
+
+            <div class=" flex">
+                <!-- 히스토리 -->
+
+                <div class="m-h">
+                    <div class="w1400">
+                        <div class="m-h-h">
+                            <h1>History</h1>
+                            <div class="m-h-g">
+                                <div class="m-h-g-1">
+                                    <div>
+                                        <h3>방문자수</h3>
+                                        <p></p>
+                                        <p>367,700 </p>
+                                        <span>명</span>
+
+                                    </div>
+                                </div>
+                                <div class="m-h-g-2">
+                                    <div>
+                                        <h3>참가업체</h3>
+                                        <p></p>
+                                        <p>52,500 </p>
+                                        <span>업체</span>
+
+                                    </div>
+                                </div>
+                                <div class="m-h-g-3">
+                                    <div>
+                                        <h3>참가인원</h3>
+                                        <p></p>
+                                        <p>360,000</p>
+                                        <span>명</span>
+
+                                    </div>
+                                </div>
+                            </div>
+
+
+                        </div>
+
+                    </div>
+                </div>
+
+            </div>
+
+        </section>
+        <section class="main-sec sec1">
+            <div class=" flex">
+                <!-- 파트너사 -->
+
+                <div class="m-partner">
+                    <div class="w1400">
+                        <div class="m-pa">
+                            <h1>파트너사</h1>
+                            <div class="m-pa-pa">
+                                <div class="m-pa-logo lo1"></div>
+                                <div class="m-pa-logo lo2"></div>
+                                <div class="m-pa-logo lo3"></div>
+                                <div class="m-pa-logo lo4"></div>
+                                <div class="m-pa-logo lo5"></div>
+                            </div>
+
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+            <div class="m-p-sw">
+                <div class="w1400">
+                    <div class="m-p-sw-1">
+
+                        <swiper :slides-per-view="7" :space-between="30" :loop="true" :speed="1000" :centered-slides="true"
+                            :autoplay="{ delay: 0, disableOnInteraction: false }" :breakpoints="{
+                                300: { slidesPerView: 1 },
+                                479: { slidesPerView: 2 },
+                                768: { slidesPerView: 3 },
+                                1023: { slidesPerView: 5 }
+                            }" :navigation="false" :modules="modules" class="mySwiper swiper-2">
+
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/kefa.png" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/keris.gif" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko-go.jpg" alt=""></swiper-slide>
+                            <swiper-slide><img src="../../../resources/jpg/logo/ko.png" alt=""></swiper-slide>
+
+                        </swiper>
+                    </div>
+                </div>
+            </div>
+
+        </section>
+
+
+
+
+
+    </div>
+</template>
+
+<script>
+import { Swiper, SwiperSlide } from 'swiper/vue';
+import { Navigation } from 'swiper/modules';
+import 'swiper/css';
+import 'swiper/css/navigation';
+import 'swiper/css/pagination';
+
+import { Autoplay, Pagination } from 'swiper/modules';
+
+export default {
+    data() {
+        return {
+            module: [Pagination],
+        }
+    },
+    methods: {
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    components: {
+        Swiper,
+        SwiperSlide,
+
+
+    },
+    setup() {
+        return {
+            modules: [Autoplay, Pagination, Navigation],
+        };
+    },
+    mounted() {
+        console.log('Main mounted');
+    }
+}
+</script>
+
+<style scoped>
+.swiper-button-prev:after,
+.swiper-button-next:after {
+    color: aliceblue;
+}
+
+.swiper-button-next,
+.swiper-button-prev {
+    margin-top: -50px !important;
+    color: aliceblue;
+}
+
+.swiper {
+    height: 260px;
+    padding: 0px 50px 50px 50px;
+}
+
+
+.swiper-div {
+    display: flex;
+    align-items: center;
+    flex-direction: column;
+}
+
+.swiper-div embed {
+    height: 230px;
+    width: 350px;
+}
+
+.swiper-div p {
+    padding: 1rem;
+    font-size: 1.7rem;
+    color: white;
+}
+
+.swiper-slide {
+    height: 200px;
+    padding-bottom: 40px;
+}
+
+.swiper-slide img {
+    width: 40%;
+}
+
+.swiper-2 {
+    height: 100px;
+    transition-timing-function: linear;
+}
+</style>
 
client/views/pages/matching/Matching.vue (added)
+++ client/views/pages/matching/Matching.vue
@@ -0,0 +1,383 @@
+<template>
+    <div class="mat-main">
+        <section class="main-sec sec1">
+            <!-- <div class="main-content"> -->
+            <div class="flex">
+                <!-- 매칭비주얼 -->
+                <div class="mat-b">
+                    <div class="w1400">
+                        <div class="mat-b-b">
+                            <div class="mat-img">
+                                <img src="../../../resources/jpg/mat-img.png" alt="">
+                            </div>
+                            <!-- 매칭 텍스트 -->
+                            <div class="mat-text">
+                                <i class="fa-regular fa-handshake fa-lg" style="color: #ffffff;"></i>
+                                <p>추천 매칭서비스</p>
+                            </div>
+                            <div class="mat-img">
+                                <img src="../../../resources/jpg/mat-img1.png" alt="">
+                            </div>
+
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </section>
+
+        <!-- best기업 -->
+        <section class="match-b-main">
+            <div class="mat-b-1">
+                <div class="w1400">
+                    <div class="mat-b-grid">
+                        <!-- best 기업 -->
+                        <h3>BEST 기업</h3>
+                        <div class="mat-b-g-g">
+
+
+                            <div class="mat-b-g-1  g1">
+                                <div>
+
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-2  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3  g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                            <div class="mat-b-g-3 g1">
+                                <div>
+                                    <h3>(주)지학사</h3>
+                                    <img src="../../../resources/jpg/zigaksa.jpg" width="20px" alt="">
+                                    <p>기업은 고객,고객은 기업이라는 마인드로 항상 고객의 만족을 최우선의 가치로 실천한다.</p>
+                                    <div class="g1-1">
+                                        <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                        <p class="g-2">조회수 <span>120</span></p>
+
+                                    </div>
+                                    <div class="mat-span">
+
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                        <span>#혁신기업</span>
+                                    </div>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </section>
+        <!-- 일반기업 -->
+        <section class="mat-sec">
+            <div class="mat-sec-a">
+                <div class="w1400">
+                    <div class="mat-sec-a-1">
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="mat-sec-b">
+                            <div>
+                                <h5>(주)금성출판사</h5>
+                                <div class="mat-span">
+
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                    <span>#혁신기업</span>
+                                </div>
+                                <div class="mat-2">
+                                    <p><i class="fa-regular fa-heart fa-lg" style="color: #3f87f7;"></i> 3045</p>
+                                    <p>조회수 <span>110</span> </p>
+                                </div>
+                            </div>
+                        </div>
+
+                    </div>
+                </div>
+            </div>
+        </section>
+    </div>
+</template>
+
+<script>
+export default {
+    data() {
+        return {
+        }
+    },
+    methods: {
+
+    },
+    watch: {
+
+    },
+    computed: {
+
+    },
+    mounted() {
+        console.log('Matching mounted');
+    }
+}
+</script>(No newline at end of file)
 
package-lock.json (added)
+++ package-lock.json
@@ -0,0 +1,3958 @@
+{
+  "name": "keris-web",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "@babel/cli": "7.19.3",
+        "@babel/core": "7.19.3",
+        "@fortawesome/fontawesome-svg-core": "^6.4.2",
+        "@fortawesome/free-brands-svg-icons": "^6.4.2",
+        "@fortawesome/free-regular-svg-icons": "^6.4.2",
+        "@fortawesome/free-solid-svg-icons": "^6.4.2",
+        "@fortawesome/vue-fontawesome": "^3.0.3",
+        "axios": "^1.5.1",
+        "babel-loader": "8.2.5",
+        "css-loader": "6.7.1",
+        "express": "4.18.1",
+        "express-http-proxy": "^2.0.0",
+        "file-loader": "6.2.0",
+        "fs": "0.0.1-security",
+        "git": "^0.1.5",
+        "new-line": "^1.1.1",
+        "pg": "8.8.0",
+        "swiper": "^10.3.1",
+        "url-loader": "4.1.1",
+        "vue": "3.2.40",
+        "vue-carousel": "^0.18.0",
+        "vue-loader": "^17.0.0",
+        "vue-router": "4.1.5",
+        "vue-slick": "^1.2.0",
+        "vue-style-loader": "4.1.3",
+        "vue3-sfc-loader": "^0.8.4",
+        "vueperslides": "^3.5.1",
+        "vuex": "^4.1.0",
+        "webpack": "5.74.0",
+        "webpack-cli": "4.10.0"
+      },
+      "devDependencies": {
+        "less": "^4.2.0",
+        "less-loader": "^11.1.3"
+      }
+    },
+    "node_modules/@ampproject/remapping": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz",
+      "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/cli": {
+      "version": "7.19.3",
+      "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.19.3.tgz",
+      "integrity": "sha512-643/TybmaCAe101m2tSVHi9UKpETXP9c/Ff4mD2tAwkdP6esKIfaauZFc67vGEM6r9fekbEGid+sZhbEnSe3dg==",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.8",
+        "commander": "^4.0.1",
+        "convert-source-map": "^1.1.0",
+        "fs-readdir-recursive": "^1.1.0",
+        "glob": "^7.2.0",
+        "make-dir": "^2.1.0",
+        "slash": "^2.0.0"
+      },
+      "bin": {
+        "babel": "bin/babel.js",
+        "babel-external-helpers": "bin/babel-external-helpers.js"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "optionalDependencies": {
+        "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3",
+        "chokidar": "^3.4.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0-0"
+      }
+    },
+    "node_modules/@babel/code-frame": {
+      "version": "7.22.13",
+      "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
+      "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
+      "dependencies": {
+        "@babel/highlight": "^7.22.13",
+        "chalk": "^2.4.2"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/compat-data": {
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.2.tgz",
+      "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/core": {
+      "version": "7.19.3",
+      "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz",
+      "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==",
+      "dependencies": {
+        "@ampproject/remapping": "^2.1.0",
+        "@babel/code-frame": "^7.18.6",
+        "@babel/generator": "^7.19.3",
+        "@babel/helper-compilation-targets": "^7.19.3",
+        "@babel/helper-module-transforms": "^7.19.0",
+        "@babel/helpers": "^7.19.0",
+        "@babel/parser": "^7.19.3",
+        "@babel/template": "^7.18.10",
+        "@babel/traverse": "^7.19.3",
+        "@babel/types": "^7.19.3",
+        "convert-source-map": "^1.7.0",
+        "debug": "^4.1.0",
+        "gensync": "^1.0.0-beta.2",
+        "json5": "^2.2.1",
+        "semver": "^6.3.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/babel"
+      }
+    },
+    "node_modules/@babel/generator": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
+      "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
+      "dependencies": {
+        "@babel/types": "^7.23.0",
+        "@jridgewell/gen-mapping": "^0.3.2",
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jsesc": "^2.5.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-compilation-targets": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz",
+      "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==",
+      "dependencies": {
+        "@babel/compat-data": "^7.22.9",
+        "@babel/helper-validator-option": "^7.22.15",
+        "browserslist": "^4.21.9",
+        "lru-cache": "^5.1.1",
+        "semver": "^6.3.1"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-environment-visitor": {
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
+      "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-function-name": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
+      "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
+      "dependencies": {
+        "@babel/template": "^7.22.15",
+        "@babel/types": "^7.23.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-hoist-variables": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
+      "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-imports": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz",
+      "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==",
+      "dependencies": {
+        "@babel/types": "^7.22.15"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-module-transforms": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz",
+      "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==",
+      "dependencies": {
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-module-imports": "^7.22.15",
+        "@babel/helper-simple-access": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/helper-validator-identifier": "^7.22.20"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0"
+      }
+    },
+    "node_modules/@babel/helper-simple-access": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz",
+      "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==",
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-split-export-declaration": {
+      "version": "7.22.6",
+      "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
+      "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
+      "dependencies": {
+        "@babel/types": "^7.22.5"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-string-parser": {
+      "version": "7.22.5",
+      "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
+      "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-identifier": {
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
+      "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helper-validator-option": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz",
+      "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/helpers": {
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.2.tgz",
+      "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==",
+      "dependencies": {
+        "@babel/template": "^7.22.15",
+        "@babel/traverse": "^7.23.2",
+        "@babel/types": "^7.23.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/highlight": {
+      "version": "7.22.20",
+      "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
+      "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
+      "dependencies": {
+        "@babel/helper-validator-identifier": "^7.22.20",
+        "chalk": "^2.4.2",
+        "js-tokens": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/parser": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
+      "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
+      "bin": {
+        "parser": "bin/babel-parser.js"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@babel/template": {
+      "version": "7.22.15",
+      "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
+      "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
+      "dependencies": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/parser": "^7.22.15",
+        "@babel/types": "^7.22.15"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/traverse": {
+      "version": "7.23.2",
+      "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
+      "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
+      "dependencies": {
+        "@babel/code-frame": "^7.22.13",
+        "@babel/generator": "^7.23.0",
+        "@babel/helper-environment-visitor": "^7.22.20",
+        "@babel/helper-function-name": "^7.23.0",
+        "@babel/helper-hoist-variables": "^7.22.5",
+        "@babel/helper-split-export-declaration": "^7.22.6",
+        "@babel/parser": "^7.23.0",
+        "@babel/types": "^7.23.0",
+        "debug": "^4.1.0",
+        "globals": "^11.1.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@babel/types": {
+      "version": "7.23.0",
+      "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
+      "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
+      "dependencies": {
+        "@babel/helper-string-parser": "^7.22.5",
+        "@babel/helper-validator-identifier": "^7.22.20",
+        "to-fast-properties": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/@discoveryjs/json-ext": {
+      "version": "0.5.7",
+      "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+      "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/@fortawesome/fontawesome-common-types": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz",
+      "integrity": "sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==",
+      "hasInstallScript": true,
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/fontawesome-svg-core": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/fontawesome-svg-core/-/fontawesome-svg-core-6.4.2.tgz",
+      "integrity": "sha512-gjYDSKv3TrM2sLTOKBc5rH9ckje8Wrwgx1CxAPbN5N3Fm4prfi7NsJVWd1jklp7i5uSCVwhZS5qlhMXqLrpAIg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/free-brands-svg-icons": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-brands-svg-icons/-/free-brands-svg-icons-6.4.2.tgz",
+      "integrity": "sha512-LKOwJX0I7+mR/cvvf6qIiqcERbdnY+24zgpUSouySml+5w8B4BJOx8EhDR/FTKAu06W12fmUIcv6lzPSwYKGGg==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/free-regular-svg-icons": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-regular-svg-icons/-/free-regular-svg-icons-6.4.2.tgz",
+      "integrity": "sha512-0+sIUWnkgTVVXVAPQmW4vxb9ZTHv0WstOa3rBx9iPxrrrDH6bNLsDYuwXF9b6fGm+iR7DKQvQshUH/FJm3ed9Q==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/free-solid-svg-icons": {
+      "version": "6.4.2",
+      "resolved": "https://registry.npmjs.org/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz",
+      "integrity": "sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA==",
+      "hasInstallScript": true,
+      "dependencies": {
+        "@fortawesome/fontawesome-common-types": "6.4.2"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/@fortawesome/vue-fontawesome": {
+      "version": "3.0.3",
+      "resolved": "https://registry.npmjs.org/@fortawesome/vue-fontawesome/-/vue-fontawesome-3.0.3.tgz",
+      "integrity": "sha512-KCPHi9QemVXGMrfuwf3nNnNo129resAIQWut9QTAMXmXqL2ErABC6ohd2yY5Ipq0CLWNbKHk8TMdTXL/Zf3ZhA==",
+      "peerDependencies": {
+        "@fortawesome/fontawesome-svg-core": "~1 || ~6",
+        "vue": ">= 3.0.0 < 4"
+      }
+    },
+    "node_modules/@jridgewell/gen-mapping": {
+      "version": "0.3.3",
+      "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+      "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+      "dependencies": {
+        "@jridgewell/set-array": "^1.0.1",
+        "@jridgewell/sourcemap-codec": "^1.4.10",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/resolve-uri": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+      "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/set-array": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+      "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/@jridgewell/source-map": {
+      "version": "0.3.5",
+      "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+      "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+      "dependencies": {
+        "@jridgewell/gen-mapping": "^0.3.0",
+        "@jridgewell/trace-mapping": "^0.3.9"
+      }
+    },
+    "node_modules/@jridgewell/sourcemap-codec": {
+      "version": "1.4.15",
+      "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
+      "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg=="
+    },
+    "node_modules/@jridgewell/trace-mapping": {
+      "version": "0.3.19",
+      "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz",
+      "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==",
+      "dependencies": {
+        "@jridgewell/resolve-uri": "^3.1.0",
+        "@jridgewell/sourcemap-codec": "^1.4.14"
+      }
+    },
+    "node_modules/@nicolo-ribaudo/chokidar-2": {
+      "version": "2.1.8-no-fsevents.3",
+      "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz",
+      "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==",
+      "optional": true
+    },
+    "node_modules/@types/eslint": {
+      "version": "8.44.4",
+      "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.4.tgz",
+      "integrity": "sha512-lOzjyfY/D9QR4hY9oblZ76B90MYTB3RrQ4z2vBIJKj9ROCRqdkYl2gSUx1x1a4IWPjKJZLL4Aw1Zfay7eMnmnA==",
+      "dependencies": {
+        "@types/estree": "*",
+        "@types/json-schema": "*"
+      }
+    },
+    "node_modules/@types/eslint-scope": {
+      "version": "3.7.5",
+      "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.5.tgz",
+      "integrity": "sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==",
+      "dependencies": {
+        "@types/eslint": "*",
+        "@types/estree": "*"
+      }
+    },
+    "node_modules/@types/estree": {
+      "version": "0.0.51",
+      "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz",
+      "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ=="
+    },
+    "node_modules/@types/json-schema": {
+      "version": "7.0.13",
+      "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz",
+      "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ=="
+    },
+    "node_modules/@types/node": {
+      "version": "20.8.6",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.6.tgz",
+      "integrity": "sha512-eWO4K2Ji70QzKUqRy6oyJWUeB7+g2cRagT3T/nxYibYcT4y2BDL8lqolRXjTHmkZCdJfIPaY73KbJAZmcryxTQ==",
+      "dependencies": {
+        "undici-types": "~5.25.1"
+      }
+    },
+    "node_modules/@vue/compiler-core": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.40.tgz",
+      "integrity": "sha512-2Dc3Stk0J/VyQ4OUr2yEC53kU28614lZS+bnrCbFSAIftBJ40g/2yQzf4mPBiFuqguMB7hyHaujdgZAQ67kZYA==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/shared": "3.2.40",
+        "estree-walker": "^2.0.2",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@vue/compiler-dom": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.40.tgz",
+      "integrity": "sha512-OZCNyYVC2LQJy4H7h0o28rtk+4v+HMQygRTpmibGoG9wZyomQiS5otU7qo3Wlq5UfHDw2RFwxb9BJgKjVpjrQw==",
+      "dependencies": {
+        "@vue/compiler-core": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/compiler-sfc": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.40.tgz",
+      "integrity": "sha512-tzqwniIN1fu1PDHC3CpqY/dPCfN/RN1thpBC+g69kJcrl7mbGiHKNwbA6kJ3XKKy8R6JLKqcpVugqN4HkeBFFg==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.40",
+        "@vue/compiler-dom": "3.2.40",
+        "@vue/compiler-ssr": "3.2.40",
+        "@vue/reactivity-transform": "3.2.40",
+        "@vue/shared": "3.2.40",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7",
+        "postcss": "^8.1.10",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/@vue/compiler-ssr": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.40.tgz",
+      "integrity": "sha512-80cQcgasKjrPPuKcxwuCx7feq+wC6oFl5YaKSee9pV3DNq+6fmCVwEEC3vvkf/E2aI76rIJSOYHsWSEIxK74oQ==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/devtools-api": {
+      "version": "6.5.1",
+      "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.1.tgz",
+      "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA=="
+    },
+    "node_modules/@vue/reactivity": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.40.tgz",
+      "integrity": "sha512-N9qgGLlZmtUBMHF9xDT4EkD9RdXde1Xbveb+niWMXuHVWQP5BzgRmE3SFyUBBcyayG4y1lhoz+lphGRRxxK4RA==",
+      "dependencies": {
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/reactivity-transform": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.40.tgz",
+      "integrity": "sha512-HQUCVwEaacq6fGEsg2NUuGKIhUveMCjOk8jGHqLXPI2w6zFoPrlQhwWEaINTv5kkZDXKEnCijAp+4gNEHG03yw==",
+      "dependencies": {
+        "@babel/parser": "^7.16.4",
+        "@vue/compiler-core": "3.2.40",
+        "@vue/shared": "3.2.40",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.25.7"
+      }
+    },
+    "node_modules/@vue/runtime-core": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.40.tgz",
+      "integrity": "sha512-U1+rWf0H8xK8aBUZhnrN97yoZfHbjgw/bGUzfgKPJl69/mXDuSg8CbdBYBn6VVQdR947vWneQBFzdhasyzMUKg==",
+      "dependencies": {
+        "@vue/reactivity": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/@vue/runtime-dom": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.40.tgz",
+      "integrity": "sha512-AO2HMQ+0s2+MCec8hXAhxMgWhFhOPJ/CyRXnmTJ6XIOnJFLrH5Iq3TNwvVcODGR295jy77I6dWPj+wvFoSYaww==",
+      "dependencies": {
+        "@vue/runtime-core": "3.2.40",
+        "@vue/shared": "3.2.40",
+        "csstype": "^2.6.8"
+      }
+    },
+    "node_modules/@vue/server-renderer": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.40.tgz",
+      "integrity": "sha512-gtUcpRwrXOJPJ4qyBpU3EyxQa4EkV8I4f8VrDePcGCPe4O/hd0BPS7v9OgjIQob6Ap8VDz9G+mGTKazE45/95w==",
+      "dependencies": {
+        "@vue/compiler-ssr": "3.2.40",
+        "@vue/shared": "3.2.40"
+      },
+      "peerDependencies": {
+        "vue": "3.2.40"
+      }
+    },
+    "node_modules/@vue/shared": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.40.tgz",
+      "integrity": "sha512-0PLQ6RUtZM0vO3teRfzGi4ltLUO5aO+kLgwh4Um3THSR03rpQWLTuRCkuO5A41ITzwdWeKdPHtSARuPkoo5pCQ=="
+    },
+    "node_modules/@webassemblyjs/ast": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz",
+      "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==",
+      "dependencies": {
+        "@webassemblyjs/helper-numbers": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/floating-point-hex-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz",
+      "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ=="
+    },
+    "node_modules/@webassemblyjs/helper-api-error": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz",
+      "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg=="
+    },
+    "node_modules/@webassemblyjs/helper-buffer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz",
+      "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA=="
+    },
+    "node_modules/@webassemblyjs/helper-numbers": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz",
+      "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==",
+      "dependencies": {
+        "@webassemblyjs/floating-point-hex-parser": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz",
+      "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q=="
+    },
+    "node_modules/@webassemblyjs/helper-wasm-section": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz",
+      "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/ieee754": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz",
+      "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==",
+      "dependencies": {
+        "@xtuc/ieee754": "^1.2.0"
+      }
+    },
+    "node_modules/@webassemblyjs/leb128": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz",
+      "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==",
+      "dependencies": {
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webassemblyjs/utf8": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz",
+      "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ=="
+    },
+    "node_modules/@webassemblyjs/wasm-edit": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz",
+      "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/helper-wasm-section": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-opt": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "@webassemblyjs/wast-printer": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-gen": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz",
+      "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-opt": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz",
+      "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-buffer": "1.11.1",
+        "@webassemblyjs/wasm-gen": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wasm-parser": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz",
+      "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/helper-api-error": "1.11.1",
+        "@webassemblyjs/helper-wasm-bytecode": "1.11.1",
+        "@webassemblyjs/ieee754": "1.11.1",
+        "@webassemblyjs/leb128": "1.11.1",
+        "@webassemblyjs/utf8": "1.11.1"
+      }
+    },
+    "node_modules/@webassemblyjs/wast-printer": {
+      "version": "1.11.1",
+      "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz",
+      "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==",
+      "dependencies": {
+        "@webassemblyjs/ast": "1.11.1",
+        "@xtuc/long": "4.2.2"
+      }
+    },
+    "node_modules/@webpack-cli/configtest": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz",
+      "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==",
+      "peerDependencies": {
+        "webpack": "4.x.x || 5.x.x",
+        "webpack-cli": "4.x.x"
+      }
+    },
+    "node_modules/@webpack-cli/info": {
+      "version": "1.5.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz",
+      "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==",
+      "dependencies": {
+        "envinfo": "^7.7.3"
+      },
+      "peerDependencies": {
+        "webpack-cli": "4.x.x"
+      }
+    },
+    "node_modules/@webpack-cli/serve": {
+      "version": "1.7.0",
+      "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz",
+      "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==",
+      "peerDependencies": {
+        "webpack-cli": "4.x.x"
+      },
+      "peerDependenciesMeta": {
+        "webpack-dev-server": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/@xtuc/ieee754": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+      "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA=="
+    },
+    "node_modules/@xtuc/long": {
+      "version": "4.2.2",
+      "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+      "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ=="
+    },
+    "node_modules/accepts": {
+      "version": "1.3.8",
+      "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+      "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+      "dependencies": {
+        "mime-types": "~2.1.34",
+        "negotiator": "0.6.3"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/acorn": {
+      "version": "8.10.0",
+      "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz",
+      "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==",
+      "bin": {
+        "acorn": "bin/acorn"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/acorn-import-assertions": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+      "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+      "peerDependencies": {
+        "acorn": "^8"
+      }
+    },
+    "node_modules/ajv": {
+      "version": "6.12.6",
+      "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+      "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+      "dependencies": {
+        "fast-deep-equal": "^3.1.1",
+        "fast-json-stable-stringify": "^2.0.0",
+        "json-schema-traverse": "^0.4.1",
+        "uri-js": "^4.2.2"
+      },
+      "funding": {
+        "type": "github",
+        "url": "https://github.com/sponsors/epoberezkin"
+      }
+    },
+    "node_modules/ajv-keywords": {
+      "version": "3.5.2",
+      "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+      "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+      "peerDependencies": {
+        "ajv": "^6.9.1"
+      }
+    },
+    "node_modules/ansi-styles": {
+      "version": "3.2.1",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+      "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+      "dependencies": {
+        "color-convert": "^1.9.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/anymatch": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+      "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+      "optional": true,
+      "dependencies": {
+        "normalize-path": "^3.0.0",
+        "picomatch": "^2.0.4"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/array-flatten": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+      "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg=="
+    },
+    "node_modules/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.5.1",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz",
+      "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==",
+      "dependencies": {
+        "follow-redirects": "^1.15.0",
+        "form-data": "^4.0.0",
+        "proxy-from-env": "^1.1.0"
+      }
+    },
+    "node_modules/babel-loader": {
+      "version": "8.2.5",
+      "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz",
+      "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==",
+      "dependencies": {
+        "find-cache-dir": "^3.3.1",
+        "loader-utils": "^2.0.0",
+        "make-dir": "^3.1.0",
+        "schema-utils": "^2.6.5"
+      },
+      "engines": {
+        "node": ">= 8.9"
+      },
+      "peerDependencies": {
+        "@babel/core": "^7.0.0",
+        "webpack": ">=2"
+      }
+    },
+    "node_modules/babel-loader/node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/balanced-match": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+      "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+    },
+    "node_modules/big.js": {
+      "version": "5.2.2",
+      "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+      "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/binary-extensions": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
+      "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/body-parser": {
+      "version": "1.20.0",
+      "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz",
+      "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "content-type": "~1.0.4",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "on-finished": "2.4.1",
+        "qs": "6.10.3",
+        "raw-body": "2.5.1",
+        "type-is": "~1.6.18",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/body-parser/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/body-parser/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/brace-expansion": {
+      "version": "1.1.11",
+      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+      "dependencies": {
+        "balanced-match": "^1.0.0",
+        "concat-map": "0.0.1"
+      }
+    },
+    "node_modules/braces": {
+      "version": "3.0.2",
+      "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
+      "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
+      "optional": true,
+      "dependencies": {
+        "fill-range": "^7.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/browserslist": {
+      "version": "4.22.1",
+      "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz",
+      "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "caniuse-lite": "^1.0.30001541",
+        "electron-to-chromium": "^1.4.535",
+        "node-releases": "^2.0.13",
+        "update-browserslist-db": "^1.0.13"
+      },
+      "bin": {
+        "browserslist": "cli.js"
+      },
+      "engines": {
+        "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+      }
+    },
+    "node_modules/buffer-from": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+      "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ=="
+    },
+    "node_modules/buffer-writer": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz",
+      "integrity": "sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/bytes": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+      "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/call-bind": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
+      "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "get-intrinsic": "^1.0.2"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/caniuse-lite": {
+      "version": "1.0.30001549",
+      "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001549.tgz",
+      "integrity": "sha512-qRp48dPYSCYaP+KurZLhDYdVE+yEyht/3NlmcJgVQ2VMGt6JL36ndQ/7rgspdZsJuxDPFIo/OzBT2+GmIJ53BA==",
+      "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": "2.4.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+      "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+      "dependencies": {
+        "ansi-styles": "^3.2.1",
+        "escape-string-regexp": "^1.0.5",
+        "supports-color": "^5.3.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/chokidar": {
+      "version": "3.5.3",
+      "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
+      "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://paulmillr.com/funding/"
+        }
+      ],
+      "optional": true,
+      "dependencies": {
+        "anymatch": "~3.1.2",
+        "braces": "~3.0.2",
+        "glob-parent": "~5.1.2",
+        "is-binary-path": "~2.1.0",
+        "is-glob": "~4.0.1",
+        "normalize-path": "~3.0.0",
+        "readdirp": "~3.6.0"
+      },
+      "engines": {
+        "node": ">= 8.10.0"
+      },
+      "optionalDependencies": {
+        "fsevents": "~2.3.2"
+      }
+    },
+    "node_modules/chrome-trace-event": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+      "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+      "engines": {
+        "node": ">=6.0"
+      }
+    },
+    "node_modules/clone-deep": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+      "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+      "dependencies": {
+        "is-plain-object": "^2.0.4",
+        "kind-of": "^6.0.2",
+        "shallow-clone": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/color-convert": {
+      "version": "1.9.3",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+      "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+      "dependencies": {
+        "color-name": "1.1.3"
+      }
+    },
+    "node_modules/color-name": {
+      "version": "1.1.3",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+      "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+    },
+    "node_modules/colorette": {
+      "version": "2.0.20",
+      "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+      "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w=="
+    },
+    "node_modules/combined-stream": {
+      "version": "1.0.8",
+      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+      "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+      "dependencies": {
+        "delayed-stream": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/commander": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz",
+      "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==",
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/commondir": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
+      "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg=="
+    },
+    "node_modules/concat-map": {
+      "version": "0.0.1",
+      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+      "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg=="
+    },
+    "node_modules/content-disposition": {
+      "version": "0.5.4",
+      "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+      "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+      "dependencies": {
+        "safe-buffer": "5.2.1"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/content-type": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+      "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/convert-source-map": {
+      "version": "1.9.0",
+      "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+      "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+    },
+    "node_modules/cookie": {
+      "version": "0.5.0",
+      "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz",
+      "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/cookie-signature": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+      "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ=="
+    },
+    "node_modules/copy-anything": {
+      "version": "2.0.6",
+      "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.6.tgz",
+      "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==",
+      "dev": true,
+      "dependencies": {
+        "is-what": "^3.14.1"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/mesqueeb"
+      }
+    },
+    "node_modules/cross-spawn": {
+      "version": "7.0.3",
+      "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+      "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+      "dependencies": {
+        "path-key": "^3.1.0",
+        "shebang-command": "^2.0.0",
+        "which": "^2.0.1"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/css-loader": {
+      "version": "6.7.1",
+      "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz",
+      "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==",
+      "dependencies": {
+        "icss-utils": "^5.1.0",
+        "postcss": "^8.4.7",
+        "postcss-modules-extract-imports": "^3.0.0",
+        "postcss-modules-local-by-default": "^4.0.0",
+        "postcss-modules-scope": "^3.0.0",
+        "postcss-modules-values": "^4.0.0",
+        "postcss-value-parser": "^4.2.0",
+        "semver": "^7.3.5"
+      },
+      "engines": {
+        "node": ">= 12.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.0.0"
+      }
+    },
+    "node_modules/css-loader/node_modules/lru-cache": {
+      "version": "6.0.0",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+      "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+      "dependencies": {
+        "yallist": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/css-loader/node_modules/semver": {
+      "version": "7.5.4",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
+      "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
+      "dependencies": {
+        "lru-cache": "^6.0.0"
+      },
+      "bin": {
+        "semver": "bin/semver.js"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/css-loader/node_modules/yallist": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+      "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="
+    },
+    "node_modules/cssesc": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+      "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+      "bin": {
+        "cssesc": "bin/cssesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/csstype": {
+      "version": "2.6.21",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
+      "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w=="
+    },
+    "node_modules/debug": {
+      "version": "4.3.4",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+      "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+      "dependencies": {
+        "ms": "2.1.2"
+      },
+      "engines": {
+        "node": ">=6.0"
+      },
+      "peerDependenciesMeta": {
+        "supports-color": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/delayed-stream": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/depd": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+      "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/destroy": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+      "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+      "engines": {
+        "node": ">= 0.8",
+        "npm": "1.2.8000 || >= 1.4.16"
+      }
+    },
+    "node_modules/dom-walk": {
+      "version": "0.1.2",
+      "resolved": "https://registry.npmjs.org/dom-walk/-/dom-walk-0.1.2.tgz",
+      "integrity": "sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w=="
+    },
+    "node_modules/ee-first": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+      "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="
+    },
+    "node_modules/electron-to-chromium": {
+      "version": "1.4.556",
+      "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.556.tgz",
+      "integrity": "sha512-6RPN0hHfzDU8D56E72YkDvnLw5Cj2NMXZGg3UkgyoHxjVhG99KZpsKgBWMmTy0Ei89xwan+rbRsVB9yzATmYzQ=="
+    },
+    "node_modules/emojis-list": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+      "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+      "engines": {
+        "node": ">= 4"
+      }
+    },
+    "node_modules/encodeurl": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+      "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/enhanced-resolve": {
+      "version": "5.15.0",
+      "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+      "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+      "dependencies": {
+        "graceful-fs": "^4.2.4",
+        "tapable": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/envinfo": {
+      "version": "7.10.0",
+      "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz",
+      "integrity": "sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw==",
+      "bin": {
+        "envinfo": "dist/cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/errno": {
+      "version": "0.1.8",
+      "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
+      "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "prr": "~1.0.1"
+      },
+      "bin": {
+        "errno": "cli.js"
+      }
+    },
+    "node_modules/es-module-lexer": {
+      "version": "0.9.3",
+      "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz",
+      "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ=="
+    },
+    "node_modules/es6-promise": {
+      "version": "4.2.8",
+      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz",
+      "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w=="
+    },
+    "node_modules/escalade": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
+      "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/escape-html": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+      "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+    },
+    "node_modules/escape-string-regexp": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+      "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+      "engines": {
+        "node": ">=0.8.0"
+      }
+    },
+    "node_modules/eslint-scope": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+      "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+      "dependencies": {
+        "esrecurse": "^4.3.0",
+        "estraverse": "^4.1.1"
+      },
+      "engines": {
+        "node": ">=8.0.0"
+      }
+    },
+    "node_modules/esrecurse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+      "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+      "dependencies": {
+        "estraverse": "^5.2.0"
+      },
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/esrecurse/node_modules/estraverse": {
+      "version": "5.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+      "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estraverse": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+      "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+      "engines": {
+        "node": ">=4.0"
+      }
+    },
+    "node_modules/estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+    },
+    "node_modules/etag": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+      "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/events": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+      "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+      "engines": {
+        "node": ">=0.8.x"
+      }
+    },
+    "node_modules/express": {
+      "version": "4.18.1",
+      "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz",
+      "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==",
+      "dependencies": {
+        "accepts": "~1.3.8",
+        "array-flatten": "1.1.1",
+        "body-parser": "1.20.0",
+        "content-disposition": "0.5.4",
+        "content-type": "~1.0.4",
+        "cookie": "0.5.0",
+        "cookie-signature": "1.0.6",
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "finalhandler": "1.2.0",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "merge-descriptors": "1.0.1",
+        "methods": "~1.1.2",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "path-to-regexp": "0.1.7",
+        "proxy-addr": "~2.0.7",
+        "qs": "6.10.3",
+        "range-parser": "~1.2.1",
+        "safe-buffer": "5.2.1",
+        "send": "0.18.0",
+        "serve-static": "1.15.0",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "type-is": "~1.6.18",
+        "utils-merge": "1.0.1",
+        "vary": "~1.1.2"
+      },
+      "engines": {
+        "node": ">= 0.10.0"
+      }
+    },
+    "node_modules/express-http-proxy": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/express-http-proxy/-/express-http-proxy-2.0.0.tgz",
+      "integrity": "sha512-TXxcPFTWVUMSEmyM6iX2sT/JtmqhqngTq29P+eXTVFdtxZrTmM8THUYK59rUXiln0FfPGvxEpGRnVrgvHksXDw==",
+      "dependencies": {
+        "debug": "^3.0.1",
+        "es6-promise": "^4.1.1",
+        "raw-body": "^2.3.0"
+      },
+      "engines": {
+        "node": ">=6.0.0"
+      }
+    },
+    "node_modules/express-http-proxy/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/express/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/express/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/fast-deep-equal": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+      "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+    },
+    "node_modules/fast-json-stable-stringify": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+      "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
+    },
+    "node_modules/fastest-levenshtein": {
+      "version": "1.0.16",
+      "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+      "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+      "engines": {
+        "node": ">= 4.9.1"
+      }
+    },
+    "node_modules/file-loader": {
+      "version": "6.2.0",
+      "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz",
+      "integrity": "sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^4.0.0 || ^5.0.0"
+      }
+    },
+    "node_modules/file-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/fill-range": {
+      "version": "7.0.1",
+      "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
+      "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
+      "optional": true,
+      "dependencies": {
+        "to-regex-range": "^5.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/finalhandler": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz",
+      "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "on-finished": "2.4.1",
+        "parseurl": "~1.3.3",
+        "statuses": "2.0.1",
+        "unpipe": "~1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/finalhandler/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/finalhandler/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/find-cache-dir": {
+      "version": "3.3.2",
+      "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz",
+      "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==",
+      "dependencies": {
+        "commondir": "^1.0.1",
+        "make-dir": "^3.0.2",
+        "pkg-dir": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
+      }
+    },
+    "node_modules/find-cache-dir/node_modules/make-dir": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+      "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+      "dependencies": {
+        "semver": "^6.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/find-up": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+      "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+      "dependencies": {
+        "locate-path": "^5.0.0",
+        "path-exists": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/flat": {
+      "version": "5.0.2",
+      "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+      "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+      "bin": {
+        "flat": "cli.js"
+      }
+    },
+    "node_modules/follow-redirects": {
+      "version": "1.15.3",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.3.tgz",
+      "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==",
+      "funding": [
+        {
+          "type": "individual",
+          "url": "https://github.com/sponsors/RubenVerborgh"
+        }
+      ],
+      "engines": {
+        "node": ">=4.0"
+      },
+      "peerDependenciesMeta": {
+        "debug": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/form-data": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+      "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+      "dependencies": {
+        "asynckit": "^0.4.0",
+        "combined-stream": "^1.0.8",
+        "mime-types": "^2.1.12"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/forwarded": {
+      "version": "0.2.0",
+      "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+      "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fresh": {
+      "version": "0.5.2",
+      "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+      "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/fs": {
+      "version": "0.0.1-security",
+      "resolved": "https://registry.npmjs.org/fs/-/fs-0.0.1-security.tgz",
+      "integrity": "sha512-3XY9e1pP0CVEUCdj5BmfIZxRBTSDycnbqhIOGec9QYtmVH2fbLpj86CFWkrNOkt/Fvty4KZG5lTglL9j/gJ87w=="
+    },
+    "node_modules/fs-readdir-recursive": {
+      "version": "1.1.0",
+      "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
+      "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA=="
+    },
+    "node_modules/fs.realpath": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+      "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw=="
+    },
+    "node_modules/fsevents": {
+      "version": "2.3.3",
+      "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+      "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+      "hasInstallScript": true,
+      "optional": true,
+      "os": [
+        "darwin"
+      ],
+      "engines": {
+        "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+      }
+    },
+    "node_modules/function-bind": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+      "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/gensync": {
+      "version": "1.0.0-beta.2",
+      "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+      "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+      "engines": {
+        "node": ">=6.9.0"
+      }
+    },
+    "node_modules/get-intrinsic": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz",
+      "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==",
+      "dependencies": {
+        "function-bind": "^1.1.1",
+        "has": "^1.0.3",
+        "has-proto": "^1.0.1",
+        "has-symbols": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/git": {
+      "version": "0.1.5",
+      "resolved": "https://registry.npmjs.org/git/-/git-0.1.5.tgz",
+      "integrity": "sha512-N+bfOrXyKMU/fQtCj6D/U9MQOEN0DAA8TLHSLdUQRSWBOkeRvsjJHdrdkvcq05xO7GSDKWc3nDEGoTZ4DfCCSg==",
+      "dependencies": {
+        "mime": "1.2.9"
+      },
+      "engines": {
+        "node": ">=0.4.0"
+      }
+    },
+    "node_modules/git/node_modules/mime": {
+      "version": "1.2.9",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.9.tgz",
+      "integrity": "sha512-WiLgbHTIq5AYUvU/Luli4mZ1bUcHpGNHyCsbl+KPMg4zt+XUDpQehWjuBjdLaEvDTinvKj/FgfQt3fPoT7j08g=="
+    },
+    "node_modules/glob": {
+      "version": "7.2.3",
+      "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+      "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+      "dependencies": {
+        "fs.realpath": "^1.0.0",
+        "inflight": "^1.0.4",
+        "inherits": "2",
+        "minimatch": "^3.1.1",
+        "once": "^1.3.0",
+        "path-is-absolute": "^1.0.0"
+      },
+      "engines": {
+        "node": "*"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/isaacs"
+      }
+    },
+    "node_modules/glob-parent": {
+      "version": "5.1.2",
+      "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+      "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+      "optional": true,
+      "dependencies": {
+        "is-glob": "^4.0.1"
+      },
+      "engines": {
+        "node": ">= 6"
+      }
+    },
+    "node_modules/glob-to-regexp": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+      "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw=="
+    },
+    "node_modules/global": {
+      "version": "4.4.0",
+      "resolved": "https://registry.npmjs.org/global/-/global-4.4.0.tgz",
+      "integrity": "sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==",
+      "dependencies": {
+        "min-document": "^2.19.0",
+        "process": "^0.11.10"
+      }
+    },
+    "node_modules/globals": {
+      "version": "11.12.0",
+      "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+      "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/graceful-fs": {
+      "version": "4.2.11",
+      "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
+      "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="
+    },
+    "node_modules/has": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz",
+      "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/has-flag": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+      "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/has-proto": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz",
+      "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/has-symbols": {
+      "version": "1.0.3",
+      "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+      "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/hash-sum": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-2.0.0.tgz",
+      "integrity": "sha512-WdZTbAByD+pHfl/g9QSsBIIwy8IT+EsPiKDs0KNX+zSHhdDLFKdZu0BQHljvO+0QI/BasbMSUa8wYNCZTvhslg=="
+    },
+    "node_modules/http-errors": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+      "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+      "dependencies": {
+        "depd": "2.0.0",
+        "inherits": "2.0.4",
+        "setprototypeof": "1.2.0",
+        "statuses": "2.0.1",
+        "toidentifier": "1.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/iconv-lite": {
+      "version": "0.4.24",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+      "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/icss-utils": {
+      "version": "5.1.0",
+      "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+      "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/image-size": {
+      "version": "0.5.5",
+      "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz",
+      "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==",
+      "dev": true,
+      "optional": true,
+      "bin": {
+        "image-size": "bin/image-size.js"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/import-local": {
+      "version": "3.1.0",
+      "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
+      "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
+      "dependencies": {
+        "pkg-dir": "^4.2.0",
+        "resolve-cwd": "^3.0.0"
+      },
+      "bin": {
+        "import-local-fixture": "fixtures/cli.js"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/inflight": {
+      "version": "1.0.6",
+      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+      "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+      "dependencies": {
+        "once": "^1.3.0",
+        "wrappy": "1"
+      }
+    },
+    "node_modules/inherits": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+      "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+    },
+    "node_modules/interpret": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz",
+      "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/ipaddr.js": {
+      "version": "1.9.1",
+      "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+      "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/is-binary-path": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+      "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+      "optional": true,
+      "dependencies": {
+        "binary-extensions": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/is-core-module": {
+      "version": "2.13.0",
+      "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz",
+      "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==",
+      "dependencies": {
+        "has": "^1.0.3"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/is-extglob": {
+      "version": "2.1.1",
+      "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+      "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+      "optional": 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==",
+      "optional": true,
+      "dependencies": {
+        "is-extglob": "^2.1.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-number": {
+      "version": "7.0.0",
+      "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+      "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.12.0"
+      }
+    },
+    "node_modules/is-plain-object": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+      "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+      "dependencies": {
+        "isobject": "^3.0.1"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/is-what": {
+      "version": "3.14.1",
+      "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz",
+      "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==",
+      "dev": true
+    },
+    "node_modules/isexe": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+      "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+    },
+    "node_modules/isobject": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+      "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/jest-worker": {
+      "version": "27.5.1",
+      "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+      "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+      "dependencies": {
+        "@types/node": "*",
+        "merge-stream": "^2.0.0",
+        "supports-color": "^8.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      }
+    },
+    "node_modules/jest-worker/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/jest-worker/node_modules/supports-color": {
+      "version": "8.1.1",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+      "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/supports-color?sponsor=1"
+      }
+    },
+    "node_modules/jquery": {
+      "version": "3.7.1",
+      "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.7.1.tgz",
+      "integrity": "sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==",
+      "peer": true
+    },
+    "node_modules/js-tokens": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+      "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+    },
+    "node_modules/jsesc": {
+      "version": "2.5.2",
+      "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
+      "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
+      "bin": {
+        "jsesc": "bin/jsesc"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/json-parse-even-better-errors": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+      "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+    },
+    "node_modules/json-schema-traverse": {
+      "version": "0.4.1",
+      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+      "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+    },
+    "node_modules/json5": {
+      "version": "2.2.3",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+      "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+      "bin": {
+        "json5": "lib/cli.js"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/kind-of": {
+      "version": "6.0.3",
+      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+      "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/less": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/less/-/less-4.2.0.tgz",
+      "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==",
+      "dev": true,
+      "dependencies": {
+        "copy-anything": "^2.0.1",
+        "parse-node-version": "^1.0.1",
+        "tslib": "^2.3.0"
+      },
+      "bin": {
+        "lessc": "bin/lessc"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "optionalDependencies": {
+        "errno": "^0.1.1",
+        "graceful-fs": "^4.1.2",
+        "image-size": "~0.5.0",
+        "make-dir": "^2.1.0",
+        "mime": "^1.4.1",
+        "needle": "^3.1.0",
+        "source-map": "~0.6.0"
+      }
+    },
+    "node_modules/less-loader": {
+      "version": "11.1.3",
+      "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-11.1.3.tgz",
+      "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==",
+      "dev": true,
+      "engines": {
+        "node": ">= 14.15.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "less": "^3.5.0 || ^4.0.0",
+        "webpack": "^5.0.0"
+      }
+    },
+    "node_modules/loader-runner": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+      "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+      "engines": {
+        "node": ">=6.11.5"
+      }
+    },
+    "node_modules/loader-utils": {
+      "version": "2.0.4",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+      "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^2.1.2"
+      },
+      "engines": {
+        "node": ">=8.9.0"
+      }
+    },
+    "node_modules/locate-path": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+      "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+      "dependencies": {
+        "p-locate": "^4.1.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/lru-cache": {
+      "version": "5.1.1",
+      "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+      "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+      "dependencies": {
+        "yallist": "^3.0.2"
+      }
+    },
+    "node_modules/magic-string": {
+      "version": "0.25.9",
+      "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
+      "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+      "dependencies": {
+        "sourcemap-codec": "^1.4.8"
+      }
+    },
+    "node_modules/make-dir": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
+      "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
+      "dependencies": {
+        "pify": "^4.0.1",
+        "semver": "^5.6.0"
+      },
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/make-dir/node_modules/semver": {
+      "version": "5.7.2",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+      "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+      "bin": {
+        "semver": "bin/semver"
+      }
+    },
+    "node_modules/media-typer": {
+      "version": "0.3.0",
+      "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+      "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/merge-descriptors": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
+      "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w=="
+    },
+    "node_modules/merge-stream": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+      "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w=="
+    },
+    "node_modules/methods": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+      "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+      "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+      "bin": {
+        "mime": "cli.js"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/mime-db": {
+      "version": "1.52.0",
+      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/mime-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/min-document": {
+      "version": "2.19.0",
+      "resolved": "https://registry.npmjs.org/min-document/-/min-document-2.19.0.tgz",
+      "integrity": "sha512-9Wy1B3m3f66bPPmU5hdA4DR4PB2OfDU/+GS3yAB7IQozE3tqXaVv2zOjgla7MEGSRv95+ILmOuvhLkOK6wJtCQ==",
+      "dependencies": {
+        "dom-walk": "^0.1.0"
+      }
+    },
+    "node_modules/minimatch": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+      "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+      "dependencies": {
+        "brace-expansion": "^1.1.7"
+      },
+      "engines": {
+        "node": "*"
+      }
+    },
+    "node_modules/minimist": {
+      "version": "1.2.8",
+      "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+      "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/ms": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+      "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
+    },
+    "node_modules/nanoid": {
+      "version": "3.3.6",
+      "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz",
+      "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "bin": {
+        "nanoid": "bin/nanoid.cjs"
+      },
+      "engines": {
+        "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+      }
+    },
+    "node_modules/needle": {
+      "version": "3.2.0",
+      "resolved": "https://registry.npmjs.org/needle/-/needle-3.2.0.tgz",
+      "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "debug": "^3.2.6",
+        "iconv-lite": "^0.6.3",
+        "sax": "^1.2.4"
+      },
+      "bin": {
+        "needle": "bin/needle"
+      },
+      "engines": {
+        "node": ">= 4.4.x"
+      }
+    },
+    "node_modules/needle/node_modules/debug": {
+      "version": "3.2.7",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+      "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "ms": "^2.1.1"
+      }
+    },
+    "node_modules/needle/node_modules/iconv-lite": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+      "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+      "dev": true,
+      "optional": true,
+      "dependencies": {
+        "safer-buffer": ">= 2.1.2 < 3.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/negotiator": {
+      "version": "0.6.3",
+      "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+      "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/neo-async": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+      "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw=="
+    },
+    "node_modules/new-line": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/new-line/-/new-line-1.1.1.tgz",
+      "integrity": "sha512-BHhU5J48wv56aU2DaYnR0brR7PDTaJOeZW/R1koEt03ygvmX/WDnsXsxAq4JLK15vJeP4HHQHBGCfg3npp7onQ=="
+    },
+    "node_modules/node-releases": {
+      "version": "2.0.13",
+      "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz",
+      "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ=="
+    },
+    "node_modules/normalize-path": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+      "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+      "optional": true,
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/object-inspect": {
+      "version": "1.13.0",
+      "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.0.tgz",
+      "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==",
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/on-finished": {
+      "version": "2.4.1",
+      "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+      "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+      "dependencies": {
+        "ee-first": "1.1.1"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/once": {
+      "version": "1.4.0",
+      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+      "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+      "dependencies": {
+        "wrappy": "1"
+      }
+    },
+    "node_modules/p-limit": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+      "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+      "dependencies": {
+        "p-try": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/sindresorhus"
+      }
+    },
+    "node_modules/p-locate": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+      "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+      "dependencies": {
+        "p-limit": "^2.2.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/p-try": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+      "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/packet-reader": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz",
+      "integrity": "sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ=="
+    },
+    "node_modules/parse-node-version": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz",
+      "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==",
+      "dev": true,
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/parseurl": {
+      "version": "1.3.3",
+      "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+      "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/path-exists": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+      "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-is-absolute": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+      "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/path-key": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+      "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/path-parse": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+      "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+    },
+    "node_modules/path-to-regexp": {
+      "version": "0.1.7",
+      "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
+      "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ=="
+    },
+    "node_modules/pg": {
+      "version": "8.8.0",
+      "resolved": "https://registry.npmjs.org/pg/-/pg-8.8.0.tgz",
+      "integrity": "sha512-UXYN0ziKj+AeNNP7VDMwrehpACThH7LUl/p8TDFpEUuSejCUIwGSfxpHsPvtM6/WXFy6SU4E5RG4IJV/TZAGjw==",
+      "dependencies": {
+        "buffer-writer": "2.0.0",
+        "packet-reader": "1.0.0",
+        "pg-connection-string": "^2.5.0",
+        "pg-pool": "^3.5.2",
+        "pg-protocol": "^1.5.0",
+        "pg-types": "^2.1.0",
+        "pgpass": "1.x"
+      },
+      "engines": {
+        "node": ">= 8.0.0"
+      },
+      "peerDependencies": {
+        "pg-native": ">=3.0.1"
+      },
+      "peerDependenciesMeta": {
+        "pg-native": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/pg-connection-string": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.6.2.tgz",
+      "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA=="
+    },
+    "node_modules/pg-int8": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz",
+      "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==",
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/pg-pool": {
+      "version": "3.6.1",
+      "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.6.1.tgz",
+      "integrity": "sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==",
+      "peerDependencies": {
+        "pg": ">=8.0"
+      }
+    },
+    "node_modules/pg-protocol": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.6.0.tgz",
+      "integrity": "sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q=="
+    },
+    "node_modules/pg-types": {
+      "version": "2.2.0",
+      "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz",
+      "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==",
+      "dependencies": {
+        "pg-int8": "1.0.1",
+        "postgres-array": "~2.0.0",
+        "postgres-bytea": "~1.0.0",
+        "postgres-date": "~1.0.4",
+        "postgres-interval": "^1.1.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/pgpass": {
+      "version": "1.0.5",
+      "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz",
+      "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==",
+      "dependencies": {
+        "split2": "^4.1.0"
+      }
+    },
+    "node_modules/picocolors": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
+      "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
+    },
+    "node_modules/picomatch": {
+      "version": "2.3.1",
+      "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+      "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+      "optional": true,
+      "engines": {
+        "node": ">=8.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/jonschlinkert"
+      }
+    },
+    "node_modules/pify": {
+      "version": "4.0.1",
+      "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+      "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/pkg-dir": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+      "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+      "dependencies": {
+        "find-up": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/postcss": {
+      "version": "8.4.31",
+      "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz",
+      "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/postcss/"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/postcss"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "nanoid": "^3.3.6",
+        "picocolors": "^1.0.0",
+        "source-map-js": "^1.0.2"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >=14"
+      }
+    },
+    "node_modules/postcss-modules-extract-imports": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz",
+      "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==",
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-local-by-default": {
+      "version": "4.0.3",
+      "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz",
+      "integrity": "sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA==",
+      "dependencies": {
+        "icss-utils": "^5.0.0",
+        "postcss-selector-parser": "^6.0.2",
+        "postcss-value-parser": "^4.1.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-scope": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz",
+      "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==",
+      "dependencies": {
+        "postcss-selector-parser": "^6.0.4"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-modules-values": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+      "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+      "dependencies": {
+        "icss-utils": "^5.0.0"
+      },
+      "engines": {
+        "node": "^10 || ^12 || >= 14"
+      },
+      "peerDependencies": {
+        "postcss": "^8.1.0"
+      }
+    },
+    "node_modules/postcss-selector-parser": {
+      "version": "6.0.13",
+      "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz",
+      "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==",
+      "dependencies": {
+        "cssesc": "^3.0.0",
+        "util-deprecate": "^1.0.2"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postcss-value-parser": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+      "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+    },
+    "node_modules/postgres-array": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz",
+      "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/postgres-bytea": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+      "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-date": {
+      "version": "1.0.7",
+      "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz",
+      "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/postgres-interval": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz",
+      "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==",
+      "dependencies": {
+        "xtend": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/process": {
+      "version": "0.11.10",
+      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
+      "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
+      "engines": {
+        "node": ">= 0.6.0"
+      }
+    },
+    "node_modules/proxy-addr": {
+      "version": "2.0.7",
+      "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+      "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+      "dependencies": {
+        "forwarded": "0.2.0",
+        "ipaddr.js": "1.9.1"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/proxy-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/prr": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz",
+      "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/punycode": {
+      "version": "2.3.0",
+      "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz",
+      "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/qs": {
+      "version": "6.10.3",
+      "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz",
+      "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==",
+      "dependencies": {
+        "side-channel": "^1.0.4"
+      },
+      "engines": {
+        "node": ">=0.6"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/randombytes": {
+      "version": "2.1.0",
+      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+      "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+      "dependencies": {
+        "safe-buffer": "^5.1.0"
+      }
+    },
+    "node_modules/range-parser": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+      "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/raw-body": {
+      "version": "2.5.1",
+      "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz",
+      "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==",
+      "dependencies": {
+        "bytes": "3.1.2",
+        "http-errors": "2.0.0",
+        "iconv-lite": "0.4.24",
+        "unpipe": "1.0.0"
+      },
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/readdirp": {
+      "version": "3.6.0",
+      "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+      "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+      "optional": true,
+      "dependencies": {
+        "picomatch": "^2.2.1"
+      },
+      "engines": {
+        "node": ">=8.10.0"
+      }
+    },
+    "node_modules/rechoir": {
+      "version": "0.7.1",
+      "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz",
+      "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==",
+      "dependencies": {
+        "resolve": "^1.9.0"
+      },
+      "engines": {
+        "node": ">= 0.10"
+      }
+    },
+    "node_modules/regenerator-runtime": {
+      "version": "0.12.1",
+      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
+      "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg=="
+    },
+    "node_modules/resolve": {
+      "version": "1.22.8",
+      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+      "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+      "dependencies": {
+        "is-core-module": "^2.13.0",
+        "path-parse": "^1.0.7",
+        "supports-preserve-symlinks-flag": "^1.0.0"
+      },
+      "bin": {
+        "resolve": "bin/resolve"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/resolve-cwd": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+      "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+      "dependencies": {
+        "resolve-from": "^5.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/resolve-from": {
+      "version": "5.0.0",
+      "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+      "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/safe-buffer": {
+      "version": "5.2.1",
+      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+      "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+      "funding": [
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/feross"
+        },
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/feross"
+        },
+        {
+          "type": "consulting",
+          "url": "https://feross.org/support"
+        }
+      ]
+    },
+    "node_modules/safer-buffer": {
+      "version": "2.1.2",
+      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+    },
+    "node_modules/sax": {
+      "version": "1.3.0",
+      "resolved": "https://registry.npmjs.org/sax/-/sax-1.3.0.tgz",
+      "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==",
+      "dev": true,
+      "optional": true
+    },
+    "node_modules/schema-utils": {
+      "version": "2.7.1",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
+      "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.5",
+        "ajv": "^6.12.4",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 8.9.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/semver": {
+      "version": "6.3.1",
+      "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+      "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+      "bin": {
+        "semver": "bin/semver.js"
+      }
+    },
+    "node_modules/send": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz",
+      "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==",
+      "dependencies": {
+        "debug": "2.6.9",
+        "depd": "2.0.0",
+        "destroy": "1.2.0",
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "etag": "~1.8.1",
+        "fresh": "0.5.2",
+        "http-errors": "2.0.0",
+        "mime": "1.6.0",
+        "ms": "2.1.3",
+        "on-finished": "2.4.1",
+        "range-parser": "~1.2.1",
+        "statuses": "2.0.1"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/send/node_modules/debug": {
+      "version": "2.6.9",
+      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+      "dependencies": {
+        "ms": "2.0.0"
+      }
+    },
+    "node_modules/send/node_modules/debug/node_modules/ms": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+      "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="
+    },
+    "node_modules/send/node_modules/ms": {
+      "version": "2.1.3",
+      "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+      "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+    },
+    "node_modules/serialize-javascript": {
+      "version": "6.0.1",
+      "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+      "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+      "dependencies": {
+        "randombytes": "^2.1.0"
+      }
+    },
+    "node_modules/serve-static": {
+      "version": "1.15.0",
+      "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz",
+      "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==",
+      "dependencies": {
+        "encodeurl": "~1.0.2",
+        "escape-html": "~1.0.3",
+        "parseurl": "~1.3.3",
+        "send": "0.18.0"
+      },
+      "engines": {
+        "node": ">= 0.8.0"
+      }
+    },
+    "node_modules/setprototypeof": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+      "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="
+    },
+    "node_modules/shallow-clone": {
+      "version": "3.0.1",
+      "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+      "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+      "dependencies": {
+        "kind-of": "^6.0.2"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-command": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+      "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+      "dependencies": {
+        "shebang-regex": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/shebang-regex": {
+      "version": "3.0.0",
+      "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+      "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/side-channel": {
+      "version": "1.0.4",
+      "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
+      "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
+      "dependencies": {
+        "call-bind": "^1.0.0",
+        "get-intrinsic": "^1.0.2",
+        "object-inspect": "^1.9.0"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/slash": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz",
+      "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/slick-carousel": {
+      "version": "1.8.1",
+      "resolved": "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz",
+      "integrity": "sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==",
+      "peerDependencies": {
+        "jquery": ">=1.8.0"
+      }
+    },
+    "node_modules/source-map": {
+      "version": "0.6.1",
+      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+      "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-js": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
+      "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
+      "engines": {
+        "node": ">=0.10.0"
+      }
+    },
+    "node_modules/source-map-support": {
+      "version": "0.5.21",
+      "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+      "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+      "dependencies": {
+        "buffer-from": "^1.0.0",
+        "source-map": "^0.6.0"
+      }
+    },
+    "node_modules/sourcemap-codec": {
+      "version": "1.4.8",
+      "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+      "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+      "deprecated": "Please use @jridgewell/sourcemap-codec instead"
+    },
+    "node_modules/split2": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz",
+      "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==",
+      "engines": {
+        "node": ">= 10.x"
+      }
+    },
+    "node_modules/statuses": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+      "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/supports-color": {
+      "version": "5.5.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+      "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+      "dependencies": {
+        "has-flag": "^3.0.0"
+      },
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/supports-preserve-symlinks-flag": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+      "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+      "engines": {
+        "node": ">= 0.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/ljharb"
+      }
+    },
+    "node_modules/swiper": {
+      "version": "10.3.1",
+      "resolved": "https://registry.npmjs.org/swiper/-/swiper-10.3.1.tgz",
+      "integrity": "sha512-24Wk3YUdZHxjc9faID97GTu6xnLNia+adMt6qMTZG/HgdSUt4fS0REsGUXJOgpTED0Amh/j+gRGQxsLayJUlBQ==",
+      "funding": [
+        {
+          "type": "patreon",
+          "url": "https://www.patreon.com/swiperjs"
+        },
+        {
+          "type": "open_collective",
+          "url": "http://opencollective.com/swiper"
+        }
+      ],
+      "engines": {
+        "node": ">= 4.7.0"
+      }
+    },
+    "node_modules/tapable": {
+      "version": "2.2.1",
+      "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+      "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+      "engines": {
+        "node": ">=6"
+      }
+    },
+    "node_modules/terser": {
+      "version": "5.22.0",
+      "resolved": "https://registry.npmjs.org/terser/-/terser-5.22.0.tgz",
+      "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==",
+      "dependencies": {
+        "@jridgewell/source-map": "^0.3.3",
+        "acorn": "^8.8.2",
+        "commander": "^2.20.0",
+        "source-map-support": "~0.5.20"
+      },
+      "bin": {
+        "terser": "bin/terser"
+      },
+      "engines": {
+        "node": ">=10"
+      }
+    },
+    "node_modules/terser-webpack-plugin": {
+      "version": "5.3.9",
+      "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+      "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+      "dependencies": {
+        "@jridgewell/trace-mapping": "^0.3.17",
+        "jest-worker": "^27.4.5",
+        "schema-utils": "^3.1.1",
+        "serialize-javascript": "^6.0.1",
+        "terser": "^5.16.8"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "^5.1.0"
+      },
+      "peerDependenciesMeta": {
+        "@swc/core": {
+          "optional": true
+        },
+        "esbuild": {
+          "optional": true
+        },
+        "uglify-js": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/terser/node_modules/commander": {
+      "version": "2.20.3",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+      "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
+    },
+    "node_modules/to-fast-properties": {
+      "version": "2.0.0",
+      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+      "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+      "engines": {
+        "node": ">=4"
+      }
+    },
+    "node_modules/to-regex-range": {
+      "version": "5.0.1",
+      "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+      "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+      "optional": true,
+      "dependencies": {
+        "is-number": "^7.0.0"
+      },
+      "engines": {
+        "node": ">=8.0"
+      }
+    },
+    "node_modules/toidentifier": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+      "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+      "engines": {
+        "node": ">=0.6"
+      }
+    },
+    "node_modules/tslib": {
+      "version": "2.6.2",
+      "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
+      "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
+      "dev": true
+    },
+    "node_modules/type-is": {
+      "version": "1.6.18",
+      "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+      "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+      "dependencies": {
+        "media-typer": "0.3.0",
+        "mime-types": "~2.1.24"
+      },
+      "engines": {
+        "node": ">= 0.6"
+      }
+    },
+    "node_modules/undici-types": {
+      "version": "5.25.3",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.25.3.tgz",
+      "integrity": "sha512-Ga1jfYwRn7+cP9v8auvEXN1rX3sWqlayd4HP7OKk4mZWylEmu3KzXDUGrQUN6Ol7qo1gPvB2e5gX6udnyEPgdA=="
+    },
+    "node_modules/unpipe": {
+      "version": "1.0.0",
+      "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+      "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/update-browserslist-db": {
+      "version": "1.0.13",
+      "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+      "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+      "funding": [
+        {
+          "type": "opencollective",
+          "url": "https://opencollective.com/browserslist"
+        },
+        {
+          "type": "tidelift",
+          "url": "https://tidelift.com/funding/github/npm/browserslist"
+        },
+        {
+          "type": "github",
+          "url": "https://github.com/sponsors/ai"
+        }
+      ],
+      "dependencies": {
+        "escalade": "^3.1.1",
+        "picocolors": "^1.0.0"
+      },
+      "bin": {
+        "update-browserslist-db": "cli.js"
+      },
+      "peerDependencies": {
+        "browserslist": ">= 4.21.0"
+      }
+    },
+    "node_modules/uri-js": {
+      "version": "4.4.1",
+      "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+      "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+      "dependencies": {
+        "punycode": "^2.1.0"
+      }
+    },
+    "node_modules/url-loader": {
+      "version": "4.1.1",
+      "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+      "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+      "dependencies": {
+        "loader-utils": "^2.0.0",
+        "mime-types": "^2.1.27",
+        "schema-utils": "^3.0.0"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "file-loader": "*",
+        "webpack": "^4.0.0 || ^5.0.0"
+      },
+      "peerDependenciesMeta": {
+        "file-loader": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/url-loader/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/util-deprecate": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+      "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+    },
+    "node_modules/utils-merge": {
+      "version": "1.0.1",
+      "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+      "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+      "engines": {
+        "node": ">= 0.4.0"
+      }
+    },
+    "node_modules/vary": {
+      "version": "1.1.2",
+      "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+      "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+      "engines": {
+        "node": ">= 0.8"
+      }
+    },
+    "node_modules/vue": {
+      "version": "3.2.40",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-3.2.40.tgz",
+      "integrity": "sha512-1mGHulzUbl2Nk3pfvI5aXYYyJUs1nm4kyvuz38u4xlQkLUn1i2R7nDbI4TufECmY8v1qNBHYy62bCaM+3cHP2A==",
+      "dependencies": {
+        "@vue/compiler-dom": "3.2.40",
+        "@vue/compiler-sfc": "3.2.40",
+        "@vue/runtime-dom": "3.2.40",
+        "@vue/server-renderer": "3.2.40",
+        "@vue/shared": "3.2.40"
+      }
+    },
+    "node_modules/vue-carousel": {
+      "version": "0.18.0",
+      "resolved": "https://registry.npmjs.org/vue-carousel/-/vue-carousel-0.18.0.tgz",
+      "integrity": "sha512-a2zxh7QJioDxNMguqcuJ7TPbfgK5bGDaAXIia7NWxPAWsEvNE4ZtHgsGu40L5Aha4uyjmNKXvleB14QAXFoKig==",
+      "dependencies": {
+        "global": "^4.3.2",
+        "regenerator-runtime": "^0.12.1",
+        "vue": "^2.5.17"
+      }
+    },
+    "node_modules/vue-carousel/node_modules/@vue/compiler-sfc": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
+      "integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
+      "dependencies": {
+        "@babel/parser": "^7.18.4",
+        "postcss": "^8.4.14",
+        "source-map": "^0.6.1"
+      }
+    },
+    "node_modules/vue-carousel/node_modules/csstype": {
+      "version": "3.1.2",
+      "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz",
+      "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
+    },
+    "node_modules/vue-carousel/node_modules/vue": {
+      "version": "2.7.14",
+      "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
+      "integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
+      "dependencies": {
+        "@vue/compiler-sfc": "2.7.14",
+        "csstype": "^3.1.0"
+      }
+    },
+    "node_modules/vue-loader": {
+      "version": "17.3.0",
+      "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-17.3.0.tgz",
+      "integrity": "sha512-VUURABiN0TIUz0yvJJ/V/rZjGUh10JZtD+IDI5bXFslzFi9mV6ebKkPzoqiSi8e0vh8Ip7JHJx+I0AzAG0KsCA==",
+      "dependencies": {
+        "chalk": "^4.1.0",
+        "hash-sum": "^2.0.0",
+        "watchpack": "^2.4.0"
+      },
+      "peerDependencies": {
+        "webpack": "^4.1.0 || ^5.0.0-0"
+      },
+      "peerDependenciesMeta": {
+        "@vue/compiler-sfc": {
+          "optional": true
+        },
+        "vue": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/vue-loader/node_modules/ansi-styles": {
+      "version": "4.3.0",
+      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+      "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+      "dependencies": {
+        "color-convert": "^2.0.1"
+      },
+      "engines": {
+        "node": ">=8"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+      }
+    },
+    "node_modules/vue-loader/node_modules/chalk": {
+      "version": "4.1.2",
+      "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+      "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+      "dependencies": {
+        "ansi-styles": "^4.1.0",
+        "supports-color": "^7.1.0"
+      },
+      "engines": {
+        "node": ">=10"
+      },
+      "funding": {
+        "url": "https://github.com/chalk/chalk?sponsor=1"
+      }
+    },
+    "node_modules/vue-loader/node_modules/color-convert": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+      "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+      "dependencies": {
+        "color-name": "~1.1.4"
+      },
+      "engines": {
+        "node": ">=7.0.0"
+      }
+    },
+    "node_modules/vue-loader/node_modules/color-name": {
+      "version": "1.1.4",
+      "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+      "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
+    },
+    "node_modules/vue-loader/node_modules/has-flag": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+      "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/vue-loader/node_modules/supports-color": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+      "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+      "dependencies": {
+        "has-flag": "^4.0.0"
+      },
+      "engines": {
+        "node": ">=8"
+      }
+    },
+    "node_modules/vue-router": {
+      "version": "4.1.5",
+      "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.1.5.tgz",
+      "integrity": "sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.1.4"
+      },
+      "funding": {
+        "url": "https://github.com/sponsors/posva"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/vue-slick": {
+      "version": "1.2.0",
+      "resolved": "https://registry.npmjs.org/vue-slick/-/vue-slick-1.2.0.tgz",
+      "integrity": "sha512-1hjZsKyBbnOQPwyoJqAmnEs7d24CHACC+R0fKOaOsycB2g7K1JIYqsLpK0N2SRLcJBhfno9YrOYfEPiPZVCjCA==",
+      "dependencies": {
+        "slick-carousel": "^1.8.1"
+      },
+      "peerDependencies": {
+        "jquery": "*"
+      }
+    },
+    "node_modules/vue-style-loader": {
+      "version": "4.1.3",
+      "resolved": "https://registry.npmjs.org/vue-style-loader/-/vue-style-loader-4.1.3.tgz",
+      "integrity": "sha512-sFuh0xfbtpRlKfm39ss/ikqs9AbKCoXZBpHeVZ8Tx650o0k0q/YCM7FRvigtxpACezfq6af+a7JeqVTWvncqDg==",
+      "dependencies": {
+        "hash-sum": "^1.0.2",
+        "loader-utils": "^1.0.2"
+      }
+    },
+    "node_modules/vue-style-loader/node_modules/hash-sum": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/hash-sum/-/hash-sum-1.0.2.tgz",
+      "integrity": "sha512-fUs4B4L+mlt8/XAtSOGMUO1TXmAelItBPtJG7CyHJfYTdDjwisntGO2JQz7oUsatOY9o68+57eziUVNw/mRHmA=="
+    },
+    "node_modules/vue-style-loader/node_modules/json5": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+      "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+      "dependencies": {
+        "minimist": "^1.2.0"
+      },
+      "bin": {
+        "json5": "lib/cli.js"
+      }
+    },
+    "node_modules/vue-style-loader/node_modules/loader-utils": {
+      "version": "1.4.2",
+      "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
+      "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
+      "dependencies": {
+        "big.js": "^5.2.2",
+        "emojis-list": "^3.0.0",
+        "json5": "^1.0.1"
+      },
+      "engines": {
+        "node": ">=4.0.0"
+      }
+    },
+    "node_modules/vue3-sfc-loader": {
+      "version": "0.8.4",
+      "resolved": "https://registry.npmjs.org/vue3-sfc-loader/-/vue3-sfc-loader-0.8.4.tgz",
+      "integrity": "sha512-eziaIrk/N9f9OCpyFEkR6vMsZUHcF5mQslXjffwcb5Iq6EuU74QrlpBeJqA04MvAGT7f5O8la2v9k3NtQnJb3Q=="
+    },
+    "node_modules/vueperslides": {
+      "version": "3.5.1",
+      "resolved": "https://registry.npmjs.org/vueperslides/-/vueperslides-3.5.1.tgz",
+      "integrity": "sha512-g/Lauv1svlSaERzLNeys0oeLmpDFiXkIa+lxg+lJma6m6wXqJKzKKVIi8Kvc95XPnl42n7PYYJyr0+FMV6WZGw==",
+      "funding": {
+        "url": "https://github.com/sponsors/antoniandre"
+      },
+      "peerDependencies": {
+        "vue": "^2.6.14 || ^3.2.0"
+      }
+    },
+    "node_modules/vuex": {
+      "version": "4.1.0",
+      "resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
+      "integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
+      "dependencies": {
+        "@vue/devtools-api": "^6.0.0-beta.11"
+      },
+      "peerDependencies": {
+        "vue": "^3.2.0"
+      }
+    },
+    "node_modules/watchpack": {
+      "version": "2.4.0",
+      "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
+      "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+      "dependencies": {
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.1.2"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack": {
+      "version": "5.74.0",
+      "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.74.0.tgz",
+      "integrity": "sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==",
+      "dependencies": {
+        "@types/eslint-scope": "^3.7.3",
+        "@types/estree": "^0.0.51",
+        "@webassemblyjs/ast": "1.11.1",
+        "@webassemblyjs/wasm-edit": "1.11.1",
+        "@webassemblyjs/wasm-parser": "1.11.1",
+        "acorn": "^8.7.1",
+        "acorn-import-assertions": "^1.7.6",
+        "browserslist": "^4.14.5",
+        "chrome-trace-event": "^1.0.2",
+        "enhanced-resolve": "^5.10.0",
+        "es-module-lexer": "^0.9.0",
+        "eslint-scope": "5.1.1",
+        "events": "^3.2.0",
+        "glob-to-regexp": "^0.4.1",
+        "graceful-fs": "^4.2.9",
+        "json-parse-even-better-errors": "^2.3.1",
+        "loader-runner": "^4.2.0",
+        "mime-types": "^2.1.27",
+        "neo-async": "^2.6.2",
+        "schema-utils": "^3.1.0",
+        "tapable": "^2.1.1",
+        "terser-webpack-plugin": "^5.1.3",
+        "watchpack": "^2.4.0",
+        "webpack-sources": "^3.2.3"
+      },
+      "bin": {
+        "webpack": "bin/webpack.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependenciesMeta": {
+        "webpack-cli": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-cli": {
+      "version": "4.10.0",
+      "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz",
+      "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==",
+      "dependencies": {
+        "@discoveryjs/json-ext": "^0.5.0",
+        "@webpack-cli/configtest": "^1.2.0",
+        "@webpack-cli/info": "^1.5.0",
+        "@webpack-cli/serve": "^1.7.0",
+        "colorette": "^2.0.14",
+        "commander": "^7.0.0",
+        "cross-spawn": "^7.0.3",
+        "fastest-levenshtein": "^1.0.12",
+        "import-local": "^3.0.2",
+        "interpret": "^2.2.0",
+        "rechoir": "^0.7.0",
+        "webpack-merge": "^5.7.3"
+      },
+      "bin": {
+        "webpack-cli": "bin/cli.js"
+      },
+      "engines": {
+        "node": ">=10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      },
+      "peerDependencies": {
+        "webpack": "4.x.x || 5.x.x"
+      },
+      "peerDependenciesMeta": {
+        "@webpack-cli/generators": {
+          "optional": true
+        },
+        "@webpack-cli/migrate": {
+          "optional": true
+        },
+        "webpack-bundle-analyzer": {
+          "optional": true
+        },
+        "webpack-dev-server": {
+          "optional": true
+        }
+      }
+    },
+    "node_modules/webpack-cli/node_modules/commander": {
+      "version": "7.2.0",
+      "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+      "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+      "engines": {
+        "node": ">= 10"
+      }
+    },
+    "node_modules/webpack-merge": {
+      "version": "5.10.0",
+      "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+      "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+      "dependencies": {
+        "clone-deep": "^4.0.1",
+        "flat": "^5.0.2",
+        "wildcard": "^2.0.0"
+      },
+      "engines": {
+        "node": ">=10.0.0"
+      }
+    },
+    "node_modules/webpack-sources": {
+      "version": "3.2.3",
+      "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+      "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+      "engines": {
+        "node": ">=10.13.0"
+      }
+    },
+    "node_modules/webpack/node_modules/schema-utils": {
+      "version": "3.3.0",
+      "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+      "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+      "dependencies": {
+        "@types/json-schema": "^7.0.8",
+        "ajv": "^6.12.5",
+        "ajv-keywords": "^3.5.2"
+      },
+      "engines": {
+        "node": ">= 10.13.0"
+      },
+      "funding": {
+        "type": "opencollective",
+        "url": "https://opencollective.com/webpack"
+      }
+    },
+    "node_modules/which": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+      "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+      "dependencies": {
+        "isexe": "^2.0.0"
+      },
+      "bin": {
+        "node-which": "bin/node-which"
+      },
+      "engines": {
+        "node": ">= 8"
+      }
+    },
+    "node_modules/wildcard": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+      "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ=="
+    },
+    "node_modules/wrappy": {
+      "version": "1.0.2",
+      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+      "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ=="
+    },
+    "node_modules/xtend": {
+      "version": "4.0.2",
+      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+      "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+      "engines": {
+        "node": ">=0.4"
+      }
+    },
+    "node_modules/yallist": {
+      "version": "3.1.1",
+      "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+      "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g=="
+    }
+  }
+}
 
package.json (added)
+++ package.json
@@ -0,0 +1,48 @@
+{
+  "dependencies": {
+    "@babel/cli": "7.19.3",
+    "@babel/core": "7.19.3",
+    "@fortawesome/fontawesome-svg-core": "^6.4.2",
+    "@fortawesome/free-brands-svg-icons": "^6.4.2",
+    "@fortawesome/free-regular-svg-icons": "^6.4.2",
+    "@fortawesome/free-solid-svg-icons": "^6.4.2",
+    "@fortawesome/vue-fontawesome": "^3.0.3",
+    "axios": "^1.5.1",
+    "babel-loader": "8.2.5",
+    "css-loader": "6.7.1",
+    "express": "4.18.1",
+    "express-http-proxy": "^2.0.0",
+    "file-loader": "6.2.0",
+    "fs": "0.0.1-security",
+    "git": "^0.1.5",
+    "new-line": "^1.1.1",
+    "pg": "8.8.0",
+    "swiper": "^10.3.1",
+    "url-loader": "4.1.1",
+    "vue": "3.2.40",
+    "vue-carousel": "^0.18.0",
+    "vue-loader": "^17.0.0",
+    "vue-router": "4.1.5",
+    "vue-slick": "^1.2.0",
+    "vue-style-loader": "4.1.3",
+    "vue3-sfc-loader": "^0.8.4",
+    "vueperslides": "^3.5.1",
+    "vuex": "^4.1.0",
+    "webpack": "5.74.0",
+    "webpack-cli": "4.10.0"
+  },
+  "scripts": {
+    "prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+    "dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+    "windows-prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+    "windows-dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+    "linux-prod": "export NODE_ENV=production&&node ./server/modules/web/server.js",
+    "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/server.js",
+    "webpack-build": "webpack",
+    "webpack-build-watch": "webpack --watch"
+  },
+  "devDependencies": {
+    "less": "^4.2.0",
+    "less-loader": "^11.1.3"
+  }
+}
 
server/modules/db/mysql/MysqlConnection.js (added)
+++ server/modules/db/mysql/MysqlConnection.js
@@ -0,0 +1,62 @@
+/**
+ * @author : 최정우
+ * @since : 2022.10.21
+ * @dscription : Mysql DB Connection Pool 생성 관리 모듈 입니다. (private와 public object 환경 구성)
+ */
+ const MysqlConnection = (function () {
+
+    //Mysql DB Connection 라이브러리 모듈
+    const mysql = require('mysql');
+
+    //Connection Pool 객체 - private object(변수)
+    const connectionPool = mysql.createPool({
+        host: 'localhost',
+        user: 'root',
+        password: '1234',
+        database: 'test',
+        ssl: false,
+        port: 3306,
+        max: 10,
+    });
+
+    return {
+        getConnectionPool: function () {
+            return connectionPool;
+        },
+        queryExcute: function (sql, params) {
+            const result = new Promise((resolve, reject) => {
+                connectionPool.getConnection(function (connectionError, connection) {
+                    if (!connectionError) {
+                        try {
+                            connection.query(sql, params, function (queryError, rows, columns) {
+                                if (!queryError) {
+                                    resolve({'rows': rows, 'columns': columns});
+                                } else {
+                                    reject(queryError);
+                                }
+                            })
+                        } catch (proccessError) {
+                            reject(proccessError);
+                        } finally {
+                            connection.release(); 
+                        }
+                    } else {
+                        reject(connectionError);
+                    }
+                })
+
+                /* connectionPool.getConnection().then(async (connection) => {
+                    let queryResult = await connection.query(sql);
+                    resolve(queryResult);
+                    connection.release();
+                }).catch((error) => {
+                    reject(error);
+                }); */
+            })
+            return result;
+        },
+    }
+
+})();
+
+module.exports = MysqlConnection;(No newline at end of file)
 
server/modules/db/oracle/OracleConnection.js (added)
+++ server/modules/db/oracle/OracleConnection.js
@@ -0,0 +1,62 @@
+/**
+ * @author : 방선주
+ * @since : 2022.09.22
+ * @dscription : Oracle DB Connection Pool 생성 관리 모듈 입니다.
+ * 
+ * @modifier : 최정우
+ * @modified : 2022.10.30
+ */
+ const { BASE_DIR } = require('../../../../Global');
+
+ const OracleConnection = function () {
+   //오라클 라이브러리 import
+   const oracledb = require('oracledb');
+   //라이브러리 초기화(oracle client setting)
+   oracledb.initOracleClient({ libDir: `${BASE_DIR}/server/modules/db/oracle/client/client_19.16` });
+ 
+   //DB Connection Pool
+   let connectionPool = null;
+ 
+   //DB Connection Pool 생성
+   oracledb.createPool({
+     user: 'ajin_data',
+     password: 'ajinvldosvl1121',  // myhrpw contains the hr schema password
+     connectString: '(DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 211.216.206.147)(PORT = 1521)))(CONNECT_DATA = (SID = XE)))',
+     poolMin: 0,
+     poolMax: 20,
+     //poolAlias: 'ajin_odbcp'//poolAlias가 정의되지 않으면, default pool로 정의됨
+   }).then((result) => {
+     connectionPool = result;
+     console.log("Successfully connected to Oracle Database");
+   }).catch((error) => {
+     console.error(error);
+   });
+ 
+   return {
+     getConnectionPool: function () {
+       return connectionPool;
+     },
+     getConnection: function () {
+       return oracledb.getConnection();
+     },
+     queryExcute: function (sql, params) {
+       const result = new Promise((resolve, reject) => {
+         oracledb.getConnection().then(async (connection) => {
+           let queryResult = null;
+           if (!params) {
+             queryResult = await connection.execute(sql);
+           } else {
+             queryResult = await connection.execute(sql, params);
+           }
+           resolve(queryResult);
+           connection.close();
+         }).catch((error) => {
+           reject(error);
+         });
+       })
+       return result;
+     },
+   }
+ }();
+ 
+ module.exports = OracleConnection;(No newline at end of file)
 
server/modules/db/oracle/client/client_19.16/BASIC_LICENSE (added)
+++ server/modules/db/oracle/client/client_19.16/BASIC_LICENSE
@@ -0,0 +1,123 @@
+Oracle Free Use Terms and Conditions
+
+Definitions
+
+"Oracle" refers to Oracle America, Inc. "You" and "Your" refers to (a)
+a company or organization (each an "Entity") accessing the Programs,
+if use of the Programs will be on behalf of such Entity; or (b) an
+individual accessing the Programs, if use of the Programs will not be
+on behalf of an Entity. "Program(s)" refers to Oracle software
+provided by Oracle pursuant to the following terms and any updates,
+error corrections, and/or Program Documentation provided by
+Oracle. "Program Documentation" refers to Program user manuals and
+Program installation manuals, if any. If available, Program
+Documentation may be delivered with the Programs and/or may be
+accessed from www.oracle.com/documentation. "Separate Terms" refers to
+separate license terms that are specified in the Program
+Documentation, readmes or notice files and that apply to Separately
+Licensed Technology. "Separately Licensed Technology" refers to Oracle
+or third party technology that is licensed under Separate Terms and
+not under the terms of this license.
+
+Separately Licensed Technology
+
+Oracle may provide certain notices to You in Program Documentation,
+readmes or notice files in connection with Oracle or third party
+technology provided as or with the Programs. If specified in the
+Program Documentation, readmes or notice files, such technology will
+be licensed to You under Separate Terms. Your rights to use Separately
+Licensed Technology under Separate Terms are not restricted in any way
+by the terms herein. For clarity, notwithstanding the existence of a
+notice, third party technology that is not Separately Licensed
+Technology shall be deemed part of the Programs licensed to You under
+the terms of this license.
+
+Source Code for Open Source Software
+
+For software that You receive from Oracle in binary form that is
+licensed under an open source license that gives You the right to
+receive the source code for that binary, You can obtain a copy of the
+applicable source code from https://oss.oracle.com/sources/ or
+http://www.oracle.com/goto/opensourcecode. If the source code for such
+software was not provided to You with the binary, You can also receive
+a copy of the source code on physical media by submitting a written
+request pursuant to the instructions in the "Written Offer for Source
+Code" section of the latter website.
+
+-------------------------------------------------------------------------------
+
+The following license terms apply to those Programs that are not
+provided to You under Separate Terms.
+
+License Rights and Restrictions
+
+Oracle grants to You, as a recipient of this Program, a nonexclusive,
+nontransferable, limited license to, subject to the conditions stated
+herein, (a) internally use the unmodified Programs for the purposes of
+developing, testing, prototyping and demonstrating your applications,
+and running the Programs for your own internal business operations;
+and (b) redistribute unmodified Programs and Programs Documentation,
+under the terms of this License, provided that You do not charge Your
+end users any additional fees for the use of the Programs. You may
+make copies of the Programs to the extent reasonably necessary for
+exercising the license rights granted herein and for backup
+purposes. You are granted the right to use the Programs to provide
+third party training in the use of the Programs and associated
+Separately Licensed Technology only if there is express authorization
+of such use by Oracle on the Program's download page or in the Program
+Documentation.
+
+Your license is contingent on Your compliance with the following conditions:
+
+    - You include a copy of this license with any distribution by You
+      of the Programs;
+
+    - You do not remove markings or notices of either Oracle's or a
+      licensor's proprietary rights from the Programs or Program
+      Documentation;
+
+    - You comply with all U.S. and applicable export control and
+      economic sanctions laws and regulations that govern Your use of
+      the Programs (including technical data);
+
+    - You do not cause or permit reverse engineering, disassembly or
+      decompilation of the Programs (except as allowed by law) by You
+      nor allow an associated party to do so.
+
+For clarity, any source code that may be included in the distribution
+with the Programs is provided solely for reference purposes and may
+not be modified, unless such source code is under Separate Terms
+permitting modification.
+
+Ownership
+
+Oracle or its licensors retain all ownership and intellectual property
+rights to the Programs.
+
+Information Collection
+
+The Programs' installation and/or auto-update processes, if any, may
+transmit a limited amount of data to Oracle or its service provider
+about those processes to help Oracle understand and optimize
+them. Oracle does not associate the data with personally identifiable
+information. Refer to Oracle's Privacy Policy at
+www.oracle.com/privacy.
+
+Disclaimer of Warranties; Limitation of Liability
+
+THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ORACLE
+FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING
+WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL ORACLE BE LIABLE TO
+YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+Last updated:  8 October 2018
+
 
server/modules/db/oracle/client/client_19.16/BASIC_README (added)
+++ server/modules/db/oracle/client/client_19.16/BASIC_README
@@ -0,0 +1,30 @@
+Basic Package Information 
+========================= 
+Sun Jul 17 14:46:23 MDT 2022
+Client Shared Library 64-bit - 19.16.0.0.0
+
+Windows NT Version V6.2  
+CPU                 : 4 - type 86644 physical cores
+Process Affinity    : 0x0000000000000000
+Memory (Avail/Total): Ph:10181M/16381M, Ph+PgF:12546M/18813M 
+
+
+TIMEZONE INFORMATION
+--------------------
+Operating in ORACLE_HOME environment.
+
+Small timezone file = timezone_32.dat
+Large timezone file = timezlrg_32.dat
+
+LICENSE AGREEMENT
+-----------------------------
+Your use of this copy of Oracle Instant Client software product is subject to, and may not exceed the conditions of use for which you are authorized under one of the following:
+
+(i) the license or cloud services terms that you accepted when you obtained the right to use Oracle Instant Client software; or
+(ii) the license terms that you agreed to when you placed your order with Oracle for an Oracle product containing Oracle Instant Client software; or
+(iii) the Oracle Instant Client software license terms, if any, included with the hardware that you acquired from Oracle; or
+(iv) the Oracle Technology Network License Agreement (which you acknowledge you have read and agree to) available at http://www.oracle.com/technetwork/licenses/distribution-license-152002.html; or, if (i), (ii), (iii), and or (iv) are not applicable, then,
+(v) the Oracle Free Use Terms and Conditions available at BASIC_LICENSE.
+
+Oracle's obligations with respect to your use of the Oracle Instant Client, including, without limitation, obligations to indemnify you, if any, shall only be as set forth in the specific license under which you are authorized and choose to use Oracle Instant Client.
+
 
server/modules/db/oracle/client/client_19.16/adrci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/adrci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/adrci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/adrci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/genezi.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/genezi.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/genezi.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/genezi.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oci.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oci.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ocijdbc19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ocijdbc19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ocijdbc19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ocijdbc19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ociw32.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ociw32.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ociw32.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ociw32.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ojdbc8.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ojdbc8.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oramysql19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oramysql19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oramysql19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oramysql19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orannzsbb19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orannzsbb19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orannzsbb19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orannzsbb19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19d.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19d.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraocci19d.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraocci19d.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraociei19.dll (added)
+++ server/modules/db/oracle/client/client_19.16/oraociei19.dll
This file is too big to display.
 
server/modules/db/oracle/client/client_19.16/oraociei19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraociei19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/oraons.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/oraons.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orasql19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orasql19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/orasql19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/orasql19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/ucp.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/ucp.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/uidrvci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/uidrvci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/uidrvci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/uidrvci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/vc14/oraocci19d.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_19.16/xstreams.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_19.16/xstreams.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/BASIC_LICENSE (added)
+++ server/modules/db/oracle/client/client_21.6/BASIC_LICENSE
@@ -0,0 +1,123 @@
+Oracle Free Use Terms and Conditions
+
+Definitions
+
+"Oracle" refers to Oracle America, Inc. "You" and "Your" refers to (a)
+a company or organization (each an "Entity") accessing the Programs,
+if use of the Programs will be on behalf of such Entity; or (b) an
+individual accessing the Programs, if use of the Programs will not be
+on behalf of an Entity. "Program(s)" refers to Oracle software
+provided by Oracle pursuant to the following terms and any updates,
+error corrections, and/or Program Documentation provided by
+Oracle. "Program Documentation" refers to Program user manuals and
+Program installation manuals, if any. If available, Program
+Documentation may be delivered with the Programs and/or may be
+accessed from www.oracle.com/documentation. "Separate Terms" refers to
+separate license terms that are specified in the Program
+Documentation, readmes or notice files and that apply to Separately
+Licensed Technology. "Separately Licensed Technology" refers to Oracle
+or third party technology that is licensed under Separate Terms and
+not under the terms of this license.
+
+Separately Licensed Technology
+
+Oracle may provide certain notices to You in Program Documentation,
+readmes or notice files in connection with Oracle or third party
+technology provided as or with the Programs. If specified in the
+Program Documentation, readmes or notice files, such technology will
+be licensed to You under Separate Terms. Your rights to use Separately
+Licensed Technology under Separate Terms are not restricted in any way
+by the terms herein. For clarity, notwithstanding the existence of a
+notice, third party technology that is not Separately Licensed
+Technology shall be deemed part of the Programs licensed to You under
+the terms of this license.
+
+Source Code for Open Source Software
+
+For software that You receive from Oracle in binary form that is
+licensed under an open source license that gives You the right to
+receive the source code for that binary, You can obtain a copy of the
+applicable source code from https://oss.oracle.com/sources/ or
+http://www.oracle.com/goto/opensourcecode. If the source code for such
+software was not provided to You with the binary, You can also receive
+a copy of the source code on physical media by submitting a written
+request pursuant to the instructions in the "Written Offer for Source
+Code" section of the latter website.
+
+-------------------------------------------------------------------------------
+
+The following license terms apply to those Programs that are not
+provided to You under Separate Terms.
+
+License Rights and Restrictions
+
+Oracle grants to You, as a recipient of this Program, a nonexclusive,
+nontransferable, limited license to, subject to the conditions stated
+herein, (a) internally use the unmodified Programs for the purposes of
+developing, testing, prototyping and demonstrating your applications,
+and running the Programs for your own internal business operations;
+and (b) redistribute unmodified Programs and Programs Documentation,
+under the terms of this License, provided that You do not charge Your
+end users any additional fees for the use of the Programs. You may
+make copies of the Programs to the extent reasonably necessary for
+exercising the license rights granted herein and for backup
+purposes. You are granted the right to use the Programs to provide
+third party training in the use of the Programs and associated
+Separately Licensed Technology only if there is express authorization
+of such use by Oracle on the Program's download page or in the Program
+Documentation.
+
+Your license is contingent on Your compliance with the following conditions:
+
+    - You include a copy of this license with any distribution by You
+      of the Programs;
+
+    - You do not remove markings or notices of either Oracle's or a
+      licensor's proprietary rights from the Programs or Program
+      Documentation;
+
+    - You comply with all U.S. and applicable export control and
+      economic sanctions laws and regulations that govern Your use of
+      the Programs (including technical data);
+
+    - You do not cause or permit reverse engineering, disassembly or
+      decompilation of the Programs (except as allowed by law) by You
+      nor allow an associated party to do so.
+
+For clarity, any source code that may be included in the distribution
+with the Programs is provided solely for reference purposes and may
+not be modified, unless such source code is under Separate Terms
+permitting modification.
+
+Ownership
+
+Oracle or its licensors retain all ownership and intellectual property
+rights to the Programs.
+
+Information Collection
+
+The Programs' installation and/or auto-update processes, if any, may
+transmit a limited amount of data to Oracle or its service provider
+about those processes to help Oracle understand and optimize
+them. Oracle does not associate the data with personally identifiable
+information. Refer to Oracle's Privacy Policy at
+www.oracle.com/privacy.
+
+Disclaimer of Warranties; Limitation of Liability
+
+THE PROGRAMS ARE PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND. ORACLE
+FURTHER DISCLAIMS ALL WARRANTIES, EXPRESS AND IMPLIED, INCLUDING
+WITHOUT LIMITATION, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS
+FOR A PARTICULAR PURPOSE, OR NONINFRINGEMENT.
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW WILL ORACLE BE LIABLE TO
+YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+Last updated:  8 October 2018
+
 
server/modules/db/oracle/client/client_21.6/BASIC_README (added)
+++ server/modules/db/oracle/client/client_21.6/BASIC_README
@@ -0,0 +1,30 @@
+Basic Package Information 
+========================= 
+Fri May 27 02:14:20 MDT 2022
+Client Shared Library 64-bit - 21.6.0.0.0
+
+Windows NT Version V6.3  OS Build 9600
+CPU                 : 4 - type 86644 physical cores
+Process Affinity    : 0x0000000000000000
+Memory (Avail/Total): Ph:10006M/16381M, Ph+PgF:12115M/18813M 
+
+
+TIMEZONE INFORMATION
+--------------------
+Operating in ORACLE_HOME environment.
+
+Small timezone file = timezone_35.dat
+Large timezone file = timezlrg_35.dat
+
+LICENSE AGREEMENT
+-----------------------------
+Your use of this copy of Oracle Instant Client software product is subject to, and may not exceed the conditions of use for which you are authorized under one of the following:
+
+(i) the license or cloud services terms that you accepted when you obtained the right to use Oracle Instant Client software; or
+(ii) the license terms that you agreed to when you placed your order with Oracle for an Oracle product containing Oracle Instant Client software; or
+(iii) the Oracle Instant Client software license terms, if any, included with the hardware that you acquired from Oracle; or
+(iv) the Oracle Technology Network License Agreement (which you acknowledge you have read and agree to) available at http://www.oracle.com/technetwork/licenses/distribution-license-152002.html; or, if (i), (ii), (iii), and or (iv) are not applicable, then,
+(v) the Oracle Free Use Terms and Conditions available at BASIC_LICENSE.
+
+Oracle's obligations with respect to your use of the Oracle Instant Client, including, without limitation, obligations to indemnify you, if any, shall only be as set forth in the specific license under which you are authorized and choose to use Oracle Instant Client.
+
 
server/modules/db/oracle/client/client_21.6/adrci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/adrci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/adrci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/adrci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/genezi.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/genezi.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/genezi.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/genezi.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/network/admin/README (added)
+++ server/modules/db/oracle/client/client_21.6/network/admin/README
@@ -0,0 +1,9 @@
+============================================================================= 
+This is the default directory for Oracle Network and Oracle Client 
+configuration files. You can place files such as tnsnames.ora, sqlnet.ora 
+and oraaccess.xml in this directory. 
+NOTE: 
+If you set an environment variable TNS_ADMIN to another directory containing 
+configuration files, they will be used instead of the files in this default 
+directory. 
+============================================================================= 
 
server/modules/db/oracle/client/client_21.6/oci.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oci.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ocijdbc21.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ocijdbc21.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ocijdbc21.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ocijdbc21.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ociw32.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ociw32.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ociw32.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ociw32.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ojdbc8.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ojdbc8.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oramysql.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oramysql.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oramysql.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oramysql.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orannzsbb.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orannzsbb.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orannzsbb.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orannzsbb.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21d.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21d.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraocci21d.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraocci21d.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/oraociei.dll (added)
+++ server/modules/db/oracle/client/client_21.6/oraociei.dll
This file is too big to display.
 
server/modules/db/oracle/client/client_21.6/oraociei.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/oraociei.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orasql.dll (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orasql.dll
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/orasql.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/orasql.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/ucp.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/ucp.jar
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/uidrvci.exe (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/uidrvci.exe
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/uidrvci.sym (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/uidrvci.sym
Binary file is not shown
 
server/modules/db/oracle/client/client_21.6/xstreams.jar (Binary) (added)
+++ server/modules/db/oracle/client/client_21.6/xstreams.jar
Binary file is not shown
 
server/modules/db/postgresql/PostgresqlConnection.js (added)
+++ server/modules/db/postgresql/PostgresqlConnection.js
@@ -0,0 +1,41 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : PostgreSQL DB Connection Pool 생성 관리 모듈 입니다. (private와 public object 환경 구성)
+ */
+const PostgresqlConnection = (function () {
+
+    //PostgreSQL DB Connection 라이브러리 모듈
+    const pg = require('pg');
+
+    //Connection Pool 객체 - private object(변수)
+    const connectionPool = new pg.Pool({
+        //host: 'localhost',
+        host: '192.168.0.250',
+        user: 'test_user',
+        password: '1234',
+        database: 'test_db',
+        ssl: false,
+        port: 5432,
+        max: 10,
+    });
+
+    //public object
+    return {
+        getConnectionPool: function () {
+            return connectionPool;
+        },
+        getConnectionPoolClient: function () {
+            return connectionPool.connect();
+        },
+        queryExcute: function (sql, params) {
+            return connectionPool.query(sql, params);
+        },
+    }
+
+})();
+
+//Module Export
+module.exports = PostgresqlConnection;
+
+
 
server/modules/log/Logger.js (added)
+++ server/modules/log/Logger.js
@@ -0,0 +1,131 @@
+const { LOG_BASE_DIR, SERVICE_STATUS } = require('../../../Global');
+const fs = require('fs');
+const Queue = require('../util/Queue');
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.21
+ * @dscription : Log 생성기 모듈 입니다.
+ */
+const Logger = (function () {
+
+    /* let testInterval = setInterval(() => {
+        const date = new Date();
+        var now = `${date.getFullYear()}.${(date.getMonth()+1)}.${date.getDate()} ${date.getHours()}:${date.getMinutes()}:${date.getSeconds()}.${date.getMilliseconds()}`;
+        console.log('now :', now);
+    }, 1000) */
+
+    //로그 쓰기 전, 대기 저장소
+    const eventQueue = new Queue();
+    //로그 쓰는 중인지 아닌지 상태값
+    let isLogging = false;
+
+    /**
+     * @author : 최정우
+     * @since : 2022.09.21
+     * @dscription : Log 처리
+     */
+    const logging = (message) => {
+        const date = new Date();
+        let year = date.getFullYear();
+        let month = prefixZero((date.getMonth() + 1), 2);
+        let day = prefixZero(date.getDate(), 2);
+        let hour = prefixZero(date.getHours(), 2);
+        let minute = prefixZero(date.getMinutes(), 2);
+        let second = prefixZero(date.getSeconds(), 2);
+        let millisecond = prefixZero(date.getMilliseconds(), 3);
+
+        //로그에 쓰일 정보
+        const logMessage = {
+            message: message,
+            datetime: `${year}.${month}.${day} ${hour}:${minute}:${second}.${millisecond}`,
+            logFolderDir: `${LOG_BASE_DIR}/${year}${month}`,//log 폴더 경로
+            logFileName: `log-${year}${month}${day}.log`//log 파일명
+        }
+
+        //로그 쓰는 중이면, 대기 저장소에 등록
+        if (isLogging == true) {
+            eventQueue.push(logMessage);
+        } else {//로그 쓰는 중이 아니면, 로그 쓰는 중인 상태로 변경 후, 로그 쓰기
+            isLogging = true;
+
+            try {
+                //log 폴더 생성
+                if (!fs.existsSync(logMessage.logFolderDir)) {
+                    fs.mkdirSync(logMessage.logFolderDir, { recursive: true/*재귀적 폴더 생성*/ });
+                }
+
+                //log 파일 Full Path
+                let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
+                //log 내용
+                let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
+
+                //log 내용 쓰기
+                writeLogFile(logFileFullPath, logContent);
+            } catch (error) {
+                console.log('logging error : ', error);
+            } finally {
+                isLogging = false;
+            }
+        }
+    }
+
+    /**
+     * @author : 최정우
+     * @since : 2022.09.21
+     * @dscription : Log 내용 쓰기
+     */
+    const writeLogFile = (path, content) => {
+        if (SERVICE_STATUS == 'development') {
+            console.log(content);
+        }
+        
+        //파일 쓰기
+        fs.appendFileSync(path, `${content}\n`, 'utf8');
+
+        //로그 쓰기 저장소에서 로그 메세지 꺼내기
+        let logMessage = eventQueue.pop();
+        //메세지가 존재하면 => Log 내용 쓰기 (재귀 호출)
+        if (logMessage != undefined) {
+            //log 파일 Full Path
+            let logFileFullPath = `${logMessage.logFolderDir}/${logMessage.logFileName}`;
+            //log 내용
+            let logContent = `[${logMessage.datetime}] ${logMessage.message}`;
+            //Log 내용 쓰기 (재귀 호출)
+            writeLogFile(logFileFullPath, logContent);
+        } else {
+            return;
+        }
+    }
+
+    /**
+     * @author : 최정우
+     * @since : 2022.09.21
+     * @dscription : 특정 길이만큼 앞에 '0' 붙이기
+     */
+    const prefixZero = (target, length) => {
+        let zero = '';
+        let suffix = target;
+        let result = '';
+
+        if ((typeof target) === "number") {
+            suffix = target.toString();
+        }
+        if (suffix.length < length) {
+            for (i = 0; i < length - suffix.length; i++) {
+                zero += '0';
+            }
+        }
+        result = zero + suffix;
+        return result;
+    }
+
+
+    return {
+        logging: logging
+    }
+
+})();
+
+//Module Export
+module.exports = Logger;(No newline at end of file)
 
server/modules/util/Queue.js (added)
+++ server/modules/util/Queue.js
@@ -0,0 +1,32 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.21
+ * @dscription : Queue(선입선출) 자료형 객체 입니다.
+ */
+class Queue {
+    constructor() {
+        this._arr = [];
+    }
+
+    //입력
+    push (item) {
+        this._arr.push(item);
+    }
+
+    //출력 후, 제거
+    pop () {
+        return this._arr.shift();
+    }
+
+    //출력 대기 중인 item return
+    peek () {
+        return this._arr[0];
+    }
+
+    //확인
+    showQueue () {
+        console.log('Queue : ', this._arr);
+    }
+}
+
+module.exports = Queue;(No newline at end of file)
 
server/modules/web/Server.js (added)
+++ server/modules/web/Server.js
@@ -0,0 +1,118 @@
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Express 라이브러리 활용 HTTP Web Server 모듈입니다.
+ */
+const { BASE_DIR, PORT, API_SERVER_HOST } = require('../../../Global');
+const Logger = require('../log/Logger');//Logger(필수)
+
+const express = require('express');
+const webServer = express();
+const expressProxy = require('express-http-proxy');
+
+//파일 시스템 관련 라이브러리
+const FS = require('fs');
+//stream: 특정 자원을 Streaming 하기 위한 라이브러리 => Transform: Streaming 중인 자원의 Data에 Data 수정 및 추가를 지원해주는 객체
+const Transform = require('stream').Transform;
+//Streaming 중인 자원에 새로운 데이터를 stream 공간에 추가하기 위한 라이브러리
+const newLineStream = require('new-line');
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : HTTP Server start
+ */
+webServer.listen(PORT, function () {
+    Logger.logging(`★★★ Node.js를 활용한 Web Server 구동(Port:${PORT}) ★★★`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Intercepter 역할을 하는 미들웨어 기능
+ */
+webServer.use(function (request, response, next) {
+    let ip = request.headers['x-forwarded-for'] || request.socket.remoteAddress;
+    Logger.logging(`[HTTP] ${request.url} (Method: ${request.method}, IP: ${ip})`);
+    next();
+});
+
+
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : ROOT URL -> index.html
+ */
+webServer.get('/', function (request, response) {
+    //response.sendFile을 통한 HTTP html reponse (html내용 Streaming)
+    response.sendFile(`${BASE_DIR}/client/views/index.html`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : 화면요청 URL 처리
+ */
+webServer.get('*.page', function (request, response, next) {
+    //index.html 내용을 직접 Streaming하여 Response, Streaming 중간에 내용 수정
+    //수정 내용 : URL 요청이 아닌, 브라우저에 표시된 URL만 변경하여, 해당하는 URL PATH의 Vue Component를 routing하기 위함
+    const StreamTransform = new Transform();
+    StreamTransform._transform = function (data, encoding, done) {
+        let fileContent = data.toString();
+        let replaceBeforeContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '/';</script>`;
+        let replaceAfterContent = `<script id="app-start-vue-page">const APP_USER_HTTP_REQUEST_URL = '${request.params['0']}.page';</script>`;
+        fileContent.replace(replaceBeforeContent, replaceAfterContent);
+        this.push(fileContent);
+        done();
+    }
+    //Streaming 진행
+    FS.createReadStream(`${BASE_DIR}/client/views/index.html`).pipe(newLineStream()).pipe(StreamTransform).pipe(response);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
+ */
+webServer.use('*.json', expressProxy(API_SERVER_HOST, {
+    proxyReqPathResolver: function (request) {
+        //console.log('request : ', request.url, request.params[0]);
+        return `${request.params['0']}.json`;
+    }
+}));
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : REST API 서버에 데이터 요청 보내기(Proxy)
+ */
+webServer.use('*.file', expressProxy(API_SERVER_HOST, {
+    parseReqBody : false,
+    proxyReqPathResolver: function (request) {
+        console.log('request : ', request.url, request.params[0]);
+        return `${request.params['0']}.file`;
+    }
+}));
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : ROOT URL, Router's, 화면요청 URL 등.. 이 외 나머지 정적 자원에 대한 처리 기능
+ */
+webServer.get('*.*', function (request, response, next) {
+    response.sendFile(`${BASE_DIR}${request.params['0']}.${request.params['1']}`);
+})
+
+/**
+ * @author : 하석형
+ * @since : 2023.08.24
+ * @dscription : Global Error Handler (*맨 마지막에 적용해야됨)
+ */
+webServer.use(function (error, request, response, next) {
+    const errorCode = !error.statusCode ? 500 : error.statusCode;
+    response.status(errorCode).send('에러가 발생하였습니다. 관리자에게 문의바랍니다.');
+    let message = `[Error:${errorCode}] ${request.url}/n ${error.stack}/n`;
+    Logger.logging(message);
+    //next();
+})(No newline at end of file)
 
server/service/test/model/TestDAO.js (added)
+++ server/service/test/model/TestDAO.js
@@ -0,0 +1,190 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트용 DB 접근을 담당하는 모듈 입니다.
+ */
+ const TestDAO = (function () {
+
+    //PostgreSQL DB Connection 객체 - private object(변수)
+    const PostgresqlConnection = require('../../../modules/db/postgresql/PostgresqlConnection');
+    //console.log('PostgresqlConnection : ', PostgresqlConnection);
+    const connectionPool = PostgresqlConnection.getConnectionPool();
+
+    //public object
+    return {
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 목록 조회
+         */
+        testSelectList: function (param) {
+            return connectionPool.query('SELECT * FROM test_schema.test_table');
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 상세 조회
+         */
+        testSelectOne: function (param) {
+            return connectionPool.query('SELECT * FROM test_schema.test_table WHERE test_seq = $1', param);
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 등록
+         */
+        testInsertOne: function (param) {
+            return connectionPool.query(
+                //RETURNING <*||COLUMN NAME1,COLUMN NAME2,...> : 등록한 Data return 받는 기능
+                //ex1) RETURNING * : 모든 컬럼 다 return 함
+                //ex2) RETURNING name : 컬럼명이 'name'인 데이터만 return 함
+                `INSERT INTO test_schema.test_table (
+                    test_seq
+                    , test_title
+                    , test_content
+                    , test_create_datetime
+                    , test_create_user
+                ) VALUES (
+                    (SELECT COALESCE(MAX(test_seq), 0) + 1 FROM test_schema.test_table)
+                    , $1
+                    , $2
+                    , current_timestamp
+                    , 1
+                ) RETURNING test_seq`,
+                param
+            );
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 수정
+         */
+        testUpdateOne: function (param) {
+            return connectionPool.query(
+                `UPDATE
+                    test_schema.test_table
+                SET 
+                    test_title = $2
+                    , test_content = $3
+                    , test_update_datetime = current_timestamp
+                    , test_update_user = 1
+                WHERE
+                    test_seq = $1`,
+                param
+            );
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 삭제
+         */
+        testDeleteOne: function (param) {
+            return connectionPool.query(
+                `DELETE
+                FROM
+                    test_schema.test_table
+                WHERE
+                    test_seq = $1`,
+                param
+            );
+        },
+
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 트랜젝션 처리
+         * 
+         * 트랜잭션 작업 진행 시나리오
+         *  1. connection pool 한 개 받아오기
+         *  2. BEGIN(트랜잭션 시작 처리)
+         *  3. [※작업내용1] 데이터 등록
+         *  4. [※작업내용2] 등록한 데이터 수정
+         *  5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+         *     *에러 발생시, 실행(dispatch)한 모든 쿼리를 ROLLBACK(롤백)
+         *  6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+         */
+         testTransaction: function (param) {
+            return new Promise((resolve, reject) => {
+                //1. connection pool 한 개 받아오기
+                const poolClient = PostgresqlConnection.getConnectionPoolClient();
+                poolClient.then(async(client) => {//async 처리
+                    try {
+                        //2. BEGIN(트랜잭션 시작 처리)
+                        await client.query('BEGIN');
+
+                        //처리 3초 지연
+                        //await client.query('SELECT pg_sleep(3);');
+
+                        //3. [※작업내용1] 데이터 등록
+                        let insertResultData = await client.query(
+                            `INSERT INTO test_schema.test_table (
+                                test_seq
+                                , test_title
+                                , test_content
+                                , test_create_datetime
+                                , test_create_user
+                            ) VALUES (
+                                (SELECT COALESCE(MAX(test_seq), 0) + 1 FROM test_schema.test_table)
+                                , $1
+                                , $2
+                                , current_timestamp
+                                , 1
+                            ) RETURNING test_seq`,
+                            param
+                        );
+                        //console.log('등록 결과 정보 insertResultData : ', insertResultData);
+
+                        //throw '트랜잭션 처리중 Error 강제로 발생시킴';
+
+                        //4. [※작업내용2] 등록한 데이터 수정
+                        let updateResultData = await client.query(
+                            `UPDATE
+                                test_schema.test_table
+                            SET 
+                                test_title = 'title transaction update'
+                                , test_content = 'content transaction update'
+                                , test_update_datetime = current_timestamp 1231ㄱㄹㅇㄴ
+                                , test_update_user = 1
+                            WHERE
+                                test_seq = ${insertResultData.rows[0].test_seq}`
+                        );
+                        //console.log('수정 결과 정보 updateResultData : ', updateResultData);
+
+                        throw '트랜잭션 처리중 Error 강제로 발생시킴';
+
+                        //5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+                        let commitResultData = await client.query('COMMIT');
+                        //console.log('커밋 결과 정보 commitResultData : ', commitResultData);
+
+                        //Promise resolve 처리
+                        resolve(commitResultData);
+                    } catch (error) {
+                        //5. *에러 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+                        let rollbackResultData = await client.query('ROLLBACK');
+                        console.log('롤백 결과 정보 rollbackResultData : ', rollbackResultData);
+
+                        //Promise reject 처리
+                        reject(error);
+                    } finally {
+                        //6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+                        client.release();
+                    }
+                }).catch((error) => {
+                    //Promise reject 처리
+                    reject(error);
+                })
+            });
+        },//testTransaction() end
+
+    }//return end
+ 
+ })();
+ 
+ //Module Export
+ module.exports = TestDAO;(No newline at end of file)
 
server/service/test/model/TestService.js (added)
+++ server/service/test/model/TestService.js
@@ -0,0 +1,138 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트용 서비스 로직을 담당하는 모듈 입니다.
+ */
+ const TestService = (function () {
+
+    //DAO
+    const TestDAO = require('./TestDAO');
+    
+    //public object
+    return {
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 목록 조회
+         * @callback : parameter -> {data: Object, error: Object}
+         */
+        testSelectList: function (callback, param) {
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testSelectList(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testSelectList connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 상세 조회
+         */
+        testSelectOne: function (callback, param) {
+            param = [1];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testSelectOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testSelectOne connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 등록
+         */
+         testInsertOne: function (callback, param) {
+            param = ['test title', 'test content'];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testInsertOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testInsertOne connect dataAccessResult : ', data.rows[0]['test_seq']);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 수정
+         */
+        testUpdateOne: function (callback, param) {
+            param = [1, 'test title update', 'test content update'];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testUpdateOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testUpdateOne connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 데이터 삭제
+         */
+        testDeleteOne: function (callback, param) {
+            param = [10];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testDeleteOne(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testDeleteOne connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+        /**
+         * @author : 최정우
+         * @since : 2022.09.20
+         * @dscription : 테스트 트랜젝션 처리
+         * 
+         * 트랜잭션 작업 진행 시나리오
+         *  1. connection pool 한 개 받아오기
+         *  2. BEGIN(트랜잭션 시작 처리)
+         *  3. [※작업내용1] 데이터 등록
+         *  4. [※작업내용2] 등록한 데이터 수정
+         *  5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+         *     *에러 발생시, 실행(dispatch)한 모든 쿼리를 ROLLBACK(롤백)
+         *  6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+         */
+         testTransaction: function (callback, param) {
+            param = ['test title', 'test content'];
+            //Data Access 접근
+            let dataAccessResult = TestDAO.testTransaction(param);
+            //Data Access 결과
+            dataAccessResult.then((data) => {
+                console.log('TestService testTransaction connect dataAccessResult : ', data);
+                callback({data: data, error: null});//Router에 결과 전달
+            }).catch((error) => {
+                callback({data: null, error: error});//Router에 Error 전달
+            })
+        },
+
+
+    }
+ 
+ })();
+ 
+ //Module Export
+ module.exports = TestService;
+ (No newline at end of file)
 
server/service/test/router/TestRouter.js (added)
+++ server/service/test/router/TestRouter.js
@@ -0,0 +1,119 @@
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트용 Router(Controller) 모듈 입니다.
+ */
+const express = require('express');
+const router = express.Router();
+
+//Service
+const TestService = require('../model/TestService');
+
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 목록 조회(POST)
+ */
+router.get('/testSelectList.json', function (request, response, next) {
+    //Callback 함수 Parameter result = {data: Object, error: Object}
+    TestService.testSelectList((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    });
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 상세 조회(POST)
+ */
+router.get('/testSelectOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testSelectOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    });
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 등록 (POST)
+ */
+router.get('/testInsertOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testInsertOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 수정 (POST)
+ */
+router.get('/testUpdateOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testUpdateOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 데이터 삭제 (POST)
+ */
+router.get('/testDeleteOne.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testDeleteOne((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+/**
+ * @author : 최정우
+ * @since : 2022.09.20
+ * @dscription : 테스트 트랜젝션 처리
+ * 
+ * 트랜잭션 작업 진행 시나리오
+ *  1. connection pool 한 개 받아오기
+ *  2. BEGIN(트랜잭션 시작 처리)
+ *  3. [※작업내용1] 데이터 등록
+ *  4. [※작업내용2] 등록한 데이터 수정
+ *  5. *작업 완료시, 실행(dispatch)한 모든 쿼리를 COMMIT(커밋)
+ *     *에러 발생시, 실행(dispatch)한 모든 쿼리를 ROLLBACK(롤백)
+ *  6. 받아온 connection pool 반납(해제) - 필수(반납하지 않으면 해당 pool을 사용하는 query는 트랜잭션에 계속 매달려있음)
+ */
+router.get('/testTransaction.json', function (request, response, next) {
+    //Callback 함수 Parameter -> result = {data: Object, error: Object}
+    TestService.testTransaction((result) => {
+        if (!result.error) {
+            response.send(result.data);
+        } else {
+            next(result.error);//Global Error Handler에게 예외상황 맡기기
+        }
+    })
+})
+
+//Module Export
+module.exports = router;(No newline at end of file)
 
webpack.config.js (added)
+++ webpack.config.js
@@ -0,0 +1,42 @@
+const { VueLoaderPlugin } = require("vue-loader");
+
+const {PROJECT_NAME, BASE_DIR, SERVICE_STATUS} = require('./Global');
+
+module.exports = {
+  name: PROJECT_NAME,
+  mode: SERVICE_STATUS,
+  devtool: 'eval',
+
+  entry: {
+    app: [`${BASE_DIR}/client/views/index.js`]
+  },
+
+  module: {
+    rules: [{
+      test: /\.vue?$/,
+      loader: 'vue-loader',
+    }, {
+      test: /\.(js|jsx)?$/,
+      loader: 'babel-loader',
+    }, {
+      test: /\.css$/,
+      use: ['vue-style-loader', 'css-loader']
+    }, {
+      test: /\.(jpe?g|png|gif|svg|ttf|eot|woff|woff2)$/i,
+      use: [{
+        loader:'url-loader',
+        options:{
+          limit:8192,
+          fallback:require.resolve('file-loader')
+        }
+      }]
+    }],
+  },
+
+  plugins: [new VueLoaderPlugin()],
+
+  output: {
+    path: `${BASE_DIR}/client/build`,	// __dirname: webpack.config.js 파일이 위치한 경로
+    filename: 'bundle.js'
+  },
+}(No newline at end of file)
 
yarn-error.log (added)
+++ yarn-error.log
@@ -0,0 +1,75 @@
+Arguments: 
+  C:\takensoft\dev\Nodejs\node.exe C:\Program Files (x86)\Yarn\bin\yarn.js add 'vue-awesome-swiper' --save-dev
+
+PATH: 
+  C:\takensoft\tools\nodejs\;C:\Program Files (x86)\Yarn\bin\;C:\Program Files\Git\cmd;C:\Windows\System32;C:\takensoft\tools\nodejs;C:\takensoft\dev\Nodejs\;C:\takensoft\tools\jdk\jdk-15\bin\;C:\takensoft\download\Maven\apache-maven-3.9.0-bin\apache-maven-3.9.0\bin\;C:\takensoft\download\apache-tomcat-9.0.73\bin\;C:\Users\mycom\AppData\Local\Microsoft\WindowsApps;C:\takensoft\tools\intellij\IntelliJ IDEA 2020.1.2\bin;;C:\Users\mycom\AppData\Local\GitHubDesktop\bin;C:\Users\mycom\AppData\Local\Yarn\bin;C:\takensoft\tools\vscode\bin;C:\Users\mycom\AppData\Roaming\npm
+
+Yarn version: 
+  1.22.19
+
+Node version: 
+  18.16.1
+
+Platform: 
+  win32 x64
+
+Trace: 
+  Error: https://registry.yarnpkg.com/%27vue-awesome-swiper%27: Not found
+      at params.callback [as _callback] (C:\Program Files (x86)\Yarn\lib\cli.js:66145:18)
+      at self.callback (C:\Program Files (x86)\Yarn\lib\cli.js:140890:22)
+      at Request.emit (node:events:513:28)
+      at Request.<anonymous> (C:\Program Files (x86)\Yarn\lib\cli.js:141862:10)
+      at Request.emit (node:events:513:28)
+      at IncomingMessage.<anonymous> (C:\Program Files (x86)\Yarn\lib\cli.js:141784:12)
+      at Object.onceWrapper (node:events:627:28)
+      at IncomingMessage.emit (node:events:525:35)
+      at endReadableNT (node:internal/streams/readable:1359:12)
+      at process.processTicksAndRejections (node:internal/process/task_queues:82:21)
+
+npm manifest: 
+  {
+    "dependencies": {
+      "@babel/cli": "7.19.3",
+      "@babel/core": "7.19.3",
+      "@fortawesome/fontawesome-svg-core": "^6.4.2",
+      "@fortawesome/free-brands-svg-icons": "^6.4.2",
+      "@fortawesome/free-regular-svg-icons": "^6.4.2",
+      "@fortawesome/free-solid-svg-icons": "^6.4.2",
+      "@fortawesome/vue-fontawesome": "^3.0.3",
+      "axios": "^1.5.1",
+      "babel-loader": "8.2.5",
+      "css-loader": "6.7.1",
+      "express": "4.18.1",
+      "express-http-proxy": "^2.0.0",
+      "file-loader": "6.2.0",
+      "fs": "0.0.1-security",
+      "new-line": "^1.1.1",
+      "pg": "8.8.0",
+      "swiper": "^5.3.7",
+      "url-loader": "4.1.1",
+      "vue": "3.2.40",
+      "vue-loader": "^17.0.0",
+      "vue-router": "4.1.5",
+      "vue-style-loader": "4.1.3",
+      "vue3-sfc-loader": "^0.8.4",
+      "vuex": "^4.1.0",
+      "webpack": "5.74.0",
+      "webpack-cli": "4.10.0"
+    },
+    "scripts": {
+      "prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+      "dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+      "windows-prod": "set NODE_ENV=production&&node ./server/modules/web/server.js",
+      "windows-dev": "set NODE_ENV=development&&node ./server/modules/web/server.js",
+      "linux-prod": "export NODE_ENV=production&&node ./server/modules/web/server.js",
+      "linux-dev": "export NODE_ENV=development&&node ./server/modules/web/server.js",
+      "webpack-build": "webpack",
+      "webpack-build-watch": "webpack --watch"
+    }
+  }
+
+yarn manifest: 
+  No manifest
+
+Lockfile: 
+  No lockfile
Add a comment
List