From 4228b9741155029e3135354a725bd09c91eca58c Mon Sep 17 00:00:00 2001 From: Kepler Vital Date: Tue, 5 Sep 2023 14:46:28 +0200 Subject: [PATCH] feat: add ubuntu support (#21) * chore: initial linux support experiment * feat: add ubuntu arm64 support * chore: run linter fix * chore: add icon to deb package * feat: support x64 arch for daemon * feat: add support for deb for x64 arch --- packages/core/nodemon.json | 2 +- packages/core/src/commons/configs.ts | 2 + packages/core/src/commons/typings.ts | 2 + packages/core/src/tls/factory.ts | 2 + packages/core/src/tls/store.ts | 27 +++ packages/core/src/tls/typings.ts | 1 + packages/core/src/tls/utils.ts | 3 +- packages/daemon/package.json | 5 +- packages/daemon/src/platforms/factory.ts | 7 + packages/daemon/src/platforms/linux/index.ts | 2 + packages/daemon/src/platforms/linux/linux.ts | 220 ++++++++++++++++++ .../daemon/src/platforms/linux/typings.ts | 25 ++ packages/daemon/src/platforms/linux/utils.ts | 15 ++ packages/daemon/src/platforms/mac/mac.ts | 2 +- packages/server/src/servers/daemon/utils.ts | 48 +++- packages/ui/build.js | 5 + packages/ui/build/linux.js | 80 +++++++ packages/ui/build/mac.js | 5 + packages/ui/build/win.js | 5 + packages/ui/package.json | 2 +- packages/ui/src/assets/logo.png | Bin 0 -> 23001 bytes packages/ui/src/assets/logo@124x124.png | Bin 0 -> 12494 bytes packages/ui/src/assets/logo@256x256.icns | Bin 0 -> 35669 bytes packages/ui/src/interface/images.ts | 8 + 24 files changed, 461 insertions(+), 7 deletions(-) create mode 100644 packages/daemon/src/platforms/linux/index.ts create mode 100644 packages/daemon/src/platforms/linux/linux.ts create mode 100644 packages/daemon/src/platforms/linux/typings.ts create mode 100644 packages/daemon/src/platforms/linux/utils.ts create mode 100644 packages/ui/build/linux.js create mode 100644 packages/ui/src/assets/logo.png create mode 100644 packages/ui/src/assets/logo@124x124.png create mode 100644 packages/ui/src/assets/logo@256x256.icns diff --git a/packages/core/nodemon.json b/packages/core/nodemon.json index 55326f5..7708d11 100644 --- a/packages/core/nodemon.json +++ b/packages/core/nodemon.json @@ -2,7 +2,7 @@ "watch": ["src"], "ignore": ["src/**/*.spec.ts"], "ext": "ts,json", - "exec": "pnpm build && pnpm start", + "exec": "yarn build", "legacyWatch": true, "delay": 1000 } diff --git a/packages/core/src/commons/configs.ts b/packages/core/src/commons/configs.ts index eafb887..fdf6d32 100644 --- a/packages/core/src/commons/configs.ts +++ b/packages/core/src/commons/configs.ts @@ -23,12 +23,14 @@ if (!existsSync(dataPath)) { const isMaxOSX = platform === SupportedPlatforms.MacOSX; const isWindows = platform === SupportedPlatforms.Windows; +const isLinux = platform === SupportedPlatforms.Linux; const coreConfigs: CoreConfiguration = { dataPath, platform, macosx: isMaxOSX, windows: isWindows, + linux: isLinux, encoding: isWindows ? 'utf16le' : 'utf8', ipcChannels: { daemon: isWindows diff --git a/packages/core/src/commons/typings.ts b/packages/core/src/commons/typings.ts index 40d2c42..3889617 100644 --- a/packages/core/src/commons/typings.ts +++ b/packages/core/src/commons/typings.ts @@ -1,6 +1,7 @@ export enum SupportedPlatforms { Windows = 'win32', MacOSX = 'darwin', + Linux = 'linux', } export interface IpcChannels { @@ -13,6 +14,7 @@ export interface CoreConfiguration { platform: string; windows: boolean; macosx: boolean; + linux: boolean; ipcChannels: IpcChannels; encoding: BufferEncoding; } diff --git a/packages/core/src/tls/factory.ts b/packages/core/src/tls/factory.ts index 390ae88..f09d067 100644 --- a/packages/core/src/tls/factory.ts +++ b/packages/core/src/tls/factory.ts @@ -86,6 +86,7 @@ export class CertificateFactory { publicKey: keyPair.publicKey, signingKey: keyPair.privateKey, issuer: [...this.issuer], + serialId: await this.store.nextSerialId(), // same as issuer since this is self signed subject: [...this.issuer], extensions: [ @@ -157,6 +158,7 @@ export class CertificateFactory { publicKey: keyPair.publicKey, signingKey: ca.key, issuer: caCert.subject.attributes, + serialId: await this.store.nextSerialId(), subject: [ { name: 'commonName', value: hostname }, { diff --git a/packages/core/src/tls/store.ts b/packages/core/src/tls/store.ts index 8722976..ed62f2b 100644 --- a/packages/core/src/tls/store.ts +++ b/packages/core/src/tls/store.ts @@ -14,6 +14,7 @@ import { CertificateDTO, CertificateStoreConfiguration } from './typings'; export class CertificateStore { private readonly storePath: string; + private readonly serialIdPath: string; private static cachedLookups = new InMemoryCache({ stdTTL: 60 * 5, // 5 minutes maxKeys: 250, @@ -23,6 +24,7 @@ export class CertificateStore { private readonly configuration: CertificateStoreConfiguration ) { this.storePath = resolve(coreConfigs.dataPath, this.configuration.folder); + this.serialIdPath = resolve(this.storePath, 'serial'); } private static maybeGetFromCache(id: string): Certificate | undefined { @@ -43,6 +45,7 @@ export class CertificateStore { private async init(): Promise { createDir(this.storePath); + await this.setupSerialDependency(); } private certificateDtoPath(id: string): string { @@ -113,6 +116,30 @@ export class CertificateStore { CertificateStore.maybeSetInCache(certificate.id, certificate); } + public async setupSerialDependency(): Promise { + if (pathExists(this.serialIdPath)) { + return; + } + + const files = getFiles(this.storePath, ['json', 'cert']); + for (const file of files) { + rmSync(resolve(this.storePath, file), { force: true }); + } + } + + public async nextSerialId(): Promise { + const serial = + (await getFile(this.serialIdPath, { encoding: 'utf-8' })) ?? '00'; + const nextSerial = BigInt(serial) + BigInt(1); + const nextSerialStr = nextSerial.toString(); + + await saveFile(this.serialIdPath, nextSerialStr, { + encoding: 'utf-8', + }); + + return nextSerialStr; + } + public static async create( configuration: CertificateStoreConfiguration ): Promise { diff --git a/packages/core/src/tls/typings.ts b/packages/core/src/tls/typings.ts index be3a6b6..3f41c28 100644 --- a/packages/core/src/tls/typings.ts +++ b/packages/core/src/tls/typings.ts @@ -45,6 +45,7 @@ export interface GenerateCertificateOpts { issuer: pki.CertificateField[]; extensions: object[]; signingKey: pki.PrivateKey; + serialId: string; } export interface CertificateStoreConfiguration { diff --git a/packages/core/src/tls/utils.ts b/packages/core/src/tls/utils.ts index 7196fc8..5eeb834 100644 --- a/packages/core/src/tls/utils.ts +++ b/packages/core/src/tls/utils.ts @@ -22,11 +22,12 @@ export const generateCertificate = async ({ issuer, extensions, signingKey, + serialId, }: GenerateCertificateOpts): Promise => { const certificate = pki.createCertificate(); certificate.publicKey = publicKey; - certificate.serialNumber = '01'; + certificate.serialNumber = serialId; certificate.validity.notBefore = createValidityDate(); certificate.validity.notAfter = createValidityDate(365); diff --git a/packages/daemon/package.json b/packages/daemon/package.json index c011933..863d76b 100644 --- a/packages/daemon/package.json +++ b/packages/daemon/package.json @@ -23,8 +23,11 @@ }, "pkg": { "targets": [ + "node18-macos-arm64", "node18-macos-x64", - "node18-win-x64" + "node18-win-x64", + "node18-linux-arm64", + "node18-linux-x64" ], "compress": "GZip", "outputPath": "bin" diff --git a/packages/daemon/src/platforms/factory.ts b/packages/daemon/src/platforms/factory.ts index d3b0082..c95c112 100644 --- a/packages/daemon/src/platforms/factory.ts +++ b/packages/daemon/src/platforms/factory.ts @@ -5,6 +5,7 @@ import { import { MacPlatform } from './mac'; import { Platform, PlatformBuildConfigs } from './typings'; import { WindowsPlatform } from './windows'; +import { LinuxPlatform } from './linux'; export class PlatformFactory { public static async create(configs: PlatformBuildConfigs): Promise { @@ -21,6 +22,12 @@ export class PlatformFactory { proxy: configs.proxy, pac: configs.pac, }); + case SupportedPlatforms.Linux: + return new LinuxPlatform({ + ca: configs.ca, + proxy: configs.proxy, + pac: configs.pac, + }); default: throw new UnsupportedPlatformError('unknown'); } diff --git a/packages/daemon/src/platforms/linux/index.ts b/packages/daemon/src/platforms/linux/index.ts new file mode 100644 index 0000000..42e61b2 --- /dev/null +++ b/packages/daemon/src/platforms/linux/index.ts @@ -0,0 +1,2 @@ +export * from './linux'; +export * from './typings'; diff --git a/packages/daemon/src/platforms/linux/linux.ts b/packages/daemon/src/platforms/linux/linux.ts new file mode 100644 index 0000000..08e140a --- /dev/null +++ b/packages/daemon/src/platforms/linux/linux.ts @@ -0,0 +1,220 @@ +import { + execAsync, + getDirectories, + getFile, + logger, + pathExists, + saveFile, +} from '@dfinity/http-proxy-core'; +import { Platform, PlatformProxyInfo } from '../typings'; +import { PlatformConfigs } from './typings'; +import { resolve } from 'path'; +import { + BASE_MOZILLA_PATH, + BASE_SNAP_MOZZILA_PATH, + CURL_RC_FILE, + FIREFOX_PROFILES_FOLDER, + MOZILLA_CERTIFICATES_FOLDER, + ROOT_CA_PATH, + findP11KitTrustPath, +} from './utils'; + +export class LinuxPlatform implements Platform { + constructor( + private readonly configs: PlatformConfigs, + private readonly username = String(process.env.LOGNAME ?? 'root') + ) {} + + public async attach(): Promise { + await this.setupDependencies(); + + logger.info( + `attaching proxy to system with: ` + + `host(${this.configs.proxy.host}:${this.configs.proxy.port}), ` + + `capath(${this.configs.ca.path}), ` + + `caname(${this.configs.ca.commonName})` + ); + + await this.trustCertificate(true, this.configs.ca.path); + + await this.configureWebProxy(true, { + host: this.configs.proxy.host, + port: this.configs.proxy.port, + }); + } + + public async detach(): Promise { + await this.setupDependencies(); + + logger.info( + `detaching proxy from system with: ` + + `host(${this.configs.proxy.host}:${this.configs.proxy.port}), ` + + `capath(${this.configs.ca.path}), ` + + `caname(${this.configs.ca.commonName})` + ); + + await this.trustCertificate(false, this.configs.ca.path); + + await this.configureWebProxy(false, { + host: this.configs.proxy.host, + port: this.configs.proxy.port, + }); + } + + public async configureWebProxy( + enable: boolean, + { host, port }: PlatformProxyInfo + ): Promise { + const curlrcPath = resolve(String(process.env.HOME), CURL_RC_FILE); + const curlrc = (await getFile(curlrcPath, { encoding: 'utf-8' })) ?? ''; + const curlrcLines = curlrc + .split('\n') + .filter((line) => !line.startsWith('proxy=')); + if (enable) { + curlrcLines.push(`proxy=http://${host}:${port}`); + } + await saveFile(curlrcPath, curlrcLines.join('\n'), { + encoding: 'utf-8', + }); + + await this.tooggleNetworkWebProxy(enable); + } + + private async tooggleNetworkWebProxy(enable: boolean): Promise { + const pacUrl = `http://${this.configs.pac.host}:${this.configs.pac.port}/proxy.pac`; + + if (enable) { + await execAsync( + [ + `su -l ${this.username} -c "gsettings set org.gnome.system.proxy mode 'auto' && gsettings set org.gnome.system.proxy autoconfig-url '${pacUrl}'"`, + ].join(' && ') + ); + + return; + } + + await execAsync( + [ + `su -l ${this.username} -c "gsettings set org.gnome.system.proxy mode 'none'"`, + ].join(' && ') + ); + } + + private async trustCertificate(trust: boolean, path: string): Promise { + if (trust) { + await execAsync( + `sudo cp "${path}" "${ROOT_CA_PATH}" && sudo update-ca-certificates` + ); + + await this.firefoxTrustCertificate(); + return; + } + + await execAsync( + `sudo rm -rf "${ROOT_CA_PATH}" && sudo update-ca-certificates` + ); + } + + private async firefoxTrustCertificate(): Promise { + await this.setupFirefoxCertificateConfigurations(BASE_MOZILLA_PATH); + await this.setupFirefoxCertificateConfigurations(BASE_SNAP_MOZZILA_PATH); + } + + private async setupFirefoxCertificateConfigurations( + basePath: string + ): Promise { + const homePath = String(process.env.HOME); + const mozillaPathPath = resolve(homePath, basePath); + const certificatesPath = resolve( + mozillaPathPath, + MOZILLA_CERTIFICATES_FOLDER + ); + const profilesPath = resolve(mozillaPathPath, FIREFOX_PROFILES_FOLDER); + + if (!pathExists(mozillaPathPath)) { + // Firefox is not installed. + return; + } + + await this.firefoxSetupCertificates(certificatesPath); + await this.firefoxSetupProfiles(profilesPath); + } + + private async setupDependencies(): Promise { + const p11KitPath = await findP11KitTrustPath(); + + if (!p11KitPath) { + await execAsync( + 'sudo apt install p11-kit p11-kit-modules libnss3-tools -y' + ); + const installed = await findP11KitTrustPath(); + + if (!installed) { + throw new Error('Failed to setup p11-kit dependency'); + } + } + } + + private async firefoxSetupCertificates(profilesPath: string): Promise { + if (!pathExists(profilesPath)) { + return; + } + + const p11KitPath = await findP11KitTrustPath(); + if (!p11KitPath) { + throw new Error('Failed to find certificate store path'); + } + + // firefox profile directories end with .default|.default-release + const profiles = getDirectories(profilesPath).filter( + (dir) => dir.endsWith('.default') || dir.endsWith('.default-release') + ); + + for (const profileFolder of profiles) { + const profilePath = resolve(profilesPath, profileFolder); + + await execAsync( + `modutil -dbdir sql:${profilePath} -add "P11 Kit" -libfile ${p11KitPath}` + ); + } + } + + private async firefoxSetupProfiles(profilesPath: string): Promise { + if (!pathExists(profilesPath)) { + return; + } + + // firefox profile directories end with .default|.default-release + const profiles = getDirectories(profilesPath).filter( + (dir) => dir.endsWith('.default') || dir.endsWith('.default-release') + ); + + for (const profileFolder of profiles) { + const userPreferencesPath = resolve( + profilesPath, + profileFolder, + 'user.js' + ); + + const userPreferences = + (await getFile(userPreferencesPath, { encoding: 'utf8' })) ?? ''; + + const preferences = userPreferences + .split('\n') + .filter((line) => !line.includes('security.enterprise_roots.enabled')); + + preferences.push(`user_pref("security.enterprise_roots.enabled", true);`); + + await saveFile( + userPreferencesPath, + preferences.filter((line) => line.length > 0).join('\n') + '\n', + { + encoding: 'utf-8', + } + ); + await execAsync( + `sudo chown ${this.username}:${this.username} "${userPreferencesPath}"` + ); + } + } +} diff --git a/packages/daemon/src/platforms/linux/typings.ts b/packages/daemon/src/platforms/linux/typings.ts new file mode 100644 index 0000000..66c6a94 --- /dev/null +++ b/packages/daemon/src/platforms/linux/typings.ts @@ -0,0 +1,25 @@ +import { PlatformPacInfo, PlatformRootCA } from '../typings'; + +export interface PlatformProxyInfo { + host: string; + port: number; +} + +export interface PlatformConfigs { + ca: PlatformRootCA; + proxy: PlatformProxyInfo; + pac: PlatformPacInfo; +} + +export interface SystemWebProxyInfo { + enabled: boolean; +} + +export interface WebProxyConfiguration { + https: SystemWebProxyInfo; + http: SystemWebProxyInfo; +} + +export interface NetworkProxySetup { + [networkPort: string]: WebProxyConfiguration; +} diff --git a/packages/daemon/src/platforms/linux/utils.ts b/packages/daemon/src/platforms/linux/utils.ts new file mode 100644 index 0000000..9847dd0 --- /dev/null +++ b/packages/daemon/src/platforms/linux/utils.ts @@ -0,0 +1,15 @@ +import { execAsync } from '@dfinity/http-proxy-core'; + +export const BASE_SNAP_MOZZILA_PATH = 'snap/firefox/common/.mozilla'; +export const BASE_MOZILLA_PATH = '.mozilla'; +export const MOZILLA_CERTIFICATES_FOLDER = 'certificates'; +export const FIREFOX_PROFILES_FOLDER = `firefox`; +export const ROOT_CA_STORE_PATH = '/usr/local/share/ca-certificates'; +export const ROOT_CA_PATH = `${ROOT_CA_STORE_PATH}/ic-http-proxy-root-ca.crt`; +export const CURL_RC_FILE = '.curlrc'; + +export const findP11KitTrustPath = async (): Promise => { + const path = await execAsync('sudo find /usr -name p11-kit-trust.so'); + + return path.length ? path : null; +}; diff --git a/packages/daemon/src/platforms/mac/mac.ts b/packages/daemon/src/platforms/mac/mac.ts index dddb187..e0a70f0 100644 --- a/packages/daemon/src/platforms/mac/mac.ts +++ b/packages/daemon/src/platforms/mac/mac.ts @@ -130,7 +130,7 @@ export class MacPlatform implements Platform { await saveFile( userPreferencesPath, - preferences.filter((line) => line.length > 0).join('\n'), + preferences.filter((line) => line.length > 0).join('\n') + '\n', { encoding: 'utf-8', } diff --git a/packages/server/src/servers/daemon/utils.ts b/packages/server/src/servers/daemon/utils.ts index 16cab08..0b685a2 100644 --- a/packages/server/src/servers/daemon/utils.ts +++ b/packages/server/src/servers/daemon/utils.ts @@ -4,19 +4,41 @@ import { coreConfigs, execAsync, } from '@dfinity/http-proxy-core'; +import { spawnSync } from 'child_process'; export const WAIT_UNTIL_ACTIVE_MS = 10000; export const WAIT_INTERVAL_CHECK_MS = 250; +export const daemonArch = (systemArch = process.arch): string => { + switch (systemArch) { + case 'x64': + return 'x64'; + case 'arm64': + return 'arm64'; + default: + throw new UnsupportedPlatformError(systemArch); + } +}; + export const daemonBinPath = async (platform: string): Promise => { switch (platform) { case SupportedPlatforms.MacOSX: return require - .resolve('@dfinity/http-proxy-daemon/bin/http-proxy-daemon-macos') + .resolve( + `@dfinity/http-proxy-daemon/bin/http-proxy-daemon-macos-${daemonArch()}` + ) .replace('.asar', '.asar.unpacked'); case SupportedPlatforms.Windows: return require - .resolve('@dfinity/http-proxy-daemon/bin/http-proxy-daemon-win.exe') + .resolve( + `@dfinity/http-proxy-daemon/bin/http-proxy-daemon-win-${daemonArch()}.exe` + ) + .replace('.asar', '.asar.unpacked'); + case SupportedPlatforms.Linux: + return require + .resolve( + `@dfinity/http-proxy-daemon/bin/http-proxy-daemon-linux-${daemonArch()}` + ) .replace('.asar', '.asar.unpacked'); default: throw new UnsupportedPlatformError(platform); @@ -52,6 +74,26 @@ const spawnDaemonProcessWindows = async (daemonPath: string): Promise => { await execAsync(spawnCommand); }; +const spawnDaemonProcessUbuntu = (daemonPath: string) => { + const escapedDaemonPath = daemonPath.replace(/ /g, '\\ '); + const command = 'pkexec'; + const args = [ + 'sh', + '-c', + `HOME="${process.env.HOME}" LOGNAME="${process.env.LOGNAME}" nohup ${escapedDaemonPath} &>/dev/null &`, + ]; + + const result = spawnSync(command, args, { + stdio: 'ignore', + env: process.env, + }); + if (result.status !== 0) { + throw new Error( + `Spawn error (err: ${result.status}): ${result.error ?? 'unknown'}` + ); + } +}; + export const spawnDaemonProcess = async (platform: string): Promise => { const daemonPath = await daemonBinPath(platform); @@ -60,6 +102,8 @@ export const spawnDaemonProcess = async (platform: string): Promise => { return await spawnDaemonProcessMacOSX(daemonPath); case SupportedPlatforms.Windows: return await spawnDaemonProcessWindows(daemonPath); + case SupportedPlatforms.Linux: + return await spawnDaemonProcessUbuntu(daemonPath); default: throw new UnsupportedPlatformError(platform); } diff --git a/packages/ui/build.js b/packages/ui/build.js index d21dbc7..b7853a4 100644 --- a/packages/ui/build.js +++ b/packages/ui/build.js @@ -3,6 +3,7 @@ const { platform } = require('node:process'); const macBuild = require('./build/mac'); const winBuild = require('./build/win'); +const linuxBuild = require('./build/linux'); switch (platform) { case 'win32': { @@ -13,6 +14,10 @@ switch (platform) { macBuild(); break; } + case 'linux': { + linuxBuild(); + break; + } default: { throw new Error("Unsupported platform. Only Mac and Windows are currently supported."); } diff --git a/packages/ui/build/linux.js b/packages/ui/build/linux.js new file mode 100644 index 0000000..d0dc60b --- /dev/null +++ b/packages/ui/build/linux.js @@ -0,0 +1,80 @@ +'use strict'; + +const { execSync } = require('child_process'); +const builder = require('electron-builder'); +const { createReleaseHashFile } = require('./utils'); +const Platform = builder.Platform; + +/** + * @type {import('electron-builder').Configuration} + * @see https://www.electron.build/configuration/configuration + */ +const options = { + compression: 'normal', + removePackageScripts: true, + appId: 'com.dfinity.ichttpproxy', + productName: 'IC HTTP Proxy', + executableName: 'ic-http-proxy', + artifactName: 'ic-http-proxy-${os}-${arch}-${version}.${ext}', + nodeVersion: 'current', + nodeGypRebuild: false, + buildDependenciesFromSource: false, + asarUnpack: ['node_modules/@dfinity/http-proxy-daemon/bin/*'], + directories: { + output: 'pkg', + }, + afterPack: (context) => { + execSync( + `find "${context.appOutDir}" -exec touch -mht 202201010000.00 {} +` + ); + }, + linux: { + icon: './src/assets/logo@256x256.icns', + category: "System", + files: [ + '!bin/http-proxy-daemon-win.exe', + '!bin/http-proxy-daemon-win-x64.exe', + '!bin/http-proxy-daemon-win-arm64.exe', + '!bin/http-proxy-daemon-macos', + '!bin/http-proxy-daemon-macos-x64', + '!bin/http-proxy-daemon-macos-arm64', + '!.git/*', + '!tsconfig.json', + '!nodemon.json', + '!.eslintrc.js', + ], + }, +}; + +const build = async () => { + // build for linux arm + await builder + .build({ + targets: Platform.LINUX.createTarget('zip', builder.Arch.arm64), + config: options, + }) + .then(async (builtFiles) => createReleaseHashFile(builtFiles)); + // build for linux x64 + await builder + .build({ + targets: Platform.LINUX.createTarget('zip', builder.Arch.x64), + config: options, + }) + .then(async (builtFiles) => createReleaseHashFile(builtFiles)); + // linux arm installer (non deterministic) + await builder + .build({ + targets: Platform.LINUX.createTarget('deb', builder.Arch.arm64), + config: options, + }) + .then(async (builtFiles) => createReleaseHashFile(builtFiles)); + // linux x64 installer (non deterministic) + await builder + .build({ + targets: Platform.LINUX.createTarget('deb', builder.Arch.x64), + config: options, + }) + .then(async (builtFiles) => createReleaseHashFile(builtFiles)); +}; + +module.exports = build; diff --git a/packages/ui/build/mac.js b/packages/ui/build/mac.js index e659d48..d2003aa 100644 --- a/packages/ui/build/mac.js +++ b/packages/ui/build/mac.js @@ -34,6 +34,11 @@ const options = { identity: null, files: [ '!bin/http-proxy-daemon-win.exe', + '!bin/http-proxy-daemon-win-x64.exe', + '!bin/http-proxy-daemon-win-arm64.exe', + '!bin/http-proxy-daemon-linux', + '!bin/http-proxy-daemon-linux-x64', + '!bin/http-proxy-daemon-linux-arm64', '!.git/*', '!tsconfig.json', '!nodemon.json', diff --git a/packages/ui/build/win.js b/packages/ui/build/win.js index cb50b73..64c47c4 100644 --- a/packages/ui/build/win.js +++ b/packages/ui/build/win.js @@ -38,6 +38,11 @@ const options = { icon: './src/assets/logo@128x128.ico', files: [ '!bin/http-proxy-daemon-macos', + '!bin/http-proxy-daemon-macos-x64', + '!bin/http-proxy-daemon-macos-arm64', + '!bin/http-proxy-daemon-linux', + '!bin/http-proxy-daemon-linux-x64', + '!bin/http-proxy-daemon-linux-arm64', '!.git/*', '!tsconfig.json', '!nodemon.json', diff --git a/packages/ui/package.json b/packages/ui/package.json index 3e5f084..9eb00c7 100644 --- a/packages/ui/package.json +++ b/packages/ui/package.json @@ -10,7 +10,7 @@ "copy-assets": "mkdirp ./built/assets && copyfiles -f ./src/assets/* ./built/assets", "lint": "eslint --ext ts,js src", "lint:fix": "eslint --ext ts,js --fix src", - "pkg": "node build.js" + "pkg": "USE_SYSTEM_FPM=true node build.js" }, "repository": { "type": "git", diff --git a/packages/ui/src/assets/logo.png b/packages/ui/src/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..bc58e48a29e7dc820199b44918229193e6e681e5 GIT binary patch literal 23001 zcmeFZg;QKnvp6`o!{F|g1oxnWI{_jjxLa`d87#OH+=C^--66O;!QBQQ90ms1eDA$| zzumuK_f(xa-F;h5cbz)bw{O>t)Ox3chfReI008h*l;z(807(BpBmgG*zs11yr`3Nj zxA#i2fXWG)!+%JqjTL9|+@aX+p|1%Q)&Hotv?-eB<>HlcVNB+OLkpTH9{|Ek$n8(cH>c0icSy|T& z03c)i&qPvr&vO1xo38E0FYaG7)Wyu59Joy_oXjk_y&atYBL$G~7W)S}Sh|}scstlT zx`}y9GW{2a*gyC`WF97l|6*~slVtj$p~WEQDPG867V&o2;c+lc&&up_& zv8Vn0$Ih&>-L|`znH_5OmIan~+1q`Dai`5IF1V3xC=O z?Z~o$$Qxa!bUfp7Oaj(^^-eVAbtzB_^A#!yGB(n;Kv`+V{Qn>Q|5h|8(2=CZu81FN zzWa}}l`PQxn&1zyicpahA2_7}30x-B*s6~p>yH>{BujDoq+_)yxE8MO*LDNjg=pgH zCvoq^xi@??i+=o&&0aKVe|pcuk?!d}`a3XpExQmaH?3c{vLEg~v1C8&9W-E>y32`8 zRFA{9Qp`(5F|xK@o19TDcU&VDUu&WX5Bq&E9JM~o40uzd(^<~QQ8Jp588I;{n#a?e zUdHDTN8*ZZEn)0THiNqs-a`KZw^VE14(^l^7AK$gjwsC94Nt^LfV}s^3b#buTz`|DxWw4JWiZ@37(Zgg4g|j_+bv zKezv`6Zu07jL@oi*| z>vQ}w=q2#k&Hjix3WQ2-tL{D(ZWcKBtk3rHMBjVMMZ=MXaPYEB~ zfb>qr$p&^*qYH(lw^92D+M-LyuR`xl&SsTD|)k4V301T-Bv+Inh&^iajB zWNIyRpf0Z8bMi<Sg5sRi=fz92kkMIp?r5|3S?Db^@-@=3;-Q*O zIVDrs^eN(`l21U&uarv2&XXmTD4{X}sC|4km~GRDb_=Z2VspKE-)Y0YiN6fYzBjx+ znpy@K=CQ6Ysc~s^VFu<+dYJR+!Iy0I+=z?vYqBQ;>pd4=ZW%V5?JG#SgY z`pnO)Y^(;HCcXP?f=im-*cfoJeQFG4+iWnZKlIyCO>-%lS^MNyGv6!q9`(KHgU9uwNh z-G}qeu-qLhI)9YQVFf3WQ&3*Frnh|T+a;ZXE>KVzqmn|%inwr_W6YJU%#OLgogvP{ zpZ%Z*#Lav=VP3h{tHkI(3sNhu$ZRmer)(TZ-}{N#WKCYRH44Yje2ctOS<2+EJc;ah z4#Z4ZHU$gK?*6q=7&U350DYuZ%yMGSAH4?xj;XSKf>xtl(5L3#qM{?iVtGWNdUY;^F6AD!eB~!;ND*by z2m#(u0qTlQC)LJVW-hLSpXWz5s0aC--zrB18cpJl%e|YZ6xGqRD-Fw2PEj*4B^#()+G?> zXg%GZ<%J)dLh-A(@b}S!IXv_$QAF3#deSz@WkDO-Is8$|L>V6k(eU0vcUigVvHMFR`awl;Z+SqwN4^y{E!&t$Bu+{HqaU7ZM3z zHobtW(8Hbh((fjm^4;e5U+fgrK7S+f{t~?uKfb7IQ1>gii)$aKHM$A_bxT6#x5#7Vtw#Ji=zwOD4~~33;ra3n-r}N1 zWHx%J$x&bVKEde^h}WGOhtnF@Bp!?A(ebM!Mbe>8qH@-^;il7VxB@r(J<>;c&SlRg z9;3{B%7+Qb2s{;V`)0d9bys2%h!EZAk4+HTiZrqMDv$2_w!7w>yRqOXjjisa?1{(k zDKX7%90VBR{>zlI=kW|ZcY){Wg*^TT1lF8*l*0!$%+rGEBJ;~rboOZm2wm*wA@0X- z%gNKiQ!aK(xO7_v`NE|LYak25#0+maG z1XhMxgYxf8h!cRQhP)(>@v1J6F^fB>zr)H!q+(btZw)?b-d(sHToh?XHlj5?_?o;` z&W}AY(WxC%Y&noF%wdzE6%EqQRPrcZh|x4(Dem;1t8ZsK^-gMho8$CI@5p+a4Hs$@ zBEc=+fT^xmritY?q&C+3YcP0A@7Yv28*>&*oDQRh<_qti536~PG|%}&GMFZ(SmLPm zbg5wo%S{favkT|!h{Cj+NKEQj37rFnpBb-PVAz#*O@Wuz%2^+un|#VZn9J$XsJ*;S z1Hc2j_kGX#I6H^GJ^FcZ3)-B6#Ugzk*Z6!GA09-^S?AGG$E}vssgg5k!@cj58M^$= z2xsgv4wsorX9r8=2^d%&2v>ee_TC&gv4hNJgozm^iKsR4B4zcfdY8oUPlmjAnQxAR8x>F4E zG4Fhv#|b(1ZKlEOGskuGzy9AyDvk9t+_NBX`XtGw0ti7Fn@L z3Dh6#kdQ{G4^DRws# zN*iBdWG3THrgnVQzZo*{OBPt?tG{KDODTPMH$Iq$dT}nB?H>uHlSw|iWACCi+HlT3 z$MBiN+Q7-0$xxP);A~gwK?#%LRN1FBu!h9jo=p6K8f`=<+5SbRr9kibT7EbG(O!@$ zjchVa(S*xNay8hQOw}~&06#`Z`A%{~v^Z5-qxr4LdIK@qGYh@TS?AX3wSO*9sYxwg zC|H`uMD@bS{cz=DgX8{pBd;?(c$SWN!Rp|YOUoFUE506BFIU`W;+IH7?h*cz*BjJl zmI!i);)46ps@Ib*thui={Ol=|-nT&W?YnyyNWcbj*XysK;(qwe0JIafKKRiL6R9Hk z_>z9HV7E&)ZwYVb0cV?h>Xr>O}n@)_tR2V^%oF_+m4o)^hbnZlw7Se-y=2 zwW%h{K>aK5fwHT?F&SCN@|Q?Hz$9dNvh;(pC+)cl1HumZ$F=$H(t1eXrC%K=RXQUar1~O31PL|^7BCGVyO->gYRAgjX*w9YQYL{_C{9|?vgM`eMe(jYB?KQzi$>! zqvOSHcq{int!E&Bv)3SgjC+&vmB@wICgCC@xnX|NTb8&y@szN2&5L*(sMrlS81Z^? zC|+s3=q}>V?skgntA?(PI;q{enIFl(DIe<04khMn2s`vcRh%E5j6{l~-r()$%TFm> zEv6lhhUq)L7(H)scJBxlp-KZ0`o1h9V*~h<Jm23q{Jh5> zo^Bl^Mx!b$#+Yg@$y4%#9jv1SCFe2Y{t)WGFvlLj()7Sprd%B8w~kPLHF}hrYu-Sn zNnYVrdQ2;D6;Pw4Rcc5p&2JI(Uc5iMWcsK_%;H*w!Nti-ZL)|GgQF%GCi(1O$(BZs zW&&%nHwvCu+{M4pb`ebhKn_4)tpdu|;k+d>eEr;sZ#Vg)pg(P{2{Z+*{?IFKuBHvG zqpskv{rVv(?UC=C4Vsva4slF;k($irH2|S>K|4Y|CnIhNHg2F{TLVGglYl>!q`zjkeI z^Gk$er6mU)d^GK({aVg4$Ib*8IOZt~h44mONL%pw{e&z$3ALDf#9QLtpb*LP(_EeW z>dCJgvf=JW`hI8hYnW=T(pNdqvzj_ZvuB72C9D!H$U3)@a<+&&`g~pDAk%I7DHp$B zvy``HEsYs?KK3i(X$baFihbhVO@u2Ka+iMXFSvV$c%M)|7&vhkBINbx7VLH9ku_jX zQBoeWl=4{zUX*H#f3$|~?9`X-S-xNA*UPdk=Mk>TBZm<;aw6$5=2eeY5kRo;BmF9g zA@vda$ph^{DB9sZG6!7%btVyxK>R|o|tznf*J74 zru=}dcP^q$Ku{pJ^z}<^U52e`7h|F47>^awAFJsK>Y(ZZ>nvV!H_+|XXqak3tj0@; zTofm-P$#Zwc3g?cYrPZM88$9K*CNWd6~g$A{R+rGU1z#QZ;jgSTxhE{J9?Pu!ge+S z7JM>{Zq9smOQ|m&4{Bx{|LQZYfv?lDTOdYFj=kxrDIZA8-Ky`?B70fEv-ht8TWGnC z-6@_{&tDY)hU|}%mfG+~+kc0QdEw%5$9PwwNqv&bPfLPy$O4c}fR}AxW$ES$$sZ?* zi*1a^!rLj(mWZ=yWUFM%LEjR1+P5;^ijwS8ccw~{7dnE!!>w+U8p!WBD8fO7*18No zGnQs+((bV-*sG)k)0pDmHmtb2v%?#UfoePYf<%8rJ1qe+>=idTgz%{Xg7Lg5)?$yQ ziV^G^_i`jmWBFe>v8J8b7QD0RZG;#Ke`EFhex4Ij(BJ*w^L?-UwDg6g9mBPjtEzut zyta%>CyuSX=kS}@4IbfJ%e*9T>lK$oiAN?{Sv~qr0_Z0cZCsjx+)hXpIE;q*VhBVo zEhNP^-Eg)+BS9u2tm<>m^gmsX2PyT_io!4Al){R5JI;lY@BXykv^yNX*n+Q%Au$xy zEb$~K6xq9bDGg|{)(a@NRrzGx-Jztazmr`m*n4Cj&0O)SC zk=lc{v}0b^OTZ;ms+9R;BD+C$(H@x5Ipzp{? zf-@3Ueyp_i-{t&MiOmI+jcxk%k6Fssn3@A0z5Bl`r48PHer)F##SZOQvFH)Ye8;t97!MxNCE2+QY8 zx_&bbdvU9^vg2vcNpmGh8$t2pboTSat2SBl+q6KqYWYSffuq*6dQ=E)IIiEvdA|a0 z$3Mg72C(HWcITpizrGPcSZ@f~C+)Opt-oV1fAdeB8mn{vupVJFD9#vI8x*Ziib)9# z2f4HKun~%8%$>O{uBWFyy zD&1UqXzmUHrPUX$k%A+&+XRQy*uhf|^M%|JsI2GD^Ulx-X0$;)_N051;VXY5%S1Oxh+)T?0Xeje{UpCti%1v3yf`_7F(7 zrBH|d4TM~8Db2y^Wx3is>u4EYBt`Pjf77itso#QiR{u853ZuN-HH5n9k8m}aEMN`! z_n0jUB$yM>!wigzi1*C++TFYt;H&N*y>Us^SWKT$Xrg#B!f`=rczU4v1q6!co1r$< zy~*IB<%ivT&FHcOiSVU@4E&P6JBBZw-Bj-G!JJktYF~TaM~>obl1a>sFbm(<5R&f$f$pa5VJN>a}D58v;hBto838f`O+!k zDA&hLh;l)+y0Amyj1{BXXnIYar@tl8ZOk3X-7`O3^1eOy!=tvk|3Qnf7>53_dF!iz z?+mZOD|rtcZO1T=ClYm)t^rt41!QyaHJny-B)U$-WTehDCZcHF>)OuZmkoO2wkOx_9AkF-P15`CO# z7`RLptFzk~g~e|7O-(M_CTVdX1lSOch!<-Aj2o3v$idv_C{orU@^cm_wTuUs2-N@-I3P#9)O~NjrZF5l;-CU4@btSiRKFno#?#FE6(S#X7XRHDAZx ziF)8PR;Su`(MgiJX-Y*P)&U*3E4doE!kgGg4m@dOf=JYvfBZ8=Hs|^aE?1mSlV}9g zjBF1sIc&T>zf&C5yg_@?`}*o=x@M5_!$5eA@G{_{IOg>}7K{WQ9{ zHEdsH>Xi(CWH=iLsLZC2eSjZy{_4iC6$$nQCAM$?!8oK>SDD>`G{#_aN6@-e z%|lh(X74;9Il`ma>M8Wo1W+6A?-^v`-q;HPFh$cN94>-cL<2B_2PA@IQV>wb~=ejqCqqEPd5JPl)WoR76Bkz(OeD;p==Pz@%~1 z=8giErt&4oJ{)?=OGY%7rn!M`q1$$2KbNuBp~N#mfR6)tMri7qUpTVNQD zDP_OBXz6a)H}ML({Gjx7+%}4y17gwrdV&-kVJJQslEx(#YN6efSFw)W%#hPpEjT3v z|4RMYixb#Vb>4l%%mDIud`EFfJb?4&Ymd^{Z3P9vBTqeo;PAeP4>Rg3(3+2M0lr1B z<^{eUYttNDx4RQ+y*=xXm(RVIq@YJ>mWZu6pjxG!pDyctdvYMMmdBOuLG=JHb6XcH zhjzrJb}`4i8=R_|F@Mlzc}JB~xB@NxaeY>N-|KI94fisUnRfayb9ZNa`b?Mj68h#I z@3>iG{w^*xBfZ29f>H4TL5U3ET`+sN<;`cTJM@eLn%tU=t=!8?55^%NwnK;1;eFTZ z<#D%H1*Kr5UOVd^@05$wyoX0HtsfKib15CitrP8_Snha7X(L*b=Fdyb0ncgLzljWX z8&qVsn%dWz=Ho&7Xzi+b3URXo9hXL@(4=GJI#b{DZKkv*FKhl%W9v%8xQkH0kD>2IPAjcN z+`4tS>OT|LpSP5^q=eUHMR`Tq*h~6qZ-nn|lpLay<>R8PPff)gzV4LY?JX+)z!>T{ zdwTF_{dD_f2uIm$VLi@vSyxJ9J?K(&g@|d?FEx_6K;|hx{X{gFd++Cnn@R7I5hd7BMwfmt z#yAF&i9K*~j*vm?>jy?dmLnXK_ml4-0kavREBKi~t^16_nzp6V9p(}ctV_SUj>0>d zpqb?;ofu}R=;>>W%ip~Hcc`fdx}W-v&>B+T;jMI&l;%5HlJ)3J$J@8x4tz$Y2(L&O zP%T8&2l6t>Vmi{S+-H7=Q3y??SG!!Kqp0efY&8ds zTQ*>fh?o?wtL*NB;d^u)v^Y)nE+SKs!LemDKUjt|q*=gkBlBk6N-Kfd2iecwQ11gN zOXRq`iZ7bTe7@2RorV@skCU2pw4C{c0+`=K7OdH^-wVZ^DX8otLsLh!}}Q`dYe*1yH~*@n6#CCF5J4JG6jKNPE# zuD`w8nS5_rXgc`b{ct_eSNtaG2jv{8U?Xa+-PGm69M27X2-iSlL)V?W-uaNYmtMfG zNCu)~(g3oHfkF-ptEHX4B-j1pdj$PN$_{I~;LVEdd?I(m>3U;!`A&Tefm41}Q3-DX zRT6t*$O6=|Lr$L&#hT-7i0t3NtZ*B_>PAk1RX07bjek1Bm5AZN#?fyFzsk*}RL{Bi zF&2}aKw2r2IFHAYjpexZXTl80eQYEHLeYp=cU35UO>+F1Kr2i_lMv`VKUnZe$aHim zox(ZHe>+M>35-q-NMB6yI`Edc4H{7BE*w{=r-n&SsBqA+(C5@oOYSC|4PO0)W)H8ax6gVA8ZAHxHD1SM+}{6Tv7wJt*fl2R<;J`Q!2 zCTRR+rIz4a(#Nv;!+ReMPJ}$zzIr-nh_31M03tZhYLwApd!&9i4!Dk4Yp+<@MzEe3 zTzUUk++lI~4S4E?luEr-67#BBg9hYoxiW-*4lar3Ice0l@hU^2RS?hDzv}C-%Ku$C z?om(wog=H<7uSI|6o{qoS(C86qN8-3PfGj2g79omZDAttxwTJP(Np8#T1Jc_hxM zQtf*7%LA9){seCTu6Ni1ZMXLZbrp5Eez%N1zv3LdL1|;|wCs%^V$q%8hB7i0plFlY zF*;5?pPG`RJmT6&g|EL$=Re)hMl)qfT4R)7dZCPhWO1CFi@~5~cFwJjRym4felGJ% zKxBFo3^}(P%CbW;i-xC+~nDy@Kg&84ZUsurzS9t&j^t|hS{`{fRX_RI>B!+*U ztG#o|$EDC@1F80|1;^r+2`*O}{Yk`MKb_wvKCPG@f_{a;2i~(I1g^fC0wDNq2Jxno zFQ`j~GtBbgCR6dmEQS9{HfKu-5L5H+5&w)3u}{mr)zLcuM`@($uulhL?3bpmGQ;td zOlZ$4Fu8q{6v5c58sfGOxy!Ki-T)jN@K-$BE-AM>5BI?O4hP3i6&&$YKc2V@7rS~W zCh`Kc28581+r}|3pi$g&XB_&YabZ!s>FQp7qq&ue$I7R7wt6_i?|fgG)zSZLI9aJN zA?DiCi8F*-e8jXPzqot=4BD~m~paZ5&Tv7CW0$?e%`#%ed3_B}6@V(3|$`{~nE$yT;`VtZV`1AJXKoT=U^$JGT@ z88cKbYQt>RE8gOkp1qe%TE+I3{JeDEsN_?s;bbNq02o6hvmEqxU;*2?Ee0AL z(P2vW)i5I@RB5DNkX!)6WF_!`6%xGYJ?}>c$#tLfSzzoExD&^|sm5~$=2%;{q}GGc()OgB3tkt~3M0s~M5gV66WA;u zf*F$c{xQ59clDYc!{|B(w7kF0x^%DqET4T~glamOwX`%f??n3Qg1^7Q(oSgQWTfZ1 zT~^%yrzI3Ndzq|C!CsfPZgF|n6)wRFAJo#q9jJT=bd2$(zxv*n+eiM1^Z@_FUdc;( zJp_xHf_92uN=*7(7`5bLP_=Rs!rk$%@ga;1nHz4))rC+B9nM27+!BFzjBJV+2#sHQ zGzGyP8I0T3#-$@(1PNL5rLri8)>$X^|}1jV-;eD_GR~sC9k`-^vn;_eu=2D=uFY@i2hm&uht zZv&$`X7N-?o6%w@G0uxcFdS5Uu6KIjlQv3+iG=C;yYBw7#9+g;rgW)S$U&J%)wpGv zfx&??%rjiU^e{XQ{qmf&!rxyDti!duiUE zSEw@eh)GV(ydB+WP^iE#5{vxrt}$@`WXcg~EG@Xh{Mxs!3@e5y!Ns>YNh15xmgIUYv%{6^%ft6sST^9<4-4DGNEgIxVwRc*9gV>p z-{ub_aM>c(suWbMKRTcDlky*hJ)Gi&RBqXvqQt(t^<-LmJc3~Y85p&0lRG{QtWNQ0 zQDi0z;AJ{!$k977QN<&D2&H2!!^`P`=_7&;CW4FgHSJb!$qQRMO=-)tEyWnjdN;mP zHJXx!ovH(<)*pWc1iI%NzDzx00kA2fF>Ty1tp}M}OH#AID2ZKnbclR>-v#%gGZax+ zE;;^M2wVOt1!4ZDP$07SJ4@QTe)X&G4?XQdra9K4Xq&Q90|`pcRDb7|O%h)g5uzOQ z94(iU%dTy?4vWt3Pj=qAlFS?vy9&t_FJzs8k@HbjUaS-lrq#mgeZ?erYG7|wHn{Yz z7mVHS4ju(po@*eM zs2qCVOuOkhEQbLO=OIc4YB_$#M5T~wF7KAg6>Q}nVF7mZuDCoM14d8FX zn05NuhyLmS2}N~K{bmT-KSPOo7VEMC1qk5M@R( ztd2R8jQ^>L{rU69#NzN3?!dqIo(ut079RP#-U5(~=uekP4v+G$h*%4q6t7h2>AIa> z2e{=AVy=Ju*9#bOCX+TDnj@XK6-`my=7KqSokr`yCEbeeeincCttbx=@sJ)-YlE8Q zzTIYA$$gl(%vExX2o$nNh>%uiE1)IDW ztd13F!y_J8NAlo{E_W1*5oW#7SjOY|coDt6I$7H@g*sy#AEr#{OMAUVXqp!_owM@P zJr%2piHr5QD}1p72ahRFSmsG2@^!#?I^M@wk?ns+fuk?9B$7^JdF`Mqq{7i}CJljK zK$xlIK10^-M-mC$XjA$SaY(cCLNy^rMLbJzCKVAE@5(G=a`k&(MUhY)BB?jPqQorY1kJSzl{#f-T_>Xt8gm}eU z+MR`o4wlQ(_4r4(Af>s|;ae~;^C#*a3fGQ1ROd?YLlThrNV*D+G1(JDi1lsAnR zp2M&XH4Ape>H}qBHsFY0_LW9(cb&30KNKou!*8&3K6mqBc7-KB{sca zsqW_dSY$O4lL2Q}vSgS^y3O~a2dqFLK}Gu6Rz^X+X{UoQzA46M=iO51a98MNL^8+) z4-z(~{sqap=MS&Akm%8G9^|A?Hse)i2FPPlLBZ`aM7Qq#B5nU}LcdBN(B5{O@AO~U zyjI|jmbAW5bD#}HHlNv+3p#T@hRX$6iy7Hb#k}TPEIP(-V^`Ywfy$a5ol>i!IRH^@ zM|mnR7{Vv3c|7fyu40;g@Hg}f)ppV2wO9z+UuG13V~pK>sGxc3HR;z7jJkAz4=;cQ zAnvueqD?Tfl@32RnxIA?VsXk9O30p2-wgQ4ATrY3HMQ`MemPN3Dwf?D)t!sApxVEo`Q1xP`&O+%Q4e(L>Nq`7I)(|OX|JGc`< zk`t(?LqTN((7I1F2}1i+ho&>kRtlqI|CcMB3y@v<$pZcodUEQrq-)<6xM)VuJBLQT@mi5EKj%FS?sP>FziOM?!`fp0w=46LJ?jUJF8XSr;bVS23~Avl zQ^~}2W=B|y-TBqo?6kO-Alk^M_oJE_m$|cqpAvN>p*xdI^XuR!H?=1f2I*ap)Sa@H&1AY7;M) zn3pRGD%xQ6ty7#l1o*IK@BML7r)%LL3ai=;Yz6h^A*RKhL8%nHhl&G@Tp zd-gn7nC}qeQ}^o_qy24id|yAf(q>e9rQUpeitg)H!3ry9!^4yQGwQE!#xCkGc3fZ_ ziPX;q9A5g(n6}RWO5=2LuYuw#`%fIg7QnpF(>*r-xdMu>kgmh!Cv5u&Y8KSmAKISt zm2!v@=(-6`yhakR+5u#R%Wa(r*PWkp`{1&t=JZ&ZS8h;79cB>Wa{(RvB_yvBcR?5y z!>J~yXn(vZ&4~L7Fa)G%=%H0!WVFZAA@B>F?eSw_n<>ryQ1{Jm_$#EAev*fl7E}qr zQyh>@zW7vgdv1%udUom_j|-;7d3NAi7@IU#KCoguh3~L-h0{l#0;SG;wf`dBPIoyb z77u3H98h|2C*yC&?qexyPpH3;yIybW|0`*ZYq5Rc-P^{VpFnS#H}N!h?Wy(7?~*qP zc+4IO*gyQOXntLVH0te(9uRKwCJ2KK;vWMlIP-&f2M5Nf><)_dB=QGx zD~i^^Te=M4PfZS%KP~=s`T5wtCP%p4XEHw^%t~x z8f%l#-EnN=4tQb3k9;RcY$wQSf^_$Y`tqLmE<*?8_c}H@>iXzhus7d((p$ZIQ}9MU zdmifI`F$Cl_`6UJvj!C1VN_YT?f2o%4vaCj5WJ@rKsHQMx95M;f(kpmDkWNv&F6vp z_5Rs6&z|hNm4kYOtxU!!T{Mc>8+sU#<(MKBDH3o}+)%jv@=Dh=I^5ap50XbI!9=_l=kkO7As={ZCq`1 z6RipT`aOEq%4+0a-J&kbc^P8fDRIN07Pzedu$fjZ^6~Ub))I*&w{VM3ifz{Pr_Eiw z2oD3{-0t@p`_Ja(`PSwqF(_SSAg8G+C%iX+^G?p8OOLI`z(@CAr-Rdk0DPB08E{lW zkFuC-XLUyUp{EKjS@RIzhaLFv89q7WwYO@i2a@WGapDUHUsD$_;JILg*&!hTICLC& zsn+z@-QeM2{i(#Vp|C35mNJl078A)f}IaocxnNp8mB*!3chaN-WfLJ zor&Hh$I-PUKO)>G+w%O+?oIEX0cm?-1C?!Fhazdc$10~(sR*@qjkz~;yH60LHm~KG ziI6@v3W4pRqUegH6}Q$_x}52yYhAU47wQK?9O2ucX5gPYe0P6FFS?xp_L~SqT7Qa$ zLN$&hZgdPFmqg{U(5_^sZt-*PxmR(uEoAjtoLb#aZ7d~z2}-|wtbhHcEWafmMSOcZ z|IE`Jg>(8txMlafH)9n$Z6KyN#g=67tec+d$*-s3(7TD(?=A#ye`@q#JbD^TY&nUf zyh}TY$R5Z|fx35EaFy|+)ch`ZFGVvnvvCSTKJ=nYf-$)K{g)Rlxoj{uUS$vE?Jh*K z^b??})YAV13yM4AlhGTRN0pa}RJE?qyxC&kuB&VzRp^-mA@My3ja7-E%s-p34QoEi z_N0c4Bllg!C_q+S?}y?%cpxp-cM~CxOoWeV2AKXaA7R-fj12bW(oI&p<6o>FQC@1= z5rxp|k!0&GOx^DKFPe{(B@-YVfAXGlrH?9Qg##@pSCK|jleM`s^E5}($UHj6x{G`t zS?EMCZa#eaOv-1zOy|DXDDB$KwrS6k$xtQd-F~_krjs|_;6lhfj94xbOKYagi`{{Gy2Vqdsm|-gAviZ2y?6V8zt{ULSq@9KUXh}#*3X! zrJ|jzSARGsP5aXCwtpIix80Rk0y3qOy(_{(GTk#3+*K`j>}-q4^O75`63M0UQ_Kc$ zy62=9Zjt#aru?skjjrLD{ z)`;-|WA660gCn<|$3(*s_blQcpT}*UA>YXxj5vRnDZ||tO4OQD);@OO1m9Z&`|tMw zoh!VQYe@V;OP;__hxU$C8xtdj*Tt73D0P|^ZGni<7R#Olul(RHa>J^6*f*8-0`QAx zi`MfyBj#IMR*w=)ka7P$4P|929tR*B@SBfzF^NKrq$)65yB76r=%5@=V36Lk1?bEN za+;rp$knRZ`ZU(pxx0WS`m$JPxnbb>0~_fGW=-8qV1l~0B3oT%Hlg>7YSEjbp_ltX zrJx;iPQZH(YV?vMrJS8iegR(3L1yXoLq>A{;Rwqp9s9N_ahYW z_rmObS-T7;Xy1`PAqu4zb25!NG#=p3CYZHuWn7#&J7A{v+w;Gme$;ExOL36E9A$s#2gYIFf`JYdYmSI&rh@#x;$u6!?Ob8&77bt_K~hQlrCsn z{@}ffGHWziXUMaJni7DFW39p=wdTvuc{OU>HDS>%eWXOkD7eO090Kakl7JkwL zHE{eGiOrD@{U!6?VemuJh99~gikMnEp~Ip;der?Wn_9cCoyNBnCt7an-QYDku6?%$?hXi{A4gOS=(N8C7a8M+(6=@mRwVRE zn*DVY)vP2JsfPB6Hy2Y9E;`XIaPAy`I=0e@XHopk&g@BQN!lVBV_fO7!vO?Xo4Y6l z5B&=D!aCFGdESM=L|XP>0cqMcg)Kxob1BVD`V3CpWJIDyo)Y=z^vCo@=8+S6Dsz^u zG^Qhbcc_MOxB3pwD_8>%k-R_~!5&qQw8)-m!t9OIwzf9gkN?u)x#oky?Rjy@H?8zt z$eJKWU}O7%-6ID=@!9QMVZENfl6Zq@^*c|5z;4ya@mpNToD#AvZ+J+Js$o1Lk9Hwt zK3=e^kO)9xgC?b(NNxfx_;mj-KE^@VTgr(>vVN#%8WLO=(pW3zsIKY8sw6#h|h_X8j&iMrbOP3*&nMIAgt1! zda{zIxe`*+_7nmVy)w|d@I0g3s!Nzd#{=5moECcAVzmOeU6{0-H^=@>7d1??clEiR;L0?WEeuYv(z`$Uc*3!`(Wl#<^Nj{9O`OE= zV!9Ib3fOogfb!ab=H}em4zIE`Ls_LMmGcFVm&P1wh#DmBUQ25=lOT$6jI;aslWKb z+U_)iq%oo*(){DSHDOrjV#haRmjgSiSLv-ufQlH!8HqxV0DC^lW?Uav{6^WCLK&Y! zPDN900_Nv^B#9zbx%=W*#8s$e#VAOsaNhH~*+qo-uVeS<<1)v9SfIfw6+Ist&UMz+ zb8WND(TxhXS|QiO7{ygAx3K{Zmc7l_@olKm^r2+ok67{I^%+_H&mi;8RaSEbA~AuHBHnliUAj){FWiQts&}?Mde}SL zSN+m%mgSer$nDDQijWhDolX(cu-gfCfYcXkyQHp^gTg1k9(6Oz^G6IECKsb_68S&2sR|I@!T{xTGVs=yn+SyIV0xXqy4*0!e z?=ChM;(y1-aljvY^s9o08}PiymahayPn$~)5(HlnI=p4m>u$ZkBGs|(lSin%H4-nb zggi~7330t|*R~wGwl|$Q2 z_$I%m8kjY)-E^lz8UP^*)0+s|RPRJ} z5^PdF0hsnbjiCr)%UJN(B*YwUHZ9rj9E5ehXI2$7<2CoaDFvS3obxY>26N=u6Ow)U z%ohVN2?w1Er#tpLygy43C*79tYGHmRGjEVT^g*zL(dp_;h~@U#{$v5`@Do<~9G2K< zsf3{Md{<;PN+~>)C0n4Y!6JA%F><)o>v`-O{0714IbNHK3#OX=dB#Tj`|J5K>D-2( zB(?d2>xgL2vFx?^Yz1+$T3Tzh16@&NeFC7(p8`q22Ky3Ig2@GR;rk6=OEGRWsWvZ; zpE18zdR7C)^nUUh4Z(|(;Y$2HJFbL#p!dbeN^n+A_H#Mp_NAqwmd$@1>hY~cV;2HYcE0LG&TOUFoozSngXr63_NqHigt^9_5BA)IJU<8}DQt1J>} zyI0THbMiuXz`mJ;l;x6tUz-33)Pqw+ z>y6|VumJmpRUTO#TK;?aL@5?(_aI9{Yx4V%?00Bww0bN~dI0ZSuWm6&@JDst>R&whhAO@DSJy z*z0IXr9!EXf*V0@LZPL0oiqNPk zFtF#b0H@oeQSQIV$Dga;Dt+bYw(hsvZAeDqLc18`uiit|V4R0^AQCajVR|5zH^oy| zLR#NYyife@;AwMvS-zq7iX|q&rHE7tTsB0%n0IeUS>F}Lfb^A<8N!5rv(|)razMp zqWEtE-N-2{A^`9(fDS!jl)j>_tpzZaBeaJC(~kN_Eye{!9_JOG;)XLO(UYbTw3YlOM|qb%)+vczDgeZ6}BK?Z<45a!$(&8!Y}WNnbWwclO9bM_M1G*&X`*#Z8X9tHA(lLD7ucdlHYddP3S zGZX2N&HSBDe$MQ`m`8N0<_Xdjr>5C>Rw*a-ZluKC4ZJJeo^_IHDIt{jAeP9L%%z_8 z(PKrrEp?<{lk=uot81|I!(=>boEQ=e=3x0UW?%)vY;YJl*q*#N<~tQAZ1~m#xq2eZ z$x38H{whQh%7gn6T8TUe-b!0|#KH2pBdEjU37XZIQG*O_WEJ43&L{yU9XdogQw>dz zWm4YLBwiPMHkhcB|7xQtRx4^$Sbu&D8HVPDZSm+t^&@T{tHedfDKHb^O|(Yse#ki^ zJY*gYJ#D?bt4Q`ZRYC{RlxW}6J0{B-dhJK(yuP4+KHli2*%IfP_Co4+ls&EL-lU#u zc#a$eev2fFLR|L4M#U|6t-*8MQ75C@zCJiZ{aAfCL?%=TD=W_aO(@J6@zYY~8814v zxcsaYCLU6IPTl0FnFbTAydG=rJGsnXEMU&R2J$-p*dZSsbe|(dhFi%h_+8T)g#3@no0cY>mO-wp_ zW7zjnWA!LCgt!m-+HpFNJlQhBf!jw@=SsfVs7^IaloY+20JPim?hf@(U*biyjs^FK zWN`4#q{Hq0Wbz$fCpjklH)pr_);~xsI&F4*+m_2?$6wqfrRK%a!7~}I_nHH5{>(iP(Aw5hUSHlhQOc0VI7ijk? zzS3`lY@RUJR9%hj)HFh^?G7ZgdA4PnTH+HX?vhexBX7kIb9r+3xUG>4)eR7^s6!8Wv1)y1&h~P@JhCG_An} znbg?N1gG$#o|uMwC%cld87!6)UEP~EFwkK++!lH*F08YCU83?xL8*Dyz|(G-qpVu^OkimJqdvZ*cR z*r`Uv=tQ5V*JkXiK&uVPcqB5#3moxmWi__Qo3SleE{Pcx;C(+eO>QW3^*DHd_MuJc zFpp-J{J`lh4!{dADLNA>{Yx{nQkpFl&L8ePdqKF*Y##BY2@_{uArR+=)QF5WKo;Z zy#^!NUi&E5RgSx)9`@tMOV_IQ;FpJP8B}rEI#}}OSgjiqqc={5Y?SW~X0FikxO>zY zHf|tt{_wa_94aXVfB)BcgSXtyL>bSLF-daqv#pPth5BHdDIVLVS0_ddz*qUVFEY6> zNk7n*!@Ctu>m|lD*(XuuvWmkaA-abmcKF*Ou%8MuP_ve`gp>NWubOfjO7eDl@D2crUty|D=C6TdP1Diw@I?xujC8b3TO&w~a9`f`k(~ z2Qp5i1nJ+Y>w6+I;qNe|0Gfa^GT5!#fzrK#ycd4hiM3hP6Gr);c!MOBeD}vlHRH+! zd5(+GycR`*nc@~;^g4~D>F>JAXF-U)czx{;qdml(G)p}&7P{-NW79hbOX-=}#)P`8 z>zb!0Bw^;0LevGM7g)NNKBmTBeKtyX1gso41f=+a^jx)q)ym9nksP`DSZiESE;yxl zrSqmu^@M2BX}1@s!PrghM+ivL0ZxW`S|XSoewpO=ZzFGqv-ES>snuHowAZi5p)StM z6pCHfyRUy1#eaasSjV^~TKZr+kmMJTYF=K83y;vGm^g5ouVg3n9aRSAGa-$Zmo=#z z6<)aWn$qSsA22+MuYww$s5~!H{KE6+)^FOLWsmP*()=Jt4YVc}yYQpjlRJcqt>KDFIK8`xtn^EKPvIiVewU@RH*5gbJVVNR_;Crr6*dXPKR7uG3zknY1mi&FqveC)XM_ z#v5p(J;_&O*=0o#l=&TuKYu#JccI}S*>{Jo*XsR@NTfH9q}$SZEd(wq-|})10Gqvj zdjA^n7OB7z_tSQPIdSo#_F%Ygaz%ZeE0ks|Vd@K4zW`B0J|*t_8K$UiS!$v@ciW2X z-jj4Yzf>z2SQlfM@|<+3sB;Ab&yqxCQ!6m==M~B5p49bInxgFruNj`+Nr*XxbXJzs z`&umWLvn*>Xcu?|$UYZ9+1Lo}{>~A2wv~LZH=7BVtUaz24q$KUE5LFEG=UxPQd-hC zHdJLRt`OMW14aqRHx4ju@WB3zD+pXJAU$pJ9slbct>X#WMpS2MhjGIHThWV}xg_AD ztCFpMG6%~B_!0RDAC@hn0&vSq6i1^PqA5OLdseq_pQi}_eLpIl#Dg`A;#N=2u9NwW zGj*hF%eZb|!WHQIh9-co`Wta@JK4%O)o^Xq*$G?Nd{qC4(`~>gEVlNLuO|tfC1m!K zQP@gS97?&Bu?EK*3ybQ;CBo&9384hNc_SEC$;fx>wgh1jhkYk&8WS5W+v|;%J@7ra zc{v=6Szmi2E*F#V;oXGJ7j=}YYA=*S4*ORV&c!?rS+U*%N^`yLNO&|L! z4yX51zZ8ah1#b@7=Z~Xt=0MP2?zn%XtqMXO!D?@LI@8}W+pQb+emK{M`&vQ`^k3C? z4zC521qLfh(Q>UmJaDEJOIaEk6|Iu*&R?;uFu7zClZ6W?3=72Yzl{*HCdU8^b!`=N z!Fp>FpP5rrOxg4BTI72x#rWsj*+i2#f8y)}9YqY(b8;a02|p{1tzR@boC&2o94}xD z`1v#qY=gNDP^Jt4v|mZ=AqB%|RwBjAyof{d5%y#4UgfIy6$B(*OY_;bFuW3`-=5If$*S&|?~)1%SuH*V2S7aSdakVGfd zz*@y{1o9#Tw#UP)j{6y7>&m8Xf&wTP)mc@T9mAdnF!g;UzJ>+ci~D9H#>+w+`4$RJusF=_}HfTO*X~XJ#jnxkv?_4=*#G8-EY1V*7O3 zSBt}w0N63QuJB&UedIm+)g;}*5SkAs@k#Wt-#@gr^ERW(2m2jUz9Q63_yz23{2tL0 z@6)(o?i11ueO*!?C`$CG!X#;b(WS+2Zng3wAfB|}AUx1rXy#X7c7Z+X+~PtTDO|wn z%9!rmgzxn7dky-5n|&+a%uhA1n{ykSl`D$O^bci{8Z0?CY7yySi+%%eL(<+qSFAwr$&X7q)w5_BXQ=yMOP?`10O&?l~9l zeUb4ZBQsn#d10e`do@c>dlIRE1-0#W{p0}KF!S^z-*#nJp@{~i*5)?dv(El4iV zzcc0n{}0)sy&WhbHG2mrvK{9QnR^h`_u0C>zoS=~upR))*S)|$@1 z*w)a5&du8HuL{89#`VXwHgPf_bhEayapZF2CH@D4>yQ5zrY9!+2gS*fmsnj^fl%1i z!Gw^Fj)9JWm=BtekdVj0*py3AMC@PkKWDte=1xv_T=ev=uC8>h%yhO6X7r4loSgIw zO!Q1lw0{`1j_x*225z)AjwJs~^1t(lm^d0aSlBsP*xC^O&1+z2>+Hl!O#HXd{~Z79 z)5*g0-<50}|25X10qOrn=o#r4=>Kmr6E}r1 zi;ta&=N}dR5Afgp{ZsI7zKV^76W{-q{1^P+D)oQI|6S%k!T%P>J6M?fxsdk z?0?kJ__J7>{e{QXRpnvujA2bjB|LjvfXm-y7UjTq+OHxEo*$wE@ z8%keCwDoI3<2t>_V%{lFIz4~|HIE8%EPm`x9keVS8Z70k!25(i8MTt|2^>|V2TatO zfE&#XidzwJ7E~0-Vr8vyCg>`0u5tCsW68byI&*_%a;XvZ=9ORgda~6ljrsoLNb5Mm zzb+RP6_OHBfiPDb#}&={8LifatS~mn3IU~dLHA3&lS!?;`!+V z)?>bVN)mYWH)$%V2!20O6T&nZso?bE0%Ly3(|s|o_@0j{(+(prbY@168gZQ6{c=Sz zol1LDY^X-12tu$srDa<1t_012ouq;4QXO^d*xfJui9i@w*uqc+@cV4(w;m z;3IxZ=It6NCg<$D?oc87G#{yEDL2tnW$IL;kQ$Ofu(aG9axryyVR5)I+i7ZL!eKF+ z&BUR_!J@b#!d#5e$ni8mX*UGAT}~jB)kC(YeiFToMk$&|BpKP8J-M`a0gQOA5}Hhl zNlS$vHTFKT$I;3Q2j_!B#=z^3qq}aXVJ}_G)@1f>uM@hO{_r4BR)J6g&YOYg$`Hv) zc-l)K)AJ1|GJ9S{BI-RQLNGo<@{mtZ*n==3?*U=9t{ZxozH5-x(%%r7QL_Bgep_2}Kfu zjB3ufnlh>2AI`!19u7F9fXAC0Qpe(v`odtW1eGIFZX$|J47(5fcIL;4wn+%vAU-F{ zvmov1GpzgVM?T5g>sU_#d{T!chOpXxy0|EFWFzFgRtkMj9#o({ z`JpfRP9w7~80@qTY|C|XliG4WM5%zmIT zT11v-S$p`rbS%L`kCnQgsjwXoo}&y2j3T3%zqH_gg8&XhCGDS~zK#@t_$*8(y>bBi zA+Q%;Efrrq4h`qmXh4Cc(N-|edQI^AEr@(;#XM4^sZYH?IxuRhv-|J^2!2yj>Duuz zksBw1m@L#AXv4EeQJZUYvN$zE_Bcoyc3Q;=YahEmBZ6Hn6uYveD3pQkrY``}>CjF& zH1TKVR5PvieD$b}XO+)KzEayrZH0|hBF^!|t-#IM7oba(u2RvA-trFoF@0JVUk!hL z`j?fx3Jq~AlkD)Q5WCUHn1CvgMv`q`ZYQXxBSU~IMvM-Rh!@c2j^DTrpr#y2W9q<4 zYxWR_d%ksj=+kS{qg;tanc6Fcf9LLcC8hf}oZF(J-E#gapW62Jo1`R+4mC!y*V?3M zT7s;QI20CdK)?{Sg!`rKZT4_~wNW0rR?I-ZA|C(BMgh=+y9R^3#y$1* z1P-W%N)!IUC=GI>DWmG3VOCH$u6D-n_6Wp7G(cN&{ytX{wX4g#!1`mKFC_wv*5e#& zz7s?BGtWAYVIpS~jO=@frx`Y|Y~ZJgH=Q?uz_YDNtet+dN$(7E=d(#W^G|eXrkbjk z$Dx4$?M10PwvW6e|JL`e0o~8V?CK!|-RaDw)_E!E{<%YgU>$IKYBD&A=oIrFak6mM z{A}bEz#7U8{tAb`Z{ZA-(=}$L9Ed+SsInjJ=mezr0%g{C+toCe?BUsMcyUxq5peFW zE9R5murH_7L7xj)nYyHtZszCmMH27abXW$hGT_nh1>BkKAE&ZrzrTY4kmE)MHYuof z9C=tevl4{AM~g!nw>uv1%QYL>kEfVc55A=6PusJ_CeW>36BG8i$3kB7b-#1yzt2lZ z@UfY-i7h!8xY=igu@mQ>iUBu6$Z(NkbwR9vI!tq3a{(xDk}ClU^D{d;7WOLBMVn@d zoOSv#dyCe;LEiX)vX3vYqk4}*w_a^q%^!eEEK5cmIETUE z?=$S&wB?tOtHH=a?hqd!NH;xU5+^88Ejo*EcAgWG&eaLH=k<#@IWMH; zM&2s$A6qGN4j#dLA5=M>iWqWw0HZf9*ARxB%&Sz{-2vCUt1470oB+b zO6}vGptDrm#aWLR2E^BdPi0}LZ>Lv@qlSvnh7qo_Dal4!gp4YW8%9_&=En^0Fkuvz zudV*1bI4tt27}|wQvaPL8saKNie1JbE@m)Ar45+5IG>- zgL8lOa+x|VV9=(XB*CbfPFZ$|XtE${lcu8~D|p+|EKf&AWTF}E06-BllPJo1Dr1>W)mmwu=>Fus2VZd5CxHYdhb zud}5kxvuPGRi$MJqZ%i%k=%mv597?H%&7;)L9}k#g+nk-9B7z*#H!inp~WBqQa@n< zOK7G3He&Z;T(K~q_wYzorb}fz2%rex;z?YTH>fiO!4pC9vK1JY93yO8WR6V`op{AF zN>&@vDzi1$u-0rjJ!rJXk!Rx4ZDF*9u3x~vO8k2-cU=zmxx0ZSok9=Sns>Q)l1HgT zao8Kw&(Vu(JW{Br+f(~yTpmPJjmgpa6qZxVsJ_LH5hZECC$vvYN{y+LtxQEjGqWGV z^S69lI>t6{a~0+%io?hOrTA(_43JW6!YP{RFz~<%Jh<5AXFudvr)eWFbK=ft8V}dA z9^*SPdK|}qKJcvIOr_vTWNeAg z{{B5{VWi7sENjvv&aHP;8*WiRE(a{;Fs%6yP&k2F`xPd@ZY^>~L#2t?-0r%hfwV7u z@EsPy1OI}Q#$KfRtAv4A%?yqmu7+CVZ4CkA(fahtD840T+zJ+&x?Iv=-rt`1mZF}{ zlXUU|gM6#OXY;DvmEhwxGE_X4#=f{ehm#opyBtKS85I$y6_y3zOW4-y*gM7*#*RaC>FAJ=@QO}CXI5tT;ejk90~$~bQ1qX&p;YEo2W>IrqhccP;z5>OKx&uC+RHKgTT7o6 zRj+i*wb-u*JM zZ|#FjTp{Fjzpi#?%ZTiu12{13b+|y9E3H?nsVm}-+!<%KLD^32-=ssb%|>=N^N3|# zWlC5VFW<#ym-Te%&wd#5)%Zvtn3(tc7O6Gm>$n6isC9cSOi#8pmG_;z z@7t-FA1plhvjH2Vh@Ev-g^PruaINE2vdC4)cH_G_?W427qN20cmCn?Vz8@QtE0k7% z;D)f$wYQ9or54Gd^VLBS^|0s|`BXn|gDA0@B-+?nFPfB;X=Zp-a3Q)YXyCj*%9RdOD3>%RMBUp z5Ne+`vVsk^{oST(#XyN4FFR~Rbbg+mEioaaK8|b!Aq{5B!V>!;vA>_se#KCx^M&Z( zMvU|w|I>iz>epy6~xm~w2r23BdH|# zysEm^lfITwrbx6NwLV!^RDTtotNZ1?2nQ#nrDZ{X6UsN^06U+rMmgKpYC{*y*+f&R z2gb}8_%vDrVNS>eQCD!3=w`oiY2{n*E<4T%rFuy&H}LWfxAr{^@!CcU9h$6P9wRhq zUx^bUKDBoruPsi*(T??v$|SGSP-EU3#OPz}El_f_KBf@=(^AH=*W{1=8Lxa+)WD_TGqMD%Iy_AHJBLxB8E%wUP z7tP4jdedq8z)UrpeEX5TpVuXRYOOw-BX5ejX9fi4I+SB%=+Jz{iMjjbQcKMz!$UVZ@Jy-a%-!9om zlxXR7>srk>?_H>EiSO&?cjV)QyG26(Z)C1n+ZnbU(pfBhEv^kzw-l*gR5ooVT_os6 z=}Wf*t|kqhtynZMvd^ZO(Bv<$e zCc{Y9E=!zrEZ4!RumVA@;1SO9p%1?H#Jf3V7n;5!C(BEj#hZ`yhZEQ}^)4a{H+^0D z)FLG6rr$YnT|}zCuM`ijLV#NR05_}$WwR#>VbWv%^*}XRcT8O0EcJ~t#(}ORv}tSB zu>}(HV>LbFjOB5!4ufF;IWu7;Hj?Db9ZOm;u?Gv?DxWsY2G~kPttFvu5KZ*CNn1`| zDL2IH83c&U*%cnkv1xIjpXNO}MQ`bMo87Gw*>RNgkC6_uy+JXC@1+Rz2^{A9kO?Z1p`9OFAv%G?cN%P5hpCwaLLJ*&XNbOZhE=sw z8)W9H-HxIlx+q*&IKgB4r%QCD4`+-9ZNDK#ywI@2Tny`%t< z=*mr_J_&h)=|+PXbb>FkN7ZC2sd<3x_RyBT=uHGzPI5Yt>Vt2msCbnagWBhIY!To_ zHE&W}UYoe%{Kn`qx9vvFke4is_>Bf+@E`)kpx6?) zGxfRzkI*%QAKcXv5<(NMv620GoS2K6jlrT&Q`eTXBlb%(h(icW`t#HN!9Kg=G6%%> zrscdGl3L;hw?Tn}w+@UhRGIJMPCJf+d1iMQW*-4)P8}mw&NMQPOqEckUpT;%;46^$ z_ckI1T`D)fon1l9!;58!`oyh*J<+cAF;dlP;kT`s=l3|5(a(!0_YetL>>H005~}m| zNa)&=1!g3%3nf2R8{J_!0V3k6M#6q<2FE*2UScOA(gd_~y!6ADrf1J%mZ?eyP_w8}t(oYCx zLi5L0-;If+gqYUaUoZmB!53Lf{RoXE&Rq8SbxVPRGE!6Q2d(mMfC@dMyfK$w!{^(F ze)8a`-_#urkcFHK+zz`Yf`;=fEUQ&4)THI`qzU4a1xSoaR>G+k*Np5GBURc@UmwudPw;JHe!rR{m9`3c ze*=L10D`-mM?p<($$|-j0;L_1dkN(dJLy+u3ztc+-4Y%1SiHTCLKcyY_mYjEV{~3L z4+os(#C4R(caD9k%Bh*_PwFXaLpoE^O74lym`QEsn`E8(CX0UU1q8pwfgf*`-8eW6 z^d#Rok>XK1fjC={r}g|5g0A9A4!2xlC5=Xm><^6Ge z3en=*+EJh=C}83wuK=b9T8&BPZip8+)PTm2JkkNiz7lWOJfE;$ekG3cj4ye=?Xc6u zI}_*fc;t?jjh_b>q8c`Tk9@xWgoaqi`3-9sGu-69o<+2rbe`mkAop1Or`GpRG4k`;2C z{)(YMCSJJ4skm_P-VqA=cvVqk_P5T4-En7U=Y_*q^b7LtQwewpBP(*=3a=J;LE?P} z7I0hRTDfccdRyMqHPBS!%*U{scfE~7h^=n;&@9{sUw@(8ZMS`b0$)Dcwei@Fm%Dlr znq?1R(H;z8AH)7>JZNPbYFcwQ3Y4$6SBU{#8u=fmck##1zO{FedgQ!NK8B z*#tNx@S_f_D|IIw44);8D`4{e`cp?5SrOw`3GfXN7%tgr0k}5&M2s&TBts zfE`t@*RNeM1jJC`s06`d%4$?7DBVoor-HZj0Lk<+9F$hq5}ItqHjnkrsbPv}`tD=0 z-*5b%qI`4qE1s#RL^Gj*ctIipNUxTVz4hv|6Ma+FB{40I!bq)t#+W|J-UZLZT-u|cu?Z_tQ<$V+&$=KVVg3CR#-F$IQPF6=aB#3~oFInkt?{DTror+^{WWa;v)5Cx1{#v~nxaP*gn4{*}>qd|-s(U4o-?jDozLa9kgeM6$n$%7vx0 zC%+D`57RZzU0LNhBUu5oqkl>v39DAWDH|ryJ3aIuf-uwBhGQG}C65ex%LDpqGI1vR z{#5F2mCamWI;4O+Z2JoIX;aoR0MZ`3nU7(2nrF!AW&A5r!&tIZs-(9af!ZjirOAKu zCN@O?5~}wk&L3V_T~rqjnNmv5PGh$p<-9rQ9;pjtBbcZH1&Tp_QA779M92sYdLAcX z;nb_#JpS~f6diO^n-#AmP6CJwNbLy%2XUy6U}YH^7IkWZa0KlJ4)7AnA^u8dNJdnv zt#OL_u;q`^`0NYyFRL%E4`_ZrTY?KcEb3LoCgZuM&1hiOJ;42mY6E*fLiZBN!;@kCwO93ui^ zXR6dedvE<2B%=(va8G#siqQvF_6W!_5PBWwr~cZKK|ZgH$29<-Z-?>D#9}`hP4BO(FKpMc{XSh z$>nw#xw;x5=D)(V7HYBi^C(u}-rfDY1>&_6tZc@vv3FG<{d29u&ve|%xJ%!D3NX>3 z0GsSrt01*Xlk+lnd7Zs2Hd$7Mw^9m((0>x3E-x|OOvd!{VA?PUg!kag5b+X-Elkir zjRs*6cA3FY(VPpi+fO%6AXyskJ`f#5ul38UXL7~@Ch4@Qo5@9{wF7n)G8RKRt^wcz z{`xNQGo+PC{qdwIsHubwHhZSAZf-U5d`Zo@nLjQDO~7Ncg$Z~jj&zrFo!Ozcv_ZO0 z^a-}wqcXb%3GzlxyQJazOARCkON-1a ztmjmj&slk-+>Zi{&VhI`kP$|8VNqsFa6LZ>m+DdH=p{&GUP^PhRa*QL^I7~IW;Mo* zN~EJRvhEz0N%seur5wR@e2z#wXLrRwcG`w!`3{fby>j`Oc%z&vCuR$n&$3@Jp$E@| z!6U#VQ!&_fBPwOQJW2F!9zL(DqMMh#NVmjrK*E~1oG<;#1kn&LqUxK-L+_rNbl*7f z%2r}k7Oc~Et%Lk7WqEcW+@HI$`!YBxhVP6EvCRm$cR^*u$h9l``a-Z~j=ftm2S2% zAJ|^PIcee^iCkPgC882MQpqmna6HUfJDv{yd1`H*t*`u`8A!4sLnbl_!0+a3c*F{(Zr1#_{qdDoU+F%la?O?3f)VMz_cl_ z1wOVqmvivdgo7MkRu(HYPqV!iO^BwhVI1AZ=-8txVUTc~FrOD-kr4XP^^KN@Xe?Ai zGd`zMV>0j&8zJ*EiQw8;OhhB5#efH?9V#*B!?!X828u51I{j^es>-U%V0TOOx42ipqSzvqQGn@IMA%b>?l34PGg^Elhf>iCQ#y zgW-Rs^+L~b({j){LydY@F(@4Tsca(Dy6G&FQY>D%}3kbliFGQh^}s-e7cmCm4~WwiiS- zm70MPZEM#UBX-rRUr~{{sZx=q4;pn%AonrKEu-Sh4CrAQ-~pQ3?;>~{Vw3-@C>7VN zloe82H$tZS5_nQNi{Mk~Gk$Cr=h*|oqq)U`dh-A*WpL-POxQ==yLkUoI@|N2WnNiF zYwBmziPO5p1~^->8uH9fGa6Va455IUVXi@y3$)*2`vEt;Axj(`KCN|oHBM%R(O;l= z&-B8`**2v8k(F1L}7;~p%iC^9Auk-ptIqe)$1mcQt8t749`KwT6vbn*YVf8?KBM=iv@n?733RN7d#N-vClW^TuJ*K6U<)El(| zCM*m`+Zav-%3bDA zP^Z-!tDb*z%RIX2l(RLQc2p`FP^VT2%FaO7r%Z$q@x?bFw?U+%Z{u}W%&D_2QW}qE zMOFRR^7TL7O(3F^g((a?6JCjka)flQoT70>*-4Y_xhh#-{lg#4}yW5^7&H#9zu+{x&Q^c=v-i4f@G-CdaFdkTz_|l|x@~#|Xbfvx*gBEsHAR zAKpg#-4XDLhg%i6P;N|X$mco1De0A?QfP*XF<5NuqTRVydCT9ob8s`rkd4v_()MK; z3YKXjCjhz^2wk4EPA&H)8;9FUX;KnzH)?1uXS>3Rz!vVoB_@IXVb1_FeJMm$NMacJ z#9`ad?lHQzRI!3?%n(?(ET1t9|3gq)3q6KRu=5k8Rg@TfL%CWI?) zA|t$)7)oc31a>@&T{7f$IJ)@tfj+BbTNCk(9_)?-ev=&> zH0z?20(Z1=#_9q?L2`OsG9fuaIwDi}N)qE_B_iU3yksEFDv%?)li0LDk1+6*l|3O}Xh>bkVWCW>YPZP3BVWlWO1chY`tpXG;_ zPFKddrzo#6M{cwJ#4YCXB4h|8DX80$tYH$a=zV-G42@`ueJCeNZ`${<#!<-1j6px3 zVdCk4_w&46^4wh$r2|H#0JI9iBY4=vYjoSLPu(+|Rk#DznOnQyd~+5_hmp(a;iA4# z={oAgSDUtR#8#U4XO;_92GaePMdV)z&^?sJgoUUPXWy18N}^@dk_?-(`?r%3%xs5- z8dM5kUe869gaHsK74%Mr5J$<@1IZIRhacj`2cHkV}WZz3k*YA zA^-WX2wi*g+jNAL$CyGIq?#oGio|bAqP9yKnK@s*hEArq+pl#8ejT8lQS(R`0LSM*H5XZ~qjr0MSm9ew{ z>S4Quf^jx2T6lH>TmB3$C1FBFN~mgvN_G2V9DbL?WbNZ7m&w*S+gz>}%%~tEwowu_ z1l3WPcIAcenS2PDpF0nhe0eQb!eM#x65NQ_)nNu@3{Xw@GrgynpnNx<`nmfZDhRJ9 zmo1RZ_l>B*!zb7#$Gfb?51<1$;`dy$_XH>Z=umh{;e2USl>_bMsey=s6^ne~y2+Xkp7Ui176E>R0ysFu$(Ub$;MGjUTbFxLXZY-cS!7qbtoqYNzGXo#5j)nX8 zAVmBCo{!l32UpVIQV|?ledZ)>|H4q#((ppd_bcA@mbahQ?AN5fs>>~S9!|RgvwVGZ zOXjb~LVsn3sBY6>#ANR}T}v4S0+Rv>48(#u)d*qt-J}WPRN8|d5F&;Uw-TdX+I#2| za(({+r&D6I0d@{YjkycNfUNP2VOq5?ALxY0WbUL^AdBu~q>_O2}o{vt}*kRqy;L>C4f# zN34m&^jq69HD*PAxka4p-p750Z@rJF>HcxN9J#-GyEgftP^!UrAGY`yX}IeIcL4^U z_%;8E2;y50UcV^}u@dE}CJ;@&T$~STrnf2nh3Uck`~bAgqck_ zX&XFrOq#vs7j?Ozwd03XVqC7+{yNb~jZo>(>kv~z=N&@Vo7eHnr^>zeN;N!SLn}#S z4u#lsXyY6!RR~Ug^uf+<46b$;k*?eM6j#$<_?19D{UhH5`r;s19QRjLFy@;SQxY^| zb?T7eo}NOd)|zSd&n=1f1PDB9+n$fL^^kl|crD@gXY-|ZsOf`Xz+KCkDa@H7<2k9S zLa@8p`>TH;wQ&0KKM>;&lw(mo+tH8)7rd{ec6Y=!M>Bi&VhqahysjA0cBg(E2>p`s)>4$r+9()7Z986WSg#QteW(j+UO*HCQIf2G~{i!bVh z%gNN|`D9Ea>qr@2369_c*^1^JD;0T#yaPom`Ve=5R$mf8K1anJHFF_vQj@TS0h$cK zRLCKqsuC=|Cqm3o)xL$Uc|vY<-WIyu^`gXG8a=QY{dp8dV&m|I^P9cs>k;XLymM>h z$Dx=0{`Gv97T3^HtavPa5FsB*K0eF{7;|kUL^XyBJ0U}FD_=YNx~I)?goT!Eo;hgW46B3e$EU_F$=SkBc7p>pma$3-FAe+gNU*n; z+u^>j-w~D?tWu0ZXe<86AzAyHwG|c@`JE>O*1!kz83X(iI5Zu>juAUVpT2~k^_#2U z2?DPueHzbU3)TEJAA3=*Wmxz#(~E8WqB9{@Hr+4~pf_Gw3lzzvqS(o{cr`S7VUu$a z6zGnx>Mw*8z24l=k?3QQq*kdCz*$@|+0V4bp02H&7aNqUBxHy5BMiE6_VqPU+vws! z#JjTVhCd(>$ZzU>5T2_}0{Or(mKT`Iy3A1Y!roJ@L&xiAHziM&u)?tLXivX$AW2X> zzok*IzDb`LNh`9?N2}gVO8nAmJfQS z5bi?zn7)3t{h>iy8BSK3SEIGSaCBZ5&U6`vNwuiM28Hbf>~JMUGKB2d8n{xFDH>Eb z>2yhp74tJOVQnkFc;1n1OH>T$o{0m+=>Z8uR`x^-z@tqPb*sA^ma^QbldIJMNzGf* zTCWW+l}Pl4o`6W-Ln&*d73y-K)Cl(#8714CwNb4;dZDGqO_x@K&M6LQh5`ok0QqtL z=i9?WJy^*TCNJc$VT2{bwagkI#;TxL|NQo6 zu;~Okok|4?9CYBfGvC$UveQR71eGy@1Z&R;AUMCSoudxI`R>9#x1E}@LH$bm>hwBp zqqcdwB^2C3UxseKihz4OwX`F9W55-;0RNDUw43grr@hMyX&z}SU07+3fk!m6R Gfd2*OM;!D3 literal 0 HcmV?d00001 diff --git a/packages/ui/src/assets/logo@256x256.icns b/packages/ui/src/assets/logo@256x256.icns new file mode 100644 index 0000000000000000000000000000000000000000..3ea308907ded83c502f2cfc70fcd049c05af79b1 GIT binary patch literal 35669 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
Shkgb{7B<8BJplIpXUIW}hK5mPCY*|5!bmYLsU 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 literal 0 HcmV?d00001 diff --git a/packages/ui/src/interface/images.ts b/packages/ui/src/interface/images.ts index 6d6d103..b846d5a 100644 --- a/packages/ui/src/interface/images.ts +++ b/packages/ui/src/interface/images.ts @@ -11,6 +11,10 @@ export class Images { return join(Images.path, 'tray-Template.png'); } + if (process.platform === 'linux') { + return join(Images.path, 'tray-dark.png'); + } + const image = this.isInDarkMode ? 'tray-dark.png' : 'tray-light.png'; return join(Images.path, image); @@ -21,6 +25,10 @@ export class Images { return join(Images.path, 'tray-enabled-Template.png'); } + if (process.platform === 'linux') { + return join(Images.path, 'tray-dark-enabled.png'); + } + const image = this.isInDarkMode ? 'tray-dark-enabled.png' : 'tray-light-enabled.png';