From 08000fe4f17c06ed8463fc215ac55340281c77c2 Mon Sep 17 00:00:00 2001 From: Ivan Velichko Date: Fri, 29 Sep 2023 09:40:47 +0000 Subject: [PATCH] Add files --- .gitignore | 15 + Dockerfile | 28 + Makefile | 49 + README.md | 24 + api/handler.go | 40 + api/rest/kube/contexts/contexts.go | 50 + api/rest/kube/objects/objects.go | 314 + api/rest/kube/resources/resources.go | 69 + api/stream/rpc/kube/objects/watch.go | 192 + api/stream/rpc/rpc.go | 131 + api/stream/stream.go | 204 + go.mod | 92 + go.sum | 314 + kubeclient/pool.go | 190 + logging/logging.go | 19 + main.go | 210 + ui/.eslintrc.cjs | 95 + ui/README.md | 0 ui/index.html | 16 + ui/package-lock.json | 6716 +++++++++++++++++ ui/package.json | 53 + ui/postcss.config.js | 10 + ui/public/favicon.ico | Bin 0 -> 30829 bytes ui/public/fonts/Source_Code_Pro/OFL.txt | 93 + ui/public/fonts/Source_Code_Pro/README.txt | 79 + ...SourceCodePro-Italic-VariableFont_wght.ttf | Bin 0 -> 162676 bytes .../SourceCodePro-VariableFont_wght.ttf | Bin 0 -> 196132 bytes .../static/SourceCodePro-Black.ttf | Bin 0 -> 119140 bytes .../static/SourceCodePro-BlackItalic.ttf | Bin 0 -> 100924 bytes .../static/SourceCodePro-Bold.ttf | Bin 0 -> 119648 bytes .../static/SourceCodePro-BoldItalic.ttf | Bin 0 -> 101188 bytes .../static/SourceCodePro-ExtraBold.ttf | Bin 0 -> 119644 bytes .../static/SourceCodePro-ExtraBoldItalic.ttf | Bin 0 -> 101268 bytes .../static/SourceCodePro-ExtraLight.ttf | Bin 0 -> 119516 bytes .../static/SourceCodePro-ExtraLightItalic.ttf | Bin 0 -> 101092 bytes .../static/SourceCodePro-Italic.ttf | Bin 0 -> 101260 bytes .../static/SourceCodePro-Light.ttf | Bin 0 -> 119900 bytes .../static/SourceCodePro-LightItalic.ttf | Bin 0 -> 101432 bytes .../static/SourceCodePro-Medium.ttf | Bin 0 -> 119584 bytes .../static/SourceCodePro-MediumItalic.ttf | Bin 0 -> 101188 bytes .../static/SourceCodePro-Regular.ttf | Bin 0 -> 119788 bytes .../static/SourceCodePro-SemiBold.ttf | Bin 0 -> 119568 bytes .../static/SourceCodePro-SemiBoldItalic.ttf | Bin 0 -> 101244 bytes ui/public/fonts/inter/Inter-Black.woff | Bin 0 -> 138764 bytes ui/public/fonts/inter/Inter-Black.woff2 | Bin 0 -> 102868 bytes ui/public/fonts/inter/Inter-BlackItalic.woff | Bin 0 -> 146824 bytes ui/public/fonts/inter/Inter-BlackItalic.woff2 | Bin 0 -> 108752 bytes ui/public/fonts/inter/Inter-Bold.woff | Bin 0 -> 143208 bytes ui/public/fonts/inter/Inter-Bold.woff2 | Bin 0 -> 106140 bytes ui/public/fonts/inter/Inter-BoldItalic.woff | Bin 0 -> 151052 bytes ui/public/fonts/inter/Inter-BoldItalic.woff2 | Bin 0 -> 111808 bytes ui/public/fonts/inter/Inter-ExtraBold.woff | Bin 0 -> 142920 bytes ui/public/fonts/inter/Inter-ExtraBold.woff2 | Bin 0 -> 106108 bytes .../fonts/inter/Inter-ExtraBoldItalic.woff | Bin 0 -> 150628 bytes .../fonts/inter/Inter-ExtraBoldItalic.woff2 | Bin 0 -> 111708 bytes ui/public/fonts/inter/Inter-ExtraLight.woff | Bin 0 -> 140724 bytes ui/public/fonts/inter/Inter-ExtraLight.woff2 | Bin 0 -> 104232 bytes .../fonts/inter/Inter-ExtraLightItalic.woff | Bin 0 -> 149996 bytes .../fonts/inter/Inter-ExtraLightItalic.woff2 | Bin 0 -> 111392 bytes ui/public/fonts/inter/Inter-Italic.woff | Bin 0 -> 144372 bytes ui/public/fonts/inter/Inter-Italic.woff2 | Bin 0 -> 106876 bytes ui/public/fonts/inter/Inter-Light.woff | Bin 0 -> 140632 bytes ui/public/fonts/inter/Inter-Light.woff2 | Bin 0 -> 104332 bytes ui/public/fonts/inter/Inter-LightItalic.woff | Bin 0 -> 150092 bytes ui/public/fonts/inter/Inter-LightItalic.woff2 | Bin 0 -> 111332 bytes ui/public/fonts/inter/Inter-Medium.woff | Bin 0 -> 142552 bytes ui/public/fonts/inter/Inter-Medium.woff2 | Bin 0 -> 105924 bytes ui/public/fonts/inter/Inter-MediumItalic.woff | Bin 0 -> 150988 bytes .../fonts/inter/Inter-MediumItalic.woff2 | Bin 0 -> 112184 bytes ui/public/fonts/inter/Inter-Regular.woff | Bin 0 -> 133844 bytes ui/public/fonts/inter/Inter-Regular.woff2 | Bin 0 -> 98868 bytes ui/public/fonts/inter/Inter-SemiBold.woff | Bin 0 -> 142932 bytes ui/public/fonts/inter/Inter-SemiBold.woff2 | Bin 0 -> 105804 bytes .../fonts/inter/Inter-SemiBoldItalic.woff | Bin 0 -> 151180 bytes .../fonts/inter/Inter-SemiBoldItalic.woff2 | Bin 0 -> 112048 bytes ui/public/fonts/inter/Inter-Thin.woff | Bin 0 -> 135920 bytes ui/public/fonts/inter/Inter-Thin.woff2 | Bin 0 -> 99632 bytes ui/public/fonts/inter/Inter-ThinItalic.woff | Bin 0 -> 145480 bytes ui/public/fonts/inter/Inter-ThinItalic.woff2 | Bin 0 -> 106496 bytes ui/public/fonts/inter/Inter-italic.var.woff2 | Bin 0 -> 245036 bytes ui/public/fonts/inter/Inter-roman.var.woff2 | Bin 0 -> 227180 bytes ui/public/fonts/inter/Inter.var.woff2 | Bin 0 -> 324864 bytes ui/public/fonts/inter/LICENSE.txt | 94 + ui/public/fonts/inter/inter.css | 200 + ui/src/App.vue | 69 + ui/src/api/BiXdm.ts | 73 + ui/src/api/HttpClient.ts | 27 + ui/src/api/Stream.ts | 162 + ui/src/api/resources/Base.ts | 18 + ui/src/api/resources/KubeContextsResource.js | 11 + ui/src/api/resources/KubeObjectsResource.ts | 106 + ui/src/api/resources/KubeResourcesResource.js | 11 + ui/src/common/cleaner.js | 28 + ui/src/common/delayed.js | 4 + ui/src/common/kubeutil.ts | 13 + ui/src/common/relations.ts | 458 ++ ui/src/common/repr.ts | 156 + ui/src/common/types.ts | 127 + ui/src/common/watchers.ts | 210 + ui/src/components/CodeEditor.vue | 74 + ui/src/components/GraphScreen.vue | 89 + ui/src/components/GraphScreenBottomBar.vue | 46 + ui/src/components/GraphScreenBottomPane.vue | 151 + ui/src/components/GraphScreenExtraPane.vue | 116 + ui/src/components/GraphScreenMainPane.vue | 46 + ui/src/components/GraphScreenSidePanel.vue | 191 + ui/src/components/KubeExplorer.vue | 329 + ui/src/components/KubeExplorerContextItem.vue | 50 + .../components/KubeExplorerDropdownMenu.vue | 39 + .../components/KubeExplorerExpandableItem.vue | 60 + ui/src/components/KubeExplorerFilter.vue | 53 + ui/src/components/KubeExplorerObjectList.vue | 138 + .../KubeExplorerResourceGroupItem.vue | 54 + .../components/KubeExplorerResourceItem.vue | 204 + .../KubeExplorerResourceObjectsItem.vue | 104 + ui/src/components/KubeObjectViewer.vue | 105 + .../components/KubeObjectViewerActionBar.vue | 75 + ...KubeObjectViewerActionBarButtonGeneric.vue | 40 + .../KubeObjectViewerActionBarButtonWatch.vue | 113 + .../components/KubeObjectViewerEventsTab.vue | 108 + .../KubeObjectViewerManifestTab.vue | 185 + ui/src/components/KubeObjectViewerMenu.vue | 75 + .../KubeObjectViewerPodConditions.vue | 55 + .../KubeObjectViewerPodContainers.vue | 115 + .../KubeObjectViewerPodInsightsTab.vue | 117 + ui/src/components/KubeObjectViewerTabs.vue | 91 + ui/src/components/KubeObjectsGraph.vue | 513 ++ ui/src/components/KubeWatch.vue | 163 + ui/src/components/WebTerm.vue | 99 + ui/src/components/base/HandyButton.vue | 35 + ui/src/components/base/SimpleLoader.vue | 58 + ui/src/main.css | 67 + ui/src/main.js | 29 + ui/src/shims-vue.d.ts | 5 + ui/src/stores/appStore.ts | 63 + ui/src/stores/index.ts | 9 + ui/src/stores/kubeDataStore.ts | 478 ++ ui/src/stores/kubeEventsStore.ts | 35 + .../stores/kubeExplorer/allExplorerStore.ts | 286 + ui/src/stores/kubeExplorer/filter.ts | 112 + .../stores/kubeExplorer/quickExplorerStore.ts | 339 + .../kubeExplorer/relatedExplorerStore.ts | 302 + .../kubeExplorer/watchedExplorerStore.ts | 194 + ui/src/stores/kubeGraphStore.ts | 105 + ui/src/stores/kubeWatchStore.ts | 465 ++ ui/tailwind.config.js | 57 + ui/tsconfig.json | 62 + ui/vite.config.js | 26 + vetur.config.js | 7 + 149 files changed, 17102 insertions(+) create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Makefile create mode 100644 README.md create mode 100644 api/handler.go create mode 100644 api/rest/kube/contexts/contexts.go create mode 100644 api/rest/kube/objects/objects.go create mode 100644 api/rest/kube/resources/resources.go create mode 100644 api/stream/rpc/kube/objects/watch.go create mode 100644 api/stream/rpc/rpc.go create mode 100644 api/stream/stream.go create mode 100644 go.mod create mode 100644 go.sum create mode 100644 kubeclient/pool.go create mode 100644 logging/logging.go create mode 100644 main.go create mode 100644 ui/.eslintrc.cjs create mode 100644 ui/README.md create mode 100644 ui/index.html create mode 100644 ui/package-lock.json create mode 100644 ui/package.json create mode 100644 ui/postcss.config.js create mode 100644 ui/public/favicon.ico create mode 100644 ui/public/fonts/Source_Code_Pro/OFL.txt create mode 100644 ui/public/fonts/Source_Code_Pro/README.txt create mode 100644 ui/public/fonts/Source_Code_Pro/SourceCodePro-Italic-VariableFont_wght.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/SourceCodePro-VariableFont_wght.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-Black.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-BlackItalic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-Bold.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-BoldItalic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-ExtraBold.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-ExtraBoldItalic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-ExtraLight.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-ExtraLightItalic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-Italic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-Light.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-LightItalic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-Medium.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-MediumItalic.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-Regular.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-SemiBold.ttf create mode 100644 ui/public/fonts/Source_Code_Pro/static/SourceCodePro-SemiBoldItalic.ttf create mode 100644 ui/public/fonts/inter/Inter-Black.woff create mode 100644 ui/public/fonts/inter/Inter-Black.woff2 create mode 100644 ui/public/fonts/inter/Inter-BlackItalic.woff create mode 100644 ui/public/fonts/inter/Inter-BlackItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-Bold.woff create mode 100644 ui/public/fonts/inter/Inter-Bold.woff2 create mode 100644 ui/public/fonts/inter/Inter-BoldItalic.woff create mode 100644 ui/public/fonts/inter/Inter-BoldItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-ExtraBold.woff create mode 100644 ui/public/fonts/inter/Inter-ExtraBold.woff2 create mode 100644 ui/public/fonts/inter/Inter-ExtraBoldItalic.woff create mode 100644 ui/public/fonts/inter/Inter-ExtraBoldItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-ExtraLight.woff create mode 100644 ui/public/fonts/inter/Inter-ExtraLight.woff2 create mode 100644 ui/public/fonts/inter/Inter-ExtraLightItalic.woff create mode 100644 ui/public/fonts/inter/Inter-ExtraLightItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-Italic.woff create mode 100644 ui/public/fonts/inter/Inter-Italic.woff2 create mode 100644 ui/public/fonts/inter/Inter-Light.woff create mode 100644 ui/public/fonts/inter/Inter-Light.woff2 create mode 100644 ui/public/fonts/inter/Inter-LightItalic.woff create mode 100644 ui/public/fonts/inter/Inter-LightItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-Medium.woff create mode 100644 ui/public/fonts/inter/Inter-Medium.woff2 create mode 100644 ui/public/fonts/inter/Inter-MediumItalic.woff create mode 100644 ui/public/fonts/inter/Inter-MediumItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-Regular.woff create mode 100644 ui/public/fonts/inter/Inter-Regular.woff2 create mode 100644 ui/public/fonts/inter/Inter-SemiBold.woff create mode 100644 ui/public/fonts/inter/Inter-SemiBold.woff2 create mode 100644 ui/public/fonts/inter/Inter-SemiBoldItalic.woff create mode 100644 ui/public/fonts/inter/Inter-SemiBoldItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-Thin.woff create mode 100644 ui/public/fonts/inter/Inter-Thin.woff2 create mode 100644 ui/public/fonts/inter/Inter-ThinItalic.woff create mode 100644 ui/public/fonts/inter/Inter-ThinItalic.woff2 create mode 100644 ui/public/fonts/inter/Inter-italic.var.woff2 create mode 100644 ui/public/fonts/inter/Inter-roman.var.woff2 create mode 100644 ui/public/fonts/inter/Inter.var.woff2 create mode 100644 ui/public/fonts/inter/LICENSE.txt create mode 100644 ui/public/fonts/inter/inter.css create mode 100644 ui/src/App.vue create mode 100644 ui/src/api/BiXdm.ts create mode 100644 ui/src/api/HttpClient.ts create mode 100644 ui/src/api/Stream.ts create mode 100644 ui/src/api/resources/Base.ts create mode 100644 ui/src/api/resources/KubeContextsResource.js create mode 100644 ui/src/api/resources/KubeObjectsResource.ts create mode 100644 ui/src/api/resources/KubeResourcesResource.js create mode 100644 ui/src/common/cleaner.js create mode 100644 ui/src/common/delayed.js create mode 100644 ui/src/common/kubeutil.ts create mode 100644 ui/src/common/relations.ts create mode 100644 ui/src/common/repr.ts create mode 100644 ui/src/common/types.ts create mode 100644 ui/src/common/watchers.ts create mode 100644 ui/src/components/CodeEditor.vue create mode 100644 ui/src/components/GraphScreen.vue create mode 100644 ui/src/components/GraphScreenBottomBar.vue create mode 100644 ui/src/components/GraphScreenBottomPane.vue create mode 100644 ui/src/components/GraphScreenExtraPane.vue create mode 100644 ui/src/components/GraphScreenMainPane.vue create mode 100644 ui/src/components/GraphScreenSidePanel.vue create mode 100644 ui/src/components/KubeExplorer.vue create mode 100644 ui/src/components/KubeExplorerContextItem.vue create mode 100644 ui/src/components/KubeExplorerDropdownMenu.vue create mode 100644 ui/src/components/KubeExplorerExpandableItem.vue create mode 100644 ui/src/components/KubeExplorerFilter.vue create mode 100644 ui/src/components/KubeExplorerObjectList.vue create mode 100644 ui/src/components/KubeExplorerResourceGroupItem.vue create mode 100644 ui/src/components/KubeExplorerResourceItem.vue create mode 100644 ui/src/components/KubeExplorerResourceObjectsItem.vue create mode 100644 ui/src/components/KubeObjectViewer.vue create mode 100644 ui/src/components/KubeObjectViewerActionBar.vue create mode 100644 ui/src/components/KubeObjectViewerActionBarButtonGeneric.vue create mode 100644 ui/src/components/KubeObjectViewerActionBarButtonWatch.vue create mode 100644 ui/src/components/KubeObjectViewerEventsTab.vue create mode 100644 ui/src/components/KubeObjectViewerManifestTab.vue create mode 100644 ui/src/components/KubeObjectViewerMenu.vue create mode 100644 ui/src/components/KubeObjectViewerPodConditions.vue create mode 100644 ui/src/components/KubeObjectViewerPodContainers.vue create mode 100644 ui/src/components/KubeObjectViewerPodInsightsTab.vue create mode 100644 ui/src/components/KubeObjectViewerTabs.vue create mode 100644 ui/src/components/KubeObjectsGraph.vue create mode 100644 ui/src/components/KubeWatch.vue create mode 100644 ui/src/components/WebTerm.vue create mode 100644 ui/src/components/base/HandyButton.vue create mode 100644 ui/src/components/base/SimpleLoader.vue create mode 100644 ui/src/main.css create mode 100644 ui/src/main.js create mode 100644 ui/src/shims-vue.d.ts create mode 100644 ui/src/stores/appStore.ts create mode 100644 ui/src/stores/index.ts create mode 100644 ui/src/stores/kubeDataStore.ts create mode 100644 ui/src/stores/kubeEventsStore.ts create mode 100644 ui/src/stores/kubeExplorer/allExplorerStore.ts create mode 100644 ui/src/stores/kubeExplorer/filter.ts create mode 100644 ui/src/stores/kubeExplorer/quickExplorerStore.ts create mode 100644 ui/src/stores/kubeExplorer/relatedExplorerStore.ts create mode 100644 ui/src/stores/kubeExplorer/watchedExplorerStore.ts create mode 100644 ui/src/stores/kubeGraphStore.ts create mode 100644 ui/src/stores/kubeWatchStore.ts create mode 100644 ui/tailwind.config.js create mode 100644 ui/tsconfig.json create mode 100644 ui/vite.config.js create mode 100644 vetur.config.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2233de2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,15 @@ +*.so +*.dylib +*.test +*.out +*.swp +*.swo +*.local +.vagrant +node_modules +.DS_Store +dist +dist-ssr +__debug_bin + +/bin/* diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..7679a61 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +# syntax=docker/dockerfile:1 + +# Build stage +FROM golang:1.20 as build + +ARG BUILD_VERSION=v0.0.0 +ARG BUILD_COMMIT=HEAD +ARG BUILD_DATE=unknown + +WORKDIR /src + +COPY go.mod go.sum ./ +RUN go mod download + +COPY . . + +RUN CGO_ENABLED=0 go build \ + -ldflags "-X main.version=${BUILD_VERSION} -X main.commit=${BUILD_COMMIT} -X main.date=${BUILD_DATE}" \ + -o bin/kexp main.go + +# App stage +FROM alpine:3.18 + +COPY --from=build /src/bin/kexp /usr/local/bin/kexp + +EXPOSE 5173 + +CMD ["kexp", "--host", "127.0.0.1", "--port", "5173"] diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3e87f40 --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +CUR_DIR := $(shell dirname $(realpath $(firstword $(MAKEFILE_LIST)))) + +VERSION=v0.0.0 +GIT_COMMIT=$(shell git rev-parse --verify HEAD) +UTC_NOW=$(shell date -u +"%Y-%m-%dT%H:%M:%SZ") + +.PHONY: back-run-dev +back-run-dev: + go run ${CUR_DIR}/main.go --host 0.0.0.0 + +.PHONY: back-fmt +back-fmt: + cd ${CUR_DIR} && go fmt ./... + +.PHONY: back-lint +back-lint: back-fmt + golangci-lint run + +.PHONY: front-run-dev +front-run-dev: + cd ${CUR_DIR}/ui && npm run dev + +.PHONY: front-lint-fix +front-lint-fix: + cd ${CUR_DIR}/ui && npm run lint-fix + +.PHONY: build +build: + cd ${CUR_DIR}/ui && npm run build + go build -o ${CUR_DIR}/bin/kexp ${CUR_DIR}/main.go + CGO_ENABLED=0 go build \ + -ldflags "-X main.version=${VERSION} -X main.commit=${GIT_COMMIT} -X main.date=${UTC_NOW}" \ + -o ${CUR_DIR}/bin/kexp main.go + +.PHONY: docker-build +docker-build: + cd ${CUR_DIR}/ui && npm run build + docker buildx build \ + --progress plain \ + --build-arg BUILD_VERSION=${VERSION} \ + --build-arg BUILD_COMMIT=${GIT_COMMIT} \ + --build-arg BUILD_DATE=${UTC_NOW} \ + -t ghcr.io/iximiuz/kexp:latest \ + -f ${CUR_DIR}/Dockerfile \ + ${CUR_DIR} + +.PHONY: docker-push +docker-push: docker-build + docker push ghcr.io/iximiuz/kexp:latest diff --git a/README.md b/README.md new file mode 100644 index 0000000..69339ef --- /dev/null +++ b/README.md @@ -0,0 +1,24 @@ +# k'exp - Kubernetes Explorer + +## Development + +Server: + +```sh +go install github.com/golangci/golangci-lint/cmd/golangci-lint@latest +``` + +Client: + +```sh +cd ui +npm install +npm run dev +``` + +```sh +make back-run-dev +make front-run-dev + +open localhost:5173 +``` diff --git a/api/handler.go b/api/handler.go new file mode 100644 index 0000000..c54934b --- /dev/null +++ b/api/handler.go @@ -0,0 +1,40 @@ +package api + +import ( + "context" + + "github.com/gin-gonic/gin" + "github.com/google/uuid" + "github.com/sirupsen/logrus" + + "github.com/iximiuz/kexp/logging" +) + +const HeaderRequestID = "X-Request-ID" + +func MiddlewareRequestID(c *gin.Context) { + rid := c.GetHeader(HeaderRequestID) + if rid == "" { + rid = uuid.New().String()[:8] + } + + c.Request = c.Request.WithContext( + context.WithValue(c.Request.Context(), logging.KeyRequestID, rid), + ) + c.Header(HeaderRequestID, rid) + c.Next() +} + +type Handler struct { + logger *logrus.Entry +} + +func NewHandler(name string, logger *logrus.Entry) Handler { + return Handler{ + logger: logger.WithField("handler", name), + } +} + +func (h *Handler) Logger(c *gin.Context) *logrus.Entry { + return logging.WithRequestID(c.Request.Context(), h.logger) +} diff --git a/api/rest/kube/contexts/contexts.go b/api/rest/kube/contexts/contexts.go new file mode 100644 index 0000000..101983c --- /dev/null +++ b/api/rest/kube/contexts/contexts.go @@ -0,0 +1,50 @@ +package contexts + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" + + "github.com/iximiuz/kexp/api" + "github.com/iximiuz/kexp/kubeclient" +) + +type Handler struct { + api.Handler + + clientPool *kubeclient.ClientPool +} + +func NewHandler(clientPool *kubeclient.ClientPool, logger *logrus.Entry) *Handler { + return &Handler{ + Handler: api.NewHandler("kube/contexts", logger), + clientPool: clientPool, + } +} + +// kube//contexts +func (h *Handler) List(c *gin.Context) { + cs := []Context{} + for _, kctx := range h.clientPool.Contexts() { + cs = append(cs, Context{ + Name: kctx.Name(), + User: kctx.User(), + Cluster: kctx.Cluster(), + ClusterUID: kctx.ClusterUID(), + Namespace: kctx.Namespace(), + Current: kctx.Name() == h.clientPool.CurrentContext().Name(), + }) + } + + c.JSON(http.StatusOK, cs) +} + +type Context struct { + Name string `json:"name"` + User string `json:"user"` + Cluster string `json:"cluster"` + ClusterUID string `json:"clusterUID"` + Namespace string `json:"namespace"` + Current bool `json:"current"` +} diff --git a/api/rest/kube/objects/objects.go b/api/rest/kube/objects/objects.go new file mode 100644 index 0000000..02113d6 --- /dev/null +++ b/api/rest/kube/objects/objects.go @@ -0,0 +1,314 @@ +package objects + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" + apierrors "k8s.io/apimachinery/pkg/api/errors" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/apimachinery/pkg/util/yaml" + "k8s.io/client-go/dynamic" + + "github.com/iximiuz/kexp/api" + "github.com/iximiuz/kexp/kubeclient" +) + +type Handler struct { + api.Handler + + clientPool *kubeclient.ClientPool +} + +func NewHandler(clientPool *kubeclient.ClientPool, logger *logrus.Entry) *Handler { + return &Handler{ + Handler: api.NewHandler("kube/objects", logger), + clientPool: clientPool, + } +} + +// GET kube/v1/contexts//resources//// +// GET kube/v1/contexts//resources///namespaces/// +func (h *Handler) Get(c *gin.Context) { + logger := h.Logger(c). + WithField("method", "Get"). + WithField("context", c.Param("ctx")). + WithField("group", c.Param("group")). + WithField("version", c.Param("version")). + WithField("resource", c.Param("resource")). + WithField("namespace", c.Param("namespace")). + WithField("name", c.Param("name")) + + group := c.Param("group") + if group == "core" { + group = "" + } + + client, err := h.kubeClient(c, logger) + if err != nil { + return + } + + obj, err := client. + Resource(schema.GroupVersionResource{ + Group: group, + Version: c.Param("version"), + Resource: c.Param("resource"), + }). + Namespace(c.Param("namespace")). + Get(c.Request.Context(), c.Param("name"), metav1.GetOptions{}) + if err != nil { + if apierrors.IsNotFound(err) { + c.AbortWithStatusJSON( + http.StatusNotFound, + map[string]string{"error": "not found"}, + ) + return + } + + logger. + WithError(err). + Error("Couldn't get Kubernetes object") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return + } + + c.JSON(http.StatusOK, obj) +} + +// TODO: +// ??? kube/v1/contexts//resources///// +// ??? kube/v1/contexts//resources///namespaces//// + +// GET kube/v1/contexts//resources/// +// GET kube/v1/contexts//resources///namespaces// +func (h *Handler) List(c *gin.Context) { + logger := h.Logger(c). + WithField("method", "List"). + WithField("context", c.Param("ctx")). + WithField("group", c.Param("group")). + WithField("version", c.Param("version")). + WithField("resource", c.Param("resource")). + WithField("namespace", c.Param("namespace")) + + group := c.Param("group") + if group == "core" { + group = "" + } + + client, err := h.kubeClient(c, logger) + if err != nil { + return + } + + list, err := client. + Resource(schema.GroupVersionResource{ + Group: group, + Version: c.Param("version"), + Resource: c.Param("resource"), + }). + Namespace(c.Param("namespace")). + List(c.Request.Context(), metav1.ListOptions{ + FieldSelector: c.Query("fieldSelector"), + LabelSelector: c.Query("labelSelector"), + }) + if err != nil { + logger. + WithError(err). + Error("Couldn't list Kubernetes objects") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return + } + + c.JSON(http.StatusOK, list.Items) +} + +// PUT kube/v1/contexts//resources//// +// PUT kube/v1/contexts//resources///namespaces/// +func (h *Handler) Update(c *gin.Context) { + logger := h.Logger(c). + WithField("method", "Update"). + WithField("context", c.Param("ctx")). + WithField("group", c.Param("group")). + WithField("version", c.Param("version")). + WithField("resource", c.Param("resource")). + WithField("namespace", c.Param("namespace")). + WithField("name", c.Param("name")) + + group := c.Param("group") + if group == "core" { + group = "" + } + + obj, err := h.unstructuredObjectFromRequest(c, logger) + if err != nil { + return + } + + client, err := h.kubeClient(c, logger) + if err != nil { + return + } + + obj, err = client. + Resource(schema.GroupVersionResource{ + Group: group, + Version: c.Param("version"), + Resource: c.Param("resource"), + }). + Namespace(c.Param("namespace")). + Update(c.Request.Context(), obj, metav1.UpdateOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + logger. + WithError(err). + Error("Couldn't update Kubernetes object") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return + } + + c.JSON(http.StatusOK, obj) +} + +// DELETE kube/v1/contexts//resources//// +// DELETE kube/v1/contexts//resources///namespaces/// +func (h *Handler) Delete(c *gin.Context) { + logger := h.Logger(c). + WithField("method", "Delete"). + WithField("context", c.Param("ctx")). + WithField("group", c.Param("group")). + WithField("version", c.Param("version")). + WithField("resource", c.Param("resource")). + WithField("namespace", c.Param("namespace")). + WithField("name", c.Param("name")) + + group := c.Param("group") + if group == "core" { + group = "" + } + + client, err := h.kubeClient(c, logger) + if err != nil { + return + } + + err = client. + Resource(schema.GroupVersionResource{ + Group: group, + Version: c.Param("version"), + Resource: c.Param("resource"), + }). + Namespace(c.Param("namespace")). + Delete(c.Request.Context(), c.Param("name"), metav1.DeleteOptions{}) + if err != nil && !apierrors.IsNotFound(err) { + logger. + WithError(err). + Error("Couldn't delete Kubernetes object") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return + } + + c.JSON(http.StatusNoContent, nil) +} + +func (h *Handler) kubeClient( + c *gin.Context, + logger *logrus.Entry, +) (dynamic.Interface, error) { + kctx, err := h.clientPool.Context(c.Param("ctx")) + if err != nil { + logger. + WithError(err). + Error("Unknown context") + c.AbortWithStatusJSON( + http.StatusNotFound, + map[string]string{"error": "unknown context"}, + ) + return nil, err + } + + client, err := kctx.DynamicClient() + if err != nil { + logger. + WithError(err). + Error("Couldn't get Kubernetes client for context") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return nil, err + } + + return client, nil +} + +func (h *Handler) unstructuredObjectFromRequest( + c *gin.Context, + logger *logrus.Entry, +) (*unstructured.Unstructured, error) { + body, err := c.GetRawData() + if err != nil { + logger. + WithError(err). + Error("Couldn't read request body") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return nil, err + } + + logger = logger.WithField("body", body) + + jsonBody, err := yaml.ToJSON(body) + if err != nil { + logger. + WithError(err). + Error("Couldn't convert YAML to JSON") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return nil, err + } + + obj, err := runtime.Decode(unstructured.UnstructuredJSONScheme, jsonBody) + if err != nil { + logger. + WithError(err). + Error("Couldn't decode Kubernetes object") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return nil, err + } + + uns, ok := obj.(*unstructured.Unstructured) + if !ok { + logger. + WithField("object", obj). + Error("Couldn't type cast runtime.Object to unstructured.Unstructured") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return nil, err + } + + return uns, nil +} diff --git a/api/rest/kube/resources/resources.go b/api/rest/kube/resources/resources.go new file mode 100644 index 0000000..91fe380 --- /dev/null +++ b/api/rest/kube/resources/resources.go @@ -0,0 +1,69 @@ +package resources + +import ( + "net/http" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" + + "github.com/iximiuz/kexp/api" + "github.com/iximiuz/kexp/kubeclient" +) + +type Handler struct { + api.Handler + + clientPool *kubeclient.ClientPool +} + +func NewHandler(clientPool *kubeclient.ClientPool, logger *logrus.Entry) *Handler { + return &Handler{ + Handler: api.NewHandler("kube/resources", logger), + clientPool: clientPool, + } +} + +// kube/v1/contexts//resources +func (h *Handler) List(c *gin.Context) { + logger := h.Logger(c). + WithField("method", "List"). + WithField("context", c.Param("ctx")) + + kctx, err := h.clientPool.Context(c.Param("ctx")) + if err != nil { + logger. + WithError(err). + Error("Unknown context") + c.AbortWithStatusJSON( + http.StatusNotFound, + map[string]string{"error": "unknown context"}, + ) + return + } + + client, err := kctx.DiscoveryClient() + if err != nil { + logger. + WithError(err). + Error("Couldn't get Kubernetes client for context") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return + } + + resourceList, err := client.ServerPreferredResources() + if err != nil { + logger. + WithError(err). + Error("Couldn't load Kubernetes preferred resources") + c.AbortWithStatusJSON( + http.StatusInternalServerError, + map[string]string{"error": "internal server error"}, + ) + return + } + + c.JSON(http.StatusOK, resourceList) +} diff --git a/api/stream/rpc/kube/objects/watch.go b/api/stream/rpc/kube/objects/watch.go new file mode 100644 index 0000000..5b295eb --- /dev/null +++ b/api/stream/rpc/kube/objects/watch.go @@ -0,0 +1,192 @@ +package objects + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "time" + + "github.com/sirupsen/logrus" + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" + "k8s.io/apimachinery/pkg/runtime" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/cli-runtime/pkg/printers" + "k8s.io/client-go/dynamic/dynamicinformer" + "k8s.io/client-go/kubernetes/scheme" + "k8s.io/client-go/tools/cache" + + "github.com/iximiuz/kexp/api/stream" + "github.com/iximiuz/kexp/api/stream/rpc" + "github.com/iximiuz/kexp/kubeclient" + "github.com/iximiuz/kexp/logging" +) + +const Watch rpc.CallMethod = "kubeObjects.watch" + +type paramsWatch struct { + Context string `json:"context"` + Group string `json:"group"` + Version string `json:"version"` + Resource string `json:"resource"` + Namespace string `json:"namespace"` + Name string `json:"name"` + FieldSelector string `json:"fieldSelector"` + LabelSelector string `json:"labelSelector"` +} + +type WatchHandler struct { + clientPool *kubeclient.ClientPool + logger *logrus.Entry +} + +func NewWatchHandler(clientPool *kubeclient.ClientPool) *WatchHandler { + return &WatchHandler{ + clientPool: clientPool, + logger: logrus.WithField("handler", "stream/rpc/kube/objects/watch"), + } +} + +func (h *WatchHandler) Handle(ctx context.Context, call rpc.Call, reply chan<- stream.Message) error { + if call.Method != Watch { + return errors.New("call has been misdispatched") + } + + logger := logging.WithRequestID(ctx, h.logger). + WithField("callId", call.ID). + WithField("callMethod", call.Method) + + params := paramsWatch{} + if err := json.Unmarshal(call.Params, ¶ms); err != nil { + logger. + WithError(err). + Warn("couldn't decode call params") + return err + } + if params.Group == "core" { + params.Group = "" + } + + logger = logger.WithField("callParams", ¶ms) + logger.Debug("Handling RPC call") + + kctx, err := h.clientPool.Context(params.Context) + if err != nil { + return err + } + + kubeClient, err := kctx.DynamicClient() + if err != nil { + return err + } + + factory := dynamicinformer.NewFilteredDynamicSharedInformerFactory( + kubeClient, + 30*time.Second, + params.Namespace, + func(opts *metav1.ListOptions) { + opts.FieldSelector = params.FieldSelector + if len(params.Name) > 0 { + if len(opts.FieldSelector) > 0 { + opts.FieldSelector += "," + } + opts.FieldSelector += "metadata.name=" + params.Name + } + opts.LabelSelector = params.LabelSelector + }, + ) + informer := factory.ForResource(schema.GroupVersionResource{ + Group: params.Group, + Version: params.Version, + Resource: params.Resource, + }) + + factory.Start(ctx.Done()) + for _, ok := range factory.WaitForCacheSync(ctx.Done()) { + if !ok { + // The context has been canceled - not much we can do here. + return nil + } + } + + informer.Informer().AddEventHandler(cache.ResourceEventHandlerFuncs{ + AddFunc: func(obj interface{}) { + un, ok := obj.(*unstructured.Unstructured) + if !ok { + return + } + + logger. + WithField("event", "add"). + WithField("objectName", un.GetName()). + WithField("objectNamespace", un.GetNamespace()). + Trace("Informer event") + + reply <- encodeResponse(call, obj.(runtime.Object), "added", nil) + }, + UpdateFunc: func(_, newObj interface{}) { + un, ok := newObj.(*unstructured.Unstructured) + if !ok { + return + } + + logger. + WithField("event", "update"). + WithField("objectName", un.GetName()). + WithField("objectNamespace", un.GetNamespace()). + Trace("Informer event") + + reply <- encodeResponse(call, newObj.(runtime.Object), "updated", nil) + }, + DeleteFunc: func(obj interface{}) { + un, ok := obj.(*unstructured.Unstructured) + if !ok { + return + } + logger. + WithField("event", "delete"). + WithField("objectName", un.GetName()). + WithField("objectNamespace", un.GetNamespace()). + Trace("Informer event") + + reply <- encodeResponse(call, obj.(runtime.Object), "deleted", nil) + }, + }) + + <-ctx.Done() + return nil +} + +func encodeResponse(call rpc.Call, obj runtime.Object, event string, err error) []byte { + reply := map[string]interface{}{"id": call.ID} + + if err != nil { + reply["error"] = err.Error() + } else { + var yaml bytes.Buffer + printr := printers.NewTypeSetter(scheme.Scheme).ToPrinter(&printers.YAMLPrinter{}) + if err := printr.PrintObj(obj, &yaml); err != nil { + reply["error"] = err.Error() + } + + var json bytes.Buffer + printr = printers.NewTypeSetter(scheme.Scheme).ToPrinter(&printers.JSONPrinter{}) + if err := printr.PrintObj(obj, &json); err != nil { + reply["error"] = err.Error() + } + + reply["result"] = map[string]string{ + "yaml": yaml.String(), + "json": json.String(), + "event": event, + } + } + + bytes, err := json.Marshal(reply) + if err != nil { + // Something really bad just happened. + panic(err.Error()) + } + return bytes +} diff --git a/api/stream/rpc/rpc.go b/api/stream/rpc/rpc.go new file mode 100644 index 0000000..85472ff --- /dev/null +++ b/api/stream/rpc/rpc.go @@ -0,0 +1,131 @@ +package rpc + +import ( + "context" + "encoding/json" + "sync" + + "github.com/sirupsen/logrus" + + "github.com/iximiuz/kexp/api/stream" + "github.com/iximiuz/kexp/logging" +) + +const ( + MessageTypeCall stream.MessageType = "call" +) + +type CallID string + +type CallMethod string + +const ( + callMethodCancel CallMethod = ".cancel" +) + +type Call struct { + ID CallID `json:"id"` + Method CallMethod `json:"method"` + Params json.RawMessage `json:"params"` +} + +type CallHandler interface { + Handle(ctx context.Context, call Call, reply chan<- stream.Message) error +} + +type CallDispatcher struct { + handlers map[CallMethod]CallHandler + activeCalls map[CallID]context.CancelFunc + activeLock sync.Mutex + logger *logrus.Entry +} + +func NewCallDispatcher() *CallDispatcher { + return &CallDispatcher{ + handlers: make(map[CallMethod]CallHandler), + activeCalls: make(map[CallID]context.CancelFunc), + logger: logrus.WithField("module", "stream/rpc/callDispatcher"), + } +} + +func (d *CallDispatcher) RegisterCallHandler(method CallMethod, handler CallHandler) { + d.handlers[method] = handler +} + +func (d *CallDispatcher) Handle( + ctx context.Context, + msg stream.Message, + reply chan<- stream.Message, +) error { + // Dispatch calls by method. + logger := logging.WithRequestID(ctx, d.logger) + + call := Call{} + if err := json.Unmarshal(msg, &call); err != nil { + logger. + WithError(err). + WithField("message", msg). + Warn("Couldn't decode stream message into RPC call") + return err + } + + logger = logger. + WithField("callId", call.ID). + WithField("callMethod", call.Method) + logger.Debug("Dispatching RPC call") + + if call.Method == callMethodCancel { + d.activeLock.Lock() + defer d.activeLock.Unlock() + + if cancel, found := d.activeCalls[call.ID]; found { + logger.Debug("RPC call has been canceled") + cancel() + delete(d.activeCalls, call.ID) + } else { + logger.Warn("Active RPC call not found - nothing to cancel") + } + + reply <- okReply(call) + return nil + } + + handler, found := d.handlers[call.Method] + if !found { + logger.Debug("RPC call handler not found") + reply <- koReply(call, "Unknown method") + return nil + } + + ctx, cancel := context.WithCancel(ctx) + + d.activeLock.Lock() + d.activeCalls[call.ID] = cancel + d.activeLock.Unlock() + + err := handler.Handle(ctx, call, reply) + + d.activeLock.Lock() + delete(d.activeCalls, call.ID) + d.activeLock.Unlock() + + return err +} + +func okReply(call Call) stream.Message { + msg, err := json.Marshal(map[string]interface{}{"id": call.ID, "result": "ok"}) + if err != nil { + // Something really bad just happened. + panic(err) + } + return stream.Message(msg) +} + +func koReply(call Call, errMsg string) stream.Message { + msg, err := json.Marshal(map[string]interface{}{"id": call.ID, "error": errMsg}) + if err != nil { + // Something really bad just happened. + panic(err) + } + return stream.Message(msg) +} diff --git a/api/stream/stream.go b/api/stream/stream.go new file mode 100644 index 0000000..f9f202e --- /dev/null +++ b/api/stream/stream.go @@ -0,0 +1,204 @@ +package stream + +import ( + "context" + "encoding/json" + "net/http" + "sync" + + "github.com/gin-gonic/gin" + "github.com/gorilla/websocket" + "github.com/sirupsen/logrus" + + "github.com/iximiuz/kexp/api" +) + +type MessageType string + +type Message []byte + +type MessageHandler interface { + Handle(ctx context.Context, msg Message, reply chan<- Message) error +} + +// Stream handler. +type Handler struct { + api.Handler + + handlers map[MessageType]MessageHandler + upgrader websocket.Upgrader +} + +func NewHandler(logger *logrus.Entry) *Handler { + return &Handler{ + Handler: api.NewHandler("stream", logger), + handlers: make(map[MessageType]MessageHandler), + upgrader: websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + // TODO: security + return true + }, + }, + } +} + +func (h *Handler) Connect(c *gin.Context) { + logger := h.Logger(c).WithField("method", "connect") + + conn, err := h.upgrader.Upgrade(c.Writer, c.Request, nil) + if err != nil { + logger.WithError(err).Error("Couldn't upgrade to ws conn") + c.JSON(http.StatusInternalServerError, map[string]string{"error": "upgrade failed"}) + return + } + + newMessageDispatcher(c.Request.Context(), conn, h.handlers, logger).runDispatchLoop() +} + +func (h *Handler) RegisterMessageHandler(msgType MessageType, handler MessageHandler) { + // TODO: Use mutex. + h.handlers[msgType] = handler +} + +// Lives as long as the WebSocket connection. +type messageDispatcher struct { + ctx context.Context // conn's (i.e. http.Request's) ctx + cancel context.CancelFunc // called when conn terminates or a critical error occurs + + // gorilla supports only 1 concurrent reader and only 1 concurrent writer + conn *websocket.Conn + msgReadLock sync.Mutex + msgWriteLock sync.Mutex + + handlers map[MessageType]MessageHandler + + logger *logrus.Entry +} + +func newMessageDispatcher( + ctx context.Context, + conn *websocket.Conn, + handlers map[MessageType]MessageHandler, + logger *logrus.Entry, +) *messageDispatcher { + ctx, cancel := context.WithCancel(ctx) + + return &messageDispatcher{ + ctx: ctx, + cancel: cancel, + conn: conn, + handlers: handlers, + logger: logger, + } +} + +func (d *messageDispatcher) runDispatchLoop() { + for { + msg, err := d.readMessage() + if err != nil || msg == nil { + break + } + + partial := struct { + Type MessageType `json:"type"` + }{} + if err := json.Unmarshal(msg, &partial); err != nil { + d.logger. + WithError(err). + WithField("message", msg). + Warn("Couldn't decode raw ws message") + continue // Short circuit to the next message. + } + + // Dispatch message by type. Goroutine should live + // no longer than the dispatcher's context. + go d.dispatchMessage(partial.Type, msg) + } + + // Make sure all dispatch goroutines are stopped (eventually). + d.cancel() + + if err := d.conn.Close(); err != nil { + d.logger.WithError(err).Warn("Failed to close ws connection") + } +} + +func (d *messageDispatcher) dispatchMessage(msgType MessageType, msg Message) { + logger := d.logger.WithField("messageType", msgType) + logger.Debug("Dispatching message") + + handler, found := d.handlers[msgType] + if !found { + logger. + WithField("message", string(msg)). + Warn("Unknown message type") + return + } + + reply := make(chan Message) + + go func() { + defer close(reply) + + if err := handler.Handle(d.ctx, msg, reply); err != nil { + logger. + WithError(err). + WithField("message", string(msg)). + Warn("Message handling failed") + } + }() + + for msg := range reply { + d.writeMessage(msg) + } +} + +func (d *messageDispatcher) readMessage() (Message, error) { + d.msgReadLock.Lock() + defer d.msgReadLock.Unlock() + + type result struct { + data []byte + err error + } + read := make(chan result) + + go func() { + msgType, data, err := d.conn.ReadMessage() + if err != nil { + d.logger.WithError(err).Error("Couldn't read ws message") + read <- result{data: nil, err: err} + return + } + + if msgType == websocket.CloseMessage { + d.logger.Info("ws connection has been closed by peer") + read <- result{data: nil, err: nil} + return + } + + read <- result{data: data, err: nil} + }() + + select { + case <-d.ctx.Done(): + return nil, nil + case res := <-read: + return Message(res.data), res.err + } +} + +func (d *messageDispatcher) writeMessage(msg Message) { + d.msgWriteLock.Lock() + defer d.msgWriteLock.Unlock() + + if err := d.conn.WriteMessage(websocket.TextMessage, []byte(msg)); err != nil { + d.logger. + WithError(err). + WithField("message", string(msg)). + Warn("couldn't write ws message") + + // It's a fatal condition for the stream. + d.cancel() + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..ee382be --- /dev/null +++ b/go.mod @@ -0,0 +1,92 @@ +module github.com/iximiuz/kexp + +go 1.20 + +require ( + github.com/gin-gonic/gin v1.9.1 + github.com/google/uuid v1.3.0 + github.com/gorilla/websocket v1.5.0 + github.com/sirupsen/logrus v1.9.3 + github.com/spf13/cobra v1.7.0 + k8s.io/apimachinery v0.27.4 + k8s.io/cli-runtime v0.27.4 + k8s.io/client-go v0.27.4 +) + +require ( + github.com/bytedance/sonic v1.10.0-rc3 // indirect + github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d // indirect + github.com/chenzhuoyu/iasm v0.9.0 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/emicklei/go-restful/v3 v3.10.2 // indirect + github.com/evanphx/json-patch v5.6.0+incompatible // indirect + github.com/gabriel-vasile/mimetype v1.4.2 // indirect + github.com/gin-contrib/sse v0.1.0 // indirect + github.com/go-errors/errors v1.4.2 // indirect + github.com/go-logr/logr v1.2.4 // indirect + github.com/go-openapi/jsonpointer v0.20.0 // indirect + github.com/go-openapi/jsonreference v0.20.2 // indirect + github.com/go-openapi/swag v0.22.4 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.14.1 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/gogo/protobuf v1.3.2 // indirect + github.com/golang/protobuf v1.5.3 // indirect + github.com/google/btree v1.1.2 // indirect + github.com/google/gnostic v0.5.7-v3refs // indirect + github.com/google/go-cmp v0.5.9 // indirect + github.com/google/gofuzz v1.2.0 // indirect + github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 // indirect + github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 // indirect + github.com/imdario/mergo v0.3.16 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/josharian/intern v1.0.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.2.5 // indirect + github.com/leodido/go-urn v1.2.4 // indirect + github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de // indirect + github.com/mailru/easyjson v0.7.7 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 // indirect + github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect + github.com/pelletier/go-toml/v2 v2.0.9 // indirect + github.com/peterbourgon/diskv v2.0.1+incompatible // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/spf13/pflag v1.0.5 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.2.11 // indirect + github.com/xlab/treeprint v1.2.0 // indirect + go.starlark.net v0.0.0-20230731234521-9b46791399bf // indirect + golang.org/x/arch v0.4.0 // indirect + golang.org/x/crypto v0.12.0 // indirect + golang.org/x/net v0.14.0 // indirect + golang.org/x/oauth2 v0.11.0 // indirect + golang.org/x/sys v0.11.0 // indirect + golang.org/x/term v0.11.0 // indirect + golang.org/x/text v0.12.0 // indirect + golang.org/x/time v0.3.0 // indirect + google.golang.org/appengine v1.6.7 // indirect + google.golang.org/protobuf v1.31.0 // indirect + gopkg.in/inf.v0 v0.9.1 // indirect + gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect + k8s.io/api v0.27.4 // indirect + k8s.io/klog/v2 v2.100.1 // indirect + k8s.io/kube-openapi v0.0.0-20230601164746-7562a1006961 // indirect + k8s.io/utils v0.0.0-20230726121419-3b25d923346b // indirect + sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect + sigs.k8s.io/kustomize/api v0.13.2 // indirect + sigs.k8s.io/kustomize/kyaml v0.14.1 // indirect + sigs.k8s.io/structured-merge-diff/v4 v4.3.0 // indirect + sigs.k8s.io/yaml v1.3.0 // indirect +) + +replace ( + github.com/google/gnostic => github.com/google/gnostic v0.5.7-v3refs + k8s.io/kube-openapi => k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f + sigs.k8s.io/kustomize/api => sigs.k8s.io/kustomize/api v0.13.2 + sigs.k8s.io/kustomize/kyaml => sigs.k8s.io/kustomize/kyaml v0.14.1 +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..04675ca --- /dev/null +++ b/go.sum @@ -0,0 +1,314 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM= +github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM= +github.com/bytedance/sonic v1.10.0-rc3 h1:uNSnscRapXTwUgTyOF0GVljYD08p9X/Lbr9MweSV3V0= +github.com/bytedance/sonic v1.10.0-rc3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4= +github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY= +github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0= +github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA= +github.com/chenzhuoyu/iasm v0.9.0 h1:9fhXjVzq5hUy2gkhhgHl95zG2cEAhw9OSGs8toWWAwo= +github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/emicklei/go-restful/v3 v3.10.2 h1:hIovbnmBTLjHXkqEBUz3HGpXZdM7ZrE9fJIZIqlJLqE= +github.com/emicklei/go-restful/v3 v3.10.2/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRry+4bhvbpWn3mrbc= +github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= +github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= +github.com/evanphx/json-patch v5.6.0+incompatible h1:jBYDEEiFBPxA0v50tFdvOzQQTCvpL6mnFh5mB2/l16U= +github.com/evanphx/json-patch v5.6.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/gabriel-vasile/mimetype v1.4.2 h1:w5qFW6JKBz9Y393Y4q372O9A7cUSequkh1Q7OhCmWKU= +github.com/gabriel-vasile/mimetype v1.4.2/go.mod h1:zApsH/mKG4w07erKIaJPFiX0Tsq9BFQgN3qGY5GnNgA= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg= +github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU= +github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= +github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= +github.com/go-logr/logr v1.2.0/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ= +github.com/go-logr/logr v1.2.4/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-openapi/jsonpointer v0.19.6/go.mod h1:osyAmYz/mB/C3I+WsTTSgw1ONzaLJoLCyoi6/zppojs= +github.com/go-openapi/jsonpointer v0.20.0 h1:ESKJdU9ASRfaPNOPRx12IUyA1vn3R9GiE3KYD14BXdQ= +github.com/go-openapi/jsonpointer v0.20.0/go.mod h1:6PGzBjjIIumbLYysB73Klnms1mwnU4G3YHOECG3CedA= +github.com/go-openapi/jsonreference v0.20.2 h1:3sVjiK66+uXK/6oQ8xgcRKcFgQ5KXa2KvnJRumpMGbE= +github.com/go-openapi/jsonreference v0.20.2/go.mod h1:Bl1zwGIM8/wsvqjsOQLJ/SH+En5Ap4rVB5KVcIDZG2k= +github.com/go-openapi/swag v0.22.3/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-openapi/swag v0.22.4 h1:QLMzNJnMGPRNDCbySlcj1x01tzU8/9LTTL9hZZZogBU= +github.com/go-openapi/swag v0.22.4/go.mod h1:UzaqsxGiab7freDnrUUra0MwWfN/q7tE4j+VcZ0yl14= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k= +github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= +github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q= +github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= +github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg= +github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/google/btree v1.1.2 h1:xf4v41cLI2Z6FxbKm+8Bu+m8ifhj15JuZ9sa0jZCMUU= +github.com/google/btree v1.1.2/go.mod h1:qOPhT0dTNdNzV6Z/lhRX0YXUafgPLFUh+gZMl761Gm4= +github.com/google/gnostic v0.5.7-v3refs h1:FhTMOKj2VhjpouxvWJAV1TL304uMlb9zcDqkl6cEI54= +github.com/google/gnostic v0.5.7-v3refs/go.mod h1:73MKFl6jIHelAJNaBGFzt3SPtZULs9dYrGFt8OiIsHQ= +github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38= +github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= +github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/pprof v0.0.0-20210720184732-4bb14d4b1be1 h1:K6RDEckDVWvDI9JAJYCmNdQXq6neHJOYx3V6jnqNEec= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510 h1:El6M4kTTCOh6aBiKaUGG7oYTSPP8MxqL4YI3kZKwcP4= +github.com/google/shlex v0.0.0-20191202100458-e7afc7fbc510/go.mod h1:pupxD2MaaD3pAXIBCelhxNneeOaAeabZDe5s4K6zSpQ= +github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= +github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc= +github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79 h1:+ngKgrYPPJrOjhax5N+uePQ0Fh1Z7PheYoUI/0nzkPA= +github.com/gregjones/httpcache v0.0.0-20190611155906-901d90724c79/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +github.com/imdario/mergo v0.3.16 h1:wwQJbIsHYGMUyLSPrEq1CT16AhnhNJQ51+4fdHUnCl4= +github.com/imdario/mergo v0.3.16/go.mod h1:WBLT9ZmE3lPoWsEzCh9LPo3TiwVN+ZKEjmz+hD27ysY= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY= +github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= +github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/cpuid/v2 v2.2.5 h1:0E5MSMDEoAulmXNFquVs//DdoomxaoTY1kUhbc/qbZg= +github.com/klauspost/cpuid/v2 v2.2.5/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws= +github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M= +github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q= +github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de h1:9TO3cAIGXtEhnIaL+V+BEER86oLrvS+kWobKpbJuye0= +github.com/liggitt/tabwriter v0.0.0-20181228230101-89fcab3d43de/go.mod h1:zAbeS9B/r2mtpb6U+EI2rYA5OAXxsYw6wTamcNW+zcE= +github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0= +github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00 h1:n6/2gBQ3RWajuToeY6ZtZTIKv2v7ThUy5KKusIT0yc0= +github.com/monochromegane/go-gitignore v0.0.0-20200626010858-205db1a8cc00/go.mod h1:Pm3mSP3c5uWn86xMLZ5Sa7JB9GsEZySvHYXCTK4E9q4= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA= +github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/onsi/ginkgo/v2 v2.9.1 h1:zie5Ly042PD3bsCvsSOPvRnFwyo3rKe64TJlD6nu0mk= +github.com/onsi/gomega v1.27.4 h1:Z2AnStgsdSayCMDiCU42qIz+HLqEPcgiOCXjAU/w+8E= +github.com/pelletier/go-toml/v2 v2.0.9 h1:uH2qQXheeefCCkuBBSLi7jCiSmj3VRh2+Goq2N7Xxu0= +github.com/pelletier/go-toml/v2 v2.0.9/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/peterbourgon/diskv v2.0.1+incompatible h1:UBdAOUP5p4RWqPBg048CAvpKN+vxiaj6gdUUzhl4XmI= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/rogpeppe/go-internal v1.11.0 h1:cWPaGQEPrBb5/AsnsZesgZZ9yb1OQ+GOISoDNXVBh4M= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= +github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0 h1:1zr/of2m5FGMsad5YfcqgdqdWrIhu+EBEJRhR1U7z/c= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.2.11 h1:BMaWp1Bb6fHwEtbplGBGJ498wD+LKlNSl25MjdZY4dU= +github.com/ugorji/go/codec v1.2.11/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg= +github.com/xlab/treeprint v1.2.0 h1:HzHnuAF1plUN2zGlAFHbSQP2qJ0ZAD3XF5XD7OesXRQ= +github.com/xlab/treeprint v1.2.0/go.mod h1:gj5Gd3gPdKtR1ikdDK6fnFLdmIS0X30kTTuNd/WEJu0= +github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +go.starlark.net v0.0.0-20230731234521-9b46791399bf h1:8sb2EffLsgYa0V3wDeqJDov1ux7XdZZv9HrazRIcnWw= +go.starlark.net v0.0.0-20230731234521-9b46791399bf/go.mod h1:jxU+3+j+71eXOW14274+SmmuW82qJzl6iZSeqEtTGds= +golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/arch v0.4.0 h1:A8WCeEWhLwPBKNbFi5Wv5UTCBx5zzubnXDlMOFAzFMc= +golang.org/x/arch v0.4.0/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.12.0 h1:tFM/ta59kqch6LlvYnPa0yx5a83cL2nHflFhYKvv9Yk= +golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14= +golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.11.0 h1:vPL4xzxBM4niKCW6g9whtaWVXTJf1U5e4aZxxFx/gbU= +golang.org/x/oauth2 v0.11.0/go.mod h1:LdF7O/8bLR/qWK9DrpXmbHLTouvRHK0SgJl0GmDBchk= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM= +golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20220526004731-065cf7ba2467/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.11.0 h1:F9tnn/DA/Im8nCwm+fX+1/eBwi4qFjRT++MhtVC4ZX0= +golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc= +golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= +golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4= +golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= +golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.7.0 h1:W4OVu8VVOaIO0yzWMNdepAulS7YfoS3Zabrm8DOXXU4= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= +google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/appengine v1.6.7 h1:FZR1q0exgwxzPzp/aF+VccGrSfxfPpkBqjIIEq3ru6c= +google.golang.org/appengine v1.6.7/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= +google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= +google.golang.org/genproto v0.0.0-20201019141844-1ed22bb0c154/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= +google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= +google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4= +google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8= +google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.27.4 h1:0pCo/AN9hONazBKlNUdhQymmnfLRbSZjd5H5H3f0bSs= +k8s.io/api v0.27.4/go.mod h1:O3smaaX15NfxjzILfiln1D8Z3+gEYpjEpiNA/1EVK1Y= +k8s.io/apimachinery v0.27.4 h1:CdxflD4AF61yewuid0fLl6bM4a3q04jWel0IlP+aYjs= +k8s.io/apimachinery v0.27.4/go.mod h1:XNfZ6xklnMCOGGFNqXG7bUrQCoR04dh/E7FprV6pb+E= +k8s.io/cli-runtime v0.27.4 h1:Zb0eci+58eHZNnoHhjRFc7W88s8dlG12VtIl3Nv2Hto= +k8s.io/cli-runtime v0.27.4/go.mod h1:k9Z1xiZq2xNplQmehpDquLgc+rE+pubpO1cK4al4Mlw= +k8s.io/client-go v0.27.4 h1:vj2YTtSJ6J4KxaC88P4pMPEQECWMY8gqPqsTgUKzvjk= +k8s.io/client-go v0.27.4/go.mod h1:ragcly7lUlN0SRPk5/ZkGnDjPknzb37TICq07WhI6Xc= +k8s.io/klog/v2 v2.100.1 h1:7WCHKK6K8fNhTqfBhISHQ97KrnJNFZMcQvKp7gP/tmg= +k8s.io/klog/v2 v2.100.1/go.mod h1:y1WjHnz7Dj687irZUWR/WLkLc5N1YHtjLdmgWjndZn0= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f h1:2kWPakN3i/k81b0gvD5C5FJ2kxm1WrQFanWchyKuqGg= +k8s.io/kube-openapi v0.0.0-20230501164219-8b0f38b5fd1f/go.mod h1:byini6yhqGC14c3ebc/QwanvYwhuMWF6yz2F8uwW8eg= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI= +k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0= +nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50= +rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo= +sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0= +sigs.k8s.io/kustomize/api v0.13.2 h1:kejWfLeJhUsTGioDoFNJET5LQe/ajzXhJGYoU+pJsiA= +sigs.k8s.io/kustomize/api v0.13.2/go.mod h1:DUp325VVMFVcQSq+ZxyDisA8wtldwHxLZbr1g94UHsw= +sigs.k8s.io/kustomize/kyaml v0.14.1 h1:c8iibius7l24G2wVAGZn/Va2wNys03GXLjYVIcFVxKA= +sigs.k8s.io/kustomize/kyaml v0.14.1/go.mod h1:AN1/IpawKilWD7V+YvQwRGUvuUOOWpjsHu6uHwonSF4= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0 h1:UZbZAZfX0wV2zr7YZorDz6GXROfDFj6LvqCRm4VUVKk= +sigs.k8s.io/structured-merge-diff/v4 v4.3.0/go.mod h1:N8hJocpFajUSSeSJ9bOZ77VzejKZaXsTtZo4/u7Io08= +sigs.k8s.io/yaml v1.3.0 h1:a2VclLzOGrwOHDiV8EfBGhvjHvP46CtW5j6POvhYGGo= +sigs.k8s.io/yaml v1.3.0/go.mod h1:GeOyir5tyXNByN85N/dRIT9es5UQNerPYEKK56eTBm8= diff --git a/kubeclient/pool.go b/kubeclient/pool.go new file mode 100644 index 0000000..9eef09f --- /dev/null +++ b/kubeclient/pool.go @@ -0,0 +1,190 @@ +package kubeclient + +import ( + "context" + "errors" + "fmt" + "sync" + + metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" + "k8s.io/apimachinery/pkg/runtime/schema" + "k8s.io/client-go/discovery" + "k8s.io/client-go/dynamic" + "k8s.io/client-go/rest" +) + +var errUnknownContext = errors.New("unknown context") + +type ClientPool struct { + mux sync.RWMutex + + contexts map[string]*Context + current *Context +} + +func NewPool() *ClientPool { + return &ClientPool{ + contexts: make(map[string]*Context), + } +} + +func (p *ClientPool) Add( + ctx context.Context, + context string, + user string, + cluster string, + namespace string, + config *rest.Config, +) error { + p.mux.Lock() + defer p.mux.Unlock() + + kctx := &Context{ + name: context, + user: user, + cluster: cluster, + namespace: namespace, + config: config, + } + + client, err := kctx.DynamicClient() + if err != nil { + return fmt.Errorf("couldn't create dynamic client for given config: %w", err) + } + + ns, err := client.Resource(schema.GroupVersionResource{ + Group: "", + Version: "v1", + Resource: "namespaces", + }).Get(ctx, "kube-system", metav1.GetOptions{}) + if err != nil { + return fmt.Errorf("couldn't get kube-system ns: %w", err) + } + + kctx.clusterUID = string(ns.GetUID()) + + p.contexts[kctx.name] = kctx + + // First added becomes default (until it's explicitly overriden). + if p.current == nil { + p.current = kctx + } + + return nil +} + +func (p *ClientPool) SetCurrent(name string) error { + p.mux.Lock() + defer p.mux.Unlock() + + if c, found := p.contexts[name]; found { + p.current = c + return nil + } + + return errUnknownContext +} + +func (p *ClientPool) CurrentContext() *Context { + return p.current +} + +func (p *ClientPool) Context(name string) (*Context, error) { + p.mux.RLock() + defer p.mux.RUnlock() + + if c, found := p.contexts[name]; found { + return c, nil + } + + return nil, errUnknownContext +} + +func (p *ClientPool) Contexts() (cs []*Context) { + p.mux.RLock() + defer p.mux.RUnlock() + + for _, c := range p.contexts { + cs = append(cs, c) + } + return +} + +type Context struct { + mux sync.RWMutex + + // Attrs from the kubeconfig struct. + + // Name must be unique per kubeconfig file. + name string + + // Cluster name must be unique per kubeconfig file + // but cluster entries with different names can point + // to the same cluster. + cluster string + + // Unique ID for the cluster because multiple contexts + // can point to the same cluster known under different + // names. Since there's no unique cluster ID in Kubernetes, + // UID of the kube-system namespace is used as a substitute. + clusterUID string + + user string + + namespace string + + config *rest.Config + + discoveryClient discovery.DiscoveryInterface + dynamicClient dynamic.Interface +} + +func (c *Context) Name() string { + return c.name +} + +func (c *Context) User() string { + return c.user +} + +func (c *Context) Cluster() string { + return c.cluster +} + +func (c *Context) ClusterUID() string { + return c.clusterUID +} + +func (c *Context) Namespace() string { + return c.namespace +} + +func (c *Context) DiscoveryClient() (discovery.DiscoveryInterface, error) { + c.mux.Lock() + defer c.mux.Unlock() + + if c.discoveryClient == nil { + client, err := discovery.NewDiscoveryClientForConfig(c.config) + if err != nil { + return nil, fmt.Errorf("couldn't create discovery client for given config: %w", err) + } + c.discoveryClient = client + } + + return c.discoveryClient, nil +} + +func (c *Context) DynamicClient() (dynamic.Interface, error) { + c.mux.Lock() + defer c.mux.Unlock() + + if c.dynamicClient == nil { + client, err := dynamic.NewForConfig(c.config) + if err != nil { + return nil, fmt.Errorf("couldn't create dynamic client for given config: %w", err) + } + c.dynamicClient = client + } + + return c.dynamicClient, nil +} diff --git a/logging/logging.go b/logging/logging.go new file mode 100644 index 0000000..9ba933b --- /dev/null +++ b/logging/logging.go @@ -0,0 +1,19 @@ +package logging + +import ( + "context" + + "github.com/sirupsen/logrus" +) + +type loggingContextKey int + +const KeyRequestID loggingContextKey = iota + +func WithRequestID(ctx context.Context, logger *logrus.Entry) *logrus.Entry { + rid, ok := ctx.Value(KeyRequestID).(string) + if !ok { + rid = "none" + } + return logger.WithField("request_id", rid) +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..b8da068 --- /dev/null +++ b/main.go @@ -0,0 +1,210 @@ +package main + +import ( + "context" + "embed" + "fmt" + "io/fs" + "net/http" + "time" + + "github.com/gin-gonic/gin" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "k8s.io/cli-runtime/pkg/genericclioptions" + + "github.com/iximiuz/kexp/api" + restkubecontexts "github.com/iximiuz/kexp/api/rest/kube/contexts" + restkubeobjects "github.com/iximiuz/kexp/api/rest/kube/objects" + restkuberesources "github.com/iximiuz/kexp/api/rest/kube/resources" + "github.com/iximiuz/kexp/api/stream" + streamrpc "github.com/iximiuz/kexp/api/stream/rpc" + streamkubeobjects "github.com/iximiuz/kexp/api/stream/rpc/kube/objects" + "github.com/iximiuz/kexp/kubeclient" +) + +var ( + version = "v0.0.0" + commit = "HEAD" + date = "unknown" + + versionString = fmt.Sprintf("%s (build: %s commit: %s)", version, date, commit) +) + +type flagpole struct { + *genericclioptions.ConfigFlags + + host string + port string +} + +// [--kubeconfig] [--namespace] [--context] +func main() { + logrus.SetFormatter(&logrus.JSONFormatter{}) + logrus.SetLevel(logrus.TraceLevel) + + flags := flagpole{ + ConfigFlags: genericclioptions.NewConfigFlags(false), // false is import here! + } + + cmd := &cobra.Command{ + Version: versionString, + Use: "kexp", + Run: run(&flags), + } + + flags.AddFlags(cmd.PersistentFlags()) + cmd.PersistentFlags().StringVar(&flags.host, "host", "127.0.0.1", "Listening host") + cmd.PersistentFlags().StringVar(&flags.port, "port", "8090", "Listening port") + + if err := cmd.Execute(); err != nil { + logrus.WithError(err).Fatal("Command failed") + } +} + +//go:embed ui/dist/* +var uiStaticFS embed.FS + +func run(flags *flagpole) func(cmd *cobra.Command, args []string) { + return func(cmd *cobra.Command, args []string) { + kubeClientPool, err := initKubeClientPoolWithRetry(cmd.Context(), flags, 300*time.Second) + if err != nil { + logrus. + WithError(err). + Fatal("Could not initialize Kubernetes client pool") + } + logrus. + WithField("contexts", kubeClientPool.Contexts()). + Debug("Kube context discovery finished") + + logrus.Infof("Starting server on %v:%v", flags.host, flags.port) + + router := gin.New() + router.Use(gin.Logger()) + router.Use(api.MiddlewareRequestID) + + kubeContextsHandler := restkubecontexts.NewHandler( + kubeClientPool, + logrus.NewEntry(logrus.StandardLogger()), + ) + kubeContextsv1 := router.Group("/api/kube/v1/contexts") + kubeContextsv1.GET("/", kubeContextsHandler.List) + + kubeResourcesHandler := restkuberesources.NewHandler( + kubeClientPool, + logrus.NewEntry(logrus.StandardLogger()), + ) + kubeResourcesv1 := router.Group("/api/kube/v1/contexts/:ctx/resources") + kubeResourcesv1.GET("/", kubeResourcesHandler.List) + + kubeObjectsHandler := restkubeobjects.NewHandler( + kubeClientPool, + logrus.NewEntry(logrus.StandardLogger()), + ) + kubeObjectsv1 := router.Group("/api/kube/v1/contexts/:ctx/resources") + kubeObjectsv1.GET("/:group/:version/:resource/", kubeObjectsHandler.List) + kubeObjectsv1.GET("/:group/:version/namespaces/:namespace/:resource/", kubeObjectsHandler.List) + kubeObjectsv1.GET("/:group/:version/:resource/:name/", kubeObjectsHandler.Get) + kubeObjectsv1.GET("/:group/:version/namespaces/:namespace/:resource/:name/", kubeObjectsHandler.Get) + kubeObjectsv1.PUT("/:group/:version/:resource/:name/", kubeObjectsHandler.Update) + kubeObjectsv1.PUT("/:group/:version/namespaces/:namespace/:resource/:name/", kubeObjectsHandler.Update) + kubeObjectsv1.DELETE("/:group/:version/:resource/:name/", kubeObjectsHandler.Delete) + kubeObjectsv1.DELETE("/:group/:version/namespaces/:namespace/:resource/:name/", kubeObjectsHandler.Delete) + + rpcCallDispatcher := streamrpc.NewCallDispatcher() + rpcCallDispatcher.RegisterCallHandler( + streamkubeobjects.Watch, + streamkubeobjects.NewWatchHandler(kubeClientPool), + ) + streamHandler := stream.NewHandler(logrus.NewEntry(logrus.StandardLogger())) + streamHandler.RegisterMessageHandler(streamrpc.MessageTypeCall, rpcCallDispatcher) + streamv1 := router.Group("/api/stream/v1") + streamv1.GET("/", streamHandler.Connect) + + if uiStaticFS, err := fs.Sub(uiStaticFS, "ui/dist"); err != nil { + logrus.WithError(err).Fatal("Could not load static files") + } else { + router.StaticFS("/ui", http.FS(uiStaticFS)) + + router.GET("/", func(c *gin.Context) { + c.Redirect(http.StatusMovedPermanently, "/ui") + }) + } + + if err := router.Run(flags.host + ":" + flags.port); err != nil { + logrus.WithError(err).Fatal("Router failed") + } + } +} + +func initKubeClientPool(ctx context.Context, flags *flagpole) (*kubeclient.ClientPool, error) { + rawConfig, err := flags.ToRawKubeConfigLoader().RawConfig() + if err != nil { + return nil, err + } + + curKubeCtx := *flags.Context + if curKubeCtx == "" { + curKubeCtx = rawConfig.CurrentContext + } + + pool := kubeclient.NewPool() + for name, kctx := range rawConfig.Contexts { + // TODO: This might be an overkill. + // TODO: Restore the original flags.Context value. + flags.Context = &name + config, err := flags.ToRawKubeConfigLoader().ClientConfig() + if err != nil { + logrus. + WithField("context", name). + WithError(err). + Warnf("couldn't load REST config for a context") + if name == curKubeCtx { + curKubeCtx = "" + } + continue + } + + if err := pool.Add(ctx, name, kctx.AuthInfo, kctx.Cluster, kctx.Namespace, config); err != nil { + logrus. + WithField("context", name). + WithError(err). + Warnf("couldn't add a context to the pool") + if name == curKubeCtx { + curKubeCtx = "" + } + continue + } + } + + if len(pool.Contexts()) == 0 { + return nil, fmt.Errorf("no functional contexts found") + } + + if curKubeCtx != "" { + if err := pool.SetCurrent(curKubeCtx); err != nil { + return nil, err + } + } + + return pool, nil +} + +func initKubeClientPoolWithRetry( + ctx context.Context, + flags *flagpole, + maxWait time.Duration, +) (pool *kubeclient.ClientPool, err error) { + startAt := time.Now() + + for time.Since(startAt) < maxWait { + pool, err = initKubeClientPool(ctx, flags) + if err == nil { + return pool, nil + } + + time.Sleep(1 * time.Second) + } + + return nil, err +} diff --git a/ui/.eslintrc.cjs b/ui/.eslintrc.cjs new file mode 100644 index 0000000..35e0332 --- /dev/null +++ b/ui/.eslintrc.cjs @@ -0,0 +1,95 @@ +module.exports = { + root: true, + env: { + browser: true, + es2021: true, + node: true, + }, + ignorePatterns: ["dist", "ui/node_modules", "*.config.js"], + parser: "vue-eslint-parser", + parserOptions: { + parser: { + // Script parser for ` + + \ No newline at end of file diff --git a/ui/package-lock.json b/ui/package-lock.json new file mode 100644 index 0000000..311a661 --- /dev/null +++ b/ui/package-lock.json @@ -0,0 +1,6716 @@ +{ + "name": "ui", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "ui", + "version": "0.0.0", + "dependencies": { + "@heroicons/vue": "^2.0.18", + "@kubernetes/client-node": "^0.18.1", + "@vueuse/core": "^10.3.0", + "axios": "^1.4.0", + "axios-retry": "^3.7.0", + "buffer": "^6.0.3", + "codejar": "^4.1.0", + "cytoscape": "^3.20.0", + "cytoscape-dagre": "^2.3.2", + "cytoscape-node-html-label": "^1.2.2", + "js-yaml": "^4.1.0", + "pinia": "^2.0.14", + "prismjs": "^1.29.0", + "util": "^0.12.5", + "uuid": "^9.0.0", + "vue": "^3.2.27" + }, + "devDependencies": { + "@types/prismjs": "^1.26.0", + "@types/uuid": "^9.0.2", + "@typescript-eslint/eslint-plugin": "^6.5.0", + "@typescript-eslint/parser": "^6.5.0", + "@vitejs/plugin-vue": "^4.2.3", + "autoprefixer": "^10.4.0", + "daisyui": "^3.5.0", + "eslint": "^8.48.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-anti-trojan-source": "^1.1.1", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-security-node": "^1.1.1", + "eslint-plugin-vue": "^9.1.1", + "postcss": "^8.4.29", + "postcss-scrollbar": "^0.5.1", + "tailwindcss": "^3.0.6", + "typescript": "^5.2.2", + "vite": "^4.3.9", + "vite-plugin-checker": "^0.6.2", + "vue-eslint-parser": "^9.3.1", + "vue-tsc": "^1.8.10" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@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==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true + }, + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/code-frame/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz", + "integrity": "sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz", + "integrity": "sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/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==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.16", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.16.tgz", + "integrity": "sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz", + "integrity": "sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz", + "integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/js": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.49.0.tgz", + "integrity": "sha512-1S8uAY/MTJqVx0SC4epBq+N2yhuwtNwLbJYNZyhL2pO1ZVKn5HFXav5T41Ryzy9K9V7ZId2JB2oy/W4aCd9/2w==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@heroicons/vue": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/@heroicons/vue/-/vue-2.0.18.tgz", + "integrity": "sha512-BcTC9nq2TkwNSfQuqo96J7ehx4etezypc2YeTq7KsXWxrcrerhkgjLrxGRBnStN0wrXo0Gv4BInybqz5uBG6Cw==", + "peerDependencies": { + "vue": ">= 3" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/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==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@kubernetes/client-node": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/@kubernetes/client-node/-/client-node-0.18.1.tgz", + "integrity": "sha512-F3JiK9iZnbh81O/da1tD0h8fQMi/MDttWc/JydyUVnjPEom55wVfnpl4zQ/sWD4uKB8FlxYRPiLwV2ZXB+xPKw==", + "dependencies": { + "@types/js-yaml": "^4.0.1", + "@types/node": "^18.11.17", + "@types/request": "^2.47.1", + "@types/ws": "^8.5.3", + "byline": "^5.0.0", + "isomorphic-ws": "^5.0.0", + "js-yaml": "^4.1.0", + "jsonpath-plus": "^7.2.0", + "request": "^2.88.0", + "rfc4648": "^1.3.0", + "stream-buffers": "^3.0.2", + "tar": "^6.1.11", + "tmp-promise": "^3.0.2", + "tslib": "^2.4.1", + "underscore": "^1.13.6", + "ws": "^8.11.0" + }, + "optionalDependencies": { + "openid-client": "^5.3.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@types/caseless": { + "version": "0.12.3", + "resolved": "https://registry.npmjs.org/@types/caseless/-/caseless-0.12.3.tgz", + "integrity": "sha512-ZD/NsIJYq/2RH+hY7lXmstfp/v9djGt9ah+xRQ3pcgR79qiKsG4pLl25AI7IcXxVO8dH9GiBE5rAknC0ePntlw==" + }, + "node_modules/@types/js-yaml": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.5.tgz", + "integrity": "sha512-FhpRzf927MNQdRZP0J5DLIdTXhjLYzeUTmLAu69mnVksLH9CJY3IuSeEgbKUki7GQZm0WqDkGzyxju2EZGD2wA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", + "dev": true + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/minimist": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", + "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.17.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.17.15.tgz", + "integrity": "sha512-2yrWpBk32tvV/JAd3HNHWuZn/VDN1P+72hWirHnvsvTGSqbANi+kSeuQR9yAHnbvaBvHDsoTdXV0Fe+iRtHLKA==" + }, + "node_modules/@types/normalize-package-data": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", + "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "dev": true + }, + "node_modules/@types/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-ZTaqn/qSqUuAq1YwvOFQfVW1AR/oQJlLSZVustdjwI+GZ8kr0MSHBj0tsXPW1EqHubx50gtBEjbPGsdZwQwCjQ==", + "dev": true + }, + "node_modules/@types/request": { + "version": "2.48.8", + "resolved": "https://registry.npmjs.org/@types/request/-/request-2.48.8.tgz", + "integrity": "sha512-whjk1EDJPcAR2kYHRbFl/lKeeKYTi05A15K9bnLInCVroNDCtXce57xKdI0/rQaA3K+6q0eFyUBPmqfSndUZdQ==", + "dependencies": { + "@types/caseless": "*", + "@types/node": "*", + "@types/tough-cookie": "*", + "form-data": "^2.5.0" + } + }, + "node_modules/@types/request/node_modules/form-data": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.1.tgz", + "integrity": "sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@types/semver": { + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg==", + "dev": true + }, + "node_modules/@types/tough-cookie": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", + "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==" + }, + "node_modules/@types/uuid": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.3.tgz", + "integrity": "sha512-taHQQH/3ZyI3zP8M/puluDEIEvtQHVYcC6y3N8ijFtAd28+Ey/G4sg1u2gB01S8MwybLOKAp9/yCMu/uR5l3Ug==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.17", + "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.17.tgz", + "integrity": "sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==" + }, + "node_modules/@types/ws": { + "version": "8.5.5", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz", + "integrity": "sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.6.0.tgz", + "integrity": "sha512-CW9YDGTQnNYMIo5lMeuiIG08p4E0cXrXTbcZ2saT/ETE7dWUrNxlijsQeU04qAAKkILiLzdQz+cGFxCJjaZUmA==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/type-utils": "6.6.0", + "@typescript-eslint/utils": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.6.0.tgz", + "integrity": "sha512-setq5aJgUwtzGrhW177/i+DMLqBaJbdwGj2CPIVFFLE0NCliy5ujIdLHd2D1ysmlmsjdL2GWW+hR85neEfc12w==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.6.0.tgz", + "integrity": "sha512-pT08u5W/GT4KjPUmEtc2kSYvrH8x89cVzkA0Sy2aaOUIw6YxOIjA8ilwLr/1fLjOedX1QAuBpG9XggWqIIfERw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.6.0.tgz", + "integrity": "sha512-8m16fwAcEnQc69IpeDyokNO+D5spo0w1jepWWY2Q6y5ZKNuj5EhVQXjtVAeDDqvW6Yg7dhclbsz6rTtOvcwpHg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "6.6.0", + "@typescript-eslint/utils": "6.6.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.6.0.tgz", + "integrity": "sha512-CB6QpJQ6BAHlJXdwUmiaXDBmTqIE2bzGTDLADgvqtHWuhfNP3rAOK7kAgRMAET5rDRr9Utt+qAzRBdu3AhR3sg==", + "dev": true, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.6.0.tgz", + "integrity": "sha512-hMcTQ6Al8MP2E6JKBAaSxSVw5bDhdmbCEhGW/V8QXkb9oNsFkA4SBuOMYVPxD3jbtQ4R/vSODBsr76R6fP3tbA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/visitor-keys": "6.6.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.6.0.tgz", + "integrity": "sha512-mPHFoNa2bPIWWglWYdR0QfY9GN0CfvvXX1Sv6DlSTive3jlMTUy+an67//Gysc+0Me9pjitrq0LJp0nGtLgftw==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.6.0", + "@typescript-eslint/types": "6.6.0", + "@typescript-eslint/typescript-estree": "6.6.0", + "semver": "^7.5.4" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "6.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.6.0.tgz", + "integrity": "sha512-L61uJT26cMOfFQ+lMZKoJNbAEckLe539VhTxiGHrWl5XSKQgA0RTBZJW2HFPy5T0ZvPVSD93QsrTKDkfNwJGyQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "6.6.0", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^16.0.0 || >=18.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-4.3.4.tgz", + "integrity": "sha512-ciXNIHKPriERBisHFBvnTbfKa6r9SAesOYXeGDzgegcvy9Q4xdScSHAmKbNT0M3O0S9LKhIf5/G+UYG4NnnzYw==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.10.1.tgz", + "integrity": "sha512-JnsM1mIPdfGPxmoOcK1c7HYAsL6YOv0TCJ4aW3AXPZN/Jb4R77epDyMZIVudSGjWMbvv/JfUa+rQ+dGKTmgwBA==", + "dev": true, + "dependencies": { + "@volar/source-map": "1.10.1" + } + }, + "node_modules/@volar/source-map": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.10.1.tgz", + "integrity": "sha512-3/S6KQbqa7pGC8CxPrg69qHLpOvkiPHGJtWPkI/1AXCsktkJ6gIk/5z4hyuMp8Anvs6eS/Kvp/GZa3ut3votKA==", + "dev": true, + "dependencies": { + "muggle-string": "^0.3.1" + } + }, + "node_modules/@volar/typescript": { + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.10.1.tgz", + "integrity": "sha512-+iiO9yUSRHIYjlteT+QcdRq8b44qH19/eiUZtjNtuh6D9ailYM7DVR0zO2sEgJlvCaunw/CF9Ov2KooQBpR4VQ==", + "dev": true, + "dependencies": { + "@volar/language-core": "1.10.1" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.3.4.tgz", + "integrity": "sha512-cquyDNvZ6jTbf/+x+AgM2Arrp6G4Dzbb0R64jiG804HRMfRiFXWI6kqUVqZ6ZR0bQhIoQjB4+2bhNtVwndW15g==", + "dependencies": { + "@babel/parser": "^7.21.3", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.3.4.tgz", + "integrity": "sha512-wyM+OjOVpuUukIq6p5+nwHYtj9cFroz9cwkfmP9O1nzH68BenTTv0u7/ndggT8cIQlnBeOo6sUT/gvHcIkLA5w==", + "dependencies": { + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.3.4.tgz", + "integrity": "sha512-6y/d8uw+5TkCuzBkgLS0v3lSM3hJDntFEiUORM11pQ/hKvkhSKZrXW6i69UyXlJQisJxuUEJKAWEqWbWsLeNKQ==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-ssr": "3.3.4", + "@vue/reactivity-transform": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0", + "postcss": "^8.1.10", + "source-map-js": "^1.0.2" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.3.4.tgz", + "integrity": "sha512-m0v6oKpup2nMSehwA6Uuu+j+wEwcy7QmwMkVNVfrV9P2qE5KshC6RwOCq8fjGS/Eak/uNb8AaWekfiXxbBB6gQ==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz", + "integrity": "sha512-o9KfBeaBmCKl10usN4crU53fYtC1r7jJwdGKjPT24t348rHxgfpZ0xL3Xm/gLUYnc0oTp8LAmrxOeLyu6tbk2Q==" + }, + "node_modules/@vue/language-core": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.10.tgz", + "integrity": "sha512-db8PtM4ZZr7SYNH30XpKxUYnUBYaTvcuJ4c2whKK04fuAjbtjAIZ2al5GzGEfUlesmvkpgdbiSviRXUxgD9Omw==", + "dev": true, + "dependencies": { + "@volar/language-core": "~1.10.0", + "@volar/source-map": "~1.10.0", + "@vue/compiler-dom": "^3.3.0", + "@vue/reactivity": "^3.3.0", + "@vue/shared": "^3.3.0", + "minimatch": "^9.0.0", + "muggle-string": "^0.3.1", + "vue-template-compiler": "^2.7.14" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/language-core/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@vue/language-core/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.3.4.tgz", + "integrity": "sha512-kLTDLwd0B1jG08NBF3R5rqULtv/f8x3rOFByTDz4J53ttIQEDmALqKqXY0J+XQeN0aV2FBxY8nJDf88yvOPAqQ==", + "dependencies": { + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.3.4.tgz", + "integrity": "sha512-MXgwjako4nu5WFLAjpBnCj/ieqcjE2aJBINUNQzkZQfzIZA4xn+0fV1tIYBJvvva3N3OvKGofRLvQIwEQPpaXw==", + "dependencies": { + "@babel/parser": "^7.20.15", + "@vue/compiler-core": "3.3.4", + "@vue/shared": "3.3.4", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.0" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.3.4.tgz", + "integrity": "sha512-R+bqxMN6pWO7zGI4OMlmvePOdP2c93GsHFM/siJI7O2nxFRzj55pLwkpCedEY+bTMgp5miZ8CxfIZo3S+gFqvA==", + "dependencies": { + "@vue/reactivity": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.3.4.tgz", + "integrity": "sha512-Aj5bTJ3u5sFsUckRghsNjVTtxZQ1OyMWCr5dZRAPijF/0Vy4xEoRCwLyHXcj4D0UFbJ4lbx3gPTgg06K/GnPnQ==", + "dependencies": { + "@vue/runtime-core": "3.3.4", + "@vue/shared": "3.3.4", + "csstype": "^3.1.1" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.3.4.tgz", + "integrity": "sha512-Q6jDDzR23ViIb67v+vM1Dqntu+HUexQcsWKhhQa4ARVzxOY2HbC7QRW/ggkDBd5BU+uM1sV6XOAP0b216o34JQ==", + "dependencies": { + "@vue/compiler-ssr": "3.3.4", + "@vue/shared": "3.3.4" + }, + "peerDependencies": { + "vue": "3.3.4" + } + }, + "node_modules/@vue/shared": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz", + "integrity": "sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==" + }, + "node_modules/@vue/typescript": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.10.tgz", + "integrity": "sha512-vPSpTXMk4chYwvyTGjM891cKgnx2r6vtbdANOp2mRU31f4HYGyLrZBlGgiua7SaO2cLjUg8y91OipJe0t8OFhA==", + "dev": true, + "dependencies": { + "@volar/typescript": "~1.10.0", + "@vue/language-core": "1.8.10" + } + }, + "node_modules/@vueuse/core": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-10.4.1.tgz", + "integrity": "sha512-DkHIfMIoSIBjMgRRvdIvxsyboRZQmImofLyOHADqiVbQVilP8VVHDhBX2ZqoItOgu7dWa8oXiNnScOdPLhdEXg==", + "dependencies": { + "@types/web-bluetooth": "^0.0.17", + "@vueuse/metadata": "10.4.1", + "@vueuse/shared": "10.4.1", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-10.4.1.tgz", + "integrity": "sha512-2Sc8X+iVzeuMGHr6O2j4gv/zxvQGGOYETYXEc41h0iZXIRnRbJZGmY/QP8dvzqUelf8vg0p/yEA5VpCEu+WpZg==", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared": { + "version": "10.4.1", + "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-10.4.1.tgz", + "integrity": "sha512-vz5hbAM4qA0lDKmcr2y3pPdU+2EVw/yzfRsBdu+6+USGa4PxqSQRYIUC9/NcT06y+ZgaTsyURw2I9qOFaaXHAg==", + "dependencies": { + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-escapes/node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anti-trojan-source": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/anti-trojan-source/-/anti-trojan-source-1.4.1.tgz", + "integrity": "sha512-DruSp30RgiEW36/n5+e2RtJf2W57jBS01YHvH8SL1vSFIpIeArfreTCxelHPMEhGLpk/BZUeA3uWt5AeTCHq9g==", + "dev": true, + "dependencies": { + "globby": "^12.0.2", + "meow": "^10.1.1" + }, + "bin": { + "anti-trojan-source": "bin/anti-trojan-source.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/anti-trojan-source/node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/camelcase-keys": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-7.0.2.tgz", + "integrity": "sha512-Rjs1H+A9R+Ig+4E/9oyB66UC5Mj9Xq3N//vcLf2WzgdTi/3gUu3Z9KoqmlrEG4VuuLK8wJHofxzdQXz/knhiYg==", + "dev": true, + "dependencies": { + "camelcase": "^6.3.0", + "map-obj": "^4.1.0", + "quick-lru": "^5.1.1", + "type-fest": "^1.2.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/decamelize": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-5.0.1.tgz", + "integrity": "sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/meow": { + "version": "10.1.5", + "resolved": "https://registry.npmjs.org/meow/-/meow-10.1.5.tgz", + "integrity": "sha512-/d+PQ4GKmGvM9Bee/DPa8z3mXs/pkvJE2KEThngVNOqtmljC6K7NMPxtc2JeZYTmpWb9k/TmxjeL18ez3h7vCw==", + "dev": true, + "dependencies": { + "@types/minimist": "^1.2.2", + "camelcase-keys": "^7.0.0", + "decamelize": "^5.0.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.2", + "read-pkg-up": "^8.0.0", + "redent": "^4.0.0", + "trim-newlines": "^4.0.2", + "type-fest": "^1.2.2", + "yargs-parser": "^20.2.9" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/read-pkg": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-6.0.0.tgz", + "integrity": "sha512-X1Fu3dPuk/8ZLsMhEj5f4wFAF0DWoK7qhGJvgaijocXxBmSToKfbFtqbxMO7bVjNA1dmE5huAzjXj/ey86iw9Q==", + "dev": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^3.0.2", + "parse-json": "^5.2.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/read-pkg-up": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-8.0.0.tgz", + "integrity": "sha512-snVCqPczksT0HS2EC+SxUndvSzn6LRCwpfSvLrIfR5BKDQQZMaI6jPRC9dYvYFDRAuFEAnkwww8kBBNE/3VvzQ==", + "dev": true, + "dependencies": { + "find-up": "^5.0.0", + "read-pkg": "^6.0.0", + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/redent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-4.0.0.tgz", + "integrity": "sha512-tYkDkVVtYkSVhuQ4zBgfvciymHaeuel+zFKXShfDnFP5SyVEP7qo70Rf1jTOTCx3vGNAbnEi/xFkcfQVMIBWag==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "strip-indent": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/strip-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-4.0.0.tgz", + "integrity": "sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/trim-newlines": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.1.1.tgz", + "integrity": "sha512-jRKj0n0jXWo6kh62nA5TEh3+4igKDXLvzBJcPpiizP7oOolUrYIxmVBG9TOtHYFHoddUk6YvAkGeGoSVTXfQXQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/anti-trojan-source/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==", + "dev": true + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==", + "dev": true + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "engines": { + "node": ">=0.8" + } + }, + "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/autoprefixer": { + "version": "10.4.15", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz", + "integrity": "sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.21.10", + "caniuse-lite": "^1.0.30001520", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" + }, + "node_modules/axios": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", + "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios-retry": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/axios-retry/-/axios-retry-3.7.0.tgz", + "integrity": "sha512-ZTnCkJbRtfScvwiRnoVskFAfvU0UG3xNcsjwTR0mawSbIJoothxn67gKsMaNAFHRXJ1RmuLhmZBzvyXi3+9WyQ==", + "dependencies": { + "@babel/runtime": "^7.15.4", + "is-retry-allowed": "^2.2.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dependencies": { + "tweetnacl": "^0.14.3" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.21.10", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz", + "integrity": "sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001517", + "electron-to-chromium": "^1.4.477", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.11" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "peer": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/byline": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", + "integrity": "sha512-s6webAy+R4SR8XVuJWt2V2rGvhnrhxN+9S15GNuTK3wKPOXFF6RNc+8ug2XhH+2s4f+uudG4kUVYmYOQWL2g0Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/camelcase-keys": { + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", + "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "camelcase": "^5.3.1", + "map-obj": "^4.0.0", + "quick-lru": "^4.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001532", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001532.tgz", + "integrity": "sha512-FbDFnNat3nMnrROzqrsg314zhqN5LGQ1kyyMk2opcrwGbVGpHRhgCWtAgD5YJUqNAiQ+dklreil/c3Qf1dfCTw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + ], + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/codejar": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/codejar/-/codejar-4.2.0.tgz", + "integrity": "sha512-U8OZe+2B400W5nSSbXxaoboBN5i1hxWdBZJ9kcTy0DBuc4muwkPE/ph/MGX4yooIE8hztfNLPNU1CbcNYch69A==" + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/colord": { + "version": "2.9.3", + "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz", + "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", + "dev": true + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==" + }, + "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==", + "dev": true, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-selector-tokenizer": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.8.0.tgz", + "integrity": "sha512-Jd6Ig3/pe62/qe5SBPTN8h8LeUg/pT4lLgtavPf7updwwHpvFzxvOQBHYj2LZDMjUnBzgvIUSjRcf6oT5HzHFg==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" + }, + "node_modules/cytoscape": { + "version": "3.26.0", + "resolved": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.26.0.tgz", + "integrity": "sha512-IV+crL+KBcrCnVVUCZW+zRRRFUZQcrtdOPXki+o4CFUWLdAEYvuZLcBSJC9EBK++suamERKzeY7roq2hdovV3w==", + "dependencies": { + "heap": "^0.2.6", + "lodash": "^4.17.21" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/cytoscape-dagre": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cytoscape-dagre/-/cytoscape-dagre-2.5.0.tgz", + "integrity": "sha512-VG2Knemmshop4kh5fpLO27rYcyUaaDkRw+6PiX4bstpB+QFt0p2oauMrsjVbUamGWQ6YNavh7x2em2uZlzV44g==", + "dependencies": { + "dagre": "^0.8.5" + }, + "peerDependencies": { + "cytoscape": "^3.2.22" + } + }, + "node_modules/cytoscape-node-html-label": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/cytoscape-node-html-label/-/cytoscape-node-html-label-1.2.2.tgz", + "integrity": "sha512-oUVwrlsIlaJJ8QrQFSMdv3uXVXPg6tMH/Tfofr8JuZIovqI4fPqBi6sQgCMcVpS6k9Td0TTjowBsNRw32CESWg==", + "peerDependencies": { + "@types/cytoscape": "^3.1.0", + "cytoscape": "^3.0.0" + }, + "peerDependenciesMeta": { + "@types/cytoscape": { + "optional": true + } + } + }, + "node_modules/dagre": { + "version": "0.8.5", + "resolved": "https://registry.npmjs.org/dagre/-/dagre-0.8.5.tgz", + "integrity": "sha512-/aTqmnRta7x7MCCpExk7HQL2O4owCT2h8NT//9I1OQ9vt29Pa0BzSAkR5lwFUcQ7491yVi/3CXU9jQ5o0Mn2Sw==", + "dependencies": { + "graphlib": "^2.1.8", + "lodash": "^4.17.15" + } + }, + "node_modules/daisyui": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/daisyui/-/daisyui-3.7.3.tgz", + "integrity": "sha512-gKlz3RwfaukZxf8nQZsDAZ7quUSi7F8HjGGB34tkHruvfQB9cgVDQsmqUqSQtkAJYvzbrg/3dLUa9+5jF4iC1A==", + "dev": true, + "dependencies": { + "colord": "^2.9", + "css-selector-tokenizer": "^0.8", + "postcss": "^8", + "postcss-js": "^4", + "tailwindcss": "^3" + }, + "engines": { + "node": ">=16.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/daisyui" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decamelize-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", + "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", + "dev": true, + "dependencies": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decamelize-keys/node_modules/map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==", + "dev": true + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "node_modules/electron-to-chromium": { + "version": "1.4.513", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.513.tgz", + "integrity": "sha512-cOB0xcInjm+E5qIssHeXJ29BaUyWpMyFKT5RB3bsLENDheCja0wMkHJyiPl0NBE/VzDI7JDuNEQWhe6RitEUcw==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.22.1", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz", + "integrity": "sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.1", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.1", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.0", + "safe-array-concat": "^1.0.0", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.49.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.49.0.tgz", + "integrity": "sha512-jw03ENfm6VJI0jA9U+8H5zfl5b+FvuU3YYvZRdZHOlU2ggJkxrlkJH4HcDrZpj6YwD8kuYqvQM8LyesoazrSOQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.49.0", + "@humanwhocodes/config-array": "^0.11.11", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-anti-trojan-source": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-anti-trojan-source/-/eslint-plugin-anti-trojan-source-1.1.1.tgz", + "integrity": "sha512-gWDuG2adNNccwRM+2/Q3UHqV1DgrAUSpSi/Tdnx2Ybr0ndWMSBn7lt4AbxdPuFSEs2OAokX/vdIHbBbTLzWspw==", + "dev": true, + "dependencies": { + "anti-trojan-source": "^1.3.1" + } + }, + "node_modules/eslint-plugin-es-x": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es-x/-/eslint-plugin-es-x-7.2.0.tgz", + "integrity": "sha512-9dvv5CcvNjSJPqnS5uZkqb3xmbeqRLnvXKK7iI5+oK/yTusyc46zbBZKENGsOfojm/mKfszyZb+wNqNPAPeGXA==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.1.2", + "@eslint-community/regexpp": "^4.6.0" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": ">=8" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.8.0", + "has": "^1.0.3", + "is-core-module": "^2.13.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", + "object.values": "^1.1.6", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-import/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/eslint-plugin-n": { + "version": "16.0.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-16.0.2.tgz", + "integrity": "sha512-Y66uDfUNbBzypsr0kELWrIz+5skicECrLUqlWuXawNSLUq3ltGlCwu6phboYYOTSnoTdHgTLrc+5Ydo6KjzZog==", + "dev": true, + "peer": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "builtins": "^5.0.1", + "eslint-plugin-es-x": "^7.1.0", + "ignore": "^5.2.4", + "is-core-module": "^2.12.1", + "minimatch": "^3.1.2", + "resolve": "^1.22.2", + "semver": "^7.5.3" + }, + "engines": { + "node": ">=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "peer": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-security-node": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-security-node/-/eslint-plugin-security-node-1.1.1.tgz", + "integrity": "sha512-PXl5uKQOglpIpU13YIwWhhXK9Sw14KHbzCdVthDWoIsUPOuMYbrGOCWJSEVVuZ1uJK2ciN+45ogPeErrKtNm0Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.17.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.17.0.tgz", + "integrity": "sha512-r7Bp79pxQk9I5XDP0k2dpUC7Ots3OSWgvGZNu3BxmKK6Zg7NgVtcOB6OCna5Kb9oQwJPl5hq183WD0SY5tZtIQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.1.1", + "postcss-selector-parser": "^6.0.13", + "semver": "^7.5.4", + "vue-eslint-parser": "^9.3.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "engines": [ + "node >=0.6.0" + ] + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", + "dev": true, + "dependencies": { + "flatted": "^3.2.7", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "engines": { + "node": "*" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz", + "integrity": "sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs-extra": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-minipass/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/function.prototype.name": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dependencies": { + "assert-plus": "^1.0.0" + } + }, + "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": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/globals": { + "version": "13.21.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz", + "integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/graphlib": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/graphlib/-/graphlib-2.1.8.tgz", + "integrity": "sha512-jcLLfkpoVGmH7/InMC/1hIvOPSUh38oJtGhvrOFGzioE1DZ+0YW16RgmOJhHiuWTvGiJQ9Z1Ik43JvkRPRvE+A==", + "dependencies": { + "lodash": "^4.17.15" + } + }, + "node_modules/har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==", + "engines": { + "node": ">=4" + } + }, + "node_modules/har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "deprecated": "this library is no longer supported", + "dependencies": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/hard-rejection": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", + "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "bin": { + "he": "bin/he" + } + }, + "node_modules/heap": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/heap/-/heap-0.2.7.tgz", + "integrity": "sha512-2bsegYkkHO+h/9MGbn6KWcE45cHZgPANo5LXF7EvWdT0yT2EguSVO1nDgU5c8+ZOPwp2vMNa7YFsJhVcDR9Sdg==" + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==", + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + }, + "engines": { + "node": ">=0.8", + "npm": ">=1.3.7" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "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/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "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==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-retry-allowed": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-2.2.0.tgz", + "integrity": "sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", + "dependencies": { + "which-typed-array": "^1.1.11" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==" + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/isomorphic-ws": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/isomorphic-ws/-/isomorphic-ws-5.0.0.tgz", + "integrity": "sha512-muId7Zzn9ywDsyXgTIafTry2sV3nySZeUDe6YedVd1Hvuuep5AsIlqK+XefWpYTyJG5e503F2xIuT2lcU6rCSw==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jiti": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.20.0.tgz", + "integrity": "sha512-3TV69ZbrvV6U5DfQimop50jE9Dl6J8O1ja1dvBbMba/sZ3YBEQqJ2VZRoQPVnhlzjNtU1vaXRZVrVjU4qtm8yA==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/jose": { + "version": "4.14.6", + "resolved": "https://registry.npmjs.org/jose/-/jose-4.14.6.tgz", + "integrity": "sha512-EqJPEUlZD0/CSUMubKtMaYUOtWe91tZXTWMJZoKSbLk+KtdhNdcvppH8lA9XwVu2V4Ailvsj0GBZJ2ZwDjfesQ==", + "optional": true, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==" + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==" + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" + }, + "node_modules/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonpath-plus": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/jsonpath-plus/-/jsonpath-plus-7.2.0.tgz", + "integrity": "sha512-zBfiUPM5nD0YZSBT/o/fbCUlCcepMIdP0CJZxM1+KgA4f2T206f6VAg9e7mX35+KlMaIc5qXW34f3BnwJ3w+RA==", + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/jsprim": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz", + "integrity": "sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==", + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/keyv": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz", + "integrity": "sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", + "dev": true + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.pick": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.pick/-/lodash.pick-4.4.0.tgz", + "integrity": "sha512-hXt6Ul/5yWjfklSGvLQl8vM//l3FtyHZeuelpzK6mm99pNvN9yTDruNZPEJZD1oWrqo+izBmB7oUfWgcCX7s4Q==", + "dev": true + }, + "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==", + "devOptional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/map-obj": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", + "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", + "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/minimist": "^1.2.0", + "camelcase-keys": "^6.2.2", + "decamelize": "^1.2.0", + "decamelize-keys": "^1.1.0", + "hard-rejection": "^2.1.0", + "minimist-options": "4.1.0", + "normalize-package-data": "^3.0.0", + "read-pkg-up": "^7.0.1", + "redent": "^3.0.0", + "trim-newlines": "^3.0.0", + "type-fest": "^0.18.0", + "yargs-parser": "^20.2.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/meow/node_modules/type-fest": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minimist-options": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", + "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", + "dev": true, + "dependencies": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0", + "kind-of": "^6.0.3" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/minipass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minizlib/node_modules/minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/muggle-string": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.3.1.tgz", + "integrity": "sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "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==", + "dev": true + }, + "node_modules/normalize-package-data": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", + "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "is-core-module": "^2.5.0", + "semver": "^7.3.4", + "validate-npm-package-license": "^3.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", + "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", + "dev": true, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==", + "engines": { + "node": "*" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, + "node_modules/object.values": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/oidc-token-hash": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/oidc-token-hash/-/oidc-token-hash-5.0.3.tgz", + "integrity": "sha512-IF4PcGgzAr6XXSff26Sk/+P4KZFJVuHAJZj3wgO3vX2bMdNVp/QXTP3P7CEm9V1IdG8lDLY3HhiqpsE/nOwpPw==", + "optional": true, + "engines": { + "node": "^10.13.0 || >=12.0.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/openid-client": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/openid-client/-/openid-client-5.5.0.tgz", + "integrity": "sha512-Y7Xl8BgsrkzWLHkVDYuroM67hi96xITyEDSkmWaGUiNX6CkcXC3XyQGdv5aWZ6dukVKBFVQCADi9gCavOmU14w==", + "optional": true, + "dependencies": { + "jose": "^4.14.4", + "lru-cache": "^6.0.0", + "object-hash": "^2.2.0", + "oidc-token-hash": "^5.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/panva" + } + }, + "node_modules/openid-client/node_modules/object-hash": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", + "integrity": "sha512-gScRMn0bS5fH+IuwyIFgnh9zBdo4DV+6GhygmWM9HyNJSgS0hScp1f5vjtm7oIIOiT9trXrShAkLFSc2IqKNgw==", + "optional": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-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==", + "dev": true, + "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==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinia": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.1.6.tgz", + "integrity": "sha512-bIU6QuE5qZviMmct5XwCesXelb5VavdOWKWaB17ggk++NUwQWWbP5YnsONTk3b752QkW9sACiR81rorpeOMSvQ==", + "dependencies": { + "@vue/devtools-api": "^6.5.0", + "vue-demi": ">=0.14.5" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.3.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dev": true, + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^2.1.1" + }, + "engines": { + "node": ">= 14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-scrollbar": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/postcss-scrollbar/-/postcss-scrollbar-0.5.1.tgz", + "integrity": "sha512-OPvwloab5juU3z5MOCRrYHRGAnDei8ObDIDBWpRfMt0zHptceOWWJUaaG+rodUJ4ItI+6fdaGs8uw77lCWqdbQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.0.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==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==" + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/quick-lru": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", + "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-pkg": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", + "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "@types/normalize-package-data": "^2.4.0", + "normalize-package-data": "^2.5.0", + "parse-json": "^5.0.0", + "type-fest": "^0.6.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", + "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "find-up": "^4.1.0", + "read-pkg": "^5.2.0", + "type-fest": "^0.8.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/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==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/read-pkg-up/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==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg/node_modules/hosted-git-info": { + "version": "2.8.9", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", + "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", + "dev": true, + "optional": true, + "peer": true + }, + "node_modules/read-pkg/node_modules/normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "node_modules/read-pkg/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "optional": true, + "peer": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/read-pkg/node_modules/type-fest": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", + "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/redent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", + "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "indent-string": "^4.0.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", + "dependencies": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/request/node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/resolve": { + "version": "1.22.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz", + "integrity": "sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg==", + "dev": true, + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfc4648": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/rfc4648/-/rfc4648-1.5.2.tgz", + "integrity": "sha512-tLOizhR6YGovrEBLatX1sdcuhoSCXddw3mqNVAcKxGJ+J0hFeJ+SjeWCv5UPA/WU3YzWPPuCVYgXBKZUPGpKtg==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.0.tgz", + "integrity": "sha512-nszM8DINnx1vSS+TpbWKMkxem0CDWk3cSit/WWCBVs9/JZ1I/XLwOsiUglYuYReaeWWSsW9kge5zE5NZtf/a4w==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/safe-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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/spdx-correct": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", + "dev": true, + "dependencies": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", + "dev": true + }, + "node_modules/spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "dev": true, + "dependencies": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "node_modules/spdx-license-ids": { + "version": "3.0.13", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", + "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "dev": true + }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dependencies": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stream-buffers": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-3.0.2.tgz", + "integrity": "sha512-DQi1h8VEBA/lURbSwFtEHnSTb9s2/pwLEaFuNhXwy1Dx3Sa0lOuYT2yNUr4/j2fs8oCAMANtrZ5OrPZtyVs3MQ==", + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "optional": true, + "peer": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.34.0.tgz", + "integrity": "sha512-70/LQEZ07TEcxiU2dz51FKaE6hCTWC6vr7FOk3Gr0U60C3shtAN+H+BFr9XlYe5xqf3RA8nrc+VIwzCfnxuXJw==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "7.1.6", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tailwindcss": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.3.tgz", + "integrity": "sha512-A0KgSkef7eE4Mf+nKJ83i75TMyq8HqY3qmFIJSWy8bNt0v1lG7jUcpGpoTFxAwYcWOphcTBLPPJg+bDfhDf52w==", + "dev": true, + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tar": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", + "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^5.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dev": true, + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dev": true, + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-invariant": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.1.tgz", + "integrity": "sha512-AD5ih2NlSssTCwsMznbvwMZpJ1cbhkGd2uueNxzv2jDlEeZdU04JQfRnggJQ8DrcVBGjAsCKwFBbDlVNtEMlzw==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/tmp-promise": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/tmp-promise/-/tmp-promise-3.0.3.tgz", + "integrity": "sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==", + "dependencies": { + "tmp": "^0.2.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/trim-newlines": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", + "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", + "dev": true, + "optional": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==", + "dev": true + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typescript": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/underscore": { + "version": "1.13.6", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.13.6.tgz", + "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==" + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util": { + "version": "0.12.5", + "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", + "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", + "dependencies": { + "inherits": "^2.0.3", + "is-arguments": "^1.0.4", + "is-generator-function": "^1.0.7", + "is-typed-array": "^1.1.3", + "which-typed-array": "^1.1.2" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true + }, + "node_modules/uuid": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", + "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "dev": true, + "dependencies": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/vite-plugin-checker/-/vite-plugin-checker-0.6.2.tgz", + "integrity": "sha512-YvvvQ+IjY09BX7Ab+1pjxkELQsBd4rPhWNw8WLBeFVxu/E7O+n6VYAqNsKdK/a2luFlX/sMpoWdGFfg4HvwdJQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "ansi-escapes": "^4.3.0", + "chalk": "^4.1.1", + "chokidar": "^3.5.1", + "commander": "^8.0.0", + "fast-glob": "^3.2.7", + "fs-extra": "^11.1.0", + "lodash.debounce": "^4.0.8", + "lodash.pick": "^4.4.0", + "npm-run-path": "^4.0.1", + "semver": "^7.5.0", + "strip-ansi": "^6.0.0", + "tiny-invariant": "^1.1.0", + "vscode-languageclient": "^7.0.0", + "vscode-languageserver": "^7.0.0", + "vscode-languageserver-textdocument": "^1.0.1", + "vscode-uri": "^3.0.2" + }, + "engines": { + "node": ">=14.16" + }, + "peerDependencies": { + "eslint": ">=7", + "meow": "^9.0.0", + "optionator": "^0.9.1", + "stylelint": ">=13", + "typescript": "*", + "vite": ">=2.0.0", + "vls": "*", + "vti": "*", + "vue-tsc": ">=1.3.9" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "meow": { + "optional": true + }, + "optionator": { + "optional": true + }, + "stylelint": { + "optional": true + }, + "typescript": { + "optional": true + }, + "vls": { + "optional": true + }, + "vti": { + "optional": true + }, + "vue-tsc": { + "optional": true + } + } + }, + "node_modules/vite-plugin-checker/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "dev": true, + "engines": { + "node": ">= 12" + } + }, + "node_modules/vscode-jsonrpc": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-6.0.0.tgz", + "integrity": "sha512-wnJA4BnEjOSyFMvjZdpiOwhSq9uDoK8e/kpRJDTaMYzwlkrhG1fwDIZI94CLsLzlCK5cIbMMtFlJlfR57Lavmg==", + "dev": true, + "engines": { + "node": ">=8.0.0 || >=10.0.0" + } + }, + "node_modules/vscode-languageclient": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-7.0.0.tgz", + "integrity": "sha512-P9AXdAPlsCgslpP9pRxYPqkNYV7Xq8300/aZDpO35j1fJm/ncize8iGswzYlcvFw5DQUx4eVk+KvfXdL0rehNg==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4", + "semver": "^7.3.4", + "vscode-languageserver-protocol": "3.16.0" + }, + "engines": { + "vscode": "^1.52.0" + } + }, + "node_modules/vscode-languageserver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-7.0.0.tgz", + "integrity": "sha512-60HTx5ID+fLRcgdHfmz0LDZAXYEV68fzwG0JWwEPBode9NuMYTIxuYXPg4ngO8i8+Ou0lM7y6GzaYWbiDL0drw==", + "dev": true, + "dependencies": { + "vscode-languageserver-protocol": "3.16.0" + }, + "bin": { + "installServerIntoExtension": "bin/installServerIntoExtension" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.16.0.tgz", + "integrity": "sha512-sdeUoAawceQdgIfTI+sdcwkiK2KU+2cbEYA0agzM2uqaUy2UpnnGHtWTHVEtS0ES4zHU0eMFRGN+oQgDxlD66A==", + "dev": true, + "dependencies": { + "vscode-jsonrpc": "6.0.0", + "vscode-languageserver-types": "3.16.0" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.8.tgz", + "integrity": "sha512-1bonkGqQs5/fxGT5UchTgjGVnfysL0O8v1AYMBjqTbWQTFn721zaPGDYFkOKtfDgFiSgXM3KwaG3FMGfW4Ed9Q==", + "dev": true + }, + "node_modules/vscode-languageserver-types": { + "version": "3.16.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz", + "integrity": "sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==", + "dev": true + }, + "node_modules/vscode-uri": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.0.7.tgz", + "integrity": "sha512-eOpPHogvorZRobNqJGhapa0JdwaxpjVvyBp0QIUMRMSf8ZAlqOdEquKuRmw9Qwu0qXtJIWqFtMkmvJjUZmMjVA==", + "dev": true + }, + "node_modules/vue": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.3.4.tgz", + "integrity": "sha512-VTyEYn3yvIeY1Py0WaYGZsXnz3y5UnGi62GjVEqvEGPl6nxbOrCXbVOTQWBEJUqAyTUk2uJ5JLVnYJ6ZzGbrSw==", + "dependencies": { + "@vue/compiler-dom": "3.3.4", + "@vue/compiler-sfc": "3.3.4", + "@vue/runtime-dom": "3.3.4", + "@vue/server-renderer": "3.3.4", + "@vue/shared": "3.3.4" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.3.1", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.1.tgz", + "integrity": "sha512-Clr85iD2XFZ3lJ52/ppmUDG/spxQu6+MAeHXjjyI4I1NUYZ9xmenQp4N0oaHJhrA8OOxltCVxMRfANGa70vU0g==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-template-compiler": { + "version": "2.7.14", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", + "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", + "dev": true, + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/vue-tsc": { + "version": "1.8.10", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.8.10.tgz", + "integrity": "sha512-ptpTFFDoHQgkWJF7i5iERxooiQzOGtG1uKTfmAUuS3qPuSQGq+Ky/S8BFHhnFGwoOxq/PjmGN2QSZEfg1rtzQA==", + "dev": true, + "dependencies": { + "@vue/language-core": "1.8.10", + "@vue/typescript": "1.8.10", + "semver": "^7.3.8" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": "*" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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/ws": { + "version": "8.14.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.1.tgz", + "integrity": "sha512-4OOseMUq8AzRBI/7SLMUwO+FEDnguetSk7KMb1sHwvF2w2Wv5Hoj0nlifx8vtGsftE/jWHojPy8sMMzYLJ2G/A==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yaml": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.3.2.tgz", + "integrity": "sha512-N/lyzTPaJasoDmfV7YTrYCI0G/3ivm/9wdG0aHuheKowWQwGTsK0Eoiw6utmzAnI6pkJa0DUVygvp3spqqEKXg==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/ui/package.json b/ui/package.json new file mode 100644 index 0000000..b853b91 --- /dev/null +++ b/ui/package.json @@ -0,0 +1,53 @@ +{ + "name": "ui", + "version": "0.0.0", + "scripts": { + "dev": "vite --host 127.0.0.1", + "build": "vite build --base=/ui", + "serve": "vite --host 127.0.0.1 preview", + "lint": "eslint .", + "lint-fix": "eslint --fix .", + "type-check": "tsc --noEmit; vue-tsc --noEmit" + }, + "dependencies": { + "@heroicons/vue": "^2.0.18", + "@kubernetes/client-node": "^0.18.1", + "@vueuse/core": "^10.3.0", + "axios": "^1.4.0", + "axios-retry": "^3.7.0", + "buffer": "^6.0.3", + "codejar": "^4.1.0", + "cytoscape": "^3.20.0", + "cytoscape-dagre": "^2.3.2", + "cytoscape-node-html-label": "^1.2.2", + "js-yaml": "^4.1.0", + "pinia": "^2.0.14", + "prismjs": "^1.29.0", + "util": "^0.12.5", + "uuid": "^9.0.0", + "vue": "^3.2.27" + }, + "devDependencies": { + "@types/prismjs": "^1.26.0", + "@types/uuid": "^9.0.2", + "@typescript-eslint/eslint-plugin": "^6.5.0", + "@typescript-eslint/parser": "^6.5.0", + "@vitejs/plugin-vue": "^4.2.3", + "autoprefixer": "^10.4.0", + "daisyui": "^3.5.0", + "eslint": "^8.48.0", + "eslint-config-standard": "^17.1.0", + "eslint-plugin-anti-trojan-source": "^1.1.1", + "eslint-plugin-import": "^2.28.0", + "eslint-plugin-security-node": "^1.1.1", + "eslint-plugin-vue": "^9.1.1", + "postcss": "^8.4.29", + "postcss-scrollbar": "^0.5.1", + "tailwindcss": "^3.0.6", + "typescript": "^5.2.2", + "vite": "^4.3.9", + "vite-plugin-checker": "^0.6.2", + "vue-eslint-parser": "^9.3.1", + "vue-tsc": "^1.8.10" + } +} diff --git a/ui/postcss.config.js b/ui/postcss.config.js new file mode 100644 index 0000000..f37e8a9 --- /dev/null +++ b/ui/postcss.config.js @@ -0,0 +1,10 @@ +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + 'postcss-scrollbar': { + edgeAutohide: true, + width: "5px", + }, + } +} \ No newline at end of file diff --git a/ui/public/favicon.ico b/ui/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..6b222a1ffae48359a26764110145029489ee163b GIT binary patch literal 30829 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 literal 0 HcmV?d00001 diff --git a/ui/public/fonts/Source_Code_Pro/OFL.txt b/ui/public/fonts/Source_Code_Pro/OFL.txt new file mode 100644 index 0000000..6f4c937 --- /dev/null +++ b/ui/public/fonts/Source_Code_Pro/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2010, 2012 Adobe Systems Incorporated (http://www.adobe.com/), with Reserved Font Name 'Source'. All Rights Reserved. Source is a trademark of Adobe Systems Incorporated in the United States and/or other countries. + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/ui/public/fonts/Source_Code_Pro/README.txt b/ui/public/fonts/Source_Code_Pro/README.txt new file mode 100644 index 0000000..2e57b72 --- /dev/null +++ b/ui/public/fonts/Source_Code_Pro/README.txt @@ -0,0 +1,79 @@ +Source Code Pro Variable Font +============================= + +This download contains Source Code Pro as both variable fonts and static fonts. + +Source Code Pro is a variable font with this axis: + wght + +This means all the styles are contained in these files: + SourceCodePro-VariableFont_wght.ttf + SourceCodePro-Italic-VariableFont_wght.ttf + +If your app fully supports variable fonts, you can now pick intermediate styles +that aren’t available as static fonts. Not all apps support variable fonts, and +in those cases you can use the static font files for Source Code Pro: + static/SourceCodePro-ExtraLight.ttf + static/SourceCodePro-Light.ttf + static/SourceCodePro-Regular.ttf + static/SourceCodePro-Medium.ttf + static/SourceCodePro-SemiBold.ttf + static/SourceCodePro-Bold.ttf + static/SourceCodePro-ExtraBold.ttf + static/SourceCodePro-Black.ttf + static/SourceCodePro-ExtraLightItalic.ttf + static/SourceCodePro-LightItalic.ttf + static/SourceCodePro-Italic.ttf + static/SourceCodePro-MediumItalic.ttf + static/SourceCodePro-SemiBoldItalic.ttf + static/SourceCodePro-BoldItalic.ttf + static/SourceCodePro-ExtraBoldItalic.ttf + static/SourceCodePro-BlackItalic.ttf + +Get started +----------- + +1. Install the font files you want to use + +2. Use your app's font picker to view the font family and all the +available styles + +Learn more about variable fonts +------------------------------- + + https://developers.google.com/web/fundamentals/design-and-ux/typography/variable-fonts + https://variablefonts.typenetwork.com + https://medium.com/variable-fonts + +In desktop apps + + https://theblog.adobe.com/can-variable-fonts-illustrator-cc + https://helpx.adobe.com/nz/photoshop/using/fonts.html#variable_fonts + +Online + + https://developers.google.com/fonts/docs/getting_started + https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Fonts/Variable_Fonts_Guide + https://developer.microsoft.com/en-us/microsoft-edge/testdrive/demos/variable-fonts + +Installing fonts + + MacOS: https://support.apple.com/en-us/HT201749 + Linux: https://www.google.com/search?q=how+to+install+a+font+on+gnu%2Blinux + Windows: https://support.microsoft.com/en-us/help/314960/how-to-install-or-remove-a-font-in-windows + +Android Apps + + https://developers.google.com/fonts/docs/android + https://developer.android.com/guide/topics/ui/look-and-feel/downloadable-fonts + +License +------- +Please read the full license text (OFL.txt) to understand the permissions, +restrictions and requirements for usage, redistribution, and modification. + +You can use them in your products & projects – print or digital, +commercial or otherwise. + +This isn't legal advice, please consider consulting a lawyer and see the full +license for all details. diff --git a/ui/public/fonts/Source_Code_Pro/SourceCodePro-Italic-VariableFont_wght.ttf b/ui/public/fonts/Source_Code_Pro/SourceCodePro-Italic-VariableFont_wght.ttf new file mode 100644 index 0000000000000000000000000000000000000000..25febab8e81b9582416758292998ff7efd3379e0 GIT binary patch literal 162676 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ʠ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

Dx@_=vZ@~VyTALpc-8>T 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