From 353bbffada10d16eab94c8014ac01750b5d6da56 Mon Sep 17 00:00:00 2001 From: bookworm Date: Fri, 10 Apr 2026 01:59:27 +0800 Subject: [PATCH] =?UTF-8?q?feat(admin):=20GUI=20=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E7=A0=81=E7=94=9F=E6=88=90=E5=99=A8=20Bookworm-AuthGen.exe?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增管理员可视化工具, 替代 CLI gen-authcode.js: - WinForms GUI: 用户名/Sub-Key/有效期 + 一键生成 + 一键复制 - 品牌视觉: 白底 + #5865F2 蓝紫 + 深色标题栏 + 书虫学者图标 - PS2EXE -NoConsole -NoOutput (92 KB) Co-Authored-By: Claude Opus 4.6 (1M context) --- admin-authcode-gui.ps1 | 337 +++++++++++++++++++++++++++++++++++++++++ admin-authcode.ico | Bin 0 -> 45177 bytes build.ps1 | 76 ++++------ 3 files changed, 370 insertions(+), 43 deletions(-) create mode 100644 admin-authcode-gui.ps1 create mode 100644 admin-authcode.ico diff --git a/admin-authcode-gui.ps1 b/admin-authcode-gui.ps1 new file mode 100644 index 0000000..32e1a9f --- /dev/null +++ b/admin-authcode-gui.ps1 @@ -0,0 +1,337 @@ +<# +.SYNOPSIS + Bookworm 授权码生成器 (管理员 GUI 工具) +.DESCRIPTION + 内部调用 node gen-authcode.js, 提供可视化界面生成多用户授权码。 + 打包命令: 见 build.ps1 -Admin +#> +$ErrorActionPreference = "Stop" +Add-Type -AssemblyName System.Windows.Forms +Add-Type -AssemblyName System.Drawing +[System.Windows.Forms.Application]::EnableVisualStyles() + +# ─── 路径 ───────────────────────────────────────────── +$ScriptDir = if ($PSScriptRoot) { $PSScriptRoot } +elseif ([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName -match '\.exe$') { + Split-Path -Parent ([System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName) +} elseif ($MyInvocation.MyCommand.Path) { + Split-Path -Parent $MyInvocation.MyCommand.Path +} else { $PWD.Path } + +$GenScript = Join-Path $ScriptDir "gen-authcode.js" +$SecretsTxt = Join-Path $ScriptDir "secrets.txt" + +# ─── 品牌色 ─────────────────────────────────────────── +$brandBlue = [System.Drawing.Color]::FromArgb(88, 101, 242) +$brandDark = [System.Drawing.Color]::FromArgb(30, 31, 46) +$brandLight = [System.Drawing.Color]::FromArgb(245, 245, 250) +$successGreen = [System.Drawing.Color]::FromArgb(46, 160, 67) +$warningOrange = [System.Drawing.Color]::FromArgb(227, 137, 29) + +# ─── 主窗口 ─────────────────────────────────────────── +$form = New-Object System.Windows.Forms.Form +$form.Text = "Bookworm 授权码生成器 — 管理员工具" +$form.Size = New-Object System.Drawing.Size(560, 580) +$form.StartPosition = "CenterScreen" +$form.FormBorderStyle = "FixedDialog" +$form.MaximizeBox = $false +$form.BackColor = [System.Drawing.Color]::White +$form.Font = New-Object System.Drawing.Font("Segoe UI", 9) + +# ─── 标题栏 ─────────────────────────────────────────── +$header = New-Object System.Windows.Forms.Panel +$header.Location = New-Object System.Drawing.Point(0, 0) +$header.Size = New-Object System.Drawing.Size(560, 56) +$header.BackColor = $brandDark +$form.Controls.Add($header) + +$titleLabel = New-Object System.Windows.Forms.Label +$titleLabel.Location = New-Object System.Drawing.Point(20, 14) +$titleLabel.Size = New-Object System.Drawing.Size(520, 28) +$titleLabel.Text = "Bookworm 授权码生成器" +$titleLabel.Font = New-Object System.Drawing.Font("Segoe UI", 14, [System.Drawing.FontStyle]::Bold) +$titleLabel.ForeColor = [System.Drawing.Color]::White +$header.Controls.Add($titleLabel) + +# ─── 输入区 ─────────────────────────────────────────── +$y = 72 + +# 用户名 +$lblUser = New-Object System.Windows.Forms.Label +$lblUser.Location = New-Object System.Drawing.Point(24, $y) +$lblUser.Size = New-Object System.Drawing.Size(120, 22) +$lblUser.Text = "用户标识 (--user):" +$form.Controls.Add($lblUser) +$txtUser = New-Object System.Windows.Forms.TextBox +$txtUser.Location = New-Object System.Drawing.Point(150, $y - 2) +$txtUser.Size = New-Object System.Drawing.Size(370, 28) +$txtUser.Font = New-Object System.Drawing.Font("Consolas", 11) +$txtUser.PlaceholderText = "例如: alice, 张三, 茶师兄" +$form.Controls.Add($txtUser) +$y += 38 + +# Relay Sub-Key +$lblKey = New-Object System.Windows.Forms.Label +$lblKey.Location = New-Object System.Drawing.Point(24, $y) +$lblKey.Size = New-Object System.Drawing.Size(120, 22) +$lblKey.Text = "Relay Sub-Key:" +$form.Controls.Add($lblKey) +$txtKey = New-Object System.Windows.Forms.TextBox +$txtKey.Location = New-Object System.Drawing.Point(150, $y - 2) +$txtKey.Size = New-Object System.Drawing.Size(370, 28) +$txtKey.Font = New-Object System.Drawing.Font("Consolas", 10) +$txtKey.PasswordChar = '*' +$txtKey.PlaceholderText = "sk-... (中转站后台创建的子 Key)" +$form.Controls.Add($txtKey) +$y += 28 + +# 显示/隐藏 Key +$chkShowKey = New-Object System.Windows.Forms.CheckBox +$chkShowKey.Location = New-Object System.Drawing.Point(150, $y) +$chkShowKey.Size = New-Object System.Drawing.Size(120, 22) +$chkShowKey.Text = "显示 Key" +$chkShowKey.Add_CheckedChanged({ $txtKey.PasswordChar = if ($chkShowKey.Checked) { [char]0 } else { '*' } }) +$form.Controls.Add($chkShowKey) +$y += 32 + +# 有效期 +$lblDays = New-Object System.Windows.Forms.Label +$lblDays.Location = New-Object System.Drawing.Point(24, $y) +$lblDays.Size = New-Object System.Drawing.Size(120, 22) +$lblDays.Text = "有效期 (天):" +$form.Controls.Add($lblDays) +$cmbDays = New-Object System.Windows.Forms.ComboBox +$cmbDays.Location = New-Object System.Drawing.Point(150, $y - 2) +$cmbDays.Size = New-Object System.Drawing.Size(100, 28) +$cmbDays.DropDownStyle = "DropDownList" +@(7, 14, 30, 60, 90, 180, 365) | ForEach-Object { $cmbDays.Items.Add($_) | Out-Null } +$cmbDays.SelectedIndex = 2 # 默认 30 天 +$form.Controls.Add($cmbDays) + +$lblDaysHint = New-Object System.Windows.Forms.Label +$lblDaysHint.Location = New-Object System.Drawing.Point(260, $y) +$lblDaysHint.Size = New-Object System.Drawing.Size(260, 22) +$lblDaysHint.Text = "" +$lblDaysHint.ForeColor = [System.Drawing.Color]::Gray +$form.Controls.Add($lblDaysHint) +$cmbDays.Add_SelectedIndexChanged({ + $d = [int]$cmbDays.SelectedItem + $exp = (Get-Date).AddDays($d).ToString("yyyy-MM-dd") + $lblDaysHint.Text = "到期: $exp" +}) +# 触发初始值 +$cmbDays.SelectedIndex = 2 +$y += 38 + +# secrets.txt 状态 +$lblSecrets = New-Object System.Windows.Forms.Label +$lblSecrets.Location = New-Object System.Drawing.Point(24, $y) +$lblSecrets.Size = New-Object System.Drawing.Size(500, 22) +if (Test-Path $SecretsTxt) { + $lineCount = (Get-Content $SecretsTxt -ErrorAction SilentlyContinue | Where-Object { $_ -match '=' }).Count + $lblSecrets.Text = "secrets.txt: $lineCount 个凭证已配置" + $lblSecrets.ForeColor = $successGreen +} else { + $lblSecrets.Text = "secrets.txt: 未找到 ($SecretsTxt)" + $lblSecrets.ForeColor = [System.Drawing.Color]::Red +} +$form.Controls.Add($lblSecrets) +$y += 28 + +# Node.js 状态 +$lblNode = New-Object System.Windows.Forms.Label +$lblNode.Location = New-Object System.Drawing.Point(24, $y) +$lblNode.Size = New-Object System.Drawing.Size(500, 22) +$nodeOK = [bool](Get-Command node -ErrorAction SilentlyContinue) +if ($nodeOK) { + $nodeVer = try { (& node --version 2>$null) } catch { "" } + $lblNode.Text = "Node.js: $nodeVer" + $lblNode.ForeColor = $successGreen +} else { + $lblNode.Text = "Node.js: 未安装 (必需)" + $lblNode.ForeColor = [System.Drawing.Color]::Red +} +$form.Controls.Add($lblNode) +$y += 36 + +# ─── 生成按钮 ───────────────────────────────────────── +$btnGenerate = New-Object System.Windows.Forms.Button +$btnGenerate.Location = New-Object System.Drawing.Point(150, $y) +$btnGenerate.Size = New-Object System.Drawing.Size(160, 40) +$btnGenerate.Text = "生成授权码" +$btnGenerate.Font = New-Object System.Drawing.Font("Segoe UI", 11, [System.Drawing.FontStyle]::Bold) +$btnGenerate.FlatStyle = "Flat" +$btnGenerate.BackColor = $brandBlue +$btnGenerate.ForeColor = [System.Drawing.Color]::White +$btnGenerate.FlatAppearance.BorderSize = 0 +$btnGenerate.Cursor = [System.Windows.Forms.Cursors]::Hand +$form.Controls.Add($btnGenerate) + +$btnClear = New-Object System.Windows.Forms.Button +$btnClear.Location = New-Object System.Drawing.Point(320, $y) +$btnClear.Size = New-Object System.Drawing.Size(80, 40) +$btnClear.Text = "清空" +$btnClear.FlatStyle = "Flat" +$btnClear.FlatAppearance.BorderColor = [System.Drawing.Color]::LightGray +$form.Controls.Add($btnClear) +$y += 54 + +# ─── 分隔线 ─────────────────────────────────────────── +$sep = New-Object System.Windows.Forms.Label +$sep.Location = New-Object System.Drawing.Point(20, $y) +$sep.Size = New-Object System.Drawing.Size(510, 1) +$sep.BorderStyle = "Fixed3D" +$form.Controls.Add($sep) +$y += 10 + +# ─── 结果区 ─────────────────────────────────────────── +$lblResultTitle = New-Object System.Windows.Forms.Label +$lblResultTitle.Location = New-Object System.Drawing.Point(24, $y) +$lblResultTitle.Size = New-Object System.Drawing.Size(200, 22) +$lblResultTitle.Text = "生成结果" +$lblResultTitle.Font = New-Object System.Drawing.Font("Segoe UI", 10, [System.Drawing.FontStyle]::Bold) +$lblResultTitle.ForeColor = $brandDark +$form.Controls.Add($lblResultTitle) +$y += 26 + +# 授权码 (大字 Consolas, 可选中复制) +$txtAuthCode = New-Object System.Windows.Forms.TextBox +$txtAuthCode.Location = New-Object System.Drawing.Point(24, $y) +$txtAuthCode.Size = New-Object System.Drawing.Size(400, 32) +$txtAuthCode.Font = New-Object System.Drawing.Font("Consolas", 13, [System.Drawing.FontStyle]::Bold) +$txtAuthCode.ReadOnly = $true +$txtAuthCode.BackColor = $brandLight +$txtAuthCode.ForeColor = $brandDark +$txtAuthCode.Text = "" +$form.Controls.Add($txtAuthCode) + +$btnCopy = New-Object System.Windows.Forms.Button +$btnCopy.Location = New-Object System.Drawing.Point(430, $y) +$btnCopy.Size = New-Object System.Drawing.Size(90, 32) +$btnCopy.Text = "复制" +$btnCopy.FlatStyle = "Flat" +$btnCopy.BackColor = $brandLight +$btnCopy.FlatAppearance.BorderColor = [System.Drawing.Color]::LightGray +$btnCopy.Enabled = $false +$form.Controls.Add($btnCopy) +$y += 40 + +# 详细信息 +$lblDetails = New-Object System.Windows.Forms.Label +$lblDetails.Location = New-Object System.Drawing.Point(24, $y) +$lblDetails.Size = New-Object System.Drawing.Size(500, 66) +$lblDetails.Text = "" +$lblDetails.ForeColor = [System.Drawing.Color]::FromArgb(100, 100, 120) +$form.Controls.Add($lblDetails) +$y += 70 + +# 状态栏 +$statusBar = New-Object System.Windows.Forms.Label +$statusBar.Location = New-Object System.Drawing.Point(0, $y) +$statusBar.Size = New-Object System.Drawing.Size(560, 24) +$statusBar.BackColor = $brandLight +$statusBar.ForeColor = [System.Drawing.Color]::Gray +$statusBar.Text = " 就绪 | $ScriptDir" +$statusBar.Font = New-Object System.Drawing.Font("Segoe UI", 8) +$statusBar.TextAlign = [System.Drawing.ContentAlignment]::MiddleLeft +$form.Controls.Add($statusBar) + +# ─── 事件处理 ───────────────────────────────────────── + +$btnCopy.Add_Click({ + if ($txtAuthCode.Text) { + [System.Windows.Forms.Clipboard]::SetText($txtAuthCode.Text) + $statusBar.Text = " 已复制到剪贴板" + $statusBar.ForeColor = $successGreen + } +}) + +$btnClear.Add_Click({ + $txtUser.Text = "" + $txtKey.Text = "" + $txtAuthCode.Text = "" + $lblDetails.Text = "" + $btnCopy.Enabled = $false + $statusBar.Text = " 已清空" + $statusBar.ForeColor = [System.Drawing.Color]::Gray +}) + +$btnGenerate.Add_Click({ + # 校验 + $user = $txtUser.Text.Trim() + $key = $txtKey.Text.Trim() + $days = $cmbDays.SelectedItem.ToString() + + if (-not $user) { + [System.Windows.Forms.MessageBox]::Show("请输入用户标识", "缺少用户名", "OK", "Warning") + $txtUser.Focus(); return + } + if (-not $key) { + [System.Windows.Forms.MessageBox]::Show("请输入 Relay Sub-Key`n(从中转站后台为用户创建)", "缺少 Sub-Key", "OK", "Warning") + $txtKey.Focus(); return + } + if (-not (Test-Path $SecretsTxt)) { + [System.Windows.Forms.MessageBox]::Show("secrets.txt 不存在:`n$SecretsTxt`n`n请先创建 secrets.txt (每行 KEY=VALUE)", "缺少凭证文件", "OK", "Error") + return + } + if (-not $nodeOK) { + [System.Windows.Forms.MessageBox]::Show("Node.js 未安装。`n请先安装: https://nodejs.org", "缺少 Node.js", "OK", "Error") + return + } + + $statusBar.Text = " 生成中..." + $statusBar.ForeColor = $warningOrange + $btnGenerate.Enabled = $false + [System.Windows.Forms.Application]::DoEvents() + + try { + $args = @($GenScript, $days, "-k", $key, "-u", $user) + $proc = Start-Process node -ArgumentList $args -NoNewWindow -PassThru ` + -RedirectStandardOutput "$env:TEMP\bw-gen-out.tmp" ` + -RedirectStandardError "$env:TEMP\bw-gen-err.tmp" ` + -WorkingDirectory $ScriptDir + + $sw = [System.Diagnostics.Stopwatch]::StartNew() + while (-not $proc.HasExited -and $sw.ElapsedMilliseconds -lt 30000) { + [System.Windows.Forms.Application]::DoEvents() + Start-Sleep -Milliseconds 100 + } + if (-not $proc.HasExited) { $proc.Kill(); throw "超时 (30s)" } + + $stdout = Get-Content "$env:TEMP\bw-gen-out.tmp" -Raw -ErrorAction SilentlyContinue + $stderr = Get-Content "$env:TEMP\bw-gen-err.tmp" -Raw -ErrorAction SilentlyContinue + Remove-Item "$env:TEMP\bw-gen-out.tmp", "$env:TEMP\bw-gen-err.tmp" -Force -ErrorAction SilentlyContinue + + if ($proc.ExitCode -ne 0) { + throw "gen-authcode.js 退出码 $($proc.ExitCode)`n$stderr" + } + + # 解析输出 + $authCode = if ($stdout -match '授权码:\s*(BW-\d{8}-[A-F0-9]{24})') { $Matches[1] } else { "" } + $fileId = if ($stdout -match '文件 ID:\s*([a-f0-9]{8})\s*→\s*(secrets-[a-f0-9]{8}\.enc)') { $Matches[2] } else { "" } + $expiry = if ($stdout -match '有效期:\s*\d+\s*天\s*\(至\s*(\d{4}-\d{2}-\d{2})\)') { $Matches[1] } else { "" } + + if ($authCode) { + $txtAuthCode.Text = $authCode + $lblDetails.Text = "用户: $user`n加密文件: $fileId`n有效期: $days 天 (至 $expiry)`n路径: $ScriptDir\$fileId" + $btnCopy.Enabled = $true + $statusBar.Text = " 生成成功 — $fileId | 请 git add + push 后将授权码发给 $user" + $statusBar.ForeColor = $successGreen + } else { + throw "无法解析授权码输出:`n$stdout" + } + } catch { + $txtAuthCode.Text = "" + $lblDetails.Text = "错误: $_" + $btnCopy.Enabled = $false + $statusBar.Text = " 生成失败" + $statusBar.ForeColor = [System.Drawing.Color]::Red + [System.Windows.Forms.MessageBox]::Show("生成失败:`n$_", "错误", "OK", "Error") + } finally { + $btnGenerate.Enabled = $true + } +}) + +# ─── 启动 ───────────────────────────────────────────── +$form.Add_Shown({ $txtUser.Focus() }) +[System.Windows.Forms.Application]::Run($form) diff --git a/admin-authcode.ico b/admin-authcode.ico new file mode 100644 index 0000000000000000000000000000000000000000..3dfd0d638645e5077b55f12744ee6f7fef991639 GIT binary patch literal 45177 zcmagEb8u$C);;{hwr$(Ct%)bL?TKyM&SYZSHlNsbGO>Si@BRM#s@|@yI=y>W_31vn z_O7+M4*&oHfC3;R1O63a03|2@;Qp_Ljr~8n8Vmr)`PWBG{6AX_0sxSK1OS+s|7SnI z{PV*B0K&rmvyqShfCLNxARyp>HYODSkWc=f_J0a7V8|2zXqE#2B9#@T5MXg(|8*kB zNQ2ods-TfkP)mwR zCa`wNz$4SLXi*^$WYOm5iAiW-WkW(jR8hngpdh4Cq^Tix$0&z*c3z*JW{EeV+FoKZ zo!!l!p10xmi2C7q)(1+$sV^jV$|rtdQFr!fYgib zHIOER=PMjh&J-NE+J%-_aij)}Sf4*6#}u_gb2*tOJ;9M(yG5GMOk~;ni{QqI-~pCs zoaFH1jzdXJQ+jv=)P9;2m>4kSLRufHzj>fL&jYHpCXtRHy^+fa8OQ+vMsfFq*7erl znrmkQnh}rUCRUd!Ytk(70XRdvT7mr>jMVX{5Afkk*}mkBf)TJF!C^}Kh%}g@o%T1< z1m?g_qx+!;6L7PM34posQ=4C5eG;MW>5XKh?jMz_7B}d1OETQ$>~D@l4i>v2%l0_) zEB#aPYtCvfA#5FOY%UUNCe@T_GElsulMm?0amza3>H-nobA!E*6rgnGm3|q2R(Y*& zT(M3OvcW3a_b1dI+DDZ}FU}TGcivZ1-_SUwY6E4ge~i-Sp^ZysOX5b5M(?JCvOVEw z=H#1?_+DapbN&SNg7iYZZUn(bD^UkC97RszJ-T1Rj-``u7x>=k-tKePfRM1@NoOs= z>&d_U2gpb$ir0u52L1n_)Jp^6=05I48p`=t@E&^X2UEsO9^8DPPti0Te zGVB+*lhMzMkysxTczMpCqU<&5`BcUb^S)BXAP}eQ(!e%0r$UhVSm>ytp}WQi+y%C$ zDc6iJS&CJwjpOq~hu}#;nX>3}ihYh-hbKQu4-Z?OhxQup7;+ePEXZk(K^i3a zlM#j?QGNYA(Fn|;H${=(u)l*jw^p(-R_BiiLm+!=Q$L2`KHV99uzqu&ChUcARvI+q zkUYpk#_`$>oDY21uJN0~VNfLY+WtU6bLuWjAQ&}dj2y80kio?$Dmd2VHGo6T&Y^RK z0ULD&Ld>Q?L&e1hSrLENL7bfR9zl(04bR}{qmnS+bPFo*>nM zp5;%nPwmsEJ|1PP`TIqL_=@%|;)*h$C6AKx>i)wltF2b8y0ycxD~s8sGDri{(3(bM zrO{>7fBiX*=^>LRt#f1`Bcf~IC@E%^luF3-!(BZNj@6|7(0lcC$%>L!rMeQt&7Sqc z#=G~QxhsTbAZXTwWw{JD{jAW3JLP}Th<#z$i86ujR`4cV<3$+4l4+&5g!w>Ab&pJ# zPBiS5dgHcG$xI_KgRFUDVA%aKc>fY;#VX!r)#0GxloZjXV@xBukQ&X}hC(#Kv93@k zd2X8#AXgE|f%NM2?PJDx$b?AUZF734$hasM`qj7w(`ISysQ~L0ZqhKa5?ep(*_u>GNq{x#$4f4`_vuqY(FUL;BqQ3QvDi~4LIA%pc*Xs=agxF?E+X@@oR z4T!=;H9<$i+A@+y$7*19qA)Uw6fbN^5j{(3xqsj8yy@|o^1VWqZn~Gu@}x{2&+)l_ z?eUpuKOx-p$Fz0>%MT0QvJ7@^2`FMFu809-DxD7gePfpJAzpk#`yGfgbWmr#p?v#i zzpmxcVZmdaEjQz{F-V&~cAR(w)V{FRXy<${3pPJoPsrltB%cA%AN}N&pVb4X0TN8a zJk&eT?=2Ys!fN1+IbrUnEhFDH$0X_IgY+F#RZjwX&;8R<(-4){4qP0Uj1^x}1OGhY zD+$B98j+YaYHnjc{}GbzWG)uoTY$#G65DAVT$#5q6**fi%p$kjw9zJN#z>`d-FYo? z3)IS8`=UonjfHBN0-j7dqE-`ylf29_lY+(^miVYkz0t!Gunjmk^RR)CdQ2%RC}N%y4D=GaM^3h+`!ob%>CyK7zY!}> z=C#)X6=3c-5M>!q+UQ_E5ID(1rJeI)ass1;4UF^}W!w_mf87AqYs`-#iU zK+K#%9Sj^QpdS9h4KMKi^~o|wiL6`{zAsIW@{$*|^!()YxtPBWF~5{?~h=O%c6<>2ru|bPRBQshJ;px$2uH?DsIbCVAZ2Cq zRwaYz0eX{L3gY;r1Jf8C`hC?}ay^lwD>&CQ!;7X>)9gg#uh|7Bhl0ZI1M;p37>gT$ z7BXbWsyF-VNXdBy--HbhgV=~9`hfK`YYD0ayrf&OrHjrDH^UQ+z^jl`>eU?fu*!_s z9VW+(fP9ygNZig?0T3MZV4?uDrTr?b%wL)6N~=QB;w~&tIBVkM5SN5Nkgw zGDXPZk4&x;Fv%t832ov(Zmi(@1>9rx_sq6aXus@D@b#?4k9*z#ndYF%qbgq7)a$bK zj9h)mcuuJLgXxi&bk;6f=t(?=%?UTreYxJu!nRncEorC}0UO1Z2DC?ENkZA0eHkp1 z^0Ot6Oj$VWl^s19S5c)iTF5I&EV&}urW==9q2`|hq08CD%yRPaoc9~fu;y5wMZ~#* z?3JmTVNnE#-9`024Mx9d;%&p!lE=~wo61)sTaFDuZ;A+QOmkxFkNw>X)ftXU$8e(XpwHkm)ya&}P4dTO z&gRH&K6L2vO#fQ>qG2U9;pBjX%!JA77mi7 zCbJ|Xc0 zB;gEvje=uYuZY7V563@SO^WSWOQ#U;4M@Pc>4cn;f%RRpqqM!zo0q#dE=A;kAq9y* zSVD6fzB^@N6S`Ip=vh@vzwlSO|D?0wyCT=ebzPPkKGH|J)+p{;#+#R8!3aweCSW_B z%^)1eJyC0#b`IC*&tV0mg?GW&YYDdo=Il#XVS+Md=oblwOeMg~nS!H)RVv;8@dfdyzdUER+a zQ72qth|+6N;D({BfHQit*0^vAMQ?UuPB<6(%O96Imc2tt9Yo@~Q4s`e`F8p&zAICP z!i5fzs1;CrHCSd>wrgXEkOqw^^(%23_I{w3iK+-sI&uR8G11%2=uFKvqhxMFUb0wN zCB&KDtQ5lo{=%CU&^-9M4+20TfBunlFz3x_zh-T2SBG07q)=R){mVhN#v#H!6}OX# zN?bwAnq~=txh{tTI~dp0C6B`>sl**E8?QF^T573lJgyjtN(CTA=~kG?IrILjDpj$T z2;92$&3tlVXHW?ZlaqZ4Q*{7Y9K|VV#J_R~eQ5zmW8PF4XOKLV)d1rq)GK{7e=B&B zU{|RhHdO5Ar0Nh}%ZI*ssd%JCN9a%av8;Hk%K(E^yUM(H70Z&wz3FYYQPR;+fh@Pcyp`^lQmiZP}*_^a26h2GC2w%aTziq-@CH9DA9vmbD9g?4pr$#803e$PsMw?uL5J>>)HKDOrQs4 zOI@db-wK52j=*Y8W(5GZv64`A_x00>@BiXGv1syN8*s)W0iIbMC<- ze+O-4N*-(k4XO2uU4zQ~Y6Q{S0BE_4f!)&HZ$cp6UF%T1#aAOCdTYKt-qvE}W_AoE zjJ+Df61rzt2YDgc=tv~Bq!Bq{>4dMsM?AfP1Pn&;<)ix~h9ysuR8>Ex*Ol1?UgRPc zTA0?t<^N(tqH^-)}OBx)ebT;s|Az*bH`{d;XmxpvDXE&!%p@wkQj8*HtD^YOlw-Rx3 zGqdv!qs&uXdGtRHW411ym7Qi-vUrhOAob)WpPCNKg^H9_*Uv8&^?Ep}nwoMdD5JOs zEEm3Yf3?T*OozA-*Yl<>&kQ>jW$JM)=il_;kO9HhPm@XSFbMvp(-pR^)@58`r`BvI zXX!Dl)MQ+~(XlRUidu%if8IHztSPryAatRX9)*A$;z8Z6>-fXKWnR3bd9MM7`Pxn7 z$yaYtSpR|;Ii`XOkrRA2p!^Cym?LG)S&Txeb_7+T2AbdTYZ3=41ZX#_)bgy(z}EkNs8J_JQ1hGZ3$}HqfpFJ<*`ei^4cQ^=jt0z z*qB3d;gM{La%HUH?nR91$uZLO5htjg5NkzOcbK8M&ArCx|5PcU4V zP3d-Z7y%k>{|S$H{%XRQNUX=enP*YWXTCpEfggxR)Xv3LZ~mZ6Ym}O zNeUe%9PvpmBsB(+Cw98)M;-5jkq5jT2y!+*q*;%FP@kkyOO%BN&=1bTL&10?bB*W+ zB2~!H?;$5}ir=oq3N0@em+0^Q4;8)W@Ko1aj;sS`BYq9eT<yRO9M?-!k zNZC0mvuqbo^R5J;#Aru79ys|7qAO7ca2HM%%;?gIp`04NK23SGY$H!oioM6(2Zs?1&^(d!X#p`fV*9N)f! z2$mW9iS3DC0A1a#PxkB|*!{&8U76Fx<2%3g)-YHg=#c^XReei!HPOyL>BZ$6kwr-w)bqDqw3w@eVMC+I*?haSI#CCQNlYGA8_~y_8U(-_) zh?hpRxV#^L&p&-nzif6*366e@DOWpyxdta>tQPI8{Z6hZFI;uc@m1ti_8+B97IRhE z+#d33dv)wEqJ%p=N9DalCRQ4}wDUAQ{;EfW4jN}BorxrL0KdEf*$HEX;ia-)bwX7# zWkCTPX<$fcWs{V8TG?CF3AKx^uOi`;Ym=@WfjWH73TXKcDgoldbUy1<%Ck#KUy~e* zl9XoQ(PzyJze_?NTkR6eH{e=JnZ{CWHr_j{f^>0r*iwsy?!B*;4XRJ3~*f~&;1qJC9K+kljfG>c;`zH90Hyq zX`8bdjU+s?29t`Qqd{QXV-e)YvaOiE#})&LLNYQhxrsoh<-l*mzT$Nd4$N5fZ_Or{``otj0`a(*KTO)du$zZk6!7*Y7ZarDUD z^F4}fV!QDY^*O4F)nw%Xnaq%Lj)QYQiF*SDo+aF@ZZ~aFNe2-fT^M1PZF+eys|V#n zoyrEwsCI{~ z6z-Ou{ZTC;!hpddapw89lE={rKk!`qh8z5~ukj9_WE|d}9tkR?iGBIICasS1kMfR* zb`zJ^LQO(umd=vqP>@0i3ApjRP36^~Gh*pS;9rY88RSgm|A#fUm1KMgQ4&azNPhrhpKfJ1@|0v zzgU}VGF?)*;Y~|{lReVg1f9wV;6e?(=%46JeCZTSsow}_rnJ3dQzjsy;sPA)BLi)+D&5U4kKvV)MER~kMGQ}7AcDIMhxm;?u*ZP~BGv7lN`k(S-d zG+gPv%1GKcqsRt5sHqEyOdI!{fijzF)K!ChieHkj106C@@&|MdPhl@X4k(zLM}nPt zxfoA5MCo*&(Bp>12VcU>Fn%WZW*IhsPM4WsjABR{6SrKdiOVvn%12j#fe68@sGlLB zALe7kj{@Fk5oc8SH4lH&d2i+k^uk#oU@h_WNghFj3<`7bAsR7Fka%VAA|tu;mGi+Q zZK~ht5}iH+Oxb6?YA*KaRHW0z_NrGwFM) zU1}+iUM==LN1bP4e{HKI$RMpJV%yy*rJi^%c=3sLsesLT5uCY+wE8$JHV~Adj~I@U zaL5FMI>@~R1x}F#j)8^;HpJATk$#6-O2Kw1e^oTkO%^N3-d%_auEi0Sl;sO83Qi`y zfV;hP>zJqrN*O$9j>Fv(%xiRz`Z4UF*g0H8?2N@~e$%Y3H-czS7t+Y6s#Tb`f+2NM zz1bX6g>C$iSomw=T=N~#-3BBSG_H*xYV~;DiDc0hR33+k+m>a~M9aEWIbqk2mC3ZY zsWMFbOZN9;*T|-@ow3@9@sTLa-?rwU`KhL2!;cZqfGR)|Ms$~X-Z9d)nIB8XKy+nS zz&1caPr6wB$re;$+MpDes(GS>+&9|CK5syFBJqAJQ!b4a8b6VWL#PFpD6$XvyQj~n z0GFJxy1{}9nF@KHtt|JLj04_gzkM4k*emUF)n%6sVc8I|Ej>Kay`{giq93_4~n2)H@PNl2NYDDcH%MV3kk^G$6IfVLw zt`{A+AY0D1{9);&^5T9>f1=sY3zEw(;^k4(N_`$h)UpF+Lfz@*Vn+zgF^( zi~8SyR&uYUO^>B_Kn=G5Bhs3M@V!O{CP~K5tUu4XWM6(+)F^r{x&Yq;m=7k3;$4jb z;YJf^OJI+mcHZRHSn;0$a+DkBR6eRdSTzA#V_vZA(Us~y`#00_^S+*IeC7uFE~A`)wdhcVG;({Tq6z$dCO>rYgw@vp8C4ElZ*t2RaI7TTi)*7PG_&jT9Q}z%kcGn)n$g4RP4s%8En|YS z0I`XJaGm$`w+-Ng?_8nKO#!0CQZApv7pnqnC-x|hzZ-oqSvr$0|3=*!?z%MbI`HQ#n+`7SRi<0)MQbJ(abau$oT`8o9gJ(oAfwt(gTk z2^Y-A)fN|x3>1Y14V$+lG!*K)Wf7xEXjd1faK)%MD zOD+MvzM;O)FrR_^8E=kFR-p*Eewvs-s9{A#>WH3FlLn&(6}{DGY)#4U(4^zI@E2Rl-x;%w!W$qTBPAn!W3tE2 z1_v8 z0uF7s)jGmqQI$OGb;`Dqgh_pl)2j80&?np(4PwZ=|HmI#B5jbR2(?ROS*3A5{3@;f zb8e9Km7nJDN}}g~PKh>pFh44{EvkH*S+_6q+Q?}g+h|v>hU?N%w@m}gfUPEn_gMeF zb9Ph1CIj!$*&|eU*zc@)nlcjsoJ&H&4Up8~_e#v=^$n%kpBu6dU}uL$P^$<|Gpgj| zFXEP6x;q}^lj4}UIn?}e@ZAfi-I9UUa{><~L z=>BRkFkx13`iby_+YjE_xd`o=$3=1asds>s4XDU!Y~9@Ng(~tqMfA}a)uCQ=Pn2;` zKoMK~jd^#!Ow!AiYy$RYMKm#h!!_Hb(kaOIJHVK}LeGjn_Xw|;28Yz8Y!*5&h^nv} zq6@#q$s7`Z;5`GsaA^~9^%$BYwy<8AplU-VOvLq^?w2hQHHkUo&7L4m<{-&c6!W8+ zF4b96qghx-b|wI`8)D_=+t$Kg?9${n6E)%f zdb$+AXqk-J>K=v{sjX8mNwcR{@~5vf?Brq;KPJ=OvKU4uqFQ7q5}=T%YV=9QsTSn+Yu{QwFReeD(5o01Ph}Bp%I9-ryL z4r1wnF$CQH74zfyc@}m0F-?&hcOVlOdYW**_z-3|wRb~oz$YQd%TdtC%2IfsJ@+@X ze<*~BpGih!&su5sC3=tV!@uuJ`Rj0OSIJY&aZL&`?`mo|j}XPZH} zQzA+{S#FP$aBn4Z(ohac9qSJd>V>(D-2n83$YT#5_c42RNstLxjfm=9E0K)R-x+F` zvMo#9m%@)Y`3M|&;#nXiW<+VLQ&n#u3~zEikN0*A^CQ;emM@)R3Wb5X&i*PL!`Z%l za7pU?${oX6k+#&tTTSHM!LrBjh*ogZr+58**!9)@+$Vq(5%J{quYLSDBQG-#(CNN(gJz zzlFB01Cd$V#KQg$IUMlMAMjr}JSb>12>?)T{Z9^G>A__DR8Rey_0?5>%nAvSa0f9V zr3Gs%#D+wXK*+XoM0UbwMmz=328l0P5raT3fdq}2kC{t*1b`z$SHPSX1c-Jiyk$O4v5Q54s4@=@5ZoFTgXEDE5rar+ zDWcV{Ck8+UG)B!;z`zm@7QkbR0x&~@jHyMGtEd4a;L7Hqq~H@Z3KvBgf~2MYZVap5 zLiJHA5K!HqaYfmPJdqWg^8AQ@CPal8I%>-tj+b>a^!w1t)WY=lnkeJI3I@a4s`aNP z-at`Hg8Iotu%;Et6J)26&ievgbtlHTQMcZ1yi>qA!$8vpiUyITdg~d%9a}vWwjG+s zRd@8T*Af~j+4d|ctlE;r@GFb@nLDP8;LwoA-(Q{!k)?b} z%q?jEOXcVlHsnJ51H;C~XZm;5uA2t7M7TQ+-2+J4Q*!i(*Nx;thEAUOFP-y;>3zT~ z-=aOurcZ{1h~p0mOZe;NnnT65Pt}SUV&&1fp+y@9&syIEP+#HNQSZ&($*+=&I|0l( zwYgaCm>5e9Lj|rbQ{V-M<|NR@9ixG=K{uU8ju0% z_v(I#{=z<+s`jXSr+>L`>KO=VIASGF)IN@QjAD$@Zkzkb=Zt4@30_Q=fcASMrEkyN z*6Z^O;5G@6yr;Z{o_%8v{+12jQx~wOb4tw}juXMDFPMli4QtTTG9skYliIQ!dTg`P ztxd*ZI;H+Vlf?*ncMM3Q)S)emQ|^`B4Vn1Pc=-QP~2F?e3*i^Cu;m)IUSHvXn!X>aNk!u$knIQf1 z>8H^gkTqzA^x-av|mVOCH+Cg)TPHmu1#aKW;$G_lVD-3tm{Q)wa%aBy*LQ4Bv znp;1F9Z2**b!rD8#z!C5p?u1Um^;@M^QZa5Iu{8VTtLsOUPSB?o`}8W*iir%N|Ccr zz>Vr9_S;OW>{I$X%mBd>mOtP{ph##NUxJd!lxUN{Nj1m?;;XoemQ~kA=cp1_E?O9d zsc;&qh=m4_h&vf(@Vd8&+_8=Q>wTfw6p+(ivI&W}>^Dj$H$vZ*LD+Trihhs~*K_~a z@O&#yQm%oLV|f!LGO)!a;-7pr636B}NPPl{SM#Udl4*&_K?@r8T;gN({t^9`A&TS& zIn=!r3#;-2M|c(7Y2#7qF$Cl$RVr)qDNU6wjG^Dspfb2fwRQw0h#%1~fR1`L*pQg$ z_^veU?rzY#EN!njz%*meGOvZ0)gVF63|(NP%AJF&Dhkyec;B3!5Fowk1M-3X?u3DAo>D#zBe$1%?X7O%b4de=)5L%-gt@k$8q? zMuBYXEUf$dYITblp82Xe6k5RPkl604&#Ey@`+(?w32q-H*wE{Dz*F_73xjr&eA&$4fkH>gnQL6@1>P-YanKk8V#UaD#WU*!66RK zjGXcqf?xsiuzp1l-aCw5$JK4i1$jiKSk@P84UeJJs{tqU^CortpvUWt#fjZPS8Hq< z3Eqh>5&62p{{}6yp#q(sUFOlmG4`|Fz7WTD6;B2OlD4smdRJToh4t9_QjT^J113!c z7=2TbZkoQMe{N&2fTlIc%68eJXf%`%hK>2O7dV)4eQa$gudn*%_rPsmr**altmkLM z$KJFk!d)LiZRIY3+Bu)Q1o176PXQmN8jKN2y%c#a!&vJL{ zR~o=Pi6xrzY>=2x2>toU%ZeD^Kdo~7`m@Rc!OsK`sWU)@?Q%5C4zy@XjKi?aA>Ul= z%<(lYx?>AggQU-PsLe>pwbQ1=T_u>f+49+gRPS+&DjUc-Y5&s&(oQ-^1uI@&ojk&e z9)xNH)0@Gx^>FRWkzIm_d125J>_UL7s)`Dksi8EbfXm1?0K^R zTT0&DQH)z*igDhRvSIt*A8D?D0IZ0YxL^4{S-TLrX>qYS)$H}S-~yxwYvs(u>jtbl=^#G`)2A<`b==>Isz%TUSu?F-+mN_pl8?An=fbs z1Iztaz+l&eoE&BmY=!}cOZ;z{(2w3J*Yty-Z-xARo8?+{q#+_)RO0zQIk@UU{Olek z3?Zo?4cX!NF=@ehPk#NiLjmj(0=a`U4b~7KpF2a&UqxW)P#xRo*!RNIm*>hCBhTig zAo<4Py&6TGesy4n#CiJxU%gsg-F^zr1Ai`98+gm_YngihAKgse4E4E3vEta<`KNovZigzgaNrq#q zV;r~hF9K(HLsWL06h2J4RMY22#ijy;2?Il-%8+{%kaNt~j2|7-f-A@_?K}qDqZ2!j zHv16b>0VUB9FS)G=3Bf@9i!dJKj<8aH@7avC>`Ls<+?6s<}Qcp6BpS+>=)4=$QV;bZZ3WuJT31Sz7G3xCgSmjdMv z6}h3_B9r;XdS!d>-oK#Fo*TyyvO(HL9KnhZOWRR*(k(20o^^-GUp|)ZbG#GIj@2}A zVh#w4$2xo=L>u2??)>3=N2v5t+fx(bnbBllT?%bGxN)MS9EXy!L+#~ggZ=zl{q zt6o^Z-RZGBPcC8ZQujdL=Tx_O7&DM)Y?nu)I@IYqx__?1g~em0M8p^red9DA3gbGX z7I*{S?sIFAUtHGE_SL4c1ZL2qo%b*=ZRJ{d7BL0QX7Zzr=m=7vD5D-`zZBo`Np&ur zALNB+gu3B%CMmjd#>ICk#a8hpk73u;s5^nzx^5Ji z-K-+r+Ycm(i!n`mFh1~I-9K3L3^WCc{9b%pu`IlgE|_d*J$0`6d$N|lk2Ch;{b8|W z@$b*)3g`02P}eT@9iG@5N3HMslZ_Lq6Z;=YHSHh@q1m}ep>UUMa`#s}U(+24B@4dr zH_Txr;GW5Xj*a(f$b_?b$e#;U&txK@n#@J>ZrShRFW!?*TCLk|GWZ3XXK_^h`H^CI zoilMn8+JUP3>}}ZGXiUn_&8|^n)Teo@2R^ygWx8A9>Ry@xRsaE`L_X72ODfGZzuq)$HQQ3D}!A{Y!+PqUcG#6sD!%aGEO%# zKAaeFv5f?y`~HZPxUU+VyuUJd`hk6n@JT#QMm_C9c&tl+;lcAW!^F2<$9oAbtO=3X zQQ`SyH9WxZL^0}yXbSycD6u59WhBQX&RBoTQI&rSf3fVS2gt&sx&7x=8Y(-g*IDpV z%Trpp6tfj6Psz_d zBDZLjjiT;c$P>i8ILZ4LT;_Yu&@BJ{Y6*XZ9!@X|zC{3UNlrYbCRM_NiHw9PluIsM z;cf3)^5MQK5O06B9tq;!l-kMoxI}B`B9jGS#_m;n28vw_f?P2XbxS2=b#iytF~jAe z;UdXUCH4dkQ3jIvq7!(TK0rI|Tt<7G8g;gzQ6`#VU7i0=@QBmTI?ZaxYdjsk(6ZfY z20nUnuY7R}b7^xDyrZrb)C%%DgJEjy>TuSzJl*_< zx!L(Q(@ev++{$g~iFHu*zi=MT-h}$d)R_Y7$c_*!yZYLvKcVn1b8+SsJY`G1+m}CC z_+aWLTkxQsadp@Y4TB+Pa^?|Qd~MY+3o0xIJ8f5*K5=Ta`-`1m4%#-(gpxj5Y1 zLsEU#Qi>?|4#Aa!ns@$uN0An4e|Db?`ol`UmB0aEAyYkP&v!KcET=%|d25w>p?Cb% zZ7+SMH^YRB2g``^}Ej6+WQ0Px!b;iAH?`qAa$TT9o*(D?zoV!s%i56Xn2nv#F_ zD8!n6!}CB|Dm}qb>)l+56`&yOKx37{W;33H958)Sv2`agtQNyOs8PHw0T<_U56^Hw zQ(qV(ENulD~$$?zy=>aHV3e-W60=Fxl2q;nipkXLsB(ZnvY zK+4D&^)P=05oi4tBI2&Im4;VCz0EePjf}TaO+i^7&*@Zd7$TrB52I^Vrk>j zwxMIwRF$dM${l&v9xulB1dkDm8E7@25H#qR*?=1oGTP;?hB~D@TyEt2+!F@qubYMapn%;TBA-QO&dzh+d%!c{!kywxvRPGdi!?Iq(?8&*$wPH1TuZC+*82Dd?sSBT3+G#d|z~8g$eG;5-_d{;3)Rhu6w@F21AxV+&ikAn91zoRdy35p`#wmmIwPPz^ zWS%JY2f#A8-6v9v{!$NgPk%=wySXtRP#8{=hMYgXTQ{>(s9mrhQb;vWi^fxca zEw#V0u-j>vHFxmx7lLT}5#FYYZ9ko90F~H=FUAUn0n_Cn{srt8jqzJaS)_g~(z)=D zk9IzNE>G(hja!_9Wx8flCvS)60*t{(R+w8K@Uf;Wn<>oqsKS%8W&z~QAGGKQCh*SH ziIRcCjV0(E-j;sVI^b?(Ao69^`p=(J(sCy|JWeh(%}u;g%oGvwRin&ymapHF2}Z0HahfiyqP6ZbU*P5DBAlg*8|*wWBOW9b z%o{0VF@!|ix$tB=wr$M*@aF^)`r7TC>|so`QNB;_Lbw>C1QB%ki_Kojy27YhnvRVw zIzfQv4G|{MXY&?0k_iO5RdT zk7E9U{cfp&6IrYw>h#4jE5>4Oj5=~;$h+6fMs_keIO|9FOymI>9!iBL(c={atdpd) zMVkd<2rTEDPHdJ3_{x_Qc5uyS8@ZyI{T8Cz4L-xRhUZ`aSpbdRpUnm9-{&q}`Y2-? z7*!=L!xPe+tt_GCHcv=UJ$%%;c{gUI;jMhPu$(@bx@&HaN$@lE{&%2n*nL9T$V=?O zG~5KcBM!4dGI<3ZO>6)tE>#T!;fjbG3YDLS6ZFxZmeZQRBxTjYfh)I#2BtiPG7#moyYd5WGMP1QhZ_mJoqI|8$*doq#70fn>{sM;4P=7W_ool2t~W5$`sOSVI_gq za-}G@cDR(tD_U!BeB=gvhojLoYJ6qmk|QO8UT;2;S6LhtM__!B`_(zs;fZx7Bpt;b4-)u-}*voq0g86!zL*lCGFkgyq)wnMof5XWM zc3SYeo6#PWJ|rUgNcsfO)A(T=dl8qvjWTIBah}rkaOXaNd+Cc1T%-?4Eu?d>VPP+i zETmwPB*^U(wnXN`kL`^wmi7?$r;6ITzXFSJk&(-69QLu?ji9;y+)M6lkvI(dWPjRD zihCqk#z0Kk%A6d*-fWbnX(wqCTS`$pOL0G@B{1;Q7_giWO8xwoO!h9cW!D1MOREMU zGqf>o=GH*LLAPzuN5sumSZhK z*^-*7sxvuK5%95XVLArEtw*xt^|EK^KhgS7Lg~80Ss4)-!y_Vz@dFEfj&NkEGH1^8 z2cTa^?ay3M5;0G)Js>{5e*GLoKwfMEg;`Z8P?5Q`*>FPSfbP@~@Aa2BUX1dxyVnk+ z?2#kTZADAhmRu)+-R-f({}{BrsVtSYp!lWRwZOOF=4i+hu*7cdND>9YWW&$)k>^F! zefXo(j;;gBgr1Zk_TyW{OJYgrovUJAGb0P7lkd>E$pX6pk)~Gq1CnErPk3p9Z)nN{ z;o(USVCZCqz5~N>|9YcRE9Ib6K*MxHSv@{W7~9CN%r&^Zt{yF1NbU5e$C2U_>eooHw%cgjLpm= zRhMa9*U9%<2j-GLffg6F$NLrw)q0q}*gCLy`rohhKN@c0L3x74P#M^TSVT0yG(4ci z?RjTPs*$r|vn(1XU^VTJEiKeFeq*y~^bas*#|ZXpU=vd)%A}@Ul&o{47e%%>r|UfKyl5IRy zvMyS?W81cE+nU(6Z95ZdVmlMt_QbYr+h5*$>-&4Fx~jYC^r?-r_OtY?b>!u$T@Vta z>2M4=s*0}j8`~z97z_hez%JFgE>uLKJU_onkanX`BO+b4Rp7wS_8PZuP*T3C?&)M7jd-IUNH!%7Z@W0$n z#kZ6x;sM2~p}9wHW@>bL$~QVyi_l9Upp35{+%8th7{Q*=5d-R}=C<%k5kj{bX7dHU zgwdP z|L_uGZToCx*VQR~V52cOOr7mb|CkkjlSJS{P(W9xk#IQq?a90(!fj~##%T%3F$y-- z5AU=Mo{gK?kmN7HneIT|9H+M`QK@Wpy?+BGfffa|en1B6u}I58iHIPLXQQYGWkY5&&`t@BB zZ*lCx&4l4-c4~V6tetP;s+vOV6 zBp_0#^GJUuqXT0vn{XAplaEL1?P1!N*UlHPVKPETkl92APflT69FaY!1EKbha1Yrx za3@du=nFhv1h%>gO|;dO64IqEp5gO}9(N6HZvQnqlirj6t_iMZG9xnTyM=6zLw0&P zNl8c4AIQ+6uGL>Og2Ga>r$#PIpZdz)_n^K&X%!1J_f$@I95#*kA|ION-u*huVZz@e zWJw$_2$6r1TXgfGoexkO(4ajQ=7{yHX4-EmF4hl|S{M3YX?)VXm^2h~huL|JFIEIp zU=^z=IK$3t+ZX~@ic_>gLQ8b0dd5Hzh^h8GU}Wk_NQ?EE zZe4&+FHNW?R`q5-V1$mGLEA^r&d{q^-~|}oI==XuN&ri=AVpJHmnEV72z1Evf5-%3 z+jSUyqtW<&O;j-?7f53*YoFMjOS&X45r9rZ-R%2Ln@r6qou%(Ou>N7sR_|^*{e8%l zUx0-^%P`SlFMfC81}n(jaHrfAb%)`NkzVIAz16sUO_nbIB>VWqBCyEAD?q1gdGo@q zvgbsW9^zHX7V}U3UhP3QZ8r2TI3I?$_p{vn(X-sRY`NdEmgr=6nt1(a;wCHA3ldG8 z`S#H2zH0|M-_oOK!GRR_lGCNOAg2lw-;`bZL%0-*p54zBV{-v`8mMIz;g(JC2{V^zkfbiwjq~>GI2wjm8lY$ltF5 zt@p9ElNhYmW5tQ;hw^Q>zPFWfFVn&y51sqhb#ECA*&6;>~&a${jJ$+IW0T9ckqL@m%t9H%0HgJmm+Jmle*^YgfVJQI(X&98$xZ1ST# zG(HsMBebvsS>ve7Roxi(+OWwURJQM+b0WtQ%DrjPNc%;UtHm-n9%kpCx@j8nog?&w zX0mO*`YnjCx?PIsRqA`DSGb|5w^1&Ln7RIuB>}aLzpogw2^lJ(FisG)N};=WhiG2l zW-1>*WB5(vmU((A0dIx@jSJG${Ni;@e+9TH zPYa&d-*E>6`$?$8IexjX}FjV`1jal7W@t zi3eCD8ZZtmOF%BUTJe~=QH#Al;%#X%oswRdcOs>m)mC4lG)|Fq1F8#CzpV<{{0}H; z0TB|dTRuR)G?p!tPKmH0o_RAI{>18FIZIj{pljI)aRy+U29R?V;q^BUDiPzaKkr|h zc6`HPlPV{oHx<`x3z6_EIx^ zaQgBl^h#h}njRdPV|59cvuX70Pn<#rc?lxnueCRYsXxe(bZIQz!?!w{<%(jMm8Prb8hiI~IirzgYevqxXl z`bL*?sZ%7uQ9!u<*il`|BNMa%zS_S z?fV9Tb1ngnvhtprr7juOkGyM%RfhM=^vy>Wt2#CxU6}x@B9`vgg1IX6dEu11#E+sd z6j>+nMR>w6L=dckZTiwr$iGF__MN@X!Hk-ty76B{6ZpQz$Mov7ojMYpp>5tVQD0h@ z2(_m9hVznh{zb2oM0^UA@52`{gV&@Bcb6%1l72>+#Wik105ZBiBxC04qkTj9l%r7<;A5JgM z0}FFapL<@gFN?tSZL(%Y_Y3u_{C+Y^-;JSNUmNcO7ptO;63R)ROuEhVH3Oqw_f`u? zXE{J`<_96H^tsX5!6p3Do1SPwI61N8_0 zpKC}fQE>aLjY{w|POFR#dRp|5d3%bVzxC4i!qR^s7TH<0w{BP#NiSzU<5gn(B-K3r zsO%JZuo^;Um!Zg{i<$Uy>=$T6YS?2HXb;Ljh5&06rs)xj(u5p89Ej{?g=Y{|J-4&N zlka@i9iR~pKZK1-SICAb;Z41{gMoC8KAdax!0B{%8KVC7GAB}s93U5JY#_W4qIEOf z6NjSy!(65}04Ai_tf8mSX|lk&Z9~L?8vb1!>_}><-^V_9!c_%~PmIZ|Zz6L`PTU-P z18Q-K8Gj2?G?dj2Dt8QhrXi&LS^c7{F=&s8f#`1zLtxm{7b2UjHW0`l?X{39z+NUOf0=!=`tj& z2uVkpe}zm46|WHTVXFZEi;zzEMd&+DqkR4PedWtCF0&%nd~KF4pL&s*&S7u%lY>AmzMDusCx9{gis47;*r)NOwA5M$5KD z&o1r?|8z>f&E;u7T=KDhL~)(R`C%cdG(;m%H=MxOf)<1hF(LmzYKi)q;h;%)ZG71? zDp29sgr3fUicT<;z-oaYUkbz+8wurs3ybT0*NhzI0gwm+v9P!YW0(J6=BtxwN3?=Q zq(_ba3GxMKr8FWT4Kq2zA>F|)ApHe`{S5>H3IvX1SwT!Ho)EF#M~RpZlE=)V#^jMM z#0rES8_eKu=9|M{VHd{4<_Zx8R|bsPcQOiHHsK^I*o;VIFSP)bwl7J!d+3Fgj~~qo zvnI(n%v^{bWR3ZkVi+@knb3AC69B6e1S@Jl4@AkRKpIFaL5Vc$1gs`1iWg*(8Lu%E zl;SLDi)_eLKa&76TlY`Y@y;aVyxr`Z$=ROqTT^`2Zp!ba<_#aYIHlKtP!&L;^P#XKO>&a#sYBa~)r4F~EJzQC>pRm=B@-S9AR?0nrR$|3D-4FUGmcON zZj6ptODi*o%IiWbC@g`)V?{dza*~s5BU!A5Bo~~qyXle`1d%RV$&HIul%|D)hDT5W zV+76zwzU#-AsC_$v!xXsyu_V#2CQM75IW!lsM6LcVK%ZF?c$4`63ebf;OcAJE66FAK%!jd6;6UuOK-*4H@~akdF$yH$ z5R`A#{hrF@FdSSSZm1@Ot(Okq6j0EL5KQR+v?Y>35XU&_l~0Knb24Qav!0v&5rW@s z{L4f`y(B-|2uof6>kraf9Ciz`2gmvSoyZt*FEM1(9lc#(9StJYA1)siT!=sP%y(&j zqusXW{b!~9vR#vME4487c)Al;8QS%W?!xF>QsnI})}os@ot2?K>=Eb6xyzJw>3s9v7B*Pr$`ZR$fJB1{F(7x!~O z7}i>s252yR07ME0@_gJwte7Ra!QTYx03<-y7(7+&kKT~K5L+>7RyjP z(a$aeStT!*^f+>X#TaMD5kc^Io9x#j(-Yl`%q#PwaVmVgW@9)Df>Bw0w9@E|S& z$EBKigquWcWJqCRObvaxH2}v~c8O5|f@Mj>ZT)8CH-`SukiJE;#qPmDoTm>s##~-y zdyuNZ3uJy>rg)|8D}mZYtJ_FU_yzVWgY^TbmyJ;jOCV1nGM8okcpRpdtwfle+MRMJ zp3rw@AciWQ7ca$RKZUSB+`MOpAiKmLmySVzG}hJ1F=;t69#Rcq8W#)e6QjFhH%g-z zZ4z?4;rvVhe9?!=Bdk|GFnT^2jZw<<2ic(JAo!vsL*~|(I0GQLC}0`Xzq;8!Y4F?= z3Hnk>q|`%9FIk@d37CQ7025R81&3ExS^=;ZNvuFyTi@9Gk+i#0 zn-?JYcd-XTQNT=cK4cf8c7v&aoJ^xc5BH7)S|D{X}mH8g_voM?Vu@drV9W@f~UBEw6$va#F1D4`yHX=ffL$ zoUyZQQ@KH5CUs_4lWtUB=OR|d7_}nJfZedXY^;~uuP*U#K4Jmn_jRu5d+BfszA^!_ z4{5;(SlO0f`G3A#Z^{KaiL%14LieQeN7*Lf1+@w=1kP0qVsYf3V3=a_#1!t);9@=h<_BT?)@E}P6! z#TKNCN8gI>0rzJdJIPOfI?xO<^X|3^Lu2RdW%K|I^}+43-)N1--G`zhXT4jf*-SHd zu6|qG6NtRv2retifQ z%H6u;@qUtr^4u9uDw77B;Fpka6DXx-mU}W6LNywoX_Ep9xEuSl!g`Za!v5zl8p5nb zE)4VocEj+|VkM7OWIsP-wHg+*v#U~JJBz^SU2&@))FQo=F<2w=lmqszmO)LY=_hFa zkf>necKK7Nc<`-?8G_=xHYq6)@{x2e#$|o^Ja2*uSgo99!%OJ^)6L4l9sp&5wf-kM z>o9}AEh0&9y7^dS=D!`U1sDJus;u||(0);;xy#&b4zB3c80sSVG6I*Pn`sq+WLj?{V`!1r3OX{#Qh`s6*BgY*+YqbP? z$~$0eYVZX04KnCX#|B}(vtPT{UP}~*<^KG3-2$@`pceU0pRlBE@R1ekO43dTJ4O<% zmyrl+Y4%Iwh(DmTDBenNIF5HlLrvem7+@jSAV9g(-LeH0w{o=Z(1H9l2#fCwsr7p6 zKrMW*+vha;!luQPl3CZ!7JUizkwQ{J;9e8BdhL&6IJ_tqABEaoao}Y?5e+2HI5>9Q1Cy>QLGImV-g@;m-~32<3}LCKr=}{sBw%AG!)gF|VBTzAlJ-KwSq7WM=1+t*u$U#2Jbm?V7f^q6G%L}*mt?=?}TK%jXWx@9O)8c)RP3xV%P8w4c< zxc9u~=|(Y#nflE>pK7<&gvs9oJH(3>Mfxrg5e_00G^6G(FdKe3{@)TI}94M9viGXT9Q6F zF$Ee~#ulqmINT_~5GVGJ>XIPpSSO;62r`?A16`ehD=-(hJix*p+>Jd1{Rkuc6@lo+ zLtIpT7RchdGuLk7wWw)1+dM}Km}1Qzp=FsT!)xg!$!I4597qC~e2Bc$@B@cG7?#Wh zX~XkrN_1CGbhwmkJPukYlhK(lLeJ#r8_=i$Rd4e8OSEyppl+=0lU>w8#tg#rziZtters4$kyL(Z zF-lsqsI13O#0n@HaMGxUV&Yld&~+;MEi~xAOzLTsY_2CRIvsQ?F`g$tgz}+X{NlxC z)#*j5fy|@fP3nPsp}elO^r1(a0mvxwOE2>MWMl20Gh2urO(S5Y{bEMJBLV9XL6%#> zD12XP4Z}|R32#1U9wXn+J_XKBow2+l_edrfsSw@9c+!)5-A}0Qij*KH!FU8VxN?lZ z9I~I}h8)S*T35b229K5zep;-d*KYX-peif z_HuIacWc-GIp_vI=T|DiWRe7ZdNecH^fasBnf7_%>qmsykigxvkm!wcI-+0|$c|BjWQ@&uVzFd4|I7^KAXFuGpZFP0{-|sk0xJK93 zjBoh!RlTGy@oGMYogg@wl3y@+Ab`V{?Or`Ac%?8Ggsr}%=+etX&9!IAKTCa0n>kf zJ98o~Q>R6C9HjWPutovv4nYEgi{<)kB&JY0-5vu|yD(sA#nTD(M0A zcwS4S--Glgi$}57kllYywBP3FwYn4pz5nsk$^HJ>WRLfA=6x2(K+P}UiBY*V=$VoC z=S=V4NCd~PE=er-@C*_i%VQi^==h{E{1~|`aOm*BN*D$qgrnIV_t7<6@SB%nM#~dG zUp+j&d-TwOFM6ymB~54|b~I#{guOhB7A!)YY~kdR5n<6)l6}+#N9|hSV}KgMerQB! zT1zyfp3xaTNHXA8B{oQ@A-RIPr>x|5j=*N*!F|CM(7d|DU2I@~!W+7!z}fyY?~}7` z6&*tBO#f6QhJU!IzWQLG4RCt~jK0&=`Eh0P&pN!+B<-^zH}Pi{xNAMV?u}Ngsfyi7C3gp_lsyw#h&SOa7Y($!=*)oBfJIK*|^Ij719BcQO)`@Nrp8{_eR7Y zFCPT}Iz#4EkA(Ftf?Y2s?#iy_#+FCnS23#Bj$eFqkoc@$Xm2k>c({D!RY~P9 z0o70zVRFBXOg-uSlCeb8laDhp<9kal95D$h2g_^!rHbjXk~mZ9N%EJ@^PNa+3q?MX zGy%jRxj!wyJ3WtR1{V%+aVH$E`(ha<1_1nn%_k%a3T2ZKTKQhy-xTRzU^hnOxAw|A zp4%`f2f0IYkB7@VIKGMGxsUmo`yjn~ttZ^>w(?n;&M+`3sRC%<8TOhF;ZiNiVHBiQxfG)BSIW{1}LAwG`U;s zh!$uL^KNYX3f;q|#NK@eWiGMW=0FTPx`VqXj}H?#NNjl&$n%W%Q6rHNO?=)Ftksp0Ob$5YjIuIs6KrRjn{6%P?uT&C$o7 zGbqTGKRxz4-j$0ywn>n}o*G}zLr1)HclD;Q8aRdwjZ)tSX|Q7Zb-^ZJ?bA_ z^@_Ks?Oy4V_$8=dX$${-Hq}(hc!1}F75xce}uQSCAj)oM4#w zW#^}SXivE(7k8UeaGkU-s4!OUz-^3rpUXORs(6AZJ86Ei#{22DA$2-?rJyfNR589J zDG(a)mzZH6aKv@doEyPXxMy3|S-dUIB({)qR5hNdn zT*G8rT}Qb7Ijh4ka&Fg5uDXLhvZ5Zhk zjl{W9{6!;DbbKTE4r!-ZH-~P!5*wAHzfb;u7gIf%K{49Qm-| zjd|%hR(pz|X8N@UKcOv&&~k2_4o_2cPN4Z?>HZ64uOrK(qqUG<+~R42N`S8&B54dU z&Bm#3o#LnLV)8x}mfd(ba}6e_bf?~r<|>I+ClHq0cmg%4I~Au^O&TVR>{&)S40 zYb_t)cTaoAW>WL6t|Oo@Zc<^iL%*Z0&mq9rz(NW9oARUNLl_~6PkPS*^0R1Oy3rev z$1qO4N5A{_*r>Sn5B?>aF2Xg%Zjk4PC8Dp;Xne zNTGJDC@1O?{w~fggM>9ZL}=GwZ9o!4BvU9m=>}15i08Zu#Xe2%fg>YQRm$5@UOKRX zsu$PtbD5Qq|A*X&qCo=O0IqzBp#p~nQmB1vm&ZZ8kHZTf$F!|*g z7k}llkI!h)zEczz&7ac3PGn)=iEt#-bAu2v-XceQVFYEsD>FKQ9h0R{ zFA_hSxpJo3_(xtIY$pj&L)OU$y#+VJMm>j+S$Qmrf&*rF$U+Bm@cvO?T2TbvnYXzn z;IHy3XSWb&kv?BD^z>rH?cj*u1Hffv!*r#2?hkfPpOr&}gTF zZ~aXbS^~+TcoS@!GzspRy`+V*;SOwkh}Q^Bt8fG_q2-UUKu znywm0gGxa@bXisODZ#M7{Q~6g)IA`Qa^X>DA{NcHrjo6f5N8DkauhtE9qVGVbFG@8 zx4d=%HVsm8q^cXR@?0~_$wgF)vPJGZN!M@?;$N0zdj)DA<6Zeh8~q{7nQjEJUAjN@QAf3mTENp1YO!`*Kn z9a^RZ=_Y)I3_6kji4*Z1;Y#KWXP?gnFL<56{bbbw^Oa|=>Z@5AUhGzcc+6uT^e?K# zIH1N}-7^ScK<(;m+GlnQh~UN7*HHB%$Yy`{>N6YX^_iZ7VLC}a)t=lsH9Q{6f)g-w ztW{!^4`PCDCpSvqeWbFQ3(8twwWN8Y%%&RN#o`J}OVNoWi!_ zvD#77%IokKe@k`g?)CafOu)g`#Ume)pokthODi0S^^Lf$I&geBD?upOvGZGV8wosl z#t!WYBmwBPKxLKK-lE>{!(|Fyhs^GO5o@JqBKzq3mbjRH~Sytp4O3k{)DE z%#OE}c@(xwNm2Etper!9Fb-w>z$rLn4sfs*VpWdqh#ZH4od1q5r(q(CUf~ zXKZr%Ue}s34dJV7%__GNaOpQfAAbjRe;k$8U(?%P)oL#Exn{<$z0y`d)qY2Hl4WU)&VnX3RuOLL1U0k4Rf7~_O1*3jpJ!<~;qwwduOII_18KLr6+As1aZ1RFKVrlF44enDWFP4jL zh+*9E6wYjn(s&D50{!1_-mUPi1tJ}&(nPh*h~;K*)z2A6#ww>x3syGw%I>ES@nGV_}{78E1`S;@ufNXOp5e9sqzrm~viaQh;~jB*1Pl%FRMz^Wl5LvN z{B#p3a*`^KJ6}8=5m8L^gw%DVa@(-;oyjzwRL;F@)|jt|mBQ#oEd+_^ZJS(T+u~DO z*s{5li(Z)xw(8P(JVNvH{$4~MXDs9HoZ6{Zton|bmoU)om=Ip>ni5HN4Y5~gp)rZ) z(o(qryN_zdMh0vqr zrG5-QvmEOf*V=OIXtH)s>BT;BW>DYyRt5;+oSVcG}=>2AkRYY zQqQm}G=<7eki47yoS?Bv;fUk(SD5Zb`0_G|U^lY%TFOMo?lDYI!eKbkQqFoU|`mHGGkJ&ECkOkNGBdnU_xLzbIa=Lt7we$t(Vh+cxnE*foRSLcV6oTSi}&^WUxOs4MNXuU;akr{l%ty{Jt6)n-< z491|T7R89paMYD}8d=S)!oSY6``YXxwj1&AXcR`G2n9{nT1#A;bGY&-h@aoNf4s~d zVx+vi%cW@<_cZfUTV1%jlS!`qUPET#jgI*@*HbrVaE?O$)$K*^_Ri|{=$hNEw7KkyVy>pyfD#hK}_3 znEdlqV{CQPMCrm)B^G{Z`}5Kfo=Wm>JPz%S8a!`FoxqQT*({}m>xm

