From b749b4e0e57a5199f63b1ae704f5d5280b1d1ef0 Mon Sep 17 00:00:00 2001 From: Jack Date: Mon, 14 Sep 2026 16:55:15 +0800 Subject: [PATCH] pi-launcher: macOS/Windows desktop launcher for @agegr/pi-web MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 按需启动 pi-web 本地 Web UI(端口 30141,URL http://localhost:30141/), 基于 Wails v2 (Go + Vue 3) 构建,逻辑与 dsh-launcher 同构但适配 pi: - 命令 pi-web、端口 30141、~/.pi/ 凭据 - 接管旧进程(关 app 不留 node 残留) - 三栏环境检查(Node / pi-web CLI / 端口) 构建: macOS: ./scripts/build-mac.sh Windows: scripts\build-windows.bat Co-Authored-By: Claude --- .gitignore | 65 + README.md | 167 ++ app.go | 921 +++++++++++ build/README.md | 35 + build/appicon.png | Bin 0 -> 59603 bytes build/darwin/Info.plist | 63 + build/iconfile.icns | Bin 0 -> 141466 bytes build/windows/icon.ico | Bin 0 -> 12328 bytes build/windows/info.json | 15 + frontend/README.md | 8 + frontend/index.html | 12 + frontend/package-lock.json | 1392 +++++++++++++++++ frontend/package.json | 18 + frontend/package.json.md5 | 1 + frontend/src/App.vue | 1011 ++++++++++++ frontend/src/assets/fonts/OFL.txt | 93 ++ .../fonts/nunito-v16-latin-regular.woff2 | Bin 0 -> 18972 bytes frontend/src/assets/images/appicon.png | Bin 0 -> 3918 bytes frontend/src/main.js | 5 + frontend/src/style.css | 1 + frontend/vite.config.js | 7 + frontend/wailsjs/go/main/App.d.ts | 21 + frontend/wailsjs/go/main/App.js | 39 + frontend/wailsjs/go/models.ts | 109 ++ frontend/wailsjs/runtime/package.json | 24 + frontend/wailsjs/runtime/runtime.d.ts | 330 ++++ frontend/wailsjs/runtime/runtime.js | 298 ++++ go.mod | 36 + go.sum | 83 + main.go | 80 + scripts/build-mac.sh | 61 + scripts/build-windows.bat | 87 ++ scripts/install-app.sh | 65 + wails.json | 13 + 34 files changed, 5060 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 app.go create mode 100644 build/README.md create mode 100644 build/appicon.png create mode 100644 build/darwin/Info.plist create mode 100644 build/iconfile.icns create mode 100644 build/windows/icon.ico create mode 100644 build/windows/info.json create mode 100644 frontend/README.md create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100755 frontend/package.json.md5 create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/assets/fonts/OFL.txt create mode 100644 frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 create mode 100644 frontend/src/assets/images/appicon.png create mode 100644 frontend/src/main.js create mode 100644 frontend/src/style.css create mode 100644 frontend/vite.config.js create mode 100755 frontend/wailsjs/go/main/App.d.ts create mode 100755 frontend/wailsjs/go/main/App.js create mode 100755 frontend/wailsjs/go/models.ts create mode 100644 frontend/wailsjs/runtime/package.json create mode 100644 frontend/wailsjs/runtime/runtime.d.ts create mode 100644 frontend/wailsjs/runtime/runtime.js create mode 100644 go.mod create mode 100644 go.sum create mode 100644 main.go create mode 100755 scripts/build-mac.sh create mode 100644 scripts/build-windows.bat create mode 100755 scripts/install-app.sh create mode 100644 wails.json diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c13485b --- /dev/null +++ b/.gitignore @@ -0,0 +1,65 @@ +# ─── Go ─────────────────────────────────────────────── +# 编译产物(.app/.exe 整个目录) +build/bin/ +# go build 出来的裸 binary(--selftest 等调试命令) +/pi-launcher +# macOS 开发期构建的 Info.plist(带 dev id),不入仓;release 用 Info.plist 入仓 +build/darwin/Info.dev.plist +# Windows 打包临时 +build/windows/installer/ +build/windows/wails.exe.manifest +# Go 覆盖率/测试产物 +*.test +*.out +coverage.* + +# ─── Node / Vite / Wails 前端 ──────────────────────── +node_modules/ +frontend/dist/ +# frontend/wailsjs/ 是 wails build 自动生成的 JS 绑定,建议入仓(clone 后开箱即用) +# 顶部 banner 图片是 build 临时文件,不入仓 +frontend/src/assets/images/banner.png + +# ─── Wails 框架生成的本地开发配置 ───────────────────── +# wails.json 是项目配置,应该 commit +# 但 build/ 下生成的 Info.plist / icon.icns 已经包含在 build/bin/,无需额外忽略 + +# ─── macOS ─────────────────────────────────────────── +.DS_Store +.AppleDouble +.LSOverride +Icon? +._* +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# ─── Windows ───────────────────────────────────────── +Thumbs.db +ehthumbs.db +Desktop.ini +$RECYCLE.BIN/ + +# ─── IDE ───────────────────────────────────────────── +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# ─── 日志 / 临时文件 ────────────────────────────────── +*.log +.DS_Store +.tmp/ +*.tmp +.env +.env.local +.env.*.local + +# ─── 应用运行产生的缓存 ────────────────────────────── +# Wails macOS app 运行时会在 ~/Library/{Caches,Logs} 下产数据,不入仓 +# (路径在 $HOME 下,不会进项目) \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..485b983 --- /dev/null +++ b/README.md @@ -0,0 +1,167 @@ +# pi-launcher + +macOS / Windows 桌面启动器:按需启动 [pi-agent](https://www.npmjs.com/package/@agegr/pi-web) 的本地 Web UI,免去手动开终端、敲命令、等端口、点浏览器的重复操作。 + +基于 [Wails v2](https://wails.io/) (Go + Vue 3) 构建。逻辑与 [`dsh-launcher`](../dsh-launcher) 几乎一致,仅替换为目标 CLI 与图标。 + +--- + +## 这是什么 + +`@agegr/pi-web` 是一个 npm 全局安装的命令行工具,启动后会: + +1. 拉起本地 HTTP 服务(默认端口 `30141`) +2. 浏览器访问 `http://localhost:30141/` + +`pi-launcher` 把这串动作封装成一个独立的 `.app`(macOS)/ `.exe`(Windows): + +- 启动前自检:Node / pi-web 命令 / 凭据 / 30141 端口 +- 一键启动 → 等端口就绪 → 自动开浏览器 → 最小化到 Dock +- 一键停止 / 一键安装(`npm install -g @agegr/pi-web`) / 一键升级 +- 退出时自动清理:杀子进程、释放端口、不留孤儿 node + +适合场景:日常用 pi 但不想每次都开终端敲命令。 + +--- + +## 截图 + +(启动器窗口 1040 × 1280,深色背景,左右两栏:左环境检查,右操作 + 日志) + +--- + +## 安装 pi CLI(目标程序) + +启动器只是壳,真正干活的 `pi` 命令需要先手动装一次: + +```bash +npm install -g @agegr/pi-web +``` + +启动器自带的「安装 / 升级」按钮会帮你跑同样的命令,不用自己再开终端。 + +> **注意**:`@agegr/pi-web` 默认会拉取一份 Electron 浏览器壳 + 本地凭据目录 `~/.pi/`(类比 `dsh` 的 `~/.dsh/`)。首次启动器自检会提示你 `pi-web login`。 + +--- + +## 编译启动器本身 + +需要: + +- Go ≥ 1.25 +- Node ≥ 18 +- Wails v2:`go install github.com/wailsapp/wails/v2/cmd/wails@latest` +- macOS 编译产物需要 macOS;Windows 同理(见下方说明) + +### macOS + +```bash +./scripts/build-mac.sh +# 产物: build/bin/pi-launcher.app + +./scripts/install-app.sh +# 复制到 /Applications/ 并刷新 LaunchServices 图标缓存 +``` + +### Windows + +在 Windows 上跑: + +```bat +scripts\build-windows.bat +``` + +> Wails v2 跨平台必须本机编译,Mac 上 build 不了 Windows exe。 + +--- + +## 开发模式 + +```bash +wails dev +``` + +Vite 热重载前端 + Go 后端,浏览器另开 devtools:http://localhost:34115 + +--- + +## 核心架构 + +``` +pi-launcher/ +├── main.go # Wails 入口 + macOS 窗口配置 + --selftest 调试模式 +├── app.go # 后端:CheckEnv / Start / Stop / Install / Update +├── wails.json # 项目元数据(name / outputfilename) +├── go.mod +├── build/ +│ ├── darwin/Info.plist +│ ├── windows/icon.ico +│ └── appicon.png / iconfile.icns # 应用图标(替换此处换图标) +├── frontend/ +│ ├── src/App.vue # 单文件 SPA,环境检查 + 操作面板 + 日志 +│ ├── src/main.js +│ ├── package.json +│ └── vite.config.js +├── scripts/ +│ ├── build-mac.sh # macOS 构建脚本 +│ ├── build-windows.bat +│ └── install-app.sh # 复制到 /Applications + 刷新图标缓存 +└── README.md +``` + +### 后端关键点 + +- `initNpmPrefix()` — 启动时一次性 `npm prefix -g` 缓存,后续读缓存 +- `buildChildEnv()` — 给子进程手动塞 `/opt/homebrew/bin` 等路径,GUI 进程 `~/.zshrc` 不读 +- `waitForPort(30141, 30s)` — 轮询端口 LISTEN 替代等 URL 字符串 +- `killPITree()` + `freePort(30141)` — 退出 / 停止时双保险,杀进程树 + 精准释放端口 +- 全部外部命令都包 `recover()` + 超时,任何子命令崩都不会拖垮 GUI + +### 前端关键点 + +- 单文件 `App.vue`,分左右两栏:左环境检查(Node / pi / 凭据 / 端口),右操作按钮 + 实时日志流 +- 通过 Wails `EventsOn` 订阅 `pi:install:log` / `pi:install:done` 拿到 npm 子进程实时输出 +- `Start` 成功后自动调 `WindowMinimise` 收进 Dock + +--- + +## 与 dsh-launcher 的差异 + +| 项 | dsh-launcher | pi-launcher | +|---|---|---| +| 目标 CLI | `@deepseek-ai/dsh` | `@agegr/pi-web` | +| 命令名 | `dsh` | `pi-web` | +| 凭据目录 | `~/.dsh/.credentials.yaml` | `~/.pi/.credentials.yaml`(待确认) | +| 端口 | 3080 | 30141 | +| 进程匹配 | `dsh/lib/bin.js` / `dsh-pet` | `pi-web` 相关进程(待定) | +| 安装包名 | `@deepseek-ai/dsh` | `@agegr/pi-web` | +| 启动 URL | `http://127.0.0.1:3080/` | `http://localhost:30141/` | +| 图标 | `build/appicon.png` | 同位置替换 | + +迁移思路:把 `app.go` 里所有 `dsh` 字面量改成 `pi`、`dshPkg` 常量改成 `@agegr/pi-web`、`HomeDshDir` 改成 `HomePiDir`(`~/.pi`),端口 `3080` 改成 `30141`,再换图标即可。 + +--- + +## 自检模式(调试用) + +不启 GUI,直接调后端走完流程: + +```bash +./build/bin/pi-launcher --selftest +``` + +会打印:`nodeOK` / `piPath` / `piVer` / `cred` / `portBusy` / 进程列表 / `waitForPort` 测试结果。 + +--- + +## 已知问题 + +- **Windows 图标闪烁**:首次安装 Windows 版后任务栏图标可能延迟更新,等几秒或重新 pin。 +- **macOS Dock 图标缓存**:`scripts/install-app.sh` 已处理 `lsregister -f` + Dock 重启,通常一次就好。 +- **端口 30141 被占**:启动器会自动 `kill -9` 残留 PID,但如果你跑别的服务也用 30141 会被误杀——届时改 `waitForPort` / `freePort` 的端口号。 + +--- + +## License + +个人项目,MIT。 \ No newline at end of file diff --git a/app.go b/app.go new file mode 100644 index 0000000..17d4643 --- /dev/null +++ b/app.go @@ -0,0 +1,921 @@ +package main + +import ( + "bufio" + "bytes" + "context" + "encoding/json" + "fmt" + "io" + "log" + "os" + "os/exec" + "path/filepath" + "runtime" + "runtime/debug" + "strconv" + "strings" + "sync" + "time" + + wailsruntime "github.com/wailsapp/wails/v2/pkg/runtime" +) + +// pi 默认 Web UI 端口 +const piPort = 30141 + +// App is the Wails application backend. +type App struct { + ctx context.Context + + mu sync.Mutex + piCmd *exec.Cmd + piURL string + startedAt time.Time + running bool +} + +// NewApp creates a new App application struct. +func NewApp() *App { + initCrashLog() + // 在进程启动时预先初始化 npm prefix 缓存,后续 buildChildEnv 直接读缓存。 + // 这步可能 exec npm 子命令(限 2s 超时),但不会和 buildChildEnv 互相递归。 + initNpmPrefix() + return &App{} +} + +// initNpmPrefix triggers the cached npm prefix lookup exactly once. +// 必须在启动早期(且不依赖 buildChildEnv)调用,避免 buildChildEnv → cachedNpmPrefix +// 第一次执行时栈还未充分展开导致后续路径无法解析。 +func initNpmPrefix() { + _, _ = cachedNpmPrefix() +} + +// initCrashLog wires a panic logger that writes to ~/Library/Logs/pi-launcher.log. +// macOS GUI 进程 stderr 没终端,panic 信息看不到,落盘最稳。 +var crashLogOnce sync.Once + +func initCrashLog() { + crashLogOnce.Do(func() { + home, _ := os.UserHomeDir() + logPath := filepath.Join(home, "Library", "Logs", "pi-launcher.log") + _ = os.MkdirAll(filepath.Dir(logPath), 0o755) + f, err := os.OpenFile(logPath, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0o644) + if err != nil { + return + } + log.SetOutput(f) + log.SetFlags(log.LstdFlags | log.Lmicroseconds | log.Lshortfile) + }) +} + +// safeGo wraps a goroutine with recover so a panic in any background +// task can't take down the whole Wails app. +func safeGo(name string, fn func()) { + go func() { + defer func() { + if r := recover(); r != nil { + log.Printf("[panic:%s] %v\n%s", name, r, debugStack()) + } + }() + fn() + }() +} + +func debugStack() string { + return string(debug.Stack()) +} + +// startup is called when the app starts. +func (a *App) startup(ctx context.Context) { + a.ctx = ctx + // 接管旧进程: 用户可能之前手动启动过 pi-web / 残留 node 占着 30141。 + // launcher 作为唯一入口,启动时强制清场,确保 UI 状态与实际一致。 + safeGo("takeOver", func() { + pids := listPIPids() + freePort(piPort) + killed := len(pids) + if killed > 0 && a.ctx != nil { + wailsruntime.EventsEmit(a.ctx, "pi:takeover:done", killed) + } + }) +} + +// shutdown is called when the app is closing. Ensure pi is killed +// so we never leak a child process. +func (a *App) shutdown(ctx context.Context) { + a.stopPI() +} + +// ---- Types exposed to the frontend ---- + +// CheckResult is returned by CheckEnv. +type CheckResult struct { + NodePath string `json:"nodePath"` + NodeVersion string `json:"nodeVersion"` + NodeOK bool `json:"nodeOK"` + PiPath string `json:"piPath"` + PiVersion string `json:"piVersion"` + CredFile string `json:"credFile"` + CredExists bool `json:"credExists"` + HomePiDir string `json:"homePiDir"` + PortBusy bool `json:"portBusy"` + PortBusyBy string `json:"portBusyBy"` + Issues []string `json:"issues"` // 始终非 nil,前端可放心访问 +} + +// StartResult is returned by Start. +type StartResult struct { + OK bool `json:"ok"` + URL string `json:"url"` + Error string `json:"error"` + Output string `json:"output"` + Hidden bool `json:"hidden"` // 是否已自动隐藏窗口 +} + +// StatusResult is returned by GetStatus. +type StatusResult struct { + Running bool `json:"running"` + URL string `json:"url"` + StartedAt string `json:"startedAt"` + Pid int `json:"pid"` +} + +// ---- 3 core methods ---- + +// CheckEnv inspects Node, pi-web, ~/.pi credentials and port 30141. +// 所有外部命令都套超时 + panic recover,任何一个失败不能让整个 app 闪退。 +func (a *App) CheckEnv() (res CheckResult) { + defer func() { + if r := recover(); r != nil { + log.Printf("[panic:CheckEnv] %v\n%s", r, debugStack()) + res.Issues = append(res.Issues, fmt.Sprintf("CheckEnv 内部错误: %v", r)) + } + }() + + home := os.Getenv("HOME") + if home == "" { + home = "/tmp" + } + res = CheckResult{ + HomePiDir: filepath.Join(home, ".pi"), + CredFile: filepath.Join(home, ".pi", ".credentials.yaml"), + PortBusy: false, + Issues: []string{}, // 确保 JSON 序列化为 [] 而非 null + } + + // node + res.NodePath = lookPath("node") + if res.NodePath != "" { + if v, err := runQuiet(res.NodePath, "-v"); err == nil { + res.NodeVersion = strings.TrimSpace(v) + if nodeMajor(res.NodeVersion) >= 18 { + res.NodeOK = true + } + } else { + log.Printf("CheckEnv node -v err: %v", err) + } + } + if !res.NodeOK { + res.Issues = append(res.Issues, "Node >= 18 未安装或不可用") + } + + // pi-web + res.PiPath = lookPath("pi-web") + piPkgDir := "" // 用来读 package.json 拿版本 + if res.PiPath == "" { + // fallback to npm prefix bin + if npm, err := runQuiet("npm", "prefix", "-g"); err == nil { + prefix := strings.TrimSpace(npm) + candidate := filepath.Join(prefix, "bin", "pi-web") + if _, statErr := os.Stat(candidate); statErr == nil { + res.PiPath = candidate + } + piPkgDir = filepath.Join(prefix, "lib", "node_modules", "@agegr", "pi-web") + } else { + log.Printf("CheckEnv npm prefix err: %v", err) + } + } else { + // 从 symlink 反推 package.json 路径: .../bin/pi-web -> ../lib/node_modules/@agegr/pi-web/bin/pi-web.js + // 走 npm prefix -g 是稳的 + if npm, err := runQuiet("npm", "prefix", "-g"); err == nil { + prefix := strings.TrimSpace(npm) + piPkgDir = filepath.Join(prefix, "lib", "node_modules", "@agegr", "pi-web") + } + } + if res.PiPath != "" { + // 注意: pi-web --version 实际上会启动 server 然后失败,不安全。 + // 改用读 npm 全局 package.json 拿版本号。 + if data, err := os.ReadFile(filepath.Join(piPkgDir, "package.json")); err == nil { + var pkg struct { + Version string `json:"version"` + } + if jerr := json.Unmarshal(data, &pkg); jerr == nil && pkg.Version != "" { + res.PiVersion = pkg.Version + } + } + if res.PiVersion == "" { + log.Printf("CheckEnv: 找不到 pi-web package.json (尝试: %s)", piPkgDir) + } + } else { + res.Issues = append(res.Issues, "pi-web 命令未找到(请 npm i -g @agegr/pi-web)") + } + + // port 30141 — lsof 在受限进程下可能挂死,超时保护 + if pids, err := lsofPort(piPort); err == nil && len(pids) > 0 { + res.PortBusy = true + res.PortBusyBy = strings.Join(pids, ", ") + } + + return res +} + +// Start launches pi-web, waits for the service port, and opens the browser. +func (a *App) Start() StartResult { + a.mu.Lock() + if a.running { + a.mu.Unlock() + return StartResult{OK: false, URL: a.piURL, Error: "已在运行中"} + } + a.mu.Unlock() + + // 启动前先清理:杀残留 pi 进程,再强杀占 30141 端口的残留 PID(孤儿 node 等) + killPITree() + freePort(piPort) + + piBin := lookPath("pi-web") + if piBin == "" { + if npm, err := runQuiet("npm", "prefix", "-g"); err == nil { + candidate := filepath.Join(strings.TrimSpace(npm), "bin", "pi-web") + if _, statErr := os.Stat(candidate); statErr == nil { + piBin = candidate + } + } + } + if piBin == "" { + return StartResult{OK: false, Error: "找不到 pi-web 可执行文件"} + } + + // --no-open 让 pi-web 只起服务不自动开浏览器,我们自己开 + cmd := exec.Command(piBin, "--no-open") + cmd.Env = buildChildEnv() + + stdout, err := cmd.StdoutPipe() + if err != nil { + return StartResult{OK: false, Error: "无法创建 stdout 管道: " + err.Error()} + } + stderr, err := cmd.StderrPipe() + if err != nil { + return StartResult{OK: false, Error: "无法创建 stderr 管道: " + err.Error()} + } + + if err := cmd.Start(); err != nil { + return StartResult{OK: false, Error: "启动 pi-web 失败: " + err.Error()} + } + + a.mu.Lock() + a.piCmd = cmd + a.running = true + a.startedAt = time.Now() + a.piURL = "" + a.mu.Unlock() + + // drain 掉 stdout/stderr 避免阻塞 + safeGo("drainStdout", func() { drainLog(stdout, "pi") }) + safeGo("drainStderr", func() { drainLog(stderr, "pi") }) + + // 监听子进程退出 + safeGo("piWait", func() { + _ = cmd.Wait() + a.mu.Lock() + a.running = false + a.mu.Unlock() + }) + + // polling 等端口 30141 LISTEN(替代等 URL 字符串) + const timeout = 30 * time.Second + ready := waitForPort(piPort, timeout) + if !ready { + _ = cmd.Process.Kill() + return StartResult{OK: false, Error: fmt.Sprintf("等待端口 %d 监听超时(30s),pi-web 可能没正常启动", piPort)} + } + + url := fmt.Sprintf("http://localhost:%d/", piPort) + a.mu.Lock() + a.piURL = url + a.mu.Unlock() + + // 用系统 open 唤起浏览器(cookie session 自动登录) + if openErr := openBrowser(url); openErr != nil { + return StartResult{OK: true, URL: url, Error: "已启动,但自动开浏览器失败: " + openErr.Error()} + } + + // 启动成功 + 已打开浏览器 → 最小化到 Dock + if a.ctx != nil { + wailsruntime.WindowMinimise(a.ctx) + } + return StartResult{OK: true, URL: url, Hidden: true} +} + +// waitForPort 轮询检查端口是否处于 LISTEN,timeout 内返回 true。 +func waitForPort(port int, timeout time.Duration) bool { + deadline := time.Now().Add(timeout) + for { + if pids, _ := lsofPort(port); len(pids) > 0 { + return true + } + if time.Now().After(deadline) { + return false + } + time.Sleep(300 * time.Millisecond) + } +} + +// freePort 强制释放端口: lsof 拿到 LISTEN 的所有 PID,逐一 kill -9。 +// 返回被杀的 PID 数量。 +// 适用于: +// - Start 前:如果旧 pi-web 进程杀完但端口还被占(孤儿 node 进程),再补刀 +// - Stop 后:如果 pi-web 进程杀完但端口还在 TIME_WAIT,精准 kill 残留 PID +// - OnShutdown:app 退出前保证不残留任何 pi-web 进程 + 端口 +func freePort(port int) int { + pids, _ := lsofPort(port) + if len(pids) == 0 { + return 0 + } + log.Printf("freePort: %d pid(s) holding :%d", len(pids), port) + for _, pid := range pids { + if err := exec.Command("kill", "-9", pid).Run(); err != nil { + log.Printf("freePort: kill -9 %s: %v", pid, err) + } + } + // 等系统释放 socket + time.Sleep(300 * time.Millisecond) + return len(pids) +} + +// drainLog 读子进程输出并丢弃(不阻塞子进程 stdout 缓冲区)。 +func drainLog(r io.Reader, tag string) { + scanner := bufio.NewScanner(r) + scanner.Buffer(make([]byte, 64*1024), 1024*1024) + for scanner.Scan() { + _ = scanner.Text() + } +} + +// Stop kills the pi-web process and verifies the port is released. +func (a *App) Stop() StartResult { + a.mu.Lock() + cmd := a.piCmd + a.mu.Unlock() + + if cmd != nil && cmd.Process != nil { + _ = cmd.Process.Kill() + _, _ = cmd.Process.Wait() + } + + // 兜底:把 pi-web 整个进程树都杀(pi-web 主进程 + Electron helper 等) + killPITree() + + // 再精准 kill 占 30141 的残留 PID(孤儿 node、TIME_WAIT 等) + freePort(piPort) + + time.Sleep(500 * time.Millisecond) + + a.mu.Lock() + a.piCmd = nil + a.piURL = "" + a.running = false + a.mu.Unlock() + + if pids, err := lsofPort(piPort); err == nil && len(pids) > 0 { + return StartResult{OK: false, Error: fmt.Sprintf("端口 %d 仍被占用: %s", piPort, strings.Join(pids, ", "))} + } + return StartResult{OK: true} +} + +// ShowWindow brings the application window to the front. +func (a *App) ShowWindow() { + if a.ctx != nil { + wailsruntime.WindowShow(a.ctx) + } +} + +// HideWindow minimises the application window to Dock. +// 用 WindowMinimise 而不是 WindowHide,这样 macOS 上点 Dock 图标系统会 +// 自动 unminimise 恢复窗口(WindowHide 之后点 Dock 不会自动恢复)。 +func (a *App) HideWindow() { + if a.ctx != nil { + wailsruntime.WindowMinimise(a.ctx) + } +} + +// GetStatus returns the current pi state. +func (a *App) GetStatus() StatusResult { + a.mu.Lock() + defer a.mu.Unlock() + res := StatusResult{Running: a.running, URL: a.piURL} + if a.piCmd != nil && a.piCmd.Process != nil { + res.Pid = a.piCmd.Process.Pid + } + if !a.startedAt.IsZero() { + res.StartedAt = a.startedAt.Format(time.RFC3339) + } + return res +} + +// ---- internal helpers ---- + +func (a *App) stopPI() { + a.mu.Lock() + cmd := a.piCmd + a.running = false + a.mu.Unlock() + if cmd != nil && cmd.Process != nil { + _ = cmd.Process.Kill() + } + // 按 X 关 app / Stop 按钮 / OnShutdown 统一都走这个流程: + // 1) 杀整个 pi-web 进程树 + // 2) 再精准 kill 占 30141 端口的残留 PID + killPITree() + freePort(piPort) +} + +// buildChildEnv 手动把 homebrew 路径塞进子进程 PATH。 +// macOS GUI 启动的进程不读 ~/.zshrc,直接拿环境变量 PATH 经常缺 /opt/homebrew/bin。 +// 注意:本函数不能调任何 exec 子命令(包括 npm),否则会触发栈溢出。 +// npm 全局 bin 路径由 cachedNpmPrefix() 在 initNpmPrefix() 中预先算好。 +func buildChildEnv() []string { + env := os.Environ() + home := os.Getenv("HOME") + extra := []string{ + "/opt/homebrew/bin", + "/usr/local/bin", + "/usr/bin", + "/bin", + "/usr/sbin", + "/sbin", + } + // 加上缓存好的 npm 全局 bin(如果有) + if prefix, ok := cachedNpmPrefix(); ok { + extra = append(extra, filepath.Join(prefix, "bin")) + } + + hasPath := false + for i, e := range env { + if strings.HasPrefix(e, "PATH=") { + hasPath = true + cur := strings.TrimPrefix(e, "PATH=") + merged := mergePath(cur, extra) + env[i] = "PATH=" + merged + } + } + if !hasPath { + env = append(env, "PATH="+strings.Join(extra, ":")) + } + if home == "" { + env = append(env, "HOME=/tmp") + } + return env +} + +// mergePath 拼接 PATH。绝对不能调 runQuiet / 任何 exec 子命令, +// 否则会触发 buildChildEnv → mergePath 的无限递归 → 栈溢出。 +// npm 全局 bin 用 sync.Once 懒加载 + 超时兜底,在 initEnvOnce 里完成。 +func mergePath(cur string, extra []string) string { + seen := map[string]bool{} + out := []string{} + add := func(p string) { + if p == "" || seen[p] { + return + } + seen[p] = true + out = append(out, p) + } + for _, p := range strings.Split(cur, ":") { + add(p) + } + for _, p := range extra { + add(p) + } + return strings.Join(out, ":") +} + +// npmPrefixCache 用 sync.Once 缓存 `npm prefix -g` 的输出, +// 避免每次 buildChildEnv 都 exec npm。 +var ( + npmPrefixOnce sync.Once + npmPrefixValue string + npmPrefixReady bool +) + +func cachedNpmPrefix() (string, bool) { + npmPrefixOnce.Do(func() { + // 只在确实有 npm 时才跑 + bin := lookPath("npm") + if bin == "" { + return + } + // 硬超时 2s,失败就算了,不致命。 + // 注意:这里直接 exec 用 os.Environ(),不走 buildChildEnv, + // 否则初始化期间可能再次触发 buildChildEnv 形成循环。 + cmd := exec.Command(bin, "prefix", "-g") + cmd.Env = os.Environ() + var buf bytes.Buffer + cmd.Stdout = &buf + cmd.Stderr = &buf + if err := cmd.Start(); err != nil { + return + } + done := make(chan error, 1) + go func() { done <- cmd.Wait() }() + select { + case <-done: + npmPrefixValue = strings.TrimSpace(buf.String()) + npmPrefixReady = npmPrefixValue != "" + case <-time.After(2 * time.Second): + _ = cmd.Process.Kill() + <-done + } + }) + return npmPrefixValue, npmPrefixReady +} + +func openBrowser(url string) error { + switch runtime.GOOS { + case "darwin": + bin := lookPath("open") + if bin == "" { + bin = "/usr/bin/open" + } + return exec.Command(bin, url).Start() + case "windows": + return exec.Command("rundll32", "url.dll,FileProtocolHandler", url).Start() + default: + bin := lookPath("xdg-open") + if bin == "" { + return fmt.Errorf("xdg-open not found") + } + return exec.Command(bin, url).Start() + } +} + +func lookPath(name string) string { + // 先用 PATH + if p, err := exec.LookPath(name); err == nil { + return p + } + // macOS GUI 进程常缺 PATH,兜底几个常见位置 + for _, dir := range []string{"/opt/homebrew/bin", "/usr/local/bin", "/usr/bin"} { + candidate := filepath.Join(dir, name) + if _, err := os.Stat(candidate); err == nil { + return candidate + } + } + return "" +} + +func runQuiet(name string, args ...string) (string, error) { + return runQuietTimeout(name, 3*time.Second, args...) +} + +// runQuietTimeout runs a command with a hard timeout. If it doesn't finish in time, +// the child is killed and an error is yielded. macOS 上某些 fork-exec 失败场景, +// 没有超时保护会一直 hang,进而拖垮调用方。 +func runQuietTimeout(name string, timeout time.Duration, args ...string) (string, error) { + if name == "" { + return "", fmt.Errorf("empty command") + } + // 用我们自己的 lookPath(GUI 进程 PATH 缺失时也能找到 /opt/homebrew/bin 等), + // 不能用 exec.LookPath —— 它只读系统 PATH,看不到我们手动塞的路径。 + bin := lookPath(name) + if bin == "" { + return "", fmt.Errorf("not found: %s (也没在 /opt/homebrew/bin 找到)", name) + } + cmd := exec.Command(bin, args...) + cmd.Env = buildChildEnv() + // 输出大小限制,防止 npm 输出爆 buffer 卡死 + var buf bytes.Buffer + cmd.Stdout = &buf + cmd.Stderr = &buf + + if err := cmd.Start(); err != nil { + return "", fmt.Errorf("start %s: %w", bin, err) + } + + done := make(chan error, 1) + go func() { done <- cmd.Wait() }() + + select { + case err := <-done: + return buf.String(), err + case <-time.After(timeout): + _ = cmd.Process.Kill() + <-done + return "", fmt.Errorf("timeout after %s: %s %s", timeout, bin, strings.Join(args, " ")) + } +} + +func nodeMajor(v string) int { + v = strings.TrimPrefix(v, "v") + parts := strings.SplitN(v, ".", 2) + if len(parts) == 0 { + return 0 + } + n := 0 + for _, ch := range parts[0] { + if ch < '0' || ch > '9' { + break + } + n = n*10 + int(ch-'0') + } + return n +} + +// lsofPort 返回占用该端口的 PID 列表(macOS)。带超时 + panic recover。 +func lsofPort(port int) (res []string, err error) { + defer func() { + if r := recover(); r != nil { + log.Printf("[panic:lsofPort] %v\n%s", r, debugStack()) + err = fmt.Errorf("lsof panic: %v", r) + } + }() + + lsofBin := lookPath("lsof") + if lsofBin == "" { + return nil, nil // 没 lsof,跳过 + } + cmd := exec.Command(lsofBin, "-nP", fmt.Sprintf("-iTCP:%d", port), "-sTCP:LISTEN", "-t") + cmd.Env = buildChildEnv() + var buf bytes.Buffer + cmd.Stdout = &buf + cmd.Stderr = &buf + + if err := cmd.Start(); err != nil { + return nil, fmt.Errorf("lsof start: %w", err) + } + + done := make(chan error, 1) + go func() { done <- cmd.Wait() }() + + select { + case err := <-done: + out := buf.Bytes() + if err != nil && len(out) == 0 { + // lsof 无命中时退出码非 0 + 空输出 = 端口空闲 + return nil, nil + } + for _, l := range strings.Split(strings.TrimSpace(string(out)), "\n") { + l = strings.TrimSpace(l) + if l != "" { + res = append(res, l) + } + } + return res, err + case <-time.After(3 * time.Second): + _ = cmd.Process.Kill() + <-done + return nil, fmt.Errorf("lsof timeout") + } +} + +// ---- Install / Update ---- + +const piPkg = "@agegr/pi-web" + +// UpdateInfo describes the available update for pi-web. +type UpdateInfo struct { + Installed string `json:"installed"` + Latest string `json:"latest"` + HasUpdate bool `json:"hasUpdate"` + Raw string `json:"raw"` +} + +// InstallResult is returned by InstallPi / UpdatePi. +type InstallResult struct { + OK bool `json:"ok"` + Error string `json:"error"` + Output string `json:"output"` +} + +// killPITree kills all processes related to the pi-web service: +// - the pi-web CLI itself (npm/node pi-web/lib/bin.js) +// - any Electron helper (main / renderer / gpu / utility / network) +// +// 不只 kill 主进程: Electron helper 还在跑时,EPIPE 会在 pipe 关闭后让它抛 +// "Uncaught Exception" 弹窗,污染退出 UX。 +func killPITree() { + pids := listPIPids() + if len(pids) == 0 { + return + } + log.Printf("killPITree: %d pids to kill", len(pids)) + for _, pid := range pids { + // kill -9 强杀,避免 Electron helper 还在做 graceful shutdown 又触发 EPIPE + if err := exec.Command("kill", "-9", pid).Run(); err != nil { + log.Printf("killPITree: kill %s: %v", pid, err) + } + } +} + +// listPIPids 列出所有跟 pi-web 相关的进程 PID(去重 + 排除自身)。 +// 用 ps + grep 而不是 pgrep,以兼容 macOS 默认 PATH 不带 /usr/bin 的情况。 +func listPIPids() []string { + out, err := runQuiet("ps", "-axo", "pid=,command=") + if err != nil { + log.Printf("listPIPids: ps err: %v", err) + return nil + } + seen := map[string]bool{} + var pids []string + self := os.Getpid() + for _, line := range strings.Split(out, "\n") { + line = strings.TrimSpace(line) + if line == "" { + continue + } + // 格式: "PID COMMAND..." + sp := strings.IndexByte(line, ' ') + if sp <= 0 { + continue + } + pidStr := line[:sp] + cmd := line[sp+1:] + // 跳过自身进程,免得自杀 + if pid, _ := strconv.Atoi(pidStr); pid == self { + continue + } + // 匹配规则: pi-web 启动的所有相关进程 + if isPIProcess(cmd) { + if !seen[pidStr] { + seen[pidStr] = true + pids = append(pids, pidStr) + } + } + } + return pids +} + +// isPIProcess 判断一条 ps command 是不是 pi-web 相关的进程。 +// pi-web 基于 Next.js,真正 listen 30141 的是 next-server 进程; +// 主进程 / Electron helper 用包名路径也能匹到。 +func isPIProcess(cmd string) bool { + matches := []string{ + "pi-web", // pi-web 任意引用(主进程、cli、helper) + "@agegr/pi-web", // npm 包路径 + ".pi/electron", // pi-web 内置 Electron runtime + "next-server", // Next.js server(实际 listen 端口的进程) + } + for _, m := range matches { + if strings.Contains(cmd, m) { + return true + } + } + return false +} + +func (a *App) CheckUpdate() UpdateInfo { + installed := "" + if p := lookPath("pi-web"); p != "" { + if v, err := runQuietTimeout(p, 5*time.Second, "--version"); err == nil { + installed = strings.TrimSpace(v) + } else { + log.Printf("CheckUpdate pi-web --version err: %v", err) + } + } + + latest, raw := latestVersionFromNPM(piPkg) + + info := UpdateInfo{ + Installed: installed, + Latest: latest, + Raw: raw, + } + if installed != "" && latest != "" && installed != latest { + info.HasUpdate = true + } + return info +} + +// latestVersionFromNPM 用 `npm view version` 取最新版。 +// 带 10 秒超时,带 stderr 捕获以便诊断。 +func latestVersionFromNPM(pkg string) (string, string) { + npmBin := lookPath("npm") + if npmBin == "" { + return "", "npm not found in PATH" + } + cmd := exec.Command(npmBin, "view", pkg, "version", "--registry=https://registry.npmjs.org/") + cmd.Env = buildChildEnv() + var stdout, stderr bytes.Buffer + cmd.Stdout = &stdout + cmd.Stderr = &stderr + + if err := cmd.Start(); err != nil { + return "", "start npm: " + err.Error() + } + + done := make(chan error, 1) + go func() { done <- cmd.Wait() }() + + select { + case err := <-done: + out := strings.TrimSpace(stdout.String()) + errMsg := strings.TrimSpace(stderr.String()) + if err != nil { + raw := errMsg + if raw == "" { + raw = err.Error() + } + return "", raw + } + // npm 输出可能带换行 / 警告,只取第一行 token + first := out + if i := strings.IndexAny(out, "\n\r"); i >= 0 { + first = strings.TrimSpace(out[:i]) + } + // 清理 npm 有时会附加的 @ 标签 + first = strings.TrimPrefix(first, "@") + return first, out + case <-time.After(15 * time.Second): + _ = cmd.Process.Kill() + <-done + return "", "npm view 超时(15s),请检查网络" + } +} + +// InstallPi runs `npm install -g @agegr/pi-web` and streams output via Wails events. +// Returns InstallResult once the command exits. +func (a *App) InstallPi() InstallResult { + return a.runNpmEvent("install", []string{"install", "-g", piPkg}, "pi:install:done") +} + +// UpdatePi runs `npm install -g @agegr/pi-web@latest` and streams output. +func (a *App) UpdatePi() InstallResult { + return a.runNpmEvent("update", []string{"install", "-g", piPkg + "@latest"}, "pi:update:done") +} + +func (a *App) runNpmEvent(phase string, args []string, doneEvent string) InstallResult { + npmBin := lookPath("npm") + if npmBin == "" { + errMsg := "找不到 npm(系统 PATH 和 /opt/homebrew/bin 都没找到)" + if a.ctx != nil { + wailsruntime.EventsEmit(a.ctx, "pi:"+phase+":log", "✗ "+errMsg+"\n") + wailsruntime.EventsEmit(a.ctx, doneEvent, InstallResult{Error: errMsg}) + } + return InstallResult{Error: errMsg} + } + if a.ctx != nil { + wailsruntime.EventsEmit(a.ctx, "pi:"+phase+":log", "▶ "+npmBin+" "+strings.Join(args, " ")+"\n") + } + + cmd := exec.Command(npmBin, args...) + cmd.Env = buildChildEnv() + stdout, err := cmd.StdoutPipe() + if err != nil { + return InstallResult{Error: err.Error()} + } + stderr, err := cmd.StderrPipe() + if err != nil { + return InstallResult{Error: err.Error()} + } + if err := cmd.Start(); err != nil { + return InstallResult{Error: "启动 npm 失败: " + err.Error()} + } + + var buf strings.Builder + var mu sync.Mutex + collect := func(line string) { + mu.Lock() + buf.WriteString(line) + buf.WriteString("\n") + mu.Unlock() + if a.ctx != nil { + wailsruntime.EventsEmit(a.ctx, "pi:"+phase+":log", line+"\n") + } + } + safeGo("scanStdout", func() { scanLines(stdout, collect) }) + safeGo("scanStderr", func() { scanLines(stderr, collect) }) + + waitErr := cmd.Wait() + mu.Lock() + out := buf.String() + mu.Unlock() + + res := InstallResult{Output: out} + if waitErr != nil { + res.Error = waitErr.Error() + } else { + res.OK = true + } + if a.ctx != nil { + wailsruntime.EventsEmit(a.ctx, doneEvent, res) + } + return res +} + +func scanLines(r io.Reader, fn func(string)) { + scanner := bufio.NewScanner(r) + scanner.Buffer(make([]byte, 64*1024), 1024*1024) + for scanner.Scan() { + fn(scanner.Text()) + } +} \ No newline at end of file diff --git a/build/README.md b/build/README.md new file mode 100644 index 0000000..e781eb5 --- /dev/null +++ b/build/README.md @@ -0,0 +1,35 @@ +# Build Directory + +The build directory is used to house all the build files and assets for your application. + +The structure is: + +* bin - Output directory +* darwin - macOS specific files +* windows - Windows specific files + +## Mac + +The `darwin` directory holds files specific to Mac builds. +These may be customised and used as part of the build. To return these files to the default state, simply delete them +and +build with `wails build`. + +The directory contains the following files: + +- `Info.plist` - the main plist file used for Mac builds. It is used when building using `wails build`. +- `Info.dev.plist` - same as the main plist file but used when building using `wails dev`. + +## Windows + +The `windows` directory contains the manifest and rc files used when building with `wails build`. +These may be customised for your application. To return these files to the default state, simply delete them and +build with `wails build`. + +- `icon.ico` - The icon used for the application. This is used when building with `wails build`. If you wish to + use a different icon, simply replace this file with your own. If it is missing, a new `icon.ico` file + will be created using the `appicon.png` file in the build directory. +- `installer/*` - The files used to create the Windows installer. These are used when building with `wails build`. +- `info.json` - Application details used for Windows builds. The data here will be used by the Windows installer, + as well as the application itself (right click the exe -> properties -> details) +- `wails.exe.manifest` - The main application manifest file. \ No newline at end of file diff --git a/build/appicon.png b/build/appicon.png new file mode 100644 index 0000000000000000000000000000000000000000..744693e00c5e87b536e15ff478eaebc58b924923 GIT binary patch literal 59603 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 z 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 + + + CFBundlePackageType + APPL + CFBundleName + {{.Info.ProductName}} + CFBundleExecutable + {{.OutputFilename}} + CFBundleIdentifier + com.wails.{{safeBundleID .Name}} + CFBundleVersion + {{.Info.ProductVersion}} + CFBundleGetInfoString + {{.Info.Comments}} + CFBundleShortVersionString + {{.Info.ProductVersion}} + CFBundleIconFile + iconfile + LSMinimumSystemVersion + 10.13.0 + NSHighResolutionCapable + true + NSHumanReadableCopyright + {{.Info.Copyright}} + {{if .Info.FileAssociations}} + CFBundleDocumentTypes + + {{range .Info.FileAssociations}} + + CFBundleTypeExtensions + + {{.Ext}} + + CFBundleTypeName + {{.Name}} + CFBundleTypeRole + {{.Role}} + CFBundleTypeIconFile + {{.IconName}} + + {{end}} + + {{end}} + {{if .Info.Protocols}} + CFBundleURLTypes + + {{range .Info.Protocols}} + + CFBundleURLName + com.wails.{{.Scheme}} + CFBundleURLSchemes + + {{.Scheme}} + + CFBundleTypeRole + {{.Role}} + + {{end}} + + {{end}} + + \ No newline at end of file diff --git a/build/iconfile.icns b/build/iconfile.icns new file mode 100644 index 0000000000000000000000000000000000000000..228670618b9ecc39dabe55d65be784981f3bbc13 GIT binary patch literal 141466 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 m^hm@Lk{q@{ZLXz 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

&v_Bht=#hue+ta^ zifJ@}L?{`K=WYkYv-sU9)!(WPB)Dt?N(c@=p8FQrY0#)68Rze<1Vhe=fV!Jhj^{20 zTIp1F?>{kwf)V8Kk>hx7Q!vRNcK*)hKkPgv$bY2sPiOzxJ^qZHf5y%q9QZR8{h8T+ zsvLh5r9XP-4-Wj%JO78(_(CMIzT_k6e^U8LVWd_^M;lnhpIz|Bs9Z`kj;gKakDE6Q z)mU)DwPP|0hMWW}rjs}6qkqor-zhPIYK|KxY_1A`^_zN&_L%jH1qd?#A^6|mVN-Z= zAqWJ@C1L>pjQrov&j!}ZlX^)LyyYc8wLv#jw3G{!Z0;fKMMXg%lDDBcT543Mm`(vv zR5z|G>j5Df@gP3|{G;yP-2wtIN>5D*RM5*Z4_qk2O>Q`7YJ&KIb8-+k1OXx?CIJp6 z-~dRbfcIFP4Ss3q+Vk&xNGaZw0 ziMYc0`IUKl|cT-U$-^N$ka7uBJI(kTls*GF^uAGrlt<68PSY)8q0L4P%kVjyw_5VbF~y6 zBFxUxA2L{598PY!b>nD0`2-}C>LAL@rsQ1FPJS*~;~{VR%Z+z77DyTxA)!tX<=cap zAb~qI+y%0kXGLnU0iu~qkKOsfInN`3eZL3i(d`&Zrl{9w^j2tZUp-}EHcq$ic}F4z zh~-jc-O&wg?fSWdtSoCXaPR28*(G*K3QdJFvxu7+XO~xoT3?lvh}X+szbTB(d#`C? z(zOJpm?Xf`6dJ!UHj8+P2Q`U{^M|t8{>!F3>cGaalEMq8hBHoc#Dr75PNrnOr$MI@ z6v?F$VwIssOKQUyl;LT>kx0?b;O0XJzkJRb`_ZVcuMh2enAiyq5n-hcL1Qr7cNtX; z1nChXjBiFqr51Jxb_HiUG!%*ph8OkdK6R5b>ULK zxeMe0p9^-c>D}6WXND0Hp{U1uULCFq3=~%qH6E^Pdi}IU|v%CEbghE9LDZ zd7LZ@0+VWus3pM)Jn72HO7`#~1<9I1^|*sJ-8tkdk&}zLr^U`;$K0NEb*bO=^|hER zZn2hDRM0Ho4vxLy069z2cSfqv;04DS8v|{jN4YcJej40tjkXGH=Q^@HF4CY9gBEW0 zHv<5!uld4Fu0)Do6@KJeXF~&p%DHJBO{przV3dt3)+pidXuk(MXfLnpJUrGW)MOwr z!pDz|COTL!r}VHB6cJF*j^k|#E+Y_plr9X1GE!U@shQwC^>{C>eR7<~?~9F%1k?JF z`&-3yJ8kVjWk?LEOFp#4@TBf8dlyq`0Vh)9FUgZOyz{9P8U=y3hRS_w^Ri$%$YoM# zQh}&RlGR-p9nb9Dukv3hNyMHv9+2BF6T8u`4(;NA1bQ9J&eaKlLW_tDf*~ZNWG7CZ zGU4)oyQ2_D7gH`SAn^TEYnn4!`s#3R_$|dBiQbY^ z7`P*mXe>C3@-zeE1*S`eTrL^XAncJYM4HSj^r@-X z6aB1g>>Os_DG@W8d_RSwEVT5M5%y@HA-3+`>Fk^)TKd}G8bD6V#Kk8jbwfi}-`w`L qtIxgQkkE&b|HQ<_1>z0r=a0 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 literal 0 HcmV?d00001 diff --git a/build/windows/info.json b/build/windows/info.json new file mode 100644 index 0000000..9727946 --- /dev/null +++ b/build/windows/info.json @@ -0,0 +1,15 @@ +{ + "fixed": { + "file_version": "{{.Info.ProductVersion}}" + }, + "info": { + "0000": { + "ProductVersion": "{{.Info.ProductVersion}}", + "CompanyName": "{{.Info.CompanyName}}", + "FileDescription": "{{.Info.ProductName}}", + "LegalCopyright": "{{.Info.Copyright}}", + "ProductName": "{{.Info.ProductName}}", + "Comments": "{{.Info.Comments}}" + } + } +} \ No newline at end of file diff --git a/frontend/README.md b/frontend/README.md new file mode 100644 index 0000000..f6e2123 --- /dev/null +++ b/frontend/README.md @@ -0,0 +1,8 @@ +# Vue 3 + Vite + +This template should help get you started developing with Vue 3 in Vite. The template uses Vue 3 ` + + \ No newline at end of file diff --git a/frontend/package-lock.json b/frontend/package-lock.json new file mode 100644 index 0000000..872eff9 --- /dev/null +++ b/frontend/package-lock.json @@ -0,0 +1,1392 @@ +{ + "name": "frontend", + "version": "0.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "frontend", + "version": "0.0.0", + "dependencies": { + "vue": "^3.5.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.29.7", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.29.8.tgz", + "integrity": "sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.8", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.29.8.tgz", + "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.28.2.tgz", + "integrity": "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.28.2.tgz", + "integrity": "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.28.2.tgz", + "integrity": "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.28.2.tgz", + "integrity": "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.28.2.tgz", + "integrity": "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.28.2.tgz", + "integrity": "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.2.tgz", + "integrity": "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.28.2.tgz", + "integrity": "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.28.2.tgz", + "integrity": "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.28.2.tgz", + "integrity": "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.28.2.tgz", + "integrity": "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.28.2.tgz", + "integrity": "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.28.2.tgz", + "integrity": "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.28.2.tgz", + "integrity": "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.28.2.tgz", + "integrity": "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.28.2.tgz", + "integrity": "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.28.2.tgz", + "integrity": "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.2.tgz", + "integrity": "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.28.2.tgz", + "integrity": "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.2.tgz", + "integrity": "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.28.2.tgz", + "integrity": "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.2.tgz", + "integrity": "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.28.2.tgz", + "integrity": "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.28.2.tgz", + "integrity": "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.28.2.tgz", + "integrity": "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.28.2", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.28.2.tgz", + "integrity": "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz", + "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==", + "license": "MIT" + }, + "node_modules/@napi-rs/lzma-linux-x64-gnu": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/@napi-rs/lzma-linux-x64-gnu/-/lzma-linux-x64-gnu-1.5.1.tgz", + "integrity": "sha512-oTXEIha4SsuXdTA4Iyskj0kpdx2yVXdhd75c2v3xGrHFfVMsbhTPZU/nMPL4sWKo4pBHm3aucLaqGlF696dTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": "^22.20 || ^24.12 || >=25" + } + }, + "node_modules/@rolldown/pluginutils": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", + "dev": true, + "license": "MIT" + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.2.tgz", + "integrity": "sha512-Xa6RDoWa+hNiX6PgsljlH6W75RaONx3y6PVlbLhkEWW+GaPQ3dP5gwbL/erAzQHWwkvW5UxdD5l87Qx2FAQ/4A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.2.tgz", + "integrity": "sha512-vNASxsghMfQ5s+v3PrpnJd+ryL/26lxCCaGI+sDJ7VzmHiYXIrrVltsDhaawxLM1WcoMU2oYlbPHLaYQtBzhcg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.2.tgz", + "integrity": "sha512-0dWDjmlrpZAgjPD/aPzUDhBW8APLRjAni5bOrM76wiiZm+E+KTMVKNhAzaTBohz8UyO2fKNAl0+fygbe2HZXOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.2.tgz", + "integrity": "sha512-N58uktcwzk3+qT4KHEuNdIxX1N01RWrkfVoml69EAbSaNDL+sbNVLx2RMl4Qd23lpA0fgPvyh5hHb4weD5WKmg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.2.tgz", + "integrity": "sha512-HWF2zH8EAp2scWRpt2PGe6iUGz7zi04waXsdRr3zb4DWCk2ImIo5FZu0jjmD53nP/DGSvnW0e7/1ToCNZs2lZw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.2.tgz", + "integrity": "sha512-MkvcwHMnzPSMOQEwB6wHnLzmc+hT8BGc5bW/Mhmjjgx3wbj6VBnlc47XsK74kD0K9MikFfXpQqyz4NUXaUW62A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.2.tgz", + "integrity": "sha512-xe1bCKPJaKsD0tfd7Rb6bGfUogJTpKbTEEthsfdb7hTfTRNJVQTdirabQx0o6ERVba/smkM720soMY+0QnrlSQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.2.tgz", + "integrity": "sha512-yOM7LdK0p6gk6+Q773OEwtlsikT1TL3yMmYsTtRlDRPha5vV2DC5x7LqRWDr6f3cSYNMKVqxzffXv8ivxNBIFQ==", + "cpu": [ + "arm" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.2.tgz", + "integrity": "sha512-qiWuJJV3DybA2IfzvRimeKXGrGuVPv1zobSY/26KnP3HbV0VcNb3ECzgvtbvF3xjSMkcooou6HASXZuLdjnhpQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.2.tgz", + "integrity": "sha512-akcZquRzCY/KpUoZAMBhGf7oi4LmXq1BzRA5CPAC3rkUf28Y/sAYV3jSL+JKd7cwEyFvR5G0XVZ0gaMedP+60A==", + "cpu": [ + "arm64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.2.tgz", + "integrity": "sha512-fNwYHrPyYyxauPzX/cpYw8Z7LQpp+DGA0KCoswA0aVFBpmdMil9XgjB8V3Ny64Ihu797+GKcuJqnsOKEmor7fA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.2.tgz", + "integrity": "sha512-XfvsgzR7DZqREdst7K1Mj3ilSUM5xLAHJcIMDFPKdxTs9q5VHOT8aMA+a683fqBu7DQl8+Sd9HCsQYL8EMY9qA==", + "cpu": [ + "loong64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.2.tgz", + "integrity": "sha512-Pp7gVZggEFlbcuztay+/U0gVG9S1XAh8i7I1Re/htbAzo43P5wHZHw6pTyzotISqlKohoh9RpIfnOz3RbemK1w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.2.tgz", + "integrity": "sha512-zkgL2xff6i7u5hau/m6FGeS8gRkLEdgLw522WGmdWWlLd9btmNl3S80mcEjtGq+kvgUekQ3+BOYLLLcPlS2LIA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.2.tgz", + "integrity": "sha512-qOheJomrkVCbbHFJ7L3J97cnhfogKqguAQphv26+3ZsAQIF1L19b+dArl//s8rjJHJLz9byykyM8NBP4nmSa1g==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.2.tgz", + "integrity": "sha512-XlxLD54wQhH3FciCgMofxBw27NzUe818gJH410qWvc41UT0ZFcgxVjyX5/EK8MPTupjeVWqN5oy+9pCA9mqfCA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.2.tgz", + "integrity": "sha512-vdryWeRb2bLJZf0Fv/W8se6nvsHe2PkTCxV0meheK3nQE+G90VCJcke51Miy1yQRsfm2uqIyjXOu4wmUzbTtkQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.2.tgz", + "integrity": "sha512-bcq2h2pkKmH2po4cZV8VWzO4lL40STyu/nLoFpYMQp9C2tCVNTdcVv86MwSsn3D5s1FBe2Ty1atqvVAUTMimNg==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "glibc" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.2.tgz", + "integrity": "sha512-EGoo5DMVMRkTId8fuTDaoxVlR5ZTsKULUezRjd9gCw5eeY+DjCvDpZAOlNUvKPGX+7rS1RWx6j+yOpNPx0cUgQ==", + "cpu": [ + "x64" + ], + "dev": true, + "libc": [ + "musl" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.2.tgz", + "integrity": "sha512-MErl12k7BFHZG1TI9QF/3lSSZARzq9KgNy/FjnqFMCkv+N4RSSzoUCA5h2mqHX4Mox3WaTVKblyzhQ1zRb2ZuQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.2.tgz", + "integrity": "sha512-ILs8k07Wh4p0PsNY4wYLEaXZKMOpVhrG5QDB0yHhGhuzOfDlnyHN6sflL4El/MpUP1y8uY2lUZrv4oBS6pTT3g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.2.tgz", + "integrity": "sha512-hKgB3nz/TKD3Wv78XEsyXzQsNjvhOHmwKQTvXADGOyU/cIClZDO7DsoggbdmJDPGp5V80tA3Vfv61PaKTLH3LA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.2.tgz", + "integrity": "sha512-T4wf1mudIDxN8Q/CWIBJC1u5gQUc+r5mPvlwoSbIvNkyVTP2TAFeobEmst5AQ4gMyAz4sSByVdoTDfvTmGK/8g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.2.tgz", + "integrity": "sha512-tC3IY7qoaD9Ll3/8WJQn49j5V2f/NuI9S41NOE2iM5MPs3sPIvOkVToLcz/7Bz4pyF7PSvrtwu8I/pUrGOSecQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.2.tgz", + "integrity": "sha512-6NHnk/K3eq2ZFYcU1X8g67s9qIJRCOTT92gwLMVBp08dB2uuuwI1/Q/empzL2Bfr2f2WRLJVwpp90RmacQyFkw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@types/estree": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "6.0.9", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-6.0.9.tgz", + "integrity": "sha512-rD/MORlhaZMlXWW0rEn4FB4wMinWC0z/D7Ye160S5+Rs1mC8ZDAdcDp4SjKfUhG5t8q1ktcPVw4xuTkPRlzrSA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rolldown/pluginutils": "^1.0.1" + }, + "engines": { + "node": "^20.19.0 || >=22.12.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.42.tgz", + "integrity": "sha512-2Ye1ilMtKXxl8qZUrQ5j0CdgenFp/HFQmta6rfRyfEsTG69L6Wk+tWuNoHYHMx9E8tF2Slvdg1FuwDvAXdy1LQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.42", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.42.tgz", + "integrity": "sha512-qbhQZEFmycr+ni/qyuccS4sucNN7VAbDfbkvNxWOX2VfgFm90MNs3/UhRNKoPMEIVn0F8gdlYjLPvqxHwHeQOA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.42.tgz", + "integrity": "sha512-fkCAFB4okcAANGMThboWnScp/gzWjU0ZSkVnjTIiplmMDq2uq0tIB3j+xVu4rhv5rvOgBySCysudmbMd6xRRqw==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.42", + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-ssr": "3.5.42", + "@vue/shared": "3.5.42", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.19", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.42.tgz", + "integrity": "sha512-xmLk3wLkbizPAiLyomjgFFosf2ys9b5Ghb+oh/k2tnvipNz8OFrQOiTcWCzyK7MpBp9KkyGtfvgfLUivbmuGYA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.42.tgz", + "integrity": "sha512-TzNNfKpb7hDxbQltwAut8VDQA5YP+BuRlxntHUuRjyKwlMvmAPbs3unhCvieijifY6vFfVBwsS7wG/C7uq+bEQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.42.tgz", + "integrity": "sha512-9uACtuHs7vJGkm5Bp3xu4xRDLFTIYy5DgxpToVjqGIAhAEKwQfsaLvKINhM6nFVp6bZPRFGdDqd1g52MqKsotA==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.42.tgz", + "integrity": "sha512-rsCmhiWLaRxGltLwhlCWyYkFn7WAbKRh0q17eZ1A6Dq6eqc2ACQ61IIryxz0LrsvCzHSilLA9JHovVwM8CNE2g==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.42", + "@vue/runtime-core": "3.5.42", + "@vue/shared": "3.5.42", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.42.tgz", + "integrity": "sha512-2++5dUyYS4gvo7xQXSECUDhB7TS0aOl5SeVfC5qSq1Jgfhjvegw1zqhwTIR3imZ+QYPJQw9gfcFvXGAjGZ7ajQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/shared": "3.5.42" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.42.tgz", + "integrity": "sha512-2rPxex1jQf4jvl9MOHl6YaXCPcrNqz/FstMOEh3QWY+/OME9nQTvl9WYeCwhW7AFjaR0SnngZGlp/wkR6rkI6g==", + "license": "MIT" + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.28.2", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.28.2.tgz", + "integrity": "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.28.2", + "@esbuild/android-arm": "0.28.2", + "@esbuild/android-arm64": "0.28.2", + "@esbuild/android-x64": "0.28.2", + "@esbuild/darwin-arm64": "0.28.2", + "@esbuild/darwin-x64": "0.28.2", + "@esbuild/freebsd-arm64": "0.28.2", + "@esbuild/freebsd-x64": "0.28.2", + "@esbuild/linux-arm": "0.28.2", + "@esbuild/linux-arm64": "0.28.2", + "@esbuild/linux-ia32": "0.28.2", + "@esbuild/linux-loong64": "0.28.2", + "@esbuild/linux-mips64el": "0.28.2", + "@esbuild/linux-ppc64": "0.28.2", + "@esbuild/linux-riscv64": "0.28.2", + "@esbuild/linux-s390x": "0.28.2", + "@esbuild/linux-x64": "0.28.2", + "@esbuild/netbsd-arm64": "0.28.2", + "@esbuild/netbsd-x64": "0.28.2", + "@esbuild/openbsd-arm64": "0.28.2", + "@esbuild/openbsd-x64": "0.28.2", + "@esbuild/openharmony-arm64": "0.28.2", + "@esbuild/sunos-x64": "0.28.2", + "@esbuild/win32-arm64": "0.28.2", + "@esbuild/win32-ia32": "0.28.2", + "@esbuild/win32-x64": "0.28.2" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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.npmmirror.com/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/nanoid": { + "version": "3.3.19", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.19.tgz", + "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==", + "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/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/postcss": { + "version": "8.5.28", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.28.tgz", + "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==", + "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.18", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/rollup": { + "version": "4.63.2", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.63.2.tgz", + "integrity": "sha512-l5eyksV4tPBj6lJyEa37YzIOCSOV7lkZzEHUdpjWZbtD7wTcFYmEYXSgm5bT4vV+dZLb9rBG1W9GROOG4NS4Ew==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.9" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@napi-rs/lzma-linux-x64-gnu": "1.5.1", + "@rollup/rollup-android-arm-eabi": "4.63.2", + "@rollup/rollup-android-arm64": "4.63.2", + "@rollup/rollup-darwin-arm64": "4.63.2", + "@rollup/rollup-darwin-x64": "4.63.2", + "@rollup/rollup-freebsd-arm64": "4.63.2", + "@rollup/rollup-freebsd-x64": "4.63.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.63.2", + "@rollup/rollup-linux-arm-musleabihf": "4.63.2", + "@rollup/rollup-linux-arm64-gnu": "4.63.2", + "@rollup/rollup-linux-arm64-musl": "4.63.2", + "@rollup/rollup-linux-loong64-gnu": "4.63.2", + "@rollup/rollup-linux-loong64-musl": "4.63.2", + "@rollup/rollup-linux-ppc64-gnu": "4.63.2", + "@rollup/rollup-linux-ppc64-musl": "4.63.2", + "@rollup/rollup-linux-riscv64-gnu": "4.63.2", + "@rollup/rollup-linux-riscv64-musl": "4.63.2", + "@rollup/rollup-linux-s390x-gnu": "4.63.2", + "@rollup/rollup-linux-x64-gnu": "4.63.2", + "@rollup/rollup-linux-x64-musl": "4.63.2", + "@rollup/rollup-openbsd-x64": "4.63.2", + "@rollup/rollup-openharmony-arm64": "4.63.2", + "@rollup/rollup-win32-arm64-msvc": "4.63.2", + "@rollup/rollup-win32-ia32-msvc": "4.63.2", + "@rollup/rollup-win32-x64-gnu": "4.63.2", + "@rollup/rollup-win32-x64-msvc": "4.63.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/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.17", + "resolved": "https://registry.npmmirror.com/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.4" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/vite": { + "version": "7.3.6", + "resolved": "https://registry.npmmirror.com/vite/-/vite-7.3.6.tgz", + "integrity": "sha512-4XP60spRGjSZFf1qYH+dJIkK2znL3zQfl9KkOV9MkkRR/3Dls0dxaBsQPTloEc5BLXWPL9vsOxopxyKoMmDueg==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.27.0 || ^0.28.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/vue": { + "version": "3.5.42", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.42.tgz", + "integrity": "sha512-4RyHQTbQvOPs3MfvUO1Sg0YRrKNnA0mAVtvpd12Tg1fKDN7OHBUl1IqSn8zGJjK9nI3NkNp8cgTpVrSZC5TTcA==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.42", + "@vue/compiler-sfc": "3.5.42", + "@vue/runtime-dom": "3.5.42", + "@vue/server-renderer": "3.5.42", + "@vue/shared": "3.5.42" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + } + } +} diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..a34ac1f --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,18 @@ +{ + "name": "frontend", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "vue": "^3.5.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^6.0.0", + "vite": "^7.0.0" + } +} \ No newline at end of file diff --git a/frontend/package.json.md5 b/frontend/package.json.md5 new file mode 100755 index 0000000..96e6058 --- /dev/null +++ b/frontend/package.json.md5 @@ -0,0 +1 @@ +71e741a4044d4a0f11cff668ef3f7ad4 \ No newline at end of file diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..856478a --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,1011 @@ + + + + + \ No newline at end of file diff --git a/frontend/src/assets/fonts/OFL.txt b/frontend/src/assets/fonts/OFL.txt new file mode 100644 index 0000000..9cac04c --- /dev/null +++ b/frontend/src/assets/fonts/OFL.txt @@ -0,0 +1,93 @@ +Copyright 2016 The Nunito Project Authors (contact@sansoxygen.com), + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 b/frontend/src/assets/fonts/nunito-v16-latin-regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..2f9cc5964455b8f5ca989db989250dbebb1a5f66 GIT binary patch literal 18972 zcmV)5K*_&%Pew8T0RR9107@JH5dZ)H0ISRZ07<$40RR9100000000000000000000 z0000QY#X>z9ECmxU;u>z2!SLCpDhsx3W3sKfwU(Jgd_j~HUcCAh%y8q1%ws{iAoHC zRvSN=2iP`^2p)6?;Ji~-^*q_Q18^QBKOfSSnZZDJ;9gNyy+ZN-e@22Bhg7jE*%*Fr z;t>JRB6~{SPnT$8zN6EZ<+^VX*{O49PnJn~vdvmU?7Uxr29zlDrCd3;%zlhT*+g>}pPB=nH9!DtR>6vmG5 z`tPw?FLX+#LA^y_<1$9Fa`M{q{AoYuz8e+_TEC`FC8S$2SPN|z{4z7ZZ?i|I3_(D# z2n8Pbs89im$Vn?;%n4Ru&CP`|SGv$e|IJ#ZuKRLPcYnLvx$0ZoT>0PY{5np8_5s%1z}8i|te zl34$F-RjSMnis)>2MMCVMwHos5notQsueH4)~;2tMfs_!K`pEI1QAFG|3V_1Lt2E# zXewZIBHId-apj_Pa5?jLNk5W|;b@srn&A_8+mbQ|giUI70~bC%jW z8|q?P_7jd@BN)j>j!`}~IKV@H#hau=n-7Zm$&YQ;&l`i%kj6JDqsIZE$_h0h-B~BgDhPlYX z0J}PtsA@!gZG}{|vDdE*w)kS&5@Z#<*1zs;{~^|{qw$Cci3kZ15eawx&mX?Fd*tRq zq%_4C=lt4f9m|+HEbcxhUm=`uqU$!M9ewQ2jfi8zPKdOxBnV>UY}@&99juDmc%GCQjj;$eOps(5TrYlT9_vbaTwJ$6?2vaN2p--8AB!`yL>TY&pqeuZkH{tyZ0S z4Gfwz8(=iAc#fSL^4u~?({og%TCFl~?`tKR%qXa%Gmc`kNXRas2FSOQd6|(0!+dPBbV8YG z7W2R;I=df_Zto52zZpn?T;-`ca>GVY$dbzh&vPczz{;M0b9zlaVF(aGKDKc$4To6y zB$RNeWGiEc*HIARnh4lcMN8HVog$jE;c^8 zXz#zSd*}y1;<&Egn7`5_6o%| z0q_Q$B&tJp(iCuL9y>EIhO90iiOj6>?Qti2Giavj5UNWQahFxb`*5JWNLW4HrB_aYU=Q@zs|@^aPsimdUs{Hnv4bpB+{+e$<}kKd2HcAS^a)-*Q`roMD_SUu$_Y=a~Ml_olRu@wdAGWv)N@7G+)$h#M zh0Kk#hE&cyDg&%>ua}HjY3sX_W7CK2R0Z1AzR(2cf+imbq|DRBmXELAD~f#jn%+kl z+{g{k-Ew@Z<+eM41y%b#T((!Jaq~+D!AwkFM1#WoS{~bO3JWbj&}V(Pek;HGRUaFJ zV`2E!D#jY*n%j|kZdes8FQamLDuBx#HEB=09HhsUsj$$!3&1&5GB!C)%l7nK7tJae zk)KMxJ(Y=EAYyI(}!yarqksJEVJ)c49hbe8n+ zVD-Hz8zCa!YF3)SN0OD*tV3bkt`}#vstaGEz$HU_@im4;rY00E=saIIHZ#&%rl^tw zl&VdAEA~ly>o!7?nMmN?La@uaFlBuRT$I!d33ZUa559cT4nEPl$(< z*k4JTN_!JWcL;v8T+V%13ZBi}7)_kI=ErWj?Q6lw8y=gFrAqM%j|A_z6g>xY@780_ z3cRHxZK}nYr(5Qhf6WaY^@uM_E9HBQjHx`Kind}j`m2^_lp>b75K@X;)GEN*606jJ z_5}4T6+)cRxXmvLwkc`0x24y!s%z-N^Aoel9iYjNfEe4%Nt+NAOAJ94gwfH_bX|-I z%oht_SV={N8m}&(&{U-)04+6$^;^7(**J6T7wA@DWd)S8A>Gd{lYZH0Hh_&+Q5Cl1 zYiI5h|EcWD;;XOJwOtv#*193IZ-U54R8TPL3B0`)%@rA@VyWonxEizpi*VcO9n`;E z4A~w0Vn~+8MxTQ3!Vhx?gsj#+WPI{2UmQBC4f$yFl5Q9Y3>yv<&$6CmCGZ=&$1wjj zjjBUE26dhn0a|+NrA+(*yxMW^wWv%UV4q_A}B z(l?eB$&1XSk1Ko3ThGvKg8N1xAiZli98U?9ThW z#Z17Vb?2t4-u10B^%v58J1t!_*km-)QWT`8z+UUCLHoIxW7Gs{b-RC}c!k4~w(zkxG z10lZ{`!OUD!VRcf@|-DL35PrdQ8zjXrX-Rj;YbyGS~dV4{fX>evKLPZ7?NT%*Kv%r z5Cvx7?HnEy5V=qcXG)syD1tLvk(>Z}p&Zatx{l|u-i0U5504Ezx^e^H4uRjfyBN{J zg>m2@9uO)H;Cl}auD z@sYK*961rr)E~*_CA(m>@VvD+8qy&AG8sPR2^|U}5#sSGlxVlt4ywcTRS7r@0U8>` zb@*~GTY?Fv06xb%(F+kMK;vIK9N;Gm;LepD*NP?G$xs!&dEE;&9(!0%#*H9C5Pva> zI-#?M7>3@L(p;bZt%#IZ+WC=(w zUVinmaWZ1A)mThO`Y(DLAmd(ne3SyXWg9& z^Yq5DK!0`@AQAu!!c{5)`q!J68IVN8xdQA&N;a1@V6BWA+4;S_cfUf& z-^oAIAzjjadQR`@NBTpaOg;_h?x*{;egFVFq9`f$N0hT}#b5O!?b7L)Eb05drb&1N zr~$wV0Pz3*YF>@&i+^AEdq)61d||fZ7V{GP&H3x+dzbH>gAf3S15|kv=uOMf3qVim z@&5rYIO92&z3vNNdERw5T=I?+#vFIWNvC||10Oo)OGL?r9S16E8d{#bc=I9B(F+qU zLZm415+q8JV#HOWK65WXnmqXm6{}FGO0`B!nzd-vuHT>`!%WO3nQV%wX1M8RM||Q% zXT9o8uX)Qap0h&!H{Vk}b=!B5;0GT&;9vsqxvyOa6#Fgkw4;tV<~%8elar89u;s#$ z6K5V=xp8ODS0F$Bf(3X_kT}s|#7Y**C`-BwIWlF-RiIpnQe_Npl=x?{B5k^L=+vvr z`+7`dG2R5z445uNpWnQ9!4vmA^vDAcHGyQ~b@d%uk8u> zM^|9ZU0Ko@N%TrHtdYE=vZ!uTWx151`MIH)+~17nd&;ghUYfeoZ8wCYd5 z_@+*9Ef`Z*KpfReR#!)>P%B@PT74NCY&yP1l{!|XufAbD29ETxDYMFsmWVnYkfHYG zB*|LUY6TU9|7-rPq7P+PJ!W|ZwXWsNlrx7PwXYZcslnZ&cf_20?DCs-uMGuEx&mEi zNv27g$cdf&UqdJ4e@QCD7FL&`LE2o~Cfj*y%)mW>Ik?P$6AkQ+gj8+ew93rNu4^PD zx0M=Fj;3k~XFx$%Fkle#O(08FCWZuM1mRp!N}4t8OIE@11tH~NC61w@Zh8``L8ppD zFla{vfnW2Gah`2Sj7aCT^v|?0xIUAeGUxB=h_(ahLEEy;DdQ=1k<*9xicH3>5?>44<&wx6ULL{ z+A2`sW(mSs?T~LIRK(oJcwS7!e0cM?<-wiJsXAJYXC#H@EFhAT7=~4I>UBs<)^pcV zurv>4j5q?TTgPkjWQ+u|O$g%LG82EAW43AG5}ZK7q*M};#^x@mAtd*W1W8)*&y6tq z2;XH2+i!FbrK-6NugrCw_yrlIqjX zS_V;2m%Y(QSw$IQR>8B7u_Alf%r{{u8i|xrX&~t@4@yG1CBm;^{FZSwSp*DL1j%Vc z@){!rjgz7#NT5kl(iACcnp8B4R5ddZfs0TB6>q=M)p7#5?-_G#ABc2kW0e~ZyW6p+ zk6VZcYXR(DP;&l&ECdp2V4w~L8epIa23laC4F)=3pbG|iV4x4CG6F5&mW=BynlYtZ zm1$fUL9oa)>pp*WG$p^FiuhrXL%q z?naarELqtEz3_j03lUpled7QWJc?euM+}`o0GuxIOxV;6;E&5TXo1#2sLQ z4HdrY;EIC7%CR3=q6NRZj4;hmVs$r^p3n&h&xz&e`LR9~rY#h_8nqRTqT6Yk@}ckEM@Xgf`-J> zZR)$6>4X+oio}B??_434QcmmGyn5mp3irSlxEj+c}FP{MW!R_6rz%=-9D^%Kh`dx*4pqOAX zhqHAIRcR|q|Bi$EDn+31Qsco(l<>?Z_nsrz4Nl>?Bm2KtujK-;0-1fgz%xQt&89To z;^GLimDJQPwcNHTc`ie$MuJzZ!RB8p(dV_1X2-Ul&-K+C1ZZs)JHB??Sl@eK@h1#r zObM;|Mv}5MD+IuGt|wo)CqyafBO?JsyAWdm#0Mn<69FW<5L1DB(>RqNn!t>KY&T-g zKz>LHV8KAK8?j_G${SM`DuoHvF2q^@^+CzVMgYw#l$_Kw=nDPGX+M(i2QJ}WQ| z3=F#wN5-8og3LTNCrhhv*Eprun8m(0(XY+lPe@`RY$>qXmSvmkXmJy*#+H>{xhub7 zFK`ezZp(h!&l%ZI#Br&jhe&8w>41X zrKpo%U$Yd_7*&B)2G7^(G22|pZ-H+Z@H&|?8oU9bm|KqFrQeYi)R~m#sMF%w08QF& zd_bnJ=7+%4JoN{vkZuI8=AaB;dqHXIo7TE4N1M8NA9-@th58x);BPMZ zC&hl{=!Os^wZ_^n6bkqkzc)3i8_P>)!h(1=k8ucuGo*-oonkpKWv!0tBKZgx125S} zmt+1zmbVH8CyERLD3Nkq`HxJiN+PB8SD zl0);{VLRaz(dm1cVLC;Ra1?17An`(DN>= zJCe(g?gDq1TgV*ZEl*2?ZH#*bd{TcXpJnkNsN=xMxsHUzP7{;{B;bKXd2mXVtgR3& zx(bj%l|c)OE!QC%Mo~yeuGW^IA`FK>Ha^wrwzu4sN?f#I86huB>vMCka)@gbatVrb zy|V|sMNA{Kun6%$b`YvO93rcWL&a0@-A-$K0hdyW&o0T+M`sDrkq)E4B0^-3!>mCh zdg0A+q;HuJE^#(+lpqyTIAvk!bb7QR7ddX~fvWf^=#KyQD&*>bXk`8O6*UZdEz^;| zD>ws-{kd%2&(yYlN6D%ZIfM4f=sUgT%pGJ^C`cC+MJ>C9ac7sp8zWRukmb}~Q!B09 z3}w|@o#GVF>MW9qOa(+aRiYH})$?#!G;{(SEB`0|&BzK%*&*#Mfvo)ZfkeKQIs$D4 zFU~fQ61ZrPmj7s8*udZXZ1S6ZRG=W4=_>twy^q}}C^+)z-c^90X&4omx_wG_TvN(A zI>TZvaqf~sm(uLx;i^ZS-G=X`l+H2s*spV4YO`^TdYz&%yU#Vp3R6+K?pCW+D-?wc zaTUa~3Hb~|N?QIe@efMkURlZ~T)0B07%x^uR%$3MJ!L2{h3{f?1bA>N(_Wt*$ThVC7cSG%X@uU3e1PBtjB<1p;oH_ zz#xypTbR})8mk&cNq(lBq*{(24x@Q-9$gWSi&82wv#Gtv9`OnONTTYN9>WF04D!QS zUU8E|yO@`IPS#=|YRctRJKcMvEh=itZ`TUlsGkx(n{ay{&m7Q+A9f&a#Ok~qYk{7gw zZ@l-5KKjiVA+M($f3}N5{yTMpNqCL;*7o)~$f;cM=qm}vvtbh=?g-L?FEFgATe)Y% za;d>|eQT`jmZ@o=ly!vrhsMM5<#*|$(A2(f4>y!>E(|e z<<0l&e{-Y0_*Jx>pSJbpvnN?~3S?oeUQa19av?&}a6zL!wp6=EMj8nWR?BT)?D z3Lq62{a=zR(=#b|=`oiHp=+r(jyXrd)tI}+HW?3y&j%U%{CNjiRrpGkmryqU|?J`7hezppqwn2Mpj?V$2n-+u6 zVmR6f&Ui!enj4K$o|VQW|6ems;;G_}_tJP8ONPp!m%71AkGDgXj77SDYTbO_I&Een z%9?ED^np@}swwtX2Oy$1^hg%S8d*(!#v%b$E}SI~5}^bKbS=V^=bW?9n0|Q~tR&a1 z_X{7>IrFlAD{*#{rPrmq3+p01s8i~&Po^3V8M?Elh4}WE$H*hL%b%IEVMf0*vsDx# zt)JTxoSM96h9mqBGO|+S3bkJ>gjXY!uk_G2>TFwkmIIl*fh-+DxJWBFr=U>PtW8~6 zKuW!Td+qBY))a<$Fk`Jsa_XpZXn7o*Ty?*BG%q}li#?x1)m;81fps(6j}eYOHHd3B zg+BfDKU-6oCoav^Qq5Qd)dU9rl7fV@FX%kFJd}t%T zBB$vLd{&KMVv0TAStAjJw)y#v*HvbsH}^R@x>_~2wlF6@%;-zve5_drk!GIjwh*j4 z;=hip*C2DRi)mx{Gqs-JaV!A4xpxgIA8qEe<=2x~G4bsJQb|zL3vxHoJC1WF`qEJ8 zHYvQAM zsrxs9aGL>W`jiMa8J8&79efL#l1E7M%wK=MT1_L7%F#)7b}o|h8qcenRWTD)Lzihv zaw&j0`rS;R=Mbf1es&d5SiMmRe(88nCRwip;Y$yuc0VaUPCyjv_xEwA;XRwCjAaTtu!k+;pd9CK(Tbd7un>SXHF|z80uEEV%5YA4@Jv8n(1*m2y@Uq zBdsYn3Zg4g3$-vrR$zGZH?X~UbRfG0Nh~#km4>x27+C|EOkcqYWEgI>=-y)W5hhTp zR}l@D*1j-!Z+NDpn`4L{v;cTBt()7-c+Z?SJs$=~Nf&p&;dRkRCNe%({$`~8CY)d{ z7$PlL+%vut;%K32b~FVY(2mb@K2KxXW>ipfM|HV>g>Qf1Z|l`Db3RrzEDAVX{NFh` ztY%YR7L3|?mUVki9*IkbBV)+at~ZJDo)NsQfa9s7EcknLCfR(!%V3Cglr)ViClpv| zS~2%{L!*b9)kQT7Qp1|Em?_$zdC7tcPcYQ?JG~q*;OJsGA%)mvn@3P8SV{jJ zWO9qRqTz`>6Z1sea4y>b#gaB*>fQtBwuXqhO+T<0r%$=epSJ8hv~*>ubY&@PdF)@q zZBw2QFViVh`h3a1T9%lQ@Gau1@_}07;+zS+(^4jtTrZ)fmo(4h@k)8Tm(@*Pk0QyT z{!QyrPiQXm-3T1JcIjrK2+!RSf=qGL>a=5x4P87e7tP2bM=k0y! zgv5W?EEapjlkIf{H(^c@&o3@eCuqVGHijkB%#zIi2x#-qE?FSR0o&P}S|{fjMh1<> z09v37uoYy4aa#f(2Rv?x4X00WnX>1yLbnO~iG{`h6 z18Bnk)-YmN%obQdPnNac@3-{#cnXVHskKijwGB8?fw6Atiq6id%j^6!q;u}nmAnDz zDb-VJ(&OZ|zfbxWne^R0m8fftZ;iwg(gOMMG_ct(>nB&26i=?HKlg!Cd}Muh&-x?0 z)*u#VB8Lq!C!DWqt}ZTauBkiU$Qe00*wa0DG`oK0o&`Ig1IiMt1+udb)LyZBJXIeS zdv@}}VqCZHOnHGdv(SS23zkkvn2Sl}6@8jL$KrDf1d6=Cmrx&>!Yo%keF4oWz!AOcriZhn7YaMS3$$ zNvYY5B9OZ{bl+#tsEjBEmBzU5=FqBO^ST!=m{Y!gs*XP|UHG$u%?8HE=OICVzXFK z7MJxT?J5+9XJ3xK6s^Ev-#>h!WOC_l5~QY+HHk^1GKa`$eqE2YOty$^6-`S{cPfb_$9R;M%<51-g-IO- z_SlB6rVvvNGMX;D@J9Q1zrpGB+@s_9wfQwI{xJlKE-1t4u@ZIR?`y6^T4FpnPI`69 zHd&rB;fT`afa-xjgU-IYB_-XZ#!?*Pk=wj`D^xJKM{Jg|L6AL-1+rMkaUPLO zS}oFAZ;C^yb$D}f9r;?VBR@CC;Z4QCOy#MvdQ0Q>K{9t{S;RNfS6t;H&>^(L$2Zc#dlmCR`_2c_fPV&(>6Iy=}WM!M}mm!;|o{VjeHHGPcJt@Bm2>(!`{NKo%EgcrxL2DBr>&XCfh+d8efF%dScvPe*Um6 zg4wgwZOM|#HNF&SmC-1z@+E2H9+6qf0zp=PZH<3Yh~AO!xYz`}4%C76{JI8cs_$^f zR5v$a$H`DO$YPJxS``|rQ}>Q7YRHKfi{j%&Vrf3eUBv-eoK;*~L(oEns7VYG_JkP0 zxAArh3$*fUk=@x}#^<=CVaNX{0oE zFk`wqWwSswO!F!s zNtdC2^P4MKTb0LD4!%GZPz>9(zN>gOD77N3o-k>jAz*wpd5&Pt=i0i!yTU_dA zm#TI4D!bO)I}*|}*~>20Xi~jCN$}X?-6Q#xv6U~2vO|9DmqozzB@VDSb-kt_WyQv# zRJFId#ZRK>f}9y{3t1iZp;u(=aaBnxH~Laik7(0fP~GCqq;s5@va4?$XgCbA+$<)G zB~AB;Lv1zYiyqxHAeBcs!sS!hyucF1;=jKFA#TTo~Y%Y#1 z`agtdfOG9CQMQIAGof=Z-&Dy`O}QCd4C8pPF&x?uC&+*y3g^<}J`C8f--V=*^Uu0) zz$1>qlwrA0{OfVdKXFQ>Jxixx#4h1AM&ch1nPXI%cvYc|gMztTIqo01O;xUGKxKJD zOD{QW`6M4rh*$w{I~E?=F*saO_6fG@RA{WGB2*T6s>P{$r?R_#HWOqEDxG{D?7CZ! zxEs2C$?|YQ>~G6!SJwLC!eidf+PU;2^z!ck_p>!lSwHM;P$JuK<|@NQi$#A&X%Ei41@{VbWYI z?2h8VU2(rGL2=6tLJ

vA-?EtQIXD2v@liY&lje8MAy*s!9gQzj;r$}}~yog>~i z`H2dcq82#w)O>3b+$t+DWjHiCn@7(vl1`VhLuu6U3`Qn{N@cLVuF6;Y5~W2NwY<1O zuGPS%&)z$DVA+{Dd@ogbnR9FQmskUqUQo8EM}$$8nDnXnviL%kMpja!(Cai#mtN;| zYcx)`PVaQ3ZGuKy_w&cO88j+m0md1IF3Oc;{RwbjlR8TBRQlXLO_E2R-BM6l*;2g(h9VJcOCZ{$j*{L>}9O~pGht`lA5efO`wpJ)XIh} z=BvOsJjTgHka{`RI6U<=4S3EJlZkO;Ci5>Kwv{TFm%M9O8+fi#3`ruo^C#9YD0imH zf&(e!g#NH_B)omAT%0VJAj`$oPz$cE|WZpAk;v- zBT21xS1}$?BNY1?iLO+`JLU}%=?n;-A(3t{j`OG#fX3rR0+a|%{}|#xehI7vN3#F# zp(~6=znhh|%!1piD4S*zM1pMd1O9qWd}Q-;C%F}QnJ>^&Ur zS1$V%KXtUV_WMj$*Zs~^dBBg^!g$E zgFi8LJ~n3B*sy(Q?0%PrjZMJL9~-fTh{q8zYsOCF{XR?}OX*pka_>^vyW{z0f}DHq zW=m{MIW@su?luTO2mL<7WWwVP;9g;|uNp>)&&bh`-BOOs{+&8B97ek8D_x^!VF@HY z#etc0F%CQ)pJR}4&fS_GJGGdaSbsIQyFv=~h#Y*8P0Z)p9b&1_$rITnBB9M8Ahr5; zr76Z&jlo#aC~H{t7{vtJuKn{`C53lW>%8-A2AbF4!mKE?6=Up?kGHM6NFY7usq{%u zpec4)A}x+cQ*$5X(ui@i;@Bl#5~&2gpqKF60l9>*V8s*Hc!}ui!0g$qi(6yoe_F?T z)NA+Ir>wZ4e0e{A%JQ4}&=Ei$!gh0ZSN@Cp_8Tj@pjg(4fxB?`s@x-8*_>D+xm{Z; zxs_PjL#|lKEM%T3DFM$g3RhMD5tW;JMU8#i&R!~Eou(JftswU##MrwN@o`ur6^*ci zdyxMkk?&6S1hYntbJU?lC{zGS%;7x%n?HVR1|RY`VpJd!B|Odbumj2lGB#j9^yE6p)(`1Fg>ofA3l3|_QAzkEX9GQCgN9NS8c1oTiG0( zrDeM`elBkH>f7lAHftRIaoOs=&Q-WAonp0{gST|A9_X6f)7g2uql?W>Cp=bPp3@oRPdulnj5)aJ-^lpbLfitK>6-Exxm&l}9 z-gsq@3q?hvBq-OJe45~!_I?fC9xF@FG9>YvUKB<7B6D2^XG2MDNVk%A2CS^BBXWur z8IBAMN9uz`k%rR<&Cab+&7B=((g~D!RPlG=5p6WXke`jo=?<+vBy#-0Ef$o357Od?ad4+CT(aJc8#LJuO6 zJG&{Plls>$W!-K3;H;*dVbPlZdj1LNNw`7B&6udU77?BCwC^gsE&hh&#~Lzlpu3KI zCjeXr7&$YeF4dpju{AFCFy}iiMn`YiHT$kT#G3uO1i;B~RkA$I;?TXV=}(}QBeY?P zRI^AxUzQwn7$@UEx|dZocenRGq~klgf0}8}t}7|YuC?28Y6G8BXI1dytrr(>;R~b| zG)b+YdF}AJl48SVhhj`rL7LUF2>3Q?qhEg8gMrrL73F7U6{PkzHuk3Z8h4EMZt#2f ztuCEhbUgcrmCLncdR?Z(dY>xQOSF{R$ka^cKk_I|vfR*8mhYUm#8Twnl%Kb~VUlM{ ze~#bO#99*fr=57KOVAO+(@L3nDYYeBof!1Ulk?{jVHHh2yVm4037?*%rZe??;0CBBx0RPj`I<;^VGpM*`jbtX9 zWC@HCX0_NxPqxWuWbLK}8}PCOTRuCvLMwz*hdF1=Q4E<;p1>$(R!i*kBwHe#q&YZ$ zBVLwh^RiE&XqSG<c(L@bCCAAY;kufTh&2)X8Gga7c zZTLFk)AiaYce=NUQv^_bAlRWbs$>&#BR-VRq2x9uU}BnC)pM2j)Nbk%U#7v3=_|h& zO`%kVlTqlWRr9~i`&RWCjUh192LC zApTuL5GU{@c_N`uBxZ_C5~pa*y47p6=*UU9YYms)gJ>pLoAR`B*2rKNyKI{sgwA!Bmdtx_%FN`0T1g&e#FFF z$rIbv&8CZ$gS*;2xi*dv8~2VFOCT}>Phg5ZK4b-a$fDriVPYAu`-|Q;7E=&b$9bjtQ@|LI*>ZEJ6?hq|V1>u)Yte`a@`_Lm=p z=KmNOKDX90g+nGMxu>i>H@w~3fc`HjSBEn3t{`^5z-?4<84MM7Bksj+#1$UOl&fQX zJZUE+LUe>8evMsvhev=On;nS<(zQwgZqP68Ics(Ij%L!fJ<@*M^rcnJ3qjo^=4T41 zU(iuCsk?RtjL!fxkO2u0pc4{M12K4_M|ij&>tQ}r$bcC0*dCB$K|z|KvqJ*39`45q zW--|zkm})ntYC?ppVcQy4llQohx@S}mW>W*OGrZ!I=@^^9`45qmSoXj1B_{OPGx}| zDVEF1&W7Z#iD8nrho?WfNe7EgrZg{O$=gGu^D9Na4>O&K%xz40Sy`OrOC|F5@YF>O zXja5Q0=zxM)RY4QD+oYl3f43NPw68FGR~KFcmb;zZcceqOT(TCu2Lj`fAwGZ|KBqoy>Z)X{rux( zlD+T#?;!O42BFm+0J8Fb|55M$yrXXz+M=P?wVHJIZ`Mg~<)+rtmw>P@JH>#}oo`q} zFSV*C{ka%)-t(ELH*}-ZP+?v_+ps09Z@&BPr=3wtK^I@1r{Y@gzROLqhOMJt^41*g@a}Nr7`HWK6xO7 z{lA$qY7)5^+E~Z#p;~J$eD3u}$7uLYgXId}!)n|N#bXa2g{`xCBQ#sxy1skB@w=t0 zmHqH8@XG4y$+<6Hk;rU*Yg=}lU!u#dhbrTqxgH3FaH%4IAbrR;F_oz(bK$NaKo00d zrUMbi3mwkZ?bcY?FWTwhN%6FqruI*whV)MZKM#liB2 z&CZbw_2gTdTy2@ZBZkYTum{0sq$^gKx&5fz@k|le*}G2&3!9om@<1R3NgXd+iD4m!Ic9hv zcoI!>nbV0*qa>Q0d!#Ob88wu{921 zXN4|NNL_P5;ss|(oy^LZ+5T?_#ruvv#7>e!^HStnc@lCEXXeFr?lzC{I2b@6^$JaO z7nk-P2R)AdwZ~;S;ZDwQf*fC&HKHCx%_(-%U=^y$ZjLRP@$!Ipwi1X%@JSg|5<{X&RUCg@3pa`hg)MXC20|m%q?g=A$qV6i27ZY?t8hdCw zi*nYK`s%78EL2GDG!fz004aihpx6X@YO0q9u)@LXLV;~uE;W@M@}a*vGA~4a!>vE= zBpczq$Lh(P^2+=(d@-wi8TMSa~00Tj6eoa3i4FoMNSjTg#3hIWBXh2LRS zq-I`BVE291lMy%fj}#kQ!Uun}g+SNBY?K5E?39N1lugZQAQSb33g$M}YfE`rSftS{ zqQ2c$6VM;qZMQ9RlVGm98tavb z7kV7c?Gy0{w#JtS#h=*953|SXE5PaT{cyS)`?fCZ?gqDEJAT46#^u2o z71@a3F4uJ5Lg^O^blqUuv}Gj2Z<&X@^)k}5US2U0DufWqt)4JDWttWnnfrp3le53% zEr(>Bn-zftzX!oZ+eo1&>R)edySP|h4D_J4%QgbcLgpUYt*#g)XnA}s3@!a=!D?}# z2apEJq?S(fZnrlTc$5d)+BobB*z5jTkn%v6Ka?;-5zBw2MrQe}iFRac4_ZzgiLjjq zV{Y4YLV|b*-$T0t3>Mw4-?<{y8LFZQO~Zyp7D3P!O}jg4pGeuy$yQ~9zKPUil2RHk z?GrT-@9rZ*%XR&>zh_~mjn!F&CruJ-G|Q+$X?I!b=&x|w8iF0uqin5TlWx-P`2tm? zyKMP#f=^?oJ#TV%P908JDK;@agWz;wqnb{0dj%SDuw<}Ebh)1u#}ZN_qcaCo5oTNC zJ3U>q=~;pdz9y0bF5T@@-c0GFZeKf_Dv{vg00ucR`iMosmdAXA&%MWV`hjhwF%t&M z${ljODjCgY92)y(UkMsK`bf)8yI&7$cGL36ycktueKfH09hy(i!Edq7SqXie76tBQ zs~ME(f8aKCZcg?Tl^hALaL8XDbe-A{eC3<*W*h)pXPcYt&2llU$93(r>ioTJXnV8~ z3o+d}M#`W=N*$YSktuCpEID&$HdyhkMmuwM2BygaY9hxu)2K!pi%9gaRhJj3{68 zj7VDDs9ItIt+!z1AL1@J%h&vbP_~&-!l7_4MJi)0XzBIk1z7I$5o7EpZ>%%W- z?URMtniaA`81s5VyX=;gi{?Fo`C%wSbKc@s-R=XGz+zyN35hq5<-!ly{jdsXwdLr> zR>U;ms`MJ?4my(L1j8FYRDHTVoh_F<^x%O#E z))WeWLUuF2KN@D!)uWnNb}Q9=-yg_HOKs;YKg0bK)}>Vocw=y9wyasjgA9a}BMs6m zHlj#<3xE77wGhzh+_GAlgb~x$EUyAqn|%tjgqxI)nPQ|nqglab^WD+vS`7(gp zQX&Z^J_uP_83MT)M0YThgrv~MJh3U1cqP^bEbsyMw(CEL`lodgkDDhCckKrMD5RcB?i`7nC1}=|00RiR-8TNiEX>7!CkI-t$oX)Tg>-;YL9NpJ^ry2>*`e3lnGd3T^ z1~nt{RYVoXEWa<)d)!ZwG&}NTPzZ>wiAr*OsXsNZGD7Wjg8$Oww^A%uzj?ZI`Sfu4 z(au@AS&Fupm{%h2zEj#4#(7G_A8uZ?51;x}5{UQ&1|f44GGkB6U|tYe4L|UWSDq5a z>#8JJIu7B`*UY#I=#6f9%xb8f9O48r!C22Q818%=++JUv?l!9sUTow;xU!44b9>R$$w~A*iTKe86n=sJO>z z&UuT@ryu#LiAA1HG~8gPJ!uk!4y~&UL03cGl_k511aQ7>(*vg`60!ZXljGN$JSxhU-)FH7p4p z5N!4L_qg+P5hs2$InR>`_>xfSrAQ{B^dc^b!1x9UiEhsEMbbSFXK;|`ombSMuBCta z18PNWhH8WoFtKu+NZP8*&0m{fq0bPz`>oyG$sHnM=~cP~yemVouX<=oE7vHTOtsW+ zs8T(Kz8~Hx(*mvGg;UDw=t+I7Z6GYXk^c7V<;qv5CxGkA7vH@6=63gVx11A3ET-Nt zvT#hFdwut|RC{Zu%TvJ-gk%FrSDKTKRIS75Ej&xxTk|npVC(VnaXg=&*Y3804s_TZ zMxa9wU*S$PZVmy{%Ta;tcGgt===$g^dr1FtM_o&xl6TbU3L9D2gFU(F@(Vx;agPY7 ziri2=UF91!4X~4;4aE8hGu-QSr2xzxZmzcL@sr*~wJZiXObvYS9Rs0l|H1!0Bi%Tw zQC=$7AAMC!i|$e;@yzBt=uWqdYyLfb{PNk;^k%ynU-VA8GrZ&GU*@@pdln16^Wp`b zP>!!WtaIQyDzmO^i&!R?4=7T8v|8kYjoVebz>bITIqRr3(KaAQj!u`lh%EKd(Y%h_ zP(s^D2V9Qfi-g0bVHi35K)ncH$Cp7yN7*jXkp%af*#yj2KN3Cp-e|$Vxo~mhRQa4$ zS<3C!H_hD-w42?{lJPBQp9v=z1#k!k;+#sZM1dZt;4NF}DE!RjSu&T|1RA6m8`@Cd zeu~*aC(IwdR0M$^#5cQRBHJx54?b_eXqV-{)#|c=DwPaqxtX2#pcWi!Lc-OHJTSM+ z18x@(w#15VdMU|$gvMp;^{q2Qosr!l721Mv@7`SgzBcL4;M<%iURF(#A4l+6>||Wm z1%2lBhtz-geK`vq^`UxQ03P^bf&jwDzjuOt|Ku<2Ux*gI1mK;m8*V(4efK}+yqf;L z3H2uiAjJRxL2{Ke}= z@;MhmuXTXydwKnSb$ECmhG8(SKBaiJtl`)*MW?D6?o6{-EAH)nQI*r*c3Vx@=mN!5 zF0i_Yl}Xt{QD~=MFJ}qVGx8px49fC?h~6@Q@KHq8#X_hOs+TGArA)-idRrxSkK7xy z@;5mrhmE^d;Y?S*6Dr3X8VK;Iw3pf`>~jRe##Q|kit5}WRulFA+o#z^LGOLI;_gpWrA!2l4@dUa&FNHG4IYz0hR zJA-2Yxjq7#6aWr_kP}-6bH?7;To7X<=RAF%OEg58OL@k-vA-_zppTb*`UcRL{%oT7}BddDrB1?ss>n0G>ItKt$MQYCP@(~QoqA$pu}Aw zbb~09CM>Sd&zLU0kA>M}lSDG7>*eNpdh}iu$RdMMz>0BjTqaywIapU3N%L{Jdhr;w0Ud zg&KcesEB+DMiCAso*t=EfikQMIji|w{}$4EfWN20@K~2Kx}CLNfIvNhd?i?~C!Y3< z5PG4)JnK2nd!d}=4?S9+7%zHBzgKK<&UvxE6IbZ+*Wy*L8SuJfDN?2RMta5|&!AyO zL(EL}%U8gn(ASELKYzz3C@v)FywSO))50-Dc_bw=e_+$qm|>RLW;$Sw3u=AeEhn{N zbn;yDEilixVwykHZ{5@yDamlh-N;FSJ@#@b+Q|xD{$JUHXW(Q*wq!^4u4P!i%FJw{B6jglqU5?jM!?*~6RNaV}MCY=t;j-H$!h2@r7Wu?^? zg%el1FB2X=LBd3dlO!#^gc7ZlYmGO(=Phr0KS{|`lvHvlrIwa5@2!HW3hIlSio;C4 z!ikN=`Q!Li{=zD&SsPN$zuin{`q+szb@ZI4%~&H=c=yc81J>wh4?~7Fo3>=;})(LfN^AA^)vR z+#XaHgj_h3TLxFmK7uNwvAn8i9+QrX6GJ`m--7W_V|E~Q<*;gWi08u+bd`%r7>+$h z5>L8J2K}*=Uj=gVsjjo0I*@*ujJ}!d9=-)Ms|(2Nk!-_5e2tY}bE~#h+S%^NcgVIw z*0DDmo0HpzZPm8k-FK+}{_@aDpR()Z`=~AI38XiRjt^Axo4!+t@-z_GKbV_Q_VZti#v|*^;fXXP32xEcKHg zl}0jC_EJp|B4d|Z=YDXX|GCfo=zefr*Lk0FozJ-*T<`bi^GY>0yL^&EkOKgKlg38+ zmdEG7-vwbk-YsWtvH<}1X=8nib@GiU8?6KH`IECZfVX=XRTcc z4fBkQtR?sDX)a5H2I7#c93v>C5fG0ALE^#46b$Cd9RwF76FKh3l;CQ_tV>}Lh42#o z=f?jnQkr$!s~`NWBL~G~17Hjj6wIyzMFW3DoNz6shYbZzfCi3XOxRHy*3F&#RGcb( zlve+%|Ei3uAFGR6STY<>)((9a;hZKl!yy{6>Y^XJdkwVoe`OY;sP5)HNqU~igslTuzz{>b@JwkNBCjo0GJ3%Ak-)RI** z?|C@*fNn`6QPpSu8RscQ4~&mH140RuY|FfLg371K9g;7o_f>We*2|}qe5KEh-bo)) zwClGuNnH;=F)&!D(LCy;FT!_`)mwZnV%g8M_Ed(Un0M2wpIH(F=W%5(O_?U0$MWtD zNr#8guj#i{yX^&F^gv(byWl4uFDGBs+Lh4SSzrcZQjnCPDlGv?f93t+=;?!yu$uiZ zYyCcEC0}XXpQaeJPU?sG*rd1GN3fXPuQ2Z>S5w?sezWcz^Z+)pIsEsV>F}e&*a7Kl z+^*GAU2EqP2GU{Y1L%ZR~5vlcsI|LQdZs9v7QuNT7YgJ1>>$rD*Iv)KxtD(#X zzQ0PkWC3B89-Orw(m>U7uQak5U3rYdI@ctrWXZBq2J58SHetqp{yK8*OAZN7S{ z`Ogshg$`Wm>XJ!+QQPg{pf0!=g(-Lk^p4l@4U_d@4C^3*ec@oc4=|M0IUxtxl7>kf zGKK?F_QlcB_HO@T0xz?-PSx2*d!t`4__NC$CdO(oD%fDN7&m!-k~-}p{VFV_9@+r} z$0g|jo>5En%qRSKez*%-OF4{&mUNAmA|*2n9LZer9R~W_Lp1tm|DnGHj*wY}QQH*& zb2py;T;EHH zD6>kJ-o=w?=p(J>MMQl)AyU<0|m(L=%0|NsI zNQmv`rV3ABX~yz}mEvX_6IVq+*T?oQVPUYf-rrpDNEh35@ROaSLcgngM=IOf+v^OP z^J20{3_*c4edx0(VyvOJHt%_`dZGfWNc1L;*5Rhr3^{~z>}d`JI|=Ij7w$x&+Qk>I z=eNteAhK}>uFYwJG3LB3(H{3L8zs-R#5$#ImGx4WH->{UE``m>Nw``CVHsK{;>Yt% z%`a}JRzSM_XP>)Yh@+CBUrwK~o}}88Gf57lVTA6YHVLNRYpM>ZgLp9GTNFWyV{I;hvqM9pn4hphkqwM1Dooe&PcG2d zX!kqn_MQ=`RaYd_xSX8o$mVRSZ{xol#rB8OH-$lI$s9w2?EH>Q~DP6M=xlCk&%%pi}2y$VaN+84qxTNftLj=Vw_69 zdu81=YvwcYF_OAhqYxVEe?#k`7#7y5EV-GFYc0$)%pFsUa*kRLh&osw{)%jF$(wdm za_);t6^T9I`CGJNJgs$-e5LDLc<0lio*$Zc#B+Haq2ch&?>ygrvj}U)oESi5-jEb8 z@0_Z~e<{&}Cxvg%hVdk!8at1lV!?;PPCWn2a%NjhM!Q9IQt84=KF;`rP65w$+OLVL zM?)&}QN(0!k+L6J<4he!hzKt)Hj$Ve*BhD_oTC{cQClCq!uK}Wy-QTDpA=emxPEU3&gqagVr^XS+a|W@M6G%k?H9jqAf)m*^Y&X0;Q~+f;c; zZK0=Ley2bkb?BNrS9fkm}rv2J8=K_z!KaXT2dbg+ZEe(G4Jlpa{ z0o8oZ1Fg#vU6xJiPGZk=aAO_+%)foh{I8u6{^D^*fit^5_}HeD>#_HNW}cx?9kALo z*acaDH4eFDqK&;ltwW*S)z)+miz>b$y8#?C(z$dooQwWX!Q0i-iRm6e;XAO7F()~x zkUPlXu303CFybD+8 z9h}7EK0s9#S`kIwfd-)`?Ukq?$@F)tfe-mf>1~pSnJPslsC25Vc_VXhg_cgbAybJ} z{z~`sqOWM2$mQ{DaliRy&C$x+Uba#LlQ-o}nF7x^OUrOhkPw<(!SLLEfmy4U0K$~0 zUV~vjcC=hI#s}nUOx(J|Xz}!c;0S{(FR%=zlbwPy(jniqOk?JATk_6L3RHos-YY>- z^RR_10|u`o_GhGbdUb)uT&+_9{;~Z4oG9~(ly{tcQp$Dj71WBm=vPEm?8Tc)}DhfPoCdk8?vpJ6)k>Cbc^6T(=kpD$<6{d%Du?(q);h#wQzr-u=avSEq$OKrb`RkYr3wNsR9sizK0HCZrOeMmb=rXDh$?xkp3J0c0*p zm;Buo%D{s?H8wW3<3B9*=iv8M;Azqrxw?+S%SI_cu7dniV(-{yans!ai{0}v(jLYI z8|W^TI&-oP!Z$f|?9=XV`p(9y^FiCIPVNp}6~5oB9{-uUPXBfR{EPN1g2B<#(*w^M zmVb%NTF=+WX-KX0)R#*6wgDA< z`+hYDob?tm8z_AQ?6dzk{k|wX{EbKFOlpBQ>tLx*vcDXpnPYLwDx$h>WNqN20>UQI zC7q$%ZO{fagyCE3p%pgGwgHYLvYjuE5EDvlLlgnhgD#gghwS7&HY}*XhV!f4)t{h} zRw#NJ;(ZYZyt2S_Iol`P?u5%Nt}nx|ai&&8ggJGnTUYT0NNBRWjtkp;kDo+bq8v6c ze_%~aoThQ2_uq3l(a|f*CO%C8;^lJC>2d|@Xmgbh2(O#To_yvXV@4Dur3Z*$M|_Rw%>(q9=lIE{HgL@>?MbdDTSY zI9~ncdc~{bEy<=?{*i=5RTd;qk_Ats`yo5vA=g)o_9-`IgXd!KEJ(Zbv9_B-Ar38q zcCpQ6GwpM2T)^<~?W#Hq6fC`Gj0WU-M0A+5TSFf_vk&;TF~7H6U(ZHAbc}ArkQ4;( zmgk*gT-v{(#1ikK#uBe{`fgCOP!_{D$`*9t$hHKocchf2``Ys&IL`k~-vSrxc>!~= z2N%^70C(6*SVkU1;sIO>N3ytaT4kl!@#LvLo&tW-xZLh&YzT>WtQsxsxaC_#ROtGE2vy=-=norv zj!Q-xE0mhamuB(|8@ITfkP@$%a6s*NnB=SD4GjD}Z&S#5YOq@0(rCn^_+ulI#r!!K#)*NZ&F$H*<7?NKLM%>_!Nmk z;x|g#a-T+ZyMfF+gE!!B3Qts8fThH9&=`19;Mk{~@Ju8{g6Sq%2bLi6-dClP``ZDy zuTeLMvAe6cl%W9Ii*)J&aBNV~u(0Ry3DAm?1DY(5JPWcH{O`Y|1Wd{`4W|5O=}kiMZVMI)bC0 tf^wmj=jw-eUx)*e_f7wUKHZQz+P*8F<; + +export function CheckUpdate():Promise; + +export function GetStatus():Promise; + +export function HideWindow():Promise; + +export function InstallPi():Promise; + +export function ShowWindow():Promise; + +export function Start():Promise; + +export function Stop():Promise; + +export function UpdatePi():Promise; diff --git a/frontend/wailsjs/go/main/App.js b/frontend/wailsjs/go/main/App.js new file mode 100755 index 0000000..7b363a0 --- /dev/null +++ b/frontend/wailsjs/go/main/App.js @@ -0,0 +1,39 @@ +// @ts-check +// Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL +// This file is automatically generated. DO NOT EDIT + +export function CheckEnv() { + return window['go']['main']['App']['CheckEnv'](); +} + +export function CheckUpdate() { + return window['go']['main']['App']['CheckUpdate'](); +} + +export function GetStatus() { + return window['go']['main']['App']['GetStatus'](); +} + +export function HideWindow() { + return window['go']['main']['App']['HideWindow'](); +} + +export function InstallPi() { + return window['go']['main']['App']['InstallPi'](); +} + +export function ShowWindow() { + return window['go']['main']['App']['ShowWindow'](); +} + +export function Start() { + return window['go']['main']['App']['Start'](); +} + +export function Stop() { + return window['go']['main']['App']['Stop'](); +} + +export function UpdatePi() { + return window['go']['main']['App']['UpdatePi'](); +} diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts new file mode 100755 index 0000000..14d1d0d --- /dev/null +++ b/frontend/wailsjs/go/models.ts @@ -0,0 +1,109 @@ +export namespace main { + + export class CheckResult { + nodePath: string; + nodeVersion: string; + nodeOK: boolean; + piPath: string; + piVersion: string; + credFile: string; + credExists: boolean; + homePiDir: string; + portBusy: boolean; + portBusyBy: string; + issues: string[]; + + static createFrom(source: any = {}) { + return new CheckResult(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.nodePath = source["nodePath"]; + this.nodeVersion = source["nodeVersion"]; + this.nodeOK = source["nodeOK"]; + this.piPath = source["piPath"]; + this.piVersion = source["piVersion"]; + this.credFile = source["credFile"]; + this.credExists = source["credExists"]; + this.homePiDir = source["homePiDir"]; + this.portBusy = source["portBusy"]; + this.portBusyBy = source["portBusyBy"]; + this.issues = source["issues"]; + } + } + export class InstallResult { + ok: boolean; + error: string; + output: string; + + static createFrom(source: any = {}) { + return new InstallResult(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.ok = source["ok"]; + this.error = source["error"]; + this.output = source["output"]; + } + } + export class StartResult { + ok: boolean; + url: string; + error: string; + output: string; + hidden: boolean; + + static createFrom(source: any = {}) { + return new StartResult(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.ok = source["ok"]; + this.url = source["url"]; + this.error = source["error"]; + this.output = source["output"]; + this.hidden = source["hidden"]; + } + } + export class StatusResult { + running: boolean; + url: string; + startedAt: string; + pid: number; + + static createFrom(source: any = {}) { + return new StatusResult(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.running = source["running"]; + this.url = source["url"]; + this.startedAt = source["startedAt"]; + this.pid = source["pid"]; + } + } + export class UpdateInfo { + installed: string; + latest: string; + hasUpdate: boolean; + raw: string; + + static createFrom(source: any = {}) { + return new UpdateInfo(source); + } + + constructor(source: any = {}) { + if ('string' === typeof source) source = JSON.parse(source); + this.installed = source["installed"]; + this.latest = source["latest"]; + this.hasUpdate = source["hasUpdate"]; + this.raw = source["raw"]; + } + } + +} + diff --git a/frontend/wailsjs/runtime/package.json b/frontend/wailsjs/runtime/package.json new file mode 100644 index 0000000..1e7c8a5 --- /dev/null +++ b/frontend/wailsjs/runtime/package.json @@ -0,0 +1,24 @@ +{ + "name": "@wailsapp/runtime", + "version": "2.0.0", + "description": "Wails Javascript runtime library", + "main": "runtime.js", + "types": "runtime.d.ts", + "scripts": { + }, + "repository": { + "type": "git", + "url": "git+https://github.com/wailsapp/wails.git" + }, + "keywords": [ + "Wails", + "Javascript", + "Go" + ], + "author": "Lea Anthony ", + "license": "MIT", + "bugs": { + "url": "https://github.com/wailsapp/wails/issues" + }, + "homepage": "https://github.com/wailsapp/wails#readme" +} diff --git a/frontend/wailsjs/runtime/runtime.d.ts b/frontend/wailsjs/runtime/runtime.d.ts new file mode 100644 index 0000000..3bbea84 --- /dev/null +++ b/frontend/wailsjs/runtime/runtime.d.ts @@ -0,0 +1,330 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +export interface Position { + x: number; + y: number; +} + +export interface Size { + w: number; + h: number; +} + +export interface Screen { + isCurrent: boolean; + isPrimary: boolean; + width : number + height : number +} + +// Environment information such as platform, buildtype, ... +export interface EnvironmentInfo { + buildType: string; + platform: string; + arch: string; +} + +// [EventsEmit](https://wails.io/docs/reference/runtime/events#eventsemit) +// emits the given event. Optional data may be passed with the event. +// This will trigger any event listeners. +export function EventsEmit(eventName: string, ...data: any): void; + +// [EventsOn](https://wails.io/docs/reference/runtime/events#eventson) sets up a listener for the given event name. +export function EventsOn(eventName: string, callback: (...data: any) => void): () => void; + +// [EventsOnMultiple](https://wails.io/docs/reference/runtime/events#eventsonmultiple) +// sets up a listener for the given event name, but will only trigger a given number times. +export function EventsOnMultiple(eventName: string, callback: (...data: any) => void, maxCallbacks: number): () => void; + +// [EventsOnce](https://wails.io/docs/reference/runtime/events#eventsonce) +// sets up a listener for the given event name, but will only trigger once. +export function EventsOnce(eventName: string, callback: (...data: any) => void): () => void; + +// [EventsOff](https://wails.io/docs/reference/runtime/events#eventsoff) +// unregisters the listener for the given event name. +export function EventsOff(eventName: string, ...additionalEventNames: string[]): void; + +// [EventsOffAll](https://wails.io/docs/reference/runtime/events#eventsoffall) +// unregisters all listeners. +export function EventsOffAll(): void; + +// [LogPrint](https://wails.io/docs/reference/runtime/log#logprint) +// logs the given message as a raw message +export function LogPrint(message: string): void; + +// [LogTrace](https://wails.io/docs/reference/runtime/log#logtrace) +// logs the given message at the `trace` log level. +export function LogTrace(message: string): void; + +// [LogDebug](https://wails.io/docs/reference/runtime/log#logdebug) +// logs the given message at the `debug` log level. +export function LogDebug(message: string): void; + +// [LogError](https://wails.io/docs/reference/runtime/log#logerror) +// logs the given message at the `error` log level. +export function LogError(message: string): void; + +// [LogFatal](https://wails.io/docs/reference/runtime/log#logfatal) +// logs the given message at the `fatal` log level. +// The application will quit after calling this method. +export function LogFatal(message: string): void; + +// [LogInfo](https://wails.io/docs/reference/runtime/log#loginfo) +// logs the given message at the `info` log level. +export function LogInfo(message: string): void; + +// [LogWarning](https://wails.io/docs/reference/runtime/log#logwarning) +// logs the given message at the `warning` log level. +export function LogWarning(message: string): void; + +// [WindowReload](https://wails.io/docs/reference/runtime/window#windowreload) +// Forces a reload by the main application as well as connected browsers. +export function WindowReload(): void; + +// [WindowReloadApp](https://wails.io/docs/reference/runtime/window#windowreloadapp) +// Reloads the application frontend. +export function WindowReloadApp(): void; + +// [WindowSetAlwaysOnTop](https://wails.io/docs/reference/runtime/window#windowsetalwaysontop) +// Sets the window AlwaysOnTop or not on top. +export function WindowSetAlwaysOnTop(b: boolean): void; + +// [WindowSetSystemDefaultTheme](https://wails.io/docs/next/reference/runtime/window#windowsetsystemdefaulttheme) +// *Windows only* +// Sets window theme to system default (dark/light). +export function WindowSetSystemDefaultTheme(): void; + +// [WindowSetLightTheme](https://wails.io/docs/next/reference/runtime/window#windowsetlighttheme) +// *Windows only* +// Sets window to light theme. +export function WindowSetLightTheme(): void; + +// [WindowSetDarkTheme](https://wails.io/docs/next/reference/runtime/window#windowsetdarktheme) +// *Windows only* +// Sets window to dark theme. +export function WindowSetDarkTheme(): void; + +// [WindowCenter](https://wails.io/docs/reference/runtime/window#windowcenter) +// Centers the window on the monitor the window is currently on. +export function WindowCenter(): void; + +// [WindowSetTitle](https://wails.io/docs/reference/runtime/window#windowsettitle) +// Sets the text in the window title bar. +export function WindowSetTitle(title: string): void; + +// [WindowFullscreen](https://wails.io/docs/reference/runtime/window#windowfullscreen) +// Makes the window full screen. +export function WindowFullscreen(): void; + +// [WindowUnfullscreen](https://wails.io/docs/reference/runtime/window#windowunfullscreen) +// Restores the previous window dimensions and position prior to full screen. +export function WindowUnfullscreen(): void; + +// [WindowIsFullscreen](https://wails.io/docs/reference/runtime/window#windowisfullscreen) +// Returns the state of the window, i.e. whether the window is in full screen mode or not. +export function WindowIsFullscreen(): Promise; + +// [WindowSetSize](https://wails.io/docs/reference/runtime/window#windowsetsize) +// Sets the width and height of the window. +export function WindowSetSize(width: number, height: number): void; + +// [WindowGetSize](https://wails.io/docs/reference/runtime/window#windowgetsize) +// Gets the width and height of the window. +export function WindowGetSize(): Promise; + +// [WindowSetMaxSize](https://wails.io/docs/reference/runtime/window#windowsetmaxsize) +// Sets the maximum window size. Will resize the window if the window is currently larger than the given dimensions. +// Setting a size of 0,0 will disable this constraint. +export function WindowSetMaxSize(width: number, height: number): void; + +// [WindowSetMinSize](https://wails.io/docs/reference/runtime/window#windowsetminsize) +// Sets the minimum window size. Will resize the window if the window is currently smaller than the given dimensions. +// Setting a size of 0,0 will disable this constraint. +export function WindowSetMinSize(width: number, height: number): void; + +// [WindowSetPosition](https://wails.io/docs/reference/runtime/window#windowsetposition) +// Sets the window position relative to the monitor the window is currently on. +export function WindowSetPosition(x: number, y: number): void; + +// [WindowGetPosition](https://wails.io/docs/reference/runtime/window#windowgetposition) +// Gets the window position relative to the monitor the window is currently on. +export function WindowGetPosition(): Promise; + +// [WindowHide](https://wails.io/docs/reference/runtime/window#windowhide) +// Hides the window. +export function WindowHide(): void; + +// [WindowShow](https://wails.io/docs/reference/runtime/window#windowshow) +// Shows the window, if it is currently hidden. +export function WindowShow(): void; + +// [WindowMaximise](https://wails.io/docs/reference/runtime/window#windowmaximise) +// Maximises the window to fill the screen. +export function WindowMaximise(): void; + +// [WindowToggleMaximise](https://wails.io/docs/reference/runtime/window#windowtogglemaximise) +// Toggles between Maximised and UnMaximised. +export function WindowToggleMaximise(): void; + +// [WindowUnmaximise](https://wails.io/docs/reference/runtime/window#windowunmaximise) +// Restores the window to the dimensions and position prior to maximising. +export function WindowUnmaximise(): void; + +// [WindowIsMaximised](https://wails.io/docs/reference/runtime/window#windowismaximised) +// Returns the state of the window, i.e. whether the window is maximised or not. +export function WindowIsMaximised(): Promise; + +// [WindowMinimise](https://wails.io/docs/reference/runtime/window#windowminimise) +// Minimises the window. +export function WindowMinimise(): void; + +// [WindowUnminimise](https://wails.io/docs/reference/runtime/window#windowunminimise) +// Restores the window to the dimensions and position prior to minimising. +export function WindowUnminimise(): void; + +// [WindowIsMinimised](https://wails.io/docs/reference/runtime/window#windowisminimised) +// Returns the state of the window, i.e. whether the window is minimised or not. +export function WindowIsMinimised(): Promise; + +// [WindowIsNormal](https://wails.io/docs/reference/runtime/window#windowisnormal) +// Returns the state of the window, i.e. whether the window is normal or not. +export function WindowIsNormal(): Promise; + +// [WindowSetBackgroundColour](https://wails.io/docs/reference/runtime/window#windowsetbackgroundcolour) +// Sets the background colour of the window to the given RGBA colour definition. This colour will show through for all transparent pixels. +export function WindowSetBackgroundColour(R: number, G: number, B: number, A: number): void; + +// [ScreenGetAll](https://wails.io/docs/reference/runtime/window#screengetall) +// Gets the all screens. Call this anew each time you want to refresh data from the underlying windowing system. +export function ScreenGetAll(): Promise; + +// [BrowserOpenURL](https://wails.io/docs/reference/runtime/browser#browseropenurl) +// Opens the given URL in the system browser. +export function BrowserOpenURL(url: string): void; + +// [Environment](https://wails.io/docs/reference/runtime/intro#environment) +// Returns information about the environment +export function Environment(): Promise; + +// [Quit](https://wails.io/docs/reference/runtime/intro#quit) +// Quits the application. +export function Quit(): void; + +// [Hide](https://wails.io/docs/reference/runtime/intro#hide) +// Hides the application. +export function Hide(): void; + +// [Show](https://wails.io/docs/reference/runtime/intro#show) +// Shows the application. +export function Show(): void; + +// [ClipboardGetText](https://wails.io/docs/reference/runtime/clipboard#clipboardgettext) +// Returns the current text stored on clipboard +export function ClipboardGetText(): Promise; + +// [ClipboardSetText](https://wails.io/docs/reference/runtime/clipboard#clipboardsettext) +// Sets a text on the clipboard +export function ClipboardSetText(text: string): Promise; + +// [OnFileDrop](https://wails.io/docs/reference/runtime/draganddrop#onfiledrop) +// OnFileDrop listens to drag and drop events and calls the callback with the coordinates of the drop and an array of path strings. +export function OnFileDrop(callback: (x: number, y: number ,paths: string[]) => void, useDropTarget: boolean) :void + +// [OnFileDropOff](https://wails.io/docs/reference/runtime/draganddrop#dragandddropoff) +// OnFileDropOff removes the drag and drop listeners and handlers. +export function OnFileDropOff() :void + +// Check if the file path resolver is available +export function CanResolveFilePaths(): boolean; + +// Resolves file paths for an array of files +export function ResolveFilePaths(files: File[]): void + +// Notification types +export interface NotificationOptions { + id: string; + title: string; + subtitle?: string; // macOS and Linux only + body?: string; + categoryId?: string; + data?: { [key: string]: any }; +} + +export interface NotificationAction { + id?: string; + title?: string; + destructive?: boolean; // macOS-specific +} + +export interface NotificationCategory { + id?: string; + actions?: NotificationAction[]; + hasReplyField?: boolean; + replyPlaceholder?: string; + replyButtonTitle?: string; +} + +// [InitializeNotifications](https://wails.io/docs/reference/runtime/notification#initializenotifications) +// Initializes the notification service for the application. +// This must be called before sending any notifications. +export function InitializeNotifications(): Promise; + +// [CleanupNotifications](https://wails.io/docs/reference/runtime/notification#cleanupnotifications) +// Cleans up notification resources and releases any held connections. +export function CleanupNotifications(): Promise; + +// [IsNotificationAvailable](https://wails.io/docs/reference/runtime/notification#isnotificationavailable) +// Checks if notifications are available on the current platform. +export function IsNotificationAvailable(): Promise; + +// [RequestNotificationAuthorization](https://wails.io/docs/reference/runtime/notification#requestnotificationauthorization) +// Requests notification authorization from the user (macOS only). +export function RequestNotificationAuthorization(): Promise; + +// [CheckNotificationAuthorization](https://wails.io/docs/reference/runtime/notification#checknotificationauthorization) +// Checks the current notification authorization status (macOS only). +export function CheckNotificationAuthorization(): Promise; + +// [SendNotification](https://wails.io/docs/reference/runtime/notification#sendnotification) +// Sends a basic notification with the given options. +export function SendNotification(options: NotificationOptions): Promise; + +// [SendNotificationWithActions](https://wails.io/docs/reference/runtime/notification#sendnotificationwithactions) +// Sends a notification with action buttons. Requires a registered category. +export function SendNotificationWithActions(options: NotificationOptions): Promise; + +// [RegisterNotificationCategory](https://wails.io/docs/reference/runtime/notification#registernotificationcategory) +// Registers a notification category that can be used with SendNotificationWithActions. +export function RegisterNotificationCategory(category: NotificationCategory): Promise; + +// [RemoveNotificationCategory](https://wails.io/docs/reference/runtime/notification#removenotificationcategory) +// Removes a previously registered notification category. +export function RemoveNotificationCategory(categoryId: string): Promise; + +// [RemoveAllPendingNotifications](https://wails.io/docs/reference/runtime/notification#removeallpendingnotifications) +// Removes all pending notifications from the notification center. +export function RemoveAllPendingNotifications(): Promise; + +// [RemovePendingNotification](https://wails.io/docs/reference/runtime/notification#removependingnotification) +// Removes a specific pending notification by its identifier. +export function RemovePendingNotification(identifier: string): Promise; + +// [RemoveAllDeliveredNotifications](https://wails.io/docs/reference/runtime/notification#removealldeliverednotifications) +// Removes all delivered notifications from the notification center. +export function RemoveAllDeliveredNotifications(): Promise; + +// [RemoveDeliveredNotification](https://wails.io/docs/reference/runtime/notification#removedeliverednotification) +// Removes a specific delivered notification by its identifier. +export function RemoveDeliveredNotification(identifier: string): Promise; + +// [RemoveNotification](https://wails.io/docs/reference/runtime/notification#removenotification) +// Removes a notification by its identifier (cross-platform convenience function). +export function RemoveNotification(identifier: string): Promise; \ No newline at end of file diff --git a/frontend/wailsjs/runtime/runtime.js b/frontend/wailsjs/runtime/runtime.js new file mode 100644 index 0000000..556621e --- /dev/null +++ b/frontend/wailsjs/runtime/runtime.js @@ -0,0 +1,298 @@ +/* + _ __ _ __ +| | / /___ _(_) /____ +| | /| / / __ `/ / / ___/ +| |/ |/ / /_/ / / (__ ) +|__/|__/\__,_/_/_/____/ +The electron alternative for Go +(c) Lea Anthony 2019-present +*/ + +export function LogPrint(message) { + window.runtime.LogPrint(message); +} + +export function LogTrace(message) { + window.runtime.LogTrace(message); +} + +export function LogDebug(message) { + window.runtime.LogDebug(message); +} + +export function LogInfo(message) { + window.runtime.LogInfo(message); +} + +export function LogWarning(message) { + window.runtime.LogWarning(message); +} + +export function LogError(message) { + window.runtime.LogError(message); +} + +export function LogFatal(message) { + window.runtime.LogFatal(message); +} + +export function EventsOnMultiple(eventName, callback, maxCallbacks) { + return window.runtime.EventsOnMultiple(eventName, callback, maxCallbacks); +} + +export function EventsOn(eventName, callback) { + return EventsOnMultiple(eventName, callback, -1); +} + +export function EventsOff(eventName, ...additionalEventNames) { + return window.runtime.EventsOff(eventName, ...additionalEventNames); +} + +export function EventsOffAll() { + return window.runtime.EventsOffAll(); +} + +export function EventsOnce(eventName, callback) { + return EventsOnMultiple(eventName, callback, 1); +} + +export function EventsEmit(eventName) { + let args = [eventName].slice.call(arguments); + return window.runtime.EventsEmit.apply(null, args); +} + +export function WindowReload() { + window.runtime.WindowReload(); +} + +export function WindowReloadApp() { + window.runtime.WindowReloadApp(); +} + +export function WindowSetAlwaysOnTop(b) { + window.runtime.WindowSetAlwaysOnTop(b); +} + +export function WindowSetSystemDefaultTheme() { + window.runtime.WindowSetSystemDefaultTheme(); +} + +export function WindowSetLightTheme() { + window.runtime.WindowSetLightTheme(); +} + +export function WindowSetDarkTheme() { + window.runtime.WindowSetDarkTheme(); +} + +export function WindowCenter() { + window.runtime.WindowCenter(); +} + +export function WindowSetTitle(title) { + window.runtime.WindowSetTitle(title); +} + +export function WindowFullscreen() { + window.runtime.WindowFullscreen(); +} + +export function WindowUnfullscreen() { + window.runtime.WindowUnfullscreen(); +} + +export function WindowIsFullscreen() { + return window.runtime.WindowIsFullscreen(); +} + +export function WindowGetSize() { + return window.runtime.WindowGetSize(); +} + +export function WindowSetSize(width, height) { + window.runtime.WindowSetSize(width, height); +} + +export function WindowSetMaxSize(width, height) { + window.runtime.WindowSetMaxSize(width, height); +} + +export function WindowSetMinSize(width, height) { + window.runtime.WindowSetMinSize(width, height); +} + +export function WindowSetPosition(x, y) { + window.runtime.WindowSetPosition(x, y); +} + +export function WindowGetPosition() { + return window.runtime.WindowGetPosition(); +} + +export function WindowHide() { + window.runtime.WindowHide(); +} + +export function WindowShow() { + window.runtime.WindowShow(); +} + +export function WindowMaximise() { + window.runtime.WindowMaximise(); +} + +export function WindowToggleMaximise() { + window.runtime.WindowToggleMaximise(); +} + +export function WindowUnmaximise() { + window.runtime.WindowUnmaximise(); +} + +export function WindowIsMaximised() { + return window.runtime.WindowIsMaximised(); +} + +export function WindowMinimise() { + window.runtime.WindowMinimise(); +} + +export function WindowUnminimise() { + window.runtime.WindowUnminimise(); +} + +export function WindowSetBackgroundColour(R, G, B, A) { + window.runtime.WindowSetBackgroundColour(R, G, B, A); +} + +export function ScreenGetAll() { + return window.runtime.ScreenGetAll(); +} + +export function WindowIsMinimised() { + return window.runtime.WindowIsMinimised(); +} + +export function WindowIsNormal() { + return window.runtime.WindowIsNormal(); +} + +export function BrowserOpenURL(url) { + window.runtime.BrowserOpenURL(url); +} + +export function Environment() { + return window.runtime.Environment(); +} + +export function Quit() { + window.runtime.Quit(); +} + +export function Hide() { + window.runtime.Hide(); +} + +export function Show() { + window.runtime.Show(); +} + +export function ClipboardGetText() { + return window.runtime.ClipboardGetText(); +} + +export function ClipboardSetText(text) { + return window.runtime.ClipboardSetText(text); +} + +/** + * Callback for OnFileDrop returns a slice of file path strings when a drop is finished. + * + * @export + * @callback OnFileDropCallback + * @param {number} x - x coordinate of the drop + * @param {number} y - y coordinate of the drop + * @param {string[]} paths - A list of file paths. + */ + +/** + * OnFileDrop listens to drag and drop events and calls the callback with the coordinates of the drop and an array of path strings. + * + * @export + * @param {OnFileDropCallback} callback - Callback for OnFileDrop returns a slice of file path strings when a drop is finished. + * @param {boolean} [useDropTarget=true] - Only call the callback when the drop finished on an element that has the drop target style. (--wails-drop-target) + */ +export function OnFileDrop(callback, useDropTarget) { + return window.runtime.OnFileDrop(callback, useDropTarget); +} + +/** + * OnFileDropOff removes the drag and drop listeners and handlers. + */ +export function OnFileDropOff() { + return window.runtime.OnFileDropOff(); +} + +export function CanResolveFilePaths() { + return window.runtime.CanResolveFilePaths(); +} + +export function ResolveFilePaths(files) { + return window.runtime.ResolveFilePaths(files); +} + +export function InitializeNotifications() { + return window.runtime.InitializeNotifications(); +} + +export function CleanupNotifications() { + return window.runtime.CleanupNotifications(); +} + +export function IsNotificationAvailable() { + return window.runtime.IsNotificationAvailable(); +} + +export function RequestNotificationAuthorization() { + return window.runtime.RequestNotificationAuthorization(); +} + +export function CheckNotificationAuthorization() { + return window.runtime.CheckNotificationAuthorization(); +} + +export function SendNotification(options) { + return window.runtime.SendNotification(options); +} + +export function SendNotificationWithActions(options) { + return window.runtime.SendNotificationWithActions(options); +} + +export function RegisterNotificationCategory(category) { + return window.runtime.RegisterNotificationCategory(category); +} + +export function RemoveNotificationCategory(categoryId) { + return window.runtime.RemoveNotificationCategory(categoryId); +} + +export function RemoveAllPendingNotifications() { + return window.runtime.RemoveAllPendingNotifications(); +} + +export function RemovePendingNotification(identifier) { + return window.runtime.RemovePendingNotification(identifier); +} + +export function RemoveAllDeliveredNotifications() { + return window.runtime.RemoveAllDeliveredNotifications(); +} + +export function RemoveDeliveredNotification(identifier) { + return window.runtime.RemoveDeliveredNotification(identifier); +} + +export function RemoveNotification(identifier) { + return window.runtime.RemoveNotification(identifier); +} \ No newline at end of file diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..4883060 --- /dev/null +++ b/go.mod @@ -0,0 +1,36 @@ +module pi-launcher + +go 1.25.0 + +require github.com/wailsapp/wails/v2 v2.13.0 + +require ( + git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 // indirect + github.com/bep/debounce v1.2.1 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/godbus/dbus/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.3 // indirect + github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect + github.com/labstack/echo/v4 v4.13.3 // indirect + github.com/labstack/gommon v0.4.2 // indirect + github.com/leaanthony/go-ansi-parser v1.6.1 // indirect + github.com/leaanthony/gosod v1.0.4 // indirect + github.com/leaanthony/slicer v1.6.0 // indirect + github.com/leaanthony/u v1.1.1 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/samber/lo v1.49.1 // indirect + github.com/tkrajina/go-reflector v0.5.8 // indirect + github.com/valyala/bytebufferpool v1.0.0 // indirect + github.com/valyala/fasttemplate v1.2.2 // indirect + github.com/wailsapp/go-webview2 v1.0.22 // indirect + github.com/wailsapp/mimetype v1.4.1 // indirect + golang.org/x/crypto v0.51.0 // indirect + golang.org/x/net v0.54.0 // indirect + golang.org/x/sys v0.44.0 // indirect + golang.org/x/text v0.37.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..b664a33 --- /dev/null +++ b/go.sum @@ -0,0 +1,83 @@ +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3 h1:N3IGoHHp9pb6mj1cbXbuaSXV/UMKwmbKLf53nQmtqMA= +git.sr.ht/~jackmordaunt/go-toast/v2 v2.0.3/go.mod h1:QtOLZGz8olr4qH2vWK0QH0w0O4T9fEIjMuWpKUsH7nc= +github.com/bep/debounce v1.2.1 h1:v67fRdBA9UQu2NhLFXrSg0Brw7CexQekrBwDMM8bzeY= +github.com/bep/debounce v1.2.1/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= +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/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/godbus/dbus/v5 v5.1.0 h1:4KLkAxT3aOY8Li4FRJe/KvhoNFFxo0m6fNuFUO8QJUk= +github.com/godbus/dbus/v5 v5.1.0/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.3 h1:saDtZ6Pbx/0u+bgYQ3q96pZgCzfhKXGPqt7kZ72aNNg= +github.com/gorilla/websocket v1.5.3/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e h1:Q3+PugElBCf4PFpxhErSzU3/PY5sFL5Z6rfv4AbGAck= +github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e/go.mod h1:alcuEEnZsY1WQsagKhZDsoPCRoOijYqhZvPwLG0kzVs= +github.com/labstack/echo/v4 v4.13.3 h1:pwhpCPrTl5qry5HRdM5FwdXnhXSLSY+WE+YQSeCaafY= +github.com/labstack/echo/v4 v4.13.3/go.mod h1:o90YNEeQWjDozo584l7AwhJMHN0bOC4tAfg+Xox9q5g= +github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0= +github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU= +github.com/leaanthony/debme v1.2.1 h1:9Tgwf+kjcrbMQ4WnPcEIUcQuIZYqdWftzZkBr+i/oOc= +github.com/leaanthony/debme v1.2.1/go.mod h1:3V+sCm5tYAgQymvSOfYQ5Xx2JCr+OXiD9Jkw3otUjiA= +github.com/leaanthony/go-ansi-parser v1.6.1 h1:xd8bzARK3dErqkPFtoF9F3/HgN8UQk0ed1YDKpEz01A= +github.com/leaanthony/go-ansi-parser v1.6.1/go.mod h1:+vva/2y4alzVmmIEpk9QDhA7vLC5zKDTRwfZGOp3IWU= +github.com/leaanthony/gosod v1.0.4 h1:YLAbVyd591MRffDgxUOU1NwLhT9T1/YiwjKZpkNFeaI= +github.com/leaanthony/gosod v1.0.4/go.mod h1:GKuIL0zzPj3O1SdWQOdgURSuhkF+Urizzxh26t9f1cw= +github.com/leaanthony/slicer v1.6.0 h1:1RFP5uiPJvT93TAHi+ipd3NACobkW53yUiBqZheE/Js= +github.com/leaanthony/slicer v1.6.0/go.mod h1:o/Iz29g7LN0GqH3aMjWAe90381nyZlDNquK+mtH2Fj8= +github.com/leaanthony/u v1.1.1 h1:TUFjwDGlNX+WuwVEzDqQwC2lOv0P4uhTQw7CMFdiK7M= +github.com/leaanthony/u v1.1.1/go.mod h1:9+o6hejoRljvZ3BzdYlVL0JYCwtnAsVuN9pVTQcaRfI= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/matryer/is v1.4.1 h1:55ehd8zaGABKLXQUe2awZ99BD/PTc2ls+KV/dXphgEQ= +github.com/matryer/is v1.4.1/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +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/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ= +github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/samber/lo v1.49.1 h1:4BIFyVfuQSEpluc7Fua+j1NolZHiEHEpaSEKdsH0tew= +github.com/samber/lo v1.49.1/go.mod h1:dO6KHFzUKXgP8LDhU0oI8d2hekjXnGOu0DB8Jecxd6o= +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/tkrajina/go-reflector v0.5.8 h1:yPADHrwmUbMq4RGEyaOUpz2H90sRsETNVpjzo3DLVQQ= +github.com/tkrajina/go-reflector v0.5.8/go.mod h1:ECbqLgccecY5kPmPmXg1MrHW585yMcDkVl6IvJe64T4= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo= +github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= +github.com/wailsapp/go-webview2 v1.0.22 h1:YT61F5lj+GGaat5OB96Aa3b4QA+mybD0Ggq6NZijQ58= +github.com/wailsapp/go-webview2 v1.0.22/go.mod h1:qJmWAmAmaniuKGZPWwne+uor3AHMB5PFhqiK0Bbj8kc= +github.com/wailsapp/mimetype v1.4.1 h1:pQN9ycO7uo4vsUUuPeHEYoUkLVkaRntMnHJxVwYhwHs= +github.com/wailsapp/mimetype v1.4.1/go.mod h1:9aV5k31bBOv5z6u+QP8TltzvNGJPmNJD4XlAL3U+j3o= +github.com/wailsapp/wails/v2 v2.13.0 h1:S7OgXWpj72V91unF8iDWJKbcS9ZpwCT3R0QVru4v2Mg= +github.com/wailsapp/wails/v2 v2.13.0/go.mod h1:nVr/wSIEZ7xxKPkzK65mjpKpaOPQI2k4pvLwGR/i4kc= +golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI= +golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w= +golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ= +golang.org/x/sys v0.0.0-20200810151505-1b9f1253b3ed/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ= +golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc= +golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +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/main.go b/main.go new file mode 100644 index 0000000..2efaef6 --- /dev/null +++ b/main.go @@ -0,0 +1,80 @@ +package main + +import ( + "embed" + "fmt" + "os" + "time" + + "github.com/wailsapp/wails/v2" + "github.com/wailsapp/wails/v2/pkg/options" + "github.com/wailsapp/wails/v2/pkg/options/assetserver" + "github.com/wailsapp/wails/v2/pkg/options/mac" +) + +//go:embed all:frontend/dist +var assets embed.FS + +func main() { + // 调试模式:不启 GUI,直接调 CheckEnv 走完流程,看是不是会崩。 + if len(os.Args) > 1 && os.Args[1] == "--selftest" { + app := NewApp() + fmt.Println("=== CheckEnv ===") + r := app.CheckEnv() + fmt.Printf("nodeOK=%v piPath=%q piVer=%q cred=%v portBusy=%v\n", + r.NodeOK, r.PiPath, r.PiVersion, r.CredExists, r.PortBusy) + fmt.Printf("issues=%v\n", r.Issues) + fmt.Println("=== CheckUpdate ===") + u := app.CheckUpdate() + fmt.Printf("installed=%q latest=%q hasUpdate=%v\n", + u.Installed, u.Latest, u.HasUpdate) + fmt.Println("=== listPIPids ===") + pids := listPIPids() + fmt.Printf("found %d pi-related pids:\n", len(pids)) + for _, p := range pids { + fmt.Printf(" - %s\n", p) + } + fmt.Println("=== waitForPort test (30141, 1s) ===") + fmt.Printf("port ready: %v\n", waitForPort(30141, 1*time.Second)) + fmt.Println("=== freePort test (30141) ===") + killed := freePort(30141) + fmt.Printf("killed: %d pid(s)\n", killed) + fmt.Println("=== done, exiting ===") + return + } + + app := NewApp() + + err := wails.Run(&options.App{ + Title: "pi-launcher", + Width: 1040, + Height: 1280, + AssetServer: &assetserver.Options{ + Assets: assets, + }, + BackgroundColour: &options.RGBA{R: 17, G: 24, B: 39, A: 1}, + OnStartup: app.startup, + OnShutdown: app.shutdown, + Bind: []interface{}{ + app, + }, + Mac: &mac.Options{ + TitleBar: &mac.TitleBar{ + TitlebarAppearsTransparent: true, + HideTitle: false, + HideTitleBar: false, + FullSizeContent: false, + }, + Appearance: mac.NSAppearanceNameDarkAqua, + WebviewIsTransparent: false, + About: &mac.AboutInfo{ + Title: "pi-launcher", + Message: "本地按需启动 pi-web UI。", + }, + }, + }) + + if err != nil { + println("Error:", err.Error()) + } +} \ No newline at end of file diff --git a/scripts/build-mac.sh b/scripts/build-mac.sh new file mode 100755 index 0000000..9b767d3 --- /dev/null +++ b/scripts/build-mac.sh @@ -0,0 +1,61 @@ +#!/usr/bin/env bash +# Build pi-launcher.app for macOS (universal arm64/x86_64). +# +# 用法: ./scripts/build-mac.sh +# +# 产物: build/bin/pi-launcher.app +# 安装: ./scripts/install-app.sh (拷贝到 /Applications/ + 刷新图标缓存) +# +# 注意: Wails v2 跨平台 build 需要在目标平台编译。 +# 想出 Windows 版,必须在 Windows 上跑 scripts/build-windows.bat。 + +set -euo pipefail + +cd "$(dirname "$0")/.." + +echo "▶ pi-launcher · macOS build" +echo "" + +# 1. 基础工具检查 +command -v go >/dev/null 2>&1 || { echo "✗ go not installed"; exit 1; } +command -v node >/dev/null 2>&1 || { echo "✗ node not installed"; exit 1; } +command -v npm >/dev/null 2>&1 || { echo "✗ npm not installed"; exit 1; } +command -v wails >/dev/null 2>&1 || { echo "✗ wails not installed (go install github.com/wailsapp/wails/v2/cmd/wails@latest)"; exit 1; } + +GOOS=$(go env GOOS) +if [[ "${GOOS}" != "darwin" ]]; then + echo "✗ must run on macOS (current: ${GOOS})" + exit 1 +fi + +# 2. 同步前端依赖(版本变更后才需要,但每次跑更稳) +echo "▶ npm install" +(cd frontend && npm install) + +# 3. 编译 +# -clean: 清掉 build/bin,确保 icns / Info.plist 跟当前源码一致 +# 不带 -platform: 当前平台 + 当前架构 +echo "" +echo "▶ wails build" +wails build -clean + +# 4. 校验产物 +APP="build/bin/pi-launcher.app" +if [[ ! -d "${APP}" ]]; then + echo "✗ ${APP} not found" + exit 1 +fi +if [[ ! -f "${APP}/Contents/Resources/iconfile.icns" ]]; then + echo "✗ iconfile.icns missing" + exit 1 +fi + +ICON_SIZE=$(stat -f%z "${APP}/Contents/Resources/iconfile.icns") +EXE_SIZE=$(stat -f%z "${APP}/Contents/MacOS/pi-launcher") +echo "" +echo "✓ app: ${APP}" +echo " binary: ${EXE_SIZE} bytes" +echo " icon: ${ICON_SIZE} bytes" +echo "" +echo " open: open ${APP}" +echo " install: ./scripts/install-app.sh" \ No newline at end of file diff --git a/scripts/build-windows.bat b/scripts/build-windows.bat new file mode 100644 index 0000000..c290dc7 --- /dev/null +++ b/scripts/build-windows.bat @@ -0,0 +1,87 @@ +@echo off +REM Build pi-launcher.exe for Windows (amd64). +REM +REM 用法: scripts\build-windows.bat +REM +REM 前置依赖(Windows 上装好后): +REM - Go 1.21+ https://go.dev/dl/ +REM - Node.js 18+ https://nodejs.org/ +REM - Wails CLI go install github.com/wailsapp/wails/v2/cmd/wails@latest +REM - WebView2 Runtime Win10 1803+ 自带,否则 https://aka.ms/webview2 +REM - MSVC build tools https://visualstudio.microsoft.com/downloads/ (Build Tools for Visual Studio, 勾选 "Desktop development with C++") +REM +REM 注意: Wails v2 的 Windows build 需要 MSVC toolchain (cgo 编译 webview2 loader)。 +REM 不能在 macOS / Linux 上 cross-compile 出 .exe。 +REM +REM 产物: build\bin\pi-launcher.exe + +setlocal enabledelayedexpansion + +cd /d "%~dp0\.." + +echo ^>^> pi-launcher · Windows build +echo. + +REM 1. 基础工具检查 +where go >nul 2>nul +if errorlevel 1 ( + echo [X] go not installed + exit /b 1 +) +where node >nul 2>nul +if errorlevel 1 ( + echo [X] node not installed + exit /b 1 +) +where npm >nul 2>nul +if errorlevel 1 ( + echo [X] npm not installed + exit /b 1 +) +where wails >nul 2>nul +if errorlevel 1 ( + echo [X] wails CLI not installed - run: go install github.com/wailsapp/wails/v2/cmd/wails@latest + exit /b 1 +) + +REM 2. 检查 WINDOWS 环境 +if not "%OS%"=="Windows_NT" ( + echo [X] must run on Windows, current: %OS% + exit /b 1 +) + +REM 3. 同步前端依赖 +echo ^>^> npm install +cd frontend +call npm install +if errorlevel 1 ( + echo [X] npm install failed + exit /b 1 +) +cd .. + +REM 4. 编译 +echo. +echo ^>^> wails build +wails build -clean -platform windows/amd64 +if errorlevel 1 ( + echo [X] wails build failed + exit /b 1 +) + +REM 5. 校验产物 +set EXE=build\bin\pi-launcher.exe +if not exist "%EXE%" ( + echo [X] %EXE% not found + exit /b 1 +) + +echo. +echo [OK] exe: %EXE% +echo size: %~z1 bytes +echo. +echo run: %EXE% +echo build dir: build\bin\ +echo. + +endlocal \ No newline at end of file diff --git a/scripts/install-app.sh b/scripts/install-app.sh new file mode 100755 index 0000000..729ee66 --- /dev/null +++ b/scripts/install-app.sh @@ -0,0 +1,65 @@ +#!/usr/bin/env bash +# 装 pi-launcher.app 到 /Applications/,并强制刷新 macOS 图标。 +# +# 背景: macOS LaunchServices 会把 com.wails.pi-launcher 的图标缓存成 +# 当前 app 文件的快照。每次 wails build 之后 .app 内容重建,缓存可能不刷新, +# 导致 Dock 显示默认 .app 占位图而不是真实 icns。 +# +# 解决: 把 .app 复制到一个稳定路径(/Applications/),重建时先 rm 再 cp, +# lsregister -f 强制重新注册。 +# +# 用法: ./scripts/install-app.sh + +set -euo pipefail + +APP_NAME="pi-launcher.app" +SRC="build/bin/${APP_NAME}" +DEST="/Applications/${APP_NAME}" + +if [[ ! -d "${SRC}" ]]; then + echo "✗ ${SRC} not found, run 'wails build' first" + exit 1 +fi + +# 1. 验证 icns 文件是新图 +if [[ ! -f "${SRC}/Contents/Resources/iconfile.icns" ]]; then + echo "✗ iconfile.icns missing — icon wasn't packaged" + exit 1 +fi +ICON_SIZE=$(stat -f%z "${SRC}/Contents/Resources/iconfile.icns") +if [[ ${ICON_SIZE} -lt 100000 ]]; then + echo "⚠ iconfile.icns suspiciously small (${ICON_SIZE} bytes)" +fi +echo "✓ iconfile.icns: ${ICON_SIZE} bytes" + +# 2. 删除旧版(让 lsregister 看到全新路径) +if [[ -d "${DEST}" ]]; then + rm -rf "${DEST}" +fi + +# 3. 复制到 /Applications +cp -R "${SRC}" "${DEST}" +echo "✓ copied to ${DEST}" + +# 4. 强制重新注册到 LaunchServices +LSREGISTER="/System/Library/Frameworks/CoreServices.framework/Versions/A/Frameworks/LaunchServices.framework/Versions/A/Support/lsregister" +"${LSREGISTER}" -f "${DEST}" + +# 5. touch 一下让文件 mtime 更新 +/usr/bin/touch -c "${DEST}/Contents/Info.plist" +/usr/bin/touch -c "${DEST}/Contents/Resources/iconfile.icns" + +# 6. 清 Dock iconcache +DOCK_CACHE=$(find /var/folders -name "com.apple.dock.iconcache" 2>/dev/null | head -1) +if [[ -n "${DOCK_CACHE}" ]]; then + rm -f "${DOCK_CACHE}" + echo "✓ cleared dock iconcache" +fi + +# 7. 重启 Dock 强制重读 +killall Dock 2>/dev/null || true +sleep 1 + +echo "" +echo "✓ ${APP_NAME} installed at ${DEST}" +echo " open it via Finder / Spotlight / Dock (re-add to Dock if needed)" \ No newline at end of file diff --git a/wails.json b/wails.json new file mode 100644 index 0000000..918a112 --- /dev/null +++ b/wails.json @@ -0,0 +1,13 @@ +{ + "$schema": "https://wails.io/schemas/config.v2.json", + "name": "pi-launcher", + "outputfilename": "pi-launcher", + "frontend:install": "npm install", + "frontend:build": "npm run build", + "frontend:dev:watcher": "npm run dev", + "frontend:dev:serverUrl": "auto", + "author": { + "name": "Jack", + "email": "jack0210_@hotmail.com" + } +} \ No newline at end of file