diff --git a/.gitignore b/.gitignore index aaadf73..075410f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ *.dll *.so *.dylib +memorylogmonitor # Test binary, built with `go test -c` *.test @@ -30,3 +31,7 @@ go.work.sum # Editor/IDE # .idea/ # .vscode/ + +# Frontend +frontend/node_modules/ +frontend/.vscode/ diff --git a/README.md b/README.md index 8fc80c4..c287d18 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,225 @@ # MemoryLogMonitor + MemoryLogMonitor is a lightweight, real-time log monitoring system that receives logs via TCP and provides a modern web interface for querying, filtering, and sorting logs with in-memory storage. + +![MemoryLogMonitor UI](https://github.com/user-attachments/assets/27c28342-9385-4549-ae6a-26e3eb61cc9a) + +## Features + +- **TCP Log Receiver**: Receives logs via TCP on port 9090 +- **In-Memory Storage**: Stores logs in memory with LRU eviction (max 10,000 entries) +- **Thread-Safe**: Uses `sync.RWMutex` for concurrent access +- **Real-Time Monitoring**: Auto-refreshes every 5 seconds +- **Advanced Filtering**: Filter by keyword and date range +- **Sorting**: Sort logs by newest or oldest first +- **Pagination**: Paginated view for efficient browsing +- **Status API**: Monitor system status and log count +- **Modern Web UI**: Vue3 + TypeScript frontend with responsive design +- **Single Binary**: Frontend embedded in Go binary using embed + +## Technology Stack + +- **Backend**: Go with Gin framework +- **Frontend**: Vue3, TypeScript, Vite +- **Architecture**: TCP server (9090) + HTTP server (8080) +- **Thread Safety**: sync.RWMutex for concurrent access +- **Storage**: In-memory with LRU eviction + +## Quick Start + +### Prerequisites + +- Go 1.20 or later +- Node.js 18+ and npm (for building the frontend) + +### Installation + +1. Clone the repository: +```bash +git clone https://github.com/devuser/MemoryLogMonitor.git +cd MemoryLogMonitor +``` + +2. Build the frontend: +```bash +cd frontend +npm install +npm run build +cd .. +``` + +3. Copy the built frontend to the http package: +```bash +mkdir -p http/frontend/dist +cp -r frontend/dist/* http/frontend/dist/ +``` + +4. Build the Go binary: +```bash +go build -o memorylogmonitor +``` + +5. Run the application: +```bash +./memorylogmonitor +``` + +The application will start: +- TCP server on port 9090 (receives logs) +- HTTP server on port 8080 (web UI and API) + +### Sending Logs + +Send logs via TCP using netcat, telnet, or any TCP client: + +```bash +# Using netcat +echo "Application started successfully" | nc localhost 9090 + +# Using telnet +telnet localhost 9090 +# Then type your log messages + +# Using a script +for i in {1..10}; do + echo "Log entry $i: Sample message" | nc localhost 9090 +done +``` + +### Web Interface + +Open your browser and navigate to: +``` +http://localhost:8080 +``` + +Features available in the UI: +- **Search**: Filter logs by keyword +- **Date Range**: Filter by start and end date +- **Sort**: Toggle between newest/oldest first +- **Pagination**: Navigate through pages of logs +- **Auto-refresh**: Logs update every 5 seconds +- **Status**: View system status and total log count + +## API Endpoints + +### GET /api/logs + +Retrieve logs with optional filtering, sorting, and pagination. + +**Query Parameters:** +- `keyword` (string): Filter by keyword in message +- `start` (RFC3339): Filter by start time +- `end` (RFC3339): Filter by end time +- `sort` (string): Sort order - "asc" or "desc" (default: "desc") +- `page` (int): Page number (default: 1) +- `pageSize` (int): Number of logs per page (default: 100, max: 1000) + +**Example:** +```bash +curl "http://localhost:8080/api/logs?keyword=error&page=1&pageSize=50&sort=desc" +``` + +**Response:** +```json +{ + "logs": [ + { + "timestamp": "2026-01-28T03:39:32Z", + "message": "Log entry 5: Sample application log message" + } + ], + "total": 10, + "page": 1, + "pageSize": 50 +} +``` + +### GET /api/status + +Get system status and log count. + +**Example:** +```bash +curl http://localhost:8080/api/status +``` + +**Response:** +```json +{ + "status": "running", + "logCount": 10, + "timestamp": "2026-01-28T03:39:54Z" +} +``` + +## Architecture + +### Components + +1. **LogStore** (`logstore/logstore.go`) + - Thread-safe log storage using `sync.RWMutex` + - LRU eviction when capacity is exceeded + - Filtering and retrieval methods + +2. **TCP Server** (`tcp/server.go`) + - Listens on port 9090 + - Accepts log messages (one per line) + - Stores logs with current timestamp + +3. **HTTP Server** (`http/server.go`) + - Serves on port 8080 + - RESTful API endpoints + - Embedded Vue3 frontend + +4. **Frontend** (`frontend/`) + - Vue3 + TypeScript SPA + - Real-time log viewing + - Advanced filtering and pagination + +### Data Flow + +``` +TCP Client → TCP Server (9090) → LogStore ← HTTP Server (8080) → Web UI/API +``` + +## Configuration + +Default settings are defined in `main.go`: + +```go +const ( + MaxLogEntries = 10000 // Maximum log entries to store + TCPPort = 9090 // TCP server port + HTTPPort = 8080 // HTTP server port +) +``` + +To change these, modify the constants and rebuild. + +## Development + +### Building Frontend + +```bash +cd frontend +npm install +npm run dev # Development server +npm run build # Production build +``` + +### Building Backend + +```bash +go build -o memorylogmonitor +``` + +### Running Tests + +```bash +go test ./... +``` + +## License + +Apache License 2.0 - see [LICENSE](LICENSE) file for details. diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,24 @@ +# 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? diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..33895ab --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,5 @@ +# Vue 3 + TypeScript + Vite + +This template should help get you started developing with Vue 3 and TypeScript in Vite. The template uses Vue 3 ` + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..11f51c7 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1478 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "vue": "^3.5.24" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz", + "integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.28.6" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.28.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz", + "integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", + "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", + "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", + "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", + "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", + "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", + "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", + "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", + "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", + "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", + "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", + "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", + "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", + "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", + "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", + "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", + "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", + "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", + "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", + "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", + "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", + "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", + "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", + "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", + "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", + "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", + "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.0-beta.53", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.53.tgz", + "integrity": "sha512-vENRlFU4YbrwVqNDZ7fLvy+JR1CRkyr01jhSiDpE1u6py3OMzQfztQU2jxykW3ALNxO4kSlqIDeYyD0Y9RcQeQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.57.0.tgz", + "integrity": "sha512-tPgXB6cDTndIe1ah7u6amCI1T0SsnlOuKgg10Xh3uizJk4e5M1JGaUMk7J4ciuAUcFpbOiNhm2XIjP9ON0dUqA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.57.0.tgz", + "integrity": "sha512-sa4LyseLLXr1onr97StkU1Nb7fWcg6niokTwEVNOO7awaKaoRObQ54+V/hrF/BP1noMEaaAW6Fg2d/CfLiq3Mg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.57.0.tgz", + "integrity": "sha512-/NNIj9A7yLjKdmkx5dC2XQ9DmjIECpGpwHoGmA5E1AhU0fuICSqSWScPhN1yLCkEdkCwJIDu2xIeLPs60MNIVg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.57.0.tgz", + "integrity": "sha512-xoh8abqgPrPYPr7pTYipqnUi1V3em56JzE/HgDgitTqZBZ3yKCWI+7KUkceM6tNweyUKYru1UMi7FC060RyKwA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.57.0.tgz", + "integrity": "sha512-PCkMh7fNahWSbA0OTUQ2OpYHpjZZr0hPr8lId8twD7a7SeWrvT3xJVyza+dQwXSSq4yEQTMoXgNOfMCsn8584g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.57.0.tgz", + "integrity": "sha512-1j3stGx+qbhXql4OCDZhnK7b01s6rBKNybfsX+TNrEe9JNq4DLi1yGiR1xW+nL+FNVvI4D02PUnl6gJ/2y6WJA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.57.0.tgz", + "integrity": "sha512-eyrr5W08Ms9uM0mLcKfM/Uzx7hjhz2bcjv8P2uynfj0yU8GGPdz8iYrBPhiLOZqahoAMB8ZiolRZPbbU2MAi6Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.57.0.tgz", + "integrity": "sha512-Xds90ITXJCNyX9pDhqf85MKWUI4lqjiPAipJ8OLp8xqI2Ehk+TCVhF9rvOoN8xTbcafow3QOThkNnrM33uCFQA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.57.0.tgz", + "integrity": "sha512-Xws2KA4CLvZmXjy46SQaXSejuKPhwVdaNinldoYfqruZBaJHqVo6hnRa8SDo9z7PBW5x84SH64+izmldCgbezw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.57.0.tgz", + "integrity": "sha512-hrKXKbX5FdaRJj7lTMusmvKbhMJSGWJ+w++4KmjiDhpTgNlhYobMvKfDoIWecy4O60K6yA4SnztGuNTQF+Lplw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.57.0.tgz", + "integrity": "sha512-6A+nccfSDGKsPm00d3xKcrsBcbqzCTAukjwWK6rbuAnB2bHaL3r9720HBVZ/no7+FhZLz/U3GwwZZEh6tOSI8Q==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.57.0.tgz", + "integrity": "sha512-4P1VyYUe6XAJtQH1Hh99THxr0GKMMwIXsRNOceLrJnaHTDgk1FTcTimDgneRJPvB3LqDQxUmroBclQ1S0cIJwQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.57.0.tgz", + "integrity": "sha512-8Vv6pLuIZCMcgXre6c3nOPhE0gjz1+nZP6T+hwWjr7sVH8k0jRkH+XnfjjOTglyMBdSKBPPz54/y1gToSKwrSQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.57.0.tgz", + "integrity": "sha512-r1te1M0Sm2TBVD/RxBPC6RZVwNqUTwJTA7w+C/IW5v9Ssu6xmxWEi+iJQlpBhtUiT1raJ5b48pI8tBvEjEFnFA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.57.0.tgz", + "integrity": "sha512-say0uMU/RaPm3CDQLxUUTF2oNWL8ysvHkAjcCzV2znxBr23kFfaxocS9qJm+NdkRhF8wtdEEAJuYcLPhSPbjuQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.57.0.tgz", + "integrity": "sha512-/MU7/HizQGsnBREtRpcSbSV1zfkoxSTR7wLsRmBPQ8FwUj5sykrP1MyJTvsxP5KBq9SyE6kH8UQQQwa0ASeoQQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.57.0.tgz", + "integrity": "sha512-Q9eh+gUGILIHEaJf66aF6a414jQbDnn29zeu0eX3dHMuysnhTvsUvZTCAyZ6tJhUjnvzBKE4FtuaYxutxRZpOg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.57.0.tgz", + "integrity": "sha512-OR5p5yG5OKSxHReWmwvM0P+VTPMwoBS45PXTMYaskKQqybkS3Kmugq1W+YbNWArF8/s7jQScgzXUhArzEQ7x0A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.57.0.tgz", + "integrity": "sha512-XeatKzo4lHDsVEbm1XDHZlhYZZSQYym6dg2X/Ko0kSFgio+KXLsxwJQprnR48GvdIKDOpqWqssC3iBCjoMcMpw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.57.0.tgz", + "integrity": "sha512-Lu71y78F5qOfYmubYLHPcJm74GZLU6UJ4THkf/a1K7Tz2ycwC2VUbsqbJAXaR6Bx70SRdlVrt2+n5l7F0agTUw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.57.0.tgz", + "integrity": "sha512-v5xwKDWcu7qhAEcsUubiav7r+48Uk/ENWdr82MBZZRIm7zThSxCIVDfb3ZeRRq9yqk+oIzMdDo6fCcA5DHfMyA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.57.0.tgz", + "integrity": "sha512-XnaaaSMGSI6Wk8F4KK3QP7GfuuhjGchElsVerCplUuxRIzdvZ7hRBpLR0omCmw+kI2RFJB80nenhOoGXlJ5TfQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.57.0.tgz", + "integrity": "sha512-3K1lP+3BXY4t4VihLw5MEg6IZD3ojSYzqzBG571W3kNQe4G4CcFpSUQVgurYgib5d+YaCjeFow8QivWp8vuSvA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.57.0.tgz", + "integrity": "sha512-MDk610P/vJGc5L5ImE4k5s+GZT3en0KoK1MKPXCRgzmksAMk79j4h3k1IerxTNqwDLxsGxStEZVBqG0gIqZqoA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.57.0.tgz", + "integrity": "sha512-Zv7v6q6aV+VslnpwzqKAmrk5JdVkLUzok2208ZXGipjb+msxBr/fJPZyeEXiFgH7k62Ak0SLIfxQRZQvTuf7rQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.10.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.10.9.tgz", + "integrity": "sha512-ne4A0IpG3+2ETuREInjPNhUGis1SFjv1d5asp8MzEAGtOZeTeHVDOYqOgqfhvseqg/iXty2hjBf1zAOb7RNiNw==", + "dev": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.16.0" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-6.0.3.tgz", + "integrity": "sha512-TlGPkLFLVOY3T7fZrwdvKpjprR3s4fxRln0ORDo1VQ7HHyxJwTlrjKU3kpVWTlaAjIEuCTokmjkZnr8Tpc925w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "1.0.0-beta.53" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.27.tgz", + "integrity": "sha512-DjmjBWZ4tJKxfNC1F6HyYERNHPYS7L7OPFyCrestykNdUZMFYzI9WTyvwPcaNaHlrEUwESHYsfEw3isInncZxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.27" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.27.tgz", + "integrity": "sha512-ynlcBReMgOZj2i6po+qVswtDUeeBRCTgDurjMGShbm8WYZgJ0PA4RmtebBJ0BCYol1qPv3GQF6jK7C9qoVc7lg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.27", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.27.tgz", + "integrity": "sha512-eWaYCcl/uAPInSK2Lze6IqVWaBu/itVqR5InXcHXFyles4zO++Mglt3oxdgj75BDcv1Knr9Y93nowS8U3wqhxg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.27.tgz", + "integrity": "sha512-gnSBQjZA+//qDZen+6a2EdHqJ68Z7uybrMf3SPjEGgG4dicklwDVmMC1AeIHxtLVPT7sn6sH1KOO+tS6gwOUeQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/shared": "3.5.27", + "entities": "^7.0.0", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.27.tgz", + "integrity": "sha512-oAFea8dZgCtVVVTEC7fv3T5CbZW9BxpFzGGxC79xakTr6ooeEqmRuvQydIiDAkglZEAd09LgVf1RoDnL54fu5w==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.27.tgz", + "integrity": "sha512-sHZu9QyDPeDmN/MRoshhggVOWE5WlGFStKFwu8G52swATgSny27hJRWteKDSUUzUH+wp+bmeNbhJnEAel/auUQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.28.5", + "@vue/compiler-core": "3.5.27", + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.6", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.27.tgz", + "integrity": "sha512-Sj7h+JHt512fV1cTxKlYhg7qxBvack+BGncSpH+8vnN+KN95iPIcqB5rsbblX40XorP+ilO7VIKlkuu3Xq2vjw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/language-core": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-3.2.4.tgz", + "integrity": "sha512-bqBGuSG4KZM45KKTXzGtoCl9cWju5jsaBKaJJe3h5hRAAWpZUuj5G+L+eI01sPIkm4H6setKRlw7E85wLdDNew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.27", + "@vue/compiler-dom": "^3.5.0", + "@vue/shared": "^3.5.0", + "alien-signals": "^3.0.0", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1", + "picomatch": "^4.0.2" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.27.tgz", + "integrity": "sha512-vvorxn2KXfJ0nBEnj4GYshSgsyMNFnIQah/wczXlsNXt+ijhugmW+PpJ2cNPe4V6jpnBcs0MhCODKllWG+nvoQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.27.tgz", + "integrity": "sha512-fxVuX/fzgzeMPn/CLQecWeDIFNt3gQVhxM0rW02Tvp/YmZfXQgcTXlakq7IMutuZ/+Ogbn+K0oct9J3JZfyk3A==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/shared": "3.5.27" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.27.tgz", + "integrity": "sha512-/QnLslQgYqSJ5aUmb5F0z0caZPGHRB8LEAQ1s81vHFM5CBfnun63rxhvE/scVb/j3TbBuoZwkJyiLCkBluMpeg==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.27", + "@vue/runtime-core": "3.5.27", + "@vue/shared": "3.5.27", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.27.tgz", + "integrity": "sha512-qOz/5thjeP1vAFc4+BY3Nr6wxyLhpeQgAE/8dDtKo6a6xdk+L4W46HDZgNmLOBUDEkFXV3G7pRiUqxjX0/2zWA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "vue": "3.5.27" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.27.tgz", + "integrity": "sha512-dXr/3CgqXsJkZ0n9F3I4elY8wM9jMJpP3pvRG52r6m0tu/MsAFIe6JpXVGeNMd/D9F4hQynWT8Rfuj0bdm9kFQ==", + "license": "MIT" + }, + "node_modules/@vue/tsconfig": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.8.1.tgz", + "integrity": "sha512-aK7feIWPXFSUhsCP9PFqPyFOcz4ENkb8hZ2pneL6m2UjCkccvaOhC/5KCKluuBufvp2KzkbdA2W2pk20vLzu3g==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "typescript": "5.x", + "vue": "^3.4.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + }, + "vue": { + "optional": true + } + } + }, + "node_modules/alien-signals": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-3.1.2.tgz", + "integrity": "sha512-d9dYqZTS90WLiU0I5c6DHj/HcKkF8ZyGN3G5x8wSbslulz70KOxaqCT0hQCo9KOyhVqzqGojvNdJXoTumZOtcw==", + "dev": true, + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/esbuild": { + "version": "0.27.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", + "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.27.2", + "@esbuild/android-arm": "0.27.2", + "@esbuild/android-arm64": "0.27.2", + "@esbuild/android-x64": "0.27.2", + "@esbuild/darwin-arm64": "0.27.2", + "@esbuild/darwin-x64": "0.27.2", + "@esbuild/freebsd-arm64": "0.27.2", + "@esbuild/freebsd-x64": "0.27.2", + "@esbuild/linux-arm": "0.27.2", + "@esbuild/linux-arm64": "0.27.2", + "@esbuild/linux-ia32": "0.27.2", + "@esbuild/linux-loong64": "0.27.2", + "@esbuild/linux-mips64el": "0.27.2", + "@esbuild/linux-ppc64": "0.27.2", + "@esbuild/linux-riscv64": "0.27.2", + "@esbuild/linux-s390x": "0.27.2", + "@esbuild/linux-x64": "0.27.2", + "@esbuild/netbsd-arm64": "0.27.2", + "@esbuild/netbsd-x64": "0.27.2", + "@esbuild/openbsd-arm64": "0.27.2", + "@esbuild/openbsd-x64": "0.27.2", + "@esbuild/openharmony-arm64": "0.27.2", + "@esbuild/sunos-x64": "0.27.2", + "@esbuild/win32-arm64": "0.27.2", + "@esbuild/win32-ia32": "0.27.2", + "@esbuild/win32-x64": "0.27.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", + "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.57.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.57.0.tgz", + "integrity": "sha512-e5lPJi/aui4TO1LpAXIRLySmwXSE8k3b9zoGfd42p67wzxog4WHjiZF3M2uheQih4DGyc25QEV4yRBbpueNiUA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.57.0", + "@rollup/rollup-android-arm64": "4.57.0", + "@rollup/rollup-darwin-arm64": "4.57.0", + "@rollup/rollup-darwin-x64": "4.57.0", + "@rollup/rollup-freebsd-arm64": "4.57.0", + "@rollup/rollup-freebsd-x64": "4.57.0", + "@rollup/rollup-linux-arm-gnueabihf": "4.57.0", + "@rollup/rollup-linux-arm-musleabihf": "4.57.0", + "@rollup/rollup-linux-arm64-gnu": "4.57.0", + "@rollup/rollup-linux-arm64-musl": "4.57.0", + "@rollup/rollup-linux-loong64-gnu": "4.57.0", + "@rollup/rollup-linux-loong64-musl": "4.57.0", + "@rollup/rollup-linux-ppc64-gnu": "4.57.0", + "@rollup/rollup-linux-ppc64-musl": "4.57.0", + "@rollup/rollup-linux-riscv64-gnu": "4.57.0", + "@rollup/rollup-linux-riscv64-musl": "4.57.0", + "@rollup/rollup-linux-s390x-gnu": "4.57.0", + "@rollup/rollup-linux-x64-gnu": "4.57.0", + "@rollup/rollup-linux-x64-musl": "4.57.0", + "@rollup/rollup-openbsd-x64": "4.57.0", + "@rollup/rollup-openharmony-arm64": "4.57.0", + "@rollup/rollup-win32-arm64-msvc": "4.57.0", + "@rollup/rollup-win32-ia32-msvc": "4.57.0", + "@rollup/rollup-win32-x64-gnu": "4.57.0", + "@rollup/rollup-win32-x64-msvc": "4.57.0", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", + "dev": true, + "license": "MIT" + }, + "node_modules/vite": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz", + "integrity": "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0", + "fdir": "^6.5.0", + "picomatch": "^4.0.3", + "postcss": "^8.5.6", + "rollup": "^4.43.0", + "tinyglobby": "^0.2.15" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^20.19.0 || >=22.12.0", + "jiti": ">=1.21.0", + "less": "^4.0.0", + "lightningcss": "^1.21.0", + "sass": "^1.70.0", + "sass-embedded": "^1.70.0", + "stylus": ">=0.54.8", + "sugarss": "^5.0.0", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.27", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.27.tgz", + "integrity": "sha512-aJ/UtoEyFySPBGarREmN4z6qNKpbEguYHMmXSiOGk69czc+zhs0NF6tEFrY8TZKAl8N/LYAkd4JHVd5E/AsSmw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.27", + "@vue/compiler-sfc": "3.5.27", + "@vue/runtime-dom": "3.5.27", + "@vue/server-renderer": "3.5.27", + "@vue/shared": "3.5.27" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-tsc": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-3.2.4.tgz", + "integrity": "sha512-xj3YCvSLNDKt1iF9OcImWHhmYcihVu9p4b9s4PGR/qp6yhW+tZJaypGxHScRyOrdnHvaOeF+YkZOdKwbgGvp5g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.27", + "@vue/language-core": "3.2.4" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..a488ff8 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,22 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc -b && vite build", + "preview": "vite preview" + }, + "dependencies": { + "vue": "^3.5.24" + }, + "devDependencies": { + "@types/node": "^24.10.1", + "@vitejs/plugin-vue": "^6.0.1", + "@vue/tsconfig": "^0.8.1", + "typescript": "~5.9.3", + "vite": "^7.2.4", + "vue-tsc": "^3.1.4" + } +} diff --git a/frontend/public/vite.svg b/frontend/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/frontend/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..6793f3a --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,357 @@ + + + + + diff --git a/frontend/src/assets/vue.svg b/frontend/src/assets/vue.svg new file mode 100644 index 0000000..770e9d3 --- /dev/null +++ b/frontend/src/assets/vue.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/frontend/src/components/HelloWorld.vue b/frontend/src/components/HelloWorld.vue new file mode 100644 index 0000000..b58e52b --- /dev/null +++ b/frontend/src/components/HelloWorld.vue @@ -0,0 +1,41 @@ + + + + + diff --git a/frontend/src/main.ts b/frontend/src/main.ts new file mode 100644 index 0000000..2425c0f --- /dev/null +++ b/frontend/src/main.ts @@ -0,0 +1,5 @@ +import { createApp } from 'vue' +import './style.css' +import App from './App.vue' + +createApp(App).mount('#app') diff --git a/frontend/src/style.css b/frontend/src/style.css new file mode 100644 index 0000000..85ece63 --- /dev/null +++ b/frontend/src/style.css @@ -0,0 +1,27 @@ +* { + box-sizing: border-box; +} + +:root { + font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; + line-height: 1.5; + font-weight: 400; + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +body { + margin: 0; + padding: 0; + min-width: 320px; + min-height: 100vh; + background-color: #f0f2f5; +} + +#app { + width: 100%; + min-height: 100vh; +} + diff --git a/frontend/tsconfig.app.json b/frontend/tsconfig.app.json new file mode 100644 index 0000000..8d16e42 --- /dev/null +++ b/frontend/tsconfig.app.json @@ -0,0 +1,16 @@ +{ + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo", + "types": ["vite/client"], + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"] +} diff --git a/frontend/tsconfig.json b/frontend/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/frontend/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json new file mode 100644 index 0000000..8a67f62 --- /dev/null +++ b/frontend/tsconfig.node.json @@ -0,0 +1,26 @@ +{ + "compilerOptions": { + "tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo", + "target": "ES2023", + "lib": ["ES2023"], + "module": "ESNext", + "types": ["node"], + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "verbatimModuleSyntax": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "erasableSyntaxOnly": true, + "noFallthroughCasesInSwitch": true, + "noUncheckedSideEffectImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts new file mode 100644 index 0000000..bbcf80c --- /dev/null +++ b/frontend/vite.config.ts @@ -0,0 +1,7 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' + +// https://vite.dev/config/ +export default defineConfig({ + plugins: [vue()], +}) diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..1a63379 --- /dev/null +++ b/go.mod @@ -0,0 +1,39 @@ +module github.com/devuser/MemoryLogMonitor + +go 1.24.12 + +require github.com/gin-gonic/gin v1.11.0 + +require ( + github.com/bytedance/sonic v1.14.0 // indirect + github.com/bytedance/sonic/loader v0.3.0 // indirect + github.com/cloudwego/base64x v0.1.6 // indirect + github.com/gabriel-vasile/mimetype v1.4.8 // indirect + github.com/gin-contrib/sse v1.1.0 // indirect + github.com/go-playground/locales v0.14.1 // indirect + github.com/go-playground/universal-translator v0.18.1 // indirect + github.com/go-playground/validator/v10 v10.27.0 // indirect + github.com/goccy/go-json v0.10.2 // indirect + github.com/goccy/go-yaml v1.18.0 // indirect + github.com/json-iterator/go v1.1.12 // indirect + github.com/klauspost/cpuid/v2 v2.3.0 // indirect + github.com/leodido/go-urn v1.4.0 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 // indirect + github.com/modern-go/reflect2 v1.0.2 // indirect + github.com/pelletier/go-toml/v2 v2.2.4 // indirect + github.com/quic-go/qpack v0.5.1 // indirect + github.com/quic-go/quic-go v0.54.0 // indirect + github.com/twitchyliquid64/golang-asm v0.15.1 // indirect + github.com/ugorji/go/codec v1.3.0 // indirect + go.uber.org/mock v0.5.0 // indirect + golang.org/x/arch v0.20.0 // indirect + golang.org/x/crypto v0.40.0 // indirect + golang.org/x/mod v0.25.0 // indirect + golang.org/x/net v0.42.0 // indirect + golang.org/x/sync v0.16.0 // indirect + golang.org/x/sys v0.35.0 // indirect + golang.org/x/text v0.27.0 // indirect + golang.org/x/tools v0.34.0 // indirect + google.golang.org/protobuf v1.36.9 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..a25fff5 --- /dev/null +++ b/go.sum @@ -0,0 +1,88 @@ +github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQQ= +github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA= +github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA= +github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI= +github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M= +github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/gabriel-vasile/mimetype v1.4.8 h1:FfZ3gj38NjllZIeJAmMhr+qKL8Wu+nOoI3GqacKw1NM= +github.com/gabriel-vasile/mimetype v1.4.8/go.mod h1:ByKUIKGjh1ODkGM1asKUbQZOLGrPjydw3hYPU2YU9t8= +github.com/gin-contrib/sse v1.1.0 h1:n0w2GMuUpWDVp7qSpvze6fAu9iRxJY4Hmj6AmBOU05w= +github.com/gin-contrib/sse v1.1.0/go.mod h1:hxRZ5gVpWMT7Z0B0gSNYqqsSCNIJMjzvm6fqCz9vjwM= +github.com/gin-gonic/gin v1.11.0 h1:OW/6PLjyusp2PPXtyxKHU0RbX6I/l28FTdDlae5ueWk= +github.com/gin-gonic/gin v1.11.0/go.mod h1:+iq/FyxlGzII0KHiBGjuNn4UNENUlKbGlNmc+W50Dls= +github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= +github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= +github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= +github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= +github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= +github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY= +github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHOvC0/uWoy2Fzwn4= +github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo= +github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= +github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/goccy/go-yaml v1.18.0 h1:8W7wMFS12Pcas7KU+VVkaiCng+kG8QiFeFwzFb+rwuw= +github.com/goccy/go-yaml v1.18.0/go.mod h1:XBurs7gK8ATbW4ZPGKgcbrY1Br56PdM69F7LkFRi1kA= +github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8= +github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= +github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y= +github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0= +github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ= +github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= +github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4= +github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/quic-go/qpack v0.5.1 h1:giqksBPnT/HDtZ6VhtFKgoLOWmlyo9Ei6u9PqzIMbhI= +github.com/quic-go/qpack v0.5.1/go.mod h1:+PC4XFrEskIVkcLzpEkbLqq1uCoxPhQuvK5rH1ZgaEg= +github.com/quic-go/quic-go v0.54.0 h1:6s1YB9QotYI6Ospeiguknbp2Znb/jZYjZLRXn9kMQBg= +github.com/quic-go/quic-go v0.54.0/go.mod h1:e68ZEaCdyviluZmy44P6Iey98v/Wfz6HCjQEm+l8zTY= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= +github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= +github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI= +github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08= +github.com/ugorji/go/codec v1.3.0 h1:Qd2W2sQawAfG8XSvzwhBeoGq71zXOC/Q1E9y/wUcsUA= +github.com/ugorji/go/codec v1.3.0/go.mod h1:pRBVtBSKl77K30Bv8R2P+cLSGaTtex6fsA2Wjqmfxj4= +go.uber.org/mock v0.5.0 h1:KAMbZvZPyBPWgD14IrIQ38QCyjwpvVVV6K/bHl1IwQU= +go.uber.org/mock v0.5.0/go.mod h1:ge71pBPLYDk7QIi1LupWxdAykm7KIEFchiOqd6z7qMM= +golang.org/x/arch v0.20.0 h1:dx1zTU0MAE98U+TQ8BLl7XsJbgze2WnNKF/8tGp/Q6c= +golang.org/x/arch v0.20.0/go.mod h1:bdwinDaKcfZUGpH09BB7ZmOfhalA8lQdzl62l8gGWsk= +golang.org/x/crypto v0.40.0 h1:r4x+VvoG5Fm+eJcxMaY8CQM7Lb0l1lsmjGBQ6s8BfKM= +golang.org/x/crypto v0.40.0/go.mod h1:Qr1vMER5WyS2dfPHAlsOj01wgLbsyWtFn/aY+5+ZdxY= +golang.org/x/mod v0.25.0 h1:n7a+ZbQKQA/Ysbyb0/6IbB1H/X41mKgbhfv7AfG/44w= +golang.org/x/mod v0.25.0/go.mod h1:IXM97Txy2VM4PJ3gI61r1YEk/gAj6zAHN3AdZt6S9Ww= +golang.org/x/net v0.42.0 h1:jzkYrhi3YQWD6MLBJcsklgQsoAcw89EcZbJw8Z614hs= +golang.org/x/net v0.42.0/go.mod h1:FF1RA5d3u7nAYA4z2TkclSCKh68eSXtiFwcWQpPXdt8= +golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw= +golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI= +golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k= +golang.org/x/text v0.27.0 h1:4fGWRpyh641NLlecmyl4LOe6yDdfaYNrGb2zdfo4JV4= +golang.org/x/text v0.27.0/go.mod h1:1D28KMCvyooCX9hBiosv5Tz/+YLxj0j7XhWjpSUF7CU= +golang.org/x/tools v0.34.0 h1:qIpSLOxeCYGg9TrcJokLBG4KFA6d795g0xkBkiESGlo= +golang.org/x/tools v0.34.0/go.mod h1:pAP9OwEaY1CAW3HOmg3hLZC5Z0CCmzjAF2UQMSqNARg= +google.golang.org/protobuf v1.36.9 h1:w2gp2mA27hUeUzj9Ex9FBjsBm40zfaDtEWow293U7Iw= +google.golang.org/protobuf v1.36.9/go.mod h1:fuxRtAxBytpl4zzqUh6/eyUujkJdNiuEkXntxiD/uRU= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/http/frontend/dist/assets/index-CYR0sxID.js b/http/frontend/dist/assets/index-CYR0sxID.js new file mode 100644 index 0000000..82355ac --- /dev/null +++ b/http/frontend/dist/assets/index-CYR0sxID.js @@ -0,0 +1 @@ +(function(){const t=document.createElement("link").relList;if(t&&t.supports&&t.supports("modulepreload"))return;for(const r of document.querySelectorAll('link[rel="modulepreload"]'))n(r);new MutationObserver(r=>{for(const i of r)if(i.type==="childList")for(const o of i.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&n(o)}).observe(document,{childList:!0,subtree:!0});function s(r){const i={};return r.integrity&&(i.integrity=r.integrity),r.referrerPolicy&&(i.referrerPolicy=r.referrerPolicy),r.crossOrigin==="use-credentials"?i.credentials="include":r.crossOrigin==="anonymous"?i.credentials="omit":i.credentials="same-origin",i}function n(r){if(r.ep)return;r.ep=!0;const i=s(r);fetch(r.href,i)}})();function Ls(e){const t=Object.create(null);for(const s of e.split(","))t[s]=1;return s=>s in t}const K={},rt=[],we=()=>{},Wn=()=>!1,es=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&(e.charCodeAt(2)>122||e.charCodeAt(2)<97),Hs=e=>e.startsWith("onUpdate:"),X=Object.assign,$s=(e,t)=>{const s=e.indexOf(t);s>-1&&e.splice(s,1)},zr=Object.prototype.hasOwnProperty,H=(e,t)=>zr.call(e,t),A=Array.isArray,it=e=>Mt(e)==="[object Map]",ts=e=>Mt(e)==="[object Set]",un=e=>Mt(e)==="[object Date]",I=e=>typeof e=="function",Y=e=>typeof e=="string",Ce=e=>typeof e=="symbol",q=e=>e!==null&&typeof e=="object",Bn=e=>(q(e)||I(e))&&I(e.then)&&I(e.catch),qn=Object.prototype.toString,Mt=e=>qn.call(e),Xr=e=>Mt(e).slice(8,-1),Gn=e=>Mt(e)==="[object Object]",Vs=e=>Y(e)&&e!=="NaN"&&e[0]!=="-"&&""+parseInt(e,10)===e,bt=Ls(",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted"),ss=e=>{const t=Object.create(null);return(s=>t[s]||(t[s]=e(s)))},Zr=/-\w/g,Be=ss(e=>e.replace(Zr,t=>t.slice(1).toUpperCase())),kr=/\B([A-Z])/g,Ge=ss(e=>e.replace(kr,"-$1").toLowerCase()),Jn=ss(e=>e.charAt(0).toUpperCase()+e.slice(1)),ps=ss(e=>e?`on${Jn(e)}`:""),We=(e,t)=>!Object.is(e,t),Ut=(e,...t)=>{for(let s=0;s{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,writable:n,value:s})},ns=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let an;const rs=()=>an||(an=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{});function Ks(e){if(A(e)){const t={};for(let s=0;s{if(s){const n=s.split(ei);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Us(e){let t="";if(Y(e))t=e;else if(A(e))for(let s=0;sis(s,t))}const Xn=e=>!!(e&&e.__v_isRef===!0),$e=e=>Y(e)?e:e==null?"":A(e)||q(e)&&(e.toString===qn||!I(e.toString))?Xn(e)?$e(e.value):JSON.stringify(e,Zn,2):String(e),Zn=(e,t)=>Xn(t)?Zn(e,t.value):it(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((s,[n,r],i)=>(s[gs(n,i)+" =>"]=r,s),{})}:ts(t)?{[`Set(${t.size})`]:[...t.values()].map(s=>gs(s))}:Ce(t)?gs(t):q(t)&&!A(t)&&!Gn(t)?String(t):t,gs=(e,t="")=>{var s;return Ce(e)?`Symbol(${(s=e.description)!=null?s:t})`:e};let ie;class li{constructor(t=!1){this.detached=t,this._active=!0,this._on=0,this.effects=[],this.cleanups=[],this._isPaused=!1,this.parent=ie,!t&&ie&&(this.index=(ie.scopes||(ie.scopes=[])).push(this)-1)}get active(){return this._active}pause(){if(this._active){this._isPaused=!0;let t,s;if(this.scopes)for(t=0,s=this.scopes.length;t0&&--this._on===0&&(ie=this.prevScope,this.prevScope=void 0)}stop(t){if(this._active){this._active=!1;let s,n;for(s=0,n=this.effects.length;s0)return;if(vt){let t=vt;for(vt=void 0;t;){const s=t.next;t.next=void 0,t.flags&=-9,t=s}}let e;for(;yt;){let t=yt;for(yt=void 0;t;){const s=t.next;if(t.next=void 0,t.flags&=-9,t.flags&1)try{t.trigger()}catch(n){e||(e=n)}t=s}}if(e)throw e}function tr(e){for(let t=e.deps;t;t=t.nextDep)t.version=-1,t.prevActiveLink=t.dep.activeLink,t.dep.activeLink=t}function sr(e){let t,s=e.depsTail,n=s;for(;n;){const r=n.prevDep;n.version===-1?(n===s&&(s=r),qs(n),fi(n)):t=n,n.dep.activeLink=n.prevActiveLink,n.prevActiveLink=void 0,n=r}e.deps=t,e.depsTail=s}function Es(e){for(let t=e.deps;t;t=t.nextDep)if(t.dep.version!==t.version||t.dep.computed&&(nr(t.dep.computed)||t.dep.version!==t.version))return!0;return!!e._dirty}function nr(e){if(e.flags&4&&!(e.flags&16)||(e.flags&=-17,e.globalVersion===Tt)||(e.globalVersion=Tt,!e.isSSR&&e.flags&128&&(!e.deps&&!e._dirty||!Es(e))))return;e.flags|=2;const t=e.dep,s=B,n=de;B=e,de=!0;try{tr(e);const r=e.fn(e._value);(t.version===0||We(r,e._value))&&(e.flags|=128,e._value=r,t.version++)}catch(r){throw t.version++,r}finally{B=s,de=n,sr(e),e.flags&=-3}}function qs(e,t=!1){const{dep:s,prevSub:n,nextSub:r}=e;if(n&&(n.nextSub=r,e.prevSub=void 0),r&&(r.prevSub=n,e.nextSub=void 0),s.subs===e&&(s.subs=n,!n&&s.computed)){s.computed.flags&=-5;for(let i=s.computed.deps;i;i=i.nextDep)qs(i,!0)}!t&&!--s.sc&&s.map&&s.map.delete(s.key)}function fi(e){const{prevDep:t,nextDep:s}=e;t&&(t.nextDep=s,e.prevDep=void 0),s&&(s.prevDep=t,e.nextDep=void 0)}let de=!0;const rr=[];function Re(){rr.push(de),de=!1}function Fe(){const e=rr.pop();de=e===void 0?!0:e}function dn(e){const{cleanup:t}=e;if(e.cleanup=void 0,t){const s=B;B=void 0;try{t()}finally{B=s}}}let Tt=0;class ui{constructor(t,s){this.sub=t,this.dep=s,this.version=s.version,this.nextDep=this.prevDep=this.nextSub=this.prevSub=this.prevActiveLink=void 0}}class Gs{constructor(t){this.computed=t,this.version=0,this.activeLink=void 0,this.subs=void 0,this.map=void 0,this.key=void 0,this.sc=0,this.__v_skip=!0}track(t){if(!B||!de||B===this.computed)return;let s=this.activeLink;if(s===void 0||s.sub!==B)s=this.activeLink=new ui(B,this),B.deps?(s.prevDep=B.depsTail,B.depsTail.nextDep=s,B.depsTail=s):B.deps=B.depsTail=s,ir(s);else if(s.version===-1&&(s.version=this.version,s.nextDep)){const n=s.nextDep;n.prevDep=s.prevDep,s.prevDep&&(s.prevDep.nextDep=n),s.prevDep=B.depsTail,s.nextDep=void 0,B.depsTail.nextDep=s,B.depsTail=s,B.deps===s&&(B.deps=n)}return s}trigger(t){this.version++,Tt++,this.notify(t)}notify(t){Ws();try{for(let s=this.subs;s;s=s.prevSub)s.sub.notify()&&s.sub.dep.notify()}finally{Bs()}}}function ir(e){if(e.dep.sc++,e.sub.flags&4){const t=e.dep.computed;if(t&&!e.dep.subs){t.flags|=20;for(let n=t.deps;n;n=n.nextDep)ir(n)}const s=e.dep.subs;s!==e&&(e.prevSub=s,s&&(s.nextSub=e)),e.dep.subs=e}}const Os=new WeakMap,et=Symbol(""),As=Symbol(""),Et=Symbol("");function Z(e,t,s){if(de&&B){let n=Os.get(e);n||Os.set(e,n=new Map);let r=n.get(s);r||(n.set(s,r=new Gs),r.map=n,r.key=s),r.track()}}function Pe(e,t,s,n,r,i){const o=Os.get(e);if(!o){Tt++;return}const l=f=>{f&&f.trigger()};if(Ws(),t==="clear")o.forEach(l);else{const f=A(e),h=f&&Vs(s);if(f&&s==="length"){const a=Number(n);o.forEach((p,S)=>{(S==="length"||S===Et||!Ce(S)&&S>=a)&&l(p)})}else switch((s!==void 0||o.has(void 0))&&l(o.get(s)),h&&l(o.get(Et)),t){case"add":f?h&&l(o.get("length")):(l(o.get(et)),it(e)&&l(o.get(As)));break;case"delete":f||(l(o.get(et)),it(e)&&l(o.get(As)));break;case"set":it(e)&&l(o.get(et));break}}Bs()}function st(e){const t=L(e);return t===e?t:(Z(t,"iterate",Et),ue(e)?t:t.map(he))}function os(e){return Z(e=L(e),"iterate",Et),e}function Ve(e,t){return De(e)?ft(tt(e)?he(t):t):he(t)}const ai={__proto__:null,[Symbol.iterator](){return _s(this,Symbol.iterator,e=>Ve(this,e))},concat(...e){return st(this).concat(...e.map(t=>A(t)?st(t):t))},entries(){return _s(this,"entries",e=>(e[1]=Ve(this,e[1]),e))},every(e,t){return Ee(this,"every",e,t,void 0,arguments)},filter(e,t){return Ee(this,"filter",e,t,s=>s.map(n=>Ve(this,n)),arguments)},find(e,t){return Ee(this,"find",e,t,s=>Ve(this,s),arguments)},findIndex(e,t){return Ee(this,"findIndex",e,t,void 0,arguments)},findLast(e,t){return Ee(this,"findLast",e,t,s=>Ve(this,s),arguments)},findLastIndex(e,t){return Ee(this,"findLastIndex",e,t,void 0,arguments)},forEach(e,t){return Ee(this,"forEach",e,t,void 0,arguments)},includes(...e){return bs(this,"includes",e)},indexOf(...e){return bs(this,"indexOf",e)},join(e){return st(this).join(e)},lastIndexOf(...e){return bs(this,"lastIndexOf",e)},map(e,t){return Ee(this,"map",e,t,void 0,arguments)},pop(){return gt(this,"pop")},push(...e){return gt(this,"push",e)},reduce(e,...t){return hn(this,"reduce",e,t)},reduceRight(e,...t){return hn(this,"reduceRight",e,t)},shift(){return gt(this,"shift")},some(e,t){return Ee(this,"some",e,t,void 0,arguments)},splice(...e){return gt(this,"splice",e)},toReversed(){return st(this).toReversed()},toSorted(e){return st(this).toSorted(e)},toSpliced(...e){return st(this).toSpliced(...e)},unshift(...e){return gt(this,"unshift",e)},values(){return _s(this,"values",e=>Ve(this,e))}};function _s(e,t,s){const n=os(e),r=n[t]();return n!==e&&!ue(e)&&(r._next=r.next,r.next=()=>{const i=r._next();return i.done||(i.value=s(i.value)),i}),r}const di=Array.prototype;function Ee(e,t,s,n,r,i){const o=os(e),l=o!==e&&!ue(e),f=o[t];if(f!==di[t]){const p=f.apply(e,i);return l?he(p):p}let h=s;o!==e&&(l?h=function(p,S){return s.call(this,Ve(e,p),S,e)}:s.length>2&&(h=function(p,S){return s.call(this,p,S,e)}));const a=f.call(o,h,n);return l&&r?r(a):a}function hn(e,t,s,n){const r=os(e);let i=s;return r!==e&&(ue(e)?s.length>3&&(i=function(o,l,f){return s.call(this,o,l,f,e)}):i=function(o,l,f){return s.call(this,o,Ve(e,l),f,e)}),r[t](i,...n)}function bs(e,t,s){const n=L(e);Z(n,"iterate",Et);const r=n[t](...s);return(r===-1||r===!1)&&Xs(s[0])?(s[0]=L(s[0]),n[t](...s)):r}function gt(e,t,s=[]){Re(),Ws();const n=L(e)[t].apply(e,s);return Bs(),Fe(),n}const hi=Ls("__proto__,__v_isRef,__isVue"),or=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!=="arguments"&&e!=="caller").map(e=>Symbol[e]).filter(Ce));function pi(e){Ce(e)||(e=String(e));const t=L(this);return Z(t,"has",e),t.hasOwnProperty(e)}class lr{constructor(t=!1,s=!1){this._isReadonly=t,this._isShallow=s}get(t,s,n){if(s==="__v_skip")return t.__v_skip;const r=this._isReadonly,i=this._isShallow;if(s==="__v_isReactive")return!r;if(s==="__v_isReadonly")return r;if(s==="__v_isShallow")return i;if(s==="__v_raw")return n===(r?i?Ci:ar:i?ur:fr).get(t)||Object.getPrototypeOf(t)===Object.getPrototypeOf(n)?t:void 0;const o=A(t);if(!r){let f;if(o&&(f=ai[s]))return f;if(s==="hasOwnProperty")return pi}const l=Reflect.get(t,s,k(t)?t:n);if((Ce(s)?or.has(s):hi(s))||(r||Z(t,"get",s),i))return l;if(k(l)){const f=o&&Vs(s)?l:l.value;return r&&q(f)?Ms(f):f}return q(l)?r?Ms(l):Ys(l):l}}class cr extends lr{constructor(t=!1){super(!1,t)}set(t,s,n,r){let i=t[s];const o=A(t)&&Vs(s);if(!this._isShallow){const h=De(i);if(!ue(n)&&!De(n)&&(i=L(i),n=L(n)),!o&&k(i)&&!k(n))return h||(i.value=n),!0}const l=o?Number(s)e,Ht=e=>Reflect.getPrototypeOf(e);function yi(e,t,s){return function(...n){const r=this.__v_raw,i=L(r),o=it(i),l=e==="entries"||e===Symbol.iterator&&o,f=e==="keys"&&o,h=r[e](...n),a=s?Ps:t?ft:he;return!t&&Z(i,"iterate",f?As:et),X(Object.create(h),{next(){const{value:p,done:S}=h.next();return S?{value:p,done:S}:{value:l?[a(p[0]),a(p[1])]:a(p),done:S}}})}}function $t(e){return function(...t){return e==="delete"?!1:e==="clear"?void 0:this}}function vi(e,t){const s={get(r){const i=this.__v_raw,o=L(i),l=L(r);e||(We(r,l)&&Z(o,"get",r),Z(o,"get",l));const{has:f}=Ht(o),h=t?Ps:e?ft:he;if(f.call(o,r))return h(i.get(r));if(f.call(o,l))return h(i.get(l));i!==o&&i.get(r)},get size(){const r=this.__v_raw;return!e&&Z(L(r),"iterate",et),r.size},has(r){const i=this.__v_raw,o=L(i),l=L(r);return e||(We(r,l)&&Z(o,"has",r),Z(o,"has",l)),r===l?i.has(r):i.has(r)||i.has(l)},forEach(r,i){const o=this,l=o.__v_raw,f=L(l),h=t?Ps:e?ft:he;return!e&&Z(f,"iterate",et),l.forEach((a,p)=>r.call(i,h(a),h(p),o))}};return X(s,e?{add:$t("add"),set:$t("set"),delete:$t("delete"),clear:$t("clear")}:{add(r){!t&&!ue(r)&&!De(r)&&(r=L(r));const i=L(this);return Ht(i).has.call(i,r)||(i.add(r),Pe(i,"add",r,r)),this},set(r,i){!t&&!ue(i)&&!De(i)&&(i=L(i));const o=L(this),{has:l,get:f}=Ht(o);let h=l.call(o,r);h||(r=L(r),h=l.call(o,r));const a=f.call(o,r);return o.set(r,i),h?We(i,a)&&Pe(o,"set",r,i):Pe(o,"add",r,i),this},delete(r){const i=L(this),{has:o,get:l}=Ht(i);let f=o.call(i,r);f||(r=L(r),f=o.call(i,r)),l&&l.call(i,r);const h=i.delete(r);return f&&Pe(i,"delete",r,void 0),h},clear(){const r=L(this),i=r.size!==0,o=r.clear();return i&&Pe(r,"clear",void 0,void 0),o}}),["keys","values","entries",Symbol.iterator].forEach(r=>{s[r]=yi(r,e,t)}),s}function Js(e,t){const s=vi(e,t);return(n,r,i)=>r==="__v_isReactive"?!e:r==="__v_isReadonly"?e:r==="__v_raw"?n:Reflect.get(H(s,r)&&r in n?s:n,r,i)}const xi={get:Js(!1,!1)},Si={get:Js(!1,!0)},wi={get:Js(!0,!1)};const fr=new WeakMap,ur=new WeakMap,ar=new WeakMap,Ci=new WeakMap;function Ti(e){switch(e){case"Object":case"Array":return 1;case"Map":case"Set":case"WeakMap":case"WeakSet":return 2;default:return 0}}function Ei(e){return e.__v_skip||!Object.isExtensible(e)?0:Ti(Xr(e))}function Ys(e){return De(e)?e:zs(e,!1,mi,xi,fr)}function Oi(e){return zs(e,!1,bi,Si,ur)}function Ms(e){return zs(e,!0,_i,wi,ar)}function zs(e,t,s,n,r){if(!q(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=Ei(e);if(i===0)return e;const o=r.get(e);if(o)return o;const l=new Proxy(e,i===2?n:s);return r.set(e,l),l}function tt(e){return De(e)?tt(e.__v_raw):!!(e&&e.__v_isReactive)}function De(e){return!!(e&&e.__v_isReadonly)}function ue(e){return!!(e&&e.__v_isShallow)}function Xs(e){return e?!!e.__v_raw:!1}function L(e){const t=e&&e.__v_raw;return t?L(t):e}function Ai(e){return!H(e,"__v_skip")&&Object.isExtensible(e)&&Yn(e,"__v_skip",!0),e}const he=e=>q(e)?Ys(e):e,ft=e=>q(e)?Ms(e):e;function k(e){return e?e.__v_isRef===!0:!1}function ye(e){return Pi(e,!1)}function Pi(e,t){return k(e)?e:new Mi(e,t)}class Mi{constructor(t,s){this.dep=new Gs,this.__v_isRef=!0,this.__v_isShallow=!1,this._rawValue=s?t:L(t),this._value=s?t:he(t),this.__v_isShallow=s}get value(){return this.dep.track(),this._value}set value(t){const s=this._rawValue,n=this.__v_isShallow||ue(t)||De(t);t=n?t:L(t),We(t,s)&&(this._rawValue=t,this._value=n?t:he(t),this.dep.trigger())}}function Ii(e){return k(e)?e.value:e}const Ri={get:(e,t,s)=>t==="__v_raw"?e:Ii(Reflect.get(e,t,s)),set:(e,t,s,n)=>{const r=e[t];return k(r)&&!k(s)?(r.value=s,!0):Reflect.set(e,t,s,n)}};function dr(e){return tt(e)?e:new Proxy(e,Ri)}class Fi{constructor(t,s,n){this.fn=t,this.setter=s,this._value=void 0,this.dep=new Gs(this),this.__v_isRef=!0,this.deps=void 0,this.depsTail=void 0,this.flags=16,this.globalVersion=Tt-1,this.next=void 0,this.effect=this,this.__v_isReadonly=!s,this.isSSR=n}notify(){if(this.flags|=16,!(this.flags&8)&&B!==this)return er(this,!0),!0}get value(){const t=this.dep.track();return nr(this),t&&(t.version=this.dep.version),this._value}set value(t){this.setter&&this.setter(t)}}function Di(e,t,s=!1){let n,r;return I(e)?n=e:(n=e.get,r=e.set),new Fi(n,r,s)}const Vt={},Gt=new WeakMap;let ke;function Ni(e,t=!1,s=ke){if(s){let n=Gt.get(s);n||Gt.set(s,n=[]),n.push(e)}}function ji(e,t,s=K){const{immediate:n,deep:r,once:i,scheduler:o,augmentJob:l,call:f}=s,h=C=>r?C:ue(C)||r===!1||r===0?Me(C,1):Me(C);let a,p,S,T,F=!1,D=!1;if(k(e)?(p=()=>e.value,F=ue(e)):tt(e)?(p=()=>h(e),F=!0):A(e)?(D=!0,F=e.some(C=>tt(C)||ue(C)),p=()=>e.map(C=>{if(k(C))return C.value;if(tt(C))return h(C);if(I(C))return f?f(C,2):C()})):I(e)?t?p=f?()=>f(e,2):e:p=()=>{if(S){Re();try{S()}finally{Fe()}}const C=ke;ke=a;try{return f?f(e,3,[T]):e(T)}finally{ke=C}}:p=we,t&&r){const C=p,J=r===!0?1/0:r;p=()=>Me(C(),J)}const z=ci(),N=()=>{a.stop(),z&&z.active&&$s(z.effects,a)};if(i&&t){const C=t;t=(...J)=>{C(...J),N()}}let R=D?new Array(e.length).fill(Vt):Vt;const M=C=>{if(!(!(a.flags&1)||!a.dirty&&!C))if(t){const J=a.run();if(r||F||(D?J.some((je,pe)=>We(je,R[pe])):We(J,R))){S&&S();const je=ke;ke=a;try{const pe=[J,R===Vt?void 0:D&&R[0]===Vt?[]:R,T];R=J,f?f(t,3,pe):t(...pe)}finally{ke=je}}}else a.run()};return l&&l(M),a=new kn(p),a.scheduler=o?()=>o(M,!1):M,T=C=>Ni(C,!1,a),S=a.onStop=()=>{const C=Gt.get(a);if(C){if(f)f(C,4);else for(const J of C)J();Gt.delete(a)}},t?n?M(!0):R=a.run():o?o(M.bind(null,!0),!0):a.run(),N.pause=a.pause.bind(a),N.resume=a.resume.bind(a),N.stop=N,N}function Me(e,t=1/0,s){if(t<=0||!q(e)||e.__v_skip||(s=s||new Map,(s.get(e)||0)>=t))return e;if(s.set(e,t),t--,k(e))Me(e.value,t,s);else if(A(e))for(let n=0;n{Me(n,t,s)});else if(Gn(e)){for(const n in e)Me(e[n],t,s);for(const n of Object.getOwnPropertySymbols(e))Object.prototype.propertyIsEnumerable.call(e,n)&&Me(e[n],t,s)}return e}function It(e,t,s,n){try{return n?e(...n):e()}catch(r){ls(r,t,s)}}function Te(e,t,s,n){if(I(e)){const r=It(e,t,s,n);return r&&Bn(r)&&r.catch(i=>{ls(i,t,s)}),r}if(A(e)){const r=[];for(let i=0;i>>1,r=te[n],i=Ot(r);i=Ot(s)?te.push(e):te.splice(Hi(t),0,e),e.flags|=1,gr()}}function gr(){Jt||(Jt=hr.then(_r))}function $i(e){A(e)?ot.push(...e):Ke&&e.id===-1?Ke.splice(nt+1,0,e):e.flags&1||(ot.push(e),e.flags|=1),gr()}function pn(e,t,s=xe+1){for(;sOt(s)-Ot(n));if(ot.length=0,Ke){Ke.push(...t);return}for(Ke=t,nt=0;nte.id==null?e.flags&2?-1:1/0:e.id;function _r(e){try{for(xe=0;xe{n._d&&Cn(-1);const i=Yt(t);let o;try{o=e(...r)}finally{Yt(i),n._d&&Cn(1)}return o};return n._n=!0,n._c=!0,n._d=!0,n}function Kt(e,t){if(fe===null)return e;const s=as(fe),n=e.dirs||(e.dirs=[]);for(let r=0;r1)return s&&I(t)?t.call(n&&n.proxy):t}}const Ui=Symbol.for("v-scx"),Wi=()=>Wt(Ui);function ys(e,t,s){return yr(e,t,s)}function yr(e,t,s=K){const{immediate:n,deep:r,flush:i,once:o}=s,l=X({},s),f=t&&n||!t&&i!=="post";let h;if(Pt){if(i==="sync"){const T=Wi();h=T.__watcherHandles||(T.__watcherHandles=[])}else if(!f){const T=()=>{};return T.stop=we,T.resume=we,T.pause=we,T}}const a=se;l.call=(T,F,D)=>Te(T,a,F,D);let p=!1;i==="post"?l.scheduler=T=>{le(T,a&&a.suspense)}:i!=="sync"&&(p=!0,l.scheduler=(T,F)=>{F?T():Zs(T)}),l.augmentJob=T=>{t&&(T.flags|=4),p&&(T.flags|=2,a&&(T.id=a.uid,T.i=a))};const S=ji(e,t,l);return Pt&&(h?h.push(S):f&&S()),S}function Bi(e,t,s){const n=this.proxy,r=Y(e)?e.includes(".")?vr(n,e):()=>n[e]:e.bind(n,n);let i;I(t)?i=t:(i=t.handler,s=t);const o=Rt(this),l=yr(r,i.bind(n),s);return o(),l}function vr(e,t){const s=t.split(".");return()=>{let n=e;for(let r=0;re.__isTeleport,Ji=Symbol("_leaveCb");function ks(e,t){e.shapeFlag&6&&e.component?(e.transition=t,ks(e.component.subTree,t)):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Yi(e,t){return I(e)?X({name:e.name},t,{setup:e}):e}function xr(e){e.ids=[e.ids[0]+e.ids[2]+++"-",0,0]}const zt=new WeakMap;function xt(e,t,s,n,r=!1){if(A(e)){e.forEach((F,D)=>xt(F,t&&(A(t)?t[D]:t),s,n,r));return}if(St(n)&&!r){n.shapeFlag&512&&n.type.__asyncResolved&&n.component.subTree.component&&xt(e,t,s,n.component.subTree);return}const i=n.shapeFlag&4?as(n.component):n.el,o=r?null:i,{i:l,r:f}=e,h=t&&t.r,a=l.refs===K?l.refs={}:l.refs,p=l.setupState,S=L(p),T=p===K?Wn:F=>H(S,F);if(h!=null&&h!==f){if(gn(t),Y(h))a[h]=null,T(h)&&(p[h]=null);else if(k(h)){h.value=null;const F=t;F.k&&(a[F.k]=null)}}if(I(f))It(f,l,12,[o,a]);else{const F=Y(f),D=k(f);if(F||D){const z=()=>{if(e.f){const N=F?T(f)?p[f]:a[f]:f.value;if(r)A(N)&&$s(N,i);else if(A(N))N.includes(i)||N.push(i);else if(F)a[f]=[i],T(f)&&(p[f]=a[f]);else{const R=[i];f.value=R,e.k&&(a[e.k]=R)}}else F?(a[f]=o,T(f)&&(p[f]=o)):D&&(f.value=o,e.k&&(a[e.k]=o))};if(o){const N=()=>{z(),zt.delete(e)};N.id=-1,zt.set(e,N),le(N,s)}else gn(e),z()}}}function gn(e){const t=zt.get(e);t&&(t.flags|=8,zt.delete(e))}rs().requestIdleCallback;rs().cancelIdleCallback;const St=e=>!!e.type.__asyncLoader,Sr=e=>e.type.__isKeepAlive;function zi(e,t){wr(e,"a",t)}function Xi(e,t){wr(e,"da",t)}function wr(e,t,s=se){const n=e.__wdc||(e.__wdc=()=>{let r=s;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(cs(t,n,s),s){let r=s.parent;for(;r&&r.parent;)Sr(r.parent.vnode)&&Zi(n,t,s,r),r=r.parent}}function Zi(e,t,s,n){const r=cs(t,e,n,!0);Qs(()=>{$s(n[t],r)},s)}function cs(e,t,s=se,n=!1){if(s){const r=s[e]||(s[e]=[]),i=t.__weh||(t.__weh=(...o)=>{Re();const l=Rt(s),f=Te(t,s,e,o);return l(),Fe(),f});return n?r.unshift(i):r.push(i),i}}const Ne=e=>(t,s=se)=>{(!Pt||e==="sp")&&cs(e,(...n)=>t(...n),s)},ki=Ne("bm"),Cr=Ne("m"),Qi=Ne("bu"),eo=Ne("u"),to=Ne("bum"),Qs=Ne("um"),so=Ne("sp"),no=Ne("rtg"),ro=Ne("rtc");function io(e,t=se){cs("ec",e,t)}const oo=Symbol.for("v-ndc");function lo(e,t,s,n){let r;const i=s,o=A(e);if(o||Y(e)){const l=o&&tt(e);let f=!1,h=!1;l&&(f=!ue(e),h=De(e),e=os(e)),r=new Array(e.length);for(let a=0,p=e.length;at(l,f,void 0,i));else{const l=Object.keys(e);r=new Array(l.length);for(let f=0,h=l.length;fe?Br(e)?as(e):Is(e.parent):null,wt=X(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Is(e.parent),$root:e=>Is(e.root),$host:e=>e.ce,$emit:e=>e.emit,$options:e=>Er(e),$forceUpdate:e=>e.f||(e.f=()=>{Zs(e.update)}),$nextTick:e=>e.n||(e.n=pr.bind(e.proxy)),$watch:e=>Bi.bind(e)}),vs=(e,t)=>e!==K&&!e.__isScriptSetup&&H(e,t),co={get({_:e},t){if(t==="__v_skip")return!0;const{ctx:s,setupState:n,data:r,props:i,accessCache:o,type:l,appContext:f}=e;if(t[0]!=="$"){const S=o[t];if(S!==void 0)switch(S){case 1:return n[t];case 2:return r[t];case 4:return s[t];case 3:return i[t]}else{if(vs(n,t))return o[t]=1,n[t];if(r!==K&&H(r,t))return o[t]=2,r[t];if(H(i,t))return o[t]=3,i[t];if(s!==K&&H(s,t))return o[t]=4,s[t];Rs&&(o[t]=0)}}const h=wt[t];let a,p;if(h)return t==="$attrs"&&Z(e.attrs,"get",""),h(e);if((a=l.__cssModules)&&(a=a[t]))return a;if(s!==K&&H(s,t))return o[t]=4,s[t];if(p=f.config.globalProperties,H(p,t))return p[t]},set({_:e},t,s){const{data:n,setupState:r,ctx:i}=e;return vs(r,t)?(r[t]=s,!0):n!==K&&H(n,t)?(n[t]=s,!0):H(e.props,t)||t[0]==="$"&&t.slice(1)in e?!1:(i[t]=s,!0)},has({_:{data:e,setupState:t,accessCache:s,ctx:n,appContext:r,props:i,type:o}},l){let f;return!!(s[l]||e!==K&&l[0]!=="$"&&H(e,l)||vs(t,l)||H(i,l)||H(n,l)||H(wt,l)||H(r.config.globalProperties,l)||(f=o.__cssModules)&&f[l])},defineProperty(e,t,s){return s.get!=null?e._.accessCache[t]=0:H(s,"value")&&this.set(e,t,s.value,null),Reflect.defineProperty(e,t,s)}};function mn(e){return A(e)?e.reduce((t,s)=>(t[s]=null,t),{}):e}let Rs=!0;function fo(e){const t=Er(e),s=e.proxy,n=e.ctx;Rs=!1,t.beforeCreate&&_n(t.beforeCreate,e,"bc");const{data:r,computed:i,methods:o,watch:l,provide:f,inject:h,created:a,beforeMount:p,mounted:S,beforeUpdate:T,updated:F,activated:D,deactivated:z,beforeDestroy:N,beforeUnmount:R,destroyed:M,unmounted:C,render:J,renderTracked:je,renderTriggered:pe,errorCaptured:Le,serverPrefetch:Ft,expose:Je,inheritAttrs:at,components:Dt,directives:Nt,filters:ds}=t;if(h&&uo(h,n,null),o)for(const G in o){const U=o[G];I(U)&&(n[G]=U.bind(s))}if(r){const G=r.call(s,s);q(G)&&(e.data=Ys(G))}if(Rs=!0,i)for(const G in i){const U=i[G],Ye=I(U)?U.bind(s,s):I(U.get)?U.get.bind(s,s):we,jt=!I(U)&&I(U.set)?U.set.bind(s):we,ze=Xo({get:Ye,set:jt});Object.defineProperty(n,G,{enumerable:!0,configurable:!0,get:()=>ze.value,set:ge=>ze.value=ge})}if(l)for(const G in l)Tr(l[G],n,s,G);if(f){const G=I(f)?f.call(s):f;Reflect.ownKeys(G).forEach(U=>{Ki(U,G[U])})}a&&_n(a,e,"c");function Q(G,U){A(U)?U.forEach(Ye=>G(Ye.bind(s))):U&&G(U.bind(s))}if(Q(ki,p),Q(Cr,S),Q(Qi,T),Q(eo,F),Q(zi,D),Q(Xi,z),Q(io,Le),Q(ro,je),Q(no,pe),Q(to,R),Q(Qs,C),Q(so,Ft),A(Je))if(Je.length){const G=e.exposed||(e.exposed={});Je.forEach(U=>{Object.defineProperty(G,U,{get:()=>s[U],set:Ye=>s[U]=Ye,enumerable:!0})})}else e.exposed||(e.exposed={});J&&e.render===we&&(e.render=J),at!=null&&(e.inheritAttrs=at),Dt&&(e.components=Dt),Nt&&(e.directives=Nt),Ft&&xr(e)}function uo(e,t,s=we){A(e)&&(e=Fs(e));for(const n in e){const r=e[n];let i;q(r)?"default"in r?i=Wt(r.from||n,r.default,!0):i=Wt(r.from||n):i=Wt(r),k(i)?Object.defineProperty(t,n,{enumerable:!0,configurable:!0,get:()=>i.value,set:o=>i.value=o}):t[n]=i}}function _n(e,t,s){Te(A(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,s)}function Tr(e,t,s,n){let r=n.includes(".")?vr(s,n):()=>s[n];if(Y(e)){const i=t[e];I(i)&&ys(r,i)}else if(I(e))ys(r,e.bind(s));else if(q(e))if(A(e))e.forEach(i=>Tr(i,t,s,n));else{const i=I(e.handler)?e.handler.bind(s):t[e.handler];I(i)&&ys(r,i,e)}}function Er(e){const t=e.type,{mixins:s,extends:n}=t,{mixins:r,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let f;return l?f=l:!r.length&&!s&&!n?f=t:(f={},r.length&&r.forEach(h=>Xt(f,h,o,!0)),Xt(f,t,o)),q(t)&&i.set(t,f),f}function Xt(e,t,s,n=!1){const{mixins:r,extends:i}=t;i&&Xt(e,i,s,!0),r&&r.forEach(o=>Xt(e,o,s,!0));for(const o in t)if(!(n&&o==="expose")){const l=ao[o]||s&&s[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const ao={data:bn,props:yn,emits:yn,methods:_t,computed:_t,beforeCreate:ee,created:ee,beforeMount:ee,mounted:ee,beforeUpdate:ee,updated:ee,beforeDestroy:ee,beforeUnmount:ee,destroyed:ee,unmounted:ee,activated:ee,deactivated:ee,errorCaptured:ee,serverPrefetch:ee,components:_t,directives:_t,watch:po,provide:bn,inject:ho};function bn(e,t){return t?e?function(){return X(I(e)?e.call(this,this):e,I(t)?t.call(this,this):t)}:t:e}function ho(e,t){return _t(Fs(e),Fs(t))}function Fs(e){if(A(e)){const t={};for(let s=0;st==="modelValue"||t==="model-value"?e.modelModifiers:e[`${t}Modifiers`]||e[`${Be(t)}Modifiers`]||e[`${Ge(t)}Modifiers`];function bo(e,t,...s){if(e.isUnmounted)return;const n=e.vnode.props||K;let r=s;const i=t.startsWith("update:"),o=i&&_o(n,t.slice(7));o&&(o.trim&&(r=s.map(a=>Y(a)?a.trim():a)),o.number&&(r=s.map(ns)));let l,f=n[l=ps(t)]||n[l=ps(Be(t))];!f&&i&&(f=n[l=ps(Ge(t))]),f&&Te(f,e,6,r);const h=n[l+"Once"];if(h){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,Te(h,e,6,r)}}const yo=new WeakMap;function Ar(e,t,s=!1){const n=s?yo:t.emitsCache,r=n.get(e);if(r!==void 0)return r;const i=e.emits;let o={},l=!1;if(!I(e)){const f=h=>{const a=Ar(h,t,!0);a&&(l=!0,X(o,a))};!s&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}return!i&&!l?(q(e)&&n.set(e,null),null):(A(i)?i.forEach(f=>o[f]=null):X(o,i),q(e)&&n.set(e,o),o)}function fs(e,t){return!e||!es(t)?!1:(t=t.slice(2).replace(/Once$/,""),H(e,t[0].toLowerCase()+t.slice(1))||H(e,Ge(t))||H(e,t))}function vn(e){const{type:t,vnode:s,proxy:n,withProxy:r,propsOptions:[i],slots:o,attrs:l,emit:f,render:h,renderCache:a,props:p,data:S,setupState:T,ctx:F,inheritAttrs:D}=e,z=Yt(e);let N,R;try{if(s.shapeFlag&4){const C=r||n,J=C;N=Se(h.call(J,C,a,p,T,S,F)),R=l}else{const C=t;N=Se(C.length>1?C(p,{attrs:l,slots:o,emit:f}):C(p,null)),R=t.props?l:vo(l)}}catch(C){Ct.length=0,ls(C,e,1),N=Ie(qe)}let M=N;if(R&&D!==!1){const C=Object.keys(R),{shapeFlag:J}=M;C.length&&J&7&&(i&&C.some(Hs)&&(R=xo(R,i)),M=ut(M,R,!1,!0))}return s.dirs&&(M=ut(M,null,!1,!0),M.dirs=M.dirs?M.dirs.concat(s.dirs):s.dirs),s.transition&&ks(M,s.transition),N=M,Yt(z),N}const vo=e=>{let t;for(const s in e)(s==="class"||s==="style"||es(s))&&((t||(t={}))[s]=e[s]);return t},xo=(e,t)=>{const s={};for(const n in e)(!Hs(n)||!(n.slice(9)in t))&&(s[n]=e[n]);return s};function So(e,t,s){const{props:n,children:r,component:i}=e,{props:o,children:l,patchFlag:f}=t,h=i.emitsOptions;if(t.dirs||t.transition)return!0;if(s&&f>=0){if(f&1024)return!0;if(f&16)return n?xn(n,o,h):!!o;if(f&8){const a=t.dynamicProps;for(let p=0;pObject.create(Pr),Ir=e=>Object.getPrototypeOf(e)===Pr;function Co(e,t,s,n=!1){const r={},i=Mr();e.propsDefaults=Object.create(null),Rr(e,t,r,i);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);s?e.props=n?r:Oi(r):e.type.props?e.props=r:e.props=i,e.attrs=i}function To(e,t,s,n){const{props:r,attrs:i,vnode:{patchFlag:o}}=e,l=L(r),[f]=e.propsOptions;let h=!1;if((n||o>0)&&!(o&16)){if(o&8){const a=e.vnode.dynamicProps;for(let p=0;p{f=!0;const[S,T]=Fr(p,t,!0);X(o,S),T&&l.push(...T)};!s&&t.mixins.length&&t.mixins.forEach(a),e.extends&&a(e.extends),e.mixins&&e.mixins.forEach(a)}if(!i&&!f)return q(e)&&n.set(e,rt),rt;if(A(i))for(let a=0;ae==="_"||e==="_ctx"||e==="$stable",tn=e=>A(e)?e.map(Se):[Se(e)],Oo=(e,t,s)=>{if(t._n)return t;const n=Vi((...r)=>tn(t(...r)),s);return n._c=!1,n},Dr=(e,t,s)=>{const n=e._ctx;for(const r in e){if(en(r))continue;const i=e[r];if(I(i))t[r]=Oo(r,i,n);else if(i!=null){const o=tn(i);t[r]=()=>o}}},Nr=(e,t)=>{const s=tn(t);e.slots.default=()=>s},jr=(e,t,s)=>{for(const n in t)(s||!en(n))&&(e[n]=t[n])},Ao=(e,t,s)=>{const n=e.slots=Mr();if(e.vnode.shapeFlag&32){const r=t._;r?(jr(n,t,s),s&&Yn(n,"_",r,!0)):Dr(t,n)}else t&&Nr(e,t)},Po=(e,t,s)=>{const{vnode:n,slots:r}=e;let i=!0,o=K;if(n.shapeFlag&32){const l=t._;l?s&&l===1?i=!1:jr(r,t,s):(i=!t.$stable,Dr(t,r)),o=t}else t&&(Nr(e,t),o={default:1});if(i)for(const l in r)!en(l)&&o[l]==null&&delete r[l]},le=Do;function Mo(e){return Io(e)}function Io(e,t){const s=rs();s.__VUE__=!0;const{insert:n,remove:r,patchProp:i,createElement:o,createText:l,createComment:f,setText:h,setElementText:a,parentNode:p,nextSibling:S,setScopeId:T=we,insertStaticContent:F}=e,D=(c,u,d,b=null,g=null,m=null,x=void 0,v=null,y=!!u.dynamicChildren)=>{if(c===u)return;c&&!mt(c,u)&&(b=Lt(c),ge(c,g,m,!0),c=null),u.patchFlag===-2&&(y=!1,u.dynamicChildren=null);const{type:_,ref:O,shapeFlag:w}=u;switch(_){case us:z(c,u,d,b);break;case qe:N(c,u,d,b);break;case Ss:c==null&&R(u,d,b,x);break;case ae:Dt(c,u,d,b,g,m,x,v,y);break;default:w&1?J(c,u,d,b,g,m,x,v,y):w&6?Nt(c,u,d,b,g,m,x,v,y):(w&64||w&128)&&_.process(c,u,d,b,g,m,x,v,y,ht)}O!=null&&g?xt(O,c&&c.ref,m,u||c,!u):O==null&&c&&c.ref!=null&&xt(c.ref,null,m,c,!0)},z=(c,u,d,b)=>{if(c==null)n(u.el=l(u.children),d,b);else{const g=u.el=c.el;u.children!==c.children&&h(g,u.children)}},N=(c,u,d,b)=>{c==null?n(u.el=f(u.children||""),d,b):u.el=c.el},R=(c,u,d,b)=>{[c.el,c.anchor]=F(c.children,u,d,b,c.el,c.anchor)},M=({el:c,anchor:u},d,b)=>{let g;for(;c&&c!==u;)g=S(c),n(c,d,b),c=g;n(u,d,b)},C=({el:c,anchor:u})=>{let d;for(;c&&c!==u;)d=S(c),r(c),c=d;r(u)},J=(c,u,d,b,g,m,x,v,y)=>{if(u.type==="svg"?x="svg":u.type==="math"&&(x="mathml"),c==null)je(u,d,b,g,m,x,v,y);else{const _=c.el&&c.el._isVueCE?c.el:null;try{_&&_._beginPatch(),Ft(c,u,g,m,x,v,y)}finally{_&&_._endPatch()}}},je=(c,u,d,b,g,m,x,v)=>{let y,_;const{props:O,shapeFlag:w,transition:E,dirs:P}=c;if(y=c.el=o(c.type,m,O&&O.is,O),w&8?a(y,c.children):w&16&&Le(c.children,y,null,b,g,xs(c,m),x,v),P&&Xe(c,null,b,"created"),pe(y,c,c.scopeId,x,b),O){for(const W in O)W!=="value"&&!bt(W)&&i(y,W,null,O[W],m,b);"value"in O&&i(y,"value",null,O.value,m),(_=O.onVnodeBeforeMount)&&ve(_,b,c)}P&&Xe(c,null,b,"beforeMount");const j=Ro(g,E);j&&E.beforeEnter(y),n(y,u,d),((_=O&&O.onVnodeMounted)||j||P)&&le(()=>{_&&ve(_,b,c),j&&E.enter(y),P&&Xe(c,null,b,"mounted")},g)},pe=(c,u,d,b,g)=>{if(d&&T(c,d),b)for(let m=0;m{for(let _=y;_{const v=u.el=c.el;let{patchFlag:y,dynamicChildren:_,dirs:O}=u;y|=c.patchFlag&16;const w=c.props||K,E=u.props||K;let P;if(d&&Ze(d,!1),(P=E.onVnodeBeforeUpdate)&&ve(P,d,u,c),O&&Xe(u,c,d,"beforeUpdate"),d&&Ze(d,!0),(w.innerHTML&&E.innerHTML==null||w.textContent&&E.textContent==null)&&a(v,""),_?Je(c.dynamicChildren,_,v,d,b,xs(u,g),m):x||U(c,u,v,null,d,b,xs(u,g),m,!1),y>0){if(y&16)at(v,w,E,d,g);else if(y&2&&w.class!==E.class&&i(v,"class",null,E.class,g),y&4&&i(v,"style",w.style,E.style,g),y&8){const j=u.dynamicProps;for(let W=0;W{P&&ve(P,d,u,c),O&&Xe(u,c,d,"updated")},b)},Je=(c,u,d,b,g,m,x)=>{for(let v=0;v{if(u!==d){if(u!==K)for(const m in u)!bt(m)&&!(m in d)&&i(c,m,u[m],null,g,b);for(const m in d){if(bt(m))continue;const x=d[m],v=u[m];x!==v&&m!=="value"&&i(c,m,v,x,g,b)}"value"in d&&i(c,"value",u.value,d.value,g)}},Dt=(c,u,d,b,g,m,x,v,y)=>{const _=u.el=c?c.el:l(""),O=u.anchor=c?c.anchor:l("");let{patchFlag:w,dynamicChildren:E,slotScopeIds:P}=u;P&&(v=v?v.concat(P):P),c==null?(n(_,d,b),n(O,d,b),Le(u.children||[],d,O,g,m,x,v,y)):w>0&&w&64&&E&&c.dynamicChildren&&c.dynamicChildren.length===E.length?(Je(c.dynamicChildren,E,d,g,m,x,v),(u.key!=null||g&&u===g.subTree)&&Lr(c,u,!0)):U(c,u,d,O,g,m,x,v,y)},Nt=(c,u,d,b,g,m,x,v,y)=>{u.slotScopeIds=v,c==null?u.shapeFlag&512?g.ctx.activate(u,d,b,x,y):ds(u,d,b,g,m,x,y):nn(c,u,y)},ds=(c,u,d,b,g,m,x)=>{const v=c.component=Wo(c,b,g);if(Sr(c)&&(v.ctx.renderer=ht),qo(v,!1,x),v.asyncDep){if(g&&g.registerDep(v,Q,x),!c.el){const y=v.subTree=Ie(qe);N(null,y,u,d),c.placeholder=y.el}}else Q(v,c,u,d,g,m,x)},nn=(c,u,d)=>{const b=u.component=c.component;if(So(c,u,d))if(b.asyncDep&&!b.asyncResolved){G(b,u,d);return}else b.next=u,b.update();else u.el=c.el,b.vnode=u},Q=(c,u,d,b,g,m,x)=>{const v=()=>{if(c.isMounted){let{next:w,bu:E,u:P,parent:j,vnode:W}=c;{const _e=Hr(c);if(_e){w&&(w.el=W.el,G(c,w,x)),_e.asyncDep.then(()=>{c.isUnmounted||v()});return}}let $=w,ne;Ze(c,!1),w?(w.el=W.el,G(c,w,x)):w=W,E&&Ut(E),(ne=w.props&&w.props.onVnodeBeforeUpdate)&&ve(ne,j,w,W),Ze(c,!0);const re=vn(c),me=c.subTree;c.subTree=re,D(me,re,p(me.el),Lt(me),c,g,m),w.el=re.el,$===null&&wo(c,re.el),P&&le(P,g),(ne=w.props&&w.props.onVnodeUpdated)&&le(()=>ve(ne,j,w,W),g)}else{let w;const{el:E,props:P}=u,{bm:j,m:W,parent:$,root:ne,type:re}=c,me=St(u);Ze(c,!1),j&&Ut(j),!me&&(w=P&&P.onVnodeBeforeMount)&&ve(w,$,u),Ze(c,!0);{ne.ce&&ne.ce._def.shadowRoot!==!1&&ne.ce._injectChildStyle(re);const _e=c.subTree=vn(c);D(null,_e,d,b,c,g,m),u.el=_e.el}if(W&&le(W,g),!me&&(w=P&&P.onVnodeMounted)){const _e=u;le(()=>ve(w,$,_e),g)}(u.shapeFlag&256||$&&St($.vnode)&&$.vnode.shapeFlag&256)&&c.a&&le(c.a,g),c.isMounted=!0,u=d=b=null}};c.scope.on();const y=c.effect=new kn(v);c.scope.off();const _=c.update=y.run.bind(y),O=c.job=y.runIfDirty.bind(y);O.i=c,O.id=c.uid,y.scheduler=()=>Zs(O),Ze(c,!0),_()},G=(c,u,d)=>{u.component=c;const b=c.vnode.props;c.vnode=u,c.next=null,To(c,u.props,b,d),Po(c,u.children,d),Re(),pn(c),Fe()},U=(c,u,d,b,g,m,x,v,y=!1)=>{const _=c&&c.children,O=c?c.shapeFlag:0,w=u.children,{patchFlag:E,shapeFlag:P}=u;if(E>0){if(E&128){jt(_,w,d,b,g,m,x,v,y);return}else if(E&256){Ye(_,w,d,b,g,m,x,v,y);return}}P&8?(O&16&&dt(_,g,m),w!==_&&a(d,w)):O&16?P&16?jt(_,w,d,b,g,m,x,v,y):dt(_,g,m,!0):(O&8&&a(d,""),P&16&&Le(w,d,b,g,m,x,v,y))},Ye=(c,u,d,b,g,m,x,v,y)=>{c=c||rt,u=u||rt;const _=c.length,O=u.length,w=Math.min(_,O);let E;for(E=0;EO?dt(c,g,m,!0,!1,w):Le(u,d,b,g,m,x,v,y,w)},jt=(c,u,d,b,g,m,x,v,y)=>{let _=0;const O=u.length;let w=c.length-1,E=O-1;for(;_<=w&&_<=E;){const P=c[_],j=u[_]=y?Ue(u[_]):Se(u[_]);if(mt(P,j))D(P,j,d,null,g,m,x,v,y);else break;_++}for(;_<=w&&_<=E;){const P=c[w],j=u[E]=y?Ue(u[E]):Se(u[E]);if(mt(P,j))D(P,j,d,null,g,m,x,v,y);else break;w--,E--}if(_>w){if(_<=E){const P=E+1,j=PE)for(;_<=w;)ge(c[_],g,m,!0),_++;else{const P=_,j=_,W=new Map;for(_=j;_<=E;_++){const oe=u[_]=y?Ue(u[_]):Se(u[_]);oe.key!=null&&W.set(oe.key,_)}let $,ne=0;const re=E-j+1;let me=!1,_e=0;const pt=new Array(re);for(_=0;_=re){ge(oe,g,m,!0);continue}let be;if(oe.key!=null)be=W.get(oe.key);else for($=j;$<=E;$++)if(pt[$-j]===0&&mt(oe,u[$])){be=$;break}be===void 0?ge(oe,g,m,!0):(pt[be-j]=_+1,be>=_e?_e=be:me=!0,D(oe,u[be],d,null,g,m,x,v,y),ne++)}const ln=me?Fo(pt):rt;for($=ln.length-1,_=re-1;_>=0;_--){const oe=j+_,be=u[oe],cn=u[oe+1],fn=oe+1{const{el:m,type:x,transition:v,children:y,shapeFlag:_}=c;if(_&6){ze(c.component.subTree,u,d,b);return}if(_&128){c.suspense.move(u,d,b);return}if(_&64){x.move(c,u,d,ht);return}if(x===ae){n(m,u,d);for(let w=0;wv.enter(m),g);else{const{leave:w,delayLeave:E,afterLeave:P}=v,j=()=>{c.ctx.isUnmounted?r(m):n(m,u,d)},W=()=>{m._isLeaving&&m[Ji](!0),w(m,()=>{j(),P&&P()})};E?E(m,j,W):W()}else n(m,u,d)},ge=(c,u,d,b=!1,g=!1)=>{const{type:m,props:x,ref:v,children:y,dynamicChildren:_,shapeFlag:O,patchFlag:w,dirs:E,cacheIndex:P}=c;if(w===-2&&(g=!1),v!=null&&(Re(),xt(v,null,d,c,!0),Fe()),P!=null&&(u.renderCache[P]=void 0),O&256){u.ctx.deactivate(c);return}const j=O&1&&E,W=!St(c);let $;if(W&&($=x&&x.onVnodeBeforeUnmount)&&ve($,u,c),O&6)Yr(c.component,d,b);else{if(O&128){c.suspense.unmount(d,b);return}j&&Xe(c,null,u,"beforeUnmount"),O&64?c.type.remove(c,u,d,ht,b):_&&!_.hasOnce&&(m!==ae||w>0&&w&64)?dt(_,u,d,!1,!0):(m===ae&&w&384||!g&&O&16)&&dt(y,u,d),b&&rn(c)}(W&&($=x&&x.onVnodeUnmounted)||j)&&le(()=>{$&&ve($,u,c),j&&Xe(c,null,u,"unmounted")},d)},rn=c=>{const{type:u,el:d,anchor:b,transition:g}=c;if(u===ae){Jr(d,b);return}if(u===Ss){C(c);return}const m=()=>{r(d),g&&!g.persisted&&g.afterLeave&&g.afterLeave()};if(c.shapeFlag&1&&g&&!g.persisted){const{leave:x,delayLeave:v}=g,y=()=>x(d,m);v?v(c.el,m,y):y()}else m()},Jr=(c,u)=>{let d;for(;c!==u;)d=S(c),r(c),c=d;r(u)},Yr=(c,u,d)=>{const{bum:b,scope:g,job:m,subTree:x,um:v,m:y,a:_}=c;wn(y),wn(_),b&&Ut(b),g.stop(),m&&(m.flags|=8,ge(x,c,u,d)),v&&le(v,u),le(()=>{c.isUnmounted=!0},u)},dt=(c,u,d,b=!1,g=!1,m=0)=>{for(let x=m;x{if(c.shapeFlag&6)return Lt(c.component.subTree);if(c.shapeFlag&128)return c.suspense.next();const u=S(c.anchor||c.el),d=u&&u[qi];return d?S(d):u};let hs=!1;const on=(c,u,d)=>{let b;c==null?u._vnode&&(ge(u._vnode,null,null,!0),b=u._vnode.component):D(u._vnode||null,c,u,null,null,null,d),u._vnode=c,hs||(hs=!0,pn(b),mr(),hs=!1)},ht={p:D,um:ge,m:ze,r:rn,mt:ds,mc:Le,pc:U,pbc:Je,n:Lt,o:e};return{render:on,hydrate:void 0,createApp:mo(on)}}function xs({type:e,props:t},s){return s==="svg"&&e==="foreignObject"||s==="mathml"&&e==="annotation-xml"&&t&&t.encoding&&t.encoding.includes("html")?void 0:s}function Ze({effect:e,job:t},s){s?(e.flags|=32,t.flags|=4):(e.flags&=-33,t.flags&=-5)}function Ro(e,t){return(!e||e&&!e.pendingBranch)&&t&&!t.persisted}function Lr(e,t,s=!1){const n=e.children,r=t.children;if(A(n)&&A(r))for(let i=0;i>1,e[s[l]]0&&(t[n]=s[i-1]),s[i]=n)}}for(i=s.length,o=s[i-1];i-- >0;)s[i]=o,o=t[o];return s}function Hr(e){const t=e.subTree.component;if(t)return t.asyncDep&&!t.asyncResolved?t:Hr(t)}function wn(e){if(e)for(let t=0;te.__isSuspense;function Do(e,t){t&&t.pendingBranch?A(e)?t.effects.push(...e):t.effects.push(e):$i(e)}const ae=Symbol.for("v-fgt"),us=Symbol.for("v-txt"),qe=Symbol.for("v-cmt"),Ss=Symbol.for("v-stc"),Ct=[];let ce=null;function Oe(e=!1){Ct.push(ce=e?null:[])}function No(){Ct.pop(),ce=Ct[Ct.length-1]||null}let At=1;function Cn(e,t=!1){At+=e,e<0&&ce&&t&&(ce.hasOnce=!0)}function Kr(e){return e.dynamicChildren=At>0?ce||rt:null,No(),At>0&&ce&&ce.push(e),e}function He(e,t,s,n,r,i){return Kr(V(e,t,s,n,r,i,!0))}function jo(e,t,s,n,r){return Kr(Ie(e,t,s,n,r,!0))}function Ur(e){return e?e.__v_isVNode===!0:!1}function mt(e,t){return e.type===t.type&&e.key===t.key}const Wr=({key:e})=>e??null,Bt=({ref:e,ref_key:t,ref_for:s})=>(typeof e=="number"&&(e=""+e),e!=null?Y(e)||k(e)||I(e)?{i:fe,r:e,k:t,f:!!s}:e:null);function V(e,t=null,s=null,n=0,r=null,i=e===ae?0:1,o=!1,l=!1){const f={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Wr(t),ref:t&&Bt(t),scopeId:br,slotScopeIds:null,children:s,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetStart:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:n,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:fe};return l?(sn(f,s),i&128&&e.normalize(f)):s&&(f.shapeFlag|=Y(s)?8:16),At>0&&!o&&ce&&(f.patchFlag>0||i&6)&&f.patchFlag!==32&&ce.push(f),f}const Ie=Lo;function Lo(e,t=null,s=null,n=0,r=null,i=!1){if((!e||e===oo)&&(e=qe),Ur(e)){const l=ut(e,t,!0);return s&&sn(l,s),At>0&&!i&&ce&&(l.shapeFlag&6?ce[ce.indexOf(e)]=l:ce.push(l)),l.patchFlag=-2,l}if(zo(e)&&(e=e.__vccOpts),t){t=Ho(t);let{class:l,style:f}=t;l&&!Y(l)&&(t.class=Us(l)),q(f)&&(Xs(f)&&!A(f)&&(f=X({},f)),t.style=Ks(f))}const o=Y(e)?1:Vr(e)?128:Gi(e)?64:q(e)?4:I(e)?2:0;return V(e,t,s,n,r,o,i,!0)}function Ho(e){return e?Xs(e)||Ir(e)?X({},e):e:null}function ut(e,t,s=!1,n=!1){const{props:r,ref:i,patchFlag:o,children:l,transition:f}=e,h=t?Vo(r||{},t):r,a={__v_isVNode:!0,__v_skip:!0,type:e.type,props:h,key:h&&Wr(h),ref:t&&t.ref?s&&i?A(i)?i.concat(Bt(t)):[i,Bt(t)]:Bt(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:l,target:e.target,targetStart:e.targetStart,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==ae?o===-1?16:o|16:o,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:f,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ut(e.ssContent),ssFallback:e.ssFallback&&ut(e.ssFallback),placeholder:e.placeholder,el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce};return f&&n&&ks(a,f.clone(a)),a}function $o(e=" ",t=0){return Ie(us,null,e,t)}function Tn(e="",t=!1){return t?(Oe(),jo(qe,null,e)):Ie(qe,null,e)}function Se(e){return e==null||typeof e=="boolean"?Ie(qe):A(e)?Ie(ae,null,e.slice()):Ur(e)?Ue(e):Ie(us,null,String(e))}function Ue(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ut(e)}function sn(e,t){let s=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(A(t))s=16;else if(typeof t=="object")if(n&65){const r=t.default;r&&(r._c&&(r._d=!1),sn(e,r()),r._c&&(r._d=!0));return}else{s=32;const r=t._;!r&&!Ir(t)?t._ctx=fe:r===3&&fe&&(fe.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else I(t)?(t={default:t,_ctx:fe},s=32):(t=String(t),n&64?(s=16,t=[$o(t)]):s=8);e.children=t,e.shapeFlag|=s}function Vo(...e){const t={};for(let s=0;sse||fe;let Zt,Ns;{const e=rs(),t=(s,n)=>{let r;return(r=e[s])||(r=e[s]=[]),r.push(n),i=>{r.length>1?r.forEach(o=>o(i)):r[0](i)}};Zt=t("__VUE_INSTANCE_SETTERS__",s=>se=s),Ns=t("__VUE_SSR_SETTERS__",s=>Pt=s)}const Rt=e=>{const t=se;return Zt(e),e.scope.on(),()=>{e.scope.off(),Zt(t)}},En=()=>{se&&se.scope.off(),Zt(null)};function Br(e){return e.vnode.shapeFlag&4}let Pt=!1;function qo(e,t=!1,s=!1){t&&Ns(t);const{props:n,children:r}=e.vnode,i=Br(e);Co(e,n,i,t),Ao(e,r,s||t);const o=i?Go(e,t):void 0;return t&&Ns(!1),o}function Go(e,t){const s=e.type;e.accessCache=Object.create(null),e.proxy=new Proxy(e.ctx,co);const{setup:n}=s;if(n){Re();const r=e.setupContext=n.length>1?Yo(e):null,i=Rt(e),o=It(n,e,0,[e.props,r]),l=Bn(o);if(Fe(),i(),(l||e.sp)&&!St(e)&&xr(e),l){if(o.then(En,En),t)return o.then(f=>{On(e,f)}).catch(f=>{ls(f,e,0)});e.asyncDep=o}else On(e,o)}else qr(e)}function On(e,t,s){I(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:q(t)&&(e.setupState=dr(t)),qr(e)}function qr(e,t,s){const n=e.type;e.render||(e.render=n.render||we);{const r=Rt(e);Re();try{fo(e)}finally{Fe(),r()}}}const Jo={get(e,t){return Z(e,"get",""),e[t]}};function Yo(e){const t=s=>{e.exposed=s||{}};return{attrs:new Proxy(e.attrs,Jo),slots:e.slots,emit:e.emit,expose:t}}function as(e){return e.exposed?e.exposeProxy||(e.exposeProxy=new Proxy(dr(Ai(e.exposed)),{get(t,s){if(s in t)return t[s];if(s in wt)return wt[s](e)},has(t,s){return s in t||s in wt}})):e.proxy}function zo(e){return I(e)&&"__vccOpts"in e}const Xo=(e,t)=>Di(e,t,Pt),Zo="3.5.27";let js;const An=typeof window<"u"&&window.trustedTypes;if(An)try{js=An.createPolicy("vue",{createHTML:e=>e})}catch{}const Gr=js?e=>js.createHTML(e):e=>e,ko="http://www.w3.org/2000/svg",Qo="http://www.w3.org/1998/Math/MathML",Ae=typeof document<"u"?document:null,Pn=Ae&&Ae.createElement("template"),el={insert:(e,t,s)=>{t.insertBefore(e,s||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,s,n)=>{const r=t==="svg"?Ae.createElementNS(ko,e):t==="mathml"?Ae.createElementNS(Qo,e):s?Ae.createElement(e,{is:s}):Ae.createElement(e);return e==="select"&&n&&n.multiple!=null&&r.setAttribute("multiple",n.multiple),r},createText:e=>Ae.createTextNode(e),createComment:e=>Ae.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ae.querySelector(e),setScopeId(e,t){e.setAttribute(t,"")},insertStaticContent(e,t,s,n,r,i){const o=s?s.previousSibling:t.lastChild;if(r&&(r===i||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),s),!(r===i||!(r=r.nextSibling)););else{Pn.innerHTML=Gr(n==="svg"?`${e}`:n==="mathml"?`${e}`:e);const l=Pn.content;if(n==="svg"||n==="mathml"){const f=l.firstChild;for(;f.firstChild;)l.appendChild(f.firstChild);l.removeChild(f)}t.insertBefore(l,s)}return[o?o.nextSibling:t.firstChild,s?s.previousSibling:t.lastChild]}},tl=Symbol("_vtc");function sl(e,t,s){const n=e[tl];n&&(t=(t?[t,...n]:[...n]).join(" ")),t==null?e.removeAttribute("class"):s?e.setAttribute("class",t):e.className=t}const Mn=Symbol("_vod"),nl=Symbol("_vsh"),rl=Symbol(""),il=/(?:^|;)\s*display\s*:/;function ol(e,t,s){const n=e.style,r=Y(s);let i=!1;if(s&&!r){if(t)if(Y(t))for(const o of t.split(";")){const l=o.slice(0,o.indexOf(":")).trim();s[l]==null&&qt(n,l,"")}else for(const o in t)s[o]==null&&qt(n,o,"");for(const o in s)o==="display"&&(i=!0),qt(n,o,s[o])}else if(r){if(t!==s){const o=n[rl];o&&(s+=";"+o),n.cssText=s,i=il.test(s)}}else t&&e.removeAttribute("style");Mn in e&&(e[Mn]=i?n.display:"",e[nl]&&(n.display="none"))}const In=/\s*!important$/;function qt(e,t,s){if(A(s))s.forEach(n=>qt(e,t,n));else if(s==null&&(s=""),t.startsWith("--"))e.setProperty(t,s);else{const n=ll(e,t);In.test(s)?e.setProperty(Ge(n),s.replace(In,""),"important"):e[n]=s}}const Rn=["Webkit","Moz","ms"],ws={};function ll(e,t){const s=ws[t];if(s)return s;let n=Be(t);if(n!=="filter"&&n in e)return ws[t]=n;n=Jn(n);for(let r=0;rCs||(al.then(()=>Cs=0),Cs=Date.now());function hl(e,t){const s=n=>{if(!n._vts)n._vts=Date.now();else if(n._vts<=s.attached)return;Te(pl(n,s.value),t,5,[n])};return s.value=e,s.attached=dl(),s}function pl(e,t){if(A(t)){const s=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{s.call(e),e._stopped=!0},t.map(n=>r=>!r._stopped&&n&&n(r))}else return t}const Hn=e=>e.charCodeAt(0)===111&&e.charCodeAt(1)===110&&e.charCodeAt(2)>96&&e.charCodeAt(2)<123,gl=(e,t,s,n,r,i)=>{const o=r==="svg";t==="class"?sl(e,n,o):t==="style"?ol(e,s,n):es(t)?Hs(t)||fl(e,t,s,n,i):(t[0]==="."?(t=t.slice(1),!0):t[0]==="^"?(t=t.slice(1),!1):ml(e,t,n,o))?(Nn(e,t,n),!e.tagName.includes("-")&&(t==="value"||t==="checked"||t==="selected")&&Dn(e,t,n,o,i,t!=="value")):e._isVueCE&&(/[A-Z]/.test(t)||!Y(n))?Nn(e,Be(t),n,i,t):(t==="true-value"?e._trueValue=n:t==="false-value"&&(e._falseValue=n),Dn(e,t,n,o))};function ml(e,t,s,n){if(n)return!!(t==="innerHTML"||t==="textContent"||t in e&&Hn(t)&&I(s));if(t==="spellcheck"||t==="draggable"||t==="translate"||t==="autocorrect"||t==="sandbox"&&e.tagName==="IFRAME"||t==="form"||t==="list"&&e.tagName==="INPUT"||t==="type"&&e.tagName==="TEXTAREA")return!1;if(t==="width"||t==="height"){const r=e.tagName;if(r==="IMG"||r==="VIDEO"||r==="CANVAS"||r==="SOURCE")return!1}return Hn(t)&&Y(s)?!1:t in e}const kt=e=>{const t=e.props["onUpdate:modelValue"]||!1;return A(t)?s=>Ut(t,s):t};function _l(e){e.target.composing=!0}function $n(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event("input")))}const ct=Symbol("_assign");function Vn(e,t,s){return t&&(e=e.trim()),s&&(e=ns(e)),e}const Ts={created(e,{modifiers:{lazy:t,trim:s,number:n}},r){e[ct]=kt(r);const i=n||r.props&&r.props.type==="number";Qe(e,t?"change":"input",o=>{o.target.composing||e[ct](Vn(e.value,s,i))}),(s||i)&&Qe(e,"change",()=>{e.value=Vn(e.value,s,i)}),t||(Qe(e,"compositionstart",_l),Qe(e,"compositionend",$n),Qe(e,"change",$n))},mounted(e,{value:t}){e.value=t??""},beforeUpdate(e,{value:t,oldValue:s,modifiers:{lazy:n,trim:r,number:i}},o){if(e[ct]=kt(o),e.composing)return;const l=(i||e.type==="number")&&!/^0\d/.test(e.value)?ns(e.value):e.value,f=t??"";l!==f&&(document.activeElement===e&&e.type!=="range"&&(n&&t===s||r&&e.value.trim()===f)||(e.value=f))}},bl={deep:!0,created(e,{value:t,modifiers:{number:s}},n){const r=ts(t);Qe(e,"change",()=>{const i=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>s?ns(Qt(o)):Qt(o));e[ct](e.multiple?r?new Set(i):i:i[0]),e._assigning=!0,pr(()=>{e._assigning=!1})}),e[ct]=kt(n)},mounted(e,{value:t}){Kn(e,t)},beforeUpdate(e,t,s){e[ct]=kt(s)},updated(e,{value:t}){e._assigning||Kn(e,t)}};function Kn(e,t){const s=e.multiple,n=A(t);if(!(s&&!n&&!ts(t))){for(let r=0,i=e.options.length;rString(h)===String(l)):o.selected=oi(t,l)>-1}else o.selected=t.has(l);else if(is(Qt(o),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!s&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Qt(e){return"_value"in e?e._value:e.value}const yl={esc:"escape",space:" ",up:"arrow-up",left:"arrow-left",right:"arrow-right",down:"arrow-down",delete:"backspace"},vl=(e,t)=>{const s=e._withKeys||(e._withKeys={}),n=t.join(".");return s[n]||(s[n]=(r=>{if(!("key"in r))return;const i=Ge(r.key);if(t.some(o=>o===i||yl[o]===i))return e(r)}))},xl=X({patchProp:gl},el);let Un;function Sl(){return Un||(Un=Mo(xl))}const wl=((...e)=>{const t=Sl().createApp(...e),{mount:s}=t;return t.mount=n=>{const r=Tl(n);if(!r)return;const i=t._component;!I(i)&&!i.render&&!i.template&&(i.template=r.innerHTML),r.nodeType===1&&(r.textContent="");const o=s(r,!1,Cl(r));return r instanceof Element&&(r.removeAttribute("v-cloak"),r.setAttribute("data-v-app","")),o},t});function Cl(e){if(e instanceof SVGElement)return"svg";if(typeof MathMLElement=="function"&&e instanceof MathMLElement)return"mathml"}function Tl(e){return Y(e)?document.querySelector(e):e}const El={class:"app"},Ol={key:0,class:"status"},Al={class:"filters"},Pl={class:"filter-row"},Ml={class:"logs-container"},Il={key:0,class:"loading"},Rl={key:1,class:"no-logs"},Fl={key:2,class:"logs-table"},Dl={class:"timestamp"},Nl={class:"message"},jl={key:0,class:"pagination"},Ll=["disabled"],Hl={class:"page-info"},$l=["disabled"],Vl=Yi({__name:"App",setup(e){const t=ye([]),s=ye(0),n=ye(1),r=ye(50),i=ye(""),o=ye(""),l=ye(""),f=ye("desc"),h=ye(null),a=ye(!1);let p=null;const S=async()=>{a.value=!0;try{const R=new URLSearchParams({page:n.value.toString(),pageSize:r.value.toString(),sort:f.value});i.value&&R.append("keyword",i.value),o.value&&R.append("start",new Date(o.value).toISOString()),l.value&&R.append("end",new Date(l.value).toISOString());const C=await(await fetch(`/api/logs?${R}`)).json();t.value=C.logs||[],s.value=C.total}catch(R){console.error("Error fetching logs:",R)}finally{a.value=!1}},T=async()=>{try{const R=await fetch("/api/status");h.value=await R.json()}catch(R){console.error("Error fetching status:",R)}},F=R=>new Date(R).toLocaleString(),D=R=>{n.value=R,S()},z=()=>{i.value="",o.value="",l.value="",n.value=1,S()},N=()=>Math.ceil(s.value/r.value);return Cr(()=>{S(),T(),p=window.setInterval(()=>{S(),T()},5e3)}),Qs(()=>{p&&clearInterval(p)}),(R,M)=>(Oe(),He("div",El,[V("header",null,[M[6]||(M[6]=V("h1",null,"📊 MemoryLogMonitor",-1)),h.value?(Oe(),He("div",Ol,[V("span",null,"Status: "+$e(h.value.status),1),V("span",null,"Total Logs: "+$e(h.value.logCount),1)])):Tn("",!0)]),V("div",Al,[V("div",Pl,[Kt(V("input",{"onUpdate:modelValue":M[0]||(M[0]=C=>i.value=C),type:"text",placeholder:"Search by keyword...",onKeyup:vl(S,["enter"])},null,544),[[Ts,i.value]]),Kt(V("input",{"onUpdate:modelValue":M[1]||(M[1]=C=>o.value=C),type:"datetime-local",placeholder:"Start date"},null,512),[[Ts,o.value]]),Kt(V("input",{"onUpdate:modelValue":M[2]||(M[2]=C=>l.value=C),type:"datetime-local",placeholder:"End date"},null,512),[[Ts,l.value]]),Kt(V("select",{"onUpdate:modelValue":M[3]||(M[3]=C=>f.value=C),onChange:S},[...M[7]||(M[7]=[V("option",{value:"desc"},"Newest First",-1),V("option",{value:"asc"},"Oldest First",-1)])],544),[[bl,f.value]])]),V("div",{class:"filter-actions"},[V("button",{onClick:S,class:"btn-primary"},"Apply Filters"),V("button",{onClick:z,class:"btn-secondary"},"Clear")])]),V("div",Ml,[a.value?(Oe(),He("div",Il,"Loading...")):t.value.length===0?(Oe(),He("div",Rl," No logs found. Send logs to TCP port 9090. ")):(Oe(),He("table",Fl,[M[8]||(M[8]=V("thead",null,[V("tr",null,[V("th",{style:{width:"200px"}},"Timestamp"),V("th",null,"Message")])],-1)),V("tbody",null,[(Oe(!0),He(ae,null,lo(t.value,(C,J)=>(Oe(),He("tr",{key:J},[V("td",Dl,$e(F(C.timestamp)),1),V("td",Nl,$e(C.message),1)]))),128))])]))]),N()>1?(Oe(),He("div",jl,[V("button",{onClick:M[4]||(M[4]=C=>D(n.value-1)),disabled:n.value===1,class:"btn-page"}," Previous ",8,Ll),V("span",Hl," Page "+$e(n.value)+" of "+$e(N())+" ("+$e(s.value)+" total) ",1),V("button",{onClick:M[5]||(M[5]=C=>D(n.value+1)),disabled:n.value>=N(),class:"btn-page"}," Next ",8,$l)])):Tn("",!0)]))}}),Kl=(e,t)=>{const s=e.__vccOpts||e;for(const[n,r]of t)s[n]=r;return s},Ul=Kl(Vl,[["__scopeId","data-v-35baef93"]]);wl(Ul).mount("#app"); diff --git a/http/frontend/dist/assets/index-Djk-d5tB.css b/http/frontend/dist/assets/index-Djk-d5tB.css new file mode 100644 index 0000000..fc3a383 --- /dev/null +++ b/http/frontend/dist/assets/index-Djk-d5tB.css @@ -0,0 +1 @@ +*{box-sizing:border-box}:root{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;line-height:1.5;font-weight:400;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}body{margin:0;padding:0;min-width:320px;min-height:100vh;background-color:#f0f2f5}#app{width:100%;min-height:100vh}.app[data-v-35baef93]{max-width:1400px;margin:0 auto;padding:20px}header[data-v-35baef93]{display:flex;justify-content:space-between;align-items:center;margin-bottom:20px;padding:20px;background:linear-gradient(135deg,#667eea,#764ba2);color:#fff;border-radius:8px}h1[data-v-35baef93]{margin:0;font-size:28px}.status[data-v-35baef93]{display:flex;gap:20px;font-size:14px}.filters[data-v-35baef93]{background:#f5f5f5;padding:20px;border-radius:8px;margin-bottom:20px}.filter-row[data-v-35baef93]{display:flex;gap:10px;margin-bottom:10px;flex-wrap:wrap}.filter-row input[data-v-35baef93],.filter-row select[data-v-35baef93]{flex:1;min-width:150px;padding:10px;border:1px solid #ddd;border-radius:4px;font-size:14px}.filter-actions[data-v-35baef93]{display:flex;gap:10px}button[data-v-35baef93]{padding:10px 20px;border:none;border-radius:4px;cursor:pointer;font-size:14px;transition:background-color .3s}.btn-primary[data-v-35baef93]{background:#667eea;color:#fff}.btn-primary[data-v-35baef93]:hover{background:#5568d3}.btn-secondary[data-v-35baef93]{background:#e0e0e0;color:#333}.btn-secondary[data-v-35baef93]:hover{background:#d0d0d0}.logs-container[data-v-35baef93]{min-height:400px;background:#fff;border-radius:8px;overflow:hidden;box-shadow:0 2px 4px #0000001a}.loading[data-v-35baef93],.no-logs[data-v-35baef93]{padding:40px;text-align:center;color:#666;font-size:16px}.logs-table[data-v-35baef93]{width:100%;border-collapse:collapse}.logs-table thead[data-v-35baef93]{background:#f8f9fa}.logs-table th[data-v-35baef93]{padding:12px;text-align:left;font-weight:600;border-bottom:2px solid #dee2e6}.logs-table td[data-v-35baef93]{padding:12px;border-bottom:1px solid #e9ecef}.logs-table tbody tr[data-v-35baef93]:hover{background:#f8f9fa}.timestamp[data-v-35baef93]{font-family:monospace;color:#666;white-space:nowrap}.message[data-v-35baef93]{font-family:monospace;word-break:break-all}.pagination[data-v-35baef93]{display:flex;justify-content:center;align-items:center;gap:20px;margin-top:20px;padding:20px}.btn-page[data-v-35baef93]{background:#667eea;color:#fff;padding:8px 16px}.btn-page[data-v-35baef93]:hover:not(:disabled){background:#5568d3}.btn-page[data-v-35baef93]:disabled{background:#ccc;cursor:not-allowed}.page-info[data-v-35baef93]{color:#666;font-size:14px} diff --git a/http/frontend/dist/index.html b/http/frontend/dist/index.html new file mode 100644 index 0000000..a660d8c --- /dev/null +++ b/http/frontend/dist/index.html @@ -0,0 +1,14 @@ + + + + + + + frontend + + + + +
+ + diff --git a/http/frontend/dist/vite.svg b/http/frontend/dist/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/http/frontend/dist/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/http/server.go b/http/server.go new file mode 100644 index 0000000..317f5cf --- /dev/null +++ b/http/server.go @@ -0,0 +1,220 @@ +package http + +import ( + "embed" + "io" + "io/fs" + "net/http" + "sort" + "strconv" + "strings" + "time" + + "github.com/devuser/MemoryLogMonitor/logstore" + "github.com/gin-gonic/gin" +) + +//go:embed frontend/dist/* +var frontendFS embed.FS + +// Server represents an HTTP server +type Server struct { + port int + store *logstore.LogStore + router *gin.Engine +} + +// NewServer creates a new HTTP server +func NewServer(port int, store *logstore.LogStore) *Server { + s := &Server{ + port: port, + store: store, + router: gin.Default(), + } + s.setupRoutes() + return s +} + +// GetRouter returns the Gin router +func (s *Server) GetRouter() *gin.Engine { + return s.router +} + +// Start starts the HTTP server +func (s *Server) Start() error { + return s.router.Run(":" + strconv.Itoa(s.port)) +} + +func (s *Server) setupRoutes() { + // API routes + api := s.router.Group("/api") + { + api.GET("/logs", s.getLogs) + api.GET("/status", s.getStatus) + } + + // Serve frontend + s.serveFrontend() +} + +func (s *Server) getLogs(c *gin.Context) { + // Get query parameters + keyword := c.Query("keyword") + startTimeStr := c.Query("start") + endTimeStr := c.Query("end") + sortOrder := c.DefaultQuery("sort", "desc") // desc = newest first, asc = oldest first + page := c.DefaultQuery("page", "1") + pageSize := c.DefaultQuery("pageSize", "100") + + // Parse pagination parameters + pageNum, err := strconv.Atoi(page) + if err != nil || pageNum < 1 { + pageNum = 1 + } + pageSizeNum, err := strconv.Atoi(pageSize) + if err != nil || pageSizeNum < 1 || pageSizeNum > 1000 { + pageSizeNum = 100 + } + + // Parse time filters + var startTime, endTime *time.Time + if startTimeStr != "" { + t, err := time.Parse(time.RFC3339, startTimeStr) + if err == nil { + startTime = &t + } + } + if endTimeStr != "" { + t, err := time.Parse(time.RFC3339, endTimeStr) + if err == nil { + endTime = &t + } + } + + // Get filtered logs + logs := s.store.GetFiltered(keyword, startTime, endTime) + + // Sort logs + if sortOrder == "asc" { + sort.Slice(logs, func(i, j int) bool { + return logs[i].Timestamp.Before(logs[j].Timestamp) + }) + } else { + sort.Slice(logs, func(i, j int) bool { + return logs[i].Timestamp.After(logs[j].Timestamp) + }) + } + + // Apply pagination + total := len(logs) + start := (pageNum - 1) * pageSizeNum + end := start + pageSizeNum + + if start >= total { + logs = []logstore.LogEntry{} + } else { + if end > total { + end = total + } + logs = logs[start:end] + } + + c.JSON(http.StatusOK, gin.H{ + "logs": logs, + "total": total, + "page": pageNum, + "pageSize": pageSizeNum, + }) +} + +func (s *Server) getStatus(c *gin.Context) { + c.JSON(http.StatusOK, gin.H{ + "status": "running", + "logCount": s.store.Count(), + "timestamp": time.Now(), + }) +} + +func (s *Server) serveFrontend() { + // Try to serve embedded frontend + distFS, err := fs.Sub(frontendFS, "frontend/dist") + if err == nil { + // Use NoRoute for all non-API routes + s.router.NoRoute(func(c *gin.Context) { + path := c.Request.URL.Path + + // Default to index.html for root + if path == "/" { + path = "/index.html" + } + + // Remove leading slash + cleanPath := strings.TrimPrefix(path, "/") + + // Try to open the file + file, err := distFS.Open(cleanPath) + if err != nil { + // File not found, serve index.html for SPA routing + file, err = distFS.Open("index.html") + if err != nil { + c.String(http.StatusNotFound, "404 not found") + return + } + cleanPath = "index.html" + } + defer file.Close() + + // Read file content + content, err := io.ReadAll(file) + if err != nil { + c.String(http.StatusInternalServerError, "Error reading file") + return + } + + // Determine content type + contentType := "text/html; charset=utf-8" + if strings.HasSuffix(cleanPath, ".js") { + contentType = "application/javascript; charset=utf-8" + } else if strings.HasSuffix(cleanPath, ".css") { + contentType = "text/css; charset=utf-8" + } else if strings.HasSuffix(cleanPath, ".svg") { + contentType = "image/svg+xml" + } + + c.Data(http.StatusOK, contentType, content) + }) + } else { + // Fallback: serve a simple HTML page if frontend not built + s.router.GET("/", s.serveFallbackHTML) + } +} + +func (s *Server) serveFallbackHTML(c *gin.Context) { + html := ` + + + MemoryLogMonitor + + + +
+