VW(`AXCxU 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૽W|6xrp6z1up^W&iR)k+# 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 "..\pkg.cmd" | Resolve-Path -ErrorAction SilentlyContinue - $pkgCmd = if ($npmGlobalBin) { $npmGlobalBin.Path } else { (Get-Command pkg -ErrorAction SilentlyContinue)?.Source } - if (-not $pkgCmd) { - Write-Warn "pkg 未安装,正在安装..." - npm install -g pkg - $env:Path = [System.Environment]::GetEnvironmentVariable("Path","Machine") + ";" + - [System.Environment]::GetEnvironmentVariable("Path","User") - $npmGlobalBin = Join-Path (npm root -g 2>$null) "..\pkg.cmd" | Resolve-Path -ErrorAction SilentlyContinue - $pkgCmd = $npmGlobalBin.Path - } - - $inputJs = Join-Path $ScriptDir "gen-authcode.js" - $outputExe = Join-Path $DistDir "gen-authcode.exe" - - if (-not (Test-Path $inputJs)) { - Write-Fail "找不到 gen-authcode.js" - exit 1 - } - - Write-Host " 输入: $inputJs" -ForegroundColor Gray + Write-Host " 输入: $inputPs1" -ForegroundColor Gray Write-Host " 输出: $outputExe" -ForegroundColor Gray - Write-Host " (内嵌 Node.js 运行时,首次打包约 1 分钟)" -ForegroundColor Gray - & $pkgCmd $inputJs --targets node18-win-x64 --output $outputExe 2>&1 | - ForEach-Object { Write-Host " $_" -ForegroundColor Gray } + # 优先用书虫学者图标, 回退到 B 圆 + $adminIcon = Join-Path $ScriptDir "admin-authcode.ico" + if (-not (Test-Path $adminIcon)) { $adminIcon = Join-Path $ScriptDir "bookworm-desktop.ico" } + + $ps2exeArgs = @{ + InputFile = $inputPs1 + OutputFile = $outputExe + Title = "Bookworm AuthCode Generator" + Description = "Bookworm 授权码生成器 (管理员工具)" + Company = "Bookworm" + Version = "1.5.1.0" + NoConsole = $true + NoOutput = $true + NoError = $true + } + if (Test-Path $adminIcon) { + $ps2exeArgs.IconFile = $adminIcon + Write-Host " 图标: $adminIcon" -ForegroundColor Gray + } + Invoke-ps2exe @ps2exeArgs if (Test-Path $outputExe) { - $sizeMB = [math]::Round((Get-Item $outputExe).Length / 1MB, 1) - Write-OK "gen-authcode.exe 打包完成 (${sizeMB} MB)" - - # 注入图标 (rcedit) - $iconFile = Join-Path $ScriptDir "bookworm.ico" - $rcedit = "$env:APPDATA\npm\node_modules\rcedit\bin\rcedit-x64.exe" - if ((Test-Path $iconFile) -and (Test-Path $rcedit)) { - & $rcedit $outputExe --set-icon $iconFile | Out-Null - Write-OK "gen-authcode.exe 图标注入完成" - } + $sizeKB = [math]::Round((Get-Item $outputExe).Length / 1KB) + Write-OK "Bookworm-AuthGen.exe 打包完成 (${sizeKB} KB)" } else { - Write-Fail "gen-authcode.exe 打包失败" + Write-Fail "Bookworm-AuthGen.exe 打包失败" exit 1 } } @@ -169,6 +159,6 @@ Get-ChildItem $DistDir | ForEach-Object { Write-Host "" Write-Host " 分发说明:" -ForegroundColor Gray -Write-Host " Bookworm-Setup.exe → 放入 bookworm-boot 仓库根目录,发给用户" -ForegroundColor Gray -Write-Host " gen-authcode.exe → 管理员本机使用,勿对外分发" -ForegroundColor Gray +Write-Host " Bookworm-Setup.exe → 用户安装器 (公开下载)" -ForegroundColor Gray +Write-Host " Bookworm-AuthGen.exe → 管理员授权码生成器 (勿对外分发)" -ForegroundColor Gray Write-Host ""