diff --git a/.github/workflows/FrontCi.yml b/.github/workflows/FrontCi.yml new file mode 100644 index 0000000..5c91c10 --- /dev/null +++ b/.github/workflows/FrontCi.yml @@ -0,0 +1,31 @@ +name: ForntCI Pipeline + +on: + push: + branches: + - main # Es pora que se ejecute en main + pull_request: + branches: + - '**' # Es pora que se ejecute en todas las ramas + +jobs: + lint: + name: Linter de Código + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setear Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Instalar dependencias + run: npm install + working-directory: ./FrontAdmin + + - name: Correr linter de codigo + run: npm run lint + working-directory: ./FrontAdmin + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6d1d446 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ + +# Python Envirioment +.venv +/venv +.env +env +/env + + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + + +# carpeta obsidian +.obsidian/ + +# API Docs +#schema.yml +logs/ + +# sql files +*.sql diff --git a/CurrentDefault.code-profile b/CurrentDefault.code-profile new file mode 100644 index 0000000..dbc35c6 --- /dev/null +++ b/CurrentDefault.code-profile @@ -0,0 +1 @@ +{"name":"CurrentDefault","settings":"{\"settings\":\"{\\n // json settings\\n \\\"[json]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"vscode.json-language-features\\\",\\n \\\"editor.formatOnSave\\\": true\\n },\\n // python settings\\n \\\"python.languageServer\\\": \\\"Pylance\\\",\\n \\\"[python]\\\": {\\n \\\"editor.formatOnType\\\": true,\\n \\\"editor.formatOnSave\\\": true,\\n \\\"editor.comments.insertSpace\\\": true,\\n \\\"editor.defaultFormatter\\\": \\\"ms-python.black-formatter\\\",\\n \\\"editor.codeActionsOnSave\\\": {\\n \\\"source.organizeImports\\\": \\\"always\\\",\\n \\\"source.fixAll\\\": \\\"explicit\\\",\\n \\\"source.fixAll.eslint\\\": \\\"explicit\\\",\\n \\\"source.fixAll.stylelint\\\": \\\"explicit\\\"\\n },\\n \\\"editor.suggestSelection\\\": \\\"first\\\",\\n \\\"editor.suggest.insertMode\\\": \\\"insert\\\",\\n \\\"editor.suggest.showKeywords\\\": true,\\n \\\"editor.bracketPairColorization.enabled\\\": true,\\n \\\"editor.parameterHints.enabled\\\": true,\\n \\\"editor.quickSuggestions\\\": {\\n \\\"other\\\": true,\\n \\\"comments\\\": true,\\n \\\"strings\\\": true\\n }\\n },\\n // python docstring settings\\n \\\"autoDocstring.docstringFormat\\\": \\\"google\\\",\\n \\\"autoDocstring.generateDocstringOnEnter\\\": true,\\n \\\"autoDocstring.startOnNewLine\\\": true,\\n \\\"autoDocstring.guessTypes\\\": true,\\n \\\"autoDocstring.includeName\\\": true,\\n \\\"autoDocstring.quoteStyle\\\": \\\"'''\\\",\\n \\\"python.testing.unittestEnabled\\\": true,\\n \\\"python.testing.promptToConfigure\\\": true,\\n \\\"python.testing.pytestEnabled\\\": true,\\n \\\"python.testing.autoTestDiscoverOnSaveEnabled\\\": true,\\n \\\"python.analysis.enablePytestSupport\\\": true,\\n \\\"python.analysis.autoSearchPaths\\\": true,\\n \\\"python.globalModuleInstallation\\\": false,\\n \\\"python.analysis.indexing\\\": true,\\n \\\"python.analysis.typeCheckingMode\\\": \\\"standard\\\",\\n \\\"python.analysis.diagnosticMode\\\": \\\"workspace\\\",\\n \\\"python.analysis.useLibraryCodeForTypes\\\": true,\\n \\\"python.analysis.autoImportCompletions\\\": true,\\n \\\"python.analysis.completeFunctionParens\\\": false,\\n \\\"python.terminal.activateEnvironment\\\": false,\\n \\\"python.analysis.logLevel\\\": \\\"Information\\\",\\n\\n // git settings\\n \\\"git.autofetch\\\": true,\\n \\\"git.confirmSync\\\": false,\\n \\\"git.enableSmartCommit\\\": true,\\n \\\"git.detectSubmodules\\\": true,\\n \\\"git.showPushSuccessNotification\\\": true,\\n\\n // editor settings\\n \\\"debug.saveBeforeStart\\\": \\\"allEditorsInActiveGroup\\\",\\n \\\"task.saveBeforeRun\\\": \\\"always\\\",\\n \\\"editor.formatOnSaveMode\\\": \\\"file\\\",\\n \\\"window.clickThroughInactive\\\": true,\\n \\\"window.autoDetectColorScheme\\\": true,\\n \\\"workbench.preferredDarkColorTheme\\\": \\\"Default Dark Modern\\\",\\n \\\"window.closeWhenEmpty\\\": false,\\n \\\"editor.suggestSelection\\\": \\\"first\\\",\\n \\\"editor.formatOnSave\\\": true,\\n \\\"security.workspace.trust.untrustedFiles\\\": \\\"prompt\\\",\\n \\\"files.autoSave\\\": \\\"afterDelay\\\",\\n \\\"files.autoSaveDelay\\\": 60000,\\n \\\"editor.minimap.enabled\\\": true,\\n \\\"workbench.colorTheme\\\": \\\"Default Dark Modern\\\",\\n \\\"workbench.colorCustomizations\\\": {\\n \\\"[Default Dark+]\\\": {\\n // defaults\\n }\\n },\\n\\n //copilot settings\\n \\\"github.copilot.editor.enableCodeActions\\\": true,\\n \\\"github.copilot.editor.enableAutoCompletions\\\": true,\\n \\\"github.copilot.chat.scopeSelection\\\": true,\\n \\\"github.copilot.chat.welcomeMessage\\\": \\\"first\\\",\\n \\\"github.copilot.enable\\\": {\\n \\\"*\\\": true,\\n \\\"plaintext\\\": true,\\n \\\"markdown\\\": false,\\n \\\"scminput\\\": false\\n },\\n \\\"github.copilot.preferredAccount\\\": \\\"carlosferreyra\\\",\\n\\n \\\"redhat.telemetry.enabled\\\": true,\\n // shell and terminal settings\\n \\\"terminal.integrated.defaultProfile.windows\\\": \\\"zsh\\\",\\n \\\"debug.terminal.clearBeforeReusing\\\": true,\\n \\\"terminal.external.linuxExec\\\": \\\"bash\\\",\\n \\\"terminal.integrated.allowMnemonics\\\": true,\\n \\\"terminal.integrated.confirmOnExit\\\": \\\"hasChildProcesses\\\",\\n \\\"terminal.integrated.copyOnSelection\\\": true,\\n \\\"terminal.external.osxExec\\\": \\\"zsh\\\",\\n \\\"terminal.integrated.defaultProfile.osx\\\": \\\"zsh\\\",\\n \\\"[jsonc]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\n },\\n \\\"vs-kubernetes\\\": {\\n \\\"vscode-kubernetes.kubectl-path-mac\\\": \\\"/Users/carlosferreyra/.vs-kubernetes/tools/kubectl/kubectl\\\",\\n \\\"vscode-kubernetes.helm-path-mac\\\": \\\"/Users/carlosferreyra/.vs-kubernetes/tools/helm/darwin-arm64/helm\\\",\\n \\\"vscode-kubernetes.minikube-path-mac\\\": \\\"/Users/carlosferreyra/.vs-kubernetes/tools/minikube/darwin-arm64/minikube\\\"\\n },\\n \\\"[css]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\n },\\n \\\"[typescriptreact]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"vscode.typescript-language-features\\\"\\n },\\n \\\"[html]\\\": {\\n \\\"editor.defaultFormatter\\\": \\\"esbenp.prettier-vscode\\\"\\n },\\n\\n // file nesting settings\\n \\\"explorer.fileNesting.patterns\\\": {\\n \\\"*.ts\\\": \\\"${capture}.js\\\",\\n \\\"*.js\\\": \\\"${capture}.js.map, ${capture}.min.js, ${capture}.d.ts\\\",\\n \\\"*.jsx\\\": \\\"${capture}.js\\\",\\n \\\"*.tsx\\\": \\\"${capture}.ts\\\",\\n \\\"tsconfig.json\\\": \\\"tsconfig.*.json\\\",\\n \\\"package.json\\\": \\\"package-lock.json, yarn.lock, pnpm-lock.yaml, bun.lockb\\\",\\n \\\"*.sqlite\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.db\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.sqlite3\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.db3\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.sdb\\\": \\\"${capture}.${extname}-*\\\",\\n \\\"*.s3db\\\": \\\"${capture}.${extname}-*\\\"\\n }\\n}\\n\"}","keybindings":"{\"keybindings\":\"// Place your key bindings in this file to override the defaultsauto[]\\n[\\n {\\n \\\"key\\\": \\\"cmd+t cmd+t\\\",\\n \\\"command\\\": \\\"workbench.action.terminal.toggleTerminal\\\"\\n },\\n {\\n \\\"key\\\": \\\"cmd+e cmd+t\\\",\\n \\\"command\\\": \\\"workbench.action.terminal.openNativeConsole\\\",\\n \\\"when\\\": \\\"!terminalFocus\\\"\\n },\\n {\\n \\\"key\\\": \\\"shift+cmd+c\\\",\\n \\\"command\\\": \\\"-workbench.action.terminal.openNativeConsole\\\",\\n \\\"when\\\": \\\"!terminalFocus\\\"\\n },\\n {\\n \\\"key\\\": \\\"alt+cmd+'\\\",\\n \\\"command\\\": \\\"workbench.action.terminal.new\\\",\\n \\\"when\\\": \\\"terminalProcessSupported || terminalWebExtensionContributedProfile\\\"\\n },\\n {\\n \\\"key\\\": \\\"ctrl+shift+`\\\",\\n \\\"command\\\": \\\"-workbench.action.terminal.new\\\",\\n \\\"when\\\": \\\"terminalProcessSupported || terminalWebExtensionContributedProfile\\\"\\n }\\n]\",\"platform\":1}","tasks":"{\"tasks\":\"{}\"}","extensions":"[{\"identifier\":{\"id\":\"aaron-bond.better-comments\",\"uuid\":\"7a0110bb-231a-4598-aa1b-0769ea46d28b\"},\"displayName\":\"Better Comments\"},{\"identifier\":{\"id\":\"alexcvzz.vscode-sqlite\",\"uuid\":\"eaee103c-e866-4b73-87f8-3749cab64da2\"},\"displayName\":\"SQLite\"},{\"identifier\":{\"id\":\"christian-kohler.npm-intellisense\",\"uuid\":\"dff6b801-247e-40e9-82e8-8c9b1d19d1b8\"},\"displayName\":\"npm Intellisense\"},{\"identifier\":{\"id\":\"christian-kohler.path-intellisense\",\"uuid\":\"a41c1549-4053-44d4-bf30-60fc809b4a86\"},\"displayName\":\"Path Intellisense\"},{\"identifier\":{\"id\":\"codezombiech.gitignore\",\"uuid\":\"3e891cf9-53cb-49a3-8d01-8f0b1f0afb29\"},\"displayName\":\"gitignore\"},{\"identifier\":{\"id\":\"dbaeumer.vscode-eslint\",\"uuid\":\"583b2b34-2c1e-4634-8c0b-0b82e283ea3a\"},\"displayName\":\"ESLint\"},{\"identifier\":{\"id\":\"donjayamanne.githistory\",\"uuid\":\"5960f38e-0bbe-4644-8f9c-9c8824e82511\"},\"displayName\":\"Git History\"},{\"identifier\":{\"id\":\"donjayamanne.python-environment-manager\",\"uuid\":\"0c9f60fd-5588-42f7-9176-e80c3ae111ec\"},\"displayName\":\"Python Environment Manager\"},{\"identifier\":{\"id\":\"ecmel.vscode-html-css\",\"uuid\":\"aaee577c-f062-495a-9816-0cbd442f1d25\"},\"displayName\":\"HTML CSS Support\"},{\"identifier\":{\"id\":\"esbenp.prettier-vscode\",\"uuid\":\"96fa4707-6983-4489-b7c5-d5ffdfdcce90\"},\"displayName\":\"Prettier - Code formatter\"},{\"identifier\":{\"id\":\"figma.figma-vscode-extension\",\"uuid\":\"bff510dc-dcac-4daf-925c-299ee91fb135\"},\"displayName\":\"Figma for VS Code\"},{\"identifier\":{\"id\":\"formulahendry.auto-rename-tag\",\"uuid\":\"6e440e71-8ed9-4f25-bb78-4b13096b8a03\"},\"displayName\":\"Auto Rename Tag\"},{\"identifier\":{\"id\":\"formulahendry.code-runner\",\"uuid\":\"a6a0c5b2-d078-4bf5-a9ee-4e37054414b3\"},\"displayName\":\"Code Runner\"},{\"identifier\":{\"id\":\"github.copilot\",\"uuid\":\"23c4aeee-f844-43cd-b53e-1113e483f1a6\"},\"displayName\":\"GitHub Copilot\"},{\"identifier\":{\"id\":\"github.copilot-chat\",\"uuid\":\"7ec7d6e6-b89e-4cc5-a59b-d6c4d238246f\"},\"displayName\":\"GitHub Copilot Chat\"},{\"identifier\":{\"id\":\"github.remotehub\",\"uuid\":\"fc7d7e85-2e58-4c1c-97a3-2172ed9a77cd\"},\"displayName\":\"GitHub Repositories\"},{\"identifier\":{\"id\":\"github.vscode-github-actions\",\"uuid\":\"04f49bfc-8330-4eee-8237-ea938fb755ef\"},\"displayName\":\"GitHub Actions\"},{\"identifier\":{\"id\":\"github.vscode-pull-request-github\",\"uuid\":\"69ddd764-339a-4ecc-97c1-9c4ece58e36d\"},\"displayName\":\"GitHub Pull Requests\"},{\"identifier\":{\"id\":\"googlecloudtools.cloudcode\",\"uuid\":\"5e8803a2-3dc8-42b3-9c5f-ea9d37828c03\"},\"displayName\":\"Gemini Code Assist + Google Cloud Code\",\"disabled\":true},{\"identifier\":{\"id\":\"jock.svg\",\"uuid\":\"4ae6dc82-7981-4f10-bd81-2d72aec37f39\"},\"displayName\":\"SVG\"},{\"identifier\":{\"id\":\"mhutchie.git-graph\",\"uuid\":\"438221f8-1107-4ccd-a6fe-f3b7fe0856b7\"},\"displayName\":\"Git Graph\"},{\"identifier\":{\"id\":\"ms-azuretools.vscode-docker\",\"uuid\":\"0479fc1c-3d67-49f9-b087-fb9069afe48f\"},\"displayName\":\"Docker\"},{\"identifier\":{\"id\":\"ms-kubernetes-tools.vscode-kubernetes-tools\",\"uuid\":\"4837e4f3-1b01-4732-b1a6-daa57ef64cab\"},\"displayName\":\"Kubernetes\"},{\"identifier\":{\"id\":\"ms-python.black-formatter\",\"uuid\":\"859e640c-c157-47da-8699-9080b81c8371\"},\"displayName\":\"Black Formatter\"},{\"identifier\":{\"id\":\"ms-python.debugpy\",\"uuid\":\"4bd5d2c9-9d65-401a-b0b2-7498d9f17615\"},\"displayName\":\"Python Debugger\"},{\"identifier\":{\"id\":\"ms-python.python\",\"uuid\":\"f1f59ae4-9318-4f3c-a9b5-81b2eaa5f8a5\"},\"displayName\":\"Python\"},{\"identifier\":{\"id\":\"ms-python.vscode-pylance\",\"uuid\":\"364d2426-116a-433a-a5d8-a5098dc3afbd\"},\"displayName\":\"Pylance\"},{\"identifier\":{\"id\":\"ms-vscode-remote.remote-containers\",\"uuid\":\"93ce222b-5f6f-49b7-9ab1-a0463c6238df\"},\"displayName\":\"Dev Containers\"},{\"identifier\":{\"id\":\"ms-vscode-remote.remote-ssh\",\"uuid\":\"607fd052-be03-4363-b657-2bd62b83d28a\"},\"displayName\":\"Remote - SSH\"},{\"identifier\":{\"id\":\"ms-vscode-remote.remote-ssh-edit\",\"uuid\":\"bfeaf631-bcff-4908-93ed-fda4ef9a0c5c\"},\"displayName\":\"Remote - SSH: Editing Configuration Files\"},{\"identifier\":{\"id\":\"ms-vscode-remote.vscode-remote-extensionpack\",\"uuid\":\"23d72dfc-8dd1-4e30-926e-8783b4378f13\"},\"displayName\":\"Remote Development\"},{\"identifier\":{\"id\":\"ms-vscode.cmake-tools\",\"uuid\":\"7c889349-8749-43d4-8b5e-08939936d7f4\"},\"displayName\":\"CMake Tools\"},{\"identifier\":{\"id\":\"ms-vscode.cpptools\",\"uuid\":\"690b692e-e8a9-493f-b802-8089d50ac1b2\"},\"displayName\":\"C/C++\",\"preRelease\":true},{\"identifier\":{\"id\":\"ms-vscode.cpptools-extension-pack\",\"uuid\":\"3957b2f6-f086-49b5-a7b4-5da772123130\"},\"displayName\":\"C/C++ Extension Pack\"},{\"identifier\":{\"id\":\"ms-vscode.makefile-tools\",\"uuid\":\"e09cf600-90a1-414e-92a0-031f1a5391c6\"},\"displayName\":\"Makefile Tools\"},{\"identifier\":{\"id\":\"ms-vscode.remote-explorer\",\"uuid\":\"11858313-52cc-4e57-b3e4-d7b65281e34b\"},\"displayName\":\"Remote Explorer\"},{\"identifier\":{\"id\":\"ms-vscode.remote-repositories\",\"uuid\":\"cf5142f0-3701-4992-980c-9895a750addf\"},\"displayName\":\"Remote Repositories\"},{\"identifier\":{\"id\":\"ms-vscode.remote-server\",\"uuid\":\"105c0b3c-07a9-4156-a4fc-4141040eb07e\"},\"displayName\":\"Remote - Tunnels\"},{\"identifier\":{\"id\":\"ms-vscode.test-adapter-converter\",\"uuid\":\"47210ec2-0324-4cbb-9523-9dff02a5f9ec\"},\"displayName\":\"Test Adapter Converter\"},{\"identifier\":{\"id\":\"njpwerner.autodocstring\",\"uuid\":\"2d6fea35-f68e-461d-9b7b-5cd05be99451\"},\"displayName\":\"autoDocstring - Python Docstring Generator\"},{\"identifier\":{\"id\":\"oderwat.indent-rainbow\",\"uuid\":\"eaa2127d-cb69-4ab9-8505-a60c9ee5f28b\"}},{\"identifier\":{\"id\":\"oracle.mysql-shell-for-vs-code\",\"uuid\":\"54ddcd76-0b30-4937-8030-143a59ca2f3c\"},\"displayName\":\"MySQL Shell for VS Code\"},{\"identifier\":{\"id\":\"qwtel.sqlite-viewer\",\"uuid\":\"94fef082-6c2d-43ac-9540-6617b51a3a12\"},\"displayName\":\"SQLite Viewer\"},{\"identifier\":{\"id\":\"redhat.vscode-yaml\",\"uuid\":\"2061917f-f76a-458a-8da9-f162de22b97e\"},\"displayName\":\"YAML\"},{\"identifier\":{\"id\":\"ritwickdey.liveserver\",\"uuid\":\"b63c44fd-0457-4696-99e9-dbfdf70d77de\"},\"displayName\":\"Live Server\"},{\"identifier\":{\"id\":\"streetsidesoftware.code-spell-checker\",\"uuid\":\"f6dbd813-b0a0-42c1-90ea-10dde9d925a7\"},\"displayName\":\"Code Spell Checker\"},{\"identifier\":{\"id\":\"twxs.cmake\",\"uuid\":\"2be7cf14-2603-402e-9771-fd79df83cdf8\"},\"displayName\":\"CMake\"},{\"identifier\":{\"id\":\"waderyan.gitblame\",\"uuid\":\"2335b326-c334-4e81-bc51-c408fcec6e7c\"},\"displayName\":\"Git Blame\"},{\"identifier\":{\"id\":\"xabikos.javascriptsnippets\",\"uuid\":\"a2cec723-5349-460d-9de9-0fd1f8d3456f\"},\"displayName\":\"JavaScript (ES6) code snippets\"},{\"identifier\":{\"id\":\"yzhang.markdown-all-in-one\",\"uuid\":\"98790d67-10fa-497c-9113-f6c7489207b2\"},\"displayName\":\"Markdown All in One\"}]","globalState":"{\"storage\":{\"workbench.panel.markers.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.markers.view\\\",\\\"isHidden\\\":false}]\",\"workbench.panel.output.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.output\\\",\\\"isHidden\\\":false}]\",\"terminal.hidden\":\"[{\\\"id\\\":\\\"terminal\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false}]\",\"workbench.explorer.views.state.hidden\":\"[{\\\"id\\\":\\\"outline\\\",\\\"isHidden\\\":false,\\\"order\\\":3},{\\\"id\\\":\\\"timeline\\\",\\\"isHidden\\\":false,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.explorer.openEditorsView\\\",\\\"isHidden\\\":false,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.explorer.emptyView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"npm\\\",\\\"isHidden\\\":false,\\\"order\\\":5},{\\\"id\\\":\\\"gitlens.views.repositories:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.compare:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.search:explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"mavenProjects\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"javaDependencyExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"xmlTreeView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dartPackages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"arduinoExampleExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring-boot-dashboard\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"mysql\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.explorer.fileView\\\",\\\"isHidden\\\":false,\\\"order\\\":1},{\\\"id\\\":\\\"azurerm-vscode-tools.template-outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"javaProjectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.session.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesHelmRepoExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"kubernetes.cloudExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dartDependencyTree\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pythonEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"commitViewProvider\\\",\\\"isHidden\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"compareCommitViewProvider\\\",\\\"isHidden\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"dotnet-interactive-panel-values\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jupyterViewVariables\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerImages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerRegistries\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerNetworks\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.dockerContexts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"objectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"queryHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqlite.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"ionide.projectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sfdx.force.tasks.view\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sshfs-configs\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sshfs-connections\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cell-tag\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsonOutline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-serial-monitor.monitor0\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-serial-monitor.monitor1\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-serial-monitor.monitor2\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"polyglot-notebook-panel-values\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.apps\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.beans\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.mappings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.properties\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"spring.memoryView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dataworkspace.views.main\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.kubernetes.localDevExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.kubectlExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudRunExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apiExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.secretsExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gceExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apigee.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gcfExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.awsLambdaImporterExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudStorageExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.sourceProtectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.mcdcSources\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.helpAndFeedbackExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workspaceEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.preview_ended\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.not_part_of_a_team\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.loading\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codeium.chatPanelView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codeium.searchPanelView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dbclient.search.result\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github.cweijan.mysql\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github.dbclient.history\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github.cweijan.nosql\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.targets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.help-links\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.session\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.devtools\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewConsoleMessages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewConnectionExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewBookmarksExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewHistoryExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codegpt-sidebar\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.current-branch\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.workflows\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.settings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.empty-view\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cmake.projectStatus\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"makefile.outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cmake.outline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cmake.pinnedCommands\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"issues:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:conflictResolution\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:createPullRequestWebview\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesFiles\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesCommits\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest:welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.dummyLoginNotifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.files\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.notifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false,\\\"order\\\":2},{\\\"id\\\":\\\"foundProjects\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"run-config\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graph\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.home\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graphDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.drafts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.workspaces\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.account\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.pullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.gemini.chatView\\\",\\\"isHidden\\\":false}]\",\"workbench.scm.views.state.hidden\":\"[{\\\"id\\\":\\\"workbench.scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.repositories:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.compare:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.search:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:scm\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.scm.repositories\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"scmTreeDataProvider\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.repositories\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.commits\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.branches\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.remotes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.stashes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.tags\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.contributors\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.worktrees\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.scm.sync\\\",\\\"isHidden\\\":false}]\",\"workbench.view.search.state.hidden\":\"[{\\\"id\\\":\\\"workbench.view.search\\\",\\\"isHidden\\\":false}]\",\"workbench.activityBar.location\":\"default\",\"workbench.activity.pinnedViewlets2\":\"[{\\\"id\\\":\\\"workbench.view.explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.view.search\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":1},{\\\"id\\\":\\\"workbench.view.scm\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":2},{\\\"id\\\":\\\"workbench.view.debug\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":3},{\\\"id\\\":\\\"workbench.view.remote\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.view.extensions\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":4},{\\\"id\\\":\\\"workbench.view.extension.test\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.references-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.figma\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.cspell-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":20},{\\\"id\\\":\\\"workbench.view.extension.github-pull-requests\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.aws-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":9},{\\\"id\\\":\\\"workbench.view.extension.blackbox\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.github-pull-request\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.package-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.github-actions\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":11},{\\\"id\\\":\\\"workbench.view.extension.mintdocs\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.dockerView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.kubernetesView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.cmake-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":17},{\\\"id\\\":\\\"workbench.view.extension.flutter\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.makefile__viewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":18},{\\\"id\\\":\\\"workbench.view.extension.PowerShellCommandExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":17},{\\\"id\\\":\\\"workbench.view.extension.project-manager\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.jupyter\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.chatActivityViewSlack\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.chatActivityViewDiscord\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":13},{\\\"id\\\":\\\"workbench.view.extension.msg-view\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.tabnine-access\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.gradleContainerView\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.dataworkspace\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.copilot-labs\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.1-cloudCodeDuetAIChatViewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.json-views\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":20},{\\\"id\\\":\\\"workbench.view.extension.cmake__viewContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.atlascode-drawer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":9},{\\\"id\\\":\\\"workbench.view.extension.postgres-explorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":11},{\\\"id\\\":\\\"workbench.view.extension.visualText\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.objectExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":16},{\\\"id\\\":\\\"workbench.view.extension.vscode-spotify\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":21},{\\\"id\\\":\\\"workbench.view.extension.databaseExplorer\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.extension.azure\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":15},{\\\"id\\\":\\\"workbench.view.extension.bookmarks\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.spring\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":19},{\\\"id\\\":\\\"workbench.view.extension.sshfs\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.view.extension.ionide-fsharp\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":12},{\\\"id\\\":\\\"workbench.view.extension.metadata\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":21},{\\\"id\\\":\\\"workbench.view.extension.conflicts\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":22},{\\\"id\\\":\\\"workbench.view.extension.mongoDB\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"workbench.view.sync\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"workbench.view.editSessions\\\",\\\"pinned\\\":true,\\\"visible\\\":false},{\\\"id\\\":\\\"userDataProfiles\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"workbench.panel.pinnedPanels\":\"[{\\\"id\\\":\\\"workbench.panel.markers\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":0},{\\\"id\\\":\\\"workbench.panel.output\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":1},{\\\"id\\\":\\\"workbench.panel.repl\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":2},{\\\"id\\\":\\\"workbench.panel.testResults\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":3},{\\\"id\\\":\\\"terminal\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":3},{\\\"id\\\":\\\"~remote.forwardedPortsContainer\\\",\\\"pinned\\\":true,\\\"visible\\\":true,\\\"order\\\":5},{\\\"id\\\":\\\"workbench.view.extension.aws-codewhisperer-reference-log\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.polyglot-notebook-panel\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":6},{\\\"id\\\":\\\"workbench.view.extension.jupyter-variables\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.dotnet-interactive-panel\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":7},{\\\"id\\\":\\\"workbench.view.extension.vscode-serial-monitor-tools\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":8},{\\\"id\\\":\\\"workbench.panel.comments\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":10},{\\\"id\\\":\\\"refactorPreview\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"themeUpdatedNotificationShown\":\"true\",\"nps/lastSessionDate\":\"Mon Jul 22 2024\",\"nps/sessionCount\":\"8\",\"workbench.view.debug.state.hidden\":\"[{\\\"id\\\":\\\"workbench.debug.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.variablesView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.watchExpressionsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.callStackView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.loadedScriptsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.debug.breakPointsView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsBrowserBreakpoints\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"jsExcludedCallers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.firefox.loadedScripts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"CppSshTargetsView\\\",\\\"isHidden\\\":false}]\",\"workbench.telemetryOptOutShown\":\"true\",\"cpp.1.lastSessionDate\":\"Mon Jul 22 2024\",\"cpp.1.sessionCount\":\"634\",\"java.2.lastSessionDate\":\"Mon Jul 22 2024\",\"java.2.sessionCount\":\"634\",\"javascript.1.lastSessionDate\":\"Mon Jul 22 2024\",\"javascript.1.sessionCount\":\"634\",\"typescript.1.lastSessionDate\":\"Mon Jul 22 2024\",\"typescript.1.sessionCount\":\"634\",\"colorThemeData\":\"{\\\"id\\\":\\\"vs-dark vscode-theme-defaults-themes-dark_modern-json\\\",\\\"label\\\":\\\"Dark Modern\\\",\\\"settingsId\\\":\\\"Default Dark Modern\\\",\\\"themeTokenColors\\\":[{\\\"settings\\\":{\\\"foreground\\\":\\\"#D4D4D4\\\"},\\\"scope\\\":[\\\"meta.embedded\\\",\\\"source.groovy.embedded\\\",\\\"string meta.image.inline.markdown\\\",\\\"variable.legacy.builtin.python\\\"]},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"italic\\\"},\\\"scope\\\":\\\"emphasis\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\"},\\\"scope\\\":\\\"strong\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#000080\\\"},\\\"scope\\\":\\\"header\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6A9955\\\"},\\\"scope\\\":\\\"comment\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"constant.language\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":[\\\"constant.numeric\\\",\\\"variable.other.enummember\\\",\\\"keyword.operator.plus.exponent\\\",\\\"keyword.operator.minus.exponent\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#646695\\\"},\\\"scope\\\":\\\"constant.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"entity.name.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":[\\\"entity.name.tag.css\\\",\\\"entity.name.tag.less\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"entity.other.attribute-name\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":[\\\"entity.other.attribute-name.class.css\\\",\\\"source.css entity.other.attribute-name.class\\\",\\\"entity.other.attribute-name.id.css\\\",\\\"entity.other.attribute-name.parent-selector.css\\\",\\\"entity.other.attribute-name.parent.less\\\",\\\"source.css entity.other.attribute-name.pseudo-class\\\",\\\"entity.other.attribute-name.pseudo-element.css\\\",\\\"source.css.less entity.other.attribute-name.id\\\",\\\"entity.other.attribute-name.scss\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#f44747\\\"},\\\"scope\\\":\\\"invalid\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"underline\\\"},\\\"scope\\\":\\\"markup.underline\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\",\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.bold\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"bold\\\",\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.heading\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"italic\\\"},\\\"scope\\\":\\\"markup.italic\\\"},{\\\"settings\\\":{\\\"fontStyle\\\":\\\"strikethrough\\\"},\\\"scope\\\":\\\"markup.strikethrough\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"markup.inserted\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"markup.deleted\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"markup.changed\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6A9955\\\"},\\\"scope\\\":\\\"punctuation.definition.quote.begin.markdown\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#6796e6\\\"},\\\"scope\\\":\\\"punctuation.definition.list.begin.markdown\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"markup.inline.raw\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#808080\\\"},\\\"scope\\\":\\\"punctuation.definition.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"meta.preprocessor\\\",\\\"entity.name.function.preprocessor\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"meta.preprocessor.string\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"meta.preprocessor.numeric\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"meta.structure.dictionary.key.python\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"meta.diff.header\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"storage\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"storage.type\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"storage.modifier\\\",\\\"keyword.operator.noexcept\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":[\\\"string\\\",\\\"meta.embedded.assembly\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"string.tag\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#ce9178\\\"},\\\"scope\\\":\\\"string.value\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d16969\\\"},\\\"scope\\\":\\\"string.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"punctuation.definition.template-expression.begin\\\",\\\"punctuation.definition.template-expression.end\\\",\\\"punctuation.section.embedded\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":[\\\"meta.template.expression\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":[\\\"support.type.vendored.property-name\\\",\\\"support.type.property-name\\\",\\\"source.css variable\\\",\\\"source.coffee.embedded\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"keyword\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"keyword.control\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":\\\"keyword.operator\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"keyword.operator.new\\\",\\\"keyword.operator.expression\\\",\\\"keyword.operator.cast\\\",\\\"keyword.operator.sizeof\\\",\\\"keyword.operator.alignof\\\",\\\"keyword.operator.typeid\\\",\\\"keyword.operator.alignas\\\",\\\"keyword.operator.instanceof\\\",\\\"keyword.operator.logical.python\\\",\\\"keyword.operator.wordlike\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"keyword.other.unit\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"punctuation.section.embedded.begin.php\\\",\\\"punctuation.section.embedded.end.php\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9cdcfe\\\"},\\\"scope\\\":\\\"support.function.git-rebase\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#b5cea8\\\"},\\\"scope\\\":\\\"constant.sha.git-rebase\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d4d4d4\\\"},\\\"scope\\\":[\\\"storage.modifier.import.java\\\",\\\"variable.language.wildcard.java\\\",\\\"storage.modifier.package.java\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":\\\"variable.language\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#DCDCAA\\\"},\\\"scope\\\":[\\\"entity.name.function\\\",\\\"support.function\\\",\\\"support.constant.handlebars\\\",\\\"source.powershell variable.other.member\\\",\\\"entity.name.operator.custom-literal\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4EC9B0\\\"},\\\"scope\\\":[\\\"support.class\\\",\\\"support.type\\\",\\\"entity.name.type\\\",\\\"entity.name.namespace\\\",\\\"entity.other.attribute\\\",\\\"entity.name.scope-resolution\\\",\\\"entity.name.class\\\",\\\"storage.type.numeric.go\\\",\\\"storage.type.byte.go\\\",\\\"storage.type.boolean.go\\\",\\\"storage.type.string.go\\\",\\\"storage.type.uintptr.go\\\",\\\"storage.type.error.go\\\",\\\"storage.type.rune.go\\\",\\\"storage.type.cs\\\",\\\"storage.type.generic.cs\\\",\\\"storage.type.modifier.cs\\\",\\\"storage.type.variable.cs\\\",\\\"storage.type.annotation.java\\\",\\\"storage.type.generic.java\\\",\\\"storage.type.java\\\",\\\"storage.type.object.array.java\\\",\\\"storage.type.primitive.array.java\\\",\\\"storage.type.primitive.java\\\",\\\"storage.type.token.java\\\",\\\"storage.type.groovy\\\",\\\"storage.type.annotation.groovy\\\",\\\"storage.type.parameters.groovy\\\",\\\"storage.type.generic.groovy\\\",\\\"storage.type.object.array.groovy\\\",\\\"storage.type.primitive.array.groovy\\\",\\\"storage.type.primitive.groovy\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4EC9B0\\\"},\\\"scope\\\":[\\\"meta.type.cast.expr\\\",\\\"meta.type.new.expr\\\",\\\"support.constant.math\\\",\\\"support.constant.dom\\\",\\\"support.constant.json\\\",\\\"entity.other.inherited-class\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#C586C0\\\"},\\\"scope\\\":[\\\"keyword.control\\\",\\\"source.cpp keyword.operator.new\\\",\\\"keyword.operator.delete\\\",\\\"keyword.other.using\\\",\\\"keyword.other.directive.using\\\",\\\"keyword.other.operator\\\",\\\"entity.name.operator\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9CDCFE\\\"},\\\"scope\\\":[\\\"variable\\\",\\\"meta.definition.variable.name\\\",\\\"support.variable\\\",\\\"entity.name.variable\\\",\\\"constant.other.placeholder\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#4FC1FF\\\"},\\\"scope\\\":[\\\"variable.other.constant\\\",\\\"variable.other.enummember\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#9CDCFE\\\"},\\\"scope\\\":[\\\"meta.object-literal.key\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#CE9178\\\"},\\\"scope\\\":[\\\"support.constant.property-value\\\",\\\"support.constant.font-name\\\",\\\"support.constant.media-type\\\",\\\"support.constant.media\\\",\\\"constant.other.color.rgb-value\\\",\\\"constant.other.rgb-value\\\",\\\"support.constant.color\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#CE9178\\\"},\\\"scope\\\":[\\\"punctuation.definition.group.regexp\\\",\\\"punctuation.definition.group.assertion.regexp\\\",\\\"punctuation.definition.character-class.regexp\\\",\\\"punctuation.character.set.begin.regexp\\\",\\\"punctuation.character.set.end.regexp\\\",\\\"keyword.operator.negation.regexp\\\",\\\"support.other.parenthesis.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d16969\\\"},\\\"scope\\\":[\\\"constant.character.character-class.regexp\\\",\\\"constant.other.character-class.set.regexp\\\",\\\"constant.other.character-class.regexp\\\",\\\"constant.character.set.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#DCDCAA\\\"},\\\"scope\\\":[\\\"keyword.operator.or.regexp\\\",\\\"keyword.control.anchor.regexp\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":\\\"keyword.operator.quantifier.regexp\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#569cd6\\\"},\\\"scope\\\":[\\\"constant.character\\\",\\\"constant.other.option\\\"]},{\\\"settings\\\":{\\\"foreground\\\":\\\"#d7ba7d\\\"},\\\"scope\\\":\\\"constant.character.escape\\\"},{\\\"settings\\\":{\\\"foreground\\\":\\\"#C8C8C8\\\"},\\\"scope\\\":\\\"entity.name.label\\\"}],\\\"semanticTokenRules\\\":[{\\\"_selector\\\":\\\"newOperator\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#d4d4d4\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"stringLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#ce9178\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"customLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#d4d4d4\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"numberLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#b5cea8\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"newOperator\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#c586c0\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"stringLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#ce9178\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"customLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#dcdcaa\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}},{\\\"_selector\\\":\\\"numberLiteral\\\",\\\"_style\\\":{\\\"_foreground\\\":\\\"#b5cea8\\\",\\\"_bold\\\":null,\\\"_underline\\\":null,\\\"_italic\\\":null,\\\"_strikethrough\\\":null}}],\\\"extensionData\\\":{\\\"_extensionId\\\":\\\"vscode.theme-defaults\\\",\\\"_extensionIsBuiltin\\\":true,\\\"_extensionName\\\":\\\"theme-defaults\\\",\\\"_extensionPublisher\\\":\\\"vscode\\\"},\\\"themeSemanticHighlighting\\\":true,\\\"colorMap\\\":{\\\"checkbox.border\\\":\\\"#3c3c3c\\\",\\\"editor.background\\\":\\\"#1f1f1f\\\",\\\"editor.foreground\\\":\\\"#cccccc\\\",\\\"editor.inactiveSelectionBackground\\\":\\\"#3a3d41\\\",\\\"editorIndentGuide.background1\\\":\\\"#404040\\\",\\\"editorIndentGuide.activeBackground1\\\":\\\"#707070\\\",\\\"editor.selectionHighlightBackground\\\":\\\"#add6ff26\\\",\\\"list.dropBackground\\\":\\\"#383b3d\\\",\\\"activityBarBadge.background\\\":\\\"#0078d4\\\",\\\"sideBarTitle.foreground\\\":\\\"#cccccc\\\",\\\"input.placeholderForeground\\\":\\\"#989898\\\",\\\"menu.background\\\":\\\"#1f1f1f\\\",\\\"menu.foreground\\\":\\\"#cccccc\\\",\\\"menu.separatorBackground\\\":\\\"#454545\\\",\\\"menu.border\\\":\\\"#454545\\\",\\\"statusBarItem.remoteForeground\\\":\\\"#ffffff\\\",\\\"statusBarItem.remoteBackground\\\":\\\"#0078d4\\\",\\\"ports.iconRunningProcessForeground\\\":\\\"#369432\\\",\\\"sideBarSectionHeader.background\\\":\\\"#181818\\\",\\\"sideBarSectionHeader.border\\\":\\\"#2b2b2b\\\",\\\"tab.selectedBackground\\\":\\\"#222222\\\",\\\"tab.selectedForeground\\\":\\\"#ffffffa0\\\",\\\"tab.lastPinnedBorder\\\":\\\"#cccccc33\\\",\\\"list.activeSelectionIconForeground\\\":\\\"#ffffff\\\",\\\"terminal.inactiveSelectionBackground\\\":\\\"#3a3d41\\\",\\\"widget.border\\\":\\\"#313131\\\",\\\"actionBar.toggledBackground\\\":\\\"#383a49\\\",\\\"activityBar.activeBorder\\\":\\\"#0078d4\\\",\\\"activityBar.background\\\":\\\"#181818\\\",\\\"activityBar.border\\\":\\\"#2b2b2b\\\",\\\"activityBar.foreground\\\":\\\"#d7d7d7\\\",\\\"activityBar.inactiveForeground\\\":\\\"#868686\\\",\\\"activityBarBadge.foreground\\\":\\\"#ffffff\\\",\\\"badge.background\\\":\\\"#616161\\\",\\\"badge.foreground\\\":\\\"#f8f8f8\\\",\\\"button.background\\\":\\\"#0078d4\\\",\\\"button.border\\\":\\\"#ffffff12\\\",\\\"button.foreground\\\":\\\"#ffffff\\\",\\\"button.hoverBackground\\\":\\\"#026ec1\\\",\\\"button.secondaryBackground\\\":\\\"#313131\\\",\\\"button.secondaryForeground\\\":\\\"#cccccc\\\",\\\"button.secondaryHoverBackground\\\":\\\"#3c3c3c\\\",\\\"chat.slashCommandBackground\\\":\\\"#34414b\\\",\\\"chat.slashCommandForeground\\\":\\\"#40a6ff\\\",\\\"checkbox.background\\\":\\\"#313131\\\",\\\"debugToolBar.background\\\":\\\"#181818\\\",\\\"descriptionForeground\\\":\\\"#9d9d9d\\\",\\\"dropdown.background\\\":\\\"#313131\\\",\\\"dropdown.border\\\":\\\"#3c3c3c\\\",\\\"dropdown.foreground\\\":\\\"#cccccc\\\",\\\"dropdown.listBackground\\\":\\\"#1f1f1f\\\",\\\"editor.findMatchBackground\\\":\\\"#9e6a03\\\",\\\"editorGroup.border\\\":\\\"#ffffff17\\\",\\\"editorGroupHeader.tabsBackground\\\":\\\"#181818\\\",\\\"editorGroupHeader.tabsBorder\\\":\\\"#2b2b2b\\\",\\\"editorGutter.addedBackground\\\":\\\"#2ea043\\\",\\\"editorGutter.deletedBackground\\\":\\\"#f85149\\\",\\\"editorGutter.modifiedBackground\\\":\\\"#0078d4\\\",\\\"editorLineNumber.activeForeground\\\":\\\"#cccccc\\\",\\\"editorLineNumber.foreground\\\":\\\"#6e7681\\\",\\\"editorOverviewRuler.border\\\":\\\"#010409\\\",\\\"editorWidget.background\\\":\\\"#202020\\\",\\\"errorForeground\\\":\\\"#f85149\\\",\\\"focusBorder\\\":\\\"#0078d4\\\",\\\"foreground\\\":\\\"#cccccc\\\",\\\"icon.foreground\\\":\\\"#cccccc\\\",\\\"input.background\\\":\\\"#313131\\\",\\\"input.border\\\":\\\"#3c3c3c\\\",\\\"input.foreground\\\":\\\"#cccccc\\\",\\\"inputOption.activeBackground\\\":\\\"#2489db82\\\",\\\"inputOption.activeBorder\\\":\\\"#2488db\\\",\\\"keybindingLabel.foreground\\\":\\\"#cccccc\\\",\\\"menu.selectionBackground\\\":\\\"#0078d4\\\",\\\"notificationCenterHeader.background\\\":\\\"#1f1f1f\\\",\\\"notificationCenterHeader.foreground\\\":\\\"#cccccc\\\",\\\"notifications.background\\\":\\\"#1f1f1f\\\",\\\"notifications.border\\\":\\\"#2b2b2b\\\",\\\"notifications.foreground\\\":\\\"#cccccc\\\",\\\"panel.background\\\":\\\"#181818\\\",\\\"panel.border\\\":\\\"#2b2b2b\\\",\\\"panelInput.border\\\":\\\"#2b2b2b\\\",\\\"panelTitle.activeBorder\\\":\\\"#0078d4\\\",\\\"panelTitle.activeForeground\\\":\\\"#cccccc\\\",\\\"panelTitle.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"peekViewEditor.background\\\":\\\"#1f1f1f\\\",\\\"peekViewEditor.matchHighlightBackground\\\":\\\"#bb800966\\\",\\\"peekViewResult.background\\\":\\\"#1f1f1f\\\",\\\"peekViewResult.matchHighlightBackground\\\":\\\"#bb800966\\\",\\\"pickerGroup.border\\\":\\\"#3c3c3c\\\",\\\"progressBar.background\\\":\\\"#0078d4\\\",\\\"quickInput.background\\\":\\\"#222222\\\",\\\"quickInput.foreground\\\":\\\"#cccccc\\\",\\\"settings.dropdownBackground\\\":\\\"#313131\\\",\\\"settings.dropdownBorder\\\":\\\"#3c3c3c\\\",\\\"settings.headerForeground\\\":\\\"#ffffff\\\",\\\"settings.modifiedItemIndicator\\\":\\\"#bb800966\\\",\\\"sideBar.background\\\":\\\"#181818\\\",\\\"sideBar.border\\\":\\\"#2b2b2b\\\",\\\"sideBar.foreground\\\":\\\"#cccccc\\\",\\\"sideBarSectionHeader.foreground\\\":\\\"#cccccc\\\",\\\"statusBar.background\\\":\\\"#181818\\\",\\\"statusBar.border\\\":\\\"#2b2b2b\\\",\\\"statusBar.debuggingBackground\\\":\\\"#0078d4\\\",\\\"statusBar.debuggingForeground\\\":\\\"#ffffff\\\",\\\"statusBar.focusBorder\\\":\\\"#0078d4\\\",\\\"statusBar.foreground\\\":\\\"#cccccc\\\",\\\"statusBar.noFolderBackground\\\":\\\"#1f1f1f\\\",\\\"statusBarItem.focusBorder\\\":\\\"#0078d4\\\",\\\"statusBarItem.prominentBackground\\\":\\\"#6e768166\\\",\\\"tab.activeBackground\\\":\\\"#1f1f1f\\\",\\\"tab.activeBorder\\\":\\\"#1f1f1f\\\",\\\"tab.activeBorderTop\\\":\\\"#0078d4\\\",\\\"tab.activeForeground\\\":\\\"#ffffff\\\",\\\"tab.selectedBorderTop\\\":\\\"#6caddf\\\",\\\"tab.border\\\":\\\"#2b2b2b\\\",\\\"tab.hoverBackground\\\":\\\"#1f1f1f\\\",\\\"tab.inactiveBackground\\\":\\\"#181818\\\",\\\"tab.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"tab.unfocusedActiveBorder\\\":\\\"#1f1f1f\\\",\\\"tab.unfocusedActiveBorderTop\\\":\\\"#2b2b2b\\\",\\\"tab.unfocusedHoverBackground\\\":\\\"#1f1f1f\\\",\\\"terminal.foreground\\\":\\\"#cccccc\\\",\\\"terminal.tab.activeBorder\\\":\\\"#0078d4\\\",\\\"textBlockQuote.background\\\":\\\"#2b2b2b\\\",\\\"textBlockQuote.border\\\":\\\"#616161\\\",\\\"textCodeBlock.background\\\":\\\"#2b2b2b\\\",\\\"textLink.activeForeground\\\":\\\"#4daafc\\\",\\\"textLink.foreground\\\":\\\"#4daafc\\\",\\\"textPreformat.foreground\\\":\\\"#d0d0d0\\\",\\\"textPreformat.background\\\":\\\"#3c3c3c\\\",\\\"textSeparator.foreground\\\":\\\"#21262d\\\",\\\"titleBar.activeBackground\\\":\\\"#181818\\\",\\\"titleBar.activeForeground\\\":\\\"#cccccc\\\",\\\"titleBar.border\\\":\\\"#2b2b2b\\\",\\\"titleBar.inactiveBackground\\\":\\\"#1f1f1f\\\",\\\"titleBar.inactiveForeground\\\":\\\"#9d9d9d\\\",\\\"welcomePage.tileBackground\\\":\\\"#2b2b2b\\\",\\\"welcomePage.progress.foreground\\\":\\\"#0078d4\\\"},\\\"watch\\\":false}\",\"workbench.panel.repl.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.repl.view\\\",\\\"isHidden\\\":false}]\",\"workbench.welcomePage.walkthroughMetadata\":\"[[\\\"eamodio.gitlens#welcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"get-started\\\",\\\"core-features\\\",\\\"pro-features\\\",\\\"pro-trial\\\",\\\"pro-upgrade\\\",\\\"pro-reactivate\\\",\\\"pro-paid\\\",\\\"visualize\\\",\\\"launchpad\\\",\\\"code-collab\\\",\\\"integrations\\\",\\\"more\\\"],\\\"manaullyOpened\\\":false}],[\\\"GitHub.copilot#copilotWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"copilot.signin\\\",\\\"copilot.firstsuggest\\\",\\\"copilot.chatWin\\\",\\\"copilot.chatNonWin\\\",\\\"copilot.realfiles.openrecent\\\",\\\"copilot.realfiles.quickopen\\\",\\\"copilot.iterate\\\",\\\"copilot.creativity\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-azuretools.vscode-docker#dockerStart\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"openFolder\\\",\\\"openFolderMac\\\",\\\"scaffold\\\",\\\"buildImage\\\",\\\"runContainer\\\",\\\"dockerExplorer\\\",\\\"pushImage\\\",\\\"azDeploy\\\",\\\"learn\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"python.createPythonFolder\\\",\\\"python.createPythonFile\\\",\\\"python.installPythonWin8\\\",\\\"python.installPythonMac\\\",\\\"python.installPythonLinux\\\",\\\"python.createEnvironment\\\",\\\"python.runAndDebug\\\",\\\"python.learnMoreWithDS\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-python.python#pythonDataScienceWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"python.installJupyterExt\\\",\\\"python.createNewNotebook\\\",\\\"python.openInteractiveWindow\\\",\\\"python.dataScienceLearnMore\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-vscode.cpptools#cppWelcome\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"awaiting.activation.mac\\\",\\\"awaiting.activation.linux\\\",\\\"awaiting.activation.windows\\\",\\\"awaiting.activation.windows10\\\",\\\"awaiting.activation.windows11\\\",\\\"no.compilers.found.mac\\\",\\\"no.compilers.found.linux\\\",\\\"no.compilers.found.windows\\\",\\\"no.compilers.found.windows10\\\",\\\"no.compilers.found.windows11\\\",\\\"verify.compiler.mac\\\",\\\"verify.compiler.linux\\\",\\\"verify.compiler.windows\\\",\\\"verify.compiler.windows10\\\",\\\"verify.compiler.windows11\\\",\\\"create.cpp.file\\\",\\\"relaunch.developer.command.prompt.windows\\\",\\\"run.project.mac\\\",\\\"run.project.linux\\\",\\\"run.project.windows\\\",\\\"customize.debugging.linux\\\",\\\"customize.debugging.windows\\\",\\\"customize.debugging.mac\\\"],\\\"manaullyOpened\\\":false}],[\\\"ms-vscode.remote-repositories#remoteRepositoriesWalkthrough\\\",{\\\"firstSeen\\\":1721674347260,\\\"stepIDs\\\":[\\\"editCommitRepo\\\",\\\"createGitHubPullRequest\\\",\\\"continueOn\\\",\\\"openRepo\\\",\\\"remoteIndicator\\\"],\\\"manaullyOpened\\\":false}]]\",\"csharp.1.lastSessionDate\":\"Mon Jul 22 2024\",\"csharp.1.sessionCount\":\"219\",\"extensionTips/promptedExecutableTips\":\"{\\\"wsl\\\":[\\\"ms-vscode-remote.remote-wsl\\\"],\\\"docker\\\":[\\\"ms-vscode-remote.remote-containers\\\"]}\",\"workbench.panel.alignment\":\"center\",\"workbench.statusbar.hidden\":\"[\\\"ms-vscode.cmake-tools\\\",\\\"status.feedback\\\",\\\"mindaro.mindaro\\\",\\\"atlassian.atlascode\\\",\\\"status.workspaceTrust.1621579629793\\\",\\\"status.workspaceTrust.1629938235871\\\",\\\"status.workspaceTrust.1632537148791\\\",\\\"status.workspaceTrust.98d10f2f9493fc1801e2e9645a265f86\\\",\\\"status.workspaceTrust.1632885715911\\\",\\\"status.workspaceTrust.1632885779698\\\",\\\"status.workspaceTrust.1632972072346\\\",\\\"status.workspaceTrust.1642884826669\\\",\\\"status.workspaceTrust.1651969561853\\\",\\\"status.workspaceTrust.1653083347523\\\",\\\"status.workspaceTrust.1657157504982\\\",\\\"status.workspaceTrust.1657157570490\\\",\\\"status.workspaceTrust.1657157616527\\\",\\\"status.workspaceTrust.1658177688125\\\",\\\"status.workspaceTrust.1659132204306\\\",\\\"status.workspaceTrust.1660409095580\\\",\\\"status.workspaceTrust.1660420571411\\\",\\\"status.workspaceTrust.1660534311024\\\",\\\"status.workspaceTrust.1661908552539\\\",\\\"status.workspaceTrust.1661921193085\\\",\\\"status.workspaceTrust.1662399930586\\\",\\\"status.workspaceTrust.1662487352194\\\",\\\"status.workspaceTrust.1662488129833\\\",\\\"status.workspaceTrust.1662489133851\\\",\\\"status.workspaceTrust.1662489273360\\\",\\\"status.workspaceTrust.1662489740820\\\",\\\"status.workspaceTrust.1662495081482\\\",\\\"status.workspaceTrust.1662758801137\\\",\\\"status.workspaceTrust.ff7e0055879de07da01d4fe46d0c91f0\\\",\\\"status.workspaceTrust.1662759069488\\\",\\\"status.workspaceTrust.1662759155946\\\",\\\"status.workspaceTrust.812bc79c982c821e6883b3b54c67f371\\\",\\\"status.workspaceTrust.1662772901070\\\",\\\"status.workspaceTrust.3080b26e0647791886cef6ca70af761b\\\",\\\"status.workspaceTrust.1662774553425\\\",\\\"status.workspaceTrust.93f818e7089d9c38535846ef90270c28\\\",\\\"status.workspaceTrust.e683ea29db54c408313184ef1a948f2c\\\",\\\"status.workspaceTrust.1663120393789\\\",\\\"status.workspaceTrust.1663183840247\\\",\\\"status.workspaceTrust.1663186176073\\\",\\\"status.workspaceTrust.e7d945e3f9f454a1f858ae3476fc2626\\\",\\\"status.workspaceTrust.7c5bc2c7a33f23750990217b9792001c\\\",\\\"status.workspaceTrust.1664835031599\\\",\\\"status.workspaceTrust.1665096102153\\\",\\\"status.workspaceTrust.1665383384373\\\",\\\"status.workspaceTrust.1666422343842\\\",\\\"status.workspaceTrust.1667607210771\\\",\\\"status.workspaceTrust.639a1f30cc7ca463968e2a8a0f908bc5\\\",\\\"status.workspaceTrust.1668038634418\\\",\\\"status.workspaceTrust.1668041463221\\\",\\\"status.workspaceTrust.1668042254756\\\",\\\"status.workspaceTrust.1668042566525\\\",\\\"status.workspaceTrust.c2bf6ad7540d8581a49ad9529ee4bf73\\\",\\\"status.workspaceTrust.1669073911252\\\",\\\"status.workspaceTrust.1669940761038\\\",\\\"status.workspaceTrust.1670434203702\\\",\\\"status.workspaceTrust.49dd806ff78f0e24d60efbab896c767d\\\",\\\"status.workspaceTrust.2393b9ac107fee6b4bf69ed5d3384f27\\\",\\\"status.workspaceTrust.6f5cb1ee031ee55d761462fe5ec86ddd\\\",\\\"status.workspaceTrust.1673166014048\\\",\\\"status.workspaceTrust.1673165872090\\\",\\\"status.workspaceTrust.1675380551811\\\",\\\"status.workspaceTrust.71c571c7a4f01cc74f6237907dc68b65\\\",\\\"status.workspaceTrust.1675382899978\\\",\\\"status.workspaceTrust.1679028556013\\\",\\\"status.workspaceTrust.1679028722774\\\",\\\"status.workspaceTrust.1680041091605\\\",\\\"status.workspaceTrust.1680463219986\\\",\\\"status.workspaceTrust.bfa51580c1a9dc960d6e56bcc5a33ce7\\\",\\\"status.workspaceTrust.1681172243350\\\",\\\"status.workspaceTrust.1681172247710\\\",\\\"status.workspaceTrust.1681417920061\\\",\\\"status.workspaceTrust.1682233402109\\\",\\\"status.workspaceTrust.1682233639535\\\",\\\"status.workspaceTrust.e7e04b8360877ad40d53b80cc31f253e\\\",\\\"status.workspaceTrust.1687056491413\\\",\\\"status.workspaceTrust.1688932607442\\\",\\\"status.workspaceTrust.1688938795948\\\",\\\"status.workspaceTrust.1689734711304\\\",\\\"status.workspaceTrust.1689743549758\\\",\\\"status.workspaceTrust.1690179118118\\\",\\\"status.workspaceTrust.1690629574115\\\",\\\"status.workspaceTrust.1690629772910\\\",\\\"status.workspaceTrust.1690630591819\\\",\\\"status.workspaceTrust.1690631249856\\\",\\\"status.workspaceTrust.59a764e0b535bf8301b1d7f0106a509d\\\",\\\"status.workspaceTrust.1690631454021\\\",\\\"status.workspaceTrust.1690631471819\\\",\\\"status.workspaceTrust.1690631936567\\\",\\\"status.workspaceTrust.1690632053081\\\",\\\"status.workspaceTrust.1690632060605\\\",\\\"status.workspaceTrust.1690632094565\\\",\\\"status.workspaceTrust.1690881757362\\\",\\\"status.workspaceTrust.1690882132349\\\",\\\"status.workspaceTrust.1691062039560\\\",\\\"status.workspaceTrust.5106276a004d631a8a89fc1737d5bdc5\\\",\\\"status.workspaceTrust.1691144724264\\\",\\\"status.workspaceTrust.1691144891488\\\",\\\"status.workspaceTrust.1691145837755\\\",\\\"status.workspaceTrust.1691146206439\\\",\\\"status.workspaceTrust.1691146298537\\\",\\\"status.workspaceTrust.1691146339979\\\",\\\"status.workspaceTrust.1691531308640\\\",\\\"status.workspaceTrust.1691939601313\\\",\\\"status.workspaceTrust.1693184671752\\\",\\\"status.workspaceTrust.618a3f0bdb002acc520be7d258605126\\\",\\\"status.workspaceTrust.e61d85b721f377d4709ad1d2ee546337\\\",\\\"status.workspaceTrust.1693188561842\\\",\\\"status.workspaceTrust.1fa9573bc6bae80a06d3a109c628e8d4\\\",\\\"status.workspaceTrust.1693365880955\\\",\\\"status.workspaceTrust.1693381026116\\\",\\\"status.workspaceTrust.1693381044164\\\",\\\"status.workspaceTrust.aff81d9ff4da33ac0c53e9aa110d7645\\\",\\\"status.workspaceTrust.1693456179435\\\",\\\"status.workspaceTrust.1693459290692\\\",\\\"status.workspaceTrust.1693637542105\\\",\\\"status.workspaceTrust.fc58d27d80224a155d537b7864bd4c84\\\",\\\"status.workspaceTrust.1693645899627\\\",\\\"status.workspaceTrust.bbe2dba3c1c59639167386a3865ce670\\\",\\\"status.workspaceTrust.c9f98d01e6910ad2e30ee2dfc755d5c6\\\",\\\"status.workspaceTrust.c9b4f0b9e6a3c2f90783a60f313587f5\\\",\\\"status.workspaceTrust.1695435675547\\\",\\\"status.workspaceTrust.1696319828813\\\",\\\"status.workspaceTrust.553362f632f65cb2c023d6ac7c2e57f1\\\",\\\"status.workspaceTrust.1697504367108\\\",\\\"status.workspaceTrust.80cbe5bfe961e953a9465d3efda01f4f\\\",\\\"status.workspaceTrust.59ea7b5d7968c92ecdf5ceaceee71df9\\\",\\\"status.workspaceTrust.09d00a6357ea4fdf5313d8d2b9063fb9\\\",\\\"status.workspaceTrust.1698903319743\\\",\\\"status.workspaceTrust.1699074246717\\\",\\\"status.workspaceTrust.1699519926358\\\",\\\"status.workspaceTrust.1700647378448\\\",\\\"status.workspaceTrust.1700739389648\\\",\\\"status.workspaceTrust.1700742950383\\\",\\\"status.workspaceTrust.1701960495809\\\",\\\"status.workspaceTrust.1702013066482\\\",\\\"status.workspaceTrust.10a911dec1a5ff51f292d2c0ca22599a\\\",\\\"status.workspaceTrust.1702017791569\\\",\\\"status.workspaceTrust.1703545873467\\\",\\\"status.workspaceTrust.1704976411957\\\"]\",\"commandPalette.mru.cache\":\"{\\\"usesLRU\\\":true,\\\"entries\\\":[{\\\"key\\\":\\\"java.runtime\\\",\\\"value\\\":5},{\\\"key\\\":\\\"gitlens.enableDebugLogging\\\",\\\"value\\\":7},{\\\"key\\\":\\\"gitlens.plus.hide\\\",\\\"value\\\":8},{\\\"key\\\":\\\"workbench.action.toggleKeybindingsLog\\\",\\\"value\\\":9},{\\\"key\\\":\\\"search.action.clearHistory\\\",\\\"value\\\":10},{\\\"key\\\":\\\"workbench.profiles.actions.cleanupProfiles\\\",\\\"value\\\":11},{\\\"key\\\":\\\"resetGettingStartedProgress\\\",\\\"value\\\":13},{\\\"key\\\":\\\"workbench.profiles.actions.resetWorkspaces\\\",\\\"value\\\":14},{\\\"key\\\":\\\"workbench.extensions.action.refreshExtension\\\",\\\"value\\\":16},{\\\"key\\\":\\\"workbench.extensions.action.enableAll\\\",\\\"value\\\":17},{\\\"key\\\":\\\"pylance.indexing.clearPersistedIndices\\\",\\\"value\\\":19},{\\\"key\\\":\\\"workbench.action.reloadWindow\\\",\\\"value\\\":31},{\\\"key\\\":\\\"workbench.action.openSettingsJson\\\",\\\"value\\\":32},{\\\"key\\\":\\\"python.clearWorkspaceInterpreter\\\",\\\"value\\\":33},{\\\"key\\\":\\\"python.clearCacheAndReload\\\",\\\"value\\\":34}]}\",\"commandPalette.mru.counter\":\"35\",\"workbench.view.extension.tabnine.state.hidden\":\"[{\\\"id\\\":\\\"tabnine.chat\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.loading\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.preview_ended\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.authenticate\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"tabnine.chat.not_part_of_a_team\\\",\\\"isHidden\\\":false}]\",\"Comments.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.comments\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.mintdocs.state.hidden\":\"[{\\\"id\\\":\\\"docs\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"formatOptions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"progress\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"languageOptions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"team\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"hotkeyOptions\\\",\\\"isHidden\\\":false}]\",\"extensionsAssistant/deprecated\":\"[\\\"dongli.python-preview\\\"]\",\"snippets.usageTimestamps\":\"[[\\\"snippets/modules.json/__init__() from the logging module\\\",1693645332771],[\\\"snippets/modules.json/main() from the py_compile module\\\",1712862626745],[\\\"snippets/modules.json/request() from the http.client module\\\",1712862629845],[\\\"snippets/modules.json/length() from the xml.dom module\\\",1713135565321],[\\\"snippets/modules.json/Class from the symtable module\\\",1714100265267],[\\\"snippets/modules.json/datetime A combination of a date and a time. Attributes: () from the datetime module\\\",1714592817409]]\",\"tabnine-Ferreyra Carlos Eduardo\":\"[{\\\"id\\\":\\\"tabnine.tabnine-vscode\\\",\\\"name\\\":\\\"Tabnine AI\\\",\\\"allowed\\\":true}]\",\"fileBasedRecommendations/promptedRecommendations\":\"{\\\"makefile\\\":[\\\"ms-vscode.makefile-tools\\\"],\\\"powershell\\\":[\\\"ms-vscode.powershell\\\"],\\\"yaml\\\":[\\\"github.vscode-github-actions\\\"],\\\"java\\\":[\\\"vscjava.vscode-java-pack\\\"]}\",\"tabs-list-width-horizontal\":\"137\",\"workbench.welcomePage.hiddenCategories\":\"[]\",\"workbench.view.extension.package-explorer.state.hidden\":\"[{\\\"id\\\":\\\"pythonEnvironments\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workspaceEnvironments\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.figma.state.hidden\":\"[{\\\"id\\\":\\\"figma.views.login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.dummyLoginNotifications\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.files\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"figma.views.notifications\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-pull-request.state.hidden\":\"[{\\\"id\\\":\\\"github:createPullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChanges\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"prStatus:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:activePullRequest:welcome\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:createPullRequestWebview\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesFiles\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:compareChangesCommits\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extensions.state.hidden\":\"[{\\\"id\\\":\\\"workbench.views.extensions.installed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchOutdated\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.workspaceRecommendations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.popular\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchRecentlyUpdated\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.otherRecommendations\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extensions.recommendedList\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.enabled\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"workbench.views.extensions.disabled\\\",\\\"isHidden\\\":true},{\\\"id\\\":\\\"workbench.views.extensions.marketplace\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchInstalled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchEnabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchDisabled\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchBuiltin\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.searchWorkspaceUnsupported\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinFeatureExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinThemeExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.builtinProgrammingLanguageExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.untrustedUnsupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.untrustedPartiallySupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.virtualUnsupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.virtualPartiallySupportedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.deprecatedExtensions\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.local.installed\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.views.extensions.remote.installed\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.project-manager.state.hidden\":\"[{\\\"id\\\":\\\"projectsExplorerFavorites\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerGit\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerSVN\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerAny\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerMercurial\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectsExplorerVSCode\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"projectManagerHelpAndFeedback\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitlens.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.home\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.workspaces\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.account\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.drafts\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.gitlensInspect.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.commitDetails\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.lineHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.fileHistory\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.timeline\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.searchAndCompare\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.pullRequest\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-pull-requests.state.hidden\":\"[{\\\"id\\\":\\\"github:login\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"pr:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"issues:github\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github:conflictResolution\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.dockerView.state.hidden\":\"[{\\\"id\\\":\\\"dockerContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerImages\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerRegistries\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerNetworks\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"dockerVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.dockerContexts\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-docker.views.help\\\",\\\"isHidden\\\":false}]\",\"workbench.view.remote.state.hidden\":\"[{\\\"id\\\":\\\"targetsContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"detailsContainers\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"devVolumes\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"targetsWsl\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"remoteTargets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"remoteHub.views.workspaceRepositories\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"~remote.helpPanel\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.makefile__viewContainer.state.hidden\":\"[{\\\"id\\\":\\\"makefile.outline\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.test.state.hidden\":\"[{\\\"id\\\":\\\"workbench.view.testing\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"test-explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"workbench.view.testCoverage\\\",\\\"isHidden\\\":false}]\",\"nps/isCandidate\":\"true\",\"~remote.forwardedPortsContainer.hidden\":\"[{\\\"id\\\":\\\"~remote.forwardedPorts\\\",\\\"isHidden\\\":false}]\",\"ces/skipSurvey\":\"1.85.1\",\"workbench.view.extension.codeium.state.hidden\":\"[{\\\"id\\\":\\\"codeium.chatPanelView\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"codeium.searchPanelView\\\",\\\"isHidden\\\":false}]\",\"codeium_auth-Ferreyra Carlos Eduardo (Ferreyra, Carlos Eduardo)\":\"[{\\\"id\\\":\\\"codeium.codeium\\\",\\\"name\\\":\\\"Codeium: AI Coding Autocomplete and Chat for Python, Javascript, Typescript, Java, Go, and more\\\",\\\"allowed\\\":true}]\",\"userDataProfiles.state.hidden\":\"[{\\\"id\\\":\\\"workbench.views.profiles.export.preview\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.1-cloudCodeContainer.state.hidden\":\"[{\\\"id\\\":\\\"cloudcode.unified.kubernetes.localDevExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.kubectlExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudRunExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apiExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.secretsExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gceExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.apigee.explorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.gcfExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.awsLambdaImporterExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.cloudStorageExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.sourceProtectExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.unified.mcdcSources\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"cloudcode.helpAndFeedbackExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.1-cloudCodeDuetAIChatViewContainer.state.hidden\":\"[{\\\"id\\\":\\\"cloudcode.duetAI.chatView\\\",\\\"isHidden\\\":false}]\",\"terminal.integrated.showTerminalConfigPrompt\":\"false\",\"workbench.view.extension.1-geminiAIChatViewContainer.state.hidden\":\"[{\\\"id\\\":\\\"cloudcode.gemini.chatView\\\",\\\"isHidden\\\":false}]\",\"javascript.1.editedCount\":\"7\",\"javascript.1.editedDate\":\"Tue Jun 25 2024\",\"memento/workbench.editor.keybindings\":\"{\\\"searchHistory\\\":[\\\"omm\\\",\\\"comm\\\",\\\"command+\\\",\\\"command+t\\\",\\\"terminal \\\",\\\"co\\\",\\\"command e c\\\",\\\"command e command t\\\",\\\"command e com\\\",\\\"command e\\\",\\\"com\\\",\\\"ter\\\",\\\"terminal create\\\",\\\"integrated\\\",\\\"terminal\\\",\\\"comment\\\",\\\"copilot\\\"]}\",\"http.linkProtectionTrustedDomains\":\"[\\\"https://accounts.google.com\\\"]\",\"workbench.panel.chatSidebar.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false}]\",\"typescript.1.editedCount\":\"1\",\"typescript.1.editedDate\":\"Fri May 03 2024\",\"workbench.view.extension.vscode-edge-devtools-view.state.hidden\":\"[{\\\"id\\\":\\\"vscode-edge-devtools-view.targets\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"vscode-edge-devtools-view.help-links\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-actions.state.hidden\":\"[{\\\"id\\\":\\\"github-actions.current-branch\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.workflows\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.settings\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"github-actions.empty-view\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-cweijan-mysql.state.hidden\":\"[{\\\"id\\\":\\\"github.cweijan.mysql\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.github-cweijan-nosql.state.hidden\":\"[{\\\"id\\\":\\\"github.cweijan.nosql\\\",\\\"isHidden\\\":false}]\",\"remoteTunnelServicePromptedPreview\":\"true\",\"remoteTunnelServiceUsed\":\"{\\\"hostName\\\":\\\"carloss-laptoplocal\\\",\\\"timeStamp\\\":1716488963137}\",\"workbench.view.extension.liveshare.state.hidden\":\"[{\\\"id\\\":\\\"liveshare.session\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.help\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"liveshare.devtools\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.kubernetesView.state.hidden\":\"[{\\\"id\\\":\\\"extension.vsKubernetesExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"extension.vsKubernetesHelmRepoExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"kubernetes.cloudExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.sqltoolsActivityBarContainer.state.hidden\":\"[{\\\"id\\\":\\\"sqltoolsViewConnectionExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewBookmarksExplorer\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"sqltoolsViewHistoryExplorer\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.sqltoolsPanelContainer.state.hidden\":\"[{\\\"id\\\":\\\"sqltoolsViewConsoleMessages\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.codegpt-sidebar-view.state.hidden\":\"[{\\\"id\\\":\\\"codegpt-sidebar\\\",\\\"isHidden\\\":false}]\",\"github-carlosferreyra\":\"[{\\\"id\\\":\\\"github.copilot\\\",\\\"name\\\":\\\"GitHub Copilot\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"github.copilot-chat\\\",\\\"name\\\":\\\"GitHub Copilot Chat\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"vscode.configuration-editing\\\",\\\"name\\\":\\\"Configuration Editing\\\",\\\"allowed\\\":true},{\\\"id\\\":\\\"github.vscode-github-actions\\\",\\\"name\\\":\\\"GitHub Actions\\\",\\\"allowed\\\":true}]\",\"extension.features.state\":\"{\\\"GitHub.copilot-chat\\\":{\\\"languageModels\\\":{\\\"disabled\\\":false,\\\"accessCount\\\":469}}}\",\"languageModelAccess.copilot-gpt-4\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.copilot-gpt-4\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":0,\\\"tokenCount\\\":0,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.workspace\\\",\\\"requestCount\\\":22,\\\"tokenCount\\\":25134},{\\\"id\\\":\\\"github.copilot.default\\\",\\\"requestCount\\\":33,\\\"tokenCount\\\":39027},{\\\"id\\\":\\\"github.copilot.vscode\\\",\\\"requestCount\\\":3,\\\"tokenCount\\\":8163},{\\\"id\\\":\\\"github.copilot.terminal\\\",\\\"requestCount\\\":8,\\\"tokenCount\\\":4476}]}]}\",\"languageModelAccess.copilot-gpt-3.5-turbo\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.copilot-gpt-3.5-turbo\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":61,\\\"tokenCount\\\":94102,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.editor\\\",\\\"requestCount\\\":133,\\\"tokenCount\\\":53458}]}]}\",\"workbench.auxiliarybar.pinnedPanels\":\"[{\\\"id\\\":\\\"workbench.panel.chatSidebar\\\",\\\"pinned\\\":true,\\\"visible\\\":false,\\\"order\\\":100},{\\\"id\\\":\\\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28\\\",\\\"pinned\\\":true,\\\"visible\\\":false}]\",\"views.customizations\":\"{\\\"viewContainerLocations\\\":{\\\"workbench.panel.chatSidebar\\\":2,\\\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28\\\":2},\\\"viewLocations\\\":{\\\"workbench.panel.chat.view.copilot\\\":\\\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28\\\"},\\\"viewContainerBadgeEnablementStates\\\":{}}\",\"remote.tunnels.toRestore.undefined.-219061745\":\"[{\\\"remoteHost\\\":\\\"localhost\\\",\\\"remotePort\\\":8000,\\\"localAddress\\\":\\\"https://lvsknjvk-8000.brs.devtunnels.ms/\\\",\\\"localUri\\\":{\\\"$mid\\\":1,\\\"path\\\":\\\"/\\\",\\\"scheme\\\":\\\"https\\\",\\\"authority\\\":\\\"lvsknjvk-8000.brs.devtunnels.ms\\\"},\\\"protocol\\\":\\\"http\\\",\\\"source\\\":{\\\"source\\\":0,\\\"description\\\":\\\"User Forwarded\\\"}}]\",\"remote.tunnels.toRestoreExpiration.undefined.-219061745\":\"1718366097271\",\"languageModelAccess.gpt-3.5-turbo\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.gpt-3.5-turbo\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":9,\\\"tokenCount\\\":15668,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.editor\\\",\\\"requestCount\\\":147,\\\"tokenCount\\\":90412},{\\\"id\\\":\\\"git-commit\\\",\\\"requestCount\\\":35,\\\"tokenCount\\\":45588}]}]}\",\"languageModelAccess.gpt-4-0125-preview\":\"[\\\"github.copilot-chat\\\"]\",\"languageModelStats.gpt-4-0125-preview\":\"{\\\"extensions\\\":[{\\\"extensionId\\\":\\\"GitHub.copilot-chat\\\",\\\"requestCount\\\":0,\\\"tokenCount\\\":0,\\\"participants\\\":[{\\\"id\\\":\\\"github.copilot.workspace\\\",\\\"requestCount\\\":5,\\\"tokenCount\\\":8978},{\\\"id\\\":\\\"github.copilot.default\\\",\\\"requestCount\\\":5,\\\"tokenCount\\\":12523},{\\\"id\\\":\\\"github.copilot.terminal\\\",\\\"requestCount\\\":8,\\\"tokenCount\\\":4567}]}]}\",\"refactorPreview.hidden\":\"[{\\\"id\\\":\\\"refactorPreview\\\",\\\"isHidden\\\":false}]\",\"terminal-inline-chat-history\":\"[\\\"install yarn\\\",\\\"don't remember the rest of the cmd\\\",\\\"complete the command to generate the docs\\\"]\",\"workbench.views.service.auxiliarybar.9efd7744-aead-42ca-bbcd-ac5d75eb8f28.state.hidden\":\"[{\\\"id\\\":\\\"workbench.panel.chat.view.copilot\\\",\\\"isHidden\\\":false}]\",\"workbench.view.extension.msg-view.state.hidden\":\"[{\\\"id\\\":\\\"msg.openEditors\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"msg.connections\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"msg.oci\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"msg.shellTasks\\\",\\\"isHidden\\\":false}]\",\"scm.input.lastActionId\":\"github.copilot.git.generateCommitMessage\",\"java.2.editedCount\":\"1\",\"java.2.editedDate\":\"Mon Jul 15 2024\",\"workbench.view.extension.gitlensPanel.state.hidden\":\"[{\\\"id\\\":\\\"gitlens.views.graph\\\",\\\"isHidden\\\":false},{\\\"id\\\":\\\"gitlens.views.graphDetails\\\",\\\"isHidden\\\":false}]\",\"memento/gettingStartedService\":\"{\\\"commandPaletteTask\\\":{\\\"done\\\":true},\\\"commandPaletteTaskWeb\\\":{\\\"done\\\":true},\\\"pickColorTheme\\\":{\\\"done\\\":true},\\\"pickColorThemeWeb\\\":{\\\"done\\\":true}}\",\"microsoft-jadu_015@hotmail.com\":\"[{\\\"id\\\":\\\"ms-vscode.remote-server\\\",\\\"name\\\":\\\"Remote - Tunnels\\\",\\\"allowed\\\":true}]\",\"expandSuggestionDocs\":\"true\"}}"} \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..937294f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,34 @@ +# Use the official Python image from the Docker Hub +FROM python:3.12-slim-bullseye + +# Set environment variables +ENV SECRET_KEY=${DJANGO_SECRET_KEY} +ENV DJANGO_SETTINGS_MODULE=server.settings.base +ENV PYTHONDONTWRITEBYTECODE=1 +ENV PYTHONUNBUFFERED=1 + +# Set the working directory +WORKDIR /app + +# Copy the requirements file and install dependencies +COPY requirements.txt . +RUN pip install --upgrade pip && pip install -r requirements.txt + +# Copy the entire backend directory +COPY backend/ . + +# Collect static files +RUN python manage.py collectstatic --noinput + +# Make migrations and migrate the database +RUN python manage.py makemigrations +RUN python manage.py migrate + +# Generate the OpenAPI schema +RUN python manage.py spectacular --color --file schema.yml --validate + +# Expose port 8000 for the Django app +EXPOSE 8000 + +# Run the application +CMD ["gunicorn", "server.wsgi:application", "--bind", "0.0.0.0:8000"] \ No newline at end of file diff --git a/FrontAdmin/.env.production b/FrontAdmin/.env.production new file mode 100644 index 0000000..30d03a3 --- /dev/null +++ b/FrontAdmin/.env.production @@ -0,0 +1 @@ +VITE_API_URL=http://djangobackend.us-east-1.elasticbeanstalk.com/api/swagger-ui/ \ No newline at end of file diff --git a/FrontAdmin/.eslintrc.cjs b/FrontAdmin/.eslintrc.cjs new file mode 100644 index 0000000..97e94fc --- /dev/null +++ b/FrontAdmin/.eslintrc.cjs @@ -0,0 +1,21 @@ +module.exports = { + root: true, + env: { browser: true, es2020: true }, + extends: [ + "eslint:recommended", + "plugin:@typescript-eslint/recommended", + "plugin:react-hooks/recommended", + ], + ignorePatterns: ["dist", ".eslintrc.cjs"], + parser: "@typescript-eslint/parser", + plugins: ["react-refresh"], + rules: { + "react-refresh/only-export-components": [ + "warn", + { allowConstantExport: true }, + ], + "@typescript-eslint/prefer-as-const": "warn", // Warning de la regla que requiere const en lugar de type assertion + "@typescript-eslint/no-unused-vars": "warn", // Warning de la regla que indica variables no usadas + "no-extra-semi": "warn", // Warning de la regla que prohíbe los puntos y comas innecesarios + }, +}; diff --git a/FrontAdmin/index.html b/FrontAdmin/index.html new file mode 100644 index 0000000..3459bec --- /dev/null +++ b/FrontAdmin/index.html @@ -0,0 +1,13 @@ + + + + + + + TUP + + +
+ + + diff --git a/FrontAdmin/package-lock.json b/FrontAdmin/package-lock.json new file mode 100644 index 0000000..f7d13e5 --- /dev/null +++ b/FrontAdmin/package-lock.json @@ -0,0 +1,4973 @@ +{ + "name": "frontadmin", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontadmin", + "version": "0.0.0", + "dependencies": { + "@chakra-ui/icons": "^2.1.1", + "@chakra-ui/react": "^2.8.2", + "@types/react-router-dom": "^5.3.3", + "chart.js": "^4.4.3", + "date-fns": "^3.6.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-datepicker": "^6.9.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-router-dom": "^6.23.1" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-datepicker": "^6.2.0", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "peer": true, + "dependencies": { + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", + "peer": true, + "dependencies": { + "@babel/types": "^7.24.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.5.tgz", + "integrity": "sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==", + "peer": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.5.tgz", + "integrity": "sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==", + "peer": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.5", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": 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==", + "peer": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.5.tgz", + "integrity": "sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==", + "peer": true, + "dependencies": { + "@babel/helper-string-parser": "^7.24.1", + "@babel/helper-validator-identifier": "^7.24.5", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@chakra-ui/accordion": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/accordion/-/accordion-2.3.1.tgz", + "integrity": "sha512-FSXRm8iClFyU+gVaXisOSEw0/4Q+qZbFRiuhIAkVU6Boj0FxAMrlo9a8AV5TuF77rgaHytCdHk0Ng+cyUijrag==", + "dependencies": { + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/alert": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/alert/-/alert-2.2.2.tgz", + "integrity": "sha512-jHg4LYMRNOJH830ViLuicjb3F+v6iriE/2G5T+Sd0Hna04nukNJ1MxUmBPE+vI22me2dIflfelu2v9wdB6Pojw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/anatomy": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/anatomy/-/anatomy-2.2.2.tgz", + "integrity": "sha512-MV6D4VLRIHr4PkW4zMyqfrNS1mPlCTiCXwvYGtDFQYr+xHFfonhAuf9WjsSc0nyp2m0OdkSLnzmVKkZFLo25Tg==" + }, + "node_modules/@chakra-ui/avatar": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/avatar/-/avatar-2.3.0.tgz", + "integrity": "sha512-8gKSyLfygnaotbJbDMHDiJoF38OHXUYVme4gGxZ1fLnQEdPVEaIWfH+NndIjOM0z8S+YEFnT9KyGMUtvPrBk3g==", + "dependencies": { + "@chakra-ui/image": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breadcrumb": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/breadcrumb/-/breadcrumb-2.2.0.tgz", + "integrity": "sha512-4cWCG24flYBxjruRi4RJREWTGF74L/KzI2CognAW/d/zWR0CjiScuJhf37Am3LFbCySP6WSoyBOtTIoTA4yLEA==", + "dependencies": { + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/breakpoint-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/breakpoint-utils/-/breakpoint-utils-2.0.8.tgz", + "integrity": "sha512-Pq32MlEX9fwb5j5xx8s18zJMARNHlQZH2VH1RZgfgRDpp7DcEgtRW5AInfN5CfqdHLO1dGxA7I3MqEuL5JnIsA==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + } + }, + "node_modules/@chakra-ui/button": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/button/-/button-2.1.0.tgz", + "integrity": "sha512-95CplwlRKmmUXkdEp/21VkEWgnwcx2TOBG6NfYlsuLBDHSLlo5FKIiE2oSi4zXc4TLcopGcWPNcm/NDaSC5pvA==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/spinner": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/card": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/card/-/card-2.2.0.tgz", + "integrity": "sha512-xUB/k5MURj4CtPAhdSoXZidUbm8j3hci9vnc+eZJVDqhDOShNlD6QeniQNRPRys4lWAQLCbFcrwL29C8naDi6g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/checkbox": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/checkbox/-/checkbox-2.3.2.tgz", + "integrity": "sha512-85g38JIXMEv6M+AcyIGLh7igNtfpAN6KGQFYxY9tBj0eWvWk4NKQxvqqyVta0bSAyIl1rixNIIezNpNWk2iO4g==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/visually-hidden": "2.2.0", + "@zag-js/focus-visible": "0.16.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/clickable": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/clickable/-/clickable-2.1.0.tgz", + "integrity": "sha512-flRA/ClPUGPYabu+/GLREZVZr9j2uyyazCAUHAdrTUEdDYCr31SVGhgh7dgKdtq23bOvAQJpIJjw/0Bs0WvbXw==", + "dependencies": { + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/close-button": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/close-button/-/close-button-2.1.1.tgz", + "integrity": "sha512-gnpENKOanKexswSVpVz7ojZEALl2x5qjLYNqSQGbxz+aP9sOXPfUS56ebyBrre7T7exuWGiFeRwnM0oVeGPaiw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/color-mode": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/color-mode/-/color-mode-2.2.0.tgz", + "integrity": "sha512-niTEA8PALtMWRI9wJ4LL0CSBDo8NBfLNp4GD6/0hstcm3IlbBHTVKxN6HwSaoNYfphDQLxCjT4yG+0BJA5tFpg==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/control-box": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/control-box/-/control-box-2.1.0.tgz", + "integrity": "sha512-gVrRDyXFdMd8E7rulL0SKeoljkLQiPITFnsyMO8EFHNZ+AHt5wK4LIguYVEq88APqAGZGfHFWXr79RYrNiE3Mg==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/counter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/counter/-/counter-2.1.0.tgz", + "integrity": "sha512-s6hZAEcWT5zzjNz2JIWUBzRubo9la/oof1W7EKZVVfPYHERnl5e16FmBC79Yfq8p09LQ+aqFKm/etYoJMMgghw==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/css-reset": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/css-reset/-/css-reset-2.3.0.tgz", + "integrity": "sha512-cQwwBy5O0jzvl0K7PLTLgp8ijqLPKyuEMiDXwYzl95seD3AoeuoCLyzZcJtVqaUZ573PiBdAbY/IlZcwDOItWg==", + "peerDependencies": { + "@emotion/react": ">=10.0.35", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/descendant": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/descendant/-/descendant-3.1.0.tgz", + "integrity": "sha512-VxCIAir08g5w27klLyi7PVo8BxhW4tgU/lxQyujkmi4zx7hT9ZdrcQLAted/dAa+aSIZ14S1oV0Q9lGjsAdxUQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/dom-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/dom-utils/-/dom-utils-2.1.0.tgz", + "integrity": "sha512-ZmF2qRa1QZ0CMLU8M1zCfmw29DmPNtfjR9iTo74U5FPr3i1aoAh7fbJ4qAlZ197Xw9eAW28tvzQuoVWeL5C7fQ==" + }, + "node_modules/@chakra-ui/editable": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/editable/-/editable-3.1.0.tgz", + "integrity": "sha512-j2JLrUL9wgg4YA6jLlbU88370eCRyor7DZQD9lzpY95tSOXpTljeg3uF9eOmDnCs6fxp3zDWIfkgMm/ExhcGTg==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/event-utils": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@chakra-ui/event-utils/-/event-utils-2.0.8.tgz", + "integrity": "sha512-IGM/yGUHS+8TOQrZGpAKOJl/xGBrmRYJrmbHfUE7zrG3PpQyXvbLDP1M+RggkCFVgHlJi2wpYIf0QtQlU0XZfw==" + }, + "node_modules/@chakra-ui/focus-lock": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/focus-lock/-/focus-lock-2.1.0.tgz", + "integrity": "sha512-EmGx4PhWGjm4dpjRqM4Aa+rCWBxP+Rq8Uc/nAVnD4YVqkEhBkrPTpui2lnjsuxqNaZ24fIAZ10cF1hlpemte/w==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "react-focus-lock": "^2.9.4" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/form-control": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/form-control/-/form-control-2.2.0.tgz", + "integrity": "sha512-wehLC1t4fafCVJ2RvJQT2jyqsAwX7KymmiGqBu7nQoQz8ApTkGABWpo/QwDh3F/dBLrouHDoOvGmYTqft3Mirw==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/hooks": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/hooks/-/hooks-2.2.1.tgz", + "integrity": "sha512-RQbTnzl6b1tBjbDPf9zGRo9rf/pQMholsOudTxjy4i9GfTfz6kgp5ValGjQm2z7ng6Z31N1cnjZ1AlSzQ//ZfQ==", + "dependencies": { + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/utils": "2.0.15", + "compute-scroll-into-view": "3.0.3", + "copy-to-clipboard": "3.3.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/icon": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/icon/-/icon-3.2.0.tgz", + "integrity": "sha512-xxjGLvlX2Ys4H0iHrI16t74rG9EBcpFvJ3Y3B7KMQTrnW34Kf7Da/UC8J67Gtx85mTHW020ml85SVPKORWNNKQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/icons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/icons/-/icons-2.1.1.tgz", + "integrity": "sha512-3p30hdo4LlRZTT5CwoAJq3G9fHI0wDc0pBaMHj4SUn0yomO+RcDRlzhdXqdr5cVnzax44sqXJVnf3oQG0eI+4g==", + "dependencies": { + "@chakra-ui/icon": "3.2.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/image": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/image/-/image-2.1.0.tgz", + "integrity": "sha512-bskumBYKLiLMySIWDGcz0+D9Th0jPvmX6xnRMs4o92tT3Od/bW26lahmV2a2Op2ItXeCmRMY+XxJH5Gy1i46VA==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/input": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/input/-/input-2.1.2.tgz", + "integrity": "sha512-GiBbb3EqAA8Ph43yGa6Mc+kUPjh4Spmxp1Pkelr8qtudpc3p2PJOOebLpd90mcqw8UePPa+l6YhhPtp6o0irhw==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/layout": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/layout/-/layout-2.3.1.tgz", + "integrity": "sha512-nXuZ6WRbq0WdgnRgLw+QuxWAHuhDtVX8ElWqcTK+cSMFg/52eVP47czYBE5F35YhnoW2XBwfNoNgZ7+e8Z01Rg==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/lazy-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/lazy-utils/-/lazy-utils-2.0.5.tgz", + "integrity": "sha512-UULqw7FBvcckQk2n3iPO56TMJvDsNv0FKZI6PlUNJVaGsPbsYxK/8IQ60vZgaTVPtVcjY6BE+y6zg8u9HOqpyg==" + }, + "node_modules/@chakra-ui/live-region": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/live-region/-/live-region-2.1.0.tgz", + "integrity": "sha512-ZOxFXwtaLIsXjqnszYYrVuswBhnIHHP+XIgK1vC6DePKtyK590Wg+0J0slDwThUAd4MSSIUa/nNX84x1GMphWw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/media-query": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/media-query/-/media-query-3.3.0.tgz", + "integrity": "sha512-IsTGgFLoICVoPRp9ykOgqmdMotJG0CnPsKvGQeSFOB/dZfIujdVb14TYxDU4+MURXry1MhJ7LzZhv+Ml7cr8/g==", + "dependencies": { + "@chakra-ui/breakpoint-utils": "2.0.8", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/menu": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/menu/-/menu-2.2.1.tgz", + "integrity": "sha512-lJS7XEObzJxsOwWQh7yfG4H8FzFPRP5hVPN/CL+JzytEINCSBvsCDHrYPQGp7jzpCi8vnTqQQGQe0f8dwnXd2g==", + "dependencies": { + "@chakra-ui/clickable": "2.1.0", + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-animation-state": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-focus-effect": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-outside-click": "2.2.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/modal": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/modal/-/modal-2.3.1.tgz", + "integrity": "sha512-TQv1ZaiJMZN+rR9DK0snx/OPwmtaGH1HbZtlYt4W4s6CzyK541fxLRTjIXfEzIGpvNW+b6VFuFjbcR78p4DEoQ==", + "dependencies": { + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/focus-lock": "2.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/transition": "2.1.0", + "aria-hidden": "^1.2.3", + "react-remove-scroll": "^2.5.6" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/number-input": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-input/-/number-input-2.1.2.tgz", + "integrity": "sha512-pfOdX02sqUN0qC2ysuvgVDiws7xZ20XDIlcNhva55Jgm095xjm8eVdIBfNm3SFbSUNxyXvLTW/YQanX74tKmuA==", + "dependencies": { + "@chakra-ui/counter": "2.1.0", + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-interval": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/number-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/number-utils/-/number-utils-2.0.7.tgz", + "integrity": "sha512-yOGxBjXNvLTBvQyhMDqGU0Oj26s91mbAlqKHiuw737AXHt0aPllOthVUqQMeaYLwLCjGMg0jtI7JReRzyi94Dg==" + }, + "node_modules/@chakra-ui/object-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/object-utils/-/object-utils-2.1.0.tgz", + "integrity": "sha512-tgIZOgLHaoti5PYGPTwK3t/cqtcycW0owaiOXoZOcpwwX/vlVb+H1jFsQyWiiwQVPt9RkoSLtxzXamx+aHH+bQ==" + }, + "node_modules/@chakra-ui/pin-input": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/pin-input/-/pin-input-2.1.0.tgz", + "integrity": "sha512-x4vBqLStDxJFMt+jdAHHS8jbh294O53CPQJoL4g228P513rHylV/uPscYUHrVJXRxsHfRztQO9k45jjTYaPRMw==", + "dependencies": { + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popover": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/popover/-/popover-2.2.1.tgz", + "integrity": "sha512-K+2ai2dD0ljvJnlrzesCDT9mNzLifE3noGKZ3QwLqd/K34Ym1W/0aL1ERSynrcG78NKoXS54SdEzkhCZ4Gn/Zg==", + "dependencies": { + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-animation-state": "2.1.0", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-focus-effect": "2.1.0", + "@chakra-ui/react-use-focus-on-pointer-down": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/popper": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/popper/-/popper-3.1.0.tgz", + "integrity": "sha512-ciDdpdYbeFG7og6/6J8lkTFxsSvwTdMLFkpVylAF6VNC22jssiWfquj2eyD4rJnzkRFPvIWJq8hvbfhsm+AjSg==", + "dependencies": { + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@popperjs/core": "^2.9.3" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/portal": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/portal/-/portal-2.1.0.tgz", + "integrity": "sha512-9q9KWf6SArEcIq1gGofNcFPSWEyl+MfJjEUg/un1SMlQjaROOh3zYr+6JAwvcORiX7tyHosnmWC3d3wI2aPSQg==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/progress": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/progress/-/progress-2.2.0.tgz", + "integrity": "sha512-qUXuKbuhN60EzDD9mHR7B67D7p/ZqNS2Aze4Pbl1qGGZfulPW0PY8Rof32qDtttDQBkzQIzFGE8d9QpAemToIQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/provider": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/provider/-/provider-2.4.2.tgz", + "integrity": "sha512-w0Tef5ZCJK1mlJorcSjItCSbyvVuqpvyWdxZiVQmE6fvSJR83wZof42ux0+sfWD+I7rHSfj+f9nzhNaEWClysw==", + "dependencies": { + "@chakra-ui/css-reset": "2.3.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/system": "2.6.2", + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/radio": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/radio/-/radio-2.1.2.tgz", + "integrity": "sha512-n10M46wJrMGbonaghvSRnZ9ToTv/q76Szz284gv4QUWvyljQACcGrXIONUnQ3BIwbOfkRqSk7Xl/JgZtVfll+w==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@zag-js/focus-visible": "0.16.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react": { + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/react/-/react-2.8.2.tgz", + "integrity": "sha512-Hn0moyxxyCDKuR9ywYpqgX8dvjqwu9ArwpIb9wHNYjnODETjLwazgNIliCVBRcJvysGRiV51U2/JtJVrpeCjUQ==", + "dependencies": { + "@chakra-ui/accordion": "2.3.1", + "@chakra-ui/alert": "2.2.2", + "@chakra-ui/avatar": "2.3.0", + "@chakra-ui/breadcrumb": "2.2.0", + "@chakra-ui/button": "2.1.0", + "@chakra-ui/card": "2.2.0", + "@chakra-ui/checkbox": "2.3.2", + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/control-box": "2.1.0", + "@chakra-ui/counter": "2.1.0", + "@chakra-ui/css-reset": "2.3.0", + "@chakra-ui/editable": "3.1.0", + "@chakra-ui/focus-lock": "2.1.0", + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/hooks": "2.2.1", + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/image": "2.1.0", + "@chakra-ui/input": "2.1.2", + "@chakra-ui/layout": "2.3.1", + "@chakra-ui/live-region": "2.1.0", + "@chakra-ui/media-query": "3.3.0", + "@chakra-ui/menu": "2.2.1", + "@chakra-ui/modal": "2.3.1", + "@chakra-ui/number-input": "2.1.2", + "@chakra-ui/pin-input": "2.1.0", + "@chakra-ui/popover": "2.2.1", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/progress": "2.2.0", + "@chakra-ui/provider": "2.4.2", + "@chakra-ui/radio": "2.1.2", + "@chakra-ui/react-env": "3.1.0", + "@chakra-ui/select": "2.1.2", + "@chakra-ui/skeleton": "2.1.0", + "@chakra-ui/skip-nav": "2.1.0", + "@chakra-ui/slider": "2.1.0", + "@chakra-ui/spinner": "2.1.0", + "@chakra-ui/stat": "2.1.1", + "@chakra-ui/stepper": "2.3.1", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/switch": "2.1.2", + "@chakra-ui/system": "2.6.2", + "@chakra-ui/table": "2.1.0", + "@chakra-ui/tabs": "3.0.0", + "@chakra-ui/tag": "3.1.1", + "@chakra-ui/textarea": "2.1.2", + "@chakra-ui/theme": "3.3.1", + "@chakra-ui/theme-utils": "2.0.21", + "@chakra-ui/toast": "7.0.2", + "@chakra-ui/tooltip": "2.3.1", + "@chakra-ui/transition": "2.1.0", + "@chakra-ui/utils": "2.0.15", + "@chakra-ui/visually-hidden": "2.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/react-children-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-children-utils/-/react-children-utils-2.0.6.tgz", + "integrity": "sha512-QVR2RC7QsOsbWwEnq9YduhpqSFnZGvjjGREV8ygKi8ADhXh93C8azLECCUVgRJF2Wc+So1fgxmjLcbZfY2VmBA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-context": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-context/-/react-context-2.1.0.tgz", + "integrity": "sha512-iahyStvzQ4AOwKwdPReLGfDesGG+vWJfEsn0X/NoGph/SkN+HXtv2sCfYFFR9k7bb+Kvc6YfpLlSuLvKMHi2+w==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-env": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-env/-/react-env-3.1.0.tgz", + "integrity": "sha512-Vr96GV2LNBth3+IKzr/rq1IcnkXv+MLmwjQH6C8BRtn3sNskgDFD5vLkVXcEhagzZMCh8FR3V/bzZPojBOyNhw==", + "dependencies": { + "@chakra-ui/react-use-safe-layout-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-types/-/react-types-2.0.7.tgz", + "integrity": "sha512-12zv2qIZ8EHwiytggtGvo4iLT0APris7T0qaAWqzpUGS0cdUtR8W+V1BJ5Ocq+7tA6dzQ/7+w5hmXih61TuhWQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-animation-state": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-animation-state/-/react-use-animation-state-2.1.0.tgz", + "integrity": "sha512-CFZkQU3gmDBwhqy0vC1ryf90BVHxVN8cTLpSyCpdmExUEtSEInSCGMydj2fvn7QXsz/za8JNdO2xxgJwxpLMtg==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-callback-ref": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-callback-ref/-/react-use-callback-ref-2.1.0.tgz", + "integrity": "sha512-efnJrBtGDa4YaxDzDE90EnKD3Vkh5a1t3w7PhnRQmsphLy3g2UieasoKTlT2Hn118TwDjIv5ZjHJW6HbzXA9wQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-controllable-state": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-controllable-state/-/react-use-controllable-state-2.1.0.tgz", + "integrity": "sha512-QR/8fKNokxZUs4PfxjXuwl0fj/d71WPrmLJvEpCTkHjnzu7LnYvzoe2wB867IdooQJL0G1zBxl0Dq+6W1P3jpg==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-disclosure": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-disclosure/-/react-use-disclosure-2.1.0.tgz", + "integrity": "sha512-Ax4pmxA9LBGMyEZJhhUZobg9C0t3qFE4jVF1tGBsrLDcdBeLR9fwOogIPY9Hf0/wqSlAryAimICbr5hkpa5GSw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-event-listener": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-event-listener/-/react-use-event-listener-2.1.0.tgz", + "integrity": "sha512-U5greryDLS8ISP69DKDsYcsXRtAdnTQT+jjIlRYZ49K/XhUR/AqVZCK5BkR1spTDmO9H8SPhgeNKI70ODuDU/Q==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-effect/-/react-use-focus-effect-2.1.0.tgz", + "integrity": "sha512-xzVboNy7J64xveLcxTIJ3jv+lUJKDwRM7Szwn9tNzUIPD94O3qwjV7DDCUzN2490nSYDF4OBMt/wuDBtaR3kUQ==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-focus-on-pointer-down": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-focus-on-pointer-down/-/react-use-focus-on-pointer-down-2.1.0.tgz", + "integrity": "sha512-2jzrUZ+aiCG/cfanrolsnSMDykCAbv9EK/4iUyZno6BYb3vziucmvgKuoXbMPAzWNtwUwtuMhkby8rc61Ue+Lg==", + "dependencies": { + "@chakra-ui/react-use-event-listener": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-interval": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-interval/-/react-use-interval-2.1.0.tgz", + "integrity": "sha512-8iWj+I/+A0J08pgEXP1J1flcvhLBHkk0ln7ZvGIyXiEyM6XagOTJpwNhiu+Bmk59t3HoV/VyvyJTa+44sEApuw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-latest-ref": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-latest-ref/-/react-use-latest-ref-2.1.0.tgz", + "integrity": "sha512-m0kxuIYqoYB0va9Z2aW4xP/5b7BzlDeWwyXCH6QpT2PpW3/281L3hLCm1G0eOUcdVlayqrQqOeD6Mglq+5/xoQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-merge-refs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-merge-refs/-/react-use-merge-refs-2.1.0.tgz", + "integrity": "sha512-lERa6AWF1cjEtWSGjxWTaSMvneccnAVH4V4ozh8SYiN9fSPZLlSG3kNxfNzdFvMEhM7dnP60vynF7WjGdTgQbQ==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-outside-click": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-outside-click/-/react-use-outside-click-2.2.0.tgz", + "integrity": "sha512-PNX+s/JEaMneijbgAM4iFL+f3m1ga9+6QK0E5Yh4s8KZJQ/bLwZzdhMz8J/+mL+XEXQ5J0N8ivZN28B82N1kNw==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-pan-event": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-pan-event/-/react-use-pan-event-2.1.0.tgz", + "integrity": "sha512-xmL2qOHiXqfcj0q7ZK5s9UjTh4Gz0/gL9jcWPA6GVf+A0Od5imEDa/Vz+533yQKWiNSm1QGrIj0eJAokc7O4fg==", + "dependencies": { + "@chakra-ui/event-utils": "2.0.8", + "@chakra-ui/react-use-latest-ref": "2.1.0", + "framesync": "6.1.2" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-previous": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-previous/-/react-use-previous-2.1.0.tgz", + "integrity": "sha512-pjxGwue1hX8AFcmjZ2XfrQtIJgqbTF3Qs1Dy3d1krC77dEsiCUbQ9GzOBfDc8pfd60DrB5N2tg5JyHbypqh0Sg==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-safe-layout-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-safe-layout-effect/-/react-use-safe-layout-effect-2.1.0.tgz", + "integrity": "sha512-Knbrrx/bcPwVS1TorFdzrK/zWA8yuU/eaXDkNj24IrKoRlQrSBFarcgAEzlCHtzuhufP3OULPkELTzz91b0tCw==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-size": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-size/-/react-use-size-2.1.0.tgz", + "integrity": "sha512-tbLqrQhbnqOjzTaMlYytp7wY8BW1JpL78iG7Ru1DlV4EWGiAmXFGvtnEt9HftU0NJ0aJyjgymkxfVGI55/1Z4A==", + "dependencies": { + "@zag-js/element-size": "0.10.5" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-timeout": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-timeout/-/react-use-timeout-2.1.0.tgz", + "integrity": "sha512-cFN0sobKMM9hXUhyCofx3/Mjlzah6ADaEl/AXl5Y+GawB5rgedgAcu2ErAgarEkwvsKdP6c68CKjQ9dmTQlJxQ==", + "dependencies": { + "@chakra-ui/react-use-callback-ref": "2.1.0" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-use-update-effect": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-use-update-effect/-/react-use-update-effect-2.1.0.tgz", + "integrity": "sha512-ND4Q23tETaR2Qd3zwCKYOOS1dfssojPLJMLvUtUbW5M9uW1ejYWgGUobeAiOVfSplownG8QYMmHTP86p/v0lbA==", + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/react-utils": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/@chakra-ui/react-utils/-/react-utils-2.0.12.tgz", + "integrity": "sha512-GbSfVb283+YA3kA8w8xWmzbjNWk14uhNpntnipHCftBibl0lxtQ9YqMFQLwuFOO0U2gYVocszqqDWX+XNKq9hw==", + "dependencies": { + "@chakra-ui/utils": "2.0.15" + }, + "peerDependencies": { + "react": ">=18" + } + }, + "node_modules/@chakra-ui/select": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/select/-/select-2.1.2.tgz", + "integrity": "sha512-ZwCb7LqKCVLJhru3DXvKXpZ7Pbu1TDZ7N0PdQ0Zj1oyVLJyrpef1u9HR5u0amOpqcH++Ugt0f5JSmirjNlctjA==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/shared-utils": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@chakra-ui/shared-utils/-/shared-utils-2.0.5.tgz", + "integrity": "sha512-4/Wur0FqDov7Y0nCXl7HbHzCg4aq86h+SXdoUeuCMD3dSj7dpsVnStLYhng1vxvlbUnLpdF4oz5Myt3i/a7N3Q==" + }, + "node_modules/@chakra-ui/skeleton": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/skeleton/-/skeleton-2.1.0.tgz", + "integrity": "sha512-JNRuMPpdZGd6zFVKjVQ0iusu3tXAdI29n4ZENYwAJEMf/fN0l12sVeirOxkJ7oEL0yOx2AgEYFSKdbcAgfUsAQ==", + "dependencies": { + "@chakra-ui/media-query": "3.3.0", + "@chakra-ui/react-use-previous": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/skip-nav": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/skip-nav/-/skip-nav-2.1.0.tgz", + "integrity": "sha512-Hk+FG+vadBSH0/7hwp9LJnLjkO0RPGnx7gBJWI4/SpoJf3e4tZlWYtwGj0toYY4aGKl93jVghuwGbDBEMoHDug==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/slider": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/slider/-/slider-2.1.0.tgz", + "integrity": "sha512-lUOBcLMCnFZiA/s2NONXhELJh6sY5WtbRykPtclGfynqqOo47lwWJx+VP7xaeuhDOPcWSSecWc9Y1BfPOCz9cQ==", + "dependencies": { + "@chakra-ui/number-utils": "2.0.7", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-callback-ref": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-latest-ref": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-pan-event": "2.1.0", + "@chakra-ui/react-use-size": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/spinner": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/spinner/-/spinner-2.1.0.tgz", + "integrity": "sha512-hczbnoXt+MMv/d3gE+hjQhmkzLiKuoTo42YhUG7Bs9OSv2lg1fZHW1fGNRFP3wTi6OIbD044U1P9HK+AOgFH3g==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stat/-/stat-2.1.1.tgz", + "integrity": "sha512-LDn0d/LXQNbAn2KaR3F1zivsZCewY4Jsy1qShmfBMKwn6rI8yVlbvu6SiA3OpHS0FhxbsZxQI6HefEoIgtqY6Q==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/stepper": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/stepper/-/stepper-2.3.1.tgz", + "integrity": "sha512-ky77lZbW60zYkSXhYz7kbItUpAQfEdycT0Q4bkHLxfqbuiGMf8OmgZOQkOB9uM4v0zPwy2HXhe0vq4Dd0xa55Q==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/styled-system": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/styled-system/-/styled-system-2.9.2.tgz", + "integrity": "sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "csstype": "^3.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/switch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/switch/-/switch-2.1.2.tgz", + "integrity": "sha512-pgmi/CC+E1v31FcnQhsSGjJnOE2OcND4cKPyTE+0F+bmGm48Q/b5UmKD9Y+CmZsrt/7V3h8KNczowupfuBfIHA==", + "dependencies": { + "@chakra-ui/checkbox": "2.3.2", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/system": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/system/-/system-2.6.2.tgz", + "integrity": "sha512-EGtpoEjLrUu4W1fHD+a62XR+hzC5YfsWm+6lO0Kybcga3yYEij9beegO0jZgug27V+Rf7vns95VPVP6mFd/DEQ==", + "dependencies": { + "@chakra-ui/color-mode": "2.2.0", + "@chakra-ui/object-utils": "2.1.0", + "@chakra-ui/react-utils": "2.0.12", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme-utils": "2.0.21", + "@chakra-ui/utils": "2.0.15", + "react-fast-compare": "3.2.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0", + "@emotion/styled": "^11.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/table": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/table/-/table-2.1.0.tgz", + "integrity": "sha512-o5OrjoHCh5uCLdiUb0Oc0vq9rIAeHSIRScc2ExTC9Qg/uVZl2ygLrjToCaKfaaKl1oQexIeAcZDKvPG8tVkHyQ==", + "dependencies": { + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tabs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/tabs/-/tabs-3.0.0.tgz", + "integrity": "sha512-6Mlclp8L9lqXmsGWF5q5gmemZXOiOYuh0SGT/7PgJVNPz3LXREXlXg2an4MBUD8W5oTkduCX+3KTMCwRrVrDYw==", + "dependencies": { + "@chakra-ui/clickable": "2.1.0", + "@chakra-ui/descendant": "3.1.0", + "@chakra-ui/lazy-utils": "2.0.5", + "@chakra-ui/react-children-utils": "2.0.6", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-controllable-state": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/react-use-safe-layout-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/tag": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tag/-/tag-3.1.1.tgz", + "integrity": "sha512-Bdel79Dv86Hnge2PKOU+t8H28nm/7Y3cKd4Kfk9k3lOpUh4+nkSGe58dhRzht59lEqa4N9waCgQiBdkydjvBXQ==", + "dependencies": { + "@chakra-ui/icon": "3.2.0", + "@chakra-ui/react-context": "2.1.0" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/textarea": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/textarea/-/textarea-2.1.2.tgz", + "integrity": "sha512-ip7tvklVCZUb2fOHDb23qPy/Fr2mzDOGdkrpbNi50hDCiV4hFX02jdQJdi3ydHZUyVgZVBKPOJ+lT9i7sKA2wA==", + "dependencies": { + "@chakra-ui/form-control": "2.2.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/theme": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme/-/theme-3.3.1.tgz", + "integrity": "sha512-Hft/VaT8GYnItGCBbgWd75ICrIrIFrR7lVOhV/dQnqtfGqsVDlrztbSErvMkoPKt0UgAkd9/o44jmZ6X4U2nZQ==", + "dependencies": { + "@chakra-ui/anatomy": "2.2.2", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/theme-tools": "2.1.2" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.8.0" + } + }, + "node_modules/@chakra-ui/theme-tools": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-tools/-/theme-tools-2.1.2.tgz", + "integrity": "sha512-Qdj8ajF9kxY4gLrq7gA+Azp8CtFHGO9tWMN2wfF9aQNgG9AuMhPrUzMq9AMQ0MXiYcgNq/FD3eegB43nHVmXVA==", + "dependencies": { + "@chakra-ui/anatomy": "2.2.2", + "@chakra-ui/shared-utils": "2.0.5", + "color2k": "^2.0.2" + }, + "peerDependencies": { + "@chakra-ui/styled-system": ">=2.0.0" + } + }, + "node_modules/@chakra-ui/theme-utils": { + "version": "2.0.21", + "resolved": "https://registry.npmjs.org/@chakra-ui/theme-utils/-/theme-utils-2.0.21.tgz", + "integrity": "sha512-FjH5LJbT794r0+VSCXB3lT4aubI24bLLRWB+CuRKHijRvsOg717bRdUN/N1fEmEpFnRVrbewttWh/OQs0EWpWw==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme": "3.3.1", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/toast": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/@chakra-ui/toast/-/toast-7.0.2.tgz", + "integrity": "sha512-yvRP8jFKRs/YnkuE41BVTq9nB2v/KDRmje9u6dgDmE5+1bFt3bwjdf9gVbif4u5Ve7F7BGk5E093ARRVtvLvXA==", + "dependencies": { + "@chakra-ui/alert": "2.2.2", + "@chakra-ui/close-button": "2.1.1", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-context": "2.1.0", + "@chakra-ui/react-use-timeout": "2.1.0", + "@chakra-ui/react-use-update-effect": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5", + "@chakra-ui/styled-system": "2.9.2", + "@chakra-ui/theme": "3.3.1" + }, + "peerDependencies": { + "@chakra-ui/system": "2.6.2", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/tooltip": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@chakra-ui/tooltip/-/tooltip-2.3.1.tgz", + "integrity": "sha512-Rh39GBn/bL4kZpuEMPPRwYNnccRCL+w9OqamWHIB3Qboxs6h8cOyXfIdGxjo72lvhu1QI/a4KFqkM3St+WfC0A==", + "dependencies": { + "@chakra-ui/dom-utils": "2.1.0", + "@chakra-ui/popper": "3.1.0", + "@chakra-ui/portal": "2.1.0", + "@chakra-ui/react-types": "2.0.7", + "@chakra-ui/react-use-disclosure": "2.1.0", + "@chakra-ui/react-use-event-listener": "2.1.0", + "@chakra-ui/react-use-merge-refs": "2.1.0", + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "framer-motion": ">=4.0.0", + "react": ">=18", + "react-dom": ">=18" + } + }, + "node_modules/@chakra-ui/transition": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/transition/-/transition-2.1.0.tgz", + "integrity": "sha512-orkT6T/Dt+/+kVwJNy7zwJ+U2xAZ3EU7M3XCs45RBvUnZDr/u9vdmaM/3D/rOpmQJWgQBwKPJleUXrYWUagEDQ==", + "dependencies": { + "@chakra-ui/shared-utils": "2.0.5" + }, + "peerDependencies": { + "framer-motion": ">=4.0.0", + "react": ">=18" + } + }, + "node_modules/@chakra-ui/utils": { + "version": "2.0.15", + "resolved": "https://registry.npmjs.org/@chakra-ui/utils/-/utils-2.0.15.tgz", + "integrity": "sha512-El4+jL0WSaYYs+rJbuYFDbjmfCcfGDmRY95GO4xwzit6YAPZBLcR65rOEwLps+XWluZTy1xdMrusg/hW0c1aAA==", + "dependencies": { + "@types/lodash.mergewith": "4.6.7", + "css-box-model": "1.2.1", + "framesync": "6.1.2", + "lodash.mergewith": "4.6.2" + } + }, + "node_modules/@chakra-ui/visually-hidden": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@chakra-ui/visually-hidden/-/visually-hidden-2.2.0.tgz", + "integrity": "sha512-KmKDg01SrQ7VbTD3+cPWf/UfpF5MSwm3v7MWi0n5t8HnnadT13MF0MJCDSXbBWnzLv1ZKJ6zlyAOeARWX+DpjQ==", + "peerDependencies": { + "@chakra-ui/system": ">=2.0.0", + "react": ">=18" + } + }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", + "peer": true + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", + "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.1" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "peer": true + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "peer": true, + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==", + "peer": true + }, + "node_modules/@emotion/styled": { + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "peer": true + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "peer": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==", + "peer": true + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", + "peer": true + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "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.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "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/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.5", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.5.tgz", + "integrity": "sha512-Nsdud2X65Dz+1RHjAIP0t8z5e2ff/IRbei6BqFrl1urT8sDVzM1HMQ+R0XcU5ceRfyO3I6ayeqIfh+6Wb8LGTw==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/react": { + "version": "0.26.16", + "resolved": "https://registry.npmjs.org/@floating-ui/react/-/react-0.26.16.tgz", + "integrity": "sha512-HEf43zxZNAI/E781QIVpYSF3K2VH4TTYZpqecjdsFkjsaU1EbaWcM++kw0HXFffj7gDUcBFevX8s0rQGQpxkow==", + "dependencies": { + "@floating-ui/react-dom": "^2.1.0", + "@floating-ui/utils": "^0.2.0", + "tabbable": "^6.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/react-dom": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.0.tgz", + "integrity": "sha512-lNzj5EQmEKn5FFKc04+zasr09h/uX8RtJRNj5gUXsSQIXHVWTVh+hVAg1vOMCexkX8EgvemMvIFpQfkosnVNyA==", + "dependencies": { + "@floating-ui/dom": "^1.0.0" + }, + "peerDependencies": { + "react": ">=16.8.0", + "react-dom": ">=16.8.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@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": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==" + }, + "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/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@remix-run/router": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.16.1.tgz", + "integrity": "sha512-es2g3dq6Nb07iFxGk5GuHN20RwBZOsuDQN7izWIisUcv9r+d2C5jQxqmgkdebXgReWfiyUabcki6Fg77mSNrig==", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@swc/core": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.5.5.tgz", + "integrity": "sha512-M8O22EEgdSONLd+7KRrXj8pn+RdAZZ7ISnPjE9KCQQlI0kkFNEquWR+uFdlFxQfwlyCe/Zb6uGXGDvtcov4IMg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@swc/counter": "^0.1.2", + "@swc/types": "^0.1.5" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/swc" + }, + "optionalDependencies": { + "@swc/core-darwin-arm64": "1.5.5", + "@swc/core-darwin-x64": "1.5.5", + "@swc/core-linux-arm-gnueabihf": "1.5.5", + "@swc/core-linux-arm64-gnu": "1.5.5", + "@swc/core-linux-arm64-musl": "1.5.5", + "@swc/core-linux-x64-gnu": "1.5.5", + "@swc/core-linux-x64-musl": "1.5.5", + "@swc/core-win32-arm64-msvc": "1.5.5", + "@swc/core-win32-ia32-msvc": "1.5.5", + "@swc/core-win32-x64-msvc": "1.5.5" + }, + "peerDependencies": { + "@swc/helpers": "^0.5.0" + }, + "peerDependenciesMeta": { + "@swc/helpers": { + "optional": true + } + } + }, + "node_modules/@swc/core-darwin-arm64": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.5.5.tgz", + "integrity": "sha512-Ol5ZwZYdTOZsv2NwjcT/qVVALKzVFeh+IJ4GNarr3P99+38Dkwi81OqCI1o/WaDXQYKAQC/V+CzMbkEuJJfq9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-darwin-x64": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.5.5.tgz", + "integrity": "sha512-XHWpKBIPKYLgh5/lV2PYjO84lkzf5JR51kjiloyz2Pa9HIV8tHoAP8bYdJwm4nUp2I7KcEh3pPH0AVu5LpxMKw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm-gnueabihf": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.5.5.tgz", + "integrity": "sha512-vtoWNCWAe+CNSqtqIwFnIH48qgPPlUZKoQ4EVFeMM+7/kDi6SeNxoh5TierJs5bKAWxD49VkPvRoWFCk6V62mA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-gnu": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.5.5.tgz", + "integrity": "sha512-L4l7M78U6h/rCAxId+y5Vu+1KfDRF6dJZtitFcaT293guiUQFwJv8gLxI4Jh5wFtZ0fYd0QaCuvh2Ip79CzGMg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-arm64-musl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.5.5.tgz", + "integrity": "sha512-DkzJc13ukXa7oJpyn24BjIgsiOybYrc+IxjsQyfNlDrrs1QXP4elStcpkD02SsIuSyHjZV8Hw2HFBMQB3OHPrA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-gnu": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.5.5.tgz", + "integrity": "sha512-kj4ZwWJGeBEUzHrRQP2VudN+kkkYH7OI1dPVDc6kWQx5X4329JeKOas4qY0l7gDVjBbRwN9IbbPI6TIn2KfAug==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-linux-x64-musl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.5.5.tgz", + "integrity": "sha512-6pTorCs4mYhPhYtC4jNOnhGgjNd3DZcRoZ9P0tzXXP69aCbYjvlgNH/NRvAROp9AaVFeZ7a7PmCWb6+Rbe7NKg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-arm64-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.5.5.tgz", + "integrity": "sha512-o0/9pstmEjwZyrY/bA+mymF0zH7E+GT/XCVqdKeWW9Wn3gTTyWa5MZnrFgI2THQ+AXwdglMB/Zo76ARQPaz/+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-ia32-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.5.5.tgz", + "integrity": "sha512-B+nypUwsmCuaH6RtKWgiPCb+ENjxstJPPJeMJvBqlJqyCaIkZzN4M07Ozi3xVv1VG21SRkd6G3xIqRoalrNc0Q==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/core-win32-x64-msvc": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.5.5.tgz", + "integrity": "sha512-ry83ki9ZX0Q+GWGnqc2J618Z+FvKE8Ajn42F8EYi8Wj0q6Jz3mj+pJzgzakk2INm2ldEZ+FaRPipn4ozsZDcBg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@swc/counter": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@swc/counter/-/counter-0.1.3.tgz", + "integrity": "sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==", + "dev": true + }, + "node_modules/@swc/types": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", + "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", + "dev": true + }, + "node_modules/@types/history": { + "version": "4.7.11", + "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", + "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==" + }, + "node_modules/@types/lodash.mergewith": { + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/@types/lodash.mergewith/-/lodash.mergewith-4.6.7.tgz", + "integrity": "sha512-3m+lkO5CLRRYU0fhGRp7zbsGi6+BZj0uTVSwvcKU+nSlhjA9/QRNfuSGnD2mX6hQA7ZbmcCkzk5h4ZYGOtk14A==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "peer": true + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "node_modules/@types/react": { + "version": "18.3.2", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.2.tgz", + "integrity": "sha512-Btgg89dAnqD4vV7R3hlwOxgqobUQKgx3MmrQRi0yYbs/P0ym8XozIAlkqVilPqHQwXs4e9Tf63rrCgl58BcO4w==", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-datepicker": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@types/react-datepicker/-/react-datepicker-6.2.0.tgz", + "integrity": "sha512-+JtO4Fm97WLkJTH8j8/v3Ldh7JCNRwjMYjRaKh4KHH0M3jJoXtwiD3JBCsdlg3tsFIw9eQSqyAPeVDN2H2oM9Q==", + "dev": true, + "dependencies": { + "@floating-ui/react": "^0.26.2", + "@types/react": "*", + "date-fns": "^3.3.1" + } + }, + "node_modules/@types/react-dom": { + "version": "18.3.0", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.0.tgz", + "integrity": "sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.20.tgz", + "integrity": "sha512-jGjmu/ZqS7FjSH6owMcD5qpq19+1RS9DeVRqfl1FeBMxTDQAGwlMWOcs52NDoXaNKyG3d1cYQFMs9rCrb88o9Q==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", + "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@vitejs/plugin-react-swc": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-react-swc/-/plugin-react-swc-3.6.0.tgz", + "integrity": "sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==", + "dev": true, + "dependencies": { + "@swc/core": "^1.3.107" + }, + "peerDependencies": { + "vite": "^4 || ^5" + } + }, + "node_modules/@zag-js/dom-query": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@zag-js/dom-query/-/dom-query-0.16.0.tgz", + "integrity": "sha512-Oqhd6+biWyKnhKwFFuZrrf6lxBz2tX2pRQe6grUnYwO6HJ8BcbqZomy2lpOdr+3itlaUqx+Ywj5E5ZZDr/LBfQ==" + }, + "node_modules/@zag-js/element-size": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/@zag-js/element-size/-/element-size-0.10.5.tgz", + "integrity": "sha512-uQre5IidULANvVkNOBQ1tfgwTQcGl4hliPSe69Fct1VfYb2Fd0jdAcGzqQgPhfrXFpR62MxLPB7erxJ/ngtL8w==" + }, + "node_modules/@zag-js/focus-visible": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/@zag-js/focus-visible/-/focus-visible-0.16.0.tgz", + "integrity": "sha512-a7U/HSopvQbrDU4GLerpqiMcHKEkQkNPeDZJWz38cw/6Upunh41GjHetq5TB84hxyCaDzJ6q2nEdNoBQfC0FKA==", + "dependencies": { + "@zag-js/dom-query": "0.16.0" + } + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-hidden": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz", + "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "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/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/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/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/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/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/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "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/color2k": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/color2k/-/color2k-2.0.3.tgz", + "integrity": "sha512-zW190nQTIoXcGCaU08DvVNFTmQhUpnJfVuAKfWqUQkflXKpaDdpaYoM0iluLS9lgJNHyBF58KKA2FBEwkD7wog==" + }, + "node_modules/compute-scroll-into-view": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-3.0.3.tgz", + "integrity": "sha512-nadqwNxghAGTamwIqQSG433W6OADZx2vCo3UXHNrzTRHK/htu+7+L0zhjEoaeaQVNAi3YgqWDv8+tzf0hRfR+A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "peer": true + }, + "node_modules/copy-to-clipboard": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", + "integrity": "sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==", + "dependencies": { + "toggle-selection": "^1.0.6" + } + }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "peer": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/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-box-model": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/css-box-model/-/css-box-model-1.2.1.tgz", + "integrity": "sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==", + "dependencies": { + "tiny-invariant": "^1.0.6" + } + }, + "node_modules/csstype": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" + }, + "node_modules/date-fns": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz", + "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "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/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/detect-node-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz", + "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ==" + }, + "node_modules/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/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/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==", + "peer": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "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-plugin-react-hooks": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz", + "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0" + } + }, + "node_modules/eslint-plugin-react-refresh": { + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.7.tgz", + "integrity": "sha512-yrj+KInFmwuQS2UQcg1SF83ha1tuHC1jMQbRNyuWtlEzzKRDgAl7L4Yp4NlDUZTZNlWvHEzOtJhMi40R7JxcSw==", + "dev": true, + "peerDependencies": { + "eslint": ">=7" + } + }, + "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/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/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/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/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "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/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "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-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "peer": true + }, + "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.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/focus-lock": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/focus-lock/-/focus-lock-1.3.5.tgz", + "integrity": "sha512-QFaHbhv9WPUeLYBDe/PAuLKJ4Dd9OPvKs9xZBr3yLXnUrDNaVXKu2baDBXe3naPY30hgHYSsf2JW4jzas2mDEQ==", + "dependencies": { + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/framer-motion": { + "version": "11.1.9", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.1.9.tgz", + "integrity": "sha512-flECDIPV4QDNcOrDafVFiIazp8X01HFpzc01eDKJsdNH/wrATcYydJSH9JbPWMS8UD5lZlw+J1sK8LG2kICgqw==", + "peer": true, + "dependencies": { + "tslib": "^2.4.0" + }, + "peerDependencies": { + "@emotion/is-prop-valid": "*", + "react": "^18.0.0", + "react-dom": "^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/is-prop-valid": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + } + } + }, + "node_modules/framesync": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/framesync/-/framesync-6.1.2.tgz", + "integrity": "sha512-jBTqhX6KaQVDyus8muwZbBeGGP0XgujBRbQ7gM7BRdS3CadCZIHiawyzYLnafYcvZIh5j8WE7cxZKFn7dXhu9g==", + "dependencies": { + "tslib": "2.4.0" + } + }, + "node_modules/framesync/node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "peer": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-nonce": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz", + "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "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/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "peer": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "peer": true, + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "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==", + "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/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "peer": true + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "peer": true, + "dependencies": { + "hasown": "^2.0.0" + }, + "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-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-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/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/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==", + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/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/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==", + "peer": 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.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.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/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/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "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/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "dev": true, + "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/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "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==", + "peer": 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==", + "dev": true, + "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==", + "peer": 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==", + "engines": { + "node": ">=8" + } + }, + "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/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/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/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-clientside-effect": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/react-clientside-effect/-/react-clientside-effect-1.2.6.tgz", + "integrity": "sha512-XGGGRQAKY+q25Lz9a/4EPqom7WRjz3z9R2k4jhVKA/puQFH/5Nt27vFZYql4m4NVNdUvX8PS3O7r/Zzm7cjUlg==", + "dependencies": { + "@babel/runtime": "^7.12.13" + }, + "peerDependencies": { + "react": "^15.3.0 || ^16.0.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-datepicker": { + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-6.9.0.tgz", + "integrity": "sha512-QTxuzeem7BUfVFWv+g5WuvzT0c5BPo+XTCNbMTZKSZQLU+cMMwSUHwspaxuIcDlwNcOH0tiJ+bh1fJ2yxOGYWA==", + "dependencies": { + "@floating-ui/react": "^0.26.2", + "clsx": "^2.1.0", + "date-fns": "^3.3.1", + "prop-types": "^15.7.2", + "react-onclickoutside": "^6.13.0" + }, + "peerDependencies": { + "react": "^16.9.0 || ^17 || ^18", + "react-dom": "^16.9.0 || ^17 || ^18" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/react-fast-compare/-/react-fast-compare-3.2.2.tgz", + "integrity": "sha512-nsO+KSNgo1SbJqJEYRE9ERzo7YtYbou/OqjSQKxV7jcKox7+usiUVZOAC+XnDOABXggQTno0Y1CpVnuWEc1boQ==" + }, + "node_modules/react-focus-lock": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/react-focus-lock/-/react-focus-lock-2.12.1.tgz", + "integrity": "sha512-lfp8Dve4yJagkHiFrC1bGtib3mF2ktqwPJw4/WGcgPW+pJ/AVQA5X2vI7xgp13FcxFEpYBBHpXai/N2DBNC0Jw==", + "dependencies": { + "@babel/runtime": "^7.0.0", + "focus-lock": "^1.3.5", + "prop-types": "^15.6.2", + "react-clientside-effect": "^1.2.6", + "use-callback-ref": "^1.3.2", + "use-sidecar": "^1.1.2" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-icons": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.2.1.tgz", + "integrity": "sha512-zdbW5GstTzXaVKvGSyTaBalt7HSfuK5ovrzlpyiWHAFXndXTdd/1hdDHI4xBM1Mn7YriT6aqESucFl9kEXzrdw==", + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "node_modules/react-onclickoutside": { + "version": "6.13.1", + "resolved": "https://registry.npmjs.org/react-onclickoutside/-/react-onclickoutside-6.13.1.tgz", + "integrity": "sha512-LdrrxK/Yh9zbBQdFbMTXPp3dTSN9B+9YJQucdDu3JNKRrbdU+H+/TVONJoWtOwy4II8Sqf1y/DTI6w/vGPYW0w==", + "funding": { + "type": "individual", + "url": "https://github.com/Pomax/react-onclickoutside/blob/master/FUNDING.md" + }, + "peerDependencies": { + "react": "^15.5.x || ^16.x || ^17.x || ^18.x", + "react-dom": "^15.5.x || ^16.x || ^17.x || ^18.x" + } + }, + "node_modules/react-remove-scroll": { + "version": "2.5.10", + "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.10.tgz", + "integrity": "sha512-m3zvBRANPBw3qxVVjEIPEQinkcwlFZ4qyomuWVpNJdv4c6MvHfXV0C3L9Jx5rr3HeBHKNRX+1jreB5QloDIJjA==", + "dependencies": { + "react-remove-scroll-bar": "^2.3.6", + "react-style-singleton": "^2.2.1", + "tslib": "^2.1.0", + "use-callback-ref": "^1.3.0", + "use-sidecar": "^1.1.2" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-remove-scroll-bar": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz", + "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==", + "dependencies": { + "react-style-singleton": "^2.2.1", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/react-router": { + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.23.1.tgz", + "integrity": "sha512-fzcOaRF69uvqbbM7OhvQyBTFDVrrGlsFdS3AL+1KfIBtGETibHzi3FkoTRyiDJnWNc2VxrfvR+657ROHjaNjqQ==", + "dependencies": { + "@remix-run/router": "1.16.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8" + } + }, + "node_modules/react-router-dom": { + "version": "6.23.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.23.1.tgz", + "integrity": "sha512-utP+K+aSTtEdbWpC+4gxhdlPFwuEfDKq8ZrPFU65bbRJY+l706qjR7yaidBpo3MSeA/fzwbXWbKBI6ftOnP3OQ==", + "dependencies": { + "@remix-run/router": "1.16.1", + "react-router": "6.23.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/react-style-singleton": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz", + "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==", + "dependencies": { + "get-nonce": "^1.0.0", + "invariant": "^2.2.4", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "peer": 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==", + "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/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", + "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/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, + "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/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": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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-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/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "peer": true + }, + "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==", + "peer": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "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/tiny-invariant": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/tiny-invariant/-/tiny-invariant-1.3.3.tgz", + "integrity": "sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "peer": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toggle-selection": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/toggle-selection/-/toggle-selection-1.0.6.tgz", + "integrity": "sha512-BiZS+C1OS8g/q2RRbJmy59xpyghNBqrr6k5L/uKBGRsTfxmu3ffiRnd8mlGPUVayg8pvfi5urfnu8TU7DVOkLQ==" + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.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/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/use-callback-ref": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz", + "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==", + "dependencies": { + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/use-sidecar": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz", + "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==", + "dependencies": { + "detect-node-es": "^1.1.0", + "tslib": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/vite": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "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/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "peer": true, + "engines": { + "node": ">= 6" + } + }, + "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/FrontAdmin/package.json b/FrontAdmin/package.json new file mode 100644 index 0000000..00bae09 --- /dev/null +++ b/FrontAdmin/package.json @@ -0,0 +1,38 @@ +{ + "name": "frontadmin", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc && vite build", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 30", + "preview": "vite preview" + }, + "dependencies": { + "@chakra-ui/icons": "^2.1.1", + "@chakra-ui/react": "^2.8.2", + "@types/react-router-dom": "^5.3.3", + "chart.js": "^4.4.3", + "date-fns": "^3.6.0", + "react": "^18.2.0", + "react-chartjs-2": "^5.2.0", + "react-datepicker": "^6.9.0", + "react-dom": "^18.2.0", + "react-icons": "^5.2.1", + "react-router-dom": "^6.23.1" + }, + "devDependencies": { + "@types/react": "^18.2.66", + "@types/react-datepicker": "^6.2.0", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "eslint": "^8.57.0", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } +} diff --git a/FrontAdmin/public/TUP.png b/FrontAdmin/public/TUP.png new file mode 100644 index 0000000..860d25b Binary files /dev/null and b/FrontAdmin/public/TUP.png differ diff --git a/FrontAdmin/src/API/DatosEstadistica.ts b/FrontAdmin/src/API/DatosEstadistica.ts new file mode 100644 index 0000000..3bcb635 --- /dev/null +++ b/FrontAdmin/src/API/DatosEstadistica.ts @@ -0,0 +1,48 @@ +const API = [ + { + id: 1, + title: 'Cuotas completas abonadas', + value: '31', + total: '40', + tipoDato: 'M' + }, + { + id: 2, + title: 'Cuotas reducidas abonadas', + value: '28', + total: '36', + tipoDato: 'M' + }, + { + id: 3, + title: 'Habilitados', + value: '74', + total: '76', + tipoDato: 'C' + }, + { + id: 4, + title: 'Inhabilitados', + value: '2', + total: '76', + tipoDato: 'C' + }, + { + id: 5, + title: 'Compromiso de pago firmados', + value: '70', + total: '76', + tipoDato: 'C' + }, + { + id: 6, + title: 'Matriculas abonadas', + value: '75', + total: '76', + Tipo: 'C' + } + ] + +export default API; + + diff --git a/FrontAdmin/src/API/Login.ts b/FrontAdmin/src/API/Login.ts new file mode 100644 index 0000000..2f84810 --- /dev/null +++ b/FrontAdmin/src/API/Login.ts @@ -0,0 +1,21 @@ +export const FetchLogin = async (username : string, email : string, password: string) => { + try { + const response = await fetch('http://127.0.0.1:8000/accounts/login/', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ username ,email, password }), + }); + + if (response.ok) { + const data = await response.json(); + console.log('Login successful', data); + return data; + } else { + console.error('Login failed'); + } + } catch (error) { + console.error('Network error', error); + } + } \ No newline at end of file diff --git a/FrontAdmin/src/App.tsx b/FrontAdmin/src/App.tsx new file mode 100644 index 0000000..ed10ea4 --- /dev/null +++ b/FrontAdmin/src/App.tsx @@ -0,0 +1,62 @@ +import { + createBrowserRouter, + Navigate, + RouteObject, + RouterProvider, +} from "react-router-dom"; +import NavBar from "./components/NavBar/NavBar"; +import { ChakraProvider } from "@chakra-ui/react"; +import { useEffect } from "react"; +import Estadisticas from "./components/Pages/Estadisticas/Estadisticas" +import ErrorPage from "./components/Pages/Error404"; +import LoginPage from "./components/Pages/Login/LoginPage"; + + +const routes: RouteObject[] = [ + { + path: "/", + element: , + children: [ + { + path: "Estadisticas", + element: , + }, + { + path: "/", + element: , + }, + // { + // path: "error404", + // element: , + // }, + { + path: '/login', + element: , + } + + ], + }, + { + path: "*", + element: , + }, +]; + +const router = createBrowserRouter(routes); + + +function App() { + useEffect(() => { + document.title = "TUP Admin"; + }, []); + + return ( + <> + + + + + ) +} + +export default App diff --git a/FrontAdmin/src/components/NavBar/LinksItems.tsx b/FrontAdmin/src/components/NavBar/LinksItems.tsx new file mode 100644 index 0000000..cbcd9a5 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/LinksItems.tsx @@ -0,0 +1,12 @@ +import iconAlumno from '../icons/alumno 1.png'; +import iconChat from '../icons/burbuja-de-chat 1.png'; +import iconConfig from '../icons/configuracion 1.png'; +import iconEstadisticas from '../icons/grafico-de-barras 1.png'; + +export const LINK_ITEMS = [ + { icon: iconEstadisticas, url: "/Estadisticas" }, + { icon: iconAlumno, url: "/error404" }, + { icon: iconChat, url: "/error404" }, + { icon: iconConfig, url: "/error404" }, + +]; diff --git a/FrontAdmin/src/components/NavBar/MobileNav.tsx b/FrontAdmin/src/components/NavBar/MobileNav.tsx new file mode 100644 index 0000000..4327d91 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/MobileNav.tsx @@ -0,0 +1,39 @@ +import { + StackProps, + HStack, + useColorModeValue, + IconButton, + Text, +} from "@chakra-ui/react"; +import { FiMenu } from "react-icons/fi"; + +interface MobileProps extends StackProps { + onOpen: () => void; +} + +export function MobileNav({ onOpen, ...rest }: MobileProps) { + return ( + + } + /> + + + TUP + + + ); +} diff --git a/FrontAdmin/src/components/NavBar/NavBar.tsx b/FrontAdmin/src/components/NavBar/NavBar.tsx new file mode 100644 index 0000000..3815bb7 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/NavBar.tsx @@ -0,0 +1,26 @@ +import { Outlet } from "react-router-dom"; +import { Box, Drawer, DrawerContent, useDisclosure, Text } from "@chakra-ui/react"; +import {MobileNav} from "./MobileNav"; +import { SidebarContent } from "./SidebarContent"; + +export default function NavBar() { + const { isOpen, onOpen, onClose } = useDisclosure(); + + return ( + + + + + + + + + + + + + + ); +} + + diff --git a/FrontAdmin/src/components/NavBar/NavItem.tsx b/FrontAdmin/src/components/NavBar/NavItem.tsx new file mode 100644 index 0000000..15a824d --- /dev/null +++ b/FrontAdmin/src/components/NavBar/NavItem.tsx @@ -0,0 +1,22 @@ +import { Flex, Image, FlexProps } from "@chakra-ui/react"; + +interface NavItemProps extends FlexProps { + icon: string; + color: string; +} + +export default function NavItem({ icon, color, ...props }: NavItemProps) { + return ( + + + + ); +} diff --git a/FrontAdmin/src/components/NavBar/SidebarContent.tsx b/FrontAdmin/src/components/NavBar/SidebarContent.tsx new file mode 100644 index 0000000..a76b0c3 --- /dev/null +++ b/FrontAdmin/src/components/NavBar/SidebarContent.tsx @@ -0,0 +1,41 @@ +import { Box, Flex, HStack, CloseButton, useMediaQuery, Text, BoxProps } from "@chakra-ui/react"; +import { Link, useLocation } from "react-router-dom"; +import { LINK_ITEMS } from "./LinksItems"; +import NavItem from "./NavItem"; + +interface SidebarProps extends BoxProps { + onClose: () => void; +} + +export function SidebarContent({ onClose, ...rest }: SidebarProps) { + const [isLargerThanMd] = useMediaQuery("(min-width: 768px)"); + const location = useLocation(); + + return ( + <> + + + {!isLargerThanMd && } + + + + TUP + + {LINK_ITEMS.map((link) => ( + + + + ))} + + + + ); +} diff --git a/FrontAdmin/src/components/Pages/Error404.tsx b/FrontAdmin/src/components/Pages/Error404.tsx new file mode 100644 index 0000000..a7213bd --- /dev/null +++ b/FrontAdmin/src/components/Pages/Error404.tsx @@ -0,0 +1,29 @@ +import React, { useEffect } from "react"; +import { Box, Button, Text } from "@chakra-ui/react"; +import { Link, useLocation, useNavigate } from "react-router-dom"; + +const ErrorPage: React.FC = () => { + const url = useLocation(); + const navigate = useNavigate(); + + useEffect(() => { + if (url.pathname === "/") { + navigate("/home"); + } + }, [navigate, url.pathname]); + + return ( + + 404 + Página no encontrada + + + + + ); +}; + +export default ErrorPage; + diff --git a/FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx b/FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx new file mode 100644 index 0000000..9e5597b --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/Chars/Donut.tsx @@ -0,0 +1,53 @@ +import { Doughnut } from 'react-chartjs-2'; +import { Chart, ArcElement, Tooltip, Legend, ChartOptions } from 'chart.js'; +import { Box } from '@chakra-ui/react'; +Chart.register(ArcElement, Tooltip, Legend); + +interface DoughnutChartProps { + labelsPromp: string[]; + dataPromp: number[]; + } + + + +const DoughnutChart : React.FC = ({ labelsPromp, dataPromp }) => { + const data = { + labels: labelsPromp, + datasets: [ + { + label: 'Estado de Alumnos', + data: dataPromp, + backgroundColor: ['#4CAF50', '#FF6384'], + hoverBackgroundColor: ['#66BB6A', '#FF6384'], + }, + ], + }; + + const options: ChartOptions<'doughnut'> = { + plugins: { + tooltip: { + callbacks: { + label: (context) => `${context.label}: ${context.raw}` + }, + }, + legend: { + display: true, + position: 'bottom' as 'bottom', + labels: { + font: { + size: 14, + }, + }, + }, + }, + maintainAspectRatio: false, + }; + + return ( + + + + ); +}; + +export default DoughnutChart; diff --git a/FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx b/FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx new file mode 100644 index 0000000..21508ee --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/Estadisticas.tsx @@ -0,0 +1,36 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Input, Spacer, Stack, StackDivider, Tab, TabIndicator, TabList, TabPanel, TabPanels, Tabs } from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import Mensual from "./SubPages/Mensual"; +import Cuatrimestral from "./SubPages/Cuatrimestral"; +import Calendario from "./SubPages/Calendario"; + +function Estadisticas() { + + + + return ( + + + + Mensual + Cuatrimestral + Calendario + + + + + + + + + + + + + + + + ); +} + +export default Estadisticas; \ No newline at end of file diff --git a/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx new file mode 100644 index 0000000..dfd74d3 --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Calendario.tsx @@ -0,0 +1,77 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Input, Stack} from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import API from '../../../../API/DatosEstadistica' +import DoughnutChart from "../Chars/Donut"; + + + +function Calendario() { + + const tarjetas = API.map((v) => { + return ( + + + {v.value} + / + {v.total} + + + + + {v.title} + + + ) + + }); + + return ( + + + + + + + + Desde + + + + Hasta + + + + + + + + {tarjetas} + + + + + + + + + + + ) +}; + +export default Calendario; \ No newline at end of file diff --git a/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx new file mode 100644 index 0000000..ccf17fa --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Cuatrimestral.tsx @@ -0,0 +1,92 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Icon, Input, Select, Spacer, Stack, StackDivider } from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import API from '../../../../API/DatosEstadistica' +import DoughnutChart from "../Chars/Donut"; +import { CalendarIcon } from '@chakra-ui/icons'; +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import { registerLocale, setDefaultLocale } from 'react-datepicker'; +import { SetStateAction, useState } from "react"; +import { es } from 'date-fns/locale/es'; +registerLocale('es', es); + + +function Cuatrimestral() { + + const [selectedDate, setSelectedDate] = useState(null); + + const handleDateChange = (date: Date) => { + setSelectedDate(date); + }; + + const tarjetas = API.map((v) => { + return ( + + + {v.value} + / + {v.total} + + + + + {v.title} + + + ) + } + ); + + return ( + + + + + + + Catrimestre + + } + placeholderText="aaaa" + /> + + + + + + + + + + + {tarjetas} + + + + + + + + + + + ) +}; + +export default Cuatrimestral; \ No newline at end of file diff --git a/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx new file mode 100644 index 0000000..41756aa --- /dev/null +++ b/FrontAdmin/src/components/Pages/Estadisticas/SubPages/Mensual.tsx @@ -0,0 +1,91 @@ +import { Box, CardFooter, Flex, FormControl, FormLabel, Heading, HStack, Icon, Input, Spacer, Stack, StackDivider } from "@chakra-ui/react"; +import { Card, CardBody, Text } from '@chakra-ui/react' +import API from '../../../../API/DatosEstadistica' + +import DatePicker from 'react-datepicker'; +import 'react-datepicker/dist/react-datepicker.css'; +import { registerLocale, setDefaultLocale } from 'react-datepicker'; +import { es } from 'date-fns/locale/es'; +import { SetStateAction, useState } from "react"; +import { CalendarIcon } from '@chakra-ui/icons'; +import DoughnutChart from '../Chars/Donut'; +registerLocale('es', es); + +function Mensual() { + const [selectedDate, setSelectedDate] = useState(null); + + const handleDateChange = (date: Date) => { + setSelectedDate(date); + }; + + const tarjetas = API.map((v) => { + + return ( + + + + {v.value} + / + {v.total} + + + + + {v.title} + + + + ); + + return null; + }); + + return ( + + + + + + + Mes - Año + + } + placeholderText="mm/aaaa" + /> + + + + + + + + + + {tarjetas} + + + + + + + + + + + ); +} + +export default Mensual; diff --git a/FrontAdmin/src/components/Pages/Login/LoginPage.tsx b/FrontAdmin/src/components/Pages/Login/LoginPage.tsx new file mode 100644 index 0000000..85f5812 --- /dev/null +++ b/FrontAdmin/src/components/Pages/Login/LoginPage.tsx @@ -0,0 +1,146 @@ +import { useState } from "react"; +import { + Box, + Flex, + Button, + FormControl, + FormLabel, + Heading, + Input, + useColorModeValue, + useColorMode, + useToast +} from "@chakra-ui/react"; +import { FetchLogin } from "../../../API/Login"; + + + +function LoginPage() { + + const [username, setUsername] = useState(''); + const [password, setPassword] = useState(''); + const [email, setEmail] = useState(''); + + const titleColor = useColorModeValue("red.500", "red.500"); + const textColor = useColorModeValue("white", "black"); + + + + + const handleSubmit = async (e: { preventDefault: () => void; }) => { + e.preventDefault(); + try { + await FetchLogin(username, email, password); + + } catch (error) { + console.error('Network error', error); + // Handle network errors here + } + }; + + return ( + + + +
+ + + Login TUP + + + + Usuario + + setUsername(e.target.value)} + /> + + Contraseña + + setPassword(e.target.value)} + /> + + + + +
+
+ + + + +
+
+ ); +} + +export default LoginPage; \ No newline at end of file diff --git a/FrontAdmin/src/components/icons/alumno 1.png b/FrontAdmin/src/components/icons/alumno 1.png new file mode 100644 index 0000000..c80c018 Binary files /dev/null and b/FrontAdmin/src/components/icons/alumno 1.png differ diff --git a/FrontAdmin/src/components/icons/burbuja-de-chat 1.png b/FrontAdmin/src/components/icons/burbuja-de-chat 1.png new file mode 100644 index 0000000..46232a3 Binary files /dev/null and b/FrontAdmin/src/components/icons/burbuja-de-chat 1.png differ diff --git a/FrontAdmin/src/components/icons/configuracion 1.png b/FrontAdmin/src/components/icons/configuracion 1.png new file mode 100644 index 0000000..64d520e Binary files /dev/null and b/FrontAdmin/src/components/icons/configuracion 1.png differ diff --git a/FrontAdmin/src/components/icons/grafico-de-barras 1.png b/FrontAdmin/src/components/icons/grafico-de-barras 1.png new file mode 100644 index 0000000..1f09c09 Binary files /dev/null and b/FrontAdmin/src/components/icons/grafico-de-barras 1.png differ diff --git a/FrontAdmin/src/main.tsx b/FrontAdmin/src/main.tsx new file mode 100644 index 0000000..e039637 --- /dev/null +++ b/FrontAdmin/src/main.tsx @@ -0,0 +1,10 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import App from './App.tsx' + + +ReactDOM.createRoot(document.getElementById('root')!).render( + + + , +) diff --git a/FrontAdmin/src/vite-env.d.ts b/FrontAdmin/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/FrontAdmin/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/FrontAdmin/tsconfig.json b/FrontAdmin/tsconfig.json new file mode 100644 index 0000000..a7fc6fb --- /dev/null +++ b/FrontAdmin/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["src"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/FrontAdmin/tsconfig.node.json b/FrontAdmin/tsconfig.node.json new file mode 100644 index 0000000..97ede7e --- /dev/null +++ b/FrontAdmin/tsconfig.node.json @@ -0,0 +1,11 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true, + "strict": true + }, + "include": ["vite.config.ts"] +} diff --git a/FrontAdmin/vite.config.ts b/FrontAdmin/vite.config.ts new file mode 100644 index 0000000..861b04b --- /dev/null +++ b/FrontAdmin/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react()], +}) diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..7d5b460 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +# MIT License + +Copyright (c) 2024 Universidad Tecnologica Nacional + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..fa0833d --- /dev/null +++ b/README.md @@ -0,0 +1,247 @@ + +# :computer: _Sistema de Gestion TUP_ :rocket::books: + +![GitHub followers](https://img.shields.io/github/followers/samuop) ![GitHub forks](https://img.shields.io/github/forks/samuop/GestionTUP) ![GitHub Repo stars](https://img.shields.io/github/stars/samuop/GestionTUP) ![GitHub watchers](https://img.shields.io/github/watchers/samuop/GestionTUP) [![License](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE) + +[![Django](https://img.shields.io/badge/Django-5.0.7-green.svg)](https://www.djangoproject.com/) [![Python](https://img.shields.io/badge/Python-3.10.0-blue.svg)](https://www.python.org/) [![React](https://img.shields.io/badge/React-17.0.2-blue.svg)](https://reactjs.org/) [![TypeScript](https://img.shields.io/badge/TypeScript-4.3.5-blue.svg)](https://www.typescriptlang.org/) [![Vite](https://img.shields.io/badge/Vite-2.4.4-blue.svg)](https://vitejs.dev/) [![Docker](https://img.shields.io/badge/Docker-20.10.7-blue.svg)](https://www.docker.com/) [![Docker Compose](https://img.shields.io/badge/Docker_Compose-1.29.2-blue.svg)](https://docs.docker.com/compose/) [![ESLint](https://img.shields.io/badge/ESLint-7.32.0-blue.svg)](https://eslint.org/) [![Prettier](https://img.shields.io/badge/Prettier-2.4.1-orange.svg)](https://prettier.io/) [![Google Cloud](https://img.shields.io/badge/Google_Cloud-Run-lightblue.svg)](https://cloud.google.com/run) + +[![Run on Google Cloud](https://deploy.cloud.run/button.svg)](https://deploy.cloud.run) + +## :notebook: Table of Contents :ledger: + +- [:computer: _Sistema de Gestion TUP_ :rocket::books:](#computer-sistema-de-gestion-tup-rocketbooks) + - [:notebook: Table of Contents :ledger:](#notebook-table-of-contents-ledger) + - [About the project :briefcase:](#about-the-project-briefcase) + - [Team :busts\_in\_silhouette: :star:](#team-busts_in_silhouette-star) + - [Documentation :notebook:](#documentation-notebook) + - [Frontend Documentation (React)](#frontend-documentation-react) + - [React + TypeScript + Vite](#react--typescript--vite) + - [Expanding the ESLint configuration](#expanding-the-eslint-configuration) + - [Backend :snake:🧑‍💻](#backend-snake) + - [Setting up the backend](#setting-up-the-backend) + - [Setting up the Docker container](#setting-up-the-docker-container) + +## About the project :briefcase: + +Team project for the Seminario Universitario course at the UTN - FRRe. The project consists of a web application for managing the TUP (Tecnicatura Universitaria en Programacion) of the students of the UTN - FRRe. The project is divided into two parts, the frontend and the backend. The frontend is developed using React/TS/Vite and the backend using Python with Django/DRF. + +## Team :busts_in_silhouette: :star: + +[carlosferreyra]: +[TobiasMaciel]: +[yoelmarain]: +[facundomelgarejo]: +[MirandaAriano]: +[samuop]: + +- [Ferreyra, Carlos Eduardo][carlosferreyra] +- [Maciel Meister, Tobias Alejandro][TobiasMaciel] +- [Marain, Yoel Mario][yoelmarain] +- [Melgarejo Roma, Facundo Gabriel][facundomelgarejo] +- [Miranda Falkievich, Ariano Gabriel][MirandaAriano] + +- [Pallares, Ulises Pablo] +- [Paredes, Samuel Octavio][samuop] +- [Robales Lopez, Lautaro Nicols] + +## Documentation :notebook: + +### Frontend Documentation (React) + +#### React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +#### Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default { + // other rules... + parserOptions: { + ecmaVersion: 'latest', + sourceType: 'module', + project: ['./tsconfig.json', './tsconfig.node.json'], + tsconfigRootDir: __dirname, + }, +} +``` + +- Replace `plugin:@typescript-eslint/recommended` to `plugin:@typescript-eslint/recommended-type-checked` or `plugin:@typescript-eslint/strict-type-checked` +- Optionally add `plugin:@typescript-eslint/stylistic-type-checked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and add `plugin:react/recommended` & `plugin:react/jsx-runtime` to the `extends` list + +======================================= + +[DjangoDocs]: +[PythonDocs]: +[DRFDocs]: +[DRFSpectacularDocs]: +[APIUrl]: + +### Backend :snake:🧑‍💻 + +This section is used for setting up the backend [Django][DjangoDocs] server, using [Python][PythonDocs] and [Django REST framework][DRFDocs], along with 3th party libraries like [drf-spectacular][DRFSpectacularDocs] for API documentation. + +You can test the current backend (only Swagger API endpoint done so far) by visiting the following [URL][APIUrl] deployed in GCP (Google Cloud Platform): +This deployment is done using the `Dockerfile`. +This template provides a minimal setup to get Python working in a Django web server. + +#### Setting up the backend + +- Tools needed: + - Python 3.10 or higher + - pip (Python package manager) + - venv (Python virtual environment manager) + - Docker (optional) + - Docker Compose (optional) + - Git (optional) + - Visual Studio Code (optional - recommended) + +Steps to set up the backend environment: + +1. Install Python 3.10 or higher using the package manager from you OS: + 1. if macOS run using zsh: + + ```bash + brew install python + ``` + + 2. if Ubuntu/Debian run using bash: + + ```bash + sudo apt-get install python3 + ``` + + 3. if Windows run using PowerShell or PowerShell Core: + + ```bash + winget install python + ``` + + **Note:** _If you are using a different OS, or prefer a manual installation, please refer to the official Python [download page](https://www.python.org/downloads/)_ +2. Install pip (Python package manager): + + ```bash + python -m ensurepip + ``` + + to get the latest version of pip: + + ```bash + python -m pip install --upgrade pip + ``` + +3. At the root of the project, create a virtual environment + + ```bash + python -m venv venv + ``` + +4. Activate the virtual environment using: + 1. On macOS/Linux: + + ```bash + source venv/bin/activate + ``` + + 2. On Windows: + + ```bash + .\venv\Scripts\Activate + ``` + + **Note:** + +- _You can deactivate the virtual environment using the `deactivate` command, once you are done working on the project._ +- _A complete list of python dependencies can be found in the `requirements.txt` file at the root of the project._ + +##### Setting up the Docker container + +1. Install Docker using the official [Docker Desktop](https://www.docker.com/products/docker-desktop) application or using the package manager from your OS: + 1.On macOS run: + + ```bash + brew install docker + ``` + + 2.On Linux/Debian run: + + ```bash + sudo apt-get install docker + ``` + + 1.On Windows run: + + ```bash + winget install docker + ``` + + _**Note:**_ _You may also need to install Docker Compose using `brew install docker-compose` in macOS or `sudo apt-get install docker-compose` in Ubuntu/Debian_ +2. Build the Docker image using at the root of the project: + + ```bash + docker build -t [backend] . #replace `[backend]` with the desired image name + ``` + + Docker settings can be configured in the `Dockerfile` and `docker-compose.yml` files at the root of the project. +3. Run the Docker container using + + ```bash + docker run -p 8000:8000 [backend] #replace `[backend]` with the image name used in the previous step. + ``` + + You can also run the container in the background using the `-d` flag or specify a different port using `-p [host_port]:8000` +4. If defaults settings are used,the Django server should now be running on + + ```bash + http://localhost:8000/ + ``` + +5. You can access the Django admin panel (if the '_DEBUG_' flag is set to True): + + ```bash + http://localhost:8000/_/` #using superuser credentials + ``` + +6. You can access the API documentation with Swagger UI at `http://localhost:8000/api/swagger-ui/` or +7. You can access the API documentation with ReDoc at `http://localhost:8000/api/redoc-ui/` +8. to stop the container press `Ctrl + C` in the terminal where the container is running. + + *_If the container is running in the background use:_ + + ```bash + docker ps #get the container ID + ``` + + and then: + + ```bash + docker stop [container_id] #replace `[container_id]` with the container ID + ``` + +9. to restart the container use: + + ```bash + docker start [container_id] #replace `[container_id]` with the container ID + ``` + +10. to remove the image use: + + ```bash + docker rmi [backend] #replace `[backend]` with the image name + ``` + +11. to remove the container and image use: + + ```bash + docker rm -f [container_id] #replace `[container_id]` with the container ID + ``` diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..034e848 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,21 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ------- | ------------------ | +| 5.1.x | :white_check_mark: | +| 5.0.x | :x: | +| 4.0.x | :white_check_mark: | +| < 4.0 | :x: | + +## Reporting a Vulnerability + +Use this section to tell people how to report a vulnerability. + +Tell them where to go, how often they can expect to get an update on a +reported vulnerability, what to expect if the vulnerability is accepted or +declined, etc. diff --git a/backend/api/__init__.py b/backend/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/__pycache__/__init__.cpython-312.pyc b/backend/api/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..d7e17fc Binary files /dev/null and b/backend/api/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/api/__pycache__/serializers.cpython-312.pyc b/backend/api/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000..ba451ef Binary files /dev/null and b/backend/api/__pycache__/serializers.cpython-312.pyc differ diff --git a/backend/api/__pycache__/tests.cpython-312.pyc b/backend/api/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000..ee85a59 Binary files /dev/null and b/backend/api/__pycache__/tests.cpython-312.pyc differ diff --git a/backend/api/__pycache__/urls.cpython-312.pyc b/backend/api/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000..368cf87 Binary files /dev/null and b/backend/api/__pycache__/urls.cpython-312.pyc differ diff --git a/backend/api/admin.py b/backend/api/admin.py new file mode 100644 index 0000000..bdb6a6d --- /dev/null +++ b/backend/api/admin.py @@ -0,0 +1,3 @@ +# api/admin.py + +# Register your models into the admin. diff --git a/backend/api/apps.py b/backend/api/apps.py new file mode 100644 index 0000000..9b32d40 --- /dev/null +++ b/backend/api/apps.py @@ -0,0 +1,11 @@ +from django.apps import AppConfig + + +class ApiConfig(AppConfig): + """ + This class is used to configure the api app. + :param AppConfig: This class is used to configure the api app. + """ + + default_auto_field = "django.db.models.BigAutoField" + name = "api" diff --git a/backend/api/migrations/__init__.py b/backend/api/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/migrations/__pycache__/__init__.cpython-312.pyc b/backend/api/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..e51a278 Binary files /dev/null and b/backend/api/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/api/models.py b/backend/api/models.py new file mode 100644 index 0000000..aa0ea2d --- /dev/null +++ b/backend/api/models.py @@ -0,0 +1,3 @@ +# api/models.py + +# Create your models here. diff --git a/backend/api/schemas.py b/backend/api/schemas.py new file mode 100644 index 0000000..176f95d --- /dev/null +++ b/backend/api/schemas.py @@ -0,0 +1,6 @@ +# api/schema.py + +""" +This module contains the schema for the API using drf_spectacular. +:param module: This module contains the schema for the API. +:returns: The schema for the API.""" diff --git a/backend/api/serializers.py b/backend/api/serializers.py new file mode 100644 index 0000000..9620879 --- /dev/null +++ b/backend/api/serializers.py @@ -0,0 +1,22 @@ +# users/seralizers.py +from dj_rest_auth.serializers import JWTSerializerWithExpiration +from drf_spectacular.utils import extend_schema_field +from dj_rest_auth.serializers import UserDetailsSerializer +from dj_rest_auth.jwt_auth import ( + CookieTokenRefreshSerializer as DjRestAuthCookieTokenRefreshSerializer, +) + + +class CustomJWTSerializerWithExpiration(JWTSerializerWithExpiration): + @extend_schema_field( + field=UserDetailsSerializer, + ) + def get_user(self, obj): + """ + Required to allow using custom USER_DETAILS_SERIALIZER in + JWTSerializer. Defining it here to avoid circular imports + + :param obj: The object to be serialized. + :return: The serialized object. + """ + return super().get_user(obj) diff --git a/backend/api/signals.py b/backend/api/signals.py new file mode 100644 index 0000000..72237b5 --- /dev/null +++ b/backend/api/signals.py @@ -0,0 +1,25 @@ +# api/signals.py + +from django.db.models.signals import post_save +from drf_spectacular.utils import extend_schema +from django.dispatch import receiver +from django.http import HttpRequest +from drf_spectacular.utils import extend_schema + + +@receiver(post_save) +def generate_schema_on_request(sender, instance=None, created=False, **kwargs) -> None: + """ + :param sender: The sender of the signal. + :param instance: The instance of the sender. + :param created: A boolean indicating if the instance was created. + :param kwargs: Additional keyword arguments. + :return: None + :raises: No exceptions raised. + """ + if not isinstance(instance, HttpRequest): + return # Ignore non-request signals + + # Check if URL matches schema or swagger UI endpoints + if instance.path.startswith("/schema") or instance.path.startswith("/swagger"): + pass # Schema already generated diff --git a/backend/api/tests.py b/backend/api/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/api/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/api/urls.py b/backend/api/urls.py new file mode 100644 index 0000000..f8995a9 --- /dev/null +++ b/backend/api/urls.py @@ -0,0 +1,33 @@ +# api/urls.py + +# create a router and register our viewsets with it +from django.conf import settings +from django.urls import path +from drf_spectacular.views import ( + SpectacularAPIView, + SpectacularRedocView, + SpectacularSwaggerView, +) +from rest_framework_simplejwt.views import ( + TokenObtainPairView, + TokenRefreshView, + TokenVerifyView, +) + +urlpatterns = [ + path("token/", TokenObtainPairView.as_view(), name="token_obtain_pair"), + path("token/refresh/", TokenRefreshView.as_view(), name="token_refresh"), + path("token/verify/", TokenVerifyView.as_view(), name="token_verify"), + path("schema/", SpectacularAPIView.as_view(), name="schema"), + path( + "swagger-ui/", + SpectacularSwaggerView.as_view(url_name="schema"), + name="swagger-ui", + ), + path("redoc-ui/", SpectacularRedocView.as_view(url_name="schema"), name="redoc-ui"), +] +if settings.DEBUG: + # add admin to the urlpatterns if DEBUG is True + from django.contrib import admin + + urlpatterns += [path("admin/", admin.site.urls)] diff --git a/backend/api/views.py b/backend/api/views.py new file mode 100644 index 0000000..6ecbc62 --- /dev/null +++ b/backend/api/views.py @@ -0,0 +1,3 @@ +# api/models.py + +# Create your views here. diff --git a/backend/core/__init__.py b/backend/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/core/__pycache__/__init__.cpython-312.pyc b/backend/core/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..360c3e9 Binary files /dev/null and b/backend/core/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/core/__pycache__/admin.cpython-312.pyc b/backend/core/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000..8e85ad4 Binary files /dev/null and b/backend/core/__pycache__/admin.cpython-312.pyc differ diff --git a/backend/core/__pycache__/apps.cpython-312.pyc b/backend/core/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000..bd8e12a Binary files /dev/null and b/backend/core/__pycache__/apps.cpython-312.pyc differ diff --git a/backend/core/__pycache__/models.cpython-312.pyc b/backend/core/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000..79db7c5 Binary files /dev/null and b/backend/core/__pycache__/models.cpython-312.pyc differ diff --git a/backend/core/__pycache__/serializers.cpython-312.pyc b/backend/core/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000..f758c56 Binary files /dev/null and b/backend/core/__pycache__/serializers.cpython-312.pyc differ diff --git a/backend/core/__pycache__/tests.cpython-312.pyc b/backend/core/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000..6b86c37 Binary files /dev/null and b/backend/core/__pycache__/tests.cpython-312.pyc differ diff --git a/backend/core/__pycache__/urls.cpython-312.pyc b/backend/core/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000..d4bf4a5 Binary files /dev/null and b/backend/core/__pycache__/urls.cpython-312.pyc differ diff --git a/backend/core/__pycache__/views.cpython-312.pyc b/backend/core/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000..8673dc2 Binary files /dev/null and b/backend/core/__pycache__/views.cpython-312.pyc differ diff --git a/backend/core/admin.py b/backend/core/admin.py new file mode 100644 index 0000000..650fa6c --- /dev/null +++ b/backend/core/admin.py @@ -0,0 +1,25 @@ +# core/admin.py +from django.contrib import admin +import core.models as models + +# unregister the default OutstandingTokenAdmin +# from rest_framework_simplejwt.token_blacklist.models import OutstandingToken +# from rest_framework_simplejwt.token_blacklist.admin import OutstandingTokenAdmin +# admin.site.unregister(OutstandingToken) +# admin.site.unregister(OutstandingTokenAdmin) + +# Register your models here. +# admin.site.register(models.Materia) +# admin.site.register(models.Alumno) +# admin.site.register(models.MateriaAlumno) +# admin.site.register(models.CompromisoDePago) +# admin.site.register(models.Pago) +# admin.site.register(models.Cuota) +# admin.site.register(models.Inhabilitacion) +# admin.site.register(models.TipoInhabilitacion) +# admin.site.register(models.Administrador) +# admin.site.register(models.TipoEstado) +# admin.site.register(models.Rol) +# admin.site.register(models.Permisos) +# admin.site.register(models.AdminRol) +# admin.site.register(models.RolPermiso) diff --git a/backend/core/apps.py b/backend/core/apps.py new file mode 100644 index 0000000..c0ce093 --- /dev/null +++ b/backend/core/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CoreConfig(AppConfig): + default_auto_field = "django.db.models.BigAutoField" + name = "core" diff --git a/backend/core/migrations/0001_initial.py b/backend/core/migrations/0001_initial.py new file mode 100644 index 0000000..99ffed6 --- /dev/null +++ b/backend/core/migrations/0001_initial.py @@ -0,0 +1,138 @@ +# Generated by Django 5.0.6 on 2024-07-08 21:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Administrador', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('dni', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='AdminRol', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='Alumno', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('legajo', models.IntegerField()), + ('dni', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='CompromisoDePago', + fields=[ + ('id_comp_pago', models.AutoField(primary_key=True, serialize=False)), + ('perfciclo', models.DateTimeField()), + ('monto', models.FloatField()), + ('firmado', models.BooleanField()), + ('fecha_firmado', models.DateTimeField()), + ('compromiso', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Cuota', + fields=[ + ('id_cuota', models.AutoField(primary_key=True, serialize=False)), + ('nro_cuota', models.IntegerField()), + ('recargo', models.FloatField()), + ('monto', models.FloatField()), + ('firmado', models.BooleanField()), + ('vencimiento', models.DateField()), + ('fecha_pago', models.DateField()), + ('fecha_vencimiento', models.DateField()), + ('fecha_pago_devengado', models.DateField()), + ('fecha_pedido', models.DateField()), + ('tipo_puesto', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Inhabilitacion', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('fecha_desde', models.DateTimeField()), + ('fecha_hasta', models.DateTimeField()), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='Materia', + fields=[ + ('id_materia', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('cuatrimestre', models.PositiveSmallIntegerField()), + ], + ), + migrations.CreateModel( + name='MateriaAlumno', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('offrc', models.IntegerField()), + ('atendnc', models.IntegerField()), + ], + ), + migrations.CreateModel( + name='Pago', + fields=[ + ('id_pago', models.AutoField(primary_key=True, serialize=False)), + ('descripcion', models.TextField()), + ('medio_pago', models.CharField(max_length=255)), + ('nro_recibo', models.IntegerField()), + ('monto', models.FloatField()), + ('estado', models.BooleanField()), + ('fecha', models.DateField()), + ('comprobante', models.CharField(max_length=255)), + ], + ), + migrations.CreateModel( + name='Permisos', + fields=[ + ('id_permiso', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='Rol', + fields=[ + ('id_rol', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='RolPermiso', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ], + ), + migrations.CreateModel( + name='TipoEstado', + fields=[ + ('id_tipo_estado', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + migrations.CreateModel( + name='TipoInhabilitacion', + fields=[ + ('id_tipo_inhabilitacion', models.AutoField(primary_key=True, serialize=False)), + ('nombre', models.CharField(max_length=255)), + ('descripcion', models.TextField()), + ], + ), + ] diff --git a/backend/core/migrations/0002_initial.py b/backend/core/migrations/0002_initial.py new file mode 100644 index 0000000..22941af --- /dev/null +++ b/backend/core/migrations/0002_initial.py @@ -0,0 +1,100 @@ +# Generated by Django 5.0.6 on 2024-07-08 21:24 + +import django.db.models.deletion +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('core', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.AddField( + model_name='administrador', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='adminrol', + name='id_admin', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.administrador'), + ), + migrations.AddField( + model_name='alumno', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='compromisodepago', + name='alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='inhabilitacion', + name='id_alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='materiaalumno', + name='id_alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='materiaalumno', + name='id_materia', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.materia'), + ), + migrations.AddField( + model_name='pago', + name='alumno', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.alumno'), + ), + migrations.AddField( + model_name='pago', + name='cuota', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.cuota'), + ), + migrations.AddField( + model_name='adminrol', + name='id_rol', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.rol'), + ), + migrations.AddField( + model_name='rolpermiso', + name='id_permiso', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.permisos'), + ), + migrations.AddField( + model_name='rolpermiso', + name='id_rol', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.rol'), + ), + migrations.AddField( + model_name='alumno', + name='estado', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.tipoestado'), + ), + migrations.AddField( + model_name='inhabilitacion', + name='id_tipo_inhabilitacion', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.tipoinhabilitacion'), + ), + migrations.AlterUniqueTogether( + name='materiaalumno', + unique_together={('id_materia', 'id_alumno')}, + ), + migrations.AlterUniqueTogether( + name='adminrol', + unique_together={('id_admin', 'id_rol')}, + ), + migrations.AlterUniqueTogether( + name='rolpermiso', + unique_together={('id_rol', 'id_permiso')}, + ), + ] diff --git a/backend/core/migrations/__init__.py b/backend/core/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/core/migrations/__pycache__/0001_initial.cpython-312.pyc b/backend/core/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000..bf77d0a Binary files /dev/null and b/backend/core/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/backend/core/migrations/__pycache__/0002_initial.cpython-312.pyc b/backend/core/migrations/__pycache__/0002_initial.cpython-312.pyc new file mode 100644 index 0000000..fbee771 Binary files /dev/null and b/backend/core/migrations/__pycache__/0002_initial.cpython-312.pyc differ diff --git a/backend/core/migrations/__pycache__/__init__.cpython-312.pyc b/backend/core/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..404ac18 Binary files /dev/null and b/backend/core/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/core/models.py b/backend/core/models.py new file mode 100644 index 0000000..3ffb785 --- /dev/null +++ b/backend/core/models.py @@ -0,0 +1,327 @@ +# core/models.py + +# django imports +from django.conf import settings +from django.db import models + + +# Create your models here. +class Materia(models.Model): + """ + Represents a subject or course. + + Args: + models (type): The Django models module. + + Attributes: + id_materia (AutoField): The primary key for the Materia model. + nombre (CharField): The name of the subject. + cuatrimestre (PositiveSmallIntegerField): The semester in which\ + the subject is offered. + """ + + id_materia = models.AutoField(primary_key=True) + nombre = models.CharField(max_length=255) + cuatrimestre = models.PositiveSmallIntegerField() + + +class Alumno(models.Model): + """ + Represents a student. + + Args: + models (type): The Django models module. + + Attributes: + user (CustomUser): The associated user object. + legajo (int): The student's identification number. + dni (int): The student's national identification number. + estado (TipoEstado): The student's current state. + + """ + + user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + legajo = models.IntegerField() + dni = models.IntegerField() + estado = models.ForeignKey("TipoEstado", on_delete=models.CASCADE) + + +class MateriaAlumno(models.Model): + """ + Represents the relationship between a Materia and an Alumno. + + Args: + models (type): The Django models module. + + Attributes: + id_materia (ForeignKey): The foreign key to the Materia model. + id_alumno (ForeignKey): The foreign key to the Alumno model. + offrc (IntegerField): The number of times the Materia has been offered. + atendnc (IntegerField): The number of times \ + the Alumno has attended the Materia. + + Meta: + unique_together (tuple): Specifies that the combination of \ + id_materia and id_alumno should be unique. + """ + + id_materia = models.ForeignKey(Materia, on_delete=models.CASCADE) + id_alumno = models.ForeignKey(Alumno, on_delete=models.CASCADE) + offrc = models.IntegerField() + atendnc = models.IntegerField() + + class Meta: + """ + This class provides metadata options for the model. + """ + + unique_together: tuple[tuple[str, str]] = (("id_materia", "id_alumno"),) + + +class CompromisoDePago(models.Model): + """ + Represents a payment commitment. + + Args: + models (type): The Django models module. + + Attributes: + id_comp_pago (AutoField): The primary key for the payment commitment. + perfciclo (DateTimeField): The date and time of the payment commitment. + monto (FloatField): The amount of the payment commitment. + firmado (BooleanField): Indicates if \ + the payment commitment has been signed. + fecha_firmado (DateTimeField): The date and time when \ + the payment commitment was signed. + compromiso (CharField): The description of the payment commitment. + alumno (ForeignKey): The foreign key to \ + the related Alumno (student) model. + """ + + id_comp_pago = models.AutoField(primary_key=True) + perfciclo = models.DateTimeField() + monto = models.FloatField() + firmado = models.BooleanField() + fecha_firmado = models.DateTimeField() + compromiso = models.CharField(max_length=255) + alumno = models.ForeignKey(Alumno, on_delete=models.CASCADE) + + +class Pago(models.Model): + """ + Represents a payment made by a student. + + Args: + models (type): The Django models module. + + Attributes: + id_pago (AutoField): The primary key for the payment. + descripcion (TextField): The description of the payment. + medio_pago (CharField): The payment method used. + nro_recibo (IntegerField): The receipt number of the payment. + monto (FloatField): The amount of the payment. + estado (BooleanField): The status of the payment. + fecha (DateField): The date of the payment. + comprobante (CharField): The payment receipt or proof. + alumno (ForeignKey): The foreign key to the associated student. + cuota (ForeignKey): The foreign key to the associated installment. + """ + + id_pago = models.AutoField(primary_key=True) + descripcion = models.TextField() + medio_pago = models.CharField(max_length=255) + nro_recibo = models.IntegerField() + monto = models.FloatField() + estado = models.BooleanField() + fecha = models.DateField() + comprobante = models.CharField(max_length=255) + alumno = models.ForeignKey(Alumno, on_delete=models.CASCADE) + cuota = models.ForeignKey("Cuota", on_delete=models.CASCADE) + + +class Cuota(models.Model): + """ + Represents a Cuota. + + Args: + models (type): The Django models module. + + Attributes: + id_cuota (AutoField): The primary key for the Cuota. + nro_cuota (IntegerField): The number of the Cuota. + recargo (FloatField): The recargo of the Cuota. + monto (FloatField): The monto of the Cuota. + firmado (BooleanField): Indicates if the Cuota has been firmado. + vencimiento (DateField): The vencimiento date of the Cuota. + fecha_pago (DateField): The fecha_pago date of the Cuota. + fecha_vencimiento (DateField): The fecha_vencimiento date of the Cuota. + fecha_pago_devengado (DateField): The fecha_pago_devengado date of \ + the Cuota. + fecha_pedido (DateField): The fecha_pedido date of the Cuota. + tipo_puesto (CharField): The tipo_puesto of the Cuota. + """ + + id_cuota = models.AutoField(primary_key=True) + nro_cuota = models.IntegerField() + recargo = models.FloatField() + monto = models.FloatField() + firmado = models.BooleanField() + vencimiento = models.DateField() + fecha_pago = models.DateField() + fecha_vencimiento = models.DateField() + fecha_pago_devengado = models.DateField() + fecha_pedido = models.DateField() + tipo_puesto = models.CharField(max_length=255) + + +class Inhabilitacion(models.Model): + """ + Represents an Inhabilitacion. + + Args: + models (type): The Django models module. + + Attributes: + id_alumno (ForeignKey): The foreign key to the Alumno model. + id_tipo_inhabilitacion (ForeignKey): The foreign key to \ + the TipoInhabilitacion model. + fecha_desde (DateTimeField): The starting date and time of \ + the inhabilitacion. + fecha_hasta (DateTimeField): The ending date and time of \ + the inhabilitacion. + descripcion (TextField): The description of the inhabilitacion. + """ + + id_alumno = models.ForeignKey(Alumno, on_delete=models.CASCADE) + id_tipo_inhabilitacion = models.ForeignKey( + "TipoInhabilitacion", on_delete=models.CASCADE + ) + fecha_desde = models.DateTimeField() + fecha_hasta = models.DateTimeField() + descripcion = models.TextField() + + +class TipoInhabilitacion(models.Model): + """ + TipoInhabilitacion represents a type of disqualification. + + Args: + models (django.db.models.Model): The base model class for \ + all Django models. + """ + + id_tipo_inhabilitacion = models.AutoField(primary_key=True) + nombre = models.CharField(max_length=255) + descripcion = models.TextField() + + +class Administrador(models.Model): + """ + Represents an administrator. + + Args: + models (type): The Django models module. + + Attributes: + user (OneToOneField): The user associated with the administrator. + dni (IntegerField): The DNI (Documento Nacional de Identidad)\ + of the administrator. + """ + + user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + dni = models.IntegerField() + + +class TipoEstado(models.Model): + """ + Represents a type of state. + + Attributes: + id_tipo_estado (AutoField): The primary key for \ + the TipoEstado instance. + nombre (CharField): The name of the TipoEstado. + descripcion (TextField): The description of the TipoEstado. + """ + + id_tipo_estado = models.AutoField(primary_key=True) + nombre = models.CharField(max_length=255) + descripcion = models.TextField() + + +class Rol(models.Model): + """ + Represents a role in the system. + + Attributes: + id_rol (AutoField): The primary key for the role. + nombre (CharField): The name of the role. + descripcion (TextField): The description of the role. + """ + + id_rol = models.AutoField(primary_key=True) + nombre = models.CharField(max_length=255) + descripcion = models.TextField() + + +class Permisos(models.Model): + """ + Permisos model represents the permissions available in the system. + + Args: + models (type): The base class for all Django models. + + Attributes: + id_permiso (AutoField): The primary key for the permission. + nombre (CharField): The name of the permission. + descripcion (TextField): The description of the permission. + """ + + id_permiso = models.AutoField(primary_key=True) + nombre = models.CharField(max_length=255) + descripcion = models.TextField() + + +class AdminRol(models.Model): + """ + Represents the relationship between an administrator and a role. + + Args: + models (type): The Django models module. + + Attributes: + id_admin (ForeignKey): The foreign key to the Administrador model. + id_rol (ForeignKey): The foreign key to the Rol model. + + Meta: + unique_together (tuple): Specifies that the combination of \ + id_admin and id_rol should be unique. + """ + + id_admin = models.ForeignKey(Administrador, on_delete=models.CASCADE) + id_rol = models.ForeignKey(Rol, on_delete=models.CASCADE) + + class Meta: + unique_together: tuple[tuple[str, str]] = (("id_admin", "id_rol"),) + + +class RolPermiso(models.Model): + """ + Represents the relationship between a role and a permission. + + Args: + models (type): The Django models module. + + Attributes: + id_rol (ForeignKey): The foreign key to the Rol model. + id_permiso (ForeignKey): The foreign key to the Permisos model. + + Meta: + unique_together (tuple[tuple[str, str]]): Specifies that\ + the combination of id_rol and id_permiso should be unique. + """ + + id_rol = models.ForeignKey(Rol, on_delete=models.CASCADE) + id_permiso = models.ForeignKey(Permisos, on_delete=models.CASCADE) + + class Meta: + unique_together: tuple[tuple[str, str]] = (("id_rol", "id_permiso"),) diff --git a/backend/core/serializers.py b/backend/core/serializers.py new file mode 100644 index 0000000..8194795 --- /dev/null +++ b/backend/core/serializers.py @@ -0,0 +1,97 @@ +# core/serializers.py +# apps imports +from core.models import * +from core.serializers import * + +# third party imports +from rest_framework import serializers + +# custom imports +from users.models import * +from users.serializers import * + +# Create your serializers here. + + +class MateriaSerializer(serializers.ModelSerializer): + class Meta: + model = Materia + fields = "__all__" + + +class AlumnoSerializer(serializers.ModelSerializer): + class Meta: + model = Alumno + fields = "__all__" + + +class MateriaAlumnoSerializer(serializers.ModelSerializer): + class Meta: + model = MateriaAlumno + fields = "__all__" + + +class CompromisoDePagoSerializer(serializers.ModelSerializer): + class Meta: + model = CompromisoDePago + fields = "__all__" + + +class PagoSerializer(serializers.ModelSerializer): + class Meta: + model = Pago + fields = "__all__" + + +class CuotaSerializer(serializers.ModelSerializer): + class Meta: + model = Cuota + fields = "__all__" + + +class InhabilitacionSerializer(serializers.ModelSerializer): + class Meta: + model = Inhabilitacion + fields = "__all__" + + +class TipoInhabilitacionSerializer(serializers.ModelSerializer): + class Meta: + model = TipoInhabilitacion + fields = "__all__" + + +class AdministradorSerializer(serializers.ModelSerializer): + class Meta: + model = Administrador + fields = "__all__" + + +class TipoEstadoSerializer(serializers.ModelSerializer): + class Meta: + model = TipoEstado + fields = "__all__" + + +class RolSerializer(serializers.ModelSerializer): + class Meta: + model = Rol + fields = "__all__" + + +class PermisosSerializer(serializers.ModelSerializer): + class Meta: + model = Permisos + fields = "__all__" + + +class AdminRolSerializer(serializers.ModelSerializer): + class Meta: + model = AdminRol + fields = "__all__" + + +class RolPermisoSerializer(serializers.ModelSerializer): + class Meta: + model = RolPermiso + fields = "__all__" diff --git a/backend/core/tests.py b/backend/core/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/core/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/core/urls.py b/backend/core/urls.py new file mode 100644 index 0000000..b696622 --- /dev/null +++ b/backend/core/urls.py @@ -0,0 +1,24 @@ +# core/urls.py +from django.urls import include, path +from rest_framework.routers import DefaultRouter +from .views import * + +router = DefaultRouter() +router.register(r"materias", MateriaViewSet) +router.register(r"alumnos", AlumnoViewSet) +router.register(r"materia-alumnos", MateriaAlumnoViewSet) +router.register(r"compromisos", CompromisoDePagoViewSet) +router.register(r"pagos", PagoViewSet) +router.register(r"cuotas", CuotaViewSet) +router.register(r"inhabilitaciones", InhabilitacionViewSet) +router.register(r"tipo-inhabilitaciones", TipoInhabilitacionViewSet) +router.register(r"administradores", AdministradorViewSet) +router.register(r"tipo-estados", TipoEstadoViewSet) +router.register(r"roles", RolViewSet) +router.register(r"permisos", PermisosViewSet) +router.register(r"admin-roles", AdminRolViewSet) +router.register(r"rol-permisos", RolPermisoViewSet) + +urlpatterns = [ + path("", include(router.urls)), +] diff --git a/backend/core/views.py b/backend/core/views.py new file mode 100644 index 0000000..316a317 --- /dev/null +++ b/backend/core/views.py @@ -0,0 +1,113 @@ +# core/views.py + +# django imports +from django.db.models.manager import BaseManager + +# third party imports +from rest_framework import viewsets + +# custom imports +from .models import ( + Administrador, + AdminRol, + Alumno, + CompromisoDePago, + Cuota, + Inhabilitacion, + Materia, + MateriaAlumno, + Pago, + Permisos, + Rol, + RolPermiso, + TipoEstado, + TipoInhabilitacion, +) +from .serializers import ( + AdministradorSerializer, + AdminRolSerializer, + AlumnoSerializer, + CompromisoDePagoSerializer, + CuotaSerializer, + InhabilitacionSerializer, + MateriaAlumnoSerializer, + MateriaSerializer, + PagoSerializer, + PermisosSerializer, + RolPermisoSerializer, + RolSerializer, + TipoEstadoSerializer, + TipoInhabilitacionSerializer, +) + +# Create your views here. + + +class MateriaViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Materia] = Materia.objects.all() + serializer_class = MateriaSerializer + + +class AlumnoViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Alumno] = Alumno.objects.all() + serializer_class = AlumnoSerializer + + +class MateriaAlumnoViewSet(viewsets.ModelViewSet): + queryset: BaseManager[MateriaAlumno] = MateriaAlumno.objects.all() + serializer_class = MateriaAlumnoSerializer + + +class CompromisoDePagoViewSet(viewsets.ModelViewSet): + queryset: BaseManager[CompromisoDePago] = CompromisoDePago.objects.all() + serializer_class = CompromisoDePagoSerializer + + +class PagoViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Pago] = Pago.objects.all() + serializer_class = PagoSerializer + + +class CuotaViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Cuota] = Cuota.objects.all() + serializer_class = CuotaSerializer + + +class InhabilitacionViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Inhabilitacion] = Inhabilitacion.objects.all() + serializer_class = InhabilitacionSerializer + + +class TipoInhabilitacionViewSet(viewsets.ModelViewSet): + queryset: BaseManager[TipoInhabilitacion] = TipoInhabilitacion.objects.all() + serializer_class = TipoInhabilitacionSerializer + + +class AdministradorViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Administrador] = Administrador.objects.all() + serializer_class = AdministradorSerializer + + +class TipoEstadoViewSet(viewsets.ModelViewSet): + queryset: BaseManager[TipoEstado] = TipoEstado.objects.all() + serializer_class = TipoEstadoSerializer + + +class RolViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Rol] = Rol.objects.all() + serializer_class = RolSerializer + + +class PermisosViewSet(viewsets.ModelViewSet): + queryset: BaseManager[Permisos] = Permisos.objects.all() + serializer_class = PermisosSerializer + + +class AdminRolViewSet(viewsets.ModelViewSet): + queryset: BaseManager[AdminRol] = AdminRol.objects.all() + serializer_class = AdminRolSerializer + + +class RolPermisoViewSet(viewsets.ModelViewSet): + queryset: BaseManager[RolPermiso] = RolPermiso.objects.all() + serializer_class = RolPermisoSerializer diff --git a/backend/manage.py b/backend/manage.py new file mode 100755 index 0000000..79fd610 --- /dev/null +++ b/backend/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import sys +from os import environ as env + + +def main() -> None: + """Run administrative tasks.""" + env.setdefault(key="DJANGO_SETTINGS_MODULE", value="server.settings.base") + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == "__main__": + main() diff --git a/backend/schema.yml b/backend/schema.yml new file mode 100644 index 0000000..be2b232 --- /dev/null +++ b/backend/schema.yml @@ -0,0 +1,3783 @@ +openapi: 3.0.3 +info: + title: Gestion TUP API + version: 0.1.0 + x-logo: + url: https://www.djangoproject.com /m/img/logos/django-logo-negative.png + backgroundColor: '#FFFFFF' + altText: Django Logo + description: API Endpoint Documentation for Gestion TUP + termsOfService: https://github.com/samuop/GestionTUP/blob/main/README.md + contact: + name: API Support + url: https://github.com/carlosferreyra/GestionTUP + email: eduferreyraok@gmail.com + license: + name: MIT License + url: https://opensource.org/licenses/MIT +paths: + /api/schema/: + get: + operationId: api_schema_retrieve + description: |- + OpenApi3 schema for this API. Format can be selected via content negotiation. + + - YAML: application/vnd.oai.openapi + - JSON: application/vnd.oai.openapi+json + parameters: + - in: query + name: format + schema: + type: string + enum: + - json + - yaml + - in: query + name: lang + schema: + type: string + enum: + - af + - ar + - ar-dz + - ast + - az + - be + - bg + - bn + - br + - bs + - ca + - ckb + - cs + - cy + - da + - de + - dsb + - el + - en + - en-au + - en-gb + - eo + - es + - es-ar + - es-co + - es-mx + - es-ni + - es-ve + - et + - eu + - fa + - fi + - fr + - fy + - ga + - gd + - gl + - he + - hi + - hr + - hsb + - hu + - hy + - ia + - id + - ig + - io + - is + - it + - ja + - ka + - kab + - kk + - km + - kn + - ko + - ky + - lb + - lt + - lv + - mk + - ml + - mn + - mr + - ms + - my + - nb + - ne + - nl + - nn + - os + - pa + - pl + - pt + - pt-br + - ro + - ru + - sk + - sl + - sq + - sr + - sr-latn + - sv + - sw + - ta + - te + - tg + - th + - tk + - tr + - tt + - udm + - ug + - uk + - ur + - uz + - vi + - zh-hans + - zh-hant + tags: + - api + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/vnd.oai.openapi: + schema: + type: object + additionalProperties: {} + application/yaml: + schema: + type: object + additionalProperties: {} + application/vnd.oai.openapi+json: + schema: + type: object + additionalProperties: {} + application/json: + schema: + type: object + additionalProperties: {} + description: '' + /api/token/: + post: + operationId: api_token_create + description: |- + Takes a set of user credentials and returns an access and refresh JSON web + token pair to prove the authentication of those credentials. + tags: + - api + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenObtainPairRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenObtainPairRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenObtainPairRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TokenObtainPair' + description: '' + /api/token/refresh/: + post: + operationId: api_token_refresh_create + description: |- + Takes a refresh type JSON web token and returns an access type JSON web + token if the refresh token is valid. + tags: + - api + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefresh' + description: '' + /api/token/verify/: + post: + operationId: api_token_verify_create + description: |- + Takes a token and indicates if it is valid. This view provides no + information about a token's fitness for a particular use. + tags: + - api + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + required: true + responses: + '200': + description: No response body + /core/admin-roles/: + get: + operationId: core_admin_roles_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/AdminRol' + description: '' + post: + operationId: core_admin_roles_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdminRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdminRolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + /core/admin-roles/{id}/: + get: + operationId: core_admin_roles_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + put: + operationId: core_admin_roles_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdminRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdminRolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + patch: + operationId: core_admin_roles_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAdminRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAdminRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAdminRolRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/AdminRol' + description: '' + delete: + operationId: core_admin_roles_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this admin rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/administradores/: + get: + operationId: core_administradores_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Administrador' + description: '' + post: + operationId: core_administradores_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdministradorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdministradorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdministradorRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + /core/administradores/{id}/: + get: + operationId: core_administradores_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + put: + operationId: core_administradores_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AdministradorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AdministradorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AdministradorRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + patch: + operationId: core_administradores_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAdministradorRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAdministradorRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAdministradorRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Administrador' + description: '' + delete: + operationId: core_administradores_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this administrador. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/alumnos/: + get: + operationId: core_alumnos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Alumno' + description: '' + post: + operationId: core_alumnos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + /core/alumnos/{id}/: + get: + operationId: core_alumnos_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + put: + operationId: core_alumnos_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/AlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/AlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/AlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + patch: + operationId: core_alumnos_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedAlumnoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Alumno' + description: '' + delete: + operationId: core_alumnos_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/compromisos/: + get: + operationId: core_compromisos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + post: + operationId: core_compromisos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + /core/compromisos/{id_comp_pago}/: + get: + operationId: core_compromisos_retrieve + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + put: + operationId: core_compromisos_update + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CompromisoDePagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + patch: + operationId: core_compromisos_partial_update + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCompromisoDePagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCompromisoDePagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCompromisoDePagoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CompromisoDePago' + description: '' + delete: + operationId: core_compromisos_destroy + parameters: + - in: path + name: id_comp_pago + schema: + type: integer + description: A unique integer value identifying this compromiso de pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/cuotas/: + get: + operationId: core_cuotas_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Cuota' + description: '' + post: + operationId: core_cuotas_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CuotaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CuotaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CuotaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + /core/cuotas/{id_cuota}/: + get: + operationId: core_cuotas_retrieve + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + put: + operationId: core_cuotas_update + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CuotaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CuotaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CuotaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + patch: + operationId: core_cuotas_partial_update + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedCuotaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedCuotaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedCuotaRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Cuota' + description: '' + delete: + operationId: core_cuotas_destroy + parameters: + - in: path + name: id_cuota + schema: + type: integer + description: A unique integer value identifying this cuota. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/inhabilitaciones/: + get: + operationId: core_inhabilitaciones_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + post: + operationId: core_inhabilitaciones_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + /core/inhabilitaciones/{id}/: + get: + operationId: core_inhabilitaciones_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + put: + operationId: core_inhabilitaciones_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/InhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + patch: + operationId: core_inhabilitaciones_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedInhabilitacionRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Inhabilitacion' + description: '' + delete: + operationId: core_inhabilitaciones_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/materia-alumnos/: + get: + operationId: core_materia_alumnos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + post: + operationId: core_materia_alumnos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + /core/materia-alumnos/{id}/: + get: + operationId: core_materia_alumnos_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + put: + operationId: core_materia_alumnos_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaAlumnoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + patch: + operationId: core_materia_alumnos_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMateriaAlumnoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMateriaAlumnoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMateriaAlumnoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaAlumno' + description: '' + delete: + operationId: core_materia_alumnos_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this materia alumno. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/materias/: + get: + operationId: core_materias_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Materia' + description: '' + post: + operationId: core_materias_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + /core/materias/{id_materia}/: + get: + operationId: core_materias_retrieve + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + put: + operationId: core_materias_update + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/MateriaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/MateriaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/MateriaRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + patch: + operationId: core_materias_partial_update + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedMateriaRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedMateriaRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedMateriaRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Materia' + description: '' + delete: + operationId: core_materias_destroy + parameters: + - in: path + name: id_materia + schema: + type: integer + description: A unique integer value identifying this materia. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/pagos/: + get: + operationId: core_pagos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Pago' + description: '' + post: + operationId: core_pagos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + /core/pagos/{id_pago}/: + get: + operationId: core_pagos_retrieve + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + put: + operationId: core_pagos_update + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PagoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + patch: + operationId: core_pagos_partial_update + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPagoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPagoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPagoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Pago' + description: '' + delete: + operationId: core_pagos_destroy + parameters: + - in: path + name: id_pago + schema: + type: integer + description: A unique integer value identifying this pago. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/permisos/: + get: + operationId: core_permisos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Permisos' + description: '' + post: + operationId: core_permisos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PermisosRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PermisosRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PermisosRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + /core/permisos/{id_permiso}/: + get: + operationId: core_permisos_retrieve + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + put: + operationId: core_permisos_update + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PermisosRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PermisosRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PermisosRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + patch: + operationId: core_permisos_partial_update + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedPermisosRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedPermisosRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedPermisosRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Permisos' + description: '' + delete: + operationId: core_permisos_destroy + parameters: + - in: path + name: id_permiso + schema: + type: integer + description: A unique integer value identifying this permisos. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/rol-permisos/: + get: + operationId: core_rol_permisos_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/RolPermiso' + description: '' + post: + operationId: core_rol_permisos_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + /core/rol-permisos/{id}/: + get: + operationId: core_rol_permisos_retrieve + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + put: + operationId: core_rol_permisos_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolPermisoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + patch: + operationId: core_rol_permisos_partial_update + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedRolPermisoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedRolPermisoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedRolPermisoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RolPermiso' + description: '' + delete: + operationId: core_rol_permisos_destroy + parameters: + - in: path + name: id + schema: + type: integer + description: A unique integer value identifying this rol permiso. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/roles/: + get: + operationId: core_roles_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/Rol' + description: '' + post: + operationId: core_roles_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + /core/roles/{id_rol}/: + get: + operationId: core_roles_retrieve + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + put: + operationId: core_roles_update + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RolRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + patch: + operationId: core_roles_partial_update + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedRolRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedRolRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedRolRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/Rol' + description: '' + delete: + operationId: core_roles_destroy + parameters: + - in: path + name: id_rol + schema: + type: integer + description: A unique integer value identifying this rol. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/tipo-estados/: + get: + operationId: core_tipo_estados_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TipoEstado' + description: '' + post: + operationId: core_tipo_estados_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + /core/tipo-estados/{id_tipo_estado}/: + get: + operationId: core_tipo_estados_retrieve + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + put: + operationId: core_tipo_estados_update + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoEstadoRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + patch: + operationId: core_tipo_estados_partial_update + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTipoEstadoRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTipoEstadoRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTipoEstadoRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoEstado' + description: '' + delete: + operationId: core_tipo_estados_destroy + parameters: + - in: path + name: id_tipo_estado + schema: + type: integer + description: A unique integer value identifying this tipo estado. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /core/tipo-inhabilitaciones/: + get: + operationId: core_tipo_inhabilitaciones_list + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + post: + operationId: core_tipo_inhabilitaciones_create + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + /core/tipo-inhabilitaciones/{id_tipo_inhabilitacion}/: + get: + operationId: core_tipo_inhabilitaciones_retrieve + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + put: + operationId: core_tipo_inhabilitaciones_update + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TipoInhabilitacionRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + patch: + operationId: core_tipo_inhabilitaciones_partial_update + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedTipoInhabilitacionRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedTipoInhabilitacionRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedTipoInhabilitacionRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TipoInhabilitacion' + description: '' + delete: + operationId: core_tipo_inhabilitaciones_destroy + parameters: + - in: path + name: id_tipo_inhabilitacion + schema: + type: integer + description: A unique integer value identifying this tipo inhabilitacion. + required: true + tags: + - core + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '204': + description: No response body + /users/login/: + post: + operationId: users_login_create + description: |- + Check the credentials and return the REST Token + if the credentials are valid and authenticated. + Calls Django Auth login method to register User ID + in Django session framework + + Accept the following POST parameters: username, password + Return the REST Framework Token Object's key. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/CustomLoginRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/CustomLoginRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/CustomLoginRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomJWTSerializerWithExpiration' + description: '' + /users/logout/: + post: + operationId: users_logout_create + description: |- + Calls Django logout method and delete the Token object + assigned to the current User object. + + Accepts/Returns nothing. + tags: + - users + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/password/change/: + post: + operationId: users_password_change_create + description: |- + Calls Django Auth SetPasswordForm save method. + + Accepts the following POST parameters: new_password1, new_password2 + Returns the success/fail message. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PasswordChangeRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/password/reset/: + post: + operationId: users_password_reset_create + description: |- + Calls Django Auth PasswordResetForm save method. + + Accepts the following POST parameters: email + Returns the success/fail message. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordResetRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PasswordResetRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PasswordResetRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/password/reset/confirm/: + post: + operationId: users_password_reset_confirm_create + description: |- + Password reset e-mail link is confirmed, therefore + this resets the user's password. + + Accepts the following POST parameters: token, uid, + new_password1, new_password2 + Returns the success/fail message. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PasswordResetConfirmRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PasswordResetConfirmRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PasswordResetConfirmRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/signup/: + post: + operationId: users_signup_create + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/RegisterRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/RegisterRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/RegisterRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/CustomJWTSerializerWithExpiration' + description: '' + /users/signup/resend-email/: + post: + operationId: users_signup_resend_email_create + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/ResendEmailVerificationRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/ResendEmailVerificationRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/ResendEmailVerificationRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '201': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/signup/verify-email/: + post: + operationId: users_signup_verify_email_create + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/VerifyEmailRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/VerifyEmailRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/VerifyEmailRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + - {} + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/RestAuthDetail' + description: '' + /users/token/refresh/: + post: + operationId: users_token_refresh_create + description: |- + Takes a refresh type JSON web token and returns an access type JSON web + token if the refresh token is valid. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenRefreshRequest' + required: true + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/TokenRefresh' + description: '' + /users/token/verify/: + post: + operationId: users_token_verify_create + description: |- + Takes a token and indicates if it is valid. This view provides no + information about a token's fitness for a particular use. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/TokenVerifyRequest' + required: true + responses: + '200': + description: No response body + /users/user/: + get: + operationId: users_user_retrieve + description: |- + Reads and updates UserModel fields + Accepts GET, PUT, PATCH methods. + + Default accepted fields: username, first_name, last_name + Default display fields: pk, username, email, first_name, last_name + Read-only fields: pk, email + + Returns UserModel fields. + tags: + - users + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetails' + description: '' + put: + operationId: users_user_update + description: |- + Reads and updates UserModel fields + Accepts GET, PUT, PATCH methods. + + Default accepted fields: username, first_name, last_name + Default display fields: pk, username, email, first_name, last_name + Read-only fields: pk, email + + Returns UserModel fields. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetailsRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/UserDetailsRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/UserDetailsRequest' + required: true + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetails' + description: '' + patch: + operationId: users_user_partial_update + description: |- + Reads and updates UserModel fields + Accepts GET, PUT, PATCH methods. + + Default accepted fields: username, first_name, last_name + Default display fields: pk, username, email, first_name, last_name + Read-only fields: pk, email + + Returns UserModel fields. + tags: + - users + requestBody: + content: + application/json: + schema: + $ref: '#/components/schemas/PatchedUserDetailsRequest' + application/x-www-form-urlencoded: + schema: + $ref: '#/components/schemas/PatchedUserDetailsRequest' + multipart/form-data: + schema: + $ref: '#/components/schemas/PatchedUserDetailsRequest' + security: + - jwtHeaderAuth: [] + - jwtCookieAuth: [] + responses: + '200': + content: + application/json: + schema: + $ref: '#/components/schemas/UserDetails' + description: '' +components: + schemas: + AdminRol: + type: object + properties: + id: + type: integer + readOnly: true + id_admin: + type: integer + id_rol: + type: integer + required: + - id_admin + - id_rol + AdminRolRequest: + type: object + properties: + id_admin: + type: integer + id_rol: + type: integer + required: + - id_admin + - id_rol + Administrador: + type: object + properties: + id: + type: integer + readOnly: true + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + required: + - dni + - user + AdministradorRequest: + type: object + properties: + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + required: + - dni + - user + Alumno: + type: object + properties: + id: + type: integer + readOnly: true + legajo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + estado: + type: integer + required: + - dni + - estado + - legajo + - user + AlumnoRequest: + type: object + properties: + legajo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + estado: + type: integer + required: + - dni + - estado + - legajo + - user + CompromisoDePago: + type: object + properties: + id_comp_pago: + type: integer + readOnly: true + perfciclo: + type: string + format: date-time + monto: + type: number + format: double + firmado: + type: boolean + fecha_firmado: + type: string + format: date-time + compromiso: + type: string + maxLength: 255 + alumno: + type: integer + required: + - alumno + - compromiso + - fecha_firmado + - firmado + - monto + - perfciclo + CompromisoDePagoRequest: + type: object + properties: + perfciclo: + type: string + format: date-time + monto: + type: number + format: double + firmado: + type: boolean + fecha_firmado: + type: string + format: date-time + compromiso: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + required: + - alumno + - compromiso + - fecha_firmado + - firmado + - monto + - perfciclo + Cuota: + type: object + properties: + id_cuota: + type: integer + readOnly: true + nro_cuota: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + recargo: + type: number + format: double + monto: + type: number + format: double + firmado: + type: boolean + vencimiento: + type: string + format: date + fecha_pago: + type: string + format: date + fecha_vencimiento: + type: string + format: date + fecha_pago_devengado: + type: string + format: date + fecha_pedido: + type: string + format: date + tipo_puesto: + type: string + maxLength: 255 + required: + - fecha_pago + - fecha_pago_devengado + - fecha_pedido + - fecha_vencimiento + - firmado + - monto + - nro_cuota + - recargo + - tipo_puesto + - vencimiento + CuotaRequest: + type: object + properties: + nro_cuota: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + recargo: + type: number + format: double + monto: + type: number + format: double + firmado: + type: boolean + vencimiento: + type: string + format: date + fecha_pago: + type: string + format: date + fecha_vencimiento: + type: string + format: date + fecha_pago_devengado: + type: string + format: date + fecha_pedido: + type: string + format: date + tipo_puesto: + type: string + minLength: 1 + maxLength: 255 + required: + - fecha_pago + - fecha_pago_devengado + - fecha_pedido + - fecha_vencimiento + - firmado + - monto + - nro_cuota + - recargo + - tipo_puesto + - vencimiento + CustomJWTSerializerWithExpiration: + type: object + description: Serializer for JWT authentication with expiration times. + properties: + access: + type: string + refresh: + type: string + user: + allOf: + - $ref: '#/components/schemas/UserDetails' + readOnly: true + access_expiration: + type: string + format: date-time + refresh_expiration: + type: string + format: date-time + required: + - access + - access_expiration + - refresh + - refresh_expiration + CustomLoginRequest: + type: object + description: |- + Custom login serializer that accepts either an email or a username. + :email_or_username: The email or username of the user. + :password: The password of the user. + :user: The user object. + :return: The validated data from the user serializer. + properties: + email_or_username: + type: string + minLength: 1 + password: + type: string + minLength: 1 + required: + - email_or_username + - password + Inhabilitacion: + type: object + properties: + id: + type: integer + readOnly: true + fecha_desde: + type: string + format: date-time + fecha_hasta: + type: string + format: date-time + descripcion: + type: string + id_alumno: + type: integer + id_tipo_inhabilitacion: + type: integer + required: + - descripcion + - fecha_desde + - fecha_hasta + - id_alumno + - id_tipo_inhabilitacion + InhabilitacionRequest: + type: object + properties: + fecha_desde: + type: string + format: date-time + fecha_hasta: + type: string + format: date-time + descripcion: + type: string + minLength: 1 + id_alumno: + type: integer + id_tipo_inhabilitacion: + type: integer + required: + - descripcion + - fecha_desde + - fecha_hasta + - id_alumno + - id_tipo_inhabilitacion + Materia: + type: object + properties: + id_materia: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + cuatrimestre: + type: integer + maximum: 9223372036854775807 + minimum: 0 + format: int64 + required: + - cuatrimestre + - nombre + MateriaAlumno: + type: object + properties: + id: + type: integer + readOnly: true + offrc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + atendnc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + id_materia: + type: integer + id_alumno: + type: integer + required: + - atendnc + - id_alumno + - id_materia + - offrc + MateriaAlumnoRequest: + type: object + properties: + offrc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + atendnc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + id_materia: + type: integer + id_alumno: + type: integer + required: + - atendnc + - id_alumno + - id_materia + - offrc + MateriaRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + cuatrimestre: + type: integer + maximum: 9223372036854775807 + minimum: 0 + format: int64 + required: + - cuatrimestre + - nombre + Pago: + type: object + properties: + id_pago: + type: integer + readOnly: true + descripcion: + type: string + medio_pago: + type: string + maxLength: 255 + nro_recibo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + monto: + type: number + format: double + estado: + type: boolean + fecha: + type: string + format: date + comprobante: + type: string + maxLength: 255 + alumno: + type: integer + cuota: + type: integer + required: + - alumno + - comprobante + - cuota + - descripcion + - estado + - fecha + - medio_pago + - monto + - nro_recibo + PagoRequest: + type: object + properties: + descripcion: + type: string + minLength: 1 + medio_pago: + type: string + minLength: 1 + maxLength: 255 + nro_recibo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + monto: + type: number + format: double + estado: + type: boolean + fecha: + type: string + format: date + comprobante: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + cuota: + type: integer + required: + - alumno + - comprobante + - cuota + - descripcion + - estado + - fecha + - medio_pago + - monto + - nro_recibo + PasswordChangeRequest: + type: object + properties: + new_password1: + type: string + minLength: 1 + maxLength: 128 + new_password2: + type: string + minLength: 1 + maxLength: 128 + required: + - new_password1 + - new_password2 + PasswordResetConfirmRequest: + type: object + description: Serializer for confirming a password reset attempt. + properties: + new_password1: + type: string + minLength: 1 + maxLength: 128 + new_password2: + type: string + minLength: 1 + maxLength: 128 + uid: + type: string + minLength: 1 + token: + type: string + minLength: 1 + required: + - new_password1 + - new_password2 + - token + - uid + PasswordResetRequest: + type: object + description: Serializer for requesting a password reset e-mail. + properties: + email: + type: string + format: email + minLength: 1 + required: + - email + PatchedAdminRolRequest: + type: object + properties: + id_admin: + type: integer + id_rol: + type: integer + PatchedAdministradorRequest: + type: object + properties: + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + PatchedAlumnoRequest: + type: object + properties: + legajo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + dni: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + user: + type: integer + estado: + type: integer + PatchedCompromisoDePagoRequest: + type: object + properties: + perfciclo: + type: string + format: date-time + monto: + type: number + format: double + firmado: + type: boolean + fecha_firmado: + type: string + format: date-time + compromiso: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + PatchedCuotaRequest: + type: object + properties: + nro_cuota: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + recargo: + type: number + format: double + monto: + type: number + format: double + firmado: + type: boolean + vencimiento: + type: string + format: date + fecha_pago: + type: string + format: date + fecha_vencimiento: + type: string + format: date + fecha_pago_devengado: + type: string + format: date + fecha_pedido: + type: string + format: date + tipo_puesto: + type: string + minLength: 1 + maxLength: 255 + PatchedInhabilitacionRequest: + type: object + properties: + fecha_desde: + type: string + format: date-time + fecha_hasta: + type: string + format: date-time + descripcion: + type: string + minLength: 1 + id_alumno: + type: integer + id_tipo_inhabilitacion: + type: integer + PatchedMateriaAlumnoRequest: + type: object + properties: + offrc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + atendnc: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + id_materia: + type: integer + id_alumno: + type: integer + PatchedMateriaRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + cuatrimestre: + type: integer + maximum: 9223372036854775807 + minimum: 0 + format: int64 + PatchedPagoRequest: + type: object + properties: + descripcion: + type: string + minLength: 1 + medio_pago: + type: string + minLength: 1 + maxLength: 255 + nro_recibo: + type: integer + maximum: 9223372036854775807 + minimum: -9223372036854775808 + format: int64 + monto: + type: number + format: double + estado: + type: boolean + fecha: + type: string + format: date + comprobante: + type: string + minLength: 1 + maxLength: 255 + alumno: + type: integer + cuota: + type: integer + PatchedPermisosRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedRolPermisoRequest: + type: object + properties: + id_rol: + type: integer + id_permiso: + type: integer + PatchedRolRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedTipoEstadoRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedTipoInhabilitacionRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + PatchedUserDetailsRequest: + type: object + description: User model w/o password + properties: + username: + type: string + minLength: 1 + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + pattern: ^[\w.@+-]+$ + maxLength: 150 + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + Permisos: + type: object + properties: + id_permiso: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + PermisosRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + RegisterRequest: + type: object + properties: + username: + type: string + minLength: 1 + maxLength: 150 + email: + type: string + format: email + minLength: 1 + password1: + type: string + writeOnly: true + minLength: 1 + password2: + type: string + writeOnly: true + minLength: 1 + required: + - email + - password1 + - password2 + - username + ResendEmailVerificationRequest: + type: object + properties: + email: + type: string + format: email + minLength: 1 + required: + - email + RestAuthDetail: + type: object + properties: + detail: + type: string + readOnly: true + Rol: + type: object + properties: + id_rol: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + RolPermiso: + type: object + properties: + id: + type: integer + readOnly: true + id_rol: + type: integer + id_permiso: + type: integer + required: + - id_permiso + - id_rol + RolPermisoRequest: + type: object + properties: + id_rol: + type: integer + id_permiso: + type: integer + required: + - id_permiso + - id_rol + RolRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + TipoEstado: + type: object + properties: + id_tipo_estado: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + TipoEstadoRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + TipoInhabilitacion: + type: object + properties: + id_tipo_inhabilitacion: + type: integer + readOnly: true + nombre: + type: string + maxLength: 255 + descripcion: + type: string + required: + - descripcion + - nombre + TipoInhabilitacionRequest: + type: object + properties: + nombre: + type: string + minLength: 1 + maxLength: 255 + descripcion: + type: string + minLength: 1 + required: + - descripcion + - nombre + TokenObtainPair: + type: object + properties: + access: + type: string + readOnly: true + refresh: + type: string + readOnly: true + TokenObtainPairRequest: + type: object + properties: + username: + type: string + writeOnly: true + minLength: 1 + password: + type: string + writeOnly: true + minLength: 1 + required: + - password + - username + TokenRefresh: + type: object + properties: + access: + type: string + readOnly: true + refresh: + type: string + required: + - refresh + TokenRefreshRequest: + type: object + properties: + refresh: + type: string + minLength: 1 + required: + - refresh + TokenVerifyRequest: + type: object + properties: + token: + type: string + writeOnly: true + minLength: 1 + required: + - token + UserDetails: + type: object + description: User model w/o password + properties: + pk: + type: integer + readOnly: true + title: ID + username: + type: string + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + pattern: ^[\w.@+-]+$ + maxLength: 150 + email: + type: string + format: email + readOnly: true + title: Email address + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + required: + - username + UserDetailsRequest: + type: object + description: User model w/o password + properties: + username: + type: string + minLength: 1 + description: Required. 150 characters or fewer. Letters, digits and @/./+/-/_ + only. + pattern: ^[\w.@+-]+$ + maxLength: 150 + first_name: + type: string + maxLength: 150 + last_name: + type: string + maxLength: 150 + required: + - username + VerifyEmailRequest: + type: object + properties: + key: + type: string + writeOnly: true + minLength: 1 + required: + - key + securitySchemes: + jwtCookieAuth: + type: apiKey + in: cookie + name: access_token + jwtHeaderAuth: + type: http + scheme: bearer + bearerFormat: JWT +x-logo: x-logo +servers: +- url: '{protocol}://{host}{port}/' + description: Development server + variables: + protocol: + description: Protocol (http only for now) + default: https + enum: + - http + - https + host: + description: Hostname (FQDN) + default: gestiontup-42tx6kvt3q-uc.a.run.app + enum: + - gestiontup-42tx6kvt3q-uc.a.run.app + - 127.0.0.1 + port: + description: server port + default: '' + enum: + - '' + - :8000 +tags: +- name: api + description: API endpoint access, operations and schema. + externalDocs: + description: API Schema Formatting - OpenAPI 3.0.3 + url: https://spec.openapis.org/oas/v3.0.3#schema +- name: users + description: User operations, including login, logout, signup, and + password reset. + externalDocs: + description: 'Included auth Library: dj-rest-auth' + url: https://dj-rest-auth.readthedocs.io/en/latest/ +- name: core + description: Core operations, including CRUD operations for the main + models. +externalDocs: + description: Click here for Swagger UI Specification Docs + url: https://swagger.io/specification/ diff --git a/backend/server/__init__.py b/backend/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/server/__pycache__/__init__.cpython-312.pyc b/backend/server/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..39cb5fa Binary files /dev/null and b/backend/server/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/server/__pycache__/urls.cpython-312.pyc b/backend/server/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000..01f2f99 Binary files /dev/null and b/backend/server/__pycache__/urls.cpython-312.pyc differ diff --git a/backend/server/__pycache__/wsgi.cpython-312.pyc b/backend/server/__pycache__/wsgi.cpython-312.pyc new file mode 100644 index 0000000..a52c3fd Binary files /dev/null and b/backend/server/__pycache__/wsgi.cpython-312.pyc differ diff --git a/backend/server/asgi.py b/backend/server/asgi.py new file mode 100644 index 0000000..78e9f62 --- /dev/null +++ b/backend/server/asgi.py @@ -0,0 +1,16 @@ +""" +ASGI config for server project. + +It exposes the ASGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/asgi/ +""" + +import os + +from django.core.asgi import get_asgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings.base") + +application = get_asgi_application() diff --git a/backend/server/db.sqlite3 b/backend/server/db.sqlite3 new file mode 100644 index 0000000..85d6c7e Binary files /dev/null and b/backend/server/db.sqlite3 differ diff --git a/backend/server/settings/__init__.py b/backend/server/settings/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/server/settings/__pycache__/__init__.cpython-312.pyc b/backend/server/settings/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..c81f824 Binary files /dev/null and b/backend/server/settings/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/server/settings/__pycache__/base.cpython-312.pyc b/backend/server/settings/__pycache__/base.cpython-312.pyc new file mode 100644 index 0000000..2baa6cf Binary files /dev/null and b/backend/server/settings/__pycache__/base.cpython-312.pyc differ diff --git a/backend/server/settings/__pycache__/dev.cpython-312.pyc b/backend/server/settings/__pycache__/dev.cpython-312.pyc new file mode 100644 index 0000000..f7c2459 Binary files /dev/null and b/backend/server/settings/__pycache__/dev.cpython-312.pyc differ diff --git a/backend/server/settings/base.py b/backend/server/settings/base.py new file mode 100644 index 0000000..3157018 --- /dev/null +++ b/backend/server/settings/base.py @@ -0,0 +1,330 @@ +""" +Django settings for server project. + +Generated by 'django-admin startproject' using Django 5.0.6. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/topics/settings/ + +For the full list of settings and their values, see +https://docs.djangoproject.com/en/5.0/ref/settings/ +""" + +import os + +# Variables and Secrets. +import secrets +from datetime import timedelta +from pathlib import Path + +from dotenv import load_dotenv + +load_dotenv() + +SECRET_KEY: str = os.getenv( + key="DJANGO_SECRET_KEY", default=secrets.token_urlsafe(nbytes=128) +) + +ALLOWED_HOSTS: list[str] = ["*"] + +CORS_ALLOW_ALL_ORIGINS = True + +APPEND_SLASH = False + +# Build paths inside the project like this: BASE_DIR / 'subdir'. +# https://docs.djangoproject.com/en/5.0/ref/settings/#std:setting-BASE_DIR +BASE_DIR: Path = Path(__file__).resolve().parent.parent + + +# Quick-start development settings - unsuitable for production +# See https://docs.djangoproject.com/en/5.0/howto/deployment/checklist/ + +# SECURITY WARNING: don't run with debug turned on in production! + +# Application definition +# https://docs.djangoproject.com/en/5.0/ref/settings/#installed-apps +INSTALLED_APPS: list[str] = [ + # django default + "django.contrib.admin", + "django.contrib.auth", + "django.contrib.sites", + "django.contrib.contenttypes", + "django.contrib.sessions", + "django.contrib.messages", + "django.contrib.staticfiles", + # third party apps + "rest_framework", + "dj_rest_auth", + "django_extensions", + "allauth", + "allauth.account", + "dj_rest_auth.registration", + "drf_spectacular", + "drf_spectacular_sidecar", + "rest_framework_simplejwt", + "rest_framework_simplejwt.token_blacklist", + "corsheaders", + # local apps + "users", + "core", +] + +# middleware settings +# https://docs.djangoproject.com/en/5.0/topics/http/middleware/ +MIDDLEWARE: list[str] = [ + "django.middleware.security.SecurityMiddleware", + "django.contrib.sessions.middleware.SessionMiddleware", + "django.middleware.common.CommonMiddleware", + "django.middleware.csrf.CsrfViewMiddleware", + "django.contrib.auth.middleware.AuthenticationMiddleware", + "django.contrib.messages.middleware.MessageMiddleware", + "django.middleware.clickjacking.XFrameOptionsMiddleware", + # third party middleware + "allauth.account.middleware.AccountMiddleware", + "corsheaders.middleware.CorsMiddleware", +] + +ROOT_URLCONF = "server.urls" + +# cache settings +# https://docs.djangoproject.com/en/5.0/topics/cache/ + +CACHES: dict[str, dict[str, str]] = { + "default": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", + } +} + + +# DRF/ REST Framework settings +# https://www.django-rest-framework.org/api-guide/settings/ +REST_FRAMEWORK = { + "DEFAULT_AUTHENTICATION_CLASSES": [ + "dj_rest_auth.jwt_auth.JWTCookieAuthentication", + ], + "DEFAULT_PERMISSION_CLASSES": [ + "rest_framework.permissions.IsAuthenticated", + ], + "DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema", + "ALLOWED_VERSIONS": ["1.0.0"], + "DEFAULT_VERSION": "1.0.0", +} + +# Template settings +# https://docs.djangoproject.com/en/5.0/topics/templates/ +TEMPLATES = [ + { + "BACKEND": "django.template.backends.django.DjangoTemplates", + "DIRS": [], + "APP_DIRS": True, + "OPTIONS": { + "context_processors": [ + "django.template.context_processors.debug", + "django.template.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.contrib.messages.context_processors.messages", + ], + }, + }, +] + +WSGI_APPLICATION = "server.wsgi.application" + + +# Database +# https://docs.djangoproject.com/en/5.0/ref/settings/#databases +DATABASES = { + "default": { + "ENGINE": "django.db.backends.sqlite3", + "NAME": BASE_DIR / "db.sqlite3", + } +} + +# Password validation +# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-password-validators +AUTH_PASSWORD_VALIDATORS: list[str | None] = [] + +# CUSTOM USER MODEL SETTINGS +# https://docs.djangoproject.com/en/5.0/ref/settings/#auth-user-model +AUTH_USER_MODEL: str = "users.CustomUser" + + +# dj-rest-auth settings (with Registration & JWT enabled) +# https://dj-rest-auth.readthedocs.io/en/latest/configuration.html +REST_AUTH = { + "LOGIN_SERIALIZER": "users.serializers.CustomLoginSerializer", + "LOGOUT_SERIALIZER": "dj_rest_auth.serializers.LogoutSerializer", + "USER_SERIALIZER": "dj_rest_auth.serializers.UserDetailsSerializer", + "JWT_SERIALIZER": "api.serializers.CustomJWTSerializerWithExpiration", + "TOKEN_MODEL": None, + "TOKEN_CREATOR": None, + "JWT_AUTH_RETURN_EXPIRATION": True, + "PASSWORD_RESET_USE_SITES_DOMAIN": False, + "OLD_PASSWORD_FIELD_ENABLED": False, + "LOGOUT_ON_PASSWORD_CHANGE": False, + "SESSION_LOGIN": False, + "USE_JWT": True, + "JWT_AUTH_COOKIE": "access_token", + "JWT_AUTH_REFRESH_COOKIE": "refresh_token", + "JWT_AUTH_REFRESH_COOKIE_PATH": "/", + "JWT_AUTH_SECURE": False, + "JWT_AUTH_HTTPONLY": False, + "JWT_AUTH_SAMESITE": "Lax", + "JWT_AUTH_COOKIE_USE_CSRF": False, + "JWT_AUTH_COOKIE_ENFORCE_CSRF_ON_UNAUTHENTICATED": False, +} +# JWT settings +# https://django-rest-framework-simplejwt.readthedocs.io/en/latest/settings.html +SIMPLE_JWT = { + # JWT token settings + "ACCESS_TOKEN_LIFETIME": timedelta(minutes=1), + "REFRESH_TOKEN_LIFETIME": timedelta(minutes=2), + # JWT token blacklist settings + "ROTATE_REFRESH_TOKENS": True, # Enable refresh token rotation + "BLACKLIST_AFTER_ROTATION": True, # Blacklist tokens after rotation +} +ACCOUNT_EMAIL_REQUIRED = True +ACCOUNT_AUTHENTICATION_METHOD = "username" +ACCOUNT_EMAIL_VERIFICATION = "none" +SITE_ID = 1 + +AUTHENTICATION_BACKENDS: list[str] = [ + "users.backends.EmailOrUsernameModelBackend", + # 'django.contrib.auth.backends.ModelBackend', +] + +# Internationalization +# https://docs.djangoproject.com/en/5.0/topics/i18n/ + +LANGUAGE_CODE = "en-us" + +TIME_ZONE = "UTC" + +USE_I18N = True + +USE_TZ = True + + +# Static files (CSS, JavaScript, Images) +# https://docs.djangoproject.com/en/5.0/howto/static-files/ + +STATIC_ROOT: str = os.path.join(BASE_DIR, "staticfiles") +STATIC_URL: str = "/static/" +# Default primary key field type +# https://docs.djangoproject.com/en/5.0/ref/settings/#default-auto-field + +DEFAULT_AUTO_FIELD = "django.db.models.BigAutoField" + + +# Test settings +# https://docs.djangoproject.com/en/5.0/topics/testing/overview/ +TEST_RUNNER = "django.test.runner.DiscoverRunner" + + +# API Tooling +# https://zuplo.link//django-web + + +# DRF Spectacular settings +# https://drf-spectacular.readthedocs.io/en/latest/settings.html +SPECTACULAR_SETTINGS = { + "TITLE": "Gestion TUP API", + "DESCRIPTION": "API Endpoint Documentation for Gestion TUP", + "VERSION": "0.1.0", + "TOS": "https://github.com/samuop/GestionTUP/blob/main/README.md", + "CONTACT": { + "name": "API Support", + "url": "https://github.com/carlosferreyra/GestionTUP", + "email": "eduferreyraok@gmail.com", + }, + "LICENSE": { + "name": "MIT License", + "url": "https://opensource.org/licenses/MIT", + }, + "SERVERS": [ + { + "url": "{protocol}://{host}{port}/", + "description": "Development server", + "variables": { + "protocol": { + "description": "Protocol (http only for now)", + "default": "https", + "enum": ["http", "https"], + }, + "host": { + "description": "Hostname (FQDN)", + "default": "gestiontup-42tx6kvt3q-uc.a.run.app", + "enum": [ + "gestiontup-42tx6kvt3q-uc.a.run.app", + "127.0.0.1", + ], + }, + "port": { + "description": "server port", + "default": "", + "enum": ["", ":8000"], + }, + }, + }, + ], + "EXTERNAL_DOCS": { + "description": "Click here for Swagger UI Specification Docs", + "url": "https://swagger.io/specification/", + }, + "EXTENSIONS_INFO": { + "x-logo": { + "url": "https://www.djangoproject.com\ + /m/img/logos/django-logo-negative.png", + "backgroundColor": "#FFFFFF", + "altText": "Django Logo", + }, + }, + "EXTENSIONS_ROOT": { + "x-logo": "x-logo", + }, + "TAGS": [ + { + "name": "api", + "description": "API endpoint access, operations and schema.", + "externalDocs": { + "description": "API Schema Formatting - OpenAPI 3.0.3", + "url": "https://spec.openapis.org/oas/v3.0.3#schema", + }, + }, + { + "name": "users", + "description": "User operations, \ + including login, logout, signup, and password reset.", + "externalDocs": { + "description": "Included auth Library: dj-rest-auth[with_social]", + "url": "https://dj-rest-auth.readthedocs.io/en/latest/", + }, + }, + { + "name": "core", + "description": "Core operations, \ + including CRUD operations for the main models.", + }, + ], + "COMPONENT_SPLIT_REQUEST": True, + "COMPONENT_NO_READ_ONLY_REQUIRED": True, + "SWAGGER_UI_SETTINGS": { # Swagger UI settings + "deepLinking": True, + "persist authorization": True, + "showExtensions": True, # Display vendor-specific extensions + "showCommonExtensions": True, # Display common extensions + "docExpansion": "none", # Expand operations by default + "displayOperationId": True, # Display operationId in operations + # Appearance and Branding (mostly defaults) + # Sorting and Filtering (mostly defaults) + "filter": True, # Show filtering {true, false, string} + "operationsSorter": "alpha", # Sort by method {alpha, method, ordered} + "tagsSorter": "alpha", # Sort by tag {alpha, order} + "withCredentials": False, # Avoid unless necessary + "displayRequestDuration": True, # Display request duration + # Advanced Options (mostly defaults) + "syntaxHighlight.activated": True, # Syntax highlighter flag + "url": "/api/schema/", # URL to fetch the OpenAPI schema from + }, + # OTHER SPECTACULAR SETTINGS +} diff --git a/backend/server/settings/dev.py b/backend/server/settings/dev.py new file mode 100644 index 0000000..c3dfb6e --- /dev/null +++ b/backend/server/settings/dev.py @@ -0,0 +1,85 @@ +import os + +from dotenv import load_dotenv + +from .base import ( + AUTH_USER_MODEL, + BASE_DIR, + DEFAULT_AUTO_FIELD, + INSTALLED_APPS, + MIDDLEWARE, + REST_AUTH, + REST_FRAMEWORK, + ROOT_URLCONF, + SECRET_KEY, + SPECTACULAR_SETTINGS, + STATIC_URL, + TEMPLATES, +) + +load_dotenv() + +APPEND_SLASH = True + +DEBUG = True +ALLOWED_HOSTS: list[str] = ["localhost", "127.0.0.1"] + + +INSTALLED_APPS += [ + # third party apps + "debug_toolbar", + # local apps +] + +MIDDLEWARE += [ + "debug_toolbar.middleware.DebugToolbarMiddleware", +] + +INTERNAL_IPS: list[str] = [ + # ... + "127.0.0.1", + # ... +] + +# Static files (CSS, JavaScript, images) +logs_dir: str = os.path.join(BASE_DIR, "logs") +os.makedirs(name=logs_dir, exist_ok=True) + +# Logging +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "formatters": { + "verbose": { + "format": "{levelname} {asctime} {module} \ + {process:d} {thread:d} {message}", + "style": "{", + }, + "simple": { + "format": "{levelname} {message}", + "style": "{", + }, + }, + "handlers": { + "console": { + "level": "DEBUG", + "class": "logging.StreamHandler", + "formatter": "simple", + }, + "file": { + "level": "INFO", + "class": "logging.handlers.RotatingFileHandler", + "filename": os.path.join(logs_dir, "general.log"), + "maxBytes": 1024 * 1024 * 5, # 5 MB + "backupCount": 5, + "formatter": "verbose", + }, + }, + "loggers": { + "django": { + "handlers": ["console", "file"], + "level": "INFO", + "propagate": True, + }, + }, +} diff --git a/backend/server/settings/production.py b/backend/server/settings/production.py new file mode 100644 index 0000000..bea2812 --- /dev/null +++ b/backend/server/settings/production.py @@ -0,0 +1,713 @@ +from .base import * + +""" +Default Django settings. Override these with settings in the module pointed to +by the DJANGO_SETTINGS_MODULE environment variable. +""" + + +# This is defined here as a do-nothing function because we can't import +# django.utils.translation -- that module depends on the settings. +def gettext_noop(s): + return s + + +#################### +# CORE # +#################### + +DEBUG = False + +# Whether the framework should propagate raw exceptions rather than catching +# them. This is useful under some testing situations and should never be used +# on a live site. +DEBUG_PROPAGATE_EXCEPTIONS = False + +# People who get code error notifications. In the format +# [('Full Name', 'email@example.com'), ('Full Name', 'anotheremail@example.com')] +ADMINS = [] +# List of IP addresses, as strings, that: +# * See debug comments, when DEBUG is true +# * Receive x-headers +INTERNAL_IPS = [] + +# Hosts/domain names that are valid for this site. +# "*" matches anything, ".example.com" matches example.com and all subdomains +ALLOWED_HOSTS = [] + +# Local time zone for this installation. All choices can be found here: +# https://en.wikipedia.org/wiki/List_of_tz_zones_by_name (although not all +# systems may support all possibilities). When USE_TZ is True, this is +# interpreted as the default user time zone. +TIME_ZONE = "America/Chicago" + +# If you set this to True, Django will use timezone-aware datetimes. +USE_TZ = True + +# Language code for this installation. All choices can be found here: +# http://www.i18nguy.com/unicode/language-identifiers.html +LANGUAGE_CODE = "en-us" + +# Languages we provide translations for, out of the box. +LANGUAGES = [ + ("af", gettext_noop("Afrikaans")), + ("ar", gettext_noop("Arabic")), + ("ar-dz", gettext_noop("Algerian Arabic")), + ("ast", gettext_noop("Asturian")), + ("az", gettext_noop("Azerbaijani")), + ("bg", gettext_noop("Bulgarian")), + ("be", gettext_noop("Belarusian")), + ("bn", gettext_noop("Bengali")), + ("br", gettext_noop("Breton")), + ("bs", gettext_noop("Bosnian")), + ("ca", gettext_noop("Catalan")), + ("ckb", gettext_noop("Central Kurdish (Sorani)")), + ("cs", gettext_noop("Czech")), + ("cy", gettext_noop("Welsh")), + ("da", gettext_noop("Danish")), + ("de", gettext_noop("German")), + ("dsb", gettext_noop("Lower Sorbian")), + ("el", gettext_noop("Greek")), + ("en", gettext_noop("English")), + ("en-au", gettext_noop("Australian English")), + ("en-gb", gettext_noop("British English")), + ("eo", gettext_noop("Esperanto")), + ("es", gettext_noop("Spanish")), + ("es-ar", gettext_noop("Argentinian Spanish")), + ("es-co", gettext_noop("Colombian Spanish")), + ("es-mx", gettext_noop("Mexican Spanish")), + ("es-ni", gettext_noop("Nicaraguan Spanish")), + ("es-ve", gettext_noop("Venezuelan Spanish")), + ("et", gettext_noop("Estonian")), + ("eu", gettext_noop("Basque")), + ("fa", gettext_noop("Persian")), + ("fi", gettext_noop("Finnish")), + ("fr", gettext_noop("French")), + ("fy", gettext_noop("Frisian")), + ("ga", gettext_noop("Irish")), + ("gd", gettext_noop("Scottish Gaelic")), + ("gl", gettext_noop("Galician")), + ("he", gettext_noop("Hebrew")), + ("hi", gettext_noop("Hindi")), + ("hr", gettext_noop("Croatian")), + ("hsb", gettext_noop("Upper Sorbian")), + ("hu", gettext_noop("Hungarian")), + ("hy", gettext_noop("Armenian")), + ("ia", gettext_noop("Interlingua")), + ("id", gettext_noop("Indonesian")), + ("ig", gettext_noop("Igbo")), + ("io", gettext_noop("Ido")), + ("is", gettext_noop("Icelandic")), + ("it", gettext_noop("Italian")), + ("ja", gettext_noop("Japanese")), + ("ka", gettext_noop("Georgian")), + ("kab", gettext_noop("Kabyle")), + ("kk", gettext_noop("Kazakh")), + ("km", gettext_noop("Khmer")), + ("kn", gettext_noop("Kannada")), + ("ko", gettext_noop("Korean")), + ("ky", gettext_noop("Kyrgyz")), + ("lb", gettext_noop("Luxembourgish")), + ("lt", gettext_noop("Lithuanian")), + ("lv", gettext_noop("Latvian")), + ("mk", gettext_noop("Macedonian")), + ("ml", gettext_noop("Malayalam")), + ("mn", gettext_noop("Mongolian")), + ("mr", gettext_noop("Marathi")), + ("ms", gettext_noop("Malay")), + ("my", gettext_noop("Burmese")), + ("nb", gettext_noop("Norwegian Bokmål")), + ("ne", gettext_noop("Nepali")), + ("nl", gettext_noop("Dutch")), + ("nn", gettext_noop("Norwegian Nynorsk")), + ("os", gettext_noop("Ossetic")), + ("pa", gettext_noop("Punjabi")), + ("pl", gettext_noop("Polish")), + ("pt", gettext_noop("Portuguese")), + ("pt-br", gettext_noop("Brazilian Portuguese")), + ("ro", gettext_noop("Romanian")), + ("ru", gettext_noop("Russian")), + ("sk", gettext_noop("Slovak")), + ("sl", gettext_noop("Slovenian")), + ("sq", gettext_noop("Albanian")), + ("sr", gettext_noop("Serbian")), + ("sr-latn", gettext_noop("Serbian Latin")), + ("sv", gettext_noop("Swedish")), + ("sw", gettext_noop("Swahili")), + ("ta", gettext_noop("Tamil")), + ("te", gettext_noop("Telugu")), + ("tg", gettext_noop("Tajik")), + ("th", gettext_noop("Thai")), + ("tk", gettext_noop("Turkmen")), + ("tr", gettext_noop("Turkish")), + ("tt", gettext_noop("Tatar")), + ("udm", gettext_noop("Udmurt")), + ("ug", gettext_noop("Uyghur")), + ("uk", gettext_noop("Ukrainian")), + ("ur", gettext_noop("Urdu")), + ("uz", gettext_noop("Uzbek")), + ("vi", gettext_noop("Vietnamese")), + ("zh-hans", gettext_noop("Simplified Chinese")), + ("zh-hant", gettext_noop("Traditional Chinese")), +] + +# Languages using BiDi (right-to-left) layout +LANGUAGES_BIDI = ["he", "ar", "ar-dz", "ckb", "fa", "ug", "ur"] + +# If you set this to False, Django will make some optimizations so as not +# to load the internationalization machinery. +USE_I18N = True +LOCALE_PATHS = [] + +# Settings for language cookie +LANGUAGE_COOKIE_NAME = "django_language" +LANGUAGE_COOKIE_AGE = None +LANGUAGE_COOKIE_DOMAIN = None +LANGUAGE_COOKIE_PATH = "/" +LANGUAGE_COOKIE_SECURE = False +LANGUAGE_COOKIE_HTTPONLY = False +LANGUAGE_COOKIE_SAMESITE = None + +# Not-necessarily-technical managers of the site. They get broken link +# notifications and other various emails. +MANAGERS = ADMINS + +# Default charset to use for all HttpResponse objects, if a MIME type isn't +# manually specified. It's used to construct the Content-Type header. +DEFAULT_CHARSET = "utf-8" + +# Email address that error messages come from. +SERVER_EMAIL = "root@localhost" + +# Database connection info. If left empty, will default to the dummy backend. +DATABASES = {} + +# Classes used to implement DB routing behavior. +DATABASE_ROUTERS = [] + +# The email backend to use. For possible shortcuts see django.core.mail. +# The default is to use the SMTP backend. +# Third-party backends can be specified by providing a Python path +# to a module that defines an EmailBackend class. +EMAIL_BACKEND = "django.core.mail.backends.smtp.EmailBackend" + +# Host for sending email. +EMAIL_HOST = "localhost" + +# Port for sending email. +EMAIL_PORT = 25 + +# Whether to send SMTP 'Date' header in the local time zone or in UTC. +EMAIL_USE_LOCALTIME = False + +# Optional SMTP authentication information for EMAIL_HOST. +EMAIL_HOST_USER = "" +EMAIL_HOST_PASSWORD = "" +EMAIL_USE_TLS = False +EMAIL_USE_SSL = False +EMAIL_SSL_CERTFILE = None +EMAIL_SSL_KEYFILE = None +EMAIL_TIMEOUT = None + +# List of strings representing installed apps. +INSTALLED_APPS = [] + +TEMPLATES = [] + +# Default form rendering class. +FORM_RENDERER = "django.forms.renderers.DjangoTemplates" + +# RemovedInDjango60Warning: It's a transitional setting helpful in early +# adoption of "https" as the new default value of forms.URLField.assume_scheme. +# Set to True to assume "https" during the Django 5.x release cycle. +FORMS_URLFIELD_ASSUME_HTTPS = False + +# Default email address to use for various automated correspondence from +# the site managers. +DEFAULT_FROM_EMAIL = "webmaster@localhost" + +# Subject-line prefix for email messages send with django.core.mail.mail_admins +# or ...mail_managers. Make sure to include the trailing space. +EMAIL_SUBJECT_PREFIX = "[Django] " + +# Whether to append trailing slashes to URLs. +APPEND_SLASH = False + +# Whether to prepend the "www." subdomain to URLs that don't have it. +PREPEND_WWW = False + +# Override the server-derived value of SCRIPT_NAME +FORCE_SCRIPT_NAME = None + +# List of compiled regular expression objects representing User-Agent strings +# that are not allowed to visit any page, systemwide. Use this for bad +# robots/crawlers. Here are a few examples: +# import re +# DISALLOWED_USER_AGENTS = [ +# re.compile(r'^NaverBot.*'), +# re.compile(r'^EmailSiphon.*'), +# re.compile(r'^SiteSucker.*'), +# re.compile(r'^sohu-search'), +# ] +DISALLOWED_USER_AGENTS = [] + +ABSOLUTE_URL_OVERRIDES = {} + +# List of compiled regular expression objects representing URLs that need not +# be reported by BrokenLinkEmailsMiddleware. Here are a few examples: +# import re +# IGNORABLE_404_URLS = [ +# re.compile(r'^/apple-touch-icon.*\.png$'), +# re.compile(r'^/favicon.ico$'), +# re.compile(r'^/robots.txt$'), +# re.compile(r'^/phpmyadmin/'), +# re.compile(r'\.(cgi|php|pl)$'), +# ] +IGNORABLE_404_URLS = [] + +# A secret key for this particular Django installation. Used in secret-key +# hashing algorithms. Set this in your settings, or Django will complain +# loudly. +SECRET_KEY = "" + +# List of secret keys used to verify the validity of signatures. This allows +# secret key rotation. +SECRET_KEY_FALLBACKS = [] + +# Default file storage mechanism that holds media. +DEFAULT_FILE_STORAGE = "django.core.files.storage.FileSystemStorage" + +STORAGES = { + "default": { + "BACKEND": "django.core.files.storage.FileSystemStorage", + }, + "staticfiles": { + "BACKEND": "django.contrib.staticfiles.storage.StaticFilesStorage", + }, +} + +# Absolute filesystem path to the directory that will hold user-uploaded files. +# Example: "/var/www/example.com/media/" +MEDIA_ROOT = "" + +# URL that handles the media served from MEDIA_ROOT. +# Examples: "http://example.com/media/", "http://media.example.com/" +MEDIA_URL = "" + +# Absolute path to the directory static files should be collected to. +# Example: "/var/www/example.com/static/" +STATIC_ROOT = None + +# URL that handles the static files served from STATIC_ROOT. +# Example: "http://example.com/static/", "http://static.example.com/" +STATIC_URL = None + +# List of upload handler classes to be applied in order. +FILE_UPLOAD_HANDLERS = [ + "django.core.files.uploadhandler.MemoryFileUploadHandler", + "django.core.files.uploadhandler.TemporaryFileUploadHandler", +] + +# Maximum size, in bytes, of a request before it will be streamed to the +# file system instead of into memory. +FILE_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB + +# Maximum size in bytes of request data (excluding file uploads) that will be +# read before a SuspiciousOperation (RequestDataTooBig) is raised. +DATA_UPLOAD_MAX_MEMORY_SIZE = 2621440 # i.e. 2.5 MB + +# Maximum number of GET/POST parameters that will be read before a +# SuspiciousOperation (TooManyFieldsSent) is raised. +DATA_UPLOAD_MAX_NUMBER_FIELDS = 1000 + +# Maximum number of files encoded in a multipart upload that will be read +# before a SuspiciousOperation (TooManyFilesSent) is raised. +DATA_UPLOAD_MAX_NUMBER_FILES = 100 + +# Directory in which upload streamed files will be temporarily saved. A value of +# `None` will make Django use the operating system's default temporary directory +# (i.e. "/tmp" on *nix systems). +FILE_UPLOAD_TEMP_DIR = None + +# The numeric mode to set newly-uploaded files to. The value should be a mode +# you'd pass directly to os.chmod; see +# https://docs.python.org/library/os.html#files-and-directories. +FILE_UPLOAD_PERMISSIONS = 0o644 + +# The numeric mode to assign to newly-created directories, when uploading files. +# The value should be a mode as you'd pass to os.chmod; +# see https://docs.python.org/library/os.html#files-and-directories. +FILE_UPLOAD_DIRECTORY_PERMISSIONS = None + +# Python module path where user will place custom format definition. +# The directory where this setting is pointing should contain subdirectories +# named as the locales, containing a formats.py file +# (i.e. "myproject.locale" for myproject/locale/en/formats.py etc. use) +FORMAT_MODULE_PATH = None + +# Default formatting for date objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATE_FORMAT = "N j, Y" + +# Default formatting for datetime objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +DATETIME_FORMAT = "N j, Y, P" + +# Default formatting for time objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +TIME_FORMAT = "P" + +# Default formatting for date objects when only the year and month are relevant. +# See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +YEAR_MONTH_FORMAT = "F Y" + +# Default formatting for date objects when only the month and day are relevant. +# See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +MONTH_DAY_FORMAT = "F j" + +# Default short formatting for date objects. See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +SHORT_DATE_FORMAT = "m/d/Y" + +# Default short formatting for datetime objects. +# See all available format strings here: +# https://docs.djangoproject.com/en/dev/ref/templates/builtins/#date +SHORT_DATETIME_FORMAT = "m/d/Y P" + +# Default formats to be used when parsing dates from input boxes, in order +# See all available format string here: +# https://docs.python.org/library/datetime.html#strftime-behavior +# * Note that these format strings are different from the ones to display dates +DATE_INPUT_FORMATS = [ + "%Y-%m-%d", # '2006-10-25' + "%m/%d/%Y", # '10/25/2006' + "%m/%d/%y", # '10/25/06' + "%b %d %Y", # 'Oct 25 2006' + "%b %d, %Y", # 'Oct 25, 2006' + "%d %b %Y", # '25 Oct 2006' + "%d %b, %Y", # '25 Oct, 2006' + "%B %d %Y", # 'October 25 2006' + "%B %d, %Y", # 'October 25, 2006' + "%d %B %Y", # '25 October 2006' + "%d %B, %Y", # '25 October, 2006' +] + +# Default formats to be used when parsing times from input boxes, in order +# See all available format string here: +# https://docs.python.org/library/datetime.html#strftime-behavior +# * Note that these format strings are different from the ones to display dates +TIME_INPUT_FORMATS = [ + "%H:%M:%S", # '14:30:59' + "%H:%M:%S.%f", # '14:30:59.000200' + "%H:%M", # '14:30' +] + +# Default formats to be used when parsing dates and times from input boxes, +# in order +# See all available format string here: +# https://docs.python.org/library/datetime.html#strftime-behavior +# * Note that these format strings are different from the ones to display dates +DATETIME_INPUT_FORMATS = [ + "%Y-%m-%d %H:%M:%S", # '2006-10-25 14:30:59' + "%Y-%m-%d %H:%M:%S.%f", # '2006-10-25 14:30:59.000200' + "%Y-%m-%d %H:%M", # '2006-10-25 14:30' + "%m/%d/%Y %H:%M:%S", # '10/25/2006 14:30:59' + "%m/%d/%Y %H:%M:%S.%f", # '10/25/2006 14:30:59.000200' + "%m/%d/%Y %H:%M", # '10/25/2006 14:30' + "%m/%d/%y %H:%M:%S", # '10/25/06 14:30:59' + "%m/%d/%y %H:%M:%S.%f", # '10/25/06 14:30:59.000200' + "%m/%d/%y %H:%M", # '10/25/06 14:30' +] + +# First day of week, to be used on calendars +# 0 means Sunday, 1 means Monday... +FIRST_DAY_OF_WEEK = 0 + +# Decimal separator symbol +DECIMAL_SEPARATOR = "." + +# Boolean that sets whether to add thousand separator when formatting numbers +USE_THOUSAND_SEPARATOR = False + +# Number of digits that will be together, when splitting them by +# THOUSAND_SEPARATOR. 0 means no grouping, 3 means splitting by thousands... +NUMBER_GROUPING = 0 + +# Thousand separator symbol +THOUSAND_SEPARATOR = "," + +# The tablespaces to use for each model when not specified otherwise. +DEFAULT_TABLESPACE = "" +DEFAULT_INDEX_TABLESPACE = "" + +# Default primary key field type. +DEFAULT_AUTO_FIELD = "django.db.models.AutoField" + +# Default X-Frame-Options header value +X_FRAME_OPTIONS = "DENY" + +USE_X_FORWARDED_HOST = False +USE_X_FORWARDED_PORT = False + +# The Python dotted path to the WSGI application that Django's internal server +# (runserver) will use. If `None`, the return value of +# 'django.core.wsgi.get_wsgi_application' is used, thus preserving the same +# behavior as previous versions of Django. Otherwise this should point to an +# actual WSGI application object. +WSGI_APPLICATION = None + +# If your Django app is behind a proxy that sets a header to specify secure +# connections, AND that proxy ensures that user-submitted headers with the +# same name are ignored (so that people can't spoof it), set this value to +# a tuple of (header_name, header_value). For any requests that come in with +# that header/value, request.is_secure() will return True. +# WARNING! Only set this if you fully understand what you're doing. Otherwise, +# you may be opening yourself up to a security risk. +SECURE_PROXY_SSL_HEADER = None + +############## +# MIDDLEWARE # +############## + +# List of middleware to use. Order is important; in the request phase, these +# middleware will be applied in the order given, and in the response +# phase the middleware will be applied in reverse order. +MIDDLEWARE = [] + +############ +# SESSIONS # +############ + +# Cache to store session data if using the cache session backend. +SESSION_CACHE_ALIAS = "default" +# Cookie name. This can be whatever you want. +SESSION_COOKIE_NAME = "sessionid" +# Age of cookie, in seconds (default: 2 weeks). +SESSION_COOKIE_AGE = 60 * 60 * 24 * 7 * 2 +# A string like "example.com", or None for standard domain cookie. +SESSION_COOKIE_DOMAIN = None +# Whether the session cookie should be secure (https:// only). +SESSION_COOKIE_SECURE = False +# The path of the session cookie. +SESSION_COOKIE_PATH = "/" +# Whether to use the HttpOnly flag. +SESSION_COOKIE_HTTPONLY = True +# Whether to set the flag restricting cookie leaks on cross-site requests. +# This can be 'Lax', 'Strict', 'None', or False to disable the flag. +SESSION_COOKIE_SAMESITE = "Lax" +# Whether to save the session data on every request. +SESSION_SAVE_EVERY_REQUEST = False +# Whether a user's session cookie expires when the web browser is closed. +SESSION_EXPIRE_AT_BROWSER_CLOSE = False +# The module to store session data +SESSION_ENGINE = "django.contrib.sessions.backends.db" +# Directory to store session files if using the file session module. If None, +# the backend will use a sensible default. +SESSION_FILE_PATH = None +# class to serialize session data +SESSION_SERIALIZER = "django.contrib.sessions.serializers.JSONSerializer" + +######### +# CACHE # +######### + +# The cache backends to use. +CACHES = { + "default": { + "BACKEND": "django.core.cache.backends.locmem.LocMemCache", + } +} +CACHE_MIDDLEWARE_KEY_PREFIX = "" +CACHE_MIDDLEWARE_SECONDS = 600 +CACHE_MIDDLEWARE_ALIAS = "default" + +################## +# AUTHENTICATION # +################## + +AUTH_USER_MODEL = "auth.User" + +AUTHENTICATION_BACKENDS = ["django.contrib.auth.backends.ModelBackend"] + +LOGIN_URL = "/accounts/login/" + +LOGIN_REDIRECT_URL = "/accounts/profile/" + +LOGOUT_REDIRECT_URL = None + +# The number of seconds a password reset link is valid for (default: 3 days). +PASSWORD_RESET_TIMEOUT = 60 * 60 * 24 * 3 + +# the first hasher in this list is the preferred algorithm. any +# password using different algorithms will be converted automatically +# upon login +PASSWORD_HASHERS = [ + "django.contrib.auth.hashers.PBKDF2PasswordHasher", + "django.contrib.auth.hashers.PBKDF2SHA1PasswordHasher", + "django.contrib.auth.hashers.Argon2PasswordHasher", + "django.contrib.auth.hashers.BCryptSHA256PasswordHasher", + "django.contrib.auth.hashers.ScryptPasswordHasher", +] + +AUTH_PASSWORD_VALIDATORS = [ + { + "NAME": "django.contrib.auth.password_validation.UserAttributeSimilarityValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.MinimumLengthValidator", + "OPTIONS": { + "min_length": 9, + }, + }, + { + "NAME": "django.contrib.auth.password_validation.CommonPasswordValidator", + }, + { + "NAME": "django.contrib.auth.password_validation.NumericPasswordValidator", + }, +] +########### +# SIGNING # +########### + +SIGNING_BACKEND = "django.core.signing.TimestampSigner" + +######## +# CSRF # +######## + +# Dotted path to callable to be used as view when a request is +# rejected by the CSRF middleware. +CSRF_FAILURE_VIEW = "django.views.csrf.csrf_failure" + +# Settings for CSRF cookie. +CSRF_COOKIE_NAME = "csrftoken" +CSRF_COOKIE_AGE = 60 * 60 * 24 * 7 * 52 +CSRF_COOKIE_DOMAIN = None +CSRF_COOKIE_PATH = "/" +CSRF_COOKIE_SECURE = False +CSRF_COOKIE_HTTPONLY = False +CSRF_COOKIE_SAMESITE = "Lax" +CSRF_HEADER_NAME = "HTTP_X_CSRFTOKEN" +CSRF_TRUSTED_ORIGINS = [] +CSRF_USE_SESSIONS = False + +############ +# MESSAGES # +############ + +# Class to use as messages backend +MESSAGE_STORAGE = "django.contrib.messages.storage.fallback.FallbackStorage" + +# Default values of MESSAGE_LEVEL and MESSAGE_TAGS are defined within +# django.contrib.messages to avoid imports in this settings file. + +########### +# LOGGING # +########### + +# The callable to use to configure logging +LOGGING_CONFIG = "logging.config.dictConfig" + +# Custom logging configuration. +LOGGING = { + "version": 1, + "disable_existing_loggers": False, + "filters": { + "require_debug_false": { + "()": "django.utils.log.RequireDebugFalse", + }, + "require_debug_true": { + "()": "django.utils.log.RequireDebugTrue", + }, + }, + "handlers": { + "console": { + "level": "INFO", + "filters": ["require_debug_true"], + "class": "logging.StreamHandler", + }, + }, +} + +# Default exception reporter class used in case none has been +# specifically assigned to the HttpRequest instance. +DEFAULT_EXCEPTION_REPORTER = "django.views.debug.ExceptionReporter" + +# Default exception reporter filter class used in case none has been +# specifically assigned to the HttpRequest instance. +DEFAULT_EXCEPTION_REPORTER_FILTER = "django.views.debug.SafeExceptionReporterFilter" + +########### +# TESTING # +########### + +# The name of the class to use to run the test suite +TEST_RUNNER = "django.test.runner.DiscoverRunner" + +# Apps that don't need to be serialized at test database creation time +# (only apps with migrations are to start with) +TEST_NON_SERIALIZED_APPS = [] + +############ +# FIXTURES # +############ + +# The list of directories to search for fixtures +FIXTURE_DIRS = [] + +############### +# STATICFILES # +############### + +# A list of locations of additional static files +STATICFILES_DIRS = [] + +# The default file storage backend used during the build process +STATICFILES_STORAGE = "django.contrib.staticfiles.storage.StaticFilesStorage" + +# List of finder classes that know how to find static files in +# various locations. +STATICFILES_FINDERS = [ + "django.contrib.staticfiles.finders.FileSystemFinder", + "django.contrib.staticfiles.finders.AppDirectoriesFinder", + # 'django.contrib.staticfiles.finders.DefaultStorageFinder', +] + +############## +# MIGRATIONS # +############## + +# Migration module overrides for apps, by app label. +MIGRATION_MODULES = {} + +################# +# SYSTEM CHECKS # +################# + +# List of all issues generated by system checks that should be silenced. Light +# issues like warnings, infos or debugs will not generate a message. Silencing +# serious issues like errors and criticals does not result in hiding the +# message, but Django will not stop you from e.g. running server. +SILENCED_SYSTEM_CHECKS = [] + +####################### +# SECURITY MIDDLEWARE # +####################### +SECURE_CONTENT_TYPE_NOSNIFF = True +SECURE_CROSS_ORIGIN_OPENER_POLICY = "same-origin" +SECURE_HSTS_INCLUDE_SUBDOMAINS = False +SECURE_HSTS_PRELOAD = False +SECURE_HSTS_SECONDS = 0 +SECURE_REDIRECT_EXEMPT = [] +SECURE_REFERRER_POLICY = "same-origin" +SECURE_SSL_HOST = None +SECURE_SSL_REDIRECT = False + + +SPECTACULAR_SETTINGS = { + # Define if the API should be public or require jwt authentication + "SERVE_PERMISSIONS": ["rest_framework.permissions.IsAuthenticated"], +} diff --git a/backend/server/urls.py b/backend/server/urls.py new file mode 100644 index 0000000..b7cb022 --- /dev/null +++ b/backend/server/urls.py @@ -0,0 +1,39 @@ +""" +URL configuration for server project. + +The `urlpatterns` list routes URLs to views. For more information please see: + https://docs.djangoproject.com/en/5.0/topics/http/urls/ +Examples: +Function views + 1. Add an import: from my_app import views + 2. Add a URL to urlpatterns: path('', views.home, name='home') +Class-based views + 1. Add an import: from other_app.views import Home + 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home') +Including another URLconf + 1. Import the include() function: from django.urls import include, path + 2. Add a URL to urlpatterns: path('blog/', include('blog.urls')) +""" + +from django.conf import settings +from django.shortcuts import redirect +from django.urls import include, path +from django.urls.resolvers import URLResolver + +urlpatterns: list[URLResolver] = [ + path("users/", include("users.urls")), + path("api/", include("api.urls")), + path("core/", include("core.urls")), +] +if settings.DEBUG: + from debug_toolbar.toolbar import debug_toolbar_urls + from django.contrib import admin + + urlpatterns += [ + path( + "", + lambda request: redirect("api/swagger-ui/", permanent=False), + name="api_redirect", + ), + path("_/", admin.site.urls), + ] + debug_toolbar_urls(prefix="debug") diff --git a/backend/server/wsgi.py b/backend/server/wsgi.py new file mode 100644 index 0000000..28615ff --- /dev/null +++ b/backend/server/wsgi.py @@ -0,0 +1,16 @@ +""" +WSGI config for server project. + +It exposes the WSGI callable as a module-level variable named ``application``. + +For more information on this file, see +https://docs.djangoproject.com/en/5.0/howto/deployment/wsgi/ +""" + +import os + +from django.core.wsgi import get_wsgi_application + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings.base") + +application = get_wsgi_application() diff --git a/backend/users/__init__.py b/backend/users/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/users/__pycache__/__init__.cpython-312.pyc b/backend/users/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..f050a28 Binary files /dev/null and b/backend/users/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/users/__pycache__/admin.cpython-312.pyc b/backend/users/__pycache__/admin.cpython-312.pyc new file mode 100644 index 0000000..b8f7df2 Binary files /dev/null and b/backend/users/__pycache__/admin.cpython-312.pyc differ diff --git a/backend/users/__pycache__/apps.cpython-312.pyc b/backend/users/__pycache__/apps.cpython-312.pyc new file mode 100644 index 0000000..eca9c69 Binary files /dev/null and b/backend/users/__pycache__/apps.cpython-312.pyc differ diff --git a/backend/users/__pycache__/backends.cpython-312.pyc b/backend/users/__pycache__/backends.cpython-312.pyc new file mode 100644 index 0000000..674a1a2 Binary files /dev/null and b/backend/users/__pycache__/backends.cpython-312.pyc differ diff --git a/backend/users/__pycache__/models.cpython-312.pyc b/backend/users/__pycache__/models.cpython-312.pyc new file mode 100644 index 0000000..14a05a6 Binary files /dev/null and b/backend/users/__pycache__/models.cpython-312.pyc differ diff --git a/backend/users/__pycache__/serializers.cpython-312.pyc b/backend/users/__pycache__/serializers.cpython-312.pyc new file mode 100644 index 0000000..dbfbd87 Binary files /dev/null and b/backend/users/__pycache__/serializers.cpython-312.pyc differ diff --git a/backend/users/__pycache__/tests.cpython-312.pyc b/backend/users/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000..81b6007 Binary files /dev/null and b/backend/users/__pycache__/tests.cpython-312.pyc differ diff --git a/backend/users/__pycache__/urls.cpython-312.pyc b/backend/users/__pycache__/urls.cpython-312.pyc new file mode 100644 index 0000000..90c4e8d Binary files /dev/null and b/backend/users/__pycache__/urls.cpython-312.pyc differ diff --git a/backend/users/__pycache__/views.cpython-312.pyc b/backend/users/__pycache__/views.cpython-312.pyc new file mode 100644 index 0000000..31d12a3 Binary files /dev/null and b/backend/users/__pycache__/views.cpython-312.pyc differ diff --git a/backend/users/admin.py b/backend/users/admin.py new file mode 100644 index 0000000..e6c5b4e --- /dev/null +++ b/backend/users/admin.py @@ -0,0 +1,16 @@ +# users/admin.py +""" +This module is responsible for registering the CustomUser model in the Django admin site. + +It imports the CustomUser model from the users.models module \ + and registers it using the admin.site.register() function. + +Example usage: + admin.site.register(CustomUser) +""" +from django.contrib import admin +from users.models import CustomUser + +# Register your models here. + +admin.site.register(model_or_iterable=CustomUser) diff --git a/backend/users/apps.py b/backend/users/apps.py new file mode 100644 index 0000000..7e529ba --- /dev/null +++ b/backend/users/apps.py @@ -0,0 +1,14 @@ +""" +This module contains the configuration for the Users app. + +It defines the `UsersConfig` class, which is responsible for configuring the Users app in Django. +""" + +from django.apps import AppConfig + + +class UsersConfig(AppConfig): + """Users app config""" + + default_auto_field: str = "django.db.models.BigAutoField" + name = "users" diff --git a/backend/users/backends.py b/backend/users/backends.py new file mode 100644 index 0000000..2fa030a --- /dev/null +++ b/backend/users/backends.py @@ -0,0 +1,63 @@ +# users/backends.py + +""" +This module contains a custom authentication backend that allows users to\ + authenticate using either their email or username. +""" + +from django.contrib.auth import get_user_model +from django.contrib.auth.backends import ModelBackend +from django.contrib.auth.models import AbstractUser +from django.db.models import Q + +UserModel: type[AbstractUser] = get_user_model() + + +class EmailOrUsernameModelBackend(ModelBackend): + """ + A custom authentication backend that allows users to authenticate using either\ + their email or username. + + :param ModelBackend: A class that extends the default Django ModelBackend. + :return: A custom authentication backend. + :raises: No exceptions raised. + """ + + def authenticate( + self, request, username=None, password=None, **kwargs + ) -> None | AbstractUser: + """ + Authenticates a user based on their email or username. + + :param request: The request object. + :param username: The username or email of the user. + :param password: The password of the user. + :param kwargs: Additional keyword arguments. + :return: The user object if the username and password are correct, otherwise None. + :raises: No exceptions raised. + """ + try: + user: AbstractUser = UserModel.objects.get( + Q(username__iexact=username) | Q(email__iexact=username) + ) + except UserModel.DoesNotExist: + return None + except UserModel.MultipleObjectsReturned: + return None + + if password is not None and user.check_password(raw_password=password): + return user + return None + + def get_user(self, user_id: int) -> AbstractUser | None: + """ + Retrieves a user object based on the user ID. + + :param user_id: The ID of the user. + :return: The user object if the user exists, otherwise None. + :raises: No exceptions raised. + """ + try: + return UserModel.objects.get(pk=user_id) + except UserModel.DoesNotExist: + return None diff --git a/backend/users/migrations/0001_initial.py b/backend/users/migrations/0001_initial.py new file mode 100644 index 0000000..0f848d5 --- /dev/null +++ b/backend/users/migrations/0001_initial.py @@ -0,0 +1,44 @@ +# Generated by Django 5.0.6 on 2024-07-08 21:24 + +import django.contrib.auth.models +import django.contrib.auth.validators +import django.utils.timezone +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0012_alter_user_first_name_max_length'), + ] + + operations = [ + migrations.CreateModel( + name='CustomUser', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('username', models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username')), + ('first_name', models.CharField(blank=True, max_length=150, verbose_name='first name')), + ('last_name', models.CharField(blank=True, max_length=150, verbose_name='last name')), + ('email', models.EmailField(blank=True, max_length=254, verbose_name='email address')), + ('is_staff', models.BooleanField(default=False, help_text='Designates whether the user can log into this admin site.', verbose_name='staff status')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')), + ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + ] diff --git a/backend/users/migrations/0002_alter_customuser_email.py b/backend/users/migrations/0002_alter_customuser_email.py new file mode 100644 index 0000000..c663140 --- /dev/null +++ b/backend/users/migrations/0002_alter_customuser_email.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.7 on 2024-07-10 02:24 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.AlterField( + model_name='customuser', + name='email', + field=models.EmailField(max_length=254, unique=True, verbose_name='email address'), + ), + ] diff --git a/backend/users/migrations/0003_alter_customuser_options.py b/backend/users/migrations/0003_alter_customuser_options.py new file mode 100644 index 0000000..7f733b4 --- /dev/null +++ b/backend/users/migrations/0003_alter_customuser_options.py @@ -0,0 +1,17 @@ +# Generated by Django 5.0.7 on 2024-07-23 07:11 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0002_alter_customuser_email'), + ] + + operations = [ + migrations.AlterModelOptions( + name='customuser', + options={'ordering': ['-date_joined']}, + ), + ] diff --git a/backend/users/migrations/__init__.py b/backend/users/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/users/migrations/__pycache__/0001_initial.cpython-312.pyc b/backend/users/migrations/__pycache__/0001_initial.cpython-312.pyc new file mode 100644 index 0000000..720c901 Binary files /dev/null and b/backend/users/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/backend/users/migrations/__pycache__/0002_alter_customuser_email.cpython-312.pyc b/backend/users/migrations/__pycache__/0002_alter_customuser_email.cpython-312.pyc new file mode 100644 index 0000000..f94bdc9 Binary files /dev/null and b/backend/users/migrations/__pycache__/0002_alter_customuser_email.cpython-312.pyc differ diff --git a/backend/users/migrations/__pycache__/0003_alter_customuser_options.cpython-312.pyc b/backend/users/migrations/__pycache__/0003_alter_customuser_options.cpython-312.pyc new file mode 100644 index 0000000..8ee4c78 Binary files /dev/null and b/backend/users/migrations/__pycache__/0003_alter_customuser_options.cpython-312.pyc differ diff --git a/backend/users/migrations/__pycache__/__init__.cpython-312.pyc b/backend/users/migrations/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000..4a31369 Binary files /dev/null and b/backend/users/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/backend/users/models.py b/backend/users/models.py new file mode 100644 index 0000000..52a5662 --- /dev/null +++ b/backend/users/models.py @@ -0,0 +1,65 @@ +""" +This module contains the CustomUser model, which is \ + a custom user model that extends the default Django User model. + +Attributes: + email (EmailField): The email address of the user. + USERNAME_FIELD (str): The field used as the unique identifier for \ + authentication (default is 'username'). + EMAIL_FIELD (str): The field used as the unique identifier for email (default is 'email'). + REQUIRED_FIELDS (list[str]): The fields required when creating a user. + +Methods: + __str__(): Returns the username of the user. + +Meta: + ordering (list[str]): The ordering of the CustomUser model. +""" + +from django.contrib.auth.models import AbstractUser +from django.db import models +from django.utils.translation import gettext_lazy as _ + + +class CustomUser(AbstractUser): + """ + A custom user model that extends the default Django User model. + + Attributes: + email (EmailField): The email address of the user. + USERNAME_FIELD (str): The field used as the unique identifier for\ + authentication (default is 'username'). + EMAIL_FIELD (str): The field used as the unique identifier for email (default is 'email'). + REQUIRED_FIELDS (list[str]): The fields required when creating a user. + + Methods: + __str__(): Returns the username of the user. + + Meta: + ordering (list[str]): The ordering of the CustomUser model. + """ + + email = models.EmailField(_(message="email address"), unique=True) + + USERNAME_FIELD = "username" + EMAIL_FIELD = "email" + REQUIRED_FIELDS: list[str] = ["email"] + + def __str__(self) -> str: + """ + Returns the username of the user. + + Returns: + str: The username of the user. + """ + return str(object=self.username) + + class Meta: + """ + Meta class for the CustomUser model. + + Attributes: + ordering (list[str]): The ordering of the CustomUser model. + """ + + ordering: list[str] = ["-date_joined"] diff --git a/backend/users/permissions.py b/backend/users/permissions.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/users/serializers.py b/backend/users/serializers.py new file mode 100644 index 0000000..e7bc62c --- /dev/null +++ b/backend/users/serializers.py @@ -0,0 +1,84 @@ +""" +Serializer for user login. + +This module contains the `CustomLoginSerializer` class, which is used to \ + validate and authenticate user login credentials. + +Raises: + serializers.ValidationError: If the provided credentials are invalid. + +Returns: + dict: A dictionary containing the validated user login data. +""" + +from typing import Any + +from django.contrib.auth import authenticate +from django.contrib.auth.models import AbstractUser +from django.utils.translation import gettext_lazy as _ +from rest_framework import serializers + + +class CustomLoginSerializer(serializers.Serializer): + """ + Serializer for user login. + + This serializer is used to validate and authenticate user login credentials. + + Args: + serializers.Serializer: The base serializer class. + def update(self, instance, validated_data) -> None: + pass + + Raises: + serializers.ValidationError: If the provided credentials are invalid. + + Returns: + dict: A dictionary containing the validated user login data. + """ + + email_or_username = serializers.CharField(required=True) + password = serializers.CharField(style={"input_type": "password"}) + user: AbstractUser | None = None + + def validate(self, attrs) -> Any: + """ + Validate the user login credentials. + + This method checks if the provided email/username and password are valid. + If the credentials are valid, it returns a dictionary containing the validated data. + Otherwise, it raises a `serializers.ValidationError` with an appropriate error message. + + Args: + attrs (dict): A dictionary containing the user login data. + + Raises: + serializers.ValidationError: If the provided credentials are invalid. + + Returns: + dict: A dictionary containing the validated user login data. + """ + email_or_username: str = attrs.get("email_or_username") + password: str = attrs.get("password") + + if email_or_username and password: + user: AbstractUser | None = authenticate( + request=self.context["request"], + username=email_or_username, + password=password, + ) + if not user: + msg = _("Unable to log in with provided credentials.") + raise serializers.ValidationError(detail=msg, code="authorization") + else: + msg: str = _('Must include "email_or_username" and "password".') + raise serializers.ValidationError(detail=msg, code="authorization") + + attrs["user"] = user + return attrs + + def create(self, validated_data) -> Any: + return super().create(validated_data=validated_data) + + +# """ diff --git a/backend/users/tests.py b/backend/users/tests.py new file mode 100644 index 0000000..a1a1cda --- /dev/null +++ b/backend/users/tests.py @@ -0,0 +1,110 @@ +""" +This module contains test cases for the CustomUser model. + +The CustomUser model represents a custom user in the application. +It includes test cases to verify the creation of a user with the expected attributes, +as well as test cases to verify that a user is not created when an invalid value is provided. + +Attributes: + TestCase (type): The base test case class provided by Django. + +Methods: + setUp: Set up the test environment by creating a custom user. + test_user_created: Test case to verify the creation of a user. + test_user_not_created: Test case to verify that a user \ + is not created when an invalid value is provided. +""" + +from django.test import TestCase + +from .models import CustomUser + + +class CustomUserTestCase(TestCase): + """ + Test case class for testing the CustomUser model. + + This test case class is used to test the creation and behavior of the CustomUser model. + It includes test cases to verify the creation of a user with the expected attributes, + as well as test cases to verify that a user is not created when an invalid value is provided. + + Attributes: + TestCase (type): The base test case class provided by Django. + + Methods: + setUp: Set up the test environment by creating a custom user. + test_user_created: Test case to verify the creation of a user. + test_user_not_created: Test case to verify that a user \ + is not created when an invalid value is provided. + """ + + def setUp(self) -> None: + """ + Set up the test environment by creating a custom user. + + This method is called before each test case to prepare the necessary resources + and set up the initial state for the tests. + + The custom user created has the following attributes: + - username: "test" + - email: "test@test.com" + - password: "testpassword" + - first_name: "test" + - last_name: "test" + """ + CustomUser.objects.create_user( + username="test", + email="test@test.com", + password="testpassword", + first_name="test", + last_name="test", + ) + + def test_user_created(self) -> None: + """ + Test case to verify the creation of a user. + + This test case checks if a user is created with the expected attributes: + - Username: "test" + - Email: "test@test.com" + - First Name: "test" + - Last Name: "test" + - Password: "testpassword" + - is_staff: False + - is_superuser: False + - is_active: True + + It also verifies that the string representation of the user is "test". + """ + user: CustomUser = CustomUser.objects.get(username="test") + self.assertEqual(user.email, "test@test.com") + self.assertEqual(user.first_name, "test") + self.assertEqual(user.last_name, "test") + self.assertTrue(user.check_password("testpassword")) + self.assertFalse(user.is_staff) + self.assertFalse(user.is_superuser) + self.assertTrue(user.is_active) + self.assertEqual(str(user), "test") + + def test_user_not_created(self) -> None: + """ + Test case to verify that a user is not created when an invalid value is provided. + + This test case verifies that when an invalid value is provided for creating a user, + a `ValueError` exception is raised. In this case, we are trying to create a user + with an invalid password. The `create_user` method of the `CustomUser` model should + raise a `ValueError` when an invalid password is provided. + + This test uses the `assertRaises` context manager to assert that a `ValueError` + exception is raised when the `create_user` method\ + is called with the provided invalid values. + """ + with self.assertRaises(expected_exception=ValueError) as context: + + CustomUser.objects.create_user( + username="test", + email="test2@test.com", + password="testpassword", + first_name="test", + last_name="test", + ) diff --git a/backend/users/urls.py b/backend/users/urls.py new file mode 100644 index 0000000..25a7ae9 --- /dev/null +++ b/backend/users/urls.py @@ -0,0 +1,23 @@ +# users/urls.py +""" +This module defines the URL patterns for the users app. + +The urlpatterns list contains the URL patterns for the users app. It includes the base URLs for authentication and registration using the dj_rest_auth library. + +URL Patterns: +- "" (empty string): Includes the URLs for authentication using dj_rest_auth. +- "signup/": Includes the URLs for registration using dj_rest_auth.registration. + +Note: This module is imported and used in the project's main URL configuration file. +""" +from django.urls import URLResolver, include, path + +# base urls +urlpatterns: list[URLResolver] = [ + path("", include("dj_rest_auth.urls"), name="dj_rest_auth"), + path( + "signup/", + include("dj_rest_auth.registration.urls"), + name="dj_rest_auth_registration", + ), +] diff --git a/backend/users/views.py b/backend/users/views.py new file mode 100644 index 0000000..60f00ef --- /dev/null +++ b/backend/users/views.py @@ -0,0 +1 @@ +# Create your views here. diff --git a/docs/.obsidian/app.json b/docs/.obsidian/app.json new file mode 100644 index 0000000..9e26dfe --- /dev/null +++ b/docs/.obsidian/app.json @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/docs/.obsidian/appearance.json b/docs/.obsidian/appearance.json new file mode 100644 index 0000000..c8c365d --- /dev/null +++ b/docs/.obsidian/appearance.json @@ -0,0 +1,3 @@ +{ + "accentColor": "" +} \ No newline at end of file diff --git a/docs/.obsidian/core-plugins-migration.json b/docs/.obsidian/core-plugins-migration.json new file mode 100644 index 0000000..436f43c --- /dev/null +++ b/docs/.obsidian/core-plugins-migration.json @@ -0,0 +1,30 @@ +{ + "file-explorer": true, + "global-search": true, + "switcher": true, + "graph": true, + "backlink": true, + "canvas": true, + "outgoing-link": true, + "tag-pane": true, + "properties": false, + "page-preview": true, + "daily-notes": true, + "templates": true, + "note-composer": true, + "command-palette": true, + "slash-command": false, + "editor-status": true, + "bookmarks": true, + "markdown-importer": false, + "zk-prefixer": false, + "random-note": false, + "outline": true, + "word-count": true, + "slides": false, + "audio-recorder": false, + "workspaces": false, + "file-recovery": true, + "publish": false, + "sync": false +} \ No newline at end of file diff --git a/docs/.obsidian/core-plugins.json b/docs/.obsidian/core-plugins.json new file mode 100644 index 0000000..9405bfd --- /dev/null +++ b/docs/.obsidian/core-plugins.json @@ -0,0 +1,20 @@ +[ + "file-explorer", + "global-search", + "switcher", + "graph", + "backlink", + "canvas", + "outgoing-link", + "tag-pane", + "page-preview", + "daily-notes", + "templates", + "note-composer", + "command-palette", + "editor-status", + "bookmarks", + "outline", + "word-count", + "file-recovery" +] \ No newline at end of file diff --git a/docs/.obsidian/workspace.json b/docs/.obsidian/workspace.json new file mode 100644 index 0000000..56db47c --- /dev/null +++ b/docs/.obsidian/workspace.json @@ -0,0 +1,156 @@ +{ + "main": { + "id": "cfc817c7621d9047", + "type": "split", + "children": [ + { + "id": "6b5e76cf78e87084", + "type": "tabs", + "children": [ + { + "id": "357f742c6017d7c8", + "type": "leaf", + "state": { + "type": "markdown", + "state": { + "file": "Notas de Clase/2024-06-26.md", + "mode": "source", + "source": false + } + } + } + ] + } + ], + "direction": "vertical" + }, + "left": { + "id": "c6b56d59718c2d43", + "type": "split", + "children": [ + { + "id": "6e0867b6a0304fa2", + "type": "tabs", + "children": [ + { + "id": "ee39f44e1e12fa62", + "type": "leaf", + "state": { + "type": "file-explorer", + "state": { + "sortOrder": "alphabetical" + } + } + }, + { + "id": "ec0775a8ac47dadf", + "type": "leaf", + "state": { + "type": "search", + "state": { + "query": "", + "matchingCase": false, + "explainSearch": false, + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical" + } + } + }, + { + "id": "9bebc34f800618d3", + "type": "leaf", + "state": { + "type": "bookmarks", + "state": {} + } + } + ] + } + ], + "direction": "horizontal", + "width": 300 + }, + "right": { + "id": "e13c3cc95bdfc273", + "type": "split", + "children": [ + { + "id": "40a17265e57f0791", + "type": "tabs", + "children": [ + { + "id": "273941cf3bab30f9", + "type": "leaf", + "state": { + "type": "backlink", + "state": { + "file": "Notas de Clase/2024-06-26.md", + "collapseAll": false, + "extraContext": false, + "sortOrder": "alphabetical", + "showSearch": false, + "searchQuery": "", + "backlinkCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "2041cd56565be4c9", + "type": "leaf", + "state": { + "type": "outgoing-link", + "state": { + "file": "Notas de Clase/2024-06-26.md", + "linksCollapsed": false, + "unlinkedCollapsed": true + } + } + }, + { + "id": "0b2f80a73eeb40e0", + "type": "leaf", + "state": { + "type": "tag", + "state": { + "sortOrder": "frequency", + "useHierarchy": true + } + } + }, + { + "id": "2b0f2f75b620fd97", + "type": "leaf", + "state": { + "type": "outline", + "state": { + "file": "Notas de Clase/2024-06-26.md" + } + } + } + ] + } + ], + "direction": "horizontal", + "width": 300, + "collapsed": true + }, + "left-ribbon": { + "hiddenItems": { + "switcher:Abrir selector rápido": false, + "graph:Abrir vista gráfica": false, + "canvas:Crear nuevo lienzo": false, + "daily-notes:Abrir la nota de hoy": false, + "templates:Insertar plantilla": false, + "command-palette:Abrir paleta de comandos": false + } + }, + "active": "357f742c6017d7c8", + "lastOpenFiles": [ + "Notas de Clase/2024-06-12.md", + "Notas de Clase/2024-06-26.md", + "Notas de Clase/2024-05-22.md", + "notas/Resumen de Informes.md" + ] +} \ No newline at end of file diff --git a/docs/Notas de Clase/2024-05-22.md b/docs/Notas de Clase/2024-05-22.md new file mode 100644 index 0000000..7f1c5fa --- /dev/null +++ b/docs/Notas de Clase/2024-05-22.md @@ -0,0 +1,42 @@ +| +# Devolucion + +### Vista de Coordinadora / Administradora + +- Mes de marzo seria conveniente mostrar lo de **matricula** +- Revisar **opción** de procesar los datos de sysadmin. +- Revisar **opción** procesar datos de SYSACAD. + +### Inscripciones Y Nuevos Alumnos +- Ver el tema de las inscripciones, si la lista incluye a los alumnos viejos o nuevos, o todos. +- ¿Como manejan a los alumnos que hacen el seminario? ¿De donde vienen? + + +##### Tema de los correos/envios de mensaje +- La profe lo ve mas como bandeja de entrada que sistema de mensajería. +- La profe quiere que esa parte sea mas como un "mini outlook" xD. que también se pueda adjuntar cosas +- Quiere que esa vista de mensajes sirva exclusivamente para **seleccionar** **usuarios** y enviar mensajes en cantidades +- También poder tener una visualización **general** de quienes lo leyeron y demás. +- **Ver** si tambien se puede enviar mensajes a los profesores, o entre profesores. + + + + +### Diagrama DER + +- Ver lo de `idpago`, hay que ver como relacionarlo con el alumno que paga. +- Hacer el modelo de tablas + +--- + +### Propuestas + +- Al momento de seleccionar los destinatarios de enviar sea un **filtro de usuarios de acuerdo a su estado**, si "Cursa una sola materia" +- Que la administradora pueda seleccionar a los alumnos que cursen tal materia, los que tienen o no tienen deuda... etc. + +## Para la Clase que viene + +- Terminar modelo dinámico de prototipo para la semana que viene, no necesariamente hay que tener todo terminado. +- Hacer la vista de alumnos. +- Definir como será la mensajería +- Tener Listo el modelo de tablas (un mockup al menos) diff --git a/docs/Notas de Clase/2024-06-12.md b/docs/Notas de Clase/2024-06-12.md new file mode 100644 index 0000000..eee37e0 --- /dev/null +++ b/docs/Notas de Clase/2024-06-12.md @@ -0,0 +1,89 @@ + +# Segunda entrevista con la Ing Laclau + +--- + + +## ¿Qué es prórroga? + +la prorroga es un pedido que el alumno puede hacer una vez que regularice la materia para que pueda rendir. segun el certificado analitico que tenga y la fecha de cuando regularizo la materia se le otorgara o no la prorroga que dura un año + +## La mora va a ser por día sobre la adeudado o del 10 al 15 un precio después otro? + + +## Existiendo la mora, en qué momento se inhabilita? + + + +## ¿Qué es la baja?, explicar bien como va a ser  + + + +## ¿Que se considera que un alumno no está vinculado? + + + +## Aclarar el tema del excel de los alumnos del seminario + + + +--- + +# Revision de nuestra presentacion + +## Vista de Administradora - Dashboard +- Revisar el tema de titulos de cada pantalla +- Compromiso de pago podria hacerlo por cuatrimestre... +- +### Cuando seleccione por alumno +- Agregar un cuarto estado -> "*pagado parcialmente*" +- colocar fechas de pago e importe + +- ufff prefiere mensajes (**tipo correo**) + +## Vista Alumno + +- agregar una funcionalidad para que el alumno pueda informar la "**suspencion**" + +--- +# Otras Notas + + +> **Importante:** cliente desea que se vea el listado de alumnos en la pantalla de inicio. segun ella es con lo que trabaja diariamente. + +##### Cuestiones del otro grupo +## Vista de Administradora - Dashboard + +cuando la coordina busque por alumno que se le pueda mostrar la vista que ve el alumno +(*ojo no es la misma, debe ser similar*) + +#### Tema de la mora +- Los alumnos estan inhabilitados indefinidamente hasta que paguen. +- no es baja fisica, es una baja logica / queda suspendido. +- no se les cobra mora es y se los inhabilita +#### Total de alumnos inhabilitados +- Cliente quiere que esos totales se muestren por ciclo lectivo +- Ese total se debe mostrar de todo el ciclo lectivo +- Tener en cuenta que se toma el listado de alumnos inscripto desde el SYSACAD + - En consecuencia con ese modelo de totales, el SYSACAD probablemente tendria mas alumnos que los que se muestran por el sistema poruqe la cliente se maneja con la lista de alumnos del SYSACAD + + +### Pantalla de Reportes + +- **Extra**: cliente desea que el alumno le informe su legajo y asi poder ver la situacion actual del alumno + + +### Pantalla de Configuracion + - Cliente desea que la planilla de pagos se puedan cargar cada semana + - Dicha planilla al momento de subirla se omitiran los movimientos desactualizados + - Y solamente se mostrarar los movimientos de la semana actual + +- Desea tener un registro cuatrimestral del valor historico de valores de **cuotas** y **moras** de cada cuatrimestre + +## Vista desde el Alumno + +- desea que pueda ver ordenado por fechas de ultimos vencimientos. +- Desea una funcionalidad que pueda pagar todo el cuatrimestre. **Aclarar que esto no es necesario** (*descuento como incentivo*) +- Destacar el nombre del alumno y lo que debe en funcion a la fecha actual +- Quiere que se pueda visualizar la fecha actual. + diff --git a/docs/Notas de Clase/2024-06-26.md b/docs/Notas de Clase/2024-06-26.md new file mode 100644 index 0000000..0203fc8 --- /dev/null +++ b/docs/Notas de Clase/2024-06-26.md @@ -0,0 +1,20 @@ + +Anoté lo que pude pq llegue tarde. + +### Modelo Conceptual + +- En lo posible armar un *diccionario de datos*, para una mejor corrección de la carpeta +- Para cada atributo **Anteponer** a que corresponde la entidad. +- En definitiva quiere que demos nombres significativos que permitan agrupar en cosas en comun para dar significado par que sea mas entendible. + +> Profesoras analizaban la posibilidad de implementar una funcionalidad de poder inscribir a los aspirantes y convertirlos a alumnos. Pero para un futuro... + + +---- +#### Parte Grupo 2 +- Tener en cuenta que la tabla `comunica` entre **coord/auxi** y **alumno** se debe *descomponer* en al menos dos tablas mas por tema de relaciones de claves + +--- +#### Semana que Viene +- **Entregar la carpeta** +- En lo posible las profes quieren que se entregue antes \ No newline at end of file diff --git a/docs/notas/Resumen de Informes.md b/docs/notas/Resumen de Informes.md new file mode 100644 index 0000000..2c14543 --- /dev/null +++ b/docs/notas/Resumen de Informes.md @@ -0,0 +1,22 @@ + + +**Reportes:** +- Necesitamos informes sobre quiénes están **inhabilitados**, quiénes **pidieron una baja temporal**, **prórroga** o **equivalencia**. +- Debemos **guardar la documentación relacionada con prórrogas y equivalencias**. +- Queremos ver resúmenes mensuales y de matrícula, así como listas de alumnos morosos y quiénes pagan cuotas completa o reducida. +- Para cada alumno, queremos saber cuándo ingresó, qué tipo de cuota paga, si firmó su compromiso de pago, si está habilitado o no, su historial de pagos y cuánto debe. + +**Pagos:** +- Las cuotas mensuales son de $25,000 con diferentes períodos de pago. +- Se propone que podamos cambiar el valor de la cuota para cada período. +- Los alumnos que no paguen serán inhabilitados después del mes actual, con un aviso 24 horas antes. +- Las deudas de años anteriores se pagarán con la cuota actualizada. +- Ofrecemos un descuento para quienes paguen el cuatrimestre completo, con la opción de cambiar el monto. + +**Detalles adicionales:** +- Hablamos sobre cómo gestionar las bajas temporales, las prórrogas y equivalencias, y cómo guardar los compromisos de pago firmados. +- No podemos inhabilitar automáticamente en otros sistemas, pero tenemos una solución alternativa. +- Proponemos recordatorios automáticos para los pagos y un botón de pago cuatrimestral bonificado. +- Podemos buscar alumnos por número de legajo o DNI, y ajustar el procedimiento para cuotas reducidas. + +Esta versión destaca los puntos principales de manera más sencilla y clara. \ No newline at end of file diff --git a/mysql_schema.pdf b/mysql_schema.pdf new file mode 100644 index 0000000..7ea3b91 Binary files /dev/null and b/mysql_schema.pdf differ diff --git a/nixpacks.toml b/nixpacks.toml new file mode 100644 index 0000000..e69de29 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..6dab561 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "GestionTUP", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..7becb70 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,47 @@ +asgiref==3.8.1 +astroid==3.2.4 +attrs==23.2.0 +certifi==2024.7.4 +cffi==1.16.0 +charset-normalizer==3.3.2 +cryptography==42.0.8 +defusedxml==0.7.1 +dill==0.3.8 +dj-rest-auth==6.0.0 +Django==5.0.7 +django-allauth==0.61.1 +django-cors-headers==4.4.0 +django-debug-toolbar==4.4.5 +django-extensions==3.2.3 +djangorestframework==3.15.2 +djangorestframework-simplejwt==5.3.1 +drf-spectacular==0.27.2 +drf-spectacular-sidecar==2024.7.1 +gunicorn==22.0.0 +idna==3.7 +inflection==0.5.1 +isort==5.13.2 +jsonschema==4.22.0 +jsonschema-specifications==2023.12.1 +mccabe==0.7.0 +oauthlib==3.2.2 +packaging==24.1 +platformdirs==4.2.2 +psycopg2-binary==2.9.9 +pycparser==2.22 +PyJWT==2.8.0 +pylint==3.2.6 +pylint-django==2.5.5 +pylint-plugin-utils==0.8.2 +python-dotenv==1.0.1 +python3-openid==3.2.0 +PyYAML==6.0.1 +referencing==0.35.1 +requests==2.32.3 +requests-oauthlib==2.0.0 +rpds-py==0.18.1 +sqlparse==0.5.0 +tomlkit==0.13.0 +typing_extensions==4.12.2 +uritemplate==4.1.1 +urllib3==2.2.2