MemoryLogMonitor

+
+

Frontend not built. Please build the frontend first:

+
cd frontend && npm install && npm run build
+

API endpoints are available:

+
    +
  • GET /api/logs - Get logs with optional filters
  • +
  • GET /api/status - Get system status
  • +
+
+
+ +` + c.Data(http.StatusOK, "text/html; charset=utf-8", []byte(html)) +} diff --git a/logstore/logstore.go b/logstore/logstore.go new file mode 100644 index 0000000..074badd --- /dev/null +++ b/logstore/logstore.go @@ -0,0 +1,92 @@ +package logstore + +import ( + "container/list" + "strings" + "sync" + "time" +) + +// LogEntry represents a single log entry +type LogEntry struct { + Timestamp time.Time `json:"timestamp"` + Message string `json:"message"` +} + +// LogStore manages log entries with LRU eviction +type LogStore struct { + mu sync.RWMutex + entries *list.List + maxSize int +} + +// NewLogStore creates a new LogStore with the specified maximum size +func NewLogStore(maxSize int) *LogStore { + return &LogStore{ + entries: list.New(), + maxSize: maxSize, + } +} + +// Add adds a new log entry to the store +func (ls *LogStore) Add(entry LogEntry) { + ls.mu.Lock() + defer ls.mu.Unlock() + + // Add new entry to front + ls.entries.PushFront(entry) + + // Evict oldest if over capacity + if ls.entries.Len() > ls.maxSize { + oldest := ls.entries.Back() + if oldest != nil { + ls.entries.Remove(oldest) + } + } +} + +// GetAll returns all log entries +func (ls *LogStore) GetAll() []LogEntry { + ls.mu.RLock() + defer ls.mu.RUnlock() + + result := make([]LogEntry, 0, ls.entries.Len()) + for e := ls.entries.Front(); e != nil; e = e.Next() { + result = append(result, e.Value.(LogEntry)) + } + return result +} + +// GetFiltered returns filtered log entries based on keyword and date range +func (ls *LogStore) GetFiltered(keyword string, startTime, endTime *time.Time) []LogEntry { + ls.mu.RLock() + defer ls.mu.RUnlock() + + result := make([]LogEntry, 0) + for e := ls.entries.Front(); e != nil; e = e.Next() { + entry := e.Value.(LogEntry) + + // Filter by date range + if startTime != nil && entry.Timestamp.Before(*startTime) { + continue + } + if endTime != nil && entry.Timestamp.After(*endTime) { + continue + } + + // Filter by keyword + if keyword != "" && !strings.Contains(entry.Message, keyword) { + continue + } + + result = append(result, entry) + } + return result +} + +// Count returns the number of entries in the store +func (ls *LogStore) Count() int { + ls.mu.RLock() + defer ls.mu.RUnlock() + return ls.entries.Len() +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..dc32d12 --- /dev/null +++ b/main.go @@ -0,0 +1,72 @@ +package main + +import ( + "context" + "log" + "net/http" + "os" + "os/signal" + "syscall" + "time" + + httpserver "github.com/devuser/MemoryLogMonitor/http" + "github.com/devuser/MemoryLogMonitor/logstore" + tcpserver "github.com/devuser/MemoryLogMonitor/tcp" +) + +const ( + // MaxLogEntries is the maximum number of log entries to store + MaxLogEntries = 10000 + // TCPPort is the port for the TCP log receiver + TCPPort = 9090 + // HTTPPort is the port for the HTTP server + HTTPPort = 8080 +) + +func main() { + log.Println("Starting MemoryLogMonitor...") + + // Create log store + store := logstore.NewLogStore(MaxLogEntries) + + // Start TCP server + tcpServer := tcpserver.NewServer(TCPPort, store) + if err := tcpServer.Start(); err != nil { + log.Fatalf("Failed to start TCP server: %v", err) + } + + // Start HTTP server in a goroutine + httpServer := httpserver.NewServer(HTTPPort, store) + + // Create HTTP server with proper shutdown support + srv := &http.Server{ + Addr: ":8080", + Handler: httpServer.GetRouter(), + } + + go func() { + log.Printf("HTTP server starting on port %d", HTTPPort) + if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { + log.Fatalf("Failed to start HTTP server: %v", err) + } + }() + + // Wait for interrupt signal + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, os.Interrupt, syscall.SIGTERM) + <-sigCh + + log.Println("Shutting down...") + + // Gracefully shutdown HTTP server + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + if err := srv.Shutdown(ctx); err != nil { + log.Printf("HTTP server shutdown error: %v", err) + } + + // Stop TCP server + tcpServer.Stop() + + log.Println("Shutdown complete") +} diff --git a/tcp/server.go b/tcp/server.go new file mode 100644 index 0000000..22f2641 --- /dev/null +++ b/tcp/server.go @@ -0,0 +1,81 @@ +package tcp + +import ( + "bufio" + "fmt" + "log" + "net" + "time" + + "github.com/devuser/MemoryLogMonitor/logstore" +) + +// Server represents a TCP log receiver server +type Server struct { + port int + store *logstore.LogStore + listener net.Listener +} + +// NewServer creates a new TCP server +func NewServer(port int, store *logstore.LogStore) *Server { + return &Server{ + port: port, + store: store, + } +} + +// Start starts the TCP server +func (s *Server) Start() error { + listener, err := net.Listen("tcp", fmt.Sprintf(":%d", s.port)) + if err != nil { + return err + } + s.listener = listener + + log.Printf("TCP server listening on port %d", s.port) + + go s.acceptConnections() + return nil +} + +// Stop stops the TCP server +func (s *Server) Stop() error { + if s.listener != nil { + return s.listener.Close() + } + return nil +} + +func (s *Server) acceptConnections() { + for { + conn, err := s.listener.Accept() + if err != nil { + log.Printf("Error accepting connection: %v", err) + return + } + go s.handleConnection(conn) + } +} + +func (s *Server) handleConnection(conn net.Conn) { + defer conn.Close() + log.Printf("New connection from %s", conn.RemoteAddr()) + + scanner := bufio.NewScanner(conn) + for scanner.Scan() { + message := scanner.Text() + if message != "" { + entry := logstore.LogEntry{ + Timestamp: time.Now(), + Message: message, + } + s.store.Add(entry) + log.Printf("Received log: %s", message) + } + } + + if err := scanner.Err(); err != nil { + log.Printf("Error reading from connection: %v", err) + } +}