From 1be7dd180d98bcfdf8990a8cb29322fd31079698 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 24 May 2026 23:16:44 +0200 Subject: [PATCH 001/184] Ground zero Delete all chez-moi dotfiles in order to make some space for the nix config --- .chezmoi.yaml.tmpl | 239 ----- .chezmoiignore | 2 - .editorconfig | 1 - LICENSE | 21 - README.md | 486 ---------- bin/executable_backlight.sh | 25 - bin/executable_capslock-check.sh | 19 - bin/executable_composer | 23 - bin/executable_nmcli-active-vpn-conn.sh | 17 - bin/executable_phpstan | 12 - bin/executable_rfkill-toggle.sh | 25 - bin/executable_sound.sh | 65 -- dot_bash/aliases | 29 - dot_bash/completion | 40 - dot_bash/conf | 42 - dot_bash/exports | 12 - dot_bash/gpg | 9 - dot_bash/path | 33 - dot_bash/prompt | 13 - dot_bash/scripts | 62 -- dot_bash_logout | 7 - dot_bash_profile | 5 - dot_bashrc | 28 - dot_cargo/config | 2 - dot_config/autostart/nm-applet.desktop | 158 ---- dot_config/bat/config | 4 - dot_config/bat/syntaxes/PHP.sublime-syntax | 30 - dot_config/ctags/default.ctags | 7 - dot_config/dunst/dunstrc | 436 --------- dot_config/hypr/hypridle.conf.tmpl | 48 - dot_config/hypr/hyprland.conf.tmpl | 387 -------- dot_config/hypr/hyprlock.conf.tmpl | 106 --- dot_config/hypr/hyprpaper.conf | 6 - dot_config/hypr/screensaver.jpeg | Bin 181886 -> 0 bytes dot_config/hypr/xdph.conf | 3 - dot_config/mimeapps.list | 46 - dot_config/pgcli/config | 186 ---- dot_config/private_user-dirs.dirs | 15 - dot_config/ranger/commands.py | 38 - dot_config/ranger/devicons.py | 219 ----- dot_config/ranger/executable_scope.sh | 121 --- dot_config/ranger/rc.conf | 619 ------------- dot_config/rofi/config.rasi | 4 - dot_config/symlink_nvim | 1 - .../symlink_udiskie.service.tmpl | 1 - .../symlink_hypridle.service | 1 - .../symlink_hyprpaper.service | 1 - .../symlink_hyprpolkitagent.service | 1 - .../symlink_waybar.service | 1 - dot_config/systemd/user/udiskie.service | 9 - dot_config/terminator/config | 22 - dot_config/tmuxinator/dotfiles.yml.tmpl | 48 - dot_config/tmuxinator/local.yml.tmpl | 47 - dot_config/tmuxinator/notes.yml.tmpl | 48 - dot_config/user-dirs.locale | 1 - dot_config/waybar/config.tmpl | 375 -------- dot_config/waybar/power_menu.xml | 30 - dot_config/waybar/style.css.tmpl | 278 ------ .../wireplumber.conf.d/alsa-config.conf | 3 - dot_dir_colors | 243 ----- dot_editorconfig | 66 -- dot_editrc | 5 - dot_fzf.bash | 7 - dot_gitconfig.tmpl | 117 --- dot_gitignore_global | 10 - dot_inputrc | 46 - dot_my.cnf | 10 - dot_myclirc | 104 --- dot_npmrc.tmpl | 8 - dot_profile | 29 - dot_selected_editor | 2 - dot_signature/ixo-raw.html | 22 - dot_signature/ixo-thunderbird.html | 25 - dot_tmux.conf | 183 ---- dot_vim/symlink_init.vim | 1 - dot_vimrc.tmpl | 837 ------------------ private_dot_gnupg/common.conf | 1 - private_dot_gnupg/gpg-agent.conf | 10 - private_dot_gnupg/gpg.conf.tmpl | 79 -- private_dot_ssh/config | 6 - projects/symlink_dotfiles | 1 - 81 files changed, 6329 deletions(-) delete mode 100644 .chezmoi.yaml.tmpl delete mode 100644 .chezmoiignore delete mode 120000 .editorconfig delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 bin/executable_backlight.sh delete mode 100644 bin/executable_capslock-check.sh delete mode 100644 bin/executable_composer delete mode 100644 bin/executable_nmcli-active-vpn-conn.sh delete mode 100644 bin/executable_phpstan delete mode 100644 bin/executable_rfkill-toggle.sh delete mode 100644 bin/executable_sound.sh delete mode 100644 dot_bash/aliases delete mode 100644 dot_bash/completion delete mode 100644 dot_bash/conf delete mode 100644 dot_bash/exports delete mode 100644 dot_bash/gpg delete mode 100644 dot_bash/path delete mode 100644 dot_bash/prompt delete mode 100644 dot_bash/scripts delete mode 100644 dot_bash_logout delete mode 100644 dot_bash_profile delete mode 100644 dot_bashrc delete mode 100644 dot_cargo/config delete mode 100644 dot_config/autostart/nm-applet.desktop delete mode 100644 dot_config/bat/config delete mode 100644 dot_config/bat/syntaxes/PHP.sublime-syntax delete mode 100644 dot_config/ctags/default.ctags delete mode 100644 dot_config/dunst/dunstrc delete mode 100644 dot_config/hypr/hypridle.conf.tmpl delete mode 100644 dot_config/hypr/hyprland.conf.tmpl delete mode 100644 dot_config/hypr/hyprlock.conf.tmpl delete mode 100644 dot_config/hypr/hyprpaper.conf delete mode 100644 dot_config/hypr/screensaver.jpeg delete mode 100644 dot_config/hypr/xdph.conf delete mode 100644 dot_config/mimeapps.list delete mode 100644 dot_config/pgcli/config delete mode 100644 dot_config/private_user-dirs.dirs delete mode 100644 dot_config/ranger/commands.py delete mode 100644 dot_config/ranger/devicons.py delete mode 100644 dot_config/ranger/executable_scope.sh delete mode 100644 dot_config/ranger/rc.conf delete mode 100644 dot_config/rofi/config.rasi delete mode 100644 dot_config/symlink_nvim delete mode 100644 dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl delete mode 100644 dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service delete mode 100644 dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service delete mode 100644 dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service delete mode 100644 dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service delete mode 100644 dot_config/systemd/user/udiskie.service delete mode 100644 dot_config/terminator/config delete mode 100644 dot_config/tmuxinator/dotfiles.yml.tmpl delete mode 100644 dot_config/tmuxinator/local.yml.tmpl delete mode 100644 dot_config/tmuxinator/notes.yml.tmpl delete mode 100644 dot_config/user-dirs.locale delete mode 100644 dot_config/waybar/config.tmpl delete mode 100644 dot_config/waybar/power_menu.xml delete mode 100644 dot_config/waybar/style.css.tmpl delete mode 100644 dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf delete mode 100644 dot_dir_colors delete mode 100644 dot_editorconfig delete mode 100644 dot_editrc delete mode 100644 dot_fzf.bash delete mode 100644 dot_gitconfig.tmpl delete mode 100644 dot_gitignore_global delete mode 100644 dot_inputrc delete mode 100644 dot_my.cnf delete mode 100644 dot_myclirc delete mode 100644 dot_npmrc.tmpl delete mode 100644 dot_profile delete mode 100644 dot_selected_editor delete mode 100644 dot_signature/ixo-raw.html delete mode 100644 dot_signature/ixo-thunderbird.html delete mode 100644 dot_tmux.conf delete mode 100644 dot_vim/symlink_init.vim delete mode 100644 dot_vimrc.tmpl delete mode 100644 private_dot_gnupg/common.conf delete mode 100644 private_dot_gnupg/gpg-agent.conf delete mode 100644 private_dot_gnupg/gpg.conf.tmpl delete mode 100644 private_dot_ssh/config delete mode 100644 projects/symlink_dotfiles diff --git a/.chezmoi.yaml.tmpl b/.chezmoi.yaml.tmpl deleted file mode 100644 index 01a7800..0000000 --- a/.chezmoi.yaml.tmpl +++ /dev/null @@ -1,239 +0,0 @@ -{{- /* git commit config */ -}} -{{- - $gitName := promptStringOnce - . "git.name" - "git: committer name" --}} -{{- - $gitEmail := promptStringOnce - . "git.email" - "git: committer email" --}} - -{{- /* gpg config */ -}} -{{- - $gpgSigningKey := promptStringOnce - . "gpg.signingkey" - "GPG: signing key" --}} -{{- - $gpgKeyservers := list - "keys.openpgp.org" - "keyserver.ubuntu.com" - "pgp.mit.edu" --}} -{{- - $gpgKeyserver := promptChoiceOnce - . "gpg.keyserver" - "GPG: preferred keyserver" $gpgKeyservers --}} - -{{- /* npm config */ -}} -{{- - $npmToken := promptStringOnce - . "npm.token" - "npm: npmjs.com token" --}} - -{{- /* vim/nvim config */ -}} -{{- - $vimCocIntelephenseLicenseKey := promptStringOnce - . "vim.coc.intelephense_licensekey" - "vim: coc intelephense license key" --}} - -{{- /* hyprland config */ -}} -{{- - $hyprlandPrimaryMonitorOutput := promptStringOnce - . "hyprland.primaryMonitorConfig.output" - "hyprland: primary monitor output ID" --}} -{{- - $hyprlandPrimaryMonitorMode := promptStringOnce - . "hyprland.primaryMonitorConfig.mode" - "hyprland: primary monitor mode" --}} -{{- - $hyprlandPrimaryMonitorPosition := promptStringOnce - . "hyprland.primaryMonitorConfig.position" - "hyprland: primary monitor position" - "0x0" --}} -{{- - $hyprlandPrimaryMonitorScale := promptStringOnce - . "hyprland.primaryMonitorConfig.scale" - "hyprland: primary monitor scale" - "1.0" --}} - -{{- /* hypridle config */ -}} -{{- - $hypridleScreenDim := promptIntOnce - . "hypridle.screen_dim" - "hypridle: dim screen after N seconds" - 150 --}} -{{- - $hypridleKeyboardBacklightDim := promptIntOnce - . "hypridle.keyboard_backlight_dim" - "hypridle: dim keyboard backlight after N seconds" - 150 --}} -{{- - $hypridleScreenLock := promptIntOnce - . "hypridle.screen_lock" - "hypridle: lock screen after N seconds" - 300 --}} -{{- - $hypridleScreenOff := promptIntOnce - . "hypridle.screen_off" - "hypridle: turn screen off after N seconds" - 450 --}} -{{- - $hypridleSuspend := promptIntOnce - . "hypridle.suspend" - "hypridle: suspend after N seconds" - 600 --}} - -{{- /* hyprlock config */ -}} -{{- - $hyprlockFingerprintEnabled := promptBoolOnce - . "hyprlock.fingerprint_enabled" - "hyprlock: enable fingerprint reader" --}} - - -{{- /* waybar config */ -}} -{{- - $waybarPowerAdapter := promptStringOnce - . "waybar.power.adapter" - "Waybar: power adater ID (leave blank for having Waybar selecting a sensitive default)" --}} -{{- - $waybarPowerBattery := promptStringOnce - . "waybar.power.battery" - "Waybar: battery ID (leave blank for having Waybar selecting a sensitive default)" --}} -{{- - $waybarNetEthInterface := promptStringOnce - . "waybar.net.eth" - "Waybar: ethernet interface name" --}} -{{- - $waybarNetWifiInterface := promptStringOnce - . "waybar.net.wifi" - "Waybar: WiFi interface name" --}} -{{- - $waybarTemperaturZone := promptStringOnce . - "waybar.temperature.thermal_zone" - "Waybar: temperature thermal zone ID (leave blank for having Waybar selecting a sensitive default)" --}} -{{- - $waybarTemperaturHwmonPath := promptStringOnce - . "waybar.temperature.hwmon_path" - "Waybar: HWMON file path to use instead of thermal zone ID (leave blank for having Waybar selecting a sensitive default)" --}} - -# Config -edit: - command: "nvim" - -merge: - command: "nvim" - args: ["-d", "{{ "{{" }} .Destination {{ "}}" }}", "{{ "{{" }} .Source {{ "}}" }}", "{{ "{{" }} .Target {{ "}}" }}"] - -diff: - pager: "delta" - -data: - git: - name: {{ $gitName | quote }} - email: {{ $gitEmail | quote }} - signingkey: {{ $gpgSigningKey | quote }} - - gpg: - signingkey: {{ $gpgSigningKey | quote }} - # we use either one of these: - {{- range $gpgKeyservers }} - # - {{ . }} - {{- end }} - keyserver: {{ $gpgKeyserver | quote }} - - npm: - token: {{ $npmToken | quote }} - - vim: - coc: - intelephense_licensekey: {{ $vimCocIntelephenseLicenseKey | quote }} - - hyprland: - # monitor config shall be written as defined by Hyprland's `monitorv2` - # spec. - # https://wiki.hypr.land/Configuring/Monitors/ - primaryMonitorConfig: - output: {{ $hyprlandPrimaryMonitorOutput | quote }} - mode: {{ $hyprlandPrimaryMonitorMode | quote }} - position: {{ $hyprlandPrimaryMonitorPosition | quote }} - scale: {{ $hyprlandPrimaryMonitorScale | quote }} - - # Additional external monitors shall be declared as an array of objects, - # similar to the `primaryMonitorConfig` object. Optionally, a `comment` - # property may be provided for a free-text description. - # - # Example: - # - # externalMonitors: - # - comment: "my external monitor" - # output: "desc:LG Electronics LG ULTRAGEAR 408BOHE0K857" - # mode: "2560x1440@143.99100" - # position: "1920x0" - # scale: "1" - # - comment: "my 2nd external monitor" - # output: "[...]" - # mode: "[...]" - # position: "[...]" - # scale: "[...]" - externalMonitors: [] - - hypridle: - # all values in seconds - # set to 0 for skipping listener - screen_dim: {{ $hypridleScreenDim }} - keyboard_backlight_dim: {{ $hypridleKeyboardBacklightDim }} - screen_lock: {{ $hypridleScreenLock }} - screen_off: {{ $hypridleScreenOff }} - suspend: {{ $hypridleSuspend }} - - hyprlock: - fingerprint_enabled: {{ $hyprlockFingerprintEnabled }} - - waybar: - # Run `ls -1 /sys/class/power_supply/` in order to get an overview. - # Waybar picks sensitive defaults if below is left blank. - power: - show: true - adapter: {{ $waybarPowerAdapter | quote }} - battery: {{ $waybarPowerBattery | quote }} - - # Run `bluetoothctl list` in order to see available controller - bluetooth: - show: true - controller: "" - - # Run `ip link` for an overview of applicable interfaces - net: - eth: {{ $waybarNetEthInterface | quote }} - wifi: {{ $waybarNetWifiInterface | quote }} - - # see https://github.com/Alexays/Waybar/wiki/Module:-Temperature - # Waybar picks sensitive defaults if below is left blank. - temperature: - # The thermal zone, as in /sys/class/thermal/. - thermal_zone: {{ $waybarTemperaturZone | quote }} - # The temperature path to use - # e.g. /sys/class/hwmon/hwmon2/temp1_input instead of one in /sys/class/thermal/. - hwmon_path: {{ $waybarTemperaturHwmonPath | quote }} diff --git a/.chezmoiignore b/.chezmoiignore deleted file mode 100644 index f0f644e..0000000 --- a/.chezmoiignore +++ /dev/null @@ -1,2 +0,0 @@ -LICENSE -README.md diff --git a/.editorconfig b/.editorconfig deleted file mode 120000 index 33545d9..0000000 --- a/.editorconfig +++ /dev/null @@ -1 +0,0 @@ -dot_editorconfig \ No newline at end of file diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 3fcb641..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2017 Rudolf Tucek - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 73a2412..0000000 --- a/README.md +++ /dev/null @@ -1,486 +0,0 @@ -# Dotfiles - -My dotfiles - use them and contribute your personal changes/suggestions. - - -## Installation - -The specifically target Arch-alike distributions. For instance, the -instructions here should also work for Manjaro, which builds upon Arch. - -Most importantly, it's require to install a package manager, which -makes use of the AUR. [yay](https://github.com/Jguer/yay) is by far -the best one I've ever seen and can simply be installed like so. - -```bash -sudo pacman -S --needed git base-devel && git clone https://aur.archlinux.org/yay.git && cd yay && makepkg -si -``` - -Then, you'd want to install all relevant packages from the [General -packages](#general-packages), [Fonts](#fonts) and [AUR](#aur) sections. - -Dotfiles are managed by [`chezmoi`](https://github.com/twpayne/chezmoi). Run -`chezmoi init rtucek` in order to download all dotfiles, followed by `chezmoi -cd` for jumping directly to the git repo of the dotfiles. - -A couple of template variables have to be set for proper configuration. -Use the sample config file from `dot_config/chezmoi/chezmoi.toml.sample` and -copy it to `~/.config/chezmoi/chezmoi.toml`, then set the value accordingly and -run `chezmoi apply` for having the actual dotfiles being put a their right -place. - -Refer to [chezmoi's docs](https://www.chezmoi.io/) for further details. - - -## Contribution - -Pull requests are welcome! - - -## Dependencies - -The dotfiles are optimized for the following setup. - - -### General packages - -- alsa-utils -- arch-audit -- arch-wiki-docs -- bash-completion -- bat [[1]](#syntax-highlight-with-bat-and-cat-[1]) -- bc -- bluetui -- bluez -- bluez-utils -- bolt [[4]](#fix-hotplug-issue-with-thunderbolt-[4]) -- brightnessctl -- chezmoi -- ctags -- diff-so-fancy -- dmidecode -- docker [[2]](#docker-post-installation-[2]) -- docker-compose -- dog -- dunst -- ethtool -- fastfetch -- firefox -- fwupd -- fzf -- gimp -- git-delta [[1]](#syntax-highlight-with-bat-and-cat-[1]) -- glab -- globalprotect-openconnect -- gnome-keyring -- gnu-netcat -- go -- gparted -- gufw -- gzip -- helm -- helvum -- htop -- httpie -- imagemagick -- inxi -- ipcalc -- jless -- jq -- k9s -- kubectl -- less -- libreoffice-fresh -- libvirt -- lsb-release -- lshw -- lsof -- man-db -- mkcert -- monique -- msr-tools -- mtr -- mysql-workbench -- neovim -- network-manager-applet -- networkmanager-openconnect -- nitrogen -- nvm -- openconnect -- openssh -- osquery -- pcmanfm -- percona-server-clients -- percona-toolkit -- perl-image-exiftool -- pgcli -- pigz -- pipewire [[7]](#pipewire-post-installation-activation-[7]) -- pipewire-libcamera -- pipewire-pulse -- playerctl -- postgresql-client -- pwgen -- python-pip -- python-pipx -- python-pynvim -- qemu-full -- ranger -- rofi -- rsync -- ruby-erb -- seahorse -- sound-theme-freedesktop -- speedtest-cli -- stern -- strongswan -- tcpdump -- tela-circle-icon-theme-manjaro -- testssl.sh -- the_silver_searcher -- thunderbird -- tmux [[3]](#install-tmux-plugins-[3]) -- torbrowser-launcher -- tree -- tree-sitter-cli -- udiskie -- udisks2 -- ufw -- unzip -- usbutils -- veracrypt -- vi -- virt-manager -- virt-viewer -- whois -- wireplumber -- wl-clipboard -- yubikey-manager - - -### FS support - -- bcachefs-tools -- btrfs-progs -- btrfs-tools -- cryptsetup -- dosfstools -- exfatprogs -- hfsprogrs -- hfsutils -- lvm2 -- mtools -- ntfs-3g -- ntfs-progrs -- xfsprogs - - -### Fonts - -- noto-fonts -- noto-fonts-cjk -- noto-fonts-emoji -- otf-font-awesome -- ttf-dejavu -- ttf-input-nerd -- ttf-jetbrains-mono-nerd -- ttf-joypixels -- woff2-font-awesome - - -### AUR - -- auto-cpufreq [[9]](#auto-cpufreq-post-installation-activation-[9]) -- brave-bin -- certigo -- csvtools-git -- devspace-bin -- grimblast-git -- kind-bin -- lastpass-cli -- litecli -- mycli -- postman-bin -- ptcpdump -- pw-volume -- snapd -- tmuxinator -- unimatrix-git -- yay -- yubioath-desktop - - -### Snap packages - -n/a - - -### Composer - -```bash -composer global require consolidation/cgr -``` - - -### nvm - -Most important commands are: - -```bash -nvm install --lts # Installing most recent LTS version -nvm alias default "lts/*" # Alias most recent lts node version as default -nvm use default # Use most recent version -nvm install-latest-npm # Upgrade npm to the latest version -``` - - -### npm - -The following npm packages are considered as standard. -Install them via `npm install --global [packages]`: - -- @vue/cli -- create-react-app -- neovim - - -### yarn - -Install yarn via npm. Let yarn manage itself by re-installing yarn globally and -removing it afterwards via npm again. - -``` -npm -g install yarn -yarn global add yarn -npm -g remove yarn -``` - - -### PIP - -```bash -pipx install python-language-server # (coc-python) -``` - - -### Bash completion - -- composer (`cgr require bamarni/symfony-console-autocomplete`) -- tmux (https://github.com/imomaliev/tmux-bash-completion/blob/master/completions/tmux) -- yarn (https://github.com/dsifford/yarn-completion/blob/master/yarn-completion.bash) - - -## Addendum - -### Syntax highlight with bat and cat [1] - -As a special case, in order to have syntax highlighting for PHP work with -`bat` in combination with `delta` diffs, refer to [these -instructions](https://github.com/dandavison/delta/issues/162#issuecomment-625952288). - -It's necessary to perform this step, whenever `bat` gets updated. - - -### Install tmux plugins [3] - -After tmux has been installed, run the following commands in order to install -and setup tmux plugin manager ([TPM](https://github.com/tmux-plugins/tpm)) for -the first time. The following commands below will clone TPM's source code and -install it at the right location, then type; `Ctrl + SPACE + I` in order to -actually install tmux plugins. - -```bash -git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm -``` - - -### Fix hotplug issue with Thunderbolt [4] - -Given the following symptoms: -> Devices, connected via Thunderbolt don't work if "hot plugged in" (that is, -> after the OS has booted). However, if the device is connected at cold boot -> time, the device works mystically. In particular, to a Dock connected devices -> like keyboards and mouses don't assume to have any powered state (e.g. the -> laser pointer of a mouse remains switched off). - -This is due to the [OS' security -settings](https://wiki.archlinux.org/title/Thunderbolt#User_device_authorization). -The OS - by default - protects against [DMA -attacks](https://en.wikipedia.org/wiki/DMA_attack) such as -[Thunderstrike](https://trmm.net/Thunderstrike_2/), by setting the security mode -to `user` or `secure`. So the in some form or another, we have to "approve" the -connected device. - -One way to simply get away with it, is to add a udev rule to -`/etc/udev/rules.d/99-removable.rules`, which just authorizes essentially every -hot-plugged Thunderbolt device: - -``` -ACTION=="add", SUBSYSTEM=="thunderbolt", ATTR{authorized}=="0", ATTR{authorized}="1" -``` - -The rule will become effective after the next reboot, however you can also avoid -a reboot by live-reloading udev rules: - -```bash -sudo udevadm control --reload-rules -sudo udevadm trigger -``` - -However, a much simpler approach would be actually authorizing the device via -`bolt`. - -Sources: -- [Thunderbolt](https://wiki.archlinux.org/title/Thunderbolt) -- [Thunderbolt - udev rule (Arch Wiki)](https://wiki.archlinux.org/title/Thunderbolt#Automatically_connect_any_device) -- [Live-reload udev rule (unix.stackexchange.com)](https://unix.stackexchange.com/a/39371/213414) - - -### GPG keyservers - -My GPG keys are generally distributed via the following public keyservers: -- keys.openpgp.org -- keyserver.ubuntu.com -- pgp.mit.edu - - -### Fix automatic wake ups from suspend - -For some Tuxedo Laptops, the Laptop wakes up automatically within a couple of -seconds. This is due to a bug in the BIOS, which can be seen in the syslog, -based on these log entries: - -``` -[...] -xxx xx xx:xx:xx archlinux kernel: ACPI BIOS Error (bug): Could not resolve symbol [\_SB.ACDC.RTAC], AE_NOT_FOUND (20230628/psargs-332) -xxx xx xx:xx:xx archlinux kernel: ACPI Error: Aborting method \_SB.PEP._DSM due to previous error (AE_NOT_FOUND) (20230628/psparse-529) -[...] -``` - -For mitigation, the kernel parameter `acpi.ec_no_wakeup=1` must be set in -`/etc/default/grub`: - -```diff --GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" -+GRUB_CMDLINE_LINUX_DEFAULT="quiet splash acpi.ec_no_wakeup=1" -``` - -> Don't forget to run `sudo update-grub` in order re-build and deploy the grub -> config, so that it becomes effective from the next system boot onwards.. - -For testing purpose, the `acpi.ec_no_wakeup=1` parameter can also be set at -post-boot with the sysfs interface: - -```bash -# Read current state of acpi.ec_no_wakeup via ... -cat /sys/module/acpi/parameters/ec_no_wakeup -# ... Y -> 1 (on); N -> 0 (off) -# Set the value by writing 1 or 0 to the file: e.g. -echo "1" | sudo tee /sys/module/acpi/parameters/ec_no_wakeup -``` - -It's worth pointing out, that even with setting the parameter, the error will -still be logged to syslog, however the automatic wake ups are prevented this -way. - - -Links: -- [Tuxedo FAQ / Device Immediately Wakes Up After Suspend](https://www.tuxedocomputers.com/en/FAQ-TUXEDO-InfinityBook-Pro-15-Gen9.tuxedo#3675) -- [Arch Wiki / /sys/module/acpi/parameters/ec_no_wakeup](https://wiki.archlinux.org/title/Power_management/Wakeup_triggers#/sys/module/acpi/parameters/ec_no_wakeup) - - -### Have systemd using same default console editor - -By default, systemd may use any available console-based editor. -However, the `SYSTEMD_EDITOR` ENV allows configuring any editor of preference. -In order to have `sudo` based commands inheriting this ENV, add the following -line to the sudoers file manually via `visudo`. - -```diff - ## - ## Preserve editor environment variables for visudo. - ## To preserve these for all commands, remove the "!visudo" qualifier. - Defaults!/usr/bin/visudo env_keep += "SUDO_EDITOR EDITOR VISUAL" -+Defaults env_keep += "SYSTEMD_EDITOR" - ## - ## Use a hard-coded PATH instead of the user's to find commands. -``` - - -### Permissions for Polybar [6] - -Many modules may not work out of the box. Inspect -`~/.config/polybar/config.ini`, which might require a few parameters to be -properly templated via chezmoi. - -#### Change backlight via scrolling - -For having support for changing the backlight via scrolling, do the following: - -1) Add your user to the `video` group. - -```bash -sudo usermod -aG video $USER -newgrp video -``` - -2) Add the following udev rule `/etc/udev/rules.d/99-backlight.rules` - -``` -ACTION=="add", SUBSYSTEM=="backlight", RUN+="/bin/chgrp video $sys$devpath/brightness", RUN+="/bin/chmod g+w $sys$devpath/brightness" -``` - -Reload udev via: - -```bash -sudo udevadm control --reload-rules -sudo udevadm trigger -``` - -In case it does not work, try rebooting the system. - - -### Pipewire post-installation activation [7] - -[`pipewire`](https://wiki.archlinux.org/title/PipeWire) is used as the audio -router and processor. For audio session management, -[`wireplumber`](https://wiki.archlinux.org/title/WirePlumber) is used. - -Additionally, the `pipewire-pulse` package is installed for mimicking -[`pulseaudio`](https://wiki.archlinux.org/title/PulseAudio) for some -applications. In order to have both services working reliably, make sure systemd -is running them upon startup. - -Either [`helvum`](https://gitlab.freedesktop.org/pipewire/helvum) or -[`hyprpwcenter`](https://wiki.hypr.land/Hypr-Ecosystem/hyprpwcenter/) may be -used as patchbay GUI for pipewire. - -```bash -systemctl enable --user --now pipewire.service -systemctl enable --user --now pipewire-pulse.service -``` - - -### Bluetooth support - -For having [Bluetooth](https://wiki.archlinux.org/title/Bluetooth) working, the -`bluetoothd` daemon must run in the background. -Run the following systemd command in order to run bluetoothd from the beginning. - -```bash -sudo systemctl enable --now bluetooth.service -``` - -Tools like [`bluetui`](https://github.com/pythops/bluetui) and -`bluetoothctl` may be used for frontends for interacting. - - -### Yubikey support - -[Yubikey](https://wiki.archlinux.org/title/YubiKey) builds upon the smartcard -interface, whose service may not be running. -You may enable the service to become available via systemd activation: - -```bash -sudo systemctl enable --now pcscd.service -``` diff --git a/bin/executable_backlight.sh b/bin/executable_backlight.sh deleted file mode 100644 index 94718d5..0000000 --- a/bin/executable_backlight.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# set -x - -# Get current brightness in percent -BRIGHTNESS="$(brightnessctl -m | cut -d',' -f4 | grep -Po '\d+')" -DIFF="$(echo "$1" | grep -Po "[\+\-]\d+(?=%)")" - -# Round properly -TARGET_BRIGHTNESS="$(( (("$BRIGHTNESS" / 5) * 5) + "$DIFF" ))" - -# Do not go beyond the boundaries of 0 and 100 -TARGET_BRIGHTNESS="$(( 0 <= $TARGET_BRIGHTNESS ? $TARGET_BRIGHTNESS : 0 ))" -TARGET_BRIGHTNESS="$(( $TARGET_BRIGHTNESS <= 100 ? $TARGET_BRIGHTNESS : 100 ))" - -# Set brightness -brightnessctl set "${TARGET_BRIGHTNESS}%" - -# Show the brightness notification -notify-send \ - -a "changeBrightness" \ - -u normal \ - -t 1500 \ - -i /usr/share/icons/Tela-circle-manjaro/symbolic/status/display-brightness-symbolic.svg \ - -h string:synchronous:my-progress "Brightness: ${BRIGHTNESS}" diff --git a/bin/executable_capslock-check.sh b/bin/executable_capslock-check.sh deleted file mode 100644 index 338bac0..0000000 --- a/bin/executable_capslock-check.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash - -# set -x - -while true -do - # Check if caps-lock LED is enabled for first-best input device - CAPS_ON="$(cat "$(find /sys/class/leds/input*::capslock/ -name 'brightness' | head -1)")" - - # empty string causes waybar to show nothing - TEXT="{ \"text\": \"\"}" - - if [[ "$CAPS_ON" == "1" ]]; then - TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" - fi - - echo "$TEXT" | jq --unbuffered --compact-output - sleep 1 -done diff --git a/bin/executable_composer b/bin/executable_composer deleted file mode 100644 index 4ee6257..0000000 --- a/bin/executable_composer +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/bash - -COMPOSER_VERSION=2.9.5 -COMPOSER_HOME=${COMPOSER_HOME:-$HOME/.config/composer} -COMPOSER_CACHE_DIR=${COMPOSER_CACHE_DIR:-$HOME/.cache/composer} - -mkdir -p "$COMPOSER_HOME" "$COMPOSER_CACHE_DIR" - -docker run \ - -it \ - --rm \ - -u "$(id -u):$(id -g)" \ - -v /etc/passwd:/etc/passwd:ro \ - -v /etc/group:/etc/group:ro \ - -e SSH_AUTH_SOCK=/ssh-auth.sock \ - -v "$SSH_AUTH_SOCK:/ssh-auth.sock" \ - -e "COMPOSER_HOME=${COMPOSER_HOME}" \ - -v "${COMPOSER_HOME}:${COMPOSER_HOME}" \ - -e "COMPOSER_CACHE_DIR=${COMPOSER_CACHE_DIR}" \ - -v "${COMPOSER_CACHE_DIR}:${COMPOSER_CACHE_DIR}" \ - -v "$PWD":/app \ - "composer:${COMPOSER_VERSION}" \ - "$@" diff --git a/bin/executable_nmcli-active-vpn-conn.sh b/bin/executable_nmcli-active-vpn-conn.sh deleted file mode 100644 index 22292ed..0000000 --- a/bin/executable_nmcli-active-vpn-conn.sh +++ /dev/null @@ -1,17 +0,0 @@ -#!/bin/bash - -# set -x - -ALL_ACTIVE_CONNS="$(nmcli con show --active)" -ALL_ACTIVE_VPN_CONNS="$(echo "$ALL_ACTIVE_CONNS" | awk '{ if ($3=="vpn") print $1}')" -ALL_ACTIVE_VPN_CONNS_CNT="$(echo "$ALL_ACTIVE_VPN_CONNS" | wc -l)" - -if [[ "$ALL_ACTIVE_VPN_CONNS" == "" ]]; then - echo "{ \"text\": \" 0\", \"tooltip\": \"No active VPN connections\", \"class\": \"inactive\" }" - - exit 0 -fi - -echo "{ \"text\": \" ${ALL_ACTIVE_VPN_CONNS_CNT}\", \"tooltip\": "$(echo -n "$ALL_ACTIVE_VPN_CONNS" | jq -Rsa .)", \"class\": \"active\" }" - -exit 0 diff --git a/bin/executable_phpstan b/bin/executable_phpstan deleted file mode 100644 index c9816ed..0000000 --- a/bin/executable_phpstan +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -PHPSTAN_VERSION=2.0.4 -PHP_VERSION=php8.3 - -docker run \ - -t \ - --rm \ - -v $PWD:/app \ - "ghcr.io/phpstan/phpstan:${PHPSTAN_VERSION}-${PHP_VERSION}" \ - ${@//"${PWD}/"/"/app/"} \ - | sed -E "s/\/app\//${PWD//"/"/"\/"}\//" diff --git a/bin/executable_rfkill-toggle.sh b/bin/executable_rfkill-toggle.sh deleted file mode 100644 index 33828f8..0000000 --- a/bin/executable_rfkill-toggle.sh +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -# Toggle rfkill switches -rfkill --json | jq --raw-output0 '.rfkilldevices | map(.type) | .[]' | xargs -0 -L1 rfkill toggle - -# Check current status on first-best device -STATUS="$(rfkill --json | jq -r '.rfkilldevices[0].soft')" - -# Show notification -UNBLOCKED="/usr/share/icons/Tela-circle-manjaro/22/panel/network-flightmode-off.svg" -BLOCKED="/usr/share/icons/Tela-circle-manjaro/22/panel/network-flightmode-on.svg" - -ICON="$UNBLOCKED" -STATUS_TXT="off" -if [[ $STATUS == "blocked" ]]; then - ICON="$BLOCKED" - STATUS_TXT="on" -fi - -notify-send \ - -a "changeFlightmode" \ - -u normal \ - -t 1500 \ - -i "$ICON" \ - -h string:synchronous:my-progress "Flightmode: $STATUS_TXT" diff --git a/bin/executable_sound.sh b/bin/executable_sound.sh deleted file mode 100644 index efba7d1..0000000 --- a/bin/executable_sound.sh +++ /dev/null @@ -1,65 +0,0 @@ -#!/bin/bash - -# set -x - -VOLUME="$(pactl get-sink-volume "@DEFAULT_SINK@" | grep -Po '\d+(?=%)' | head -n 1)" -MUTED="$(pactl get-sink-mute @DEFAULT_SINK@ | grep -Po 'yes|no')" - -if [[ "$1" == "mute" && "$2" == "toggle" ]]; then - # toggle mute - pactl set-sink-mute @DEFAULT_SINK@ toggle - - MSG="Volume muted" - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-muted-blocking.svg" - if [[ "$MUTED" == "yes" ]]; then - # in this case, we toggle to unmute - MSG="Volume unmuted" - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-muted.svg" - fi - - notify-send \ - -a "changeVolume" \ - -u normal \ - -t 1500 \ - -i "$ICON" \ - -h string:synchronous:my-progress "$MSG" - - exit 0 -fi - -if [[ "$1" == "volume" ]]; then - # Force unmuting upon changing sound - pactl set-sink-mute "@DEFAULT_SINK@" no - - DIFF="$(echo "$2" | grep -Po "[\+\-]\d+(?=%)")" - - # Round properly - TARGET_VOLUME="$(( (("$VOLUME" / 5) * 5) + "$DIFF" ))" - - # Do not go beyond the boundaries of 0 and 100 - TARGET_VOLUME="$(( 0 <= $TARGET_VOLUME ? $TARGET_VOLUME : 0 ))" - TARGET_VOLUME="$(( $TARGET_VOLUME <= 100 ? $TARGET_VOLUME : 100 ))" - - # set again with properly rounded value - pactl set-sink-volume "@DEFAULT_SINK@" "${TARGET_VOLUME}%" - - # icon to display - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-low.svg" - if [[ "$TARGET_VOLUME" -ge "33" ]]; then - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-medium.svg" - fi - if [[ "$TARGET_VOLUME" -ge "66" ]]; then - ICON="/usr/share/icons/Tela-circle-manjaro/24/panel/audio-volume-high.svg" - fi - - # Show the volume notification - notify-send \ - -a "changeVolume" \ - -u normal \ - -t 1500 \ - -i "$ICON" \ - -h string:synchronous:my-progress "Volume: ${TARGET_VOLUME}%" - - # Play the volume changed sound - paplay /usr/share/sounds/freedesktop/stereo/audio-volume-change.oga -fi diff --git a/dot_bash/aliases b/dot_bash/aliases deleted file mode 100644 index 4339c59..0000000 --- a/dot_bash/aliases +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -# override some default commands -alias cp="cp -i" # confirm before overwriting something -alias df='df -h' # human-readable sizes -alias free='free -m' # show sizes in MB -alias np='nano -w PKGBUILD' -alias more=less - -# some more ls aliases -alias ls='ls --color=auto' -alias ll='ls -alF' -alias la='ls -A' -alias l='ls -CF' - -# grep aliases -alias grep='grep --colour=auto' -alias egrep='egrep --colour=auto' -alias fgrep='fgrep --colour=auto' - -# diff color alias -alias diff='diff --color=auto' - -# Mock pbcopy and pbpaste -alias pbcopy='wl-copy' -alias pbpaste='wl-paste' - -# Open file via CLI -alias open='xdg-open' diff --git a/dot_bash/completion b/dot_bash/completion deleted file mode 100644 index 131ce83..0000000 --- a/dot_bash/completion +++ /dev/null @@ -1,40 +0,0 @@ -#!/bin/bash - -# Source nvm -[ -f /usr/share/nvm/init-nvm.sh ] && source /usr/share/nvm/init-nvm.sh - -# Smart completion for npm commands -if command -v npm &> /dev/null; then - source <(npm completion) -fi - -# Smart completion for composer -# see https://github.com/bamarni/symfony-console-autocomplete -if command -v php &> /dev/null && command -v symfony-autocomplete &> /dev/null; then - source <(symfony-autocomplete) -fi - -# Smart completion for pip -if command -v pip &> /dev/null; then - source <(pip completion --bash) -fi - -# Smart completion for pipx -if command -v pipx &> /dev/null && command -v register-python-argcomplete &> /dev/null; then - eval "$(register-python-argcomplete pipx)" -fi - -# Smart completion for arch-audit -if command -v arch-audit &> /dev/null; then - source <(arch-audit completions bash) -fi - -# Smart completion for op (1password cli client) -if command -v op &> /dev/null; then - source <(op completion bash) -fi - -# Smart completion for op (auto-cpufreq cli client) -if command -v auto-cpufreq &> /dev/null; then - eval "$(_AUTO_CPUFREQ_COMPLETE=bash_source auto-cpufreq)" -fi diff --git a/dot_bash/conf b/dot_bash/conf deleted file mode 100644 index adf7563..0000000 --- a/dot_bash/conf +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -# Don't exit shell on EOF -set -o ignoreeof - - - -## BASH HISTORY -# don't put duplicate lines or lines starting with space in the history. -# See bash(1) for more options -HISTCONTROL=ignoreboth:erasedups - -# append to the history file, don't overwrite it -shopt -s histappend - -# for setting history length see HISTSIZE and HISTFILESIZE in bash(1) -HISTSIZE=-1 -HISTFILESIZE=-1 - - - -# check the window size after each command and, if necessary, -# update the values of LINES and COLUMNS. -shopt -s checkwinsize - - - -# enable programmable completion features (you don't need to enable -# this, if it's already enabled in /etc/bash.bashrc and /etc/profile -# sources /etc/bash.bashrc). -if ! shopt -oq posix; then - if [ -f /usr/share/bash-completion/bash_completion ]; then - . /usr/share/bash-completion/bash_completion - elif [ -f /etc/bash_completion ]; then - . /etc/bash_completion - fi -fi - - - -# Expand alias in non-interactive shells -shopt -s expand_aliases diff --git a/dot_bash/exports b/dot_bash/exports deleted file mode 100644 index 1baaa7f..0000000 --- a/dot_bash/exports +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash - -# Set default editor -export EDITOR=nvim -# Set default editor for systemd -export SYSTEMD_EDITOR="$EDITOR" - -# Set default browser -export BROWSER=/usr/bin/google-chrome-stable - -# Set default terminal -export TERMINAL=/usr/bin/kitty diff --git a/dot_bash/gpg b/dot_bash/gpg deleted file mode 100644 index 3009779..0000000 --- a/dot_bash/gpg +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash - -unset SSH_AGENT_PID -if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then - export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)" -fi - -export GPG_TTY=$(tty) -gpg-connect-agent updatestartuptty /bye >/dev/null diff --git a/dot_bash/path b/dot_bash/path deleted file mode 100644 index bbfb5cc..0000000 --- a/dot_bash/path +++ /dev/null @@ -1,33 +0,0 @@ -#!/bin/bash - -# Add go binaries to PATH -if [[ ! "$PATH" == *"/usr/local/go/bin"* ]]; then - export PATH="${PATH}:/usr/local/go/bin" -fi -if [[ ! "$PATH" == *"${HOME}/go/bin"* ]]; then - export PATH="${PATH}:${HOME}/go/bin" -fi - -# Add PHP executables to PATH -if [[ ! "$PATH" == *"${HOME}/.config/composer/vendor/bin"* ]]; then - export PATH="${PATH}:${HOME}/.config/composer/vendor/bin" -fi -if [[ ! "$PATH" == *"${HOME}/.composer/vendor/bin"* ]]; then - export PATH="${PATH}:${HOME}/.composer/vendor/bin" -fi - -# Add yarn executables to PATH -if [[ ! "$PATH" == *"${HOME}/.yarn/bin"* ]]; then - export PATH="${PATH}:${HOME}/.yarn/bin" -fi - -# Add GEM executables to PATH -GEMPATH="$(ruby -r rubygems -e 'puts Gem.user_dir')/bin" -if [[ ! "$PATH" == *"$GEMPATH"* ]]; then - export PATH="${PATH}:$GEMPATH" -fi - -# Add any custom executables to PATH -if [[ ! "$PATH" == *"${HOME}/bin"* ]]; then - export PATH="${PATH}:${HOME}/bin" -fi diff --git a/dot_bash/prompt b/dot_bash/prompt deleted file mode 100644 index ac9814a..0000000 --- a/dot_bash/prompt +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -# Initialize git helper shell -source /usr/share/git/completion/git-prompt.sh - -GIT_PS1_SHOWDIRTYSTATE="1" -GIT_PS1_SHOWUNTRACKEDFILES="1" -GIT_PS1_SHOWUPSTREAM="auto" -GIT_PS1_SHOWCONFLICTSTATE="yes" -GIT_PS1_DESCRIBE_STYLE="describe" -GIT_PS1_SHOWCOLORHINTS="1" - -PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' diff --git a/dot_bash/scripts b/dot_bash/scripts deleted file mode 100644 index c509a73..0000000 --- a/dot_bash/scripts +++ /dev/null @@ -1,62 +0,0 @@ -#!/bin/bash - -# Quick HTTPBIN server for request inspection -httpbin() { - docker run -it --rm --name httpbin -p "${1:-8080}:80" kennethreitz/httpbin -} - - - -# Synchronize history between bash sessions -# -# Make history from other terminals available to the current one. However, -# don't mix all histories together - make sure that *all* commands from the -# current session are on top of its history, so that pressing up arrow will -# give you most recent command from this session, not from any session. -# -# Since history is saved on each prompt, this additionally protects it from -# terminal crashes. -# -# on every prompt, save new history to dedicated file and recreate full history -# by reading all files, always keeping history from current session on top. -update_history () { - history -a ${HISTFILE}.$$ - history -c - history -r # load common history file - - # load histories of other sessions - for f in `ls ${HISTFILE}.[0-9]* 2>/dev/null | grep -v "${HISTFILE}.$$\$"`; do - history -r $f - done - - history -r "${HISTFILE}.$$" # load current session history -} - -if [[ "$PROMPT_COMMAND" != *update_history* ]]; then - export PROMPT_COMMAND="update_history; $PROMPT_COMMAND" -fi - -# merge session history into main history file on bash exit -merge_session_history () { - if [ -e ${HISTFILE}.$$ ]; then - cat ${HISTFILE}.$$ >> $HISTFILE - rm ${HISTFILE}.$$ - fi -} -trap merge_session_history EXIT - - -# detect leftover files from crashed sessions and merge them back -active_shells=$(pgrep `ps -p $$ -o comm=`) -grep_pattern=`for pid in $active_shells; do echo -n "-e \.${pid}\$ "; done` -orphaned_files=`ls $HISTFILE.[0-9]* 2>/dev/null | grep -v $grep_pattern` - -if [ -n "$orphaned_files" ]; then - echo Merging orphaned history files: - for f in $orphaned_files; do - echo " `basename $f`" - cat $f >> $HISTFILE - rm $f - done - echo "done." -fi diff --git a/dot_bash_logout b/dot_bash_logout deleted file mode 100644 index de4f5f7..0000000 --- a/dot_bash_logout +++ /dev/null @@ -1,7 +0,0 @@ -# ~/.bash_logout: executed by bash(1) when login shell exits. - -# when leaving the console clear the screen to increase privacy - -if [ "$SHLVL" = 1 ]; then - [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q -fi diff --git a/dot_bash_profile b/dot_bash_profile deleted file mode 100644 index 5545f00..0000000 --- a/dot_bash_profile +++ /dev/null @@ -1,5 +0,0 @@ -# -# ~/.bash_profile -# - -[[ -f ~/.bashrc ]] && . ~/.bashrc diff --git a/dot_bashrc b/dot_bashrc deleted file mode 100644 index 5ae288e..0000000 --- a/dot_bashrc +++ /dev/null @@ -1,28 +0,0 @@ -# -# ~/.bashrc -# - -# If not running interactively, don't do anything -[[ $- != *i* ]] && return - -# ------------ -# CUSTOM CONFIGURATION -# ------------ -# Load the rest of the dotfiles -DOTFILES=( - ".bash/exports" - ".bash/path" - ".bash/conf" - ".bash/aliases" - ".bash/scripts" - ".bash/prompt" - ".bash/gpg" - ".bash/completion" - ".localrc" -) -for DOTFILE in ${DOTFILES[@]}; do - FILE="${HOME}/${DOTFILE}" - [ -f "$FILE" ] && source "$FILE" -done - -[ -f ~/.fzf.bash ] && source ~/.fzf.bash diff --git a/dot_cargo/config b/dot_cargo/config deleted file mode 100644 index a42311e..0000000 --- a/dot_cargo/config +++ /dev/null @@ -1,2 +0,0 @@ -[http] -multiplexing = false diff --git a/dot_config/autostart/nm-applet.desktop b/dot_config/autostart/nm-applet.desktop deleted file mode 100644 index 7f55d8f..0000000 --- a/dot_config/autostart/nm-applet.desktop +++ /dev/null @@ -1,158 +0,0 @@ -[Desktop Entry] -Name[af]=NetworkManager-miniprogram -Name[an]=Miniaplicacion Chestor d'o rete -Name[ar]=بريمج مدير الشبكة -Name[as]=NetworkManager এপ্লেট -Name[ast]=Aplicación NetworkManager -Name[be]=Аплет NetworkManager -Name[be@latin]=Aplet NetworkManager -Name[bg]=Аплетът NetworkManager -Name[bn_IN]=NetworkManager অ্যাপ্লেট -Name[bs]=Programče Upravnik mreže -Name[ca]=Miniaplicació NetworkManager -Name[ca@valencia]=Miniaplicació NetworkManager -Name[crh]=NetworkManager Uygulamacığı -Name[cs]=Applet NetworkManager -Name[da]=Panelprogram til Netværkshåndtering -Name[de]=Netzwerk-Manager-Applet -Name[dz]=ཡོངས་འབྲེལ་འཛིན་སྐྱོང་པའི་ཨེཔ་ལེཊི་ -Name[el]=Μικροεφαρμογή NetworkManager -Name[en_CA]=NetworkManager Applet -Name[en_GB]=NetworkManager Applet -Name[eo]=Apleto por NetworkManager -Name[es]=Miniaplicación Gestor de la red -Name[et]=Võrguhalduri rakend -Name[eu]=NetworkManager miniaplikazioa -Name[fa]=برنامک مدیریت شبکه -Name[fi]=Verkon hallinta -sovelma -Name[fr]=Applet NetworkManager -Name[gd]=Aplaid Manaidsear lìonraidh -Name[gl]=Miniaplicación NetworkManager -Name[gu]=NetworkManager એપ્લેટ -Name[he]=יישומון מנהל הרשתות -Name[hi]=नेटवर्कप्रबंधक एप्लेट -Name[hr]=Aplet mrežnog upravitelja -Name[hu]=Hálózatkezelő kisalkalmazás -Name[id]=Aplet NetworkManager -Name[is]=NetworkManager forrit -Name[it]=Applet NetworkManager -Name[ja]=NetworkManager アプレット -Name[kk]=NetworkManager апплеті -Name[km]=អាប់ភ្លេត NetworkManager -Name[kn]=NetworkManager ಆಪ್ಲೆಟ್ -Name[ko]=네트워크 관리 애플릿 -Name[ku]=Sepanoka NetworkManager -Name[lt]=NetworkManager įtaisas -Name[lv]=NetworkManager sīklietotne -Name[mk]=Аплет за менаџирање со мрежи -Name[ml]=NetworkManager ലഘുപ്രയോഗം -Name[mr]=NetworkManager ॲप्लेट -Name[ms]=Aplet NetworkManager -Name[nb]=NetworkManager panelprogram -Name[ne]=सञ्जालप्रबन्धक एप्लेट -Name[nl]=Netwerkbeheer-applet -Name[nn]=Panelprogram for NetworkManager -Name[oc]=Apondon (applet) NetworkManager -Name[or]=ନେଟୱର୍କ ପରିଚାଳକ ଆପଲେଟ -Name[pa]=ਨੈੱਟਵਰਕਮੈਨੇਜਰ ਐਪਲਿਟ -Name[pl]=Aplet NetworkManager -Name[pt]=Aplicação Gestor de redes -Name[pt_BR]=Miniaplicativo gerenciador de redes -Name[ro]=Miniaplicație Administrator de rețea -Name[ru]=Аплет NetworkManager -Name[sk]=Aplet Správca siete -Name[sl]=Aplet upravljalnika omrežja -Name[sr]=Програмче управника мреже -Name[sr@latin]=Programče upravnika mreže -Name[sv]=Miniprogram för nätverkshantering -Name[ta]=பிணைய மேலாளர் அப்லெட் -Name[te]=నెట్‌వర్క్ మ్యానేజర్ ఆప్లెట్ -Name[th]=แอพเพล็ต NetworkManager -Name[tr]=NetworkManager Programcığı -Name[ug]=NetworkManager قوللانچاق -Name[uk]=Аплет NetworkManager -Name[ur]=نیٹ ورک منیجر ایپلیٹ -Name[vi]=Quản lý mạng -Name[zh_CN]=网络管理器小程序 -Name[zh_HK]=NetworkManager 面板程式 -Name[zh_TW]=NetworkManager 面板程式 -Name=NetworkManager Applet -Comment[af]=Bestuur u netwerkverbindings -Comment[an]=Chestione as suyas conexions de rete -Comment[ar]=إدارة اتصالات الشبكة -Comment[as]=আপোনাৰ নেটৱৰ্ক সংযোগসমূহ ব্যৱস্থাপনা কৰক -Comment[ast]=Remana les conexones de rede -Comment[be]=Кіраванне сеткавымі злучэннямі -Comment[bg]=Управление на мрежовите връзки -Comment[bs]=Upravljajte svojim mrežnim vezama -Comment[ca]=Gestioneu les connexions de xarxa -Comment[ca@valencia]=Gestioneu les connexions de xarxa -Comment[crh]=Şebeke bağlantılarıñıznı idare etiñiz -Comment[cs]=Spravujte svá síťová připojení -Comment[da]=Håndtér dine netværksforbindelser -Comment[de]=Verwaltung der Netzwerkverbindungen -Comment[el]=Διαχείριση των συνδέσεων δικτύου -Comment[en_GB]=Manage your network connections -Comment[eo]=Kontroli viajn retkonektojn -Comment[es]=Gestione sus conexiones de red -Comment[et]=Võrguühenduste haldamine -Comment[eu]=Kudeatu sareko konexioak -Comment[fa]=اتصال‌های شبکه خود را مدیریت کنید -Comment[fi]=Hallitse verkkoyhteyksiä -Comment[fr]=Gérer vos connexions réseau -Comment[gd]=Stiùirich na ceanglaichean agad ris an eadar-lìon -Comment[gl]=Xestione as súas conexións de rede -Comment[gu]=તમારા નેટવર્ક જોડાણોને સંચાલિત કરો -Comment[he]=ניהול חיבורי הרשת שלך -Comment[hi]=अपना संजाल कनेक्शन नियंत्रित करें -Comment[hr]=Upravljanje mrežnim povezivanjem -Comment[hu]=Hálózati kapcsolatok kezelése -Comment[id]=Mengelola koneksi jaringan Anda -Comment[is]=Sýsla með nettengingar -Comment[it]=Gestisce le connessioni di rete -Comment[ja]=ネットワーク接続の管理 -Comment[ka]=ქსელური შეერთებების მართვა -Comment[kk]=Желілік байланыстарыңызды басқару -Comment[km]=គ្រប់គ្រង​ការ​តភ្ជាប់បណ្ដាញ​របស់​អ្នក -Comment[ko]=네트워크 연결을 관리합니다 -Comment[ku]=Girêdanên torê yên xwe birêve bike -Comment[lt]=Tvarkyti tinklo ryšius -Comment[lv]=Pārvaldiet savus tīkla savienojumus -Comment[mk]=Менаџирајте со Вашите мрежни врски -Comment[ml]=നിങ്ങളുടെ ശൃംഖല ബന്ധങ്ങള്‍ കൈകാര്യം ചെയ്യുക -Comment[mr]=नेटवर्क जोडणी नियंत्रीत करा -Comment[ms]=Urus sambungan-sambungan rangkaian anda -Comment[nb]=Håndter dine nettverksforbindelser -Comment[nl]=Uw netwerkverbindingen beheren -Comment[nn]=Handsam nettverkstilkoplingane -Comment[oc]=Gerir la connexions a la ret -Comment[pa]=ਆਪਣੇ ਨੈੱਟਵਰਕ ਕਨੈਕਸ਼ਨਾਂ ਦਾ ਪਰਬੰਧ ਕਰੋ -Comment[pl]=Zarządzanie połączeniami sieciowymi -Comment[pt]=Controle as suas ligações de rede -Comment[pt_BR]=Controle suas conexões de rede -Comment[ro]=Gestionează conexiunile la rețea -Comment[ru]=Управление сетевыми соединениями -Comment[sk]=Spravuje vaše sieťové pripojenia -Comment[sl]=Upravljanje omrežnih povezav -Comment[sr]=Управљајте вашим везама мреже -Comment[sr@latin]=Upravljajte vašim vezama mreže -Comment[sv]=Hantera dina nätverksanslutningar -Comment[ta]=உங்களது பிணையத்தின் இணைப்புகளை மேலாண்மை செய்க -Comment[te]=మీ నెట్వర్కు అనుసంధానములను నిర్వహించు -Comment[th]=จัดการการเชื่อมต่อเครือข่ายของคุณ -Comment[tr]=Ağ bağlantılarınızı yönetin -Comment[ug]=تور باغلىنىشلىرىڭىزنى باشقۇرۇڭ -Comment[uk]=Організуйте ваші мережеві з'єднання -Comment[vi]=Quản lý kết nối mạng -Comment[zh_CN]=管理您的网络连接 -Comment[zh_HK]=管理你的網絡連線 -Comment[zh_TW]=管理您的網路連線 -Comment=Manage your network connections -Icon=nm-device-wireless -Exec=nm-applet -Terminal=false -Type=Application -NoDisplay=true -NotShowIn=KDE;GNOME; -X-GNOME-UsesNotifications=true -Hidden=true diff --git a/dot_config/bat/config b/dot_config/bat/config deleted file mode 100644 index cf0267a..0000000 --- a/dot_config/bat/config +++ /dev/null @@ -1,4 +0,0 @@ ---color auto ---tabs 8 ---theme "Monokai Extended" ---wrap auto diff --git a/dot_config/bat/syntaxes/PHP.sublime-syntax b/dot_config/bat/syntaxes/PHP.sublime-syntax deleted file mode 100644 index f3a32a2..0000000 --- a/dot_config/bat/syntaxes/PHP.sublime-syntax +++ /dev/null @@ -1,30 +0,0 @@ -%YAML 1.2 ---- -name: PHP -file_extensions: - - php - - php3 - - php4 - - php5 - - php7 - - phps - - phpt - - phtml -first_line_match: '^(#!.*[^-]php[0-9]?|<\?php)\b' -scope: embedding.php -contexts: - main: - - match: '' - push: scope:text.html.basic - push: - - meta_scope: meta.embedded.block.php - - meta_content_scope: source.php - - include: php-end-tag-pop - - include: scope:source.php - - php-end-tag-pop: - - match: (\?>)(\s*\n)? - captures: - 1: punctuation.section.embedded.end.php - 2: meta.html-newline-after-php.php - pop: true diff --git a/dot_config/ctags/default.ctags b/dot_config/ctags/default.ctags deleted file mode 100644 index f744653..0000000 --- a/dot_config/ctags/default.ctags +++ /dev/null @@ -1,7 +0,0 @@ ---recurse=yes - ---exclude=node_modules ---exclude=*.min.js ---exclude=.git - --f .tags diff --git a/dot_config/dunst/dunstrc b/dot_config/dunst/dunstrc deleted file mode 100644 index b125025..0000000 --- a/dot_config/dunst/dunstrc +++ /dev/null @@ -1,436 +0,0 @@ -# See dunst(5) for all configuration options - -[global] - ### Display ### - - # Which monitor should the notifications be displayed on. - monitor = 0 - - # Display notification on focused monitor. Possible modes are: - # mouse: follow mouse pointer - # keyboard: follow window with keyboard focus - # none: don't follow anything - # - # "keyboard" needs a window manager that exports the - # _NET_ACTIVE_WINDOW property. - # This should be the case for almost all modern window managers. - # - # If this option is set to mouse or keyboard, the monitor option - # will be ignored. - follow = mouse - - ### Geometry ### - - # dynamic width from 0 to 300 - # width = (0, 300) - # constant width of 300 - width = 300 - - # The maximum height of a single notification, excluding the frame. - height = (0, 150) - - # Position the notification in the top right corner - origin = top-right - - # Offset from the origin - offset = (10, 50) - - # Scale factor. It is auto-detected if value is 0. - scale = 0 - - # Maximum number of notification (0 means no limit) - notification_limit = 0 - - ### Progress bar ### - - # Turn on the progess bar. It appears when a progress hint is passed with - # for example dunstify -h int:value:12 - progress_bar = true - - # Set the progress bar height. This includes the frame, so make sure - # it's at least twice as big as the frame width. - progress_bar_height = 10 - - # Set the frame width of the progress bar - progress_bar_frame_width = 1 - - # Set the minimum width for the progress bar - progress_bar_min_width = 150 - - # Set the maximum width for the progress bar - progress_bar_max_width = 300 - - - # Show how many messages are currently hidden (because of - # notification_limit). - indicate_hidden = yes - - # The transparency of the window. Range: [0; 100]. - # This option will only work if a compositing window manager is - # present (e.g. xcompmgr, compiz, etc.). (X11 only) - transparency = 15 - - # Draw a line of "separator_height" pixel height between two - # notifications. - # Set to 0 to disable. - separator_height = 1 - - # Padding between text and separator. - padding = 8 - - # Horizontal padding. - horizontal_padding = 10 - - # Padding between text and icon. - text_icon_padding = 0 - - # Defines width in pixels of frame around the notification window. - # Set to 0 to disable. - frame_width = 0 - - # Defines color of the frame around the notification window. - frame_color = "#788388" - - # Define a color for the separator. - # possible values are: - # * auto: dunst tries to find a color fitting to the background; - # * foreground: use the same color as the foreground; - # * frame: use the same color as the frame; - # * anything else will be interpreted as a X color. - separator_color = "frame" - - # Sort messages by urgency. - sort = yes - - # Don't remove messages, if the user is idle (no mouse or keyboard input) - # for longer than idle_threshold seconds. - # Set to 0 to disable. - # A client can set the 'transient' hint to bypass this. See the rules - # section for how to disable this if necessary - # idle_threshold = 120 - - ### Text ### - - font = Noto Sans 10 - - # The spacing between lines. If the height is smaller than the - # font height, it will get raised to the font height. - line_height = 0 - - # Possible values are: - # full: Allow a small subset of html markup in notifications: - # bold - # italic - # strikethrough - # underline - # - # For a complete reference see - # . - # - # strip: This setting is provided for compatibility with some broken - # clients that send markup even though it's not enabled on the - # server. Dunst will try to strip the markup but the parsing is - # simplistic so using this option outside of matching rules for - # specific applications *IS GREATLY DISCOURAGED*. - # - # no: Disable markup parsing, incoming notifications will be treated as - # plain text. Dunst will not advertise that it has the body-markup - # capability if this is set as a global setting. - # - # It's important to note that markup inside the format option will be parsed - # regardless of what this is set to. - markup = full - - # The format of the message. Possible variables are: - # %a appname - # %s summary - # %b body - # %i iconname (including its path) - # %I iconname (without its path) - # %p progress value if set ([ 0%] to [100%]) or nothing - # %n progress value if set without any extra characters - # %% Literal % - # Markup is allowed - format = "%s %p\n%b" - - # Alignment of message text. - # Possible values are "left", "center" and "right". - alignment = left - - # Vertical alignment of message text and icon. - # Possible values are "top", "center" and "bottom". - vertical_alignment = center - - # Show age of message if message is older than show_age_threshold - # seconds. - # Set to -1 to disable. - show_age_threshold = 60 - - # Specify where to make an ellipsis in long lines. - # Possible values are "start", "middle" and "end". - ellipsize = start - - # Ignore newlines '\n' in notifications. - ignore_newline = no - - # Stack together notifications with the same content - stack_duplicates = true - - # Hide the count of stacked notifications with the same content - hide_duplicate_count = false - - # Display indicators for URLs (U) and actions (A). - show_indicators = yes - - ### Icons ### - - # Align icons left/right/off - icon_position = left - - # Scale small icons up to this size, set to 0 to disable. Helpful - # for e.g. small files or high-dpi screens. In case of conflict, - # max_icon_size takes precedence over this. - min_icon_size = 96 - - # Scale larger icons down to this size, set to 0 to disable - max_icon_size = 128 - - # Paths to default icons. - icon_path = /usr/share/icons/Adwaita/96x96/status/:/usr/share/icons/Adwaita/96x96/devices/ - - ### History ### - - # Should a notification popped up from history be sticky or timeout - # as if it would normally do. - sticky_history = yes - - # Maximum amount of notifications kept in history - history_length = 20 - - ### Misc/Advanced ### - - # dmenu path. - dmenu = /usr/bin/dmenu -p dunst: - - # Browser for opening urls in context menu. - browser = /usr/bin/xdg-open - - # Always run rule-defined scripts, even if the notification is suppressed - always_run_script = true - - # Define the title of the windows spawned by dunst - title = Dunst - - # Define the class of the windows spawned by dunst - class = Dunst - - # Define the corner radius of the notification window - # in pixel size. If the radius is 0, you have no rounded - # corners. - # The radius will be automatically lowered if it exceeds half of the - # notification height to avoid clipping text and/or icons. - corner_radius = 0 - - # Ignore the dbus closeNotification message. - # Useful to enforce the timeout set by dunst configuration. Without this - # parameter, an application may close the notification sent before the - # user defined timeout. - ignore_dbusclose = false - - ### Wayland ### - # These settings are Wayland-specific. They have no effect when using X11 - - # Uncomment this if you want to let notications appear under fullscreen - # applications (default: overlay) - # layer = top - - # Set this to true to use X11 output on Wayland. - force_xwayland = false - - ### Legacy - - # Use the Xinerama extension instead of RandR for multi-monitor support. - # This setting is provided for compatibility with older nVidia drivers that - # do not support RandR and using it on systems that support RandR is highly - # discouraged. - # - # By enabling this setting dunst will not be able to detect when a monitor - # is connected or disconnected which might break follow mode if the screen - # layout changes. - force_xinerama = false - - ### mouse - - # Defines list of actions for each mouse event - # Possible values are: - # * none: Don't do anything. - # * do_action: Invoke the action determined by the action_name rule. If there is no - # such action, open the context menu. - # * open_url: If the notification has exactly one url, open it. If there are multiple - # ones, open the context menu. - # * close_current: Close current notification. - # * close_all: Close all notifications. - # * context: Open context menu for the notification. - # * context_all: Open context menu for all notifications. - # These values can be strung together for each mouse event, and - # will be executed in sequence. - mouse_left_click = close_current - mouse_middle_click = do_action, close_current - mouse_right_click = close_all - -# Experimental features that may or may not work correctly. Do not expect them -# to have a consistent behaviour across releases. -[experimental] - # Calculate the dpi to use on a per-monitor basis. - # If this setting is enabled the Xft.dpi value will be ignored and instead - # dunst will attempt to calculate an appropriate dpi value for each monitor - # using the resolution and physical size. This might be useful in setups - # where there are multiple screens with very different dpi values. - per_monitor_dpi = false - - -[urgency_low] - # IMPORTANT: colors have to be defined in quotation marks. - # Otherwise the "#" and following would be interpreted as a comment. - background = "#263238" - foreground = "#556064" - timeout = 10 - # Icon for notifications with low urgency, uncomment to enable - #new_icon = /path/to/icon - -[urgency_normal] - background = "#263238" - foreground = "#F9FAF9" - timeout = 10 - # Icon for notifications with normal urgency, uncomment to enable - #new_icon = /path/to/icon - -[urgency_critical] - background = "#D62929" - foreground = "#F9FAF9" - frame_color = "#ff0000" - timeout = 0 - # Icon for notifications with critical urgency, uncomment to enable - #new_icon = /path/to/icon - -# Every section that isn't one of the above is interpreted as a rules to -# override settings for certain messages. -# -# Messages can be matched by -# appname (discouraged, see desktop_entry) -# body -# category -# desktop_entry -# icon -# match_transient -# msg_urgency -# stack_tag -# summary -# -# and you can override the -# background -# foreground -# format -# frame_color -# fullscreen -# new_icon -# set_stack_tag -# set_transient -# set_category -# timeout -# urgency -# skip_display -# history_ignore -# action_name -# word_wrap -# ellipsize -# alignment -# -# Shell-like globbing will get expanded. -# -# Instead of the appname filter, it's recommended to use the desktop_entry filter. -# GLib based applications export their desktop-entry name. In comparison to the appname, -# the desktop-entry won't get localized. -# -# SCRIPTING -# You can specify a script that gets run when the rule matches by -# setting the "script" option. -# The script will be called as follows: -# script appname summary body icon urgency -# where urgency can be "LOW", "NORMAL" or "CRITICAL". -# -# NOTE: It might be helpful to run dunst -print in a terminal in order -# to find fitting options for rules. - -# Disable the transient hint so that idle_threshold cannot be bypassed from the -# client -#[transient_disable] -# match_transient = yes -# set_transient = no -# -# Make the handling of transient notifications more strict by making them not -# be placed in history. -#[transient_history_ignore] -# match_transient = yes -# history_ignore = yes - -# fullscreen values -# show: show the notifications, regardless if there is a fullscreen window opened -# delay: displays the new notification, if there is no fullscreen window active -# If the notification is already drawn, it won't get undrawn. -# pushback: same as delay, but when switching into fullscreen, the notification will get -# withdrawn from screen again and will get delayed like a new notification -#[fullscreen_delay_everything] -# fullscreen = delay -#[fullscreen_show_critical] -# msg_urgency = critical -# fullscreen = show - -#[espeak] -# summary = "*" -# script = dunst_espeak.sh - -#[script-test] -# summary = "*script*" -# script = dunst_test.sh - -#[ignore] -# # This notification will not be displayed -# summary = "foobar" -# skip_display = true - -#[history-ignore] -# # This notification will not be saved in history -# summary = "foobar" -# history_ignore = yes - -#[skip-display] -# # This notification will not be displayed, but will be included in the history -# summary = "foobar" -# skip_display = yes - -#[signed_on] -# appname = Pidgin -# summary = "*signed on*" -# urgency = low -# -#[signed_off] -# appname = Pidgin -# summary = *signed off* -# urgency = low -# -#[says] -# appname = Pidgin -# summary = *says* -# urgency = critical -# -#[twitter] -# appname = Pidgin -# summary = *twitter.com* -# urgency = normal -# -#[stack-volumes] -# appname = "some_volume_notifiers" -# set_stack_tag = "volume" -# -# vim: ft=cfg diff --git a/dot_config/hypr/hypridle.conf.tmpl b/dot_config/hypr/hypridle.conf.tmpl deleted file mode 100644 index d475c9e..0000000 --- a/dot_config/hypr/hypridle.conf.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -general { - lock_cmd = pidof hyprlock || hyprlock # avoid starting multiple hyprlock instances. - before_sleep_cmd = loginctl lock-session # lock before suspend. - after_sleep_cmd = hyprctl dispatch dpms on # to avoid having to press a key twice to turn on the display. -} -{{- if gt .hypridle.screen_dim 0 }} - -# dim screen -listener { - timeout = {{ .hypridle.screen_dim }} - on-timeout = brightnessctl -s set 10 # set monitor backlight to minimum, avoid 0 on OLED monitor. - on-resume = brightnessctl -r # monitor backlight restore. -} -{{- end }} -{{- if gt .hypridle.keyboard_backlight_dim 0 }} - -# turn off keyboard backlight, comment out this section if you don't have a keyboard backlight. -listener { - timeout = {{ .hypridle.keyboard_backlight_dim }} - on-timeout = brightnessctl -sd chromeos::kbd_backlight set 1 # turn off keyboard backlight. - on-resume = brightnessctl -rd chromeos::kbd_backlight # turn on keyboard backlight. -} -{{- end }} -{{- if gt .hypridle.screen_lock 0 }} - -# lock screen -listener { - timeout = {{ .hypridle.screen_lock }} - on-timeout = loginctl lock-session # lock screen when timeout has passed -} -{{- end }} -{{- if gt .hypridle.screen_off 0 }} - -# turn off the screen entirely -listener { - timeout = {{ .hypridle.screen_off }} - on-timeout = hyprctl dispatch dpms off # screen off when timeout has passed - on-resume = hyprctl dispatch dpms on && brightnessctl -r # screen on when activity is detected after timeout has fired. -} -{{- end }} -{{- if gt .hypridle.suspend 0 }} - -# suspend the machine -listener { - timeout = {{ .hypridle.suspend }} - on-timeout = systemctl suspend # suspend pc -} -{{- end }} diff --git a/dot_config/hypr/hyprland.conf.tmpl b/dot_config/hypr/hyprland.conf.tmpl deleted file mode 100644 index f1b1b4d..0000000 --- a/dot_config/hypr/hyprland.conf.tmpl +++ /dev/null @@ -1,387 +0,0 @@ -################ -### MONITORS ### -################ - -# See https://wiki.hypr.land/Configuring/Monitors/ - -{{ if .hyprland.primaryMonitorConfig.output -}} -# Primary monitor -monitorv2 { - output = {{ .hyprland.primaryMonitorConfig.output }} - mode = {{ default "preferred" .hyprland.primaryMonitorConfig.mode }} - position = {{ default "auto" .hyprland.primaryMonitorConfig.position }} - scale = {{ default "auto" .hyprland.primaryMonitorConfig.scale }} -} -{{- end }} - -{{- range .hyprland.externalMonitors }} - -{{ if .comment -}} -# {{ .comment }} -{{ end -}} -monitorv2 { - output = {{ .output }} - mode = {{ .mode }} - position = {{ .position }} - scale = {{ .scale }} -} -{{- end }} - -# Sensitive default for arbitrary new monitor -monitor=,preferred,auto,auto - - -################### -### MY PROGRAMS ### -################### - -# See https://wiki.hypr.land/Configuring/Keywords/ - -# Set programs that you use -$terminal = kitty -$fileManager = pcmanfm -$menu = rofi -show drun -drun-show-actions - - -################# -### AUTOSTART ### -################# - -# Autostart necessary processes (like notifications daemons, status bars, etc.) -# Or execute your favorite apps at launch like this: - -# exec-once = $terminal -# exec-once = nm-applet & -# exec-once = waybar & hyprpaper & firefox - - -############################# -### ENVIRONMENT VARIABLES ### -############################# - -# See https://wiki.hypr.land/Configuring/Environment-variables/ - -env = XCURSOR_SIZE,24 -env = HYPRCURSOR_SIZE,24 - - -################### -### PERMISSIONS ### -################### - -# See https://wiki.hypr.land/Configuring/Permissions/ -# Please note permission changes here require a Hyprland restart and are not applied on-the-fly -# for security reasons - -ecosystem { - no_update_news = 1 - no_donation_nag = 1 - # enforce_permissions = 1 -} - -# permission = /usr/(bin|local/bin)/grim, screencopy, allow -# permission = /usr/(lib|libexec|lib64)/xdg-desktop-portal-hyprland, screencopy, allow -# permission = /usr/(bin|local/bin)/hyprpm, plugin, allow - - -##################### -### LOOK AND FEEL ### -##################### - -# Refer to https://wiki.hypr.land/Configuring/Variables/ - -# https://wiki.hypr.land/Configuring/Variables/#general -general { - gaps_in = 5 - gaps_out = 20 - - border_size = 2 - - # https://wiki.hypr.land/Configuring/Variables/#variable-types for info about colors - col.active_border = rgba(33ccffee) rgba(00ff99ee) 45deg - col.inactive_border = rgba(595959aa) - - # Set to true enable resizing windows by clicking and dragging on borders and gaps - resize_on_border = false - - # Please see https://wiki.hypr.land/Configuring/Tearing/ before you turn this on - allow_tearing = false - - layout = dwindle -} - -# https://wiki.hypr.land/Configuring/Variables/#decoration -decoration { - rounding = 10 - rounding_power = 2 - - # Change transparency of focused and unfocused windows - active_opacity = 1.0 - inactive_opacity = 1.0 - - shadow { - enabled = true - range = 4 - render_power = 3 - color = rgba(1a1a1aee) - } - - # https://wiki.hypr.land/Configuring/Variables/#blur - blur { - enabled = true - size = 3 - passes = 1 - - vibrancy = 0.1696 - } -} - -# https://wiki.hypr.land/Configuring/Variables/#animations -animations { - enabled = true - - # Default animations, see https://wiki.hypr.land/Configuring/Animations/ for more - - bezier = easeOutQuint,0.23,1,0.32,1 - bezier = easeInOutCubic,0.65,0.05,0.36,1 - bezier = linear,0,0,1,1 - bezier = almostLinear,0.5,0.5,0.75,1.0 - bezier = quick,0.15,0,0.1,1 - - animation = global, 1, 10, default - animation = border, 1, 5.39, easeOutQuint - animation = windows, 1, 4.79, easeOutQuint - animation = windowsIn, 1, 4.1, easeOutQuint, popin 87% - animation = windowsOut, 1, 1.49, linear, popin 87% - animation = fadeIn, 1, 1.73, almostLinear - animation = fadeOut, 1, 1.46, almostLinear - animation = fade, 1, 3.03, quick - animation = layers, 1, 3.81, easeOutQuint - animation = layersIn, 1, 4, easeOutQuint, fade - animation = layersOut, 1, 1.5, linear, fade - animation = fadeLayersIn, 1, 1.79, almostLinear - animation = fadeLayersOut, 1, 1.39, almostLinear - animation = workspaces, 1, 1.94, almostLinear, fade - animation = workspacesIn, 1, 1.21, almostLinear, fade - animation = workspacesOut, 1, 1.94, almostLinear, fade -} - -# Ref https://wiki.hypr.land/Configuring/Workspace-Rules/ -# "Smart gaps" / "No gaps when only" -workspace = w[tv1], gapsout:9, gapsin:0 -workspace = f[1], gapsout:0, gapsin:0 -windowrule { - name = smartgaps1 - - match:workspace = w[tv1] - - rounding = 10 - -} -windowrule { - name = smartgaps2 - - match:workspace = w[tv1] - - border_size = 2 -} -windowrule { - name = smartgaps3 - - match:workspace = f[1] - - border_size = 0 -} -windowrule { - name = smartgaps4 - - match:workspace = f[1] - - rounding = 0 -} - -# See https://wiki.hypr.land/Configuring/Dwindle-Layout/ for more -dwindle { - preserve_split = true # You probably want this -} - -# See https://wiki.hypr.land/Configuring/Master-Layout/ for more -master { - new_status = master -} - -# https://wiki.hypr.land/Configuring/Variables/#misc -misc { - force_default_wallpaper = 0 # Set to 0 or 1 to disable the anime mascot wallpapers - disable_hyprland_logo = true # If true disables the random hyprland logo / anime girl background. -} - - -############# -### INPUT ### -############# - -# https://wiki.hypr.land/Configuring/Variables/#input -input { - kb_layout = us,de - kb_variant = - kb_model = - kb_options = - kb_rules = - - follow_mouse = 1 - - sensitivity = 0 # -1.0 - 1.0, 0 means no modification. - - touchpad { - natural_scroll = true - } -} - -# See https://wiki.hypr.land/Configuring/Gestures -gesture = 3, horizontal, workspace - -# Example per-device config -# See https://wiki.hypr.land/Configuring/Keywords/#per-device-input-configs for more -device { - name = epic-mouse-v1 - sensitivity = -0.5 -} - - -################### -### KEYBINDINGS ### -################### - -# See https://wiki.hypr.land/Configuring/Keywords/ -$mainMod = ALT - -# Example binds, see https://wiki.hypr.land/Configuring/Binds/ for more -bind = $mainMod, Q, exec, $terminal -bind = $mainMod, C, killactive, -bind = $mainMod, M, exec, hyprshutdown -bind = $mainMod, E, exec, $fileManager -bind = $mainMod SHIFT, E, exec, kitty ranger -bind = $mainMod, V, togglefloating, -bind = $mainMod, R, exec, $menu -bind = $mainMod, P, pseudo, # dwindle -# bind = $mainMod, J, togglesplit, # dwindle -bind = $mainMod, F, fullscreen, 1 # toggle fullscreen for active window - -# Move focus with mainMod + arrow keys -bind = $mainMod, left, movefocus, l -bind = $mainMod, right, movefocus, r -bind = $mainMod, up, movefocus, u -bind = $mainMod, down, movefocus, d - -# Switch workspaces with mainMod + [0-9] -bind = $mainMod, 1, workspace, 1 -bind = $mainMod, 2, workspace, 2 -bind = $mainMod, 3, workspace, 3 -bind = $mainMod, 4, workspace, 4 -bind = $mainMod, 5, workspace, 5 -bind = $mainMod, 6, workspace, 6 -bind = $mainMod, 7, workspace, 7 -bind = $mainMod, 8, workspace, 8 -bind = $mainMod, 9, workspace, 9 -bind = $mainMod, 0, workspace, 10 - -# Move active window to a workspace with mainMod + SHIFT + [0-9] -bind = $mainMod SHIFT, 1, movetoworkspace, 1 -bind = $mainMod SHIFT, 2, movetoworkspace, 2 -bind = $mainMod SHIFT, 3, movetoworkspace, 3 -bind = $mainMod SHIFT, 4, movetoworkspace, 4 -bind = $mainMod SHIFT, 5, movetoworkspace, 5 -bind = $mainMod SHIFT, 6, movetoworkspace, 6 -bind = $mainMod SHIFT, 7, movetoworkspace, 7 -bind = $mainMod SHIFT, 8, movetoworkspace, 8 -bind = $mainMod SHIFT, 9, movetoworkspace, 9 -bind = $mainMod SHIFT, 0, movetoworkspace, 10 - -# Move active window to a workspace without switching to the new workspace with mainMod + CTRL + SHIFT + [0-9] -bind = $mainMod CTRL SHIFT, 1, movetoworkspacesilent, 1 -bind = $mainMod CTRL SHIFT, 2, movetoworkspacesilent, 2 -bind = $mainMod CTRL SHIFT, 3, movetoworkspacesilent, 3 -bind = $mainMod CTRL SHIFT, 4, movetoworkspacesilent, 4 -bind = $mainMod CTRL SHIFT, 5, movetoworkspacesilent, 5 -bind = $mainMod CTRL SHIFT, 6, movetoworkspacesilent, 6 -bind = $mainMod CTRL SHIFT, 7, movetoworkspacesilent, 7 -bind = $mainMod CTRL SHIFT, 8, movetoworkspacesilent, 8 -bind = $mainMod CTRL SHIFT, 9, movetoworkspacesilent, 9 -bind = $mainMod CTRL SHIFT, 0, movetoworkspacesilent, 10 - -# Example special workspace (scratchpad) -bind = $mainMod, S, togglespecialworkspace, magic -bind = $mainMod SHIFT, S, movetoworkspace, special:magic - -# Scroll through existing workspaces with mainMod + scroll -bind = $mainMod, mouse_down, workspace, e+1 -bind = $mainMod, mouse_up, workspace, e-1 - -# Move/resize windows with mainMod + LMB/RMB and dragging -bindm = $mainMod, mouse:272, movewindow -bindm = $mainMod, mouse:273, resizewindow - -# Laptop multimedia keys for volume and LCD brightness -bindel = ,XF86AudioRaiseVolume, exec, ~/bin/sound.sh "volume" "+5%" -bindel = ,XF86AudioLowerVolume, exec, ~/bin/sound.sh "volume" "-5%" -bindel = ,XF86AudioMute, exec, ~/bin/sound.sh "mute" "toggle" -bindel = ,XF86AudioMicMute, exec, ~/bin/sound.sh "mute" "toggle" -bindel = ,XF86MonBrightnessUp, exec, ~/bin/backlight.sh "+5%" -bindel = ,XF86MonBrightnessDown, exec, ~/bin/backlight.sh "-5%" - -# Requires playerctl -bindl = , XF86AudioNext, exec, playerctl next -bindl = , XF86AudioPause, exec, playerctl play-pause -bindl = , XF86AudioPlay, exec, playerctl play-pause -bindl = , XF86AudioPrev, exec, playerctl previous - -# Other XF86 key bindings -bindl = , XF86RFKill, exec, ~/bin/rfkill-toggle.sh - -# Bindings for making screenshots -bind = , Print, exec, grimblast --notify save area "$(xdg-user-dir PICTURES)/$(date --utc '+%F_%H.%M.%S').png" -bind = $mainMod, Print, exec, grimblast --notify copy area -bind = CTRL, Print, exec, grimblast --notify save active "$(xdg-user-dir PICTURES)/$(date --utc '+%F_%H.%M.%S').png" -bind = $mainMod CTRL, Print, exec, grimblast --notify copy active - - -############################## -### WINDOWS AND WORKSPACES ### -############################## - -# See https://wiki.hypr.land/Configuring/Window-Rules/ for more -# See https://wiki.hypr.land/Configuring/Workspace-Rules/ for workspace rules - -# Example windowrule -windowrule { - name = kitty - - match:class = ^(kitty)$,title:^(kitty)$ - - float = on -} - -# Ignore maximize requests from apps. You'll probably like this. -windowrule { - name = suppressevent - - match:class = .* - - suppress_event = maximize -} - - -# Fix some dragging issues with XWayland -windowrule { - name = xwayland_fix - - match:class = ^$ - match:title = ^$ - match:xwayland = true - match:pin = false - - float = true - fullscreen = false - no_focus = true -} diff --git a/dot_config/hypr/hyprlock.conf.tmpl b/dot_config/hypr/hyprlock.conf.tmpl deleted file mode 100644 index 1fb51b7..0000000 --- a/dot_config/hypr/hyprlock.conf.tmpl +++ /dev/null @@ -1,106 +0,0 @@ -# Refer https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock -$font = Monospace - -general { - hide_cursor = false - ignore_empty_input = true - immediate_render = false - text_trim = true - screencopy_mode = 0 - fail_timeout = 2000 # 2 seconds -} - -auth { - pam { - enabled = true - module = hyprlock - } - {{- if .hyprlock.fingerprint_enabled }} - fingerprint { - enabled = true - ready_message = Scan fingerprint to unlock or enter password - present_message = Scanning... - retry_delay = 250 # in milliseconds - } - {{- end }} -} - -animations { - enabled = true - bezier = linear, 1, 1, 0, 0 - animation = fadeIn, 1, 5, linear - animation = fadeOut, 1, 5, linear - animation = inputFieldDots, 1, 2, linear -} - -background { - monitor = - path = screenshot - blur_passes = 3 -} - -input-field { - monitor = - size = 20%, 5% - outline_thickness = 3 - inner_color = rgba(0, 0, 0, 0.0) # no fill - - outer_color = rgba(33ccffee) rgba(00ff99ee) 45deg - check_color = rgba(00ff99ee) rgba(ff6633ee) 120deg - fail_color = rgba(ff6633ee) rgba(ff0066ee) 40deg - - font_color = rgb(143, 143, 143) - fade_on_empty = false - rounding = 15 - - font_family = $font - placeholder_text = {{ if .hyprlock.fingerprint_enabled -}} $FPRINTPROMPT {{- else -}} $PAMPROMPT {{- end }} - fail_text = {{ if .hyprlock.fingerprint_enabled -}} $FPRINTFAIL {{ end -}} $PAMFAIL - - # uncomment to use a letter instead of a dot to indicate the typed password - # dots_text_format = * - # dots_size = 0.4 - dots_spacing = 0.3 - - # uncomment to use an input indicator that does not show the password length (similar to swaylock's input indicator) - # hide_input = true - - position = 0, -20 - halign = center - valign = center -} - -# TIME -label { - monitor = - text = $TIME # ref. https://wiki.hyprland.org/Hypr-Ecosystem/hyprlock/#variable-substitution - font_size = 90 - font_family = $font - - position = -30, 0 - halign = right - valign = top -} - -# DATE -label { - monitor = - text = cmd[update:60000] date +"%A, %d %B %Y" # update every 60 seconds - font_size = 25 - font_family = $font - - position = -30, -150 - halign = right - valign = top -} - -label { - monitor = - text = $LAYOUT[en,de] - font_size = 24 - onclick = hyprctl switchxkblayout all next - - position = 0, 80 - halign = center - valign = center -} diff --git a/dot_config/hypr/hyprpaper.conf b/dot_config/hypr/hyprpaper.conf deleted file mode 100644 index 04eafbd..0000000 --- a/dot_config/hypr/hyprpaper.conf +++ /dev/null @@ -1,6 +0,0 @@ -splash = false -wallpaper { - monitor = - path = ~/.config/hypr/screensaver.jpeg - fit_mode = cover -} diff --git a/dot_config/hypr/screensaver.jpeg b/dot_config/hypr/screensaver.jpeg deleted file mode 100644 index c7f5b8ab0e18aa52f1e904be90897c5b8107caa1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 181886 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

$rS&K8gM=4=2GQ2b7)hVTRowh^6 z0Bxl@OmH`=R>{>DmD-$v zv)(4gsPh97bTU|-#6DxOH9hO-)XW8_Agy_bcivypowUuIzIB6u^Dr^>3V@$RazfgZ zR}2l#irA82ZRJi?ISmaEo zzXZ3DyLR_7C7tl=0$ zhtD(*tW-v#4eef$r~F`^cLXzKZUEv2TfM&zTO-pV$PX!94l9fyecGvCSK}b=UTqrgPw#(!EiTRy(8~ zMGzKR;avftbU~VTo#v{MKg}Y~wTx4P0kDd)1 zmH)_d)jrxZ+j-V+-BkIImDjvb*M~a(C9;OO2U(Uda@LUr>|JBR`*_N|vl6d#9+j}% ziaBbFO>^P1r|3nOGK~F*K#Njn0I5oRc$iPQ_-B$cDR(2mF(%IQma;93DJ;a4D!Crm zBajso7UTp})!z$kMORZ%?8=34E@9|4Zj8CJnYfAy(`?zfQDf|sPdF8_L%3C+G>Pb#Y%0Eqio7z_JRWcl#=d zb;AK*$hc7|*`u*gcKTnG zeWx9H)q21UcLnNj5!{sMDYk8}C*&LFHv7axWrq!+t%pJ{T!8!c4#m6gcBOxesL9m$ z+<7*ex3I!LHg)GBL8v7c#qI)F(yJrblZFD`1!Jii$0?%NsB4q^2XcOm{%4EN;^c2B zw1m@v*s1Y~f{`7fs}=|BWGhdK8&V{F7w2z#?gu@)#-_l4-!010R&-M?1c-Oaz5b3o zpIRADEVmEj4Cl`Tqse%Tz0ETrze>3ZR7snb}{Dd4lI4O>h9Yji*najy_@Q|;rg}k6FpiUlUrT( z`Ofm)F6QOwbb*d{^iZzr;^;q==(VkrikD>o2(3paPf;C;tSmZLhS%Nj|566!njrRF zR%8Q!wku7hNo zhBOsQaU`i;X-7C8l3k_zW)ig+?4{K7H&NKQA_E#~g!(^I0lN8`93%wbYL}BSgZlqW zF&*E`8~}-OZ;&fly9)zhw9lrox;CM`dLa()mf}kb1DnOr5%Z5J4c}YN=7{8$w_2@($Qy|6{$&X}sBO0T6faF;l-; zM#n6d=1-2ttI*q~yG9?jVCj!raaGWi2#9s>=9isvt$1MbA6n8k75wkG2urMy&n*Kw z8ox)qqlkeB$j1K+phklM^+?G#R*5QWzaEk`0d>I!DPY|Hfr{#^2g>`(HY>_Th9Lmf z!C8)S9<0%SOhrtR5tBi5&0Yd*p>lq{%^@(b4p&Udn>F0gJN=DeaN~`dpTh04d3=H* z+zo59#jq}m?*Q69T@FOwOGE`G!R=;(5DY~<=+B313%$1o*S+0LoyL4dvh*(%88|&_ zS-I>VZkEwyWO?R`%8SQvzO7N^woN)YnW_1|*n1bRq|^29zrEX2d#1AOIBMl-CQHZ6 zOwA)IdnU~$59~6}r%B8cBB^;qVb3^aYQm)D357;e^MGiIXJpzQh!n{aC@7>T<^d7$ zfFR8CneX#F>v?|v!FT=E!%{!2C9DtJAGq)Px~}*2eod7-8rx&>Y)1C4%%Uj$5RYg1 z7uzF?@}j(rJQAF(^Ibfv_~7{Yn%|fPBiJoqy0=<&MdJV|H{uKQ$HzH*MWh!Wodi_3 zZ0^a9t@atcXwGn-Q$Auep@=VG0ipfu#Lf$oK35ZD9(TP4MWdrlSt&6Jlb>=5UJVaM zd@7-7e_Pc4UGucAx9ml%!D0}e`EJ|E0`N0Bi%5-1f@Q8ceQW-);tsfHT!$!@Rhppm+VfYSVtq^NdB*LN zW`e%ay?>R&rEZF6Re5tt!_;qV^?EldtF77+zU+QBSaxo1_#Plu29=iBNkFF8^wWIwFY>~ax78m`o8Rm)a@9)ps*d z9(=tnN)U>TQQlmp!&*UWjDDm2&Wn6Ul5FtE9Bc8)e@X%?;%&Q)3LTTxpqciQI|N^OB@kBdJstN%Fi)(*Y-z0)0)SYCZ-T%uZQJh=b$=h>2dkPc?wpy=ZL z2C|DYNYP}d-0zZet0Lwb^-k!7gbmk;~oz1nRTgstOCNp2tKUKF(A z2X2*x=f4QSMw$P0ne%O}4<7a!e8RpZ=vDfLCOInVxYJoH7Z+E7R+g^%<4LZ9>vi(a zb7@=ydbsecl0|c^*j>o!@^R|bU952~~mWkvZ-(GB!03PE`<@@{a z7qw6!6dmw+f)> z1^9i2+_@B5G#SQ-5tQZT9?r;uzv|2Mpk;6Xr+)BNE*`Ar0nVX3p$Cw<>j>7! zL0U!_$}y@Pun3J&8t%WW+mLwV=*)pcxz^*Z8`!e_*AMJScst=vV-|MGdz}nhXG*#U zzr7<)q8Z%k>WuAAlTYqvbwn)|g*k^lT}XoFBOMNvP6_~uqv%0e4=r=|IUP^L5}xr2 zm3K;(!pJx9-3DYKXOj}ND=fgs8<(d#LV*N|`Cwp?1t7M_OnH=i_+(w@SoJ0;FgztF z6&?|>&xCGtm{1ZM$cr_Oc)UqmL$U<+CgUJcnbIrMW=-TE{G=v8)e%z0o1_Xpj>YfO}PL*4$W zWKtEZ@I+BGnU3-kl=Kyul$n^4>L^vJQsY(}J0P#Z4PVK_4Mj@q1M1rR{m-V7tfm}y zn138`PKWHwt=q`Xsb=)MX*;{A_Y;^hFytrZ0l36~en)k|Im-%I+D}TtWN$9>zY{`9 zEhzxY4R766hAFdSB+NW+WKXxuK|QXN%R6x1%0`J?o`PD@xps#vbH_A z_i-6vt$+f&wLP;o{Lnh&*;w{&YJN|43Pl*dx=xX{TkGL`SY404&>t|+oZ)_^ozl?N z`qwEyVH2`f>xW}294ee%xe^MJ`8e2D5iw9`IHG^+&?7T5(5MxJI!o;c5{4a;$kY$1_Z$8=GN`>1GWN$2 zQI~jU)cyE)*y@Q#Dk4>?=EpF0ly2W!jki}Vhk$7YJb^qr84ZR=0mk(5^2(vZA4gpK zAcu-#z(fF8qK>1R!zK)XO{O)VOR>!1xvEA^Uqufaz5+rM-#4xDweuNP4M0s!iv1Ok zpY)s<=g%JfMhF~6`S~qgSG@cPev33%wRTrqD?n!`@%nv)T4~5T2VUj$n)!LR8tgOc1En&X4&@b@U7;tKR)SP_k)ugzUL@Nke8l4W!< zF@y;7;CB8J_BWS1<4!AMli4pn`E59=zS5ColD#8Ul{GSY`#sqHiJ#Vb-eUW6x|JKzB@Ax^Z-s=<~HMZ zSE7z}*37$!0}c5FW|_cVAS7S3NHz^q#t_Y&s@s7xNi;a)JBVX(s;US2(~((aGt5G$ zV$N=BDW8MR3ZFIA*vBZV(2svS;Bi`T2Jf!03kDP1ggf|-b-3TXZdWj5h%rC(12?9j zK_dcun`d52f^J<}$!n5&+93uo{c)jy(9xd^BfsD7-a2qOyoXyH(C}Bn zHt*3bEcVOrqoiiVnYN5<@|oH;cs%I(vCv6%u36Sbkyaar232TH0hYZ4F1>C1aTR8;%9Ojm?9E!TiJq zv&lrf;dBVdAISAeH0hF*R||rkLWT8Pj>N+XTTBae50v`1vpf2ylVb0fsaq4w|DNa3 z6q>@HCH>ZyYWTx`XAdd?IjJcwc7D7!$1E~! zZ|<;j=am-4bsfE0r3oh38{Vf3N<*GKAKK71Z79=>yxQ&ASbx>#;P48Zhkea!8``|= zLXJPoehF1L?2a_bo5wTf&>rDbymc7_aIDhEn2e-F6Q(ziYWG8_vVV;4;f?0r zBb>o=54z&`wqJW6G<^N3Ek1g@^|tUfjX&y7ahnNzJm3tG)Vj`@`7S3U`d}`2FDx!P zXiN0o#dr+sgBn|wMt*LMu02b=h_QuUxmiZTWZIJVuTF%UTiAnKSO^ra-wlvw8hpQ# z(sH-9Uk>HHt%9uI?19f1HAg1S*GY4H*k>`V{50|>PqXrpl>%SPz_j0f#nADz!3O89)h{O{{M_T?YuYU zUIiMd2Nh{1x?1*dTarV1M6ailTT0wu9U8%d9*Hvx;^Evn^JN`#R-fSk5nZL-z5s0kIuzRZjbFS%}}Rb+o1xB z%f~RPlat{1nZw0yYGc1?pb^?%MtA}TZC5W{M$|baN!T--_JFgZupX-qJ#EM_|L(zp zjLk=YlSh+3vK2LgP7XN9%C+rS;dJ{1&k{5~|1z(;Al@t$HVMAj!%==Sj(Yt-kO!w+PdOL+a-*V(aCk$xXjwU}V^HCe}M~ z7o*&b`D)3627n-MyowL&MB~Q+1hXGg^m%F&sIER^|COZsjAcuR4vTev>1$dm!^#3F zj=I@eK01Um#GBNL8g`zV2QeP$&pVFmKB9Q|+@HMdtL4AGjnzQBw&K^K7*@c|*y5*92gT;<3 z0{6fi#!2b{xe}luM^9)tg&JEy`2U{DPu}tJ!f8U0NzE1tUvOC>s(p^RTkGW#+iLML zWCdq=X$00ghWy5+Crv0;-|c5LV?mg?36FLVI*_Doo`Zpt15nTH;4oVb)!fak~+A!y%gz#)< z7-aD9j`N2Ku$F#Mwm`LXU?QS$Pn^)Gd&pa;Sl2WDvD-X<_V1NQ(hVF}VXg~g7YJ{2 zo{hf=u`gc~tu-`=6sh6TjJ%h8VGnzH^9?ol0k3$gC!lqCZfWPLSR78%(CgM~>XKDF zEFTyqA}bAf(ziAEzS7`I1($Ftfa zhj5|iCwUd=H?aFLp#3M@7zdCa&!6 z29nPwkEC=1N_+*7KJ-4sb^e~<-{q{4yRhZkJ~S-hl;8G$f{|vQGJ$yvx_EFTNJ#V( zG2#h{ndL6*)~)C?d$%0`hlL?ip^=f3yv)S=l=`r>8Y426-JUtB!hNY?FjeYG_dkyO zwTG>$;BZF%ziMjSUt|bieVq6F#AXj`)t(KR=VWZTXwv;|;3K!&UW#|Kw;*`z^bdTw2yLyipK|v2Wg0 z>^D|T%q$lH-yHAu9MhntMsCqkYs?6>X*%Z*1>EkEJMK7vko;~L=r z2J)Qmb(7Ax*%Q~|L)tFwR5*tPQiofQM>5BsbZ1o1zJv`gZKXA=R;n#Ed^%XJu4myJ zGhQ%v&2Qdk4*)g+$`rg%80)QuuRYmXKRj&5$d1H|BzKa$zxr4{$hHQ|-KBjxI!+f? zJO8;gcl_?+ETjG%45<^?Q%Z{Cg3iY5>fo0a8N{@j$ms#(uzy+JL>uo-6H@_5h@*f_ zpJwy$A4e2dfV}B^E|98&8sze23qwG@!jAvPk#8Er8`v!%N2zIlT2%z3sF#x))9NTF z=PdXng)9JHgCTEJvwv+jd(470cg#q`gID}Fa0kJWw8AMnhA1dP-t^DWrTUVh=AoJK zgtNqKZOdt0_xDLj<$hE8<-6up-D3vCp57?$q@ocjDN`5!IM_zq_S-c^j@HzVlT)_{_Ffus_M8ay@X6tEW9CM^De$noQ`K5!>pkLoQ28t|RmVJ?_nkbBsdL8LgeD zDSCznvl52cC$4Jn?$?|~>|$sWl=_)0x6Ya7VLDsqF&Z+G#WHv6G`ex(;`vi&&lCe; zO@|NW{Y)F|;#2CrpG!q%*MwPccdSTrdgpjudS!goM_Dt%ix+r^$Mo}@m9;Q&I8o%D zQuc&m6xm5im$ZAh|B&8q4*g~MK;JOl5hynI$!DF7S`n~|joM8??F_iOMu5Ttk|qnK zZ2-b$fQR(QktaRi_01+Wc*t$v90;Q32%mIL@VAzg<4J^%F~IuF^6qQ{Y+O!H1KXk( z;;^0Sc9OXlwaXdUepk==$&D_8*`xg z-GWf`m*q$#<2k;qBKA) zfcw1~MAOpwx`8G0)0sf9)`gi8^Bd1#;@SrAmkiD)MSTN-#KNa7{=QSB21k22xE~w7 z++`KM*upl_oe}3>0j2zDHE$Zr0sFVR&^EtUdN6XJ&2pU0$u4O)oqnHexkyQbQjor& zKY3o&0>V;1o}zn!E1P2-H$G~W^KQ5??*gEM>GrJ^2x$!sv9&nK z{Qxp*+Q-|+(a+UU3USOzTVZxK<{FzFrgEW{g*k1>ryO%YT|b@o-i;1j&&~Pi*OBly z55h-rReJ*Y%GLo(rw?l|v?AGYAqY;VzU6{J@x@Ds1ac`QMd4AR+oC4Pp zX%y*6CiWiLpUy`8CLNRmvD!Uk)Q#yLL}T33p5F)^$A^t~JEnLVa`4Uq7HQ{Y`$nkh9Vu;cD7gZe)283;@0L zSz@rm^X53a!@jyJtl`HFfVq}qqfLVb`g$4$*S8&VkJX3LHw=^%&OBIGI$4-g&7K*&pbx;B7dn|N@ zsPRqS3#OS_Akn4-kny$(+JbLCo*F1|YVlmRrrFS()dSO5m-T;J!yLu!6qQglvqH@L zr#lFGv@ob9(80*{vVnSX>BCaZ1eMUYl!}i({!h{G@yHP-pj_&r+OkFv^z(T6gA~+g3gG z$*W_Ky3~~ceU<)9(oi^SnoD!e;QBO;y4I=r=a%n3AxG|t^+N>SJ$|qE9lY^^1ID-8 z^tzJ%U@K?qS$1EVkllBfl0OmEKFWZl5o-ZcoQ?H)y%P(N^5D?Mc|8kW8me?BtK#lS zo9SOhhKI(umS<*C(uFohv)1i()c%U{LaFV(f4NS{Z&)_}z2vFz#-$KZ@fGmr27yyv zgf;MOzwM54M-57>{Rxrf;*l&gq0hyjfPC!|n_*bFWL;q@G3z-`z8_ zw~Uh@`bg#Hsec3&Hh zGCBG=DZ)zQM`?siNWrs5CQDTHO#U6%{l%UWRq4SM{XB4#zR-Pamuz0>h{(*y z$mk@BZW1o1OX1-|c~GW}Nt1^Q^7;pq;ZL(PdUBngWJX2|Qp{SnPV^*mn!$`)OC0VD z_KQ(kTxkOAKE2R*Kr3*RnHIIp-ZpQ@pqkh2xDhr`B|@)qO6;cAZjTx?S2-QjM3wO^8tqG~o?!ut?H1+n5yv~U5m&xh!hb!vV zd)uz&dA;2dXoa2FBUM69PL`zB_J#Hb80}LU!_Ilu7;kLG%R_Np8Rf!-PT0AcZaMod zH#>BMF!bYVTySRXE<=9a=Xr^CuC@Q-azDa5s{DXFG?K|4a`ba!naip_@OXe= z=2>dEvZ0Zj!B|iBPMqc@`@{oY4k4OJ5XYpkp@%i**qWZ$GSk@5isPr;Cw9w2OGtV| zE#i7KfPO43CBy%8YOv7w!t^yfNP4)u8p|sd+Jk_9k>Nq{E9IPy+)@Ca2i*QN0z+QL zeq4!QCqvTLXS1rE9sTqH}6gS%t|NUXwTquR9D~V;>Ix8w9 z%&)xtCJ8luvYaW-+>QVSxUvniVwPo%H}vA{t(MDK2j^K&(;8u;ZtE5X2I;Z@{hW>U zwOw9+NRuqN6*a~q^%Bgk3i3S@_HyZk)2}>K&#W}S)n8<`30oA}@1km~>`r#r+UF1m zlg;0~Us!PkI7_z?P3<^s(|iX_?s&v)SA}03+ozE%@#LnOO*1ve{d6Ohr`a>pJG9ys z_>T-CzI4BDYlW6+AG1t{a~vg0L`3LrX?yAuv4+N8u?`@mPXUsfgb@->E7OmWO}nD| zd;~L3elRFoqS@5+dU!x$2rrV&9zFOK1=&1mr?fcJ}tVqT5pow>QL0FaBKWAZfoB^Bxyz`<(c*a+Avw| z*tmfo6Y?Jpb09a$u%u1PCh$qHXInVS+c16_aM{c)G^xuc$FF!Moz2Mp_hNb<$KGzV zqPAF%{$T_eL2uk-k8mjBoX<$svct(719Vy5Ua9DHpIFCBr)(*$0_neB{~Ng|)Yih+ z#6!i8-Z#Cq%=jv|j4-mfq(Fnj>QBptFQUWR7P?{s5!J~4cz*kOPm_I?as1@~q!B_V zJKxApht-NKWnG9^8X{-7edIQaf!{_#j%%`#3U`zazfl=qOHJ)T)R|P*k-IZ9m&F;e zFySo4!~vwf9J^2>3fz|g-GaPuu)nw^EQi7HbVdSmGOM3xKEQd=KbGll3d{2Cld)#u zH_Jp)jxiNMctZwh^zHXQ-A6x64f7CHEOZp4j#H@RY-uT7O9-{>Ita;a^-KBc{pGm^ zeMB%5y6K~p>9F2?`XZ(%#L;J`d7c9g)v1+jR_{#yysARF&rfq!`>oUf`#6Tx`f`C| z=-GsW!LVavC-%r@>Om9ZobYgX0I}N(iT?LG4_dy^K_OP6l8{#}cac`|Z9sAS5q-$# z<;!o&3B|hy#6~AU`(U8WnT@kNw}bla$Dm|FNAk+`jCJCVKKX6P$Qemm`WdHeoX^OL zAH(k%Rp*=b`X z5;EkSCn-F`fw-(HNJ|iZ!wq2X~1vowVpu3hZi~)8)7E zr>FYCe$VNo#w-t9S6is!OxBa~MM=J&W9S2}p2}EnJ-zwXsAuH86;!xYmuJZma=e?E zWRb^QsGXjw7#O*isBYOs&vg65YtKiQwteJLwcNBW`cu#C+cdLfcP`Jjg>e(-A5QXR zsOj0s9cJF!P7=Y-DK-6v4!w$itC3AXiP8W7$wXY&!j_M+K(x`+96w@^gCYb?zt3Xk zKsCt^fo8dg+Bo0R0ZzCj6n7`mcro0}N<;E($@1A}7OEQQ-GlAww?7^Kpl59vH(Np+ z&Q-e*Kg<&U@Zyr^+Uqv`YshPU8A`?Ucr2sAv^%jUy0)RKMb0Uqk1IW~dgetJWg+s3 z=R^{c^B{-}3moJC0@o)`%78zczw8vOVjJvEEKy=^ZTF;*#Q@*kpAmoyWR>Qz48>L! z>hkwMu`k*RF|}{t`LIvq7R~N>eLLgQRDhNBD9hIVOGgr4G%Q{w(T9I{5jll13+_zC z*_zghwKjuD`x~|T_vFj*tMFCMVMpIYZ^kT{m?n2PWOdiO2ZEov&?Ld= zCs_>7G33wvcvi=}$#4`AP-kgnuqImr@_-(@wA|7Ik(I{mUgoVsOftgf6E`*ADR~go zkKAx*n_35X#ZMhR*0@W0kbj`pd4ntPM!EfCN3W`3bNTBf$%AUtW?c8losIcK3+`tD zo>6Tq<}Lf?u;)|jo4MQg-##>d&YO69jn+nX@ZFx`P2ybqY=q~0ORavS)bZcupGxp$ z6IY9JUg2LQI7U8Zy6&bHq&cmQgoHGW!#=VrOGSjBNW(q>Yb2(kOL_k2RKoYBW2@X>NIkPHVH+Zbyo>t=A9~7PC73;w=Hr9C;J84r> zd)|rb=R6oFwW-xjE`1f1N-;_~FShaLhOo|;M8o~2hkLbq_|e6grqsh{ znRal^C;1WWgPcTa;5z=C%yn{~vJaZ;BHffv#g+{7T>bDq*~|@9ncFCQ(Eq#Ho_ZAwDu_Aqa&h>T-nb{Y4a!bz=RsPIm9U?aRWYv z{E=L1>Vfl{A890py2V;}t~WL|lD=YB6z{`1(ig>o^eW+C;kevKZ4?G6xsaHAJ-<~Ulcj@2lkF`b2G&zlu<+&6Y=W|y|p|%YPc;% z0CWT=_R1Dy-YNOTgfc*Y7jatBn)@~?gDR=&`Lo8*2c`A5rLta1 z0%u${79pmQ$F7?^!M&6mKg)Q(nGkihu<}d3LAFh8i|T?LQAqk`f^z@u>c$2lmTRon z2ETkZDXOlm*!H1iAYivEbKQos*zGLCZNI)jRmjgf8kK?-@7MC6(i!$Z4LKOu1ta71 zFWZvWH{f^7igz&5;50MMSEHi`f#JqNV76rtP>Y~WuKiQ}x}uz-@gBdM(-|Y7C65>Z zBd~P)3L2$zBR$UNAC27w1t=aQQaN3D*S)0s8N&O~5SQ<+)#TQKK3!==`011XJnt>x zwDFYgW419lq&%=}{ju3O&J-o_PTBcLi~G#OSLq%rIJcpyNX_-If87&i^e10?v&f)r zWu)1OkRQp2$Ft}Ag)k`DEY>5X<8qQUeqORiD1U$ZP%}jwveb%d*)~Yo_>eGyIDKf;!HU0*nHixiSDIyZxA_^QaVN->JnjWSvp+XKHJ6mxY5)`?J3oZNuzPZB z%|SsyrbF;!T~L<*=IrQCDsI~lWeO=V%h#Iw2Hi$wK(c1_->M|a=lPpxsM`ejq|(0f zM0JKDWKxnTuuQPbXsRTHw+%11NA9k-T;b(1Ex*3M3x}Gd%x6v~`r=$MXwG7w{5@JN z%cAw|PAJpl9Zbkx%E&2VwiV;-5IK=OJ#BW@>&2F66KQ$MHm$-JT`X4T!C^N5SmRdW zydR17X=Mm^{g)54`o}YtlSZF2OK3(hwAjF@(x=Jnx(q-Q<>7JY;(E2?GxsC16$O7? zl_aN%Fo4KIox3aM${;Z+12B7Eb!ruLg?1(7Ef2rV`f0o`qCIZ|4$?Y( z^!eN6hfOz9UD$6dHkOTDDd%^1HM16b=F3f!K3^V;MiA$ENAVZO-NwLv4xsXd3`Kpi ztl9k8$gtG6b`xAZHOm>o9TNrzrCWr`B%!U*OUa@VV8lrnds*(2g3TRjLmJAjD(&(i zeh+iy`s1gZHc*iNgZs3SAiXU=Ytte#xCPupl4owg8Ml3MusMlihcJ;Jcokx2VKYRy zAg+AYy0oQj-zoD6nmX^%s8Qq6fQhLh^{Z85{`0n>_xWU^==MQxQXZ_iA&tlT`J-X2 z1Gr8GiMLpu5F}RvQ}*EIecIU$F)tj%*t3jiXGR~C$*@miI{l?q%w1dSk#tYVCSs-k zb3z}?SL&IuCw8jpY787qRk(O$x=*Hg_n1gmNQe8}JLZ$xn#7bF=k)1Dy?ueTHouWk zHkDmKb*Z5W+cQiejD%L8`zl_4ZvB+ z?pE!*?#?eZ>6JqtMIPNy+jgIfxuCKiZbv^0DUT0o5NV}1Hv$z#9|=t}f$7jDBMA2Q zW%0$em}1_tWV@o^jh|nb%}{;NI!wlqJT56`Wx_dd4rov%975^aUfb#Rs_qc-I%*Q5 zKMjN8R)&5yw`R85; zO`eop{SFHxdpUn*3qJKmih9-nv+cWV*WgJ%U1^J+w!2_eA3!9O(25L>4tX1a05eDP zkjvI&b9a}(4nWER15Tr%@dcy-;ZgYmGfb~BBdlb}%za`UFnnw){4cBU>Cyw>Gf;Z) z_^TgEwWbYDDO9;lhfx`{&s#TpimB!A_6(AFv_&hVzJccR%2>#E$$dBX@BL1&9IW?U zawn&l$xLkh|+E#LZR+i_}nV8sZMKKv( zqz}5&L5wtu#<>hd8X;Zw;gITz$B#SfDt)q}kdQDNj|yyOj`P?_`^5Bw=_ln-dIoRY zN<-Z`7bD?rzD7UUd^OqY#tnfLZo~;mKaD%&&Ea_r9yjqr%gh|!{Z7#_9wDc|)X?a% zsdRmA+y5jvP0?w3C^S$n5#Y4pfxUY?d{xGw0hOWPUSt;wd0jO;-dyhUeifCk@EejWXJfjN7SdI{~2AkH){jOk4^S& z_y@Jvck9n9ragaOJ%H3G4(F)VoJMgip{D05At$tuFby7w>YSrvZFD}) z&}terh&B0_Bc9NCW;!6v?YzC_!8EoIkx6R~f#eg`K21(BvC!+kunRl_EFzkNQ#lN4 z2Dz~06~oA=m4wNJBN%x|CM~-5(P2#yUtm6Auy;iPu0tOG=9xgRHp&V-C1`C9ZkSgG zCwBHUEi5zN1$Wa}b9yifUyTHcPs8hOro-}A=#HS~UTxTEe+MszftTIHlm3)>r3biO z_Nm#PUYOF36z;XUq;}$2-_jcoU@@f(3(d09+!l)Y8h8WR)J5DVbG#;9mYc2O(k53s zsD-#CyhQ&DA~p&S1j)LP)mb}KMh1=aQts|4R<&{3E3w-1pAxnDA+aTlz_B0!r+G-&s@Dn~!L~EexinI6m|p11$u)g*ggflC1?fzu zp4rqt_N3}#@T|>SNvV|8dQwUF zZqug?w-=3%OUN+30N50u`2G6W0iLjy0A?)BaoAHeUAaU=8$tgI4&RUDY~2xb#|Y_$ z8n<%lN4>}Ho%|F44$3Gp#FU&vIissVJ#n9ZAaP!(#o33HwebOt2Ts#3(j&$OR<)bI z2Wy^Q_Zd%|PreOIDarCItdV}ss$)PaUn@BC_*swA?K@L+ceb~#C*sdJC0AC?IUkPN zs?XpWIa0!=x)Van68L3H0O&&$G_hNmKN?ul#DE82OH0dgl^69i{ucb-ss{Ogy%@38 zKK|p8EIYXpMWA7q0m|NF=c>QrN325sjkU=js%u&f-WtNu6wo^Yda z1#&7^_U@=)m9~>`h$iea_x^-3D)|OeDDi^S;6Lb0)CyCoLerFK0NRCi(53qMykVb9 zO71}^phQ+IDVXUB8VBtUIK!RB))|D6Cb6W+Re(}5DR-uRNWlU*A}U&70Mvf}ad1Rr zfZ|*15$5@uM~?jYXqxQLb8e~7Oh6b6k**vb{&D071vQ5&L*E9rnVG4IJtZ1K;7hg+ zPOJ2&Lk7{R*GG;VZHL55G`N6L>b2NnuPpn&-cp@h2^I=4pC2d=_Y|py0+B=+COV8z zlY-MXkLa!J|63+cIP9;;0#_f-p&2w?bkWZ!6fg#Q{U{VTbvM)P;B+TxtXg)cpq+&{`o%moNK>*o7T!#Nj_uIRZU@53`vL+ZDl!~I2Vl8 zBiad^dC_z`$yo4sPFO52W163{jW=3_9VBg^vM&k61FNi z_ti&}5rG^dEp44u$m`$^yp!@u8MmV&@P>!q?5tqNys$`bapx_yn}~-+mzHx9ToD=? zKeT7Q^hF*oW?7XHVNPH4r6h%pM6{$=WO0k*=dxc6dQhepcR-7N=m|11qbiQx*gUDAALxp4tEMsUjy4`g>$PLA6 zg8b)rD*%^)IyaBm54DntWmeF3R+N5lN_l9JHO`l3lZ(B?nFgGRtqiWzuRi?ukt4c* zSrVX?`uCsXj34*Mc`#Si^@Qjl1M?Zcq#9dR_T-7m%Bfn#m!Nj?HcwxaTfHPZLDDz% z>t`MUM@r;y9d3j_FrSa3pwAA6GrHOZ+ewH?M%ozKmL`~OqX7Y?TKXcj=3CNdET!pG zZ*N8FXAD>(s4p`x)q2a%G3;-C7Z%!iiQzRyro~1@0vHOhU}1G$=-~ERcFHqk6Ph1@PGam-jzB-e z2yhgGc_=^tIXdd%;xRh9_vDFUbW~Xd4p17j0#FrzL+ey^9*8lORp-G05qi>kkYA(8 zTc6qa`!h~SUXw>Fn%jI2YU45#p~z@mFlyGlH2ZA*n?Q(3x%ff5)1BPs8VJ8 zVo~r}x3kr+f<`hVH86FjBiRsYK-(@ghU(ifAf<=0!$zsW<;?f3AOF`Rc$EK155mc6 zH8nln=rGv=x)iT=+&*~D>8R&Sr-^@N7*KMyzuc6Ss`HG3{b}f~6k>I8JQ56qySj67 z3G-ysMaI^g*#my*vTV!IujekO2i>pJ z9!}JK(Q+qI*!&njw%j7X=F*F;B})|#a}_*^rpo+y;(SVTFwl7?nkR?&ZgRUJf71W* zx@&t=ziq@^s_MBUD37gbwreQwTEV0V@MkY^I*9Nf*T(-UeV23E^cJT}f%@*BHx5*& zf5LaVoi%Pvj)cW>jLd>u_DV|$z)x=OL9VQ1ONshl!|>nt@VT{sV0Uwu_Nr%+sh+a# zptm{ntSwLgfA$Lr+L==wII-vSes}Ca@pjj(H=6I;n&+}(*=rxVsx}(T{Zh-#rd|J~ zqO5Ut!0w4o?pY@i6KG1uEX@??og}Z}VW(KYf!0`!+4)t6e>=0aF!Fr(dC-2Y+l?KD zocj7<+DRl?AnvuVTO*M`K0_X7ETgE~)(ny@x!RxrI{(UrnT{Wyomb!(GSYcD_D!bb z(d@QPg??`?yZC@(`Kw`gjWAIM?6(?J8}4_etE47?c3oiJI@VT@JxbrNg2G*}riRa6 z#P4ub5YHYew7JLadVR{nEy+P@hyA4+wI@p$9(LsPQp6o25*^S~`w4 z!B>`e0ex%w4G&TJ)T*)Ls)SK=vn?JQjDCfRQXv2lY$JI(zE|_ipC2JJgN2dmWYpe1 z)_*be=0B1ghO?i}f*{}gOn0lgdwG=MrPmm^6r*)T$wK(&kncZ8&zAtGF#Y>a@6X&Z z^NaKx`-)8pR_#MF66h-eDL*I*z*a409VW#t({kbygP>eWq#0&^;IV9Rx3qj{rG5WJ z-6!^mI>s(vF9)e<^>K2b^_{{VXan;o@1KL_vruN5{WqyGva+UB@m^W=HenmSVRn?0 zRWhagj$0PmyuSGxuIb*@G`OGMBXW|(bCTcSN?QP>D$-r=*^6=jRD~=0E6Z}1n;~j) zw$*gCgG|Zj%Zb09zTx!EC%pSh*%;!rU9c|GaO}nyV_US$v}U~xso>0zcO{E-Ojo#R z_Iw4I@EQo-56-uqS-08sp4KOQSif@p$wGSYoGa#7nBeGAM7?kL>C2X6o4&DuQ&C_T%m0(6a5-k6Fxqlz1-MHo+)o`eU_>hkN(i-k{ z>xQqnV?@K)i1Lfw%->gz(ll17x0Gi|wS5FLdeG~{#QmkK(CN2%>9BLKruc2fYC6}_B`2b6+wr0&G*B2rK{=~R7udx zt27S|W!qChL%Kb^bTO^re}ldM5(_?uz6g9oklu6Z5f7*FGmkjb?n1kUVFC0e{a)?r z)CQ|*JTWV`RFE0&JrWfkH=-e*Rm+iL+|f(o(lCdxM+va&`GE+ zQ42|PVPT&*>38ZX`{H4^;d=?h6o3LVqsv4*7%J#jsu_J-x7NddYiY^W#@0ONs}x!u z_bj|PVRBbeSMtJiE5|IaCiB7#Pl5uAz!EmcS{I{Ld+?~bVN~d=V zE2%_Q5veV%?=GY6PB#%7Sq9^zy(7i0F)Ps2NTYFymD4AtYWEX1N6BP45#PwMQ%=9J zvqXg}Zi0+S^6VY>y{*H6b-44fwgb@Jhs|79Fky0W{on^(NlS$Do4T+Se7KZ(wfctA zV$C3E#{q@)I$7#S1;9 ze`4a)W<7sqt@-tmj2ABhWO&|zh%*TjJzb3?YtcZwA7$$X2m;Rs7HUa=EbpQRFL z6(CR5t6GW>UVDm?@UK3c>wDkO5bAd~cWS;B8cKiP@VZnLTLjjKztA`*{i`-OH-)r+ z0ih_+P9@sgzL8tKyT5!@z+T#3dk|oMDl?3;70*xd;`+yMuS9Rr$`QBrMhZc`pomUs zEn$bCUkmoJJIpu>$KAl`4qe+0qvAbd*Wm19?jDo63=+mPMvNg?fs3h{`QSa;FAkvS zy^>m|q)q$^Wjr+cMN4udi9NGnzBo-yQ6beo%*SY0p@Ye=<8M4kp#%57c{dc+Nm@s$ z!Az`lS_4V@kyo@Tn!hjKS((DTn)rk{UghKnc)oCzKI(MQwvLX4I_-gc_8@CyVZX0! zP0*3qB|dxpV6O$XK-}7Ep5G4B(g`AEX#B)k*M~J`tmE(+wL&{()@3`e4S+eooi-o^ z_YZojjolo=Uho33wK{^?rF}y!zGONI{jc=XANg}Ok;zdNZ+bCBoCmEX+rH~L9ecwD zS-2B=u07^U3yYwiiP#@z!lgdJx84u3TPv8kIyiP?XHM&oEqq@}NtWg8Y|k8^8sE~y zlCw#7Dv8wtD}q+;h0$S(bc+C?5{o*QhO#OqJ&N;&%*r#XGP*FB9V_B0%Dh&Jh)HY* zg!<#1?-zJ|cR3 z?HM_@ibx>M4kscgqS>PynMPb7d`1lA`Q*D5n=)YbSGoFOUkoh*tk)3J?(sg=%JJ^B zkqu7-sV$HZ(?%>lKa=EZ+~>k+Q!jjG188{bt*k<&l>j*e)N934{!}!)@W!BP-n&NS zD-Pd#IGPopW5;ca=}yvXTKE4S%)R+H+j-;v-RqibI@io}xjKrf?c16%swisTu9+^{ z3Z@jbrj1&&5Nb<;Yc4ajwKA<*W0_V_YZ^olk&hB75h)=dAxi8KM2Lh$@Avoq{&fEV z_c>oD&T+yy$a&?pJYUb}<2m~Hy3moh1fM2nWGjcU`F%pukm2P^_u@A-)hqH3s@JR3 z*GRfg6>%&BW~_p)P4h7#uAD7-h6}QXlt!NFFmAuWBH1!tLa{nY(jlz<+Dct8Hgs#T z)`{?%7R`*zcu8^oSoaFVK7Jx0=9b5^N-Lh>WUa%^*1!meF&Z|U=(Qo;jR^Jf+QL2M zPV>_pFZ@YcK_6dc%^vEX2i*P0uo9`2v!hy&sB5N=Dldv&`5Qh0unu2j@&ocy8uC+? z3;UQyM%~!Z@-40EYFbn{9ds}QPjtxevmtn`Ccl8`1X!=Gk2P38D2d)fW-#MqkfAfC+FNiRb=+NpN_Swp=bgGl@ zQdK}gEZ_2saVjS{wA0zHfnBF!s~BU>skDW8hbrBjM;u0$MhHwh=v=hDc^#p#QUPx! z+BMq0U!qq5q-!tOecIgF@H|xJnydamTqlZLoqDB*;noNiKxh1D~G#W)deA>--C4ni5?^ zO>d3_4=rsUyb>_5SfYQxXE;0dZ|z7=hi`Nc0ii!(S=S`V#$S%5N#3S+C%81gkuxn> z_nxe1SC6Hjio$Z2-uqE~+pwqLJS0%rz}OfW9eq0rs@O$(y~1!$9Nn5ZupdAr;Hk8& zxE|TjoL~6oUxtw%(Ip>Ucx8Rj|1&P_9z5find9;52;G z+*6j+y!NeYSyja+g7@38|73O2*o0k?ywPTD?b)o(O&r8Uk355H|0pc02?3xRg9oY( z=Of(S=@!(i1sj#-JnrPO^mi~LXdzyG& zwE4}LQn~*tB0=}wFf>tp3%U^%MihQ+YY?RKh!#2nOvuErv#i7AS!JD+zV=TS`*fQF zHBRNvTbuHYp8ZH+vL}8zdB&5h<~e0O6H2{k*2Xz65azF#er5VDGGd4l8f1QXrh8#= z{$7&04UA8M?5W>w`LG9`%&%QdZ(i&DK6i3{Cno*?mD;g_4uZO%9@?k;usp#` zEgg!+r3ebFOYn5WIxy)1I+9B|b@AZKu~Y)m`6zw%2;%xAeM_jykp1#3Usc_+U&TQu zZ7I>FD+{)LD(g+AsB^DHIFh8Hcl@^osQt*LQ7ZHE`&PXBNchgxOJgs($~iV@e<3@< zw4v!9WW>E_Gfg>}v}B!D?(ITCVOgle!8mle#wjb8P<&UbKfJB5g0^Y2JN`X$XOR)4;M;VJ1Uh;< z-teQ;t@Nl0i)YSPT3r|Sj*q=BHVo+p`hCgkDY!0e&fCXk!bB#{I4d(L@zCbtG{ti9 zK~iHu(nyr7k-|(2BE;mUyuk(4b)A^Of88ICR;PoMS?YAeO6_@GXCn^kqk$phn?re> z${mn*2W6ROSZx@;Osh)lMV6=+Zc@sg3^n{n9&@ciI!GSAzPQS?+>l@3fES-Onu8D;A-y zo*0eKFER}Y3Y%KAbp#zw&~e92p(&hwW=8TUldQke^zimHmQP}=0pk0*Hw8EyZ+V;; z_OMC0F&7rm(O1`OrDT9l!Ah%pI3){6!T3{wwhZ|&xDJnBvgvtsh+L?9tIFYN;8zkJ4uJ*Qzd$L{RI&96m z%AG*SR2OB%+6;o1EW&ER@m=t|E1{N$Jfo&EZ4QK@UAjP zun29=3d!h9&--$$u=8Z_b5ZI}rR*f(P}E@C-|?ddqh<7ISh#+vzXId{B{Vm2)8oa2P_-j!O1qYx8#{ z^kUP6Ua&_UroGoZ-o&~W#A%kyQYUf09&4mMh~x#K_$hILhI98m@*~ml28Jm_BaLR`{3!yxtN0TBrA1i(-ci;~ ziBpp#O&|A4P+QUJgMKl`=db`(1AbQaq#h3pV33anZX-0pGKgsWpgBU8nWy{rB)gQN zRxQl^@0DDS(&?YBZuufwjJrJQy_+9&`F1zdHl*NlO;*b60l5<>Ed>-;{ZMH?QpRC!O(`vBG zCtD8O9goFR&Gq%1bw3~KWsuncy+b3uJYQLwBXH+Z$(25#3q7jw4Yc%v!PECSuBP%H zvAzE25ww(=N9(N0RAls%<-6u@TS$G9HkRM>PRxGG^ zKHJ%T^&m0N>pFI<&U6A(W18mSR7{ME zS=bV@BV+Z<_Xnef${=M2^2oCr%y{_*q&&lp1yWftxT#4bTU*n?xZo!PaPfG1`83|b zw%ma;GB6{Y}l>3dAi%B&K||SZNhk@y25>V-HG_@ z1cU}x=<~je=FA{BGt>IowC4>=<X?;?nB= zx6S{(D^%2iv@*g<#57b@^V`=R zGc+Us&=3;pK0bFcBoZJHU^nSoA>7Ehc)dSFjEO)>tQz6-<@JsBJ1Xw?puX^hhm8~K zQwCFvRV`3NWQnE>RTC!tp@DRfT9fyud~?keY(Lt(XOgofc6PBk?GfLFq=nhEjKohl zB7F#ir+f?YuB_LT_n5xv?>{IPDZ+?vSmxd+3)&O=r6X8IF~IdlU~4*IkUJFBXS<4Yf?(1Bb@5mh5S$l_H2 z;>UAHAO;duhadklepr!aQ399zA zIbWMO0vc8bjY-fQYo{xSNa1HNeQ;$*0qUrSq1fwQp+EotT%&89-|aBF=G3x$!d~X+ zQEN;nc9CJ6T=h5or9M6oT);9x&_QAvJidzZ`V^u`hsNvG?43L!K`u@Tuk9?+@B$Mx zjGZJ#1Wd4LT~#_bJ9uMmn?*n~I(2S5x)&+ekQsutCTF#}5V}^=T><_JqU{Z!Z{_z9 zSo}JX{;!1_jXh19sHBLc!^w=UxCa4$c0}(5bwx~`O}~`8E{)gqm%m&E1=y!ok9}I{ z#8|j*2omi=o}HH;9;No|DpzBn@_{3mg0M767Z`FX*{A)AJr2I%*hde>1(C~bjb6e- zP=hSfOhcM7It_@6gDjqtbVF6JLP?%aeu3}_pL_le?7=!_=8+$@5!lpmsMz)#azu<*~6-y`20a z&g~{}r2la==Y_@X4p1WT4Z$ipcOOumBOt(KjnrD>=)0ILM2ryUVJ%B|RD-v$DHHZ^ z+7M%B=Gp=OA)mT-VB;=uInmw!P`ZyJe^Y0xV)#!v{=Kr7hwe`i>lXV}anr&kyIg9g zlHnpGHaiO+Q~Es#sgS2!iO|q##%0e)3*U@_FZ}(Rm82`7HORT_(b%AOsN(!(d9Q22 z@!#Ve%1>d>)OY2*TvT8%ExpD1^#x`g%_Hfv@4+r08NE@nDz^7B_(%3BkAg+#?-ttP z(i}g=Df2gLJ=WOM%loMw&x5;llC{%a%|-=GBpd8^Km7$9YTIjLcG})G9TBpGC-I5DthAi@A9Rft`@o%R}Wy{9J?s`RknAj?6cA#_L zU=fO~{dPx%kGzwfQZ!n_uW)ROAi4ZD7vDh?CBov7r6=?5@P34BE)m`vh7*v4F`E;| z8OKirBEB)zRzJV&Ql2&v3Rx`GL{2;P2*>aNR*5o?-tXU8TkoQZub=F=$RqaZhFz&Fd4w5FG&A_y zcTBQv#A9hdPI(Ynp<{Mh>wIXCsd=7%OF-ri0D)0BRKP6ZwwTqdyO_U~du*ahSQ}BR z5GgfkX9#zx)+7u3waY%UOnR0MCZ+DQ)1c6s0sj*hjP;J^VQe+C1pJwyvrQm5Tf~$62cN&zEZVyB(FSJ@d@;|=xgCs@e%iVM1u)I5D;x+EK%>!|~ z!!vggLE!6VpeJG_bJV?@DBn=5kh(DE&)+LPX&&ei?*`*epE#;GaQo!I+Y?oSU5$sA z`&QEKh6`x!{1vGvI!+QYVh4#Z4kqIgu$LN_)I6p67KLD4R~;8VMH?cQZh{1kuFbH( zmg}wE`VSeA)sM{*+n*g-9_O2Q9o2VsC!athXlEB#KEAS1UU^tQ%rMU;rDQoollT=G@|Va+n4E>=<38A*pGKs8;g6+1Iym z>~YBQp1+AQ-MBH=m_Sk6)2`T4%ULF+&Zb)(N4WmUndsArI9Y-6bm}xR6&I1U(Fst6 zTT~gZF#AZBF8#+|!fQLk?~5tTp4zq-a2m3fv}YZQRu7pdz8>g)lXo06hC`IJ@8>kv zQKPpGF6Sg)zN-0+geke+dieeKwq$ZLjLNPIUXQ5n~L z)Roy55z@qZxcp|x;@4JW3q&G^P0EA5W~OKFd2yJYPkDH+xWF^4L_eAZGf})bTBYxJ zM&CpG!8Qm6hehCS5>}ye8t!4lSeU#=!o4)K#(hiH1^-t$XGM0h_4tfaY}^QI8J&St zE!BYyQ_9cFkpm!btZDqXsYWvrJjf29#|Eg%d#MFbyj7|gPiTE%@&Y@Q1RvqPwS3X+ z{-$9=dU4qu4;Pg^_0C23czl!sXoyQsDIQP!<;C!Xgj^H(jM8TZ03XMQL{SnT!NU28PZ^Oe%{i2gBVX{hXl2hIx<#48O86{Nhe7Uc_+3*F=~!DXd- zcO!cCV*Bwf3@vT8NED(eKmB_rybkv&$ zs<8$MXp{RRj~&l3O23m+EOoA&qP^2KmFKTJE1f#17e1`+%>G;Z($ zD^4GlSAKu;8Hz{PT*5tW^1MTVTIepYh3?xZT)k@~9y5G>wa0Ldv|`&dffFRY>&S&W3D4wpHc5j$S1RfuO&I`fj&7g93%Sr^L6HBK@| z4i(MktQF3)m9gH_I|2+;9G<%_DQpjF_e)q0qotN)=h0pV%>6{w8FxB4#j8Qp_7~4| zgWH5l_^9dG|CZ?Ybiz9R-ie9WGcA*u4LD)eUQ|COq+UTFY^+XdTbzH~DYHn5ePk5e z1w%Qn6VvVplP$K^KLfkpsz}i`)bqjQ6s>Cb>L$QTDI|FB*MgF{9hm+8nB?-JX3=HF zq`n9KljFfYdx}Nwj}KjHPuRHWthAx=;-MRS_2_(VP3)bPz(@4p!gdg+Bd5u?VcGZL z|Bd(bfB)q2|1nh=Q^6T;Mymn!a4@53PowV5+_?GIUyd08JUai4F4t>w{HwcoIVxH8 zx5TjO?R}McoW8U&QWe|1xko*?wVbi6^gkf^4$2=NO-Giw?z8}0yPs!EHunw>uB_`T zFp&ogU-l|#H?J>aXwh}@@JgSwpN}(CYg!>Mncvp*ps05!r|KmW)J)l{Sr}hB3-Icg7=JDMR_3nrg9i z`-chFD7KyoyW z{m>i4y0drcG$ne%3WMZ}HH7VG4#f3#$(G88XCPdjQr=p4n`rwju00i;*%Tz~;e`R# zx=3n9mEPDKDMhSIH+B0M8Y}*O?t8getMsud$bB2!}G{}vn0+YO)|9gue-S}A6&>~!ybrT(P1@p2g?L2;BM0`o?~2aDNGzB zAgFxX=|}U-zGUz*{pqy~rJKx1Wn4#;N-R{`{zrdGGM1BzBmZ(8KkmBiYVhS)UVw&6 z0JY=Ny15+s^vkh#2MuAXb-O`hbDx29l1O(VXcD`o){wCx|8nfpUU9Yp|m{!c14F? z(c4o?vAF`P1FvPd$}zc$-9Aed|8xHt#f4tg1Ah}rZCu@c(wGKh`ySwuUO$R|kkVy; z-rsk=vzFOlc7$sRnMl^sfuvAI9lA8*5@K()_!(%UXkW=8Ya2RGS>Ai33xVPti>^c4 zAeRTYa2n3qgiLMIz$JBf;4@Ad%IYc%bd|Au)7Oard%1~c*LmtCyOc9_aC?rGsUIU` zV0FcfjsM-t7SCr+4@K3bbEMdxs?N(ex}DF1bu2St7+;RHGL8_VDS+Z029(ExmA?w0 z(*nI|)ihh6FG|tML-k^tK-`YaF<#0tb0pvDS0d-r!o257EBpP4qyQAoUv17jj4UAVT z@8{jbzP|(n2{rE%r^~s3paqBMB&ZOqr=USg$3Qrm2M%qx0;)YZwYC zG>nBHxDEJA9gB60-!#I1ZHX{kG4pa$S@YK`f9Y*V+>BaEw%3^p>0gTgh@Ck(NABoI zUGzc|M65nGp55Y%No?M_)8nIezHU;FI=Ln`-?v|F@}Wnsh8=kN$Eru_-Km`2S%(TB zU8eSi5lJ$!6^7eB=y(&;To5$KBi3zxMdoD4-*TzaP5q-6&m{4#iu^4lBUZ_*9CZb5 z#eorA2?Z*5V0(vms`jg%Qx)cb^L3}CEavpQ5Ac0ahAQji5&9*JwP5?@n9bU0g*J70 zFBJNj{V7csx7xeAT^9u#+pWM6J51}$o9^OD2v70JA7nOvWPY;IIgWP-uNn&A@2y+& z1O6Eod#CHqkq1mZC5Jv-{dLjuT%+XV`0US(6EjBd$~|jCRAyGkpW6sEzGdj7r<*4o zq7<^md`{0gY!v+c<6OUz$g_j)oOt1r1N{jnJ=WJFyRJqg58W2eLygH^P$6ya{tV{; z*7-j0$ok-!#RHF zoEYmKSZWMQe#?w?AK>f~BZ-YMyo=D7k)(DIfMXr#EjC*4l|vhmY3z;D_K8JF%+d!Z zaUIrXHs}1;7RdIx$tV9Ly@#D6znb*8ud+;m-B)JlOnN+F-_MO%&Xo(xQZrG-BjKMN zPB+*GYxX)n)A1a2hP|rf(1>kbwUa|?`Z!9$GTl`zbWB(I+HBR#O4DLe^0-s9v z3QQOu6Oj7zCB>#jyUMAxs6$ZN0wlxzKdLvC^ZcDO1$*}7jrHoi&8o>UwE44;yjHPK z!OXsCK@9h;*YMPW+hT;|>Hn<%3K4NlvIctm?U~hi@law3Ibu>v9{70|`ajZHH;gsa zh&XgK(n9Nv#d?9kK@g;{bnDu_6|i7qA`E`?*Dnu5av%cbjrc=*`(C5pTHO7wyZ=J2 z9Kd+<19kwghUpne?1{7Vz+|AT;1#WUc+6qlrUe2}4;_J5a6nZHP_8nXTaZ@3E8b2Y z0se&yG@@l-!vhcWGDK!nFp`GBOqhT7;ji5A@Ni#wfzkCbl|knCRnqd@N+rS_=cg7* zM_R%U8Vek}G{c9x;%|ybm&ZcQ^Csr0YANm4kla&5``Pkc+U;DnF3AqP8QyH7ul_ci zl~NN%gx+q3o;hDYylOwdnf5=AIUYR3;mylu_sPT(wZ_1&|L1HTIcZbbM z|5>P%qj-}KZOj!1fpd=hBi-M$+letnbWd<8Ei2x{x!SPzgtoRXJz6~1z5(gW$Y~n! zhD6ebJDM|22S=O~H1h?_yMh_8CWa@tr<_r=Li%j8kIv!CfM6kL03eb43@&gHPm_f+ zdYRKnS}*axOrTGPuTvbpUh{u@t3SE|TJ~{$D!Wr;+qqDl_Uvu8l`Q8|7~3N^fqXpF z%W0NkC_e1auby?TW(%sGESrMv*CMWCxl6V?v}jEhiJDK=GP)!R2@ib*k?Busay<|M<%=Z*s`rbM5sB(9sR455 z&8#{t^F6GqQLFxHlP?XhUepR>s4+_)Em{J`UGGNg8i+{F?6OqD@}$8~=r3iHL{Tmh z!qg7*C7QU{_O{rSr|g8funPu_H$8%4*PU1DDLS7Ov)!D-Dd-@K?;0hQ4n0M}L0$v2 zgg_#(@r;G!jPv1jjdW(#mt(#ZEO2Gq4eZl8(7%-{{ealZYSsEOfD=bPvz?~`>;0VK zyuREfke>uTI&=8dkv2SIcSAP4J$Im=3z)BgTH>`5!HGtM`M);SW5W}E8bzG_fKosgkx8y{G(-@MR)hu#RZ zVNX{2K(V{Hx^3v=-pf0$=693ecO*pOmtzrgkcrYmW-R91!sKBfWns+1O6{EiI`9eK zqRv9%{4MV(auLk!V~DUI%73eCi;m+v+HLt9NR%;w7g1>Gk)v z!JHUV?}mkj&kyYj?t6g0iCnu$?a-q%57HifzUS+j_Ai3WxXU-$ zOxs=0DJ3ywHlRmX1Kr$Mrh)kOTm0o|t4PWgG!P!Wb;hQ0SijLettI)LBHt^)bZ2R5 zZaSB_3>VMSil*K#)Me!Q=sEZi0tftiK(Z~XxeM~^tu~eQGFzOD*v-H|_r*~Y>J-H_ z&o+j1%RQK%1WF>b&4(iaJWnvF_Z!ncGts&4@Y@OsDDR0Ro!PK9cu+d9CUyRH;sD** zSfGOp3bI?C%<0g54oYHWx)@g;X;}zfShpw1aeinHCujeO<|QI6G3#%nx|dTsM`PT+ z3~di+!KuO9!2EC2?;_NLwKNXFB*JT%=h#H6Pd(^Y99BmXcR7MS=~f*H#GLVfDq(u%;UpFhRlN?_9$+x(jn6S)E;tuMYb{+n|b}X z_G3C?j5k(g7&TO|LRlu*RPIbr0no!3uyBbFzZ{cWYah)CWt-F5vM1zXSN#q&d$i5m zy{cwoHqi_Ifj(4-l3AT5#E_4ZYnRP_8JuZ&*RcpssbFYAEevywy9`HbvIv0q>efa( zUnsAcw}#Spx!!<47W`CqW(E=R40(2_IOvj5WT<(RQdR+*Y8^F6#_FSgOcD$E;nY(- z9W;_+^DEO8!>5Cl&chFftY9fp@5tk{M({G7nm^IJ5J{vouwr|dCI^oHrYC|4ht(}t z39!Dt=+K(e(J*PeW{!Nhe}P>o%qr& zyk|Rebe4c?+P3Mkba>iXQVs;3!(xTp<|>-c;~4)Y4UwYtM&B>vVP2*O z5F(0;2^|w$rC-2B*q8&Qo?50M!T0lII6s0#KvSRu{s*wB!acAn+_WLPb3* zR0Kr@Odx>)-~_KDZRUIVP!E4$??T4F_fm{Yv$wP-vrDr}aZ#`vNn3pC2wkEYv)rw+ zkzeUGSS+B#YyI@YqYpe}$enWT+c}aiIRFMiRE;I#r1O*hI>;pFrcFv2jT_<`YFC_J z2vzMhbP8$mWLBPeO^=IHax)%J9)U0c?g4UIf7E9 zALTh@9f7ruS|?M}G>%@RxGJ2o4yfTD6*WLmvxa(TRsrZr&i7Z9&KWn$Pb-DMEmv@? zvtH+yW4Dzorw{uyc-Qbu{b(eEqK^K=ayoo$=k5V>7IKKn^ub1%BH_Ju^3Z`YQ>bW?iJyQ?N%A zo+?tP>UF%Ew0n}t=VTne7Oi{c{ffbUvj4-{n7F1Gdsr`(aEphkPR$|pPki>I3-T_? z++m{cOH%%X2fi3FerXdm7AwHUm!7@Z;(%R68A-lQ+pM184E4q13VA)7^R%{R2dB!4 zb|LhVCHoS@I@ttP>S}~ye_gjjYkVyFZ^xED%4ip(F*@iH`Hb7~9oNTs8#XwYKLYnW z9|RPN9Xd$GY|0y8{3n-eooR%zenGkGngyT8O5Xqd+wC9c{%|-U7@mWSWLcUHHx1`p zwpLDRRu4T#Dt9vwcYMv8ctIV=(_lM#@$6)vA)_MSPzuk z6j)p%!vDW>LD2us<(F)o^c$Mc^~ky;iC9+51Rw()DXi6FHe>3YH z2LO+D(yxwL6Nh@5Q4As4pPEp%S)ZTd7(di6IQ;&?Q!X+9Qx5uvmZJ_M0Q#QrXKO0v z)fK0^JDOK`r4HdGei=XP2~4Gv#hI%VkLMm3rK`ILzWJDV?dp=SvnfbB02$VS=KAQq z9|QqKB6JM*nQyz0o=|5BslvLG9%4g{NGuLpu*;k9l+?z$U5#++;Vx8CMues zyDw6Z+?kR*!Q|UyfcBq$_u~KgaJ=C*aKnvv(e?K48PtqYfIeac5T=0INGdBs^tbtb--*V{5FD{);uMYFoD#@-H{! z{upq$D%`5xI1uEvI;bgXW>GhC5kQfs{49Bn$1^k{22bZ}-?&`_L zu5k)@KuAolHbe7Fmh?g$%g!|CN4QAT3e?{KN9zHl5_GE>mtWl)r5!p{y=j+IauR=! zxnw{m{UP?8ZQ9}iK={UJa?W*0t_JI?hzW>s|Doid8^Uq&(ODs;|iSJly&Tc`IZ>(9%&< zh!1FrtUxdKVqWF>8BR2}`sh4vVwy%#AQ4dKcjm5BHr>T@rM(<#M3;>NV=C3<1Lgdz zPH@-7(c;-;nPbOKz@76#_g2v0WK3E5dU_9c_h5T!Hq=bHQiD>u*f)hQIT-j~*O?nO z(d5lrJjyA>FJ}X~yOq9k-TaM+Md(1Ha;GSV_{5>nW%7+d5A$j~i4i51?&oF{@0%yA za9L_(u-7UJw&$d!-SQecZalHyob@$x=9%4WT1lbj$|V1fPKnUhw;8cW!NCcyM!{52 zkY)mkS@w=JP}Y*rLVeouuJ1#9$j_f&%$6rqa}tF{4!%>Y#xFD?)y^ z+(_>yY`j!!p*LM^KJ`Gso>n|JQ)}w%9^EW5y(|(h^{Kt=BqjtVB_`Dk8g*#%twm5) z4133eoZ9baj@M_?r3V?s2d@39t>u|50J?TXh80R(^ob1cHIcX^b) zz|+Vf*{$!0hD?U$<>wBjrSISR+~h?!G^$;=O)xXvv|FCZCT)Bq`X;s93kk6*&2D2KZ6M0TjUgeWsy&3J%25Dv72#{qq?(h{x$RAvl1(jm=A`$ zcrZQ2%MTQcF1Ostkx3z>Jt5;xug+wzPVw7K|9Xno@GjPCSJP@>xjgm#;&=;8qx2w+ zf<_Ye6J^nAdMT}Lb3OYtZ!Eo`FNy78=C@Ks)xA+l5q2-57y!vlP~7T-rjKM|M+3u4 zIjLP!Q%<+Z9P~u)PkE7h4<>x&s^}?dCPc$uGwB(?LXYw{Rt+v8Zt zF_33y2QCo;2v2W8l0ynP!}tMqzi82)D3NniYu3*ks$kuMzB-sa#S7a1m^h0I8us|G zvTdJT{8zYz77UiVFiK}-T`V(qE7Z8zScDJk@&bxfoVI75J2O4qe86b8FbzSa;Cv)! zx-VrY%SPwL5~yTLU!(a=hFAN3ldK(ds|LOfTisY@&-537p+T1jk$pvNppw?{2vUtG zDksk`Ob)C_P0R>Glv~Y8GK%%(*x9oEqqKgY%+R9J3@B5znEi6B6b^j0P1AwE4G%13 zW+>s6)M%?Csf6_9*rhG%kuTfhXQ01uWj6N9vG?;-R=h{4^46DQ%d;2095YB(3L5>% zCFSjyV5hwq#H~>c%v$G0dc>l=jU>VH0psf1#}BW6oJ5qoGzt?g61dAW0*WlTvUnkc zdb9h|gNEgWK_EZ8IPq*MwhgOm88P_`V8-iRVWR-!+=;+=AH9GYkvoqN#57kgEgQM@ z-cvUhLT|Hc^Eu_tD`^{b=212H+r)^;=30Oj1@McLJHY?I)E*qZJ#=q8 zSdQ2yB)j>;(D~$gU_ssS5Z4(Y42Mbw9@VRcrfVfe&<~F#vc~1|Qx^w4{qXYr%`u~p zg7`f$$JpE_O?MTM{Kv9A43kv%w~?4AF@jzAsVREC*8`@Na5I@`!F(b!E*ldTo40w8 zlkxEU$y_FBZNDMy(TAO$NUbz+eq`PhudhDcF+CD`$+*hYVxK)tO>5Gismi`WwVBS72j*e_rUzzf*o6B1Vd7QyHEAU0JgrMT za%W67^HksHRdLdmmK|!-Fz^1@#eaxeFM$8p%qU*83;k=}HX&mA(|nTMp`^=_i4Rs6 zv}~-f`=K}F3v_sJYIJ^w_zoi@JMR}?dG>tDtV`t6r9>ozJF{dh>m}Zm z^S8O0?5ZY;N05t&8QbgRE)R@t*?3Z7yy!ERan2Ze z%YBi{z|T3|gtXVfe1N!e9!_$SO)eOcRCs0Twjvd~jWvX#LY)8cL6gOyyqWgoTp=Ux z$6NN5Y^XP|pz+Y6=YRBv%ba@6!CXn|iREP5KXY>W9}%u@En1ca*Zy*|^F2~7w}8(U zSi-t&;q>R{oyo;`K}%lJYD0HtT}2CTnmf*6b&+s-9W5PKN~J4Il#rIEaoJ-BpqGIB z+M6%Jp}+y&1+Y5@&f+s&1eicxXFLoRIRtv}e*W#^5T?{ry#^Y%Uy1_==x(evfL4pF zy1N^i!L0hbqPLW9FMN*o5ed2r+W^K{;@Gn(+35ZR>B{mCI8H2>U|6o<^RV#gLUx&MG7o1aJl)Er<%Gbdl$bX2!1yH; z!B&gTX^vd5wR$IaQrWL2g&M?MBnQqUeGlUp8uh!RWwVO)Q>v;E3e(#vN8nJWUl!y3 z*|saL0xEVYdO=vaB7Bq_84$7Cb6Rul5biFpu*c|e|C<+FnWA)5XY?=FWZ(OV;_Cz& za{ui+8iw&gk0#o zc8M2}9H32Fib-k?t89MKyYHEZH7N$xgK7pmV)2O$CX&bSz@fX4eiDJx-i}~u%N+!6 z_nYm3t67WdV}fiB+df}wHvgtzx`SC~a{605R31fS4u|h_eLpdk^W9k}#@ClYLil@0 zjym$5Abt77v6x&@?Zl$(uAHLV;`Zkht-h`<({ONb5PcK5K+kQ12C}X6WAn%K%OW5q z09wu(FyONcNcbAyr$$FPF%SE*)FbwXUdnQ5&@*a+^z<+}Mt0coN)b|#y91`tOO-)r z6Sc~|X;`Ab;1TUc%VL9}5XILHi`cj#u0P9vGh3dPhBF8j>Vop4x-4fz)IuOJdTxz4 z#df{99U(IJ@2&#km6Q}Ftfy$uiS(8eW^|!4`gN8x8JlEn3|%P$0S#HXw0O7tiGya` z>AR>$>{)%xB*}n)y;W-Ahd%Ofy62c0VL*ZynLr2XaCA<*;t;`Ntfnc>Z(aDa@g|K4@JgZt%}CktM6 z^2@Q;a{P8WUeQ3L0%!MeWgW1cg(}53H_RYlScTH`w;7{fjvaI)`FN;~AC)@rmHHFl zqaP&j>b( zp$!MzBZYICN-kKHcuQA>JL=;|La^&*_$tRd?OXeGd$qIpzLweGdyeYdQfIC@VG`lx zDh8Kg6W(w8M`f|bRjW$IikEv@aeqvj!zun3(DA0dH1!^(b~Zf#jRbg=|qV@F_gde7t3 zXDE7&Rj-BuKSCnXPkCv(TuaN|{c^0n^QdXfOuP6K3)CAJcyO4~7*$?|>%7X=8|{su zGtJ%UC>q&A!YjRKNXogVg8o13y=yp|`P%nCYt5!>rY(=9sM@WmmT47Lwco9oZnU+V zR%;iVR+JJ1AtH7&(~Z3pwI`XOq)Mb|L_|cUCDN2oLPA265Zees2x6XV-S?~iaXjz; z_lrA64o42JuKcd+%60zE^ZWgL|AZz^dna_ou9<+VBw{wc7-H3!9ynnNYrkAQoyI((0n3=}w}u}&YJ8w*kT+o;#OhvkdGQE-^3QF;!GDG*uVEbOe|@c7+; zF{UPNLFHI-P32qH`IiVTM;+NKPB&X(3+q<&jrH421fVMsnumwISNDHB^6lP$88i)?1AoHm z?SpLAjqJ(|R_xRtuab2E#5GEqX^scdLW6aN)P<+P5({;`?rBpO2|qQ19y^U^_Jrdn z4i*Q>3VhS|eF@PYM(u~xcrXCd;5R`Gd3^L}IfMD}r^$Vn(7NV>4U-zrKcF7G2V)g= zL$*zquo3^dUYe1ieokNW_Y5QC<0I!Vje7=pbZ!EH=8#&oC(oN!3CiV!6pnSdB6j4) zW`V@Qvsd0ITA2%S_6#x z6zLy%UEBvhIngGpsU@7LBEjv&k|=|RJ7^9Kyy}L{O9&NN*RI7vv{kk{Aykjf8L;?z z9=qEtaCZ9hhU=`aTsgU#^<@tT+o@A9W3D6?EUgAm=+B~&nfQHQ=9 zkFftwx$h?1&{NhoxZr`d2ZF?!%AiU6})kPW;vl*d$iT^*q z&H!)p*B8L(6%*-xLZNn1f(L~f?50*Z*IVSM_M8?V2Jo^e7B-OPC z7mij2GHSg72cmuBZK)w43|5$AW@e!EtD_-Mmz+z!n)Sn53u_c6r)++0GcZ~2q~rs1 z>5;GX4aT!%_?xJ{K%$&k2%BSSU-DYIwbOR^d@LyFxMYbHq-RQFF>V4Z&m>v2=Y{y4 z?i)RB>~jV<9G|e)&!Q24I7&cgAvSUj1xtm-5*O7oy}bkOz^k|Sz#Y(DfVV1?|0Cti z+6J#2KnaV&Ps0wWcx(VOHYnvS7@qc3j&*adNmFHgluL;@|D69kA4zdf zbSpOVz3a|cv!kZoYg2x??SQpzx3YH|b=QR+A*a-EnUsMIs<)=(CM(v(`$D)G`wP0*g>^K&yz0q+h!&U29&9DQsF)UA45av~9;VFd*ULODkdg_UNt* zkJR~b)^GcMo5B0)zi}*MD%*k&fgBsJ(z6_=kSwhIN7_A9UTfefW5R9Tr!@Zq2i z%#?HY=vGumv(0tGudhmnd|SqfMQDrLE~f4uLt%`=XxM2fk<(pB{&5Ry!10+ge9>O! zFlJQ<=v&!K+ERia}%mtUV@F)P<~AX?9Q} z*&bH=>L2wWUe`mAYYFT+!xM;JIa;>aQ|r_{JeE!#tNjC}<&!WCk~^d5zEA5SPA_I}u8DWF6nTcZF5gj({2UJ(j7y`dYKsC=JRM*^ zSsNSBPDVh!Uf(C?UJ9)#@^Uf%2g}QBs;iz3SARN}8J2Jman3d()K)2pVZGCmV=qAF zTW>P8jmWtkb+kH;+f}c{O3WE&X@OKYI-F``>=&}!kBkTr3@`VvCQaAw%|YrP3`V4| zyzRN97H>^-nRRC47f8w$rVZy=|az!jy7y$y%oZZewjFlpq#MU>(@K@B*@e z=-sca>$b)e%3SK12&iz1HKYH&nzTK1Qi;0FKhNk}^=uzEp+mnWi{i_r_w-j&ic-Wr zM;l8F%&uLpFlMGEe20;OBwY83w zryaQ4U5M4FFjA!5HZIEZMhjp$OW;;U&Md~##ht1d`;Lj62rtNc>Opv~U`ZZ%Q>xj} z?CfWKPW=%B4VaYp!zG#l9!)luwF<~Cey!Vd4gGXoGvqA4*bHW9VtpiVt9?fy*aFq% zU7oW!Xz%}hHT8I*^E9zKr2tm#^GJm0A;8v}3m*lATvdiGE!C=2Y+HV#uTRim0JD?9 z4dGOH#K-vf4w9WyP%2!J^Ns{^KkyK>`6osrDNDXK7SvH^OnCoCcf}k~Q9KpO$k1#S ztvuq2Gb8oDJ)Bn|k%{)MUXa`LUvHjD|B{#zGKjvrGVPeioqo>zz&Cm9X(S9Wjrbb@ z0&@PlTs?4Py{ZiVYEbD4B0%im4?(n)lUkPp`t08$`^Rw3&|k-wGHRAQ z9k3ngEic-K@$coCnU|r=oYsA^~IRLGa1}YvgGjP;D|e^(?aRO+F^*k&~kb0 ztRlN^;g55CCJTR>^z3$5rv$1uYahsA3!C}s)s7;G6d~WiPc!?wk|ifwaSP3(O4pCF zv9a3on;?y$Q|)XW^=Bqon&#T3IOI`b?=n+S{qI~CFOHDM+A7pmQ%}xHfl?o$Co;fvdUZgnOZ~&9ViH}Yun5~Lbb0Z_HXCGq#HFK&AW zCCc!D$$y|*6O}l|f3`k;iHM^D686aVgG=EJ(CJB5R$dPt=rcv`N~3iPO+ps>FT-=H znVDR3_mtPX=VF>mKZWf>5KIlv$O*w?+3U>eB38A^VDvpqMSiE9N${{JZ=vl$cc)@Y zkYqMF(LPDXSm~$iWYT7E_~{OSQ8`6(j)20av|-Wknci`o(+T(ZbgkT*!b zYhHdJozZscX!9PF1uGl5`>zVUQ|0A`G`eKpfH>FKK#-t#U(Dzf~PaEi2d zCTxv0YU!8CT`4!>*>(w4^ejWY8q;0344Xo)J}1LT%VFb#f+0s3^)~R zJ(yPX%)B`A1`EA$3*-!9obFC}3!*imR`g%deYW)%Tw-(s)8Wol9c^#sYe+p=zTY^d z`7K-!F*M0!pwq=WZZdBv$}N?ATP}4eu?-$uQhC0#IAvwh8oRZ%YZ)7@wIgu2M|+$d zkadb|y~q%7wwDPtQ_Y1&8~3~ylr`yKnMa_~Ty|t@dgMaw-$oq)cTYw}O$!XMInqfI znPTlZCCSTm5tpTs>wdWdBcT>xsY~^&v$_gx+d(TJF3|Y6r0zDCU|Om!KZ)TkU?8%f%6SA2P|Eu9KCM#^9Ciu-cK@eiiCTWqtDFiRbV% zpefM8%t~SP$BLJ*v8Hwj2g+40qOA$*G z7vNW_(}c5MEy6O7=I+*SWS%<>49?!~D;n{{4Hs3(emC#{#q%T!OIr)|5yw^`3-2^@ zJ)^bb7>y2$biRjUBY__ynx;RhknT_MC(;Y@wHv!{XIVQE{m>j}?66Z^s=F&fs<-bo z^sqjyJncn~;vYngW?kZH>#M_;B>C6A=Syf4Q<=fa9jsepA)xN7Z_cRRgRYeZj_tr4 zWSJOIp^K>^HdDWL3p3*0T^S9ld<*MPREXo3?wEMm^VRY8+D5gNVLkFU>uux3q#`Y$d zgAQ5J1yt3_zlm=It#EZ*Bjz0pzb`Jyyf=RSX{s>}5+M0GWu<@@Lc=e__F)5OujTOM zHBM=_i;4`^5eLp@!aii_(h<8c+O@o9B&7N6mek^LVGmQpxFuQPj`ozB-2&_|&)C+a z*~9JnvtVCG5GmX-)hi8)J$$vUw0Qq;sXMb_Lsk=`dRg^kwRa5F=_XJk0KaOV0!$JcQ6+$; zMvdX1n9wbpiAx!&)iJ5XTf-#aj-kxs)mrQFT1bl`t&472T$FmJBWXL1(Tr>QjcDDf zYem8X5>p@xoyUS!Ruqn9kCfNV@Qu6v%hv8WF8k^OE% zHz~31=@BcK9b+!}A0>E?~_W-rD>Nw`Vm*&==$Nd^)05wvRB z4~A062c5f*8y7#U>T9ffVjJb{w{(}|m8IhWHi1jz%d1bOJK4$ce(9QU!3!1`k^@(2 z%vuPZl^)qRPxKI6sspu}PG(^KIQ&C)*oS|GekqZzk0*d@YP|I5AE7*$rd>{UKjt~J zK2Ou@hn#%M<(;=ar_)T`1cOe3j5moc$F<@1I=?4frbM>^sPEK0U3e|Y98skRWj0j9 z%x=l|XB)X_U{VM@&wSFazd20~B(Exkf_=<=R(Pr*N%X*SB%xYk@Q40rik_6iO-@U! zw(cOuvel%^zUK!-53UgOzj8kTvW_RL{+poB)>!a}NBX&_jc;`v4|pK5^%&TV%sbI5 zdY4r=(_CN1t*j(1EY~y7HipY-lGK3#erUwdrcP!0cYAB#P{ocS${SF(OEg&}$*IpH0KcQ^IN)QCME?XQL!#( zQProY3EvMsHe*!YKI=z`-Ad8K0g*XY!ybW9v%&7;?6f^9B0d_jI?Kv()@{q1?MIo0 zSDr%#7_~PvTl)XUZ5D2H_EmsF26+g?I+Yt8+ckIZND#Ggj4r&WAen=FLIJ#`m2l87^ux8;3XTs z5%rN(NqEp+5O6%voe=sBrJ!}7($Wf6b6~f&xH+Mqdvub)jj*}G-8RdILS8{?0Jq&8 zky3lCeX_NIe#Se*8qHo&gPP_SMRBPbJ$n)?rEhlDe!npe2B1!S_B#lXs~|_f2@qnV zMJw#&5cC>jFe<|D1_lr_FM9{}s2Gdje=PoEd}GUGw6(F@(J6B|*rU}! zV*|9<2B&xiR6+`eE!FZe4K$h_J2GE*hwlmC4P7y|n^zGu?-k>JCmw{chl4R9-ZaaN zYrSLDA++BG)IT{jRmpR3Sg2H%rZI#Ex%LLr_8CX_EQhB^%iY|eWCPf0>8e9)Z1v9~ zKLTVEVG916%2xF_&i7s~CrE%ONL5!*bQyV!iGRNQSY&BhR$Vd}_BQ1v)nFw3?EAzJ z)yGdhCxJtJRmH4gj@HEF(4%Y?iCo?08Le<|O@-sm`Q;;;P#Tf9KGANDcG2%`Rw^~eE;!N=y-=1w$cuiQ=_-Wl15KKED={4d#%)r|wDu0Ng@u!S*i;(nIo z)iQfBm<7@wSWHmnvT;IExPwP>lG7{ZslUE(5*e45FHKl)@kaAAFs|kcy&z|Ppjjw5X-8>KQu-NC$VgQpGYXtLg{p6C-BYY&J)7Ve(08<`c8VGAFs zdo!RLu{^C5BID3hmYnCai?7N!{Gq-uLufi>n)z~cbX2xu2ntbAburMUlWw#Kn6$1m zYO-YBi7J=6q_pf%d-GAc#51copA{TGUo5SX7ABpOJeR0m+ ziv_!ihGs;KS$xtjoLfW_7wp@WKYHG>D~NUb>XC1L`^yzzaB1B9!AC}P5U7<|Tql#F z_D>#&4{t}wCDvFFvfi_GDORg->Am15L`|o^DLH0$VrQkPzWfg4q@mXlvYlzMxn>O+ z;1GtJTFy0DeSXF5Po109kQM-0uP(28Uq2kqFDMj|=$S2Jr+|I<*;cN2$3A2&-6nFj zIT7|`-vxPIT%{0wzXM}(wN9iv>9M@-;g)^nKe~b2g+Ul#YD+ZL%4YQn3UZanya9JE zcPBif*r6BUI-s~lh2Cv~dY=0fLNM1h$XSSJKu4K}JfNynks|d0TWR6j2{vaS;sly~XGIJv3S@c>9}IqhRnT>6=+pQhRTaGn`JrQq1$bZoC1Vg#up<@*lfESzosNHcKrunh^!6mdV?V{Dikr`us8XX(A%3@nM7)~ z)W65L8T~LFx;Xg92qUW%X}kh|1J30bwUZ54v(-b9v~}0-tG&S2$!*Cs2-(8!ZcQ2L z*~OlN>hZO~Y1wp%{&`pryR#yVwio68p<;3Q!QKvyXVte&nAz2Ihr21taUebyWEDko+=+{<$Ba~>SnlC zgqOCTn_`zca|0gI3tK#rtO)GcjPl9c;0_7YTU0f_>sh*3STnj5Y>-?wRzSxxAM39v z&sCXQbwz<0dBJ534&v(`z zuU6*8E9y}zuUZ+l<_vLb=F`NF0Gy;|c!)<|C*ToFvGo%bk~|xSJbgRK24rO^w7S>p zuq8aF;t*evlayfyw;1|)z3T9`-Nkr+b41Qz3~V9$CEq1+PzSEe%z~EDO&cJuj{dN& z#o{IH+8Ek=`{dW7Z#yIIvjRV^(r#lugfRHzQtGLJDA`^tGt}%Sc@vr*d&X7)5D5JT zoPCa?-q${%JSP==6rFduldiWkeY@GCMUk+fEAMuJgj9?%+&O6$mQfIC6o0oK`i+D8 z;18|oY2*8B2u4uJw1)m0*)W)>w+WeLdU|CIl}xf3t6?>_-AnkU<=&wt#rz3#HU6QW zOhn%q@1h2qewX|)xi@15K7AjWsmGg#GX%*CbB6q7=bS+ZM@CMez?&;Q3WM2?i!fs4 zekm-~s&Y6i%vMxomf<0 zsaMVZ1bK|TfAQzj!x@ahgbByF%n#T5#?k0Kot{Lfq27=E33hw+O^%Y{nrC7=Cce2$ z7TFzmY9c}MkVQhYaraYo>@LBjwoT7spg$M{?!D_z3NBv_wsckXic-)`j-t<1V`D}dD3&wy*rlE_|yJtgV}*y+1^jtOV^4WGFH9-{ zcao_N*p;r>(WS&;hHk(pDU*}wp&V(hqAXNSS0DWKg>HN=v>(RaOCEvVytMa_FeqjX zip1awX8kR0O;Vdv&S>|T#L`+gxpNx8yQ>+TkceD>t)pgElXC-jXbNjyQpF0k?s`a)JeId_#q@%rl8M)pxlFR< zNs~2q1(0NMk2)%R#d(D^%wGC#y?vCfHsm7X`ZWXdY@FFJU5w zFf#PcZ2g=R*QJh2HftDHdQ=PQr6UBYGrjGRPh4V*ujP1j%t5q=TQnW>aaMA#QMNng z#R#+5dFaVaP;WOG{Y<3eE)pOUQj?bie|S4Ly1HC>%N zRlXKpxHda?!NYR*SIuri*T!be9~Sa7I~LZLI&IA^P1+o1#M|&$)L0wT=t#TJuWD|* zz5P^Z4Yy_b3~#bZfnZB5EcsAqXXE@%^T&iqlyOiRvWQM0kWP(v$A8XO#1vcH0Yqd0 zDTrPMWJ8UA+FAd28Tgm~kzTg{*Fk-W**+9Ka|`H@Mln-;%1Ge0q10>Pp$@JCI~Cay z1IxWMiYS-Ag~Rr>(?YpYH9qlC4q7HOY)eMV)BzqdV)q}!@m*WJERpKZN%H;1h*i-; zaC}gXWsb$~e$?E&WJ8bEp_LmBW;PE>2Cq}ep;s2J@aV?hT+1#Nvx+n+M5_?gft!~G z8I!j%STwgQVMkLUqYr%S8s7R`5?TywICcjGc5dfh3x)2xMohK^Y~xI#Myws6pH%tC z@f7{S!hw*O;j3HDi}UL9Z*HH&aN9BS=v7B@{f zp{9dEUMB^UjQZRh@>g2AgO#ho^GvO%Qg!pL*j*1}jryyt+ZG+PB4WXWneb^~vt|mz zt+jVWPw(1p)z}o5Z15@FZU6v$Ce_$lCRAMHUJOGirqeiC%U@1J+(PUoUtW&6568uj+wGU?!JpmglSf9N1f9D&hw65 z4VzLbYEMyk(G66$rjpfb1{a);Y%wdBl!dOiPO9F9>|oG=1M&uUNmlMp^hfWfI&kK# zTDfwsqn_X5DZjnQVIk+(B`S{QE$H7j9EE!N#Y=f32L@_Lz*KJ`2mxCki_iK-?`8$c zDLvp?9VOJ!GC(HMWV$DlRNDQ2O#ko8T^;l%I%8?tb4Q8BthEl{n@GyXw*=;p>ZC3% z<(XKxqjEWlgwTj@12r2|lFloWmuYy{qC%E9#;?`L#rW^n?tZBI+p@2>EZu;kZ6`dE zgSR5#XxN}yll%N3b*7NF*F~2)Tn|*g<>L^|r&!#tzP35b3i()_c*HAS@Al}483o!+ z?$h0eX1|Hq=kKP*as+!wuTeR(%G{cqrqS+LnTp_?HJ*XhXq zKI-lT@kD0ICt3MximOJ*Yfoypzo(gN?dN5o@l&4(`mki6Ls=LsGXPEg^Dt1HA!ke%SR?AZsr-qC#XhcqI8w zs;A>VTsX`Ida1&_-6XqXNvIK{YJZ~)W8jYBcnvszBa7%I@s&ZV83!EL)E~d{u!7<3 z8mB@qIIc1<-|k|Ul8#pCG~jL2me1;eqP^QnrPD2^%`kTsj*7s>c8BE z;z~SGi@{aXV>7bo+4jRhNNQz!q#HM0P&D++IWM2nW4RXAv#n!iZ5jY)IW<2EpECdC zWVv)EEXVhaI`0HFkHwzpW+24 zZ!_$i3u*lMDbT*RBN0)C%{b&*mARfD-rTX;0|6jj% z|Fi%1B`0dXb^fJ0_4$Zgg83PfksBkdZI0OFAM|q<_qzqjVY3f=X$iR*dxv}ozAAEm zWiOsN<;w%?+KUM%BP;CTB(Sd2MnEvv+%&$>b{2h}3hzc>3(twrwxY!k58gcn zX~eC}FaTgGzv2zJ@xooyR3Ks{z{lZW=ux3;bA2Az*ttC%DmRNJqjvyQ_U2sM;eN23 zggtO8sbxX^=tF9?G+`50-uFW@guma-hk>~r!z0kpo z_24D50n+0GjAJ^Ye2>HqtJ>6JjX3DoepJNs#A@2|w7mieFesuStAualwXuh8nn`OZ#MMJnB6MkEl& z%=2CRU7O3+0w_Vv?JFesR1%01HLn4p#LjELJm71$Lv($wCEjCR=3NVnzh@Ocq!ABL zU*6va`2b$g(6P2_%~1m$G5&=B-UWEe)D6@PE*1`WghK!*KhYxUKU#3F$ebKSPR?!x zrlNdZneoLJ$Esg#O+SPpwI0bcu+1L^9@U!b+%2CFeBHF0%}w&#@AmOj^`RQ+PCki# zv6nD$BOw$dQd9l@ZdA({9IDm=^WeXsPF?GX@4{-lmqNWmN)}AfT|Nzj1(IBX1GFk8 zX$X9t0r_T5CA&n|i%+y%|G2bX(|DL=$XZ$kS)YRi`wg^p7XQe3F zRc2v;sEaw^+ty2fSTnx(()i|5Ykv-BckQ64`38A3B}ne-2i`G@n2jnhOwD;pdGmp{ z+jskUvt6vD%c{C0r8-#)s(tUWEGma|V<9haCVpG%XnD=}QdjD@guT2ZnjZS&q^!>! zSsA0z7|F7&|B8XL(6{QhDO8FH$67trUod(iZ$5+m@+q zeAy!uECcEKWYXH?WftKTzyH_Wo8jIIaMG?`9T-|iRc7?M4_r+f7`W=XfgzrQ58aYy zUJqZlUx->Rw$kOYvG;8bbhYh{IbUzudp3NvxBXXcEo zx1!zdb>aD*xb$m1Nk;84gX+lYJ^sFb8}T6%<@`eF8o4K@a22pK= z>@HR2%iq0V&Rnd>PtTnj`Y66MvifHq_)Yr*vWW0^?Yc z=#?c%gh0SXh4_Lr-S@RO`R7n7y7#K*fbrc%z#W2h+YtZz86Izlj8SQCHxZAI_q*H1 zi3$~$=7H#3a6^WigmbDhl$u`~S3+q?n$kDh^oJ|j9yTdsMxbBctoT=7p7jO6ZjxE@U87BoLH#Zi7m9Aq!E+YYV=j`)Jdis{<*gcgJ7#C9(ZUDXTo%=zJ7Lw!G1N!vX&FJv+|c%DQp5TT zBTFOo>f8{4SfbMY-PHltvgo#)N{PDV`leGgw;JmOO*IIB8=dAJO&pz{c#LNF_0L$! zPv0o|&g?o<(=tHlX8s$?pY~m}zh*<|CMOzrWH zo*rr3cLW@SYkC=Dn%?DS9UoxopVJt4xywCmY<8|=N@$o0E}XmAcbpB{PucLbKAy{+ z?xc|3hQBLz*(N-sMQoKn2}A#%FTyD4HvBmIdUYWz(IeOV=LI+mX=d;S`tQ~Pm|^=* zS;(}S3;s2-ZOZA2;c(ft!5?O=_QzLiKw4|J`ob>s^?;Z4)y-`%Sc^?$`GVDUBn^`f zFn9g76Wp)C0&1yS}YugR1~SD!e9 zpP#17>H$jXRd?=KP9?6+qW%)&moL6>x?a>6J%yq~)n+z?wnii$pAPL=u4>mD&5k#l zZ$JL{djpMZCaCmz(LcY65)YN?JK2ao7HINpY+IH4K25EiX^xn)^*xI*n>A&Ku}{PA zN+O`4qb%giyIjY&VWfC(qno+R0meCq*U~??7asw#j;g&=wh>?$)D+m(;F@l-il+gM z=-H-QJIWmrc&Gm~oDe(|2nStI;Q`PU~yLYxGZpv~;LM$Y&k^GN+;f)AgSR;bD^j z{?9MI$Z%%>0ljZ9O57gf z@HhJB&n!&#hcTC*`9BoFzO1a1Ykgl_5H9>FyV$PoLLN6_{J!tSX86UbzCy$T za}3IRD0rI7(+mF>ZY>^}2`Y66$N#k;{ zCDO}HL^{BSFGLUZUL(C0$tyQE5Z_+=JpT=phGuA>-jG#Yj{lcc|~{xJ-QY3 z?Z*WBK-BjQP0@R4o{lLg$F^C|2so5!V}~Saj^$py+2#&sxDCK7E3yk$1KEUs1Bd!Q z?R8{7L!_i5MP0m1ty$vUsNrW#LN7*N4-FWTn3wTYeNzJb+$ z{M8|P;oO&2uNkF9#G$1-qM6u$Mj!R>iJ#@)9c_k?mQ`Qv9irz1G9v(0#jqVPp!A+Fo zC#I6q4hexm$gD?P*mC)t7snio%dpZF@a7(v^tuw*)zrIKWo2ph8BNQ%_fBgP&tJ9C|lba{)OPUhGcZ_6K zQ&a3_YYavwlF#E*xn>C2Z#->L{WEHM=p%J|M?0JVu6K-i5IvjF5pE}NP$iJ{Mm%sK z_c(7pJ>(Tl?gaJSMYv==>;3bCXWeM?&+(MlYbEw&%3W;gvd-b^YM z=uDQ0=bQ03Eb8L~yj>3Dbu$Xv+XlE5B3VEi4&3$AgZmi{2m3&IPD`C1dT!PwRXND} z($FSkIgRHISG_GF_mA6_M~E!~yudMb=l0|<^IlsH^ug?S9;2o~4N{KuaX2398E{z( zJm%T(dHwUeJ)Pt1`^!?-1c75?m4%*FYioUt#{2OjexeDeiF|ERK9;Kas`$Wsb>`kf0 z!3U}sst4829^W?`^ab`sgj!c5cu8oGCzldF2JEhsQNTuS zcdGW1a2uX6&5Bej7D#ZS*WJ*`Y8a&ak;L-09;6>QT7bLKi|&RvT^YlS0X z>-eQdo1^00wcm&LR;QG>pp{3V@6uIWNHIupWgBSLVnktrW-Tpfd{~r95~2P}+n&=} zSw=#sR)%5flgV1g^aI(_b+J2XGWV(nUZd)&4D0+8eAR(~ zrx@>y1(W10`k;8$g3am^os^TE!8yD=<+y@IwbDG1ZFh{Fy*V@aYhG<^BFN4j9ESUI za69?cy`@9Yl}3c;m#NK2e9^m@0Y|ekZu>LS^z*?c>D^a~CS*NLzfEH%+C*((EYy20 zLufRPu2{?z1ZFHa^~(aLtT{V zda%iGmCBk4v8$S0KfEyS%N)n?*?BZ{16*m4$3_Eo--Q$Dm>k!sop?ODR&pKXyEg>L zR1JM!04$|hp*n&$GF0Bv-zRj=(02~D1eEHLl8J<*M*0|FL2B45%7iW>#(6uAXmIf%(b``$#*eMY`@!RcbG(N?3IK6sdN#`L>yc6j8?ma$=_!J*R0&2V0_u++R zx1Zt9RkftPqFVD!iR|F1qY0P)Qa~!OZ zX;oRrxNZJ0<~`N^@J_|p?I;R>^f(L7d%<5%B)>YP_u~l23DC3$tD-n;7AMLw=K5IN ztO$PTb9W^Bq}6QtG~{E4vZI0|(hUIAaPn={>#=cDZg`G;3bt%gz+g@XkCP7331QRk zP)_mtaCUW{1>+zlg~bmg#*U$~pM#*k9ni<_YzC!FVoob#ULlWs`S&DTc?+qqWVQPp zCrQ%nR9$`{vQlM^;r=Vm{{ts=Jzhc4+VFYB+q^rNW$$9uQ%AADsovS6R{;{9-?qr5 z(@QOim7riy#4ALrc`C#cDoS4s)E_jFgc!u`^xRsI61=``;l@0AnV0-KG6WET>JGiC zi7j`@I*xVG#=lPpENs-n8=Q{{n_qv(#A_RccWio*)t+&j4(d*GrDtYfI>tTaw^#Uw zW*JbYT7_PJ=*98qyKb`0%D`5)2IF3)D1JRuKs5?mdW)Yxow|_fYaT*N$b;j?f&$|Q zRlT4gUOdl6p^%O80)_msMO+n+)8a)uX5n_X+r$5~nO^#EB9#v5)B~sefQfdR(UQ_5 zFnMBpXso&;F7%y#GCP%{Z-3nuwcvqsQJbE1mZ_=#fLo@UgdSi#a~fjOiP?Oozm>js z9hBp5N9~?B3f=RmDMddFwPKgQ!A0NsetrkC-r7@C%p+87Q%_cz1=C=rr@x*&vnt6M z4uW8C^heUAb^onS=r;_~E*b)ZFm3E?C8F{OP=4*LX_XfNrYFW(q{x0}t5#bw_2dJZ z??^?b=jBAXBF!OC9&Ldso=qYh5H{2ho6N@%smn2e)$kTB?_E$-pS{B4ZL(Zsc5)G2 zDs<8k@U?DkGxC#^LvLg+9$cIh8_5a*Ac*134`B(F{xAGXG6pSGbDuhxJQwTUBr3AL zQ(pWRyOLc&hABNp12b;{fuTPqz{(dpRxPVdj7gajxq1&2;G-SXjLP6;`JHlNh@cau?N z2jye@U}fr!9WhA|^zQeNJXFb;t?<{?T3?+v4`ZTFu4*!m`mL@GdR`}%k$=f^y^Rx?WaKu3GPw8ae*(iPGyfpisEnvD2-Y{{CH}muu{H zBk!p5v<)%X*Y!6MfQPz4v$BvvIcH+l?l|o4?QV?3@ge>s+`@@95mFUZXzW(8JlH(8 zKp$5>vgjG_AKyim?!=q?K2&_?#0PxdStFuM~$+S@>UHyj&Su ztHM9nUWkF%rc1HZlAwbvJxj!}jMMu5X&JqD|6b6a593J!Y%MmJo{@-4t{$e)PT!4; zYq&X-m=(CZ9ij7Km8nDTOXxD|3o?WJI)O`wU6h7mYaTQ#iSi;ekq65QFGnbKrj`NM z!u>K{EgdhcnjU@^qclBqDC_ZPHLmEfVKz~ki-pdT6-4#Q^a*)EzE7U#IZ~);WMy_a z(uL_-Lj{A0oT;0eCS&_MFW;VQ!7K(rziimI)Zu}Q1kV_(k6zq3Cs9dJL@?{>>rrib z<3ioaPUJ^E>DqY3P%qH6jq7$B3&ze^WyZ+RWis6eH*e?js|gc8>zBofiW0K|{p9V) zOqC1Oesrr9yNiNwV}lGXEut;JzkZ45u{n|XFkZiIgQ~olW>cdZ?yO$Y_-t^{-b0Fe zT-lGj->-mJxWDMJD9#A2r4BqWH$fbQZprCOlmlpmK5kG^Hdvn;(HHv(L3%RV2XP{X zwoexJ6FKFm>kT<81K~{-3QM4I9!OCzb=#uPm@uHvEyv zJAPye=UNyp1ANqT#RpzYpkT2|YrKaqO2oED*>ZjfJ#s#YnC9F(DnyPBb*_{!+E z>&&K9M}x2Ty<6i`0X5{a5o~D|KeTV3AQvkrKxP#{!rhy z+GFXa^4%xo0o}?G>b|Xyv0$z&{a@zJ^quWQ|NC>!oSFV+I^}fKR@<3s8C8_jzMV5I z+S;a7(k7Nx>_JMbNpNO5Qzgi>YA2a$F+`%4h#-s-p+rhZNQjaUL})BQNaoJ(!F~S? z_p@AA9^|?N-_P>?yk33>W)q@G-qK!1^*ySp#1)er+g6|D)7~x`AfvZ!o4pDNVdnfk z!oPF7ug;+M?7?6tIuxCl)N zd9H@vB><10LHPd7kKGMKN8k5xaDL_H-l9=EzCB~by)6__Uf^h^GMJpHv2eNHX)7sh zwO)aOtc8_RlK{ZEwG}!1O@_id{xKEVGOah8Mp{31mz^>m2AeoXG)Ig+fks<=5)s`L zs}KW|8JtsgC<}V$=zn%|y|x#giwNQm**#OJ$)CnEO>0wYoHfHj6SHW2@qnv`>zp>q z_|sQ)K=m4LZ_-5g^fzfN+0bfJ!nWGoIM*1sWBa>;}4ugl87Vv+KqD zmp!xht4Y*V7)V0BHDBo=?iggoI?D!coN;bVvc4c}90_mms8I`f|NEVi<&}b>%PSep zS$i0mM(ksbM#EL#`j2T38G%3->eoa6(gq7Bu|2I(Fh|aB==&+tS#Be2(qg zYy@`_rCG_%@2Oa0C@VK60KXR9t}xD)>*)jS>w;g_`(}-o)Eo5PD<~O7TRP&*!wYuf zd~R^8pg|An{d3ca3r7~*6KHq(R&+dnB}#Vl2rJ`VrDVOfeLKOH_xT;)7{{6eD2rp> zR7*RXiN7x-%Z@Z@uhBLcl;oMpM{kohymbGRKN#L0&h>$=Nhub1w6_1+=0ny%qc35U z-LX7Mpaa$8{7Ykru9y98RbbFQbEV1wiW+qK%+^bli#icDm6nhVfommH^MIUz;OAQb zZj!d_oUtN{EPTcd;I;wY;IGd@PU2D&_ETeOP#KZG%!XUxh?TJvq-kPPBAxc}d!kG8%P}CO zC;Q9GUqUPjYW6W9(wgsRvB|nu<9Di1eJD`1kp`Uxqr6WLHG{RTz}<@t-Pn1IN`B}< zl!>*Fg!jIVfV@6Zs~2{5K&!%vI0Eai=rSSMf){{c(_)D}6)s5roC(w#ea<7{MR>Ty z{k%5Ve%P?r4TNdTh*+6$uvN@+??&)v+SC5=fNDV9pP2iJwq)HqGPJVK0K#Wq1yG?C z`c%75y7R+&wo%GPfLY7Ue)Q;#_wzkp_pegJHrz_52U};dE0guD*qd?Cq|TN*(q1fa zIR3~5{%Dpv#j2Q`9emO^?BbZZ9rCO`IH^i=-4I>`V5yz{1HL-Q%F25Eei(a(P_x#5 zs-M2OOnYKLD3Z&0Nb8VsM;ni%Fv~0Zon|B}iSW%h%~_Su=d3H-2Ql05z0mTOEeO4s z3`>5g>M@Qp*%mxio%p}~#_RsA0CLN(l2FA-LYyk3BdsV>^qizijzwf?{1+dwuXeY* z1P${x?bzPowYy0B&|RUW=(*ySeKTRvg+@zTT`~gy^rA)2iRp@gbZpK{ICa~GLO=s^ z&jTH?7w3)}ML`PhRe5C}KIKx8K3zM}4Kgnw zYjt`_tKgt z$c1JaZkztGzow>O@-`3r(tBi0$de|7Vo>(oQ@$7>!aMs{7-}^ z_UNf;v-9aG5XN&q+nu~?5ZUW9w>QqF<%H1%sk4qZGi#Ey`b%2?)XmK5VW4jAliKCS zA6B!ys)++|fX@{dyyoK#^?R}m?Ay6DBH#_VJGZ>Z8Jzw@Wp&Y+7+zmyhp?U|OBI|l zAhZ+}$5&C>SDX2>t)5?1*NBhbA<|n$Q~3RX$*$gw?~>p>xPatiC&y0HQ0ugUw80RR zQn`gUy6xY6HM8HEgBz+P)eI$U!;&hID4cep_HWFmR%99vu6DAv zx@{e=L20@DXijCmR_Ts(BpT9x{x`Xj3ql?{&F6flPsHjMhh%$p&s`If(ZlV!*=4rd zRsR?tXD9JlG16^-!PL7&@5E#jfa5xf+g>O$VpX&}2-~nkAOZmkcPPMV6F1P3-d7lTOD@u&2Is&SR=w2G}ZwB7}cVZ{kiGqny&}P)BaIF=(dQqn8;-`$LnfcZjyiAEI(Fp zdb$U2ZybH+!7gM!XfnuA-r#Mb_KZ!khq}$cJz5i&85omOR$s5MSQ4xi$EaS-)vJv|GALx$38AJ&Av4&wIS0F_*ndj zZ24B)6B5>w4vP@(WgaB*e(I8RPn4MJrQaM_O<>(%q@9QIVRdcaa^9DHQcD-_372j%AlgOvN*PL)XHtjsvwHpfdl)cPIb+5}>f0g>hT$ybZ^^s*!_549IU-X3W zXqi8fP?e|-oP|A-<3PW*^Kng&RwR0;#yN4hK3^rWI`iN5uT$25>SFC5_ubDNht*N9 z2`L4L#Q^;`O!rr>2n}UtM1x`ecI-O%4iAvqi8>^a%tA6o(MFUq6Tg|#9k;T_)!LW* zod4)P#w@qRb3i9q=7Wjb(Q|a{b3hqXtCL9@ULxL-wF+nFdRHp>%7xg_O(4e*wt%YI zDHA0YEnb4ORfL4GT)(g~Xnho0A~&2Nh|+z5)-9X&^H=8DlmB2zSr&ILGxhlmMkTG! zX}c!ABidG+7aM8>ft)vqZP-wAHq1hSL)_mB#_;Xu3JXK3&#Gi+-?Vyz+LvCGe(Lo> zzLfSCB4v=SqRNGJ_kb=xZKTPSIoqQwz2(^fyJ}~rBmCA!Cgwd!b!EBzpmIE&(2M7z zkZoU@HaMT^?z^u1_otAg1!s59m3>ry`@u=)XjAY62-gO6Vn(erjjsXB|J>~EC0aXs zXk6jqhAP@0!hJyQws|%5Ip1D;nFlRJREMqFOjbD7O_!%9tLCUiPk?E*4Tkj-sPs+) zx#t8{Vrtnd*uF`0$#mvXlUd}6+w=Cu48*VOt_(g5`tukew`_i_wb60;Sm!FE!K6kM z1`Xo#GjMuGp?i{(&GcjA{*qn~bJl{#n%dlJa>^E-mMI5yA)+ z9Io|xRq%MUQ>WGEmMJcF&cU;7yhOh}gB(r6;UD4=L~r@nbazUwGwbA=$9lbe**QRn zWnIR}ULo#}!8piZ0~%EPz`9jcit0eQkH~iQs!w$r z`1xJB<#{GhLUr$oIh!`hmLfW7e&ntd8%LKdYU%sHV9VrtUc=mmPb~|%!`BO<2L03- zgNTavVNKVZ{PA)t*c*FFVf@@-uxvFYlj?iCF_paeu`kQTA(l{Ct_&}ZZ@0tfWn|t> zMmUE4ENI=6iSF*vgW~o*ak^DnmcVb4z$nj&LO5?wEpCZBhCOy@$(D-FKE2Rid4X@A zpMm{JT4eMVQJeEh@i%@Yr_AMOm~QMjlisX+)tY9!cGekgDxmMOzA& zA`6sb<6X0xsEwGP&KDHU&b@zIp;o_t+Fg4hpsqW*{=lif5dx~>Ri5W{_Xgqg>Ru%1 z>}>B;&GhwsGgp6M)>hF2+B;#{?lj=g4RUjJ<00N3h$q^bDRh$-K`8`$im>NnmbWY;A z@2u6zK!err-Lc410^uGb-&R~kRP7$3-}jUZdpvjJXkErwUV#C`)c22r$zM@e z2L6LU!-Oqu801TdX@HAtfLu2s_PCn(u|w%oR%hn0!~7*^e>-Ds16$Pcc_Up#X0*mn zySl%h@Ij!6#J()=EKi;7GBC^=GGUhzh%wuPCRdpc0rh{$aUb8%! zBoPk6b`CsdS#qPmwRstt`8d2y&%{%If`?BSp3#25sTWBpS0)(F25*N--iC_66cvW4 z-NxGTPD^NhYBVT0gOcUv)sSiFRXDd%^n2%aK;pg@k+~T>Gc^z=J^LC9qqL*LEM0W0 z7r~co@%sVAS`PJBTJ2#?3fn1Ewx50Ub=-%U#R1ldK`J6A;OAMkq9K2-Ehy8!nYPrJ zYr?Q9cDo%-XlJ$yUdTv|)-RO*IT1`AA4FvCBKC}kd$?;4+myG~vYj?=kompn73js_^VnA*Fz}(5$ z&e;WKJ#w<)12ws2rog3AWm|8!hCtV0!1Hd1A-_{x!PP|>> z+xrrV`)wpLDP4N>fJ63@|3pg-^OdBYkwz}P&L5)?CSqZsrK7Zj7$7sT!X{wYMo{la zSTD6^O_+pF*R3PiuQ!VFg$NjS;2qG?GC=m!HU7ktT@4<5!C4>|5u{TKirxwfetQuN zrk8fY0(-ouGMBE1{D>3pHnwk}a#I`p(*OEw?%TrR=1&W@vmvjW*N#-%#BW>gyOKMv zKF|-s=Z&(og5%of7ut{X&v3VP(;`OfHX}@KT$MLYpY+uyM%PiVt{hENz7f`Bhq*fr zKRyP}K4!eO%d#|rXbrQ6FCTIrGm@u{md!QmEbIu8x~@*^6ZQ~o?P<5#q-uXxm=1IJ z(Go??9~@wLKachVRx(hg)_3}#189YU2Lt#P$h7VFus=}nv|n0M;zG}F))Z^k#v`*F zV-Jf)h9H*`5l^E*=vSLazFz!H3^BANl>U>7h`S}YGEyJvw)xe*Z=oGSLmFUx5=qVi zE?dhp+c!>WH{f1yRBE&^NItW)H*Kp^D0w(D%i`f+iC3f8od|At*AB-56;&#UB_)Bd z)yYBPU<2(D$r6j%iZ&Tm^ZL?kVS0AD5Y?k&w~ya~`UQi}=0go6-jE91_c$H2m)g&3 z=!Nw)W&iF10n2YkA~(OjcH6F}JikrWS~7Fl2R6O&j`d=gV}o_KVB{1F%=ECTKVtH( zOIClnO<(OszUn!AbH@OfV8$ip>Vl#D&(WDKq?u61(~s>BRNNX6*;52%ywS-4KX+z^6Px|Yd&i9Rn%k6 zTVg_PDDw9orTG!!Vt>nhgR{4~aUmT<@cwO)hKIP0o(p>E-BW+&#!Y$!H6P z-ALB&4@gYm7Y(b)b;-uC7u;<^BcZVl8DO`SQ{7(lTwu_sf%I(w9pFSJUI8bON8-s4 z+_Mdw!^zXNthzQ{aWR$h?~#;H1?R{oid--}(vt(3ypo`M?2yQ;cLS9t+1wxZ9LO(G zSHIvndcL{f`>>xboE}H?Pb;j4!pb)=-ba?ks&ZAKh05|6-qA@GF=FzeFkS#?t_#nv z+0H*AwF56LKW36s1`GBE8z{=#z0v-NJo-+L!)uF!$Go2xKa8QZ&NE9xjGE>OTuPuB z`9k8ASqX?sG1qR%KpGWc8^&OU5l5hnU{6>uZM>&x@971<8FGX~jHp-FAf%~3^kGV> z3~z6*QidPC&G7N_axH0MP<9grauL%yl&^Z}g*l&Z^xLBY@L7hUwhc+-n+Rd2xULSf zK?X!{rv;)fu_X5w1(cl?hL28fgFyn)gK(`SljzMN8d-8a-w0F3M1wV7f7wZr$y)a0 zv#nx@h!|4MKH2q2q36#f+*d(q$L@D11hScrhWLp+`-JqcQfe+<9u@Y(^+Azy&W(0f z&q2V-ClJ9>XOQ$HpbnUf=5xU5JR-qaba^bl%;YV z{Ji2=R3<*-_GWZ|V;Bndbg0=fxBNyMXOsitW!ivYnlLSl!(hI}S-@Go%Z1kd%H=?n z|5my9@c*}X*=L`fqN_*%Ie!|lyR$Lu)nl9hg1ekLa}w%3rMxFOIY^8#NWBp36AEp0 zicZRX-a{H-9aUMz=1ds1Ir`wAEAiK|tXE2-nCA7E{ z9Psg>L-zHOI;%1x?Xi!ex>v)}-#IUH#xR;HhsuLvA*ufP)96bJ0~^c`1l-kXIJ9iT zuTr?PQ;A9?1g8r#HV;=T@OY85*i8=vLkuYt-LwReo7$f+B z0A5;fXg+wnp&>`41p9m+pkmDoCuI7*24Gp{@1c`%gOC12E6MKdv!f9&+&RjQd7fTL zJj!}BwMVX6FG_E+BD1P-^z)Zj*V|^^m~iB zwY`4WbhZ(08Ihw!c76Sh_p+cGi}gFdPcI@j4?{)FD$nGlHw^QY*s+^=%6NJ@ao7Fq zLC)=y{!Bq||JSGB^3OqgPsyyQNa1(k+wl*4w4)Lps5pNhLDcPjBWyG*W3)7J#wfqv zY61{EGFBDR^UouEb#%~COiE6z;ugt={866s+q#4pJ$R;#1yl>U&C>p^(o7>x!0wNu zW5$JJ_X#GuH*x8{9_db1Gj6B9ka9{__b7yH8}jJ6&WX5qhNJ=0e{dunVlv|n1r>Qk ztnZ&o1*@=s56MKgSK1a*`%)+L>U%VFXKV1JEyM)O|IamU)KBL7)NTR}fc+KoB##6z z_|i}NQ{*Bkv_KgFTSKCeO=!H++Y%^BY4aedJtq$9?j@bU&@EWjE}>UT!qEKPi}5 zXB3@+AYCEr8CVF!+aPxT!SOhBBBO$%V)cC;pawod-Wx-Vzl~@JQf)Mp3}@i4|;`l;e7%3tFKGl*$ag%?0{(Q`XE--MRtGX zq=q2481uLFFwIe^3-c0l2LujIKQr{Ww=P|lp1K?NsMF_=+KV7{qEZgvEB!GA_qMqg zT$bBycWzI~5)Tg3H@?Za^{}nS)1R4Lx@qPreZ7%nwIcht1aFLPQSse_FPc!wwILKYh_G{`#9a_>oQ$P z_y(Ct@PSuy8m9fM%&@yfxQR}k(GBj*?1uX-Rq^l$D&%2}8V@=%T`hdl##+&aY-i8T znSJS9nBLhuZb40GyY23Ky z)NxSYgRGw?P8)~Y{ZNxABviUtY1FLJezci$Ny|QGKC|$Sv5d0^?rW=$A(-pgxw@1m zIriFBrSi@0Of%e<-}Hds4kSWrJ}e(TRj!!t3g1OJ?1WdBv{2OeRUavSR#W`Gd0}eX zdbrSfEz8oNI(-mlaaAOVR}SB=zc~QqCb6!t1~09@FpJGUxC@Oq2NF_4O40w_aUTpy z%L<-6b()xN2ueT&1O^6Z81T-Yqi6>Bx&#IWv*H-3Nxs*11A|pMmZD728YlD@TD-zn z{8T@+Dsr^PK|0kBfC>ejv7n)>)hKrJ4KJ}d9&ZB~97Noyx>VaiYj|==0^pk8-m!*) za&A6*whd5SjP$1)uUIicw&!w;L!JZvy`dOL#nX~EQ>;>0M!~&G{_feBit>=buGp+Qy8;$P`R91}?;D5B z?)RZn@F`&c^o*Wa>)t;K-9e-Lim+qfXXoNoWlmA_2yyymTF%1%rlP`Exc{1WD?I=l zri!ekp{j#i9NHL4=O7!OAPZ~Wu2)7tdRE3?pG|Yiem^$;_pJO$hn>Yc zDhG=53;z=LHtJuJ4;NRWBf1u>DP6xsKtxM6Z;64G&r9ng?|ghf^mRnO6%JO#(T=95 zsgt}cv%wu5$1P)EfRWMb7Sw}-{nVWe5iQs7s~JWMs$>jpYcrL^QdOLp&txadGgSc# zUQ@0CglQBJo2~tl(OQgzg;TDsZ$=Ncqb=hrpzUZkmo!?jLF+hZ?gHQT2+fG<%%8XV zZ`NtHA@oqP!C;Z3$%Kb?R*7l;VGyMK8Fhn~T)CbrImPGMkIuz+Xi-TO%|YH4`1@oV z{by6w0alaG#)QJ_=;9towHhRhdSjgkZc^Oc@O9I;5~)g+7iqs3qeYUWDuPyJg}~0w z7-C`$Vcd?V|1zcWijvmP^=8L~8H{~UfsV9U)W7{HNj|JEPjlP?Ue`9we>qBe7at#9 zXFdvLStN&(KBbqFOH5{37*XwDk4D^FU$_JYkWG(-psVn$kFyGg3jg|yh-CkxXRZ*| zvyW12*`$$CiD|-Kj12(bfD89y7L>fGc|I(Rn!G@%@bU9MjUA77Z=i;~+YkHd=JLLZ z7_%H+oo>pSyI>vvsp`JDgcmgH90d7?pR>XZ#5Q|TQh5?dyzODmUa)$ARk}%^RMnpl8Q05270QSxC|m)1YeXz>e@@ zB)&VyD)ilMTV$K|RRbvLNZp-Z}b3s*=CzR%w1Pb<>RZeg!4 zY~h605O~WzHFdZ_DjARv?^%B(TO!s;*ayT7e^bIZ*LkHlCSRCO&&;cwFt1O`TyTSV zLmRB4nPVGVo>SM`hw>^FsG{MbU#|zDvbZQg*Gv<;SLKsdzC$3&PKE7b+E4=i zUIiS*UJE7V72jOj>1Fzd~?w@2N&;%WU040T2EO#=!D@jLn@XK z&ZWz8^9Dpi{wS;4DJQIFXh$ELWk8Loj1shgy?$fYQkW>dvEwxVQ43&5(f-}E~LMf)IgoKLu9LS-?~Me=mQ@m@N%vS<16~8BaoCl z+yCT+H~0B9*JR9Z>fS#FHXyp^)&KL@@O3KY=DxZqySL9rhcLRC43@ieelN_BsIJiB zD>5V&mwB_a9$mZRsL_}~m7v5qGw6eYPy}wK^gUZIs{6Qy2q>)gR>cZFe3%!sI62Qr zCvMSw6%0xPwd{+=7PlF5`_WkC-G1obcJ5ulzTRe?sL8z1Z`X(jrO7b^@vSQ8H2}*5Rjuos>N$lymVx4+W-Cf(5*JAe3FDbD%IE zWx|zBa2KZac#`~xbf^Z%dHP|wJt2Nk3mUV!w3i}++nxC)DW|bB;g4s1I-{jsITjbP zrZQ||<>=g}OH}*iE+U|SKc>n)jjZqV^kT2*Kwp&bXz#ZYI6$qCo{WjFA94Cs83>wV ztVW9O2L9mn9-XNnCY6>=XR+2)XuewPm>E)y**o2bdTJYBRcNhGXO%ZS&+Hs-CB{KpFa z?#&A2yMd2x8!;GwndzC*;eqzt6Q+g@?vJca$O1Y%b!{pv$cFV)4D*)bigrcJ<7e!V{gw#`e~;{3O<;b@%rf8NhXkU9ZpGX4CpZ!u!3Ju#~M|*z?<$=&|v! zP+BeJ;8WbnXuNzDN#7}L$+0r}zT>#$nJTo82is27&iY1E>m!L6Qn@a*vP<+U1%7R@_w*%x!c1qdZDTmPphDZE9L?UxvAYNxs3m z%yZyXJ63w7nEcVOSFMto?>Eks~qat*4mXuSz=} z54u48>$BTKH?m6Ao9#OGPiboatV64pFSG&xT+>hsYol(HD3$Ehd7R0Ql(^<5_fU7G zx@nTsU`qO6_E(hT?xWQvJdwbOXlmLJ;RK98IMZc@=}yPqNqlm+jtdr_Jqy}53Y0xN z_R2z@czrsI?(U1qT)d5B=A2*#vQ#$c@+omkQxk@JaXzk=7~52X?ue^z%9N{q@iH-v zOnoWyz)^q`(66YQpM?#EeeQk3H=%vVqc-Qhf@E#2Q0bI5`M=2a`ztz7KH)1p{$itT zHN|qyt?hr}t@4qat|PUbeZJ-V3ApM+X&JKGO`*Wiax7g1`&$g-Y_&)U^F%Z*-9@p- z0cvJt<00(-!5sW+)tqZ$T(Eqcj#)iioi3N0iPVzMX3kA2qgpc=8V?v*lIK z5Qoi9Qv*Lccl(RNi>nU@F@_Rg-?T>KE-Psk~XBRplH0oDXK*Pfo6e;e*wU!rWkKd)yf|-L*Xd3f+qCi$|#JP^+a4 z*}Ir!B;VX%b#k%r(~PKZbr9j6zR9S%!P`qP{&5}4;p{vpB!BgS9Uj$*lC@uUbN8XK zD##dWIfJF86%bMJ_b>A11=ii0d6`a+;KAp&gw)K9KHThjqWd$JFokkPdA(w}^J@6y z+yL3ZmL&VMGDazV489URka(!lu~1tlz?*l?v|4a5_t#W=#z)b?kp)56CFj(bx-vl;Esy7(!-X(mK`)95CyAuxv%{PH(97<{bkYU4P2mCI|>`tyg_{$p!(X8zTrG-(rnij3K_~OgZnH z%v8pc{1f4PO8l9lcE|&AsC`A3G6xn`@0zl7#LwQFUdqJ27=4%2Tgt#=yw%MxX>+i~ z;&4_lLPmmZdF=Wojc>BeGdsq;$iL1orww21^m?7nKMroup1x0U-Et2#InLa(XbDc? z(p6sZHjXC#n&f8HIHbxK>6IxwNr*xAdxU4@t{Z-2rMYU{P?cw+ejxzK?1 z*7<8CRr{WpfM7>mgjT6REC6~T-!?-ew=ua*y{VZ!zgY;S`?nC(5vk%<`vp3fy@Njv?}-oh=9{YQ zl{WzUd@|krc4A<3?an;+xWCLc$;;kcl%J_2V>9KubQcvA1d%bGiU~WygD%Wj?|GJ( zXBH`H=hn4V;hdvh^Tpou!$ZmLB4adkam$sK!G(hN-4yk$QVs5N0pD1u{!%7!H(0rc zUiT+JBa~B|kiR}Vxo)Svr}5&)lW0{ZJ#DmS@2$9?wfLPv{Zr0fSATJS?6se_t~`2OnFcbX3sS+qeH2!w1&Rm zBpy|~ILB5+O0sJZk6Q8g*7hd>g{xvx)tCAetzzEBTcHGdD2|~WSquA-heJW771+tk z$s$aPk^j<3PVTPKh<@B3COC0W=ImPa?sfV&wodW2`<$mbDsB#J|j2l zwXd^TrV8GdjCzCIl!1iWsD65{7fh91+ zh5To#w{MHAIql+gcjxHHAoRN3nJYYp0~?N|+I6FTR0nI+m<&dN--EN+0*t$YcE|1B;p~x@7Bzqxf6&GVd!(bt0|cbTSQgu8LU=q^`#l zp{I0E98XkC#=(Swq^2~dkkyX(u3tQxf(PEwOAuSW>Bo$SbvDyz|1F{ECZzEdHSd9> z@Ygq64d<)MPpEm^7X8a;&(AJ<=|?W0&e5ED z?wg4#vZ*(I=AdG0-bGNmgTz}XVmx9D>}g+r985Aj1;EuX#{&HAh1{tR%=VkK?MI~W zLrByllwB&x8RJU9?3n`iu6@WD?jpbF#JgmEnd5pZj-xrl2nLb-J@!i`EO-Lk!OQGR zyfQbw+e^iPIevY=iI~YmoH}b*mNa>mYYHo`cy_oAAeZ$rrMSg|M~a6PN~T?Oe`cYj zrExzqrcjl8PFFZ9aS@Yyg}fJTKf0Mmh7s{?k^AXC32*g>xu^0Dwzk_S6odq&N*ss0 zKN1whsXju44J6;n`2pL+k$`rxfFSxh==gqgNA{X(CemL}pYdy7ifo3nFT`J%-cF(&_Ruk6Hr3b)!`W3N#8Yn5MZs2|s9 zxX_bV`q6)VR?N5Hgy@INp(5i%=K>k-S=~KwQ$~{F|71{jv73U7>iP}J-?B>)4#FpG=K z67=4XVWmARk3O9Tbjh)dYuFM=L|FG+7Zu>R z!3YR!3Nw5ycZ^Y{?3_@MvZHcY2ZT=Mkz>mxJW)S0UF|3GU!Q$v_=X-+t|+08)0xcp z17)A0HkwTTv{hOz`Rg-x(`DvxmHXWz=xb_Z(K?~5cTa7FmZl2!hm=&TGcXZ+3yITS zmrjUt;*5>XeBx4WG2{|%A`DYH%u4peYi%~8#`fom|EVa;Rd23=H%#p3{+N>J2M^0z zT(Zj`dVA&5#>LAs1rM(BAUW4zTHsiaMXuV{Jgvk%rfoq9p}tMNqocaTjfw9`0ZEyNBxc*@B!&x(c$*{ z{7Lb2X!yDThTK-uP!HtPJebXb!V~%X27ZOW@TxD_>wTMPHurfBAuJ6&Qzygo`BvlY zMTHRagFi=xRwve!CF=>6EkegWcLJr4uwjvXzB*KqX&8-OF$QAh=7^}Xr6~>!D5N)% z)e%n5DpCT<`Yc&m&(!bjTm6`jGJ(;cOt}DkK2>C1sgkFESf&^{+1W{#svV;Z($i(( z`<*V6TM_l{y>~AxYG{D)srQM172Z8=GBT&+U_OoX)^D=$6R_&AB`Npm$mk3qkRd6u z*V>NPf&lZ{(<^jQzPN!NOLTAWdx6<%k>kkqWf@hjO|5(Kt60t4Zk6cf=d|6Ja9(>> zbv+jJI8H{jmBgrqpRJYQ)6Mkw2PQ}lQ_|$dR?*5)Vx=%?V>3b^dM!ubz&?%^c2j}q{{@njpmftn*IR5-caahEOb((hgNFn4d2j#wW zQZ!IHGUI>ts?2ibpzGyk`xZyJV@bK}Tk~^>(xGVu@4(&S)%J8udi>~DDIin)(EA*W zz#J(NZ4}kjf1~qy%p|h_4j|+gOQD;fo8iX((NLKN}eK)7F)^y#4=kt2lg<27*5a`+# zp1!I5P__F}k}LmQmA;LH{O@^bY2naT{B4Rn==S`4ihT3^lMDG47(e;qn`oBuv@N9% z;IDmla3fZ=yardwD>~9rY{j{dFNgb3FUP!9Nynt2yIC8)7EfW|si@D{ic8Z{HmdV- zlFL)RUqCUl^;LUIBMzdrdS;werWWrgojR;<_oi2?lt3@aNy!<$30(Gtgi3zZjzUWP zJvt5LLT!0B+rW|6-1Co-gcoxhOsFjpZ~79cb|6 z>XHiU_(_r=U8d08S6#Zb;MN?s@Czb`N~Aq{WjSdFl$k))InD%rv5vMlsW&EF7MZG{akD&6Qs#m`UAW!n_ORPHpq|mUwNlwK3?s+q0B`v{0rMRD5y| z%}Ia}d$S*l(P%XA}s7(5-O#A(TC1}Tgd?ttpjB9!u@*h~GWQL&` z828s_@!K-kor3_T{%+!aRSB2kf6ObzH|2M&R#F7GQxAr~%~_{*o^|B(MR(9MwnOa; z%dxCu!ddI%dUuqwJdPEL-A{u8G?p~6EZ*{b(U6b-r}BzC4Es{Pn++^<*=Xb!KTFOK z_^;1&-D-;w?wW8~RojJ|A7Tm-D@NOKJ>eC1V@Y8yS<^|`+vj%ai(`&rpc1)`Qufas z7@c)*_Q0QwQTatw<3xqxRo)(1;NJo@Vvuh~?_j1-FgI1$A1@+rZGW#0Z$SRQ37~I# zce`a5y(*(Dh-Z%#cQOQjOHXbuRDgOl?UjFhHoWXFbRbH!n_7LG%PhhQ6Md6kFSaKx z6unxqm;l!cUd$*cz79guf`bco*+ra6&zLtSpw<}deqI%uN{FLHbyhCQOf5n$R14SQ zl_P!3N#Jhb&+)lMy&Zk=UP*qE>iT17kuCSu?>i>Vig}=>a^9Hr59@n-%t-Pcgg33Q1vQ+a3dB>zlfki4J(ICs9 zKPl^U=^_Nb?8ugLO%LB}4Q#`p5+}v^PUKA1zWXT})|j8ijFQ|TGFxd)&AZVSZictr zyZ|atBK(lOGqrjryT6XNH&6AocX%d7K-Xnh4jY;h?HfLa&IDdeIv-S!w#~Od8%V)g zdcb4eqdF5+ulLWF@%sm0iCAGt4}u?E&B*X`=OP1ln@@ZqsmY!`t*UA+lDeFeYyko2 zqAWpbIqD^&;q6@%woUmw+b*SCR~2Zq*og2P85s5GiHo=;72feU{#L*zUtny+_9U*@ zvS`6R0H}CV)r8=_)aTA6@zg?4U9G}_;xl+bJa7;(;T%rNxgsD%6^G>&E&flZMZqCF z0HTJP?X>3Gu-sh8^>Gn-+q&kZovIT>ja_ZDM{PFp;HKZ7GGH?jeCPEKn;6dn%k}!~ z(D_&pe_&Sc+)0os2k>r{qkG6P&FV2o6SpTydMfzI_TN+K_KkQnDKN~s$o}_k^V~(O zKYBg%)b*VAY$Bhm+la9<2X8ych*k$3{+W4&IdSb8TnITLH;3Rve#t6S^J;V?EV%0s zNHRx*=JFl3+a$KVSRv)@RV!Eej8~rQDOgG31&m%-jC1Jdn}l*?34dr)UIe>DjMo_> zCji4G87IRRd|ZCHO`N49)A;c>$%mzhz_|YIh17uY+?=8hE2+tAI|xwkQ*4ZM4Byj| z3k|!Np7*TpOnw9{k#*L3<(9-+!^ryEcd@YTq#hmFp@Km$XbxC399BUEGV=wF{nP1<40 zJ2n1%1KOnSoSwapEKSOG94-AG{Tr?>zQX5=2RBP8MEsAtTK~G$u5JA_W2}VVu5K0{ z0R+{zS;32L9sfN^4$1S6xRa@!eJRS4f^dL#6MOL-c3F6Metfls}IM5{E zK}GYpf7vsUW6>$sPKQMQ^a4hPbTrGNnyXwf77bb?@kyh8e|_d=kM_!8@ZMj5bnvKp zYiHz2Nlxn4*6iHTW_j0rgP$O_v(ER{z*u__&dR)bIW0!Jjr7C#vTgIrBi8=7&*6b| z_N#!4{2|ZWz>Omjqi)L8d|08rsjT|gAsG&{40V#9_!YTyJHpu=%rcSI)F%a7ZH2Kf1`Hj$5Leu2*%!x3l?AIg~f^uXqUVdP`Od_BShn=IUGm}&=9a=-% zG5X_&LCsfxdy4_rERv}WpEqvw*oiwg5q-aE8=vxE@Aeo%tbUqWiWEL5E6r_O+R?ZO z*&m_Yx+54Jp%2n?PnP?a1ad zqVM=@63b-b_Rx6H5dnF_KL*PTrGM8?MuWd(%T_1OxWLf?YQq!pv!o=S@d?-XOslwu zbN~S06G(`Pih}f5()Je{|FvHjVy*t6Wr`KKV`1H*~GK5M)4Gx?V$S8FI|(^I7a z^J0rJbh||8^DWRoFgb*43E5bdOk92!_Nv>;%Ip|sbvs4r2cAD@$UX^rBkD|)x+w^f zw9bt3yaHMCYM#U`=Pb__)7;&nt#@o}^yBV10m`-ib&D}s2cjLDHwaQq#{MzHL}^O$ zvst(Du!lJ*d~){4!~)k@BbiHHsNB1M6&4S!A1vd-$*&+6cuxv*)2*s2oU%r`4ucY| zKQV07pUcyl>5{IIqw-?}j<1H3dV|Q5(&}uCL8GYHbZRXQx-Ldm!0gA0XE}6?HWvK9 z`b{Hqew0eoSn(*`{(z$Y*JlAEiIVM2hFMXXeHuI=x-z^uz`)cFDIB$>-^`ytSAj+&z+=fCdUJATzN!nDZ#ZJoEH0ZUFx7>f06u+Jp-#~r(=g3A6mh`r96 zWT;2&xb{a?&ZNol{sQ) z%gJ!^?K(2;OOLy6t2`SkM#Q`?FZiY<4pVaU%7;ete)}~|2t5#l5U-(AgE5Hx{G+BB z?i#*72lIcQ2h~qY5r?Ab1rCiwD5V|`MGRJw>4~ge12Ny^LU?%iC00WZg&r@M7szBO zX`h&-7BxO|wz~rIczS(s5J4;jXmF7}K0^n2<&oI=eg8MdVk7ml^9v#sI`J1epJZZq zDsCR2Ymn_Sc5b1T{X@Z-yRn12#kC9K&cpY>ubXr2@J$?>OtJ!c`dv!&t-V#~=Hn2@ zK`Ger!vA6KP2Abe_y6xXTj$Ku_H-0g#hEHbZ4>+MoT*k@+iBGnL5s#3X{7dub55r% zLNcn>Ag2^#i&`Rr$h1TRks+0k5N#rqh%}Z+Z1el{e81QIC*0S4UH8uw$z{1NAD`=; z_xrUxUytYP{~ieqO@rd1ye8_ofstGj?E;in*5MV4iPYEtWMA{6%2i5)_X($b;z{a) z`ax!pOVIYe;pbv6p_EKpJR|dP$*SpRw<{lp{#o?XqnX9|`JC9oi3p0B$&qMr@23GQwS1Cn*Gfx+$Ay1iw)kZPE&%%pc_BXB75$2ZlVY>~^;d8j;Tb zoMtuv)sKQy>Nu8lFzZ}fQ8!CeeHL*4er>;lbifY1de~)W$fBS3bh_77)djXdIWSOK zFYi+8ERyWn5k4d7FO}H&qS{{R$^La-Y>U$d?P>ccZW4&ExLj;>% z<5T#O?ucQyVPM;jlmLrupGxiI;A-aUkCYU|JYawq;WOxl$|$5b9(gZ|r0*eU*HqaP zSbb#j^Cnn4UH@!*b_Vz2_d61bPwHZ$yZ28GPNwp)89d&Oc&MK8J0KMn>jrFsdGcCo z|7sSk#>UEnm^7eYQ!@%XkIi*x*_aEpWeq2Rg+b`kE_s!{cGI4N5s^A*%OC#O@*S~1 zo~CuRwTBaaM-eZImUT-_wuH+5U+TjAn;9E1zwBY5~<&A*ADf8vkkdmKBbiu+c<66rF zQQPOIr}Ydt2RimDzsmQH)V9uqr9^)$kKSoZ+g9*w1K9dzUKzdSNFSsIKVB)Tk~j~v zWVW520+pUtqbNp?Zwy$s~@VYULunN0fSq8eCw`e0vY{P)PN2(L68d`%5!5J&$XFNEvbh z=(LeKBO>ObPs@Kn2N^Rr@f7!#$Dx-*o9|5!jNOtl)=={%tHxoT!tL!uZw(5KI<`zq zzLE~lwg7QXT5l$;%rku)#SHz+OK$Q6F(b0zwy{}=s?F1VgAuLNANKgic^-d*(mx;~|(r2kT>Hny-PgS4ieic@nwNrS)@MMaX$LTEDMBfJm5z<1; zN>#aQ2WuVcMHphZ!{ad%_!4>tWBnd|Y=y0%vn3ZZp7aQqRmRblzIn`~VjFGzm2L;K z@uZly6P-->>ck75jGYwd!rVlOx4v0s6oBnnCXt%4(^?FO&CQu0hYw1T;9R{ilfT3vcEZ+pBt#SL53%Dw|X|n$v$ru2l7h8Go4$CF_e@)Z6@Z2 z2T`On{|DLth>iD7mHkl#Eu+&T3unl>1#|LEadno>zfSzlF(&0_~62xW?-5=rDlvf|@bf1`l(0e{LYd0LtC z)K~ERZKv`d=XZU$-r;i(w$@20^xKHgHqVMoa}+iyVjvbjeQBP;Y9(822hWE?kkSP) z;Q8ctnEUOE2I`Avq()yo7DU%M)AUAugH=00?<2pbikldAJE}Vb@KHPM-mBa!V>vwB zvnM%#_`F78?-bAgL{O^>umG*Y#J>6#5HvLT8GJ43DOI`e@Y6c_wA~OUvFN=cECSpQo>Ppx!z&yV4ZDUU1f%Smlg z<*+fSpBhllsU{le)xeI!O4*~=xMBR9aZd3|@Y^|Z966~(f5V6ITv@B!E7&O79)~Dn zU${Np93t;9V4iC^(stLynQ-`mT7QG-wK(w2*(6u0z{ST5u`8th5(O%2ZH$>HcA}9+ zi;Kz0IXbTTHk!5dWXB@?UYaJy?W;Am>5Qv|I>*wxS-lz1gm|cQt;*8L*^f_LGKbC! z+2!UzbE4k11YwUHJC`D1Vuiy@_`~*0{r^by2gUn@vJPExJ!b(JRgGC`_pKR36bM{2 zJD!|$4Np6a1dZ7N=!YQxYk?u!LgXo(_Qo^TD_zRIbBudj53=prm9Oe$} z=nBqPsmZoE`>NP|x9SQRK1|rOJh36HmE>9+Foro#e_G;k=Vy4rh1X33j;qLkQ&UM` z0rCka$)@|?-C~4<5jNi=sXXfbl$96`~HmbYa$6x z(%%h|7Hbri>EF2#_@J(BDr<{)>Yf<-6>di-l`EDQ9aeZlZkfmem*luZ*Lt- zc(=gAdu6mAwe2vkQ?uDcqRuQf3u+>nxbkc{qrE_;$Udk}o4pt{;2h?ZiuCjs4z1|U za6)D3RvWt>6xi5Z|A0)j`w($l_ov#mO)PU`ETeVs`e>9=Mh2C=5jP-`Wwp>>UN4nS z>0j925K^EUs$XF~G$;`kK}*3pHWfyGKBH&F33#^f`R_&)4lI4Al(o2bfD}A??<2Dl zoW0kSkzWvbX~x*y?CYnXS-q?5QRi*Qk_nS@c8`HWBJGoG$;rZp!-)sBG%OhJ5<>6Q6h%$w(E?z5QrBpkK`unzUS)G0Rov8HqBWeug2iu%S=bes|p{IimjPa(Zu|Nn&a*}O>Ojp!o$yS77~W|yBMp`y)O zFZl}ke9p;~hyP6bSuTE!hq4%Q15)bPdaOlre5X`-N( zmri`K5p1ujI=P6kLf*vmM*J(ta+9qaM2vMb)74zKpDHFo+yB;N1o?9P>Hl0AN>kL= z|KBSEk`3g&|L4l2+-%+n-#Lb^!*HmYXcklDc}S0n7)a6G<1iSJ>B$Rd^IjI_n!pJl zC)QYMjP>v==6T?MkmXFVEnRkZr*}q zr~S$PU|G&d6uuAMk&FCOYi<0d@2i+Y6?8kEp3B0GE}54R0(MUuFp?1GA#9^|x{POJ z|M2_G*hV7we#aBA;3WKP-h@B1%nI7LsdC^fG z1-Kp*;en-Mi}}HfN(dd^5g_ckOt$yCn89>raiLCg<5)NOh+g=nT7A}4$Zv1 zb(Zx16UEZGXkS8Z2p`=(s5GaY&_UNki@X37}8df|}s`=t#B^tJP< zcpp%hI&8|-C2V~0V6V&!o|~JSkWMD2ksV-hRI+{dGP^sG8^%Uzk? zK-$x()q%|#T-P$$eORC@+I}#(tx-M7qpWTTu1%D#8vNe!^5;(Gn<SD3IECf5v*W-Hk z9)y9q*YUlP-2-2lQ9dBP|BEebz^Ff|q&LUKTUUIq*bz z3P!G|N0f~CcWF6<^w-MByZ6X$eD`4uq@dHKjDek3e!wTyLS=|v)S+u>H4*L3vZ=kl zVV}|^5wLEo;?EmmiTg>2`-8b`Avg_P#<-#)7f zHj)8dmz;0bLHH@zkF&}g!;^h5$0Dn=fyXq;`Z?Aki$4SlI;1Jmu|#q&>W`smolXaR zI(ugL$CT21%RxxLwB&QVcFPLDPgFplqnjOu1njS@vA7x44tZ-$y1d9?l)1z-5@!_x zcdE4)U5YU>%TV=rw;C9Z-J50CW3rK2WwWh0HLlrC&8^*8sN3pYX$HOOZGJ_2*KJPZ z%su5@vP>HMi>#`*yI7Pj{lGHnVQ6E)SW5E(STtOnS)Gfq87&z-d*ICE=7vR!_* zEkb35Bye_uB0d(Nx500~DGFAyE@O zKxeE%-_|G=-M*;66V{U7E;-Z8N=Q(5@U_zJ`wz6XL1IMiR_8Y2uT0WccKSxQUxw#L zo9W-LAj^Z%Zd!6A9hIRTs#@E8N%sLnBwvjp&nbMH&ZeBtu!lW?3C15RGjA}T!1%81 z1v{hxPcYzS88@1vW`zxfN=r$-g%;2?)4gNBagO;$D?RyBv1QMZSX>a5CmgPxO_ zY2~XHY$QaPuz_@K1PHff#USrw+3LJfl$}nzECJf8-5?D+hGs{Gd>*4yW`u9p5B@b^ zzo7OJVPUb@rQzq6)AswLP(ej$Q&=~qM%T3PQQ~QI;25_vWTVZI5)zXAkdu!o#YLMy zH8nQ)#hxiO-_Fdbo7c^A+(x2TW2a!_oGTId-d>-y;b+^mJ(#Jm_tcL|R=Fvvj-<4n z8C0lr*X!1@sQwX?wUz0ZrBW%#f(aOyZlz-i7H`SG0hfY}K-{QOW(YM=TW*6R>m6io z+)y2M+)W-x-Yyw=58`vp4Er`Ri>lBzkYP?*wI2;vSygH8X>M$Z-)m+>)k8?X*K{B% z&eMsO!Mo%CllKjsGQ<8V{{B8Ir?4X9$Sub_)J9UPMlR|1x;`9ADmml8Okl}9?0Y)# z_=5%PP3W>i+FqBK;p4cK{J(i$udD44kW?X}aRt%&1zdNtGpAeQ7WaIY_OkalaK62K zQ7=-Xem$3}bJ&}^7w!GaarBPGm58Gt2yHqQWwjzXF8Sx^ahL}7@GXux(yiJ~W06CXt`QjeXDaNMjS`1WK_F5ZTTEd`RpT^&bbG!HcrNK2&L*H-L@%NAy~;~eA!j$+*Q4@&h&4!o4Qg>cEUohubNH;RC-je z8ckin6Ywj!*2i6xN)@eQ#mjYRWmNLGP0#e}`Ebtud^930BtyP;PiaQ{W{pY=Hz zjzg6`FKU>|FXd)Z`MNn2$H5^F*^!H#=LdD7O$@Yi3GOQH*0^+?`OAuAGwNnH>tKPW zF}t(Ww7a+Zxq&16Oco+Y`EhlY?x+y;4msvEz{9Sh z;`!kYP2DV{Jz441`Z~o%$Npo=LWd##8YNA%+rwQbMQy#G1EQqS#B@B^9mt8pEuZ!& z4a&)bkw3dJw|>Vvep)<}HN|szv46V#=yx9dNSCI#)l{Ej{L`9p-g_@n0q?;pg+S{j zMeveuIu@K=(c7@>@q4T9V}EsR(xvY{`EjSCX{ch0YUMh*`7-tMTPZa*Pn#aZBSLJV z*@RPWg`5(1A*8n<(bp#c99^Xbpr!T=oO<%u4tG^~m3#aGvG{k_h}yRgs!jCR%d0jp z_zFD<@bP$EV5l`@p4!7wrZ8$mC{!!x3@k@+R618tn6~|R819mG`t$k0(bdlH9o;Zi zPk)i0{h`Lh_qA8)a3CSk=4QF1J~py zD~vA+D*C7_ss*fws#6&9aml!G6q3$rN0Au*PQzKgb%2}E#j}6hI(!~hT&O#c)#n5$ zW71mNyYZ)ncxB#_k8^bF4x{rXcu}eoAD1r&ow2cT)r(GFw5_$bv}Mua-ew3$C}MFh zqAhl7PTxMq%55^CyXpyj|4tvFJwaXdVr13qpGW=| zPT)+jaRahUlqxe#e(0`8BT<~hiNow~$*zIOskeyZWB-@?m>@GJfC9Eu&AsR{;>GuP z=&EbX_~-xkgc|?%ivI5%`2X`AFlPKsJ#kIu@m=<#!QKmH)7r_~X=X2=A08ky6bRB` z(I$HdSvC54lyfTLeA*8=eSL@bF%?yaOo$ao!b@B3ZvwYq&IT>|b1yV~#dG_d1Fm=o zfALniV))YpK`T)v!g>TzJ|5}cOo|@H!s9C@mRne)fWDM zZ1DRKrvcACjqR;(xARA*4z`e>j7i%szVSGJpO03}jRB*0OttWpC|NFqK zo8d3phfgdZF4e>zVM)<547@(c$|)sUG3=vOrf_STHTdc-|4af)@V-pyrxD!b+*I}6 zwhI{0689bz>ezQ+544&{I1?0k7<0lbjJo2&J839#@kG_%DU9&DbR8)XH_;#cBqHAR zEk1R%q9mgpsP2F+Es%XHU2g$(9wfA1)kJvD<~;AByb|s)eEQ@i2FmeZBUo1Ykwr*l z75ig_+`#R4Y_aoxyV1H$&t2)ko z-XP6FM=0Rz(5mAI&eE#5XD@|h<((lcZ$I`hYED>M1%OK+Ex?NxhpVWlQ00bxo$RfV zn@5454r7S0Te*4j=Tg4CzQUSH5Mc&GOOj`&U_6#4!WR{woMpKlIjw#;WRzYA#?{G?vZ4AiRPfSm|3t`hf2BqmK=ZJbM-KLHtQV58-(@oGS{MT)Sx(OX-_^vHKQtZXEH@d%!GZ{H}vf zhf~-*p4*DU)M-}3aKBJ4duliJmp@;19&U5wzvmt^`qK{64O&S)K}AJCb)-E_ZSF9! z>(IstswAyx7NL-<4mdNVstoCBU_gJ!^O5^1W2;s{o5?G~B}OJ;+6KOu#5G}s^hu>z z5|>`Kop`@$B!f|yrp9nVPNCn&NDQO4tU*6XMGJ#PdDg_&m`K-K!DnxjC(qv62v#oC zb@a-{GeuQvtF`Xcit$vZS3Dy`nB`>&jRgubGJ7_CAidE8o<58+I!nC3Ywv)B!mtEw z<~g}-+p#o~Tog-Y#{&z*BQ|0qmGTNixzJX1Po&sRNm*}fS;OG+(MeT5*W=n#IZ<{4 z;jWirv@t#_u7{1eKMLgfRrw4rqf1YU|;dnHKR*Heqx?!EjT{q z3|9X3*@r|852Ygy7T%dA!zedHsZdE;N9e%SpiTZjGBJ*lAnR9&2GT8fzITE@Sv_ka zSazSRo`-8-VV>Y_t@b+O-nNmEk;9P@2Jo2lL3tOo+5w)Si3yXy*YWwd{QufK=fHXI zKFc|tdV@AG!-(ucT_e17eI_D{zG?n=|4L&Zp~3aoJmDpnOg}&&!Y^!x6BC+nL%0qP zUcl};gK#ReCyIqJpUIBoQ&Te7o8%t_J->bSh5Go^glGaYni4(a*puESEPDy|$bn9u z0UbsU=4x+iXqSwE%h4yCQPOhx2$g2xA8o_ za?vdLxs-SXjWa*JantotjR{ zDIEpe!mx8&?|WEQfd1JOt2h&1fmLW|oc2=@J*uScUlmI1#PBQdSR?z?CS!=*#C0Ak zqrL0ykn3z7H4(nNbvu?EU%M!ZE>C`s$l@g`(E~qXM!vTE!>c`rg_)?>mm1bAW zyI(MLwS(1-0iTRwS*U0O!-GRa*vkWHlJS<-%Gl34@$kp*mAzI@Y4$+nG}_(&JdbS; z^9fA>97N1+sw24M1TG1C)Otqm#RbX7D6WL!n{-zBQM%>Q_q{luR9DfNBw=7{gYgkj zJ#Aj4vP2)RY;f%0;GM$=f6c%G>x?xOe|f&qC&6U6_!Q-g^taD4(JX5VL5r;FxcZ13 zCu+I8kKAc3yP^*Xjf&L*p1SSG4i&PJW!|01Y|Z^&TOv}YJ_g*%fx)t!13l1P;?lU zFHVj{byZ+`LMEcE&kgLs0?@P7g{I#pFLXz`DtrZL5-=$|ZGEMxPt>2WQky9zG+Cb8 zzQ@u?azaSjV@F{HyUa6im5nW+5J7j^0BD1!<`rF{io!m50Zc!zu(ZmDcYOA0opDsG z$k^Q&?Xvek4@gwYFJmTf7naFI7x&tYfsN>XMOU+$udSp18o_wu1;R+h_7Ahh*5l~#Y=r@zZ`FE>fu62&o;0GcILlLARD_e z-5{d$7I|}&c~>b7QcPQeKF*&>rgS1*<2@pS1(Z-h|;r_x(=ep&8R&1%hAM`&D zNI@W6M{&2H%RS-~UyV-r>OnG7JDlKH!MRmUna!D}md*m%Gcurw(Ej2LA}oTCigV~} z*2#3YLHdj9 z)XkVw@jbxo_my^Z}B!<9dkK+pd9 zS*%ZS@O;!I7ws4(E%NMkur0U~TClm$Dr;;R;+w7#nl5bb>_3oXbM#=S@^;fme1x)q z+o_ZTo~(wedlNZEqoI zzn>fgOauc?xH9)ZALYyDSDK8hb!Ob+o47jrxKm}dQzU0(CHoDONlFS=rlq#R(=E+2 z+H)^}vXl%5S`FZG`($40o)0SNB*V|JF((*^npHk9ZKT+m2SchE-n7G8q zBp10Ry44vgY(Rf?Tb$+_1TPQ9;?`l#oBF{CDi?MQmGbw|8|>9f8#P6J+mu;SQgsN^ zZ+xjJ+XSxpWozGt|6dfK?=Y-?bSnB;RTqURLy*aNjG z+4C!vDJxa1I-2e4bBZ8C@r9ffTC#u=B@sBZFLYt>%S~6Xl}*Ew_=^dwOVvo*vO~AX((zM1Ogq1&>REC1`%r94T`Jyv}S-0gN%v_ zIj|ecmS~Jc7AbEcf+3s;r7tIo>VxUcIxY|H2je=^YvaV2^hQo%1(%3q2~dcu>G7>n zKrul8H}CHX+|Mr)b)gIhS4}jfMjHVL5r&Nfq}a=o9flWUEII`ih?w5Xhhdj)bFkeW z4IO918i&SF(Yrt9ZFN*ABLkHuChDZw`lo}AewA8?Nyti{#pbQP)yU}=UM2Qgm(S|j zAss;Wo^xpz=gO^gzQhOKD9*~Un56rste8Fq0c%4>#dMVif4@1&+ZNSNxyP8~xiVx#(bZd0ig+b6Y2 zDyz(E1II^JRt~1gKsDA4gKJ@FG6`5f-rUNoT~gKqGEU;K`BMPA7)zq(U38KR1+TX>FH_ASIuk{uMx<Ev>ZW+Eu2VUzb*?JnBP&YKbj$i6Ym z@21e$n1mbD_!;!kkz(G-3DZ4rz1oabS&awiIVkvv`YRTB!#)`nSpr((y$-V7fp25> zs5LonT==hSvsmq7Dy9he@nuZ=4<$$geK{BFNJhi7T8f~nt_x(wS;zo@3j#DdVrjSs z{TU)CJM2>Qpg8}CgBF60gCk_A zM~jaau7OA0N5M)f!&q%&+MA-1ffIp)C=3lSv?Yb&!-bj=}y^-=^{U{Q~fc!QC_h(DUn>?mZ9 z95wI;!jm5!LcKN9W(ymg(e}I2vp2dEzdhyYQeF>PX@QNAJn?Dk6zEWVYk}o7!!{5| z!AZy+2@hv~VcLGUTtB3}v9~&%cpc*FoTpR08) zK=N&%v2T*=`EUumssH(2IU*^G-c}y-@Hl%y;k*iMHLAp=gNtZNORq1;U=sFeG49Ej zqJln0`bH9pO8cR2Fn~U%IYMPSIJNC#es(G{2j>8>s^UQ{3 zoF!@1-Y0mD?${9zxDO(@OQ4LNw7ge+5vL3JI|prS^X>?at)f!(uUClet!HtM3m@4STCZv%lg-cZ8kiJ%eM!1!Opig^Y zZ!2Oc;dU>Tmdo!1GGL@6T#>x)RIZz@&ck2-fy`cWr?;d712RuM=jw9bk{?UMGK9TtN?F2W zdOq`GmMTqMYZe>@V8d#?{7)pIgF0%>2hOc!se__sx7r(BxKYzfqA2w3=;hOmq=*J3 z{Kfvn&kxlhezafH;%+I4YfE9 z(9Z_=f^fc0i&OCb^hZ{#>~(IWpvp?Sl9KKhfbDB^tjFhe0I#+>>ZNr?JhRD^OehN>;ftqQ^0Hc91V0AOV=<6r!X zf(;DrSc#8m(qn(oD-Xfm(XYg*aX$mAFE98MPDWh2^u=M$T~_IdI~gU82WWX)s5a~t z)XN}thSuI970Xr&Xu@rVWj}QI8Mo1Ot|JR21jsQFgsn9#e6U>E<2hjU)ZUq^2E{a3 z2otl#r1&`8AeWohPCKY1^c=6rc3%I>!^C*OHOaJ6ryRWr^L%vvkm=x9SDV;TW$slc z;j0>JomzR}7DN643Gl{KCT_@7&i7 zP$gl#JqnsjKiznQQFMgkj9GJA<`CknR9nV_?&5m_S$3ZmArOjwT6hU{{TVH_8J`wj zxeOM@weY^$8Yd460#@0PF_5O2>;PfJzK2EFZ78{oJ8h#8=9TEl5E^&$f#W?NhgB@e zPd78^tPY)Lf+D?aQxD^p=vVi*pf*v1C55#pMk*H!R9m5*x0?R z2N^(!{pZ?E?PJ2nT>V_u5if=v2i!~41o0v?+iP;7b4+ACSI~B=jJ}L0y-89jn#bOh zeA%pp9z>{mGfEP84zQz4F>VNZxk<|ANOx1ktf#hM1a!E}%-vquC1#3&{Plgj%tJ%r z;qlD|koQ{(H_a;s>!~@D=?sa1f!%hVTtn#Mlb$a(u%ygMbIOtyi?iNlD2Yonv_vau zzB_q<+!0O*J{v|#SRA@cluVRv(`|40y3PVDUSC%L@%8|K4wd4Cvkhi?K)oV}gj=$& z%*#8rvEp-i743P>M~cIUGa47q$jyG^7Z$f;w5Q%j(2i9m87 zTi&ilFCL8%bQtg9$O&4qP;YPmNGj8FQbgYWGTt#&#Js80Cw@oM3deN5obUKlO-P=j zUe&gkW!VJ;pXK>q*!G14G7S7OBnRFcqbQXe@|?_qdta4$Fzx#Gq6KIhT9~(6`F*O2*v{g4IV-G^?`x42`v2=E7tqeiJd9m zdGhD&(|kyop3duko8fXz3^$hN3wP<^c<@|Zyllzt6$7onTIg}@SHGY~?Jx?~zfAB< zIdBW0FzyQq=MMw{`p;JwPad#jk4Py&u~U7m&$5;HNiXO(G8!mJ@5-a|Vs+jYyvbt0ZSGxxfr!8-mfU%)Ogc)}fBNb+s%z!=oDV$R;h&Zk85GVLp>Lqwep zuaP+x-LF4Ze{R=FdSvJP=oD&yUzJ$GK4I?AU?`+Y!7RCCX|yw?bqVHYAF<&Q6~ zl|(q`{4_TG<&t(|;EA)94@bKHTL*PzkdS#wifC~v_ZzwGt(`iWl-9nwX3Zp=GB`JZ z*D@Vc%~;=WFjgMTV!+0nqg&qzU7fnKeh!Xv$jB zTzXTilhPj>z2QHy+>(1I>uHS`K>q00EH#}OOO14UR6w?ZL0l?r?M(E2D!Zi8jr7+r z47ju*htKc4L4$wAf`=J$hBTfo8~&V0MEWh1;rtLfnO`c3JIjOcf-?ymE!X*1zA2p3 ztaf@uXKyXwy|Ry z-PSr2$}RPEB$8*r#vA`!zLkD&jxw336?FRZ7gV~U;-T6yHnx^ecY>h<(oYb3M-!GT zLHE)OfT`8IDN%Bj;YSi5*M(0ECFt;z6&&*hh)#|E-q)BkRe0Q$<` zARk`vGXR-0h-@{&xnEd3s_yHe$C8?~ZY~$F+4RN|cN>L=mdqUO2Cy?%6mtny2!yYF1) zpP&6_vNQPXQogm@TvyU;pe@hWA$qB9QILwfdWXl*oc4F+1ll1Efh;-KG%KbpQg7{9 z$r5QTLD9gnyiXNk>myiKmJ)+L%lqV3!Hf9sA-MgK8yY}jz)pN&%@nHN7-x$ zf|PhDKa6)3d!Q&YwBV-)v!f0Bi+A4BGAXaoxrL{ll5>5;rjrq|zkNo@)m{@xaud+3 zMeH}Wxrs;a{_~vi98bkkpxB+wz4mgH%~31&a%$DCv0Gjl>Kz5ZPTu9yNQMa+OKG&Q z^X_kxr%wI$S*=~H$Cmycd?mZ{{gQeqLzV^rx;*kM`D^kY(xDWyzX=6PGR6q3ruP zi`RN{yYtuJZF}_}fXoukr}^$EZl>4dNun3`R;{WTWH?;#5jzbxt?F)Wsz0ueJUET5 zD~gOg+I73?n*P==*CkEq5u0lw%gET;=|CSyAP{rXyB1+$BrV59n@jZTIGjbK_a>1^L z;E48Aer!N_IB*(&4B9tn9PI4bcg`ip!fPLYkR|rM+~!oCdWQd5w0S?iarByAj+i3u+44nOBeuJ>kyR_+W% zheD#e*A>f~oD;jL(AmO%wTSl2M!Z!p3cgJuH7+rEjP1L*H)8ky5Gy+>v0HJ|KuD9T zN=}E@L*9}Hc{+HF$AC7lX4&GiPyy7!`F;T~_D~R}D)j+b+-A#H90%>|l z%Bl}|{Q6Owlf|j9>Oz4%n=&dL9U^^PiZ&v}LlBRGjOTV&^<5?t#e~a~zFm{qWNfNF z!+&F|GG%A#iClMN%KQu_EZ2e72_Z2w*_kwIr@O<17WE=Bk_0n2dwl-^y$yQvP)Enx zQO)c8Y4cV>#I?6KwEs#UKvu<*6MXtDwxj41)jY4W0Ix$cc#or0uooHJD@lE=S>j$u zDl?<9(IuiY8!&F@slR=8TzL}EqUo1b0h#k(r()hANrILwANl0 zOFxwXx-;nIS~nQ(PKNq``E$Hl7S}e(&HYhH;B2mW7i6iLUMy@ah)2w+s40W zVK7R4{~GADRMwcRwwrVwK9&g&ref^l1m*bk?Lg;CUqd$T7a@(<57Lq&{rFD&d*j2b zF}BF~^4HmY?x4&hE076bg}2^yOIl~qGSTcjQTqPq?;p_5xx@8nhi1f9`O*a8RCcnc z7fbCD?fdj80S9EQ9?zIU{(%N)=}o+K%||MTu@$Z}>vol3x#-a6%6Hray$4Xa6f;sr zVM#Yu1us*!p`w-D_u6uE!X_tQRI&d4S=wI^PLLYw#8I)e&iQY{L_6dEc~fFpQI;th z%AlH5D2WJto@*F|Eec;LaDN_rl)gK7IDY5h15kHU z_W=4otF|h)5Z=(`fK#vm&+G$jX0igK=h}V-TWOK)89=%SRa{ylmd&q6^0yzwo@jSO zJ2;qhI<*30FgWep{(t)OA|2*S0!>@ojEqdE!Lo2esRM49^ z={MwK6Hj2<=jCB^U#cvvir4&T%jv0!g!Cukj76-Ct7MMhOhIm}GRkHf&F2*N@!Zn< z!kvi_nL06Ii^$&0^;da3lBu75OrSLg;eH z2G+BOfsH^+W8~(mVuibNC^-Sg*--<(xtDXwPy1(5wFeTi(0ksdEN$~0Cf9I^)gvua z5lV=sw7-Qe>zfB$&G;_evInr?{TESX({Uq!~dFlY8J8>@couXmc{QsP<+z zJlp-xh22@Sf zCZ@L>dgsDgHW85?`Cc=%=zVn8g?YtoE1ZxH*~TgxotXYe5zr)H*kgRsvA=zm%;AS5 zg``BpXVRZNn7TPLf3Zv{f=+8hB70^m_~?tVw2#mC)%I)Xt`CvEoENE zbH9D&)m_56|MO97H0MRkb^y(xmU%z+h|?5KLAScz6xr1#96EB71mXfs^2_kQPo`Sk z3@cvQGs#YKLPvsa1gD0+P}-5V-@o=hnG}LR`#fxq5-xxj2ZXSAypR0tls4vF7PjB@ zT3h@&TYEIg@4E?ttskt&Co^S<9c>J$k!Slhx*kT;61biGGr0fQ#tG8XAG&{@^owuJ z%j6>_m){7k)av>kF+X@MF?Cqf9Wvn*GJBOmzkN5d{JdlmH4$K_V5QDep}YObx6Ib3 z0!$1zIakOp$T;n9Ukq>QhQJ~dEyGcBsn*NG&mIV^A}5}aDu|HahNd2HH_)pas{XZ6 z?(|x^nHXt|m76qml#f#Y(3Cm;oMM@-V`^K058~!mMOZ{|_)+MnaODtnIpSY?UTqKc zXV=3g?yuzp$zky|p$)soyq`vw?O;m<<{{F_ zHv6kzES($0si z5{zh}4E#zrkXT1HZ39n71W8z@@SWsro>y zz1&Cy5)sGMro9lErKUu&v!)DE%+75EMQ#5dlFl?P=|pe)ozp#a&uOyLm|7Wn%1Nh89X0oDW-6`R zrYtv9$~8qKMNz@!Oih_9QNwugb0X;j=2yinxdehn1Tx;A_|Bo_Hcimx4hvE z{|~?awR|t27c)FOVa~^_Kj5|cYBg9_kzi~3A=BU0$@YwX$=kK4yj=%d%jn*qd?qB8 zX2yGN87Oh#e@gc0ks?89$rGo$gLboQ2SH%@#Obxlt*ZF|^bZ;4rbk_Uka^p8RP@)ExY)=vm6lhB6N zdS2m0w4=Gn1;XT{;&c-+B;nlsEXv6(X^79j5RR|26a9yaQZ zOKrBKCv2jr`l>3}s$s(!j`#YiIGizXZ%H`_^0gpC-wx9G>Y8TzP4M)&ww4%N+J0)) z*8`V1lHZY5AdfU70S>>>KAU}ivQ1q2>D8*vGXA$MrM-S6Mw0>lAOhx`YvGL;JV zG@H!2D62j)9X27gs7Kn}DQuFsh7P5~B(CUN#EH<(UbI2v5=E=PomwxjN`o{X+_8sm zl<=3{VI@|A34>XsJ#xb_EktL*ajTA`c9m_98x$|VTh|_>gpn;iYzB9_57);hW3dy< z#!LIoLCKq%%5iL^?oJD`3X?`owLzPlAEjNvu&W@S)t(G6zn82b+kz}>iG$#^1!99M z$-cL_?uC+sAG)1Lrz(^h^haT8OJugC({X>q`jra>^t)Q;Z^f0vo7o$r^RO(1oneyv zQ~MKeMZ%}0ergDp5Up0Nv%GBrLPNyn1Ns9Rx^1n&(aK4}@TKQB*{=0U@yShr6t`5y zuqiLk_kAGVI{t4?#;Inf(ncYkEs~9&*oXh;(13 zcYoI?fs<5)lKwthVX(}<F#CG7jfZb|?RgPq$FLqJ1!mUP-Fv-IqOXP9biZ!0@on7|Vr`%iK-voqcy z0ZHzFYf(kzE)DPLIluSJu^&>+Ie$!%)cHr>-Tl2(6$yYI)jsMDz0h`z>SR{-rro|t zABPcYzU_`X&gFw#FGQ}@Rq~x5YfqPK`iYagb1i~Q$?ux50yf10h9-h#g`Sh|f zfqh=m-APiY=@^{E*S(0mOmez7&>g)=`in>Sr%t!v1R2enbceP@-`oMu`>Q&0G^0aWQVs1Nq+Hx0-m_FpdVmn@<-p*(G*4^QQW z-H&j&Un%*n3)2LA-m$%J*p#YX{s%N_OvUYJ4XS{wAlXcf>hm#!zcDlVk{lhsYj-~) z$?rdrKZFk4(wA4JWReHuCZ;RC*TAwRGiC=1m^Znk|C)3yBmpl1*$b;pKq&!@Te;CxfzD`nu)YJJ0omUl_yS?hVbgP+2C<>3Azag34 zmT0!@I=O~WN4{HP&yMxr7e_8m?K>SfELidBT@%AWK*f473`aJ9JCtxcB66c_rz~{N zkCS++1;i~HiCMwpmcAbNl~7XnuZ;FU25Cb!m|w10O|f{}!C6fADVpEhaJk#Jv76my zpWvw=)tKcRx`>>*P;&(eHSbEREVJB+>6Hlj?JzOM7Y1!Ap}_lci||UQ;e>O&YfMAB zfnV_DbjY`SxN?S)6p3|=?4>p1P_Cyo7}g;UnPr{+$lLO_p;5E^$C5c~_z&iJn|c)I zqk{cctKYfT9sXl1!%Yv@>?uXgbd}(YsCfG~TqkFeOOcyK z+e2$Z^M+&JE|iJ4aeqAQzo&8oY=IZ6^52jW>L;ZxxdohUnu_keR(7;TQ)Hg1sfD&f zwhlLXaYWd@>sB#eS|B>VR4IcDEaFRz!%(N4KjK?%TCJs+`~K`m^=oWP$G8+(*nO66 zuO5X|h53T>8qU_0dfE=S}FiB1JjEFDaF1rns{9`G9L@7Dl`EM_m&b9_8gZug;hli z)$|Pe$Vy9!S#~fpur6XTvaEd#&a_(rb;kt~LVS8`+&n$K zoOn*wo&P!wk}-pN=W@*mEU_GuecPIG&6@ICcfd9SOvmE=WqdALNZ0%@^$DP~e(IMs>3YTGS;L8KC9$-9&}1 z=VvtpKRcG<^I7%{W2gB=#~A!cneqBo)i^zp{B*&Qd6QOIzV zid8hqk{>KvRQr8#$VzqGIp-Voxs@J1{jn!zac7(9%e|%kQ?1@ONPfgfI_g-Q zm6t~2b@YH`gKO=F?O0u~y!j3sC?b4s4uE$=R5sWxZZ$&8Ff&1x%UH+0+Z}R79^U!| zbl&oK@$qyEBB5iOm}&M(Q9Xf`A8UoXHjTup?{jJVI*~M``n`l3s0JTzf;j9&I_uE< zK;_7g-~Z*Wmx0q!=>$$kMVilj;!dU2T9k{5v_a6nQ~{dZM0Cc;uW_4gGfVaf)dF}c zB&pKa6J#EL(xS%Idp0j(B>p+tV-_3i#W~}5W&ss(e9XB%Gof|WRE}knb=dl+t#SRE zGfUN{!HIiBe2=fuDRPQVXq*po+7GCX@T914r&r{+ansD)uBl#)nt@aMwge zs(uy8{0Na5{E>L3^Iku0NQ$&(fRid-=5N>8D%I+Ob`igr784O>#fDn@W{sxj_Nek* zYgxKQ1mNcX2*wpTsEap^;>1e0ji`;O@5q-yrZt;d{Js((Z)LDMF>;)aicA4!sko-YDF{oU|Q_B0@?$SQ&nJE1D`&%ezp<5V2v>QXb&~vVNLHJttnPPZ za0b1)hTzP={-Rfvw>+=a^F};Hvsaqk9#jukz4;>9vTZ#BbT9fRg+*_R7m>kRU|%w*aC|`xCmlU=QZAPi!5g$L_FJ;d=T3PS z@N{yebtdLOuiJPXT-L-h)Uy^h)Uc~&xJlCpnIBRAshg&P?YW_rH!CyUdgURmud}b7 z;iym0zaEILzVP(`bTf0J!M$&!u`~W^YRwwTPUU|`s{DH3<1c*~rO0K|mwoh+h{Vho zar{${Z>*@KH_`V#tl3*dEkuP7?&@LaA18@P0G0Tz_p}+WsY#=&*e~aejK>Grx){n> zhc0n?itQ{$)9}l5m)83v?=$1rVBc7A2Fw!S8@o4=E4GwccRgZy88oD@!3*_>aDE5* z{Ck1KezV{9-2Uu>tE?NU?;#4RDchy#(Npoeo@{*-Tn1_ik5!L+KB-}INJ49Jg;T09 z3}zL91vW>Cro3YSb-;-YWuqh8;LMR1iO2t<(-37EXZHdkkJ24|Evb{&l5BVEvkKra z4lseN>%ZHSA1c)&4&N7~Zb=dr1P_<%heH|M=@FD`2)QMyjd{)($!fbDZbW5ai2@Z4 zTse;@HE1yFiI`VVj%FFzmSD|7Jy)1XBK~+`ynSmpy$CO6Lhd;ld2gD`XCoxCN)eJCmA0y)P6gv zzj1Gn8oD!T{|ZJO56jiOpZZ=_c{Do$wb(gMkDJmUfMK81ZJ2mdwf9Fn5TAH&QgLD$5zu!8@cPD12eM>lVpIk2vbSIB%#4-cYeVc4 z=Z;#kM}z4U>*Ijkq3P&{%bH(E6o)luSaTkL(hg>mI){lBn^9sgfV^;S?X>LZo9uh> zN(?fl^zlbOnEtC*4T9wX?oS)7&l|!eF+VBSt$vEWvLMgf+OL;tkErT|H9Agc$3R;d z;)R{nYBU2!DD^b>?i69w&(+k={Gynzu@GACcWK_^(UA^ zI&s_n2snJYH$-VE2D&2dO?8>}u`Y?iMr#08{>tU^rpun3&0()ilLlms!071eF)J1S z!IK%sx)B?NFEnMp|NZK8r*~}=)f!9bXY|A)s=)_yduJbO`L1#83~ypm}{|{oRtwul?hp78BePOExjT^A?kB;WjC;HH9;u^QKAc!N*$15-8{7 zEq(j1D#p%{h(Q)iHIR}V@H^rl!I{6}Yr2!)p|(Mz z?ZPh|prWZcR=tAv!h4~xmBaPl^ng^P!Xd?~U9_a-0Uj8gS{os4MxTf%-)wousRgla>^wC|qA*#`ZX z{Pn;+`1Tv;+BpN}I5OtKUu#aO=-p%2xiI~&2W~7ATdGqJqSwl%6-J>SuMe(p4}Cw3 z&##I3)=>MHPAPFG_xsiz>bCu#s?gAVCyc|e^;2O&t8o4C+(IL*p>cdKVO{fjT*@Ii zBLkBmgv=&)vlWKJn_{AEZoTh!HbtzH7PnlBk@abz>!5ckziN@0_g)8DpXT&24zkGO zCtaNj+a+@7nterfS%v!z_A_bQwbrn33rxjC#nBEe3&*L*ud44DOHO@O0 z*0$1$&u~o z4-EWQg)YsG>p3fiD4e4r^`Yi4pjJfLl3hg5sy622)~4|&)~~ofl)?CWA%Sz`A9gwg z_#wyG+<&>~L0PFmF4`*w&ovO*((|P`^h{obDB+6l;}IvIT9!g=_~E{$3P?Oj=r`IG zS47jgyNRWeCIDnYyH7^S5d+mGE-ZU^dc2!=-Em5VB9|zBz~1V&wlpmL2Ji27vzM&E z5u9K{9i{($pOsa5u!Y>YOiwK*=r_dkH>MRaiBlo#Ju+Nzeo7 z*?hb=iZx5GH)~1s3}<+9bz1u(B-8Ec5iosoH?!-+*}1TMjn$rjN9xg1)14H{M?jC8 z`k9~lz>`4I`;$`?=Ylh-i#C<+dWNCLm!ho#gxyK!Z#OU9y%W+MN`=28x6#bTIuBo$ z66nbifRCN8E3{?sQMrQ9uSg2l^eNEdsgP_{2|#w zljgW}uGJJ=4(Pjq)4{BpX`=hRH}aSbZOrI7H>>yA->_cQ_H zK`N&$)_l|tMZSi1;_2cF%2L-z`euaZQtB;)AM)Lgk`}FvwBSo}f z#UISLl#__Y`b!xtkko=7(0@h-S9t|-+H;NjIv_Xen`Y!!D!H7R^+5j}RN!v0syTx~u*n%~I}kCPxpC!F&>Q zOHu;7j}L<;6e>^%1|=7iy}^$Id2%oM%ohJBtIn*1rJr( z)s~sCw^vq`p^1f`?*7Xb^{NN<-=>WGQ}LG*!q<|-k+nX1OIJ)&4z<*2bFg#fIE)PisybNwN zHbp~|E!EQ}U}}5f#9Sb-LHgi<2O!MJ0QBuRqbQ|bQCZe(!^n2KK&uDywfWj%F~u2M zn2ch$NB9KiWVza|Nr|)A)WOQ`ek4)Y7nt-9{2%$h4u-D>(+u4IS=Hg=`2df*hSEP4 zJsUW4?Bpu(BN>0&R4LMEWU}VGg_x2loOL$`w2rKK7rkA-78~FkAWB@^l!WH8i7Cr& zlv7UEaHm`*w~b?6F8qB@uJ>FZ9=O+is&UMc-8P?r6srBb3~n{XgIohmYjz&=^X-?S zCzl9C(a(<~>=vQyT}ifF(Kv&QrcKQnP9YWK*Am*X5)o6snq2-GLTOi;s@C<6K*RRd z9eMxMy*aB+SY8bf?1OdkiIvYQa{DH?OaLA$-Pfd{ri`RB#`Pnbm18#m`uXQo=Zu`Q z&NZCX`&IcdQ-hFq{S~lbC-*pS(;Jl~B*%r^KRh4HK}|abe~peV+1l*59(g%Se@*U* z8XYVAc4DODr(OHRfPj(j!V6wj1e42av=nH#awOQzUCzm;rY?f0DNOM3_Lz(t{y7C( z^@g!eV!}Bo-;MlbTfQOpev{>9a&332b32g#BmK$%qttW*7s9__rS2X#{~3+SPYS&; zm@;={W!pPJycTy)RN$1ZDvj|yPb8(LC>_IWZNP{8OAET9MX_m`v`7HA~dK+GlQ(Hr?POsx?LRdCoF1;+!}P@N#2eO zTC3Kt5OrULJfvpn@Lr46IbOqSrw1BQlPXbo&bvXrk#*3ZXwvKIvvv&X+oS}2r^giK zFpw3&{XdYa;mWdQ8Z06RoO z&MU!}9zw9K{2?U-Ta6EDVd3ra^QuqnGTDCr%`|z!9i4OMnc}|J^VYBtfAk(se_ZeM)s3s-;ittyAji~JgWr6WJ>7DNP=ow#lqK-EgLY`E8umF*2ROJshj94 zZZGp>RSnI1b(0SJ{4EcdYD{1-z@iyacj%dH#Y~p)$kCVmA6J>BQI9c!eb)*rh}f{I zBj+nf9C4f70l`lEAnnd`ar-j2;{1VXZ z%^LZJ)&!2|;o6)t0pK7RiLsq~+&0t0e|2w&$7=X6Ot+|7=b;=5T>~~csk`qd%|UmH zQh=A5pYGZ6&glx9JI#x7KuldFb z5;;<8;CK&5)SY5%9gpptUOOE4aCdsYWqDlaYH?^l-MR{0eK7o;E(@DkbqVOODd;bW z#e~==MUsLlN!W`csI)vq%T&XSTf(j>>WX=(BKv(OPMGN#xrK}UR5gkS6V^)f*I!ZZ zC61chSFHS&oJH*;jQT)&iS9UhN+S+pyk0orVr z3$%vuGpRYZlAKe|)(&hUf;NN8Q(B`14qjCKJG^}N>*W*WgGFXVTSer~OI^oye_S+U zZqQ=c0F&`x>KR)ZS2NDUniX8O-H6EN59Vv30H{MmBIHKhF2w70whh=8V|>=_kzEMS zbAZs%FaThUR~=pVRI^G()=S7=56sR&5$j#=mqXqR;NHnc?m^1DN({uuw=xFy0LJB( zl4-`@gUdhMYs=+E$PU47^QyN zO?~4bEm}!#n8DD^v&)GgUiq&I6J{!stSL*)GqaiB=G4BI@!lq%CpI*|qDE?hZD8UU zddQTSHr_Kc!3%Al#8%Uo8P8Eu<lNP**|Mf~M_ zq+Ltg?K10#w)AT-*2u8YZq&kAhb*1VlWV?jskjSeeL<6!_H%&k&b|6W*F<>!lJxWH z_z&KFpy%OD&`H9J!h|)a(v}Ht?wznEYKAn_ISK3b@3husp-)Xuj*WbCNtAF{*IBuA zP6>TMZPWMxee@ECwlIRF3ns9drSMjt81!=S7+PfHQKSpPFxdGGP&c`v4QuLSst~*C ziTMw5i=@_DhVXQyLP1VNh(62G4}K2vh9+*!Wu|O{V@axNgC}qAU9Rp>ANhGQH8VQw zF{<~=S?1qR{os;!ALo|zmg1w#IVMj3)C#@~9@of-9oer{5r>0hvv!v|Y91}7 z#qT&!1a<_;X6h7=Gd^AY>#ozO#%fzL^eh8(nw?FAD~y%(zX&BjSk?WJXrWK4dDooJ z=1i(lj-j?=a2e5FC5nrl_*A`rqMLefro{ikF^FLrm z(&!ALOZr;o`-^}S@&hD~epl?IbG&soHDaoF(aq*5&N|{qX`kOa!4eIMI~HW&!Vk4Rb+u9Cgcye$8N*jF-=jVA+4Rp<%fYG zUY(&INmAGwUSVkJ8xVHM)#L<_9`J&`_%N$B8T5@t`>bWFzim#a610c;<<~EndDGS^ zX6PE;jJMace#eet)6dMp0i52}ClCYErYXjh#3h7LGo`v~ZdPcHpDco*7L)BHn9>;F zZStNE|Hh z4Z2VTbkq-hS;dI{dZ*MHayDvid;j>aylNhp)ty%F>95H+8k?qTlGxAGbJT9h&Q4gv zEyOYSRzNQsKN$)d&;v{*(KrNAaLMA!zZc+VP@t_pS3O}{`nGk3PTFVl9=Cb+F4V31 zx4uYZnP2^TZTFj>goUoMpwSd+g)r0rE9VsR)6+*vpZ1RiJ0Vpk;jmS{pus?m7sZL^ zf|Uf2e>p5O6dz!AZil$BllnH8kg<|tujguMDY}P zV~s(`-I0uB(*H8zyc%Xw@D+cTLH&EnW+a>CPat_Iu>?w1fbd>vLJjRO5r7 z437|DYW+Ry)1|>dj8zIP;m|~@_&1X%+w{N!14pWA*xiLvB4Fg;n7v;dn`W-56jjG4 ztV|$N=H{^x47xEkYf{(!kz=k{yilq;XLeaYB+LPUdhw?V=;? zJbVLIVYAkKDcN_DcApc*LwzX?uQL!8Z9(wPPuKM!$| zd}~h=^>!@5K4+mfJ!)zB9NK&Yph*HaI(<4}ma^2Lcb}8sXA0!L0hiIj{9_7?=lf?0 z%Ud6Q|E@P;t#^;))4xZ8SC)WTdq@quI{kfe!*w~?Q|5NzLsS*d?Ol7(72hjjDuE5r9KP+0UFsOVwVZj*cql8UP+;@FbBPLI0-lrij%R#l(RC z@ebG z3!|B~gQE#vlns_}we@lU_TRS#FU>1%~t^Th{}WiB3Vwm-C1uHWnwrsjvm{M)91b)9?EG1I`7ZPZEel)xFO#@3W*xvBH{ zS=o${M6q-B2;FTdOTI_n#i)KUq?)+REo7^Qvo*Th+-?KeaI^x@8;T?g)YqQ2E=oi zhLFLOQRbb^-bNfvgz^(Y_yyC{tg1NhS~xlwU#ykjGr4&i;^{BXzs(Ah6CnT%^J0$* zw_co(WjEM93`<<@;Q-6u3!b$wts?m1xZrc6aU+FqOo(s7vjfXKEug#26J%G{j0?|k zWRnT&aT;vZ1=@wnT3gwJP1=WKF|cv}{_?4|FeX3kW<0ojjbw$M?mu}$=ayBYp2c1B ziCo>kTq{)Rqf~=>#1jnqkNyl7)1iku_W$zXoIOql4T9}nMN<>wHO2FL{aIYUY9|&s zf%Tvq3QC#tk66hnBsw73v%mDObINM!KG$HLk(@JebN-n)Ml5dgcplPMvZk0W60L~2 z!`10TsWlIfj`a`?mvdgHW|#hSCuNw%gE`^!ucB#Bre5IDywi7v2L{$^^1*1Uv?17G zv_1I5moLL;<9#=MR!xBrYuDsh!Xs@s*Dq3B!8Yw$%~R?I0!!ImP<*_O&T<3P7_QBf zQLm-}52s1e83_Nb^vn*f`U;Je0mwYRq?`p!?L|dY2&)j%>AfW%_p0THq)GDo;8fuY zCyg6z$v=THI$sY)g+jK^k`~Dr)`jjMv>}oKL7!2xT|IT6-~5Rpc@23#$4^%MK{#d@ zbIfWuTrhY$(f_Ys$wf5phby_K(au4&acM0fSz6Yp-aam%eaI1^Y~KwZ$*hDmc-<{b zuOIL#Pl{|+0qDG?@xmM5WPZlWZP2ye4Qn~ zKaH`dTNiu1rH^fT98j7oZ4`m7#JXPEwxu;It`7Md4y$c)xvB)6lYraaj{bC##7XPQ zeFmLochJ~9xbr0=KoVehPjmShqH7|rOU0~fCq&)NY8{q7E%q}I8FJS;KE?3Xz0XUn zz!*4z)`&WEybeXUr=b+zfSgUew<)9($E6ds>+)nK65(D(XULbnk6Zbrcb9)8(? z+xA+!6j?rn8Mj(&V)od#xXTFYCLWpOhOo!;brID93+e8V$JhxvMyl zJUQRtx(8pj{uKK_4B-!c1dF1(E`>yGTSb%7*+X3K-NtF*hpVTZ-q|)3c1`K`GbCUbgjM9lXqCplqys z;=-W(_5Rodc0m=vZ*J5@lQsT&;4Ed#)Lu==6TXtZ2ADueMJC{R1<>Yv1UMR)ppya$Pmk zpD);)NhZ!oRkoAxtKu`W^c!J?4I!!$R?)tBn}hwa4l@tF*6o;DJ|(QVv4asir&-V* zV=g?t65)CYdAtFidFHr&nKTL`1-d#X#_=@^FPP}92SrldJg~TEa?N~m4UkWC3W)3` zOLn7%Qf6}^ijU|OJujx@_VPDQs@D5@e;MFII1$=;ziU_2_7a$q!F`wggzFTznEA&S zrMYRnayHBG4;D5@zj-~=6=M}M7!tN9ejx>}MKMdlIYi9#l(7b%a@FI*t3^tYXZ763 zr=(p!N;ko#a@Urgqtlw^e<7&i9zFkzmp>kqcXjA$YI#kGQ&iamF0FPKlzj=bVK_J^ zbb{Urd-L_c%`nv01H%ZE`tU!wD>zMgdmOhzKDPe~?xXDHEu^4c?EmKUPapgrGv=$I z$j_%L-490Px_g8b6Z*O2;gk#IL!pwEi~-Z5ZFiqBeLr~e%Yxob?v_#7CcY0{O&?G( z2SDW_w;T2ykoZ{lZIkiSQ}C1|AF~3)j!paAJM1N*I3soNkyZHig*e{xbfU4@am(j2 z+@Cm|v97u#ZQSFy6nm_Zt+T#8-~324c6fvkU$)#C*1qYTq#Qv^#~y!BCeao;e?1^v zU)wpk>KmNyGzt`8nQNEkZhNe|*)bUlDb6-Spm15nOvy;ugw4w7CA}j<1?;Z}umZu) zdkK)6OS(snmJk)({1F!F*j-ubK_S#>G&E{#Ceyy!8d#=Ajh9KeusEv+TPgHr@3kEg z32qUBC~pqR>wjZbV`etZvIg!VkWJ~`x9qbTg$b{D>RMW9p}OI3-Xw7YXt1nfH{w`k zsqs1js|x(m%FC)Jg*N#CZCCI4w7(iD+qXgn;G41SfO5%ERrPZX$v}6u9PX&yc#(f$ zde`URg}A)8p#u=71b+^2O-Zqfm@K{;lF@8?KGC3=6q(TyfXNJ-Z*R{X{GiGl;8f1# z@k;x%QcIr|xgCnnTpr|((?bj3`*5e=Q3IQ{-F5@Vm^zosg6$=jF5i}IOn)4(jboNp z?HIAT$!|-Wu14CD%xCM#n5=A{i94M!;(dEfa9FciBe8b-cccDMm7&}G+OZpZQP<@- zkV-op9rJPeyUNJ0H`8rvx|GyF@XQ}tjFO|xEL-i%>D?KPIedBW3Z0{4@v z@wpmCm+rnWdob(GDA_rIu~al8LRY0MSGn4jn*8!9xxR69rzwR})VF&<$FHVJ5v^Q`f2vla-6$F%3*0F!MMHBTM`hWv&cL(;zdt< zcia1AY)Qcvy4wp&p$`%Ks2m)}n=&gg1;`D7#)`0#)y$)7$WZIS#ybEcNeMd z#_bw4foR;X2bvCF>E_PzoxUCjSi86#p7qy`o<#HUe^i=`^HgyoKcknb3iEImILi-T zWj**DDRf%eMPdb<(uI93AD9E)n^IB>o+5o$9e!1fj&90atNJ9>mW106!+0e!_AyUb z%K1hLx;bsXw0|Ug)vHniO|Y36|6Fv%z}a7giqWb+&9-?6Ug)_Q-V;c2WZ5l;+h^ZG zJhpgeuR>64ER)$17j%wBVes@@aV-TWsVJKLX_py_gvUK)9XXg$Zei&;LY~IY?+uQr z!Q)+3JErUD!M3!HxUT;t@U%Nhf1P?0_UTL0+#9(2U}MUiHMXMwd*Rc({9W+AyMTJT zz57mj3V+KI>duHb3u>5}sNA+5lKIw!n56>>T~NPiB7IBg0I&~$8q4v}8rXLZN>mOw ziMc=cv-9YP?YHb$+qXLi61xL}5fYb-Us^caq}x97?|yZABhHee8Zm-JO}W4aiom4 zqvW4I-AkGA@d)|I&DE%-!#UpvoXjX9*D(9bi>MdZVxK35VO0U6vzEf`3!jqNMG1N^ zpUa7h3>=O2!oe&a-EKJteBNIJHV5P}F{eb?{}Ryg`GCd;Z+)C1Gc__v6XJ1;%zphZ zZtvhKWOz{;KGN8LQe+|GmKa{DQ$LCLj7MOdO6$PRu}NGS4HCPVcY4j-6|InJGFx5x zc4`}k)=InmXM8u`?WZ_R@@?s|I{WUiLEkLjKg*OT%#_BuOZ_vlO#XT&peRkr+6h^% zcHrk>mB74o4S8$<8!O4ouV`$jS!CYPP}wGY&!{yVJcs2X`{kna*Bx`JSXrs^{_3|i z^M*Ila%<+TwU4`XIc2gXp4r!`UuOfb#zxAK$_x+b4#M~6ExOzB8pAoCv}N&nwr64h zYqxS=F4$4Q)c*(HhSASxLVOPVn#GZ0An&VmtP7N9?6z}iA!ZMBE7cW|t^Rj%>Bcfe z17T5HoN2Gjj zEKi4IT1%&-`%FfDo5z#)sYTnBrFG!tl5|Y>xYMj%4`(b4S~#Ju8Sr<&mUD0b+;F5I zmIt>p%SV3GkX3HfNsnh4Sl%473XX2y$R2<;(cBv6c8-q6By+Qf|*Q=Fg225jPqZ64g8C-Sm6kvCfss~Z5k7OsU zxsYW=aKH<9x8wP=7t7x~8UP34x(*#S%`$m|~eX5=Kv*&Y+e&&3$^f($Mt@*eZbf3ft+IK@D@74vbH zz>_vfNsea>h;UoziQfDXSadYIe0StQS)I|+cEy-$d{38X{ib91p#XmK>-YM0!Lrid z*6s$0<4fp;wEwPwJQSU-MibB1T=t7%3GhNAQG{VOCIy_lRYds%l{*zR_YsH-c-(xQ zW+U89(TzjA9_J!DyB&tWT!lG_baO4S%DR8r?08+Bo2Ap%R;aj4j2N2x4!$|Km?OeQ zcj{VfJAX-m+w%+y2EQJ71&ilbI%$l=^MRNKa1tSSD3;R(^!=Z{v5994>xA*^bH64l zEV|V}(r;PiyJRykcl&W?(9PL?8= zyjWbGLqi$##unPeW-P0Ht0FOo%kP+LvKFO#AUMu*2A2ZL)EO2p$m&_qmUPx=)yL?V z%XrqGiTc`H5VFqRIjCz6tph=y7g}4Z)v=drs?`|j)>NTdXERf1-Yq*EAqU;{9=}{; zlj6S9D)+}NAIU`4`mC-sgvJ8@rz$RiMqIEuEna)-&y(oun1?Zw_B{*!NOu@|)p=L_ixQ3<*c$Ca&LC6$HtX!l&vlx!usChuALz zM6NUL4;Y3emb711b8bs#Jt%!r2b*LBv~Z?dAIF;D%OLc{G0x!0q=o5vZ{(aADY~?> z+<8Hbn*%gk+mf83_) z)ZCKo!{}N119C>XD36>M2DR30V?y+vwRxpi8=;nI;r;UIHU?cNQ{XH!zulW8xYwM@ zF|&bcmPGn(iO$W(wO!tr0jTWzAosmS6|PMkFz&c~FIrw${FYoK6wSs-e)%{mt3Ygr zu&t;icKVo~SxP)ENR!ygOdlG82Y61Mi(DBV7y?hGr(Y;Hg$o9X9ai1k5q8g3!hoqL zO}20qV15vWP+#-8k~LGrUQFJMn(mt6#!c^@w1Wa8CVS$;Cf+Y~-nQgL{BTuiao4fo z`Rcx%FDwEW@yGO{Tz=ti!RQ$FDXCM;GWeIszhh!B-yD+x&2dTEeKmL;y^UMUy)tgd zjoq>Pdf<4L=DOM=-tny7f9hiV^}yRqzg+D0fFX_n``$fmikc% z7fw%!^NpQre2Xvnormx(e_wIEJ!97pn#u_0uqP)u+%F~ps~fBc-J|)@OfO*Az;)6k zGMiXy>$q4a-F=Cxf`mz3`8Q=I;N4O_pC@&>_P$T-C8^>kcSp+}}ymaqA1?J(yB0uXYkF8s!LzGvgHpwefSyCCF`ABF*EIeD0T&Vb{iyumCsT zd!Gf$s-gCuBBt030^0aeS!1!*B|ovZWvbY1qZ8>3zK*gvLQvoiWFXSP@ApJWhhFns znUl!k@HHO+?g%a#zGwVuLf_Wz?uV4&#%!D1kHLNStTG}Kch+8UlLP)#hxe&4jQXK= z5}sGS(5Cj5`!=^@8?g{x%}U6bXdK`JCnn-hQRcpfuGdsLpyM7RZwKbzj>~(sCCyXr zrS16h5S!?*8Woa-Ry*0t9l9{gZUSX+_{=HN`;}Nh{pkmyIa_C9zxIpK7c8B8Zs+#i z1g3eNWOx(0U!^RNbOATN)oY-l0*=xEh|w%2tq?*=X`ViiSJLJ-#?Fc@_E0m*L6KF z$kCV9$<#jhc~6R-j;;Y!o`vr*Z|pxjIP&IrZK3V#aO;s=jtG8uqOI1LUd{U$*54L| zg{%!yO=@R*j7UBg53Q11FHM~kD>UXTv~291lvgGFmhxi4SuGpeR+L^!?|W-m7`@!= z|A?&s^Ssdb+n2XpoTWEaD(?U5|0krvko*(U)qS92NtN%%ma3bEB216dqV0D5Uo?YaKrTF1@yU93!Vt$nw#H-h-i(@;gmZe^>3 zx53@@5Tm$Z8ZD?5b;Up%zs?;URrU#4)_=-HBym3w1lcj3Lq!{R-p^{*bID9VRE6TS zKDzV^rNAnb+tfM~-&K_YtKtwYE^!Bxo2a0NmFB_mkX!udf}K~Jd{XUiz^oZ6eXBce zCuWhP>nsgXVky)~9-#iJN^`A+od)oB;HbYTk{wA#-AZe|3>=Cx^56fvloh(-;N}sz zIyTeyVGW%LfV~!7PYoHsk&ZLfvbe;&!Mt1e_o^D{jK>|6I}cm86A;m*g)icO;wN)8 zr=(9|9##o@mCr&n83|fR_JlL4z3F{#@pfvC<`MC{8xAnQ64%c!_2W=-?+VpXP2UkXG z;M2NsHuVa}4amaPQ<^c{1G2}i#z5C%d@688*txDetq;FA(1XX8!hBj)#gGV&-3TmI z#|CHk$n&L{O69{wuvu91znDwmZbQtX$i9MUMelxlyE0Ne$&7PV4F&>+DWLt>Pd~WM*{jINyHt7a=N?kavHY8Fw;xX2u+t)g%hzpjend*pgQlvkN=G^s{h7(Uy+c%ogzQdzZ06!kN>1VHosHkSIV$jUo zgu@vj=X@=|+V~~EL-MAI2X~`+L}FtC$DLc?t<=~XrvWtCrK*f(X7dM_-12{`lZqnT1= zm0q_hipuFZKfK*_r0FZ~Gs07ofL=h*3T!BhfzDgBwt)bX3l||TjjXRT*C3OIS0jkd zqdl$6WnEda9OxgfM0uP4nWXnJ!vjm0#_y$XyNXKG|L~!vqW-ex-1rgh`$SL&k)HxKe?4HAX62UTx_HePo*_Jin@5Z- zJ*9O$FB(JK3ifxoCg9nX5m;E~EivZU}j3i5Oj_FJ9I(Ue0L}y;cs;34&8GYr>9gW$*7iBZj(G_+KjaPV;WAf4Quk z4Qe0s^qKvx-wuaXX`A3(2bkG2?+Iues%AFhp5RarShHYy;5kU}X>zuep%;7q%$JLM{A3-GPe>$l6Jll9}Va$-vpz+Ddv$RaJMUF*=({1u@%R?tN5JQ<~@CHY8Vj zlEa?YrgaM?V_W7q86m8-4Byw!+RvV-AMM-oUulEnPP70rHZ__BSTq73A2QrQj+wnN z9#`1#!z9%y{?h?xAS6xenLnHOYyo?fzpdN{-J^!ZMpss1#El_nt7MH$Acw)O zN&P$CR88=35U&oQo^y2|;jiwmK;{- zP}|taidkJbi5pBl)mQu{n6U6M1vZgHX?3uC+{fFACEHV11D6m8)Cqm zqDpi1Jn;_%)4^S2{AXwPiJIH&wB`E=-N_~yjSTv_uS<0#wRWyw0pRZv6CjhSBrQhk z4^z}ENF3zXQi3POZxfmsl2mwlD$U(9KFvtGi?;A3KK2PorD>o*0d3=p*FikuJZgcU@HVNl=o}ch8&b^nkzcdRm_@bsXch!S%OWULvl~ z>B1kjDGS6A?V+t!=dEow2H6lu4kA3as-iD52m7bua+>WuT& zO0t>miAJB5(zvAg820m*^sIM^bGYT?vt#W39TMt2!l?x?KEcNderL+6XGp<6yh_H+ z?4YfTc6o=%v6I_K|ZG~ zbasT8t8S)VAvufnQLApj@xdsR)(2?>wQ#ti&RU$nB*rz%$>;7btSN(^xP)zc+onEr zE{{QVSHTmDw_~gKVsqvIZFVgX0Z@5yHZB(0Fw!11gI-luZRjfxV4L$9fy-~~!v#X_ zhDr&NXB~Jjyn)VDbYlT{re2*HoH*B1Kw?kcNlf&&axziSs& zCpY`EUwcGWt!%)X?S(<_k~)7)@%A-?@<}3CLvH!>NHo>%V~{G8k|-4#r=>>Qj-2

;!cRS-55PClO-M5^MiBzV6TR{M<-+8p82HUMm>vy}2+)%wITg zoOXFZm{a*YljW9>Zc!5HvaJ35y{M8tB(veQ&zaR&#urJUF%MDS7d@ zKb+5fcK&WtwM(vA^9Eto_t`n=Bdz@jaK1;H)m11Y+>RM`TidNmc0*%K* zt;*Pp^bk}evpCXP5+qXo9-@^mz1jI3#<{j$5gCI7>hqj4E7uFJAB^pw)cAazyN}lm zrP}8+p~LHeadU)4d%_V!8(TOAGC-a(YaWC;@k$6Xlu?Y_6X9)Cf^&8fF56|iW>U8v z+l>)cW&)EJ?6pO`>1V_P_^eYx4D)iwR*-wbv%#Pr!*-h<<9l%a2~QcTk}=}M0>!(Y z%7}_wL`J?(hy@f+;3ZjzijV8zOnh4lDwK<(;4c_LJi@CH?R@8<3hX^a2-8)hslw@U z%Cv`^&}L8`&M{6Za04N)pqV32SG8SDk+i|5ep>4&728z*=bOc+W1nu)!p*4t89-}; zE16Y|AdCNelP&r3;h?X!XcE&XSP4Klv0FN?spgOS?d=@_r!d-~Q%WdS zt~eL;HHT_?T_R360OsC|ae$u=h)YO)8{HC@Y^#ZHs8froMOw%dB(G-TtE$`PH>egc z`^xrPKDJm(eJxF-=uYX}-_zTgcfHA;V>Y;1ZO5h`CE6h?`_1)7dcgCUDP8`Vz!6z~ z(JQ(SIqcnsYqM0qRh3$%cb6rm_mBQH6^e_yrjJ;D2>G|5*{we5lwM4AL1{u5!HJtN zSy)&pizHC-DNpFcC1llY{4JdjB|)R?&~N3?jB^*UAHyP~*k zhJ`4I3i{OR@~ByeqW7%pKT6f)U>Y_sBE?*2GN!I!V^7IiVH4#p{qG`nrDk}|@6H9Z zMS^>}X)k`^gQQwR|M}(}IFgZNZjv`d`{mmU35yrah8wl1iIKr_*E`RujczBT+xHDc zOJR{qb?=Deq`leU&81#uop*K8$H?g#D2EvT(9%~|#wuO2`nr>#>pP(vG`?w;g4|*1n-)^6_9ZVVGBLpxFcqEMOJ47Lvj1hhML2pK>*^9MygpeoLuGab;!? zF3#>hXyzc_8+To1_Qp`WipHWN7CYjC3i_dmtUlU?WWG0=7!NQT>-D@r@=(sNS__=) zZgzP)pqm=&{Pu~HH``e?s9=s6Bv8d{5NLr5If5%q&z&uW7F7H_rkGgK9H_`9M=8s% z+A>LpbYFSxdsJj8#I{xsOblom51hLh6eIL4ELp=!xZ34V3 zEVuF7V4NR3IcJqHd;a7%33H=jr9cf!-dY6hY?mZ~Xf zS*ul=mQ-j&1Yb6U_dFe2O*#$OIy%8PR|ldF_jW!gb=Rv&9+W1Klfys z5l5ApeIf-u*ch|B` zLAmi!qA4CVr5_DZPdkdW!(TAxJAuaoHvN-7J3o+xjJp&}AK#wV1*~DNH{*Bp74A`+?W%-Gc+lwogKTBXTSq252y z-eA~Gob%OrhpcnHvNQl-9R`dOT)45@GDyqPSE!+4Bc`xUMQy|~%u*ddk2ZETiCo|j z8dj8l@kp|cX3JSfGqE2D_YD z;1L>Rk_aYB$jC&Ny75swoO8VhjUE zLIpoC$c5_0cTQ&Qw!y^6{Zhs*$mg#ILASQ%zzFa%SF46>kvpT@ity8Yb6Xq#HLz&J z<&sk>y0j|Wq~JEb9QF9I;#1d{+pW}xje%HP8jbF;T-8x$x?1SARTDcXyQt%zu97yB zd0*B|f+So(ScH*CH3_sp<%2Mb#|RfuNj=5|D4()>N6CZo(+^kVEteS5Ej!XSXm+05 zvF8uE|XWrNF36koirUoQyMu+0p9u)hj(OQ?zd zGu{cHS$h)*y7?|8BglGpYdvfrHqNEXn(2w)O!K>!+r=%!AQ09OLB`xe6dWC#X_7kx zRV=2e-c%Js9nGj`A}knoL5qjl4p&*DXVQxJD$iu zDPXsg=Yn9fB`@WP8&z4JDwh75=e$i+>cu_KNEU&#ZFWe0AtBUDPBL>B?RC<2;v7Zy_zvX1EzOP74~9Q zp^a+z@NCwe?Cs(HQWBU@R^U-gSKn#d3fQ-6o>c9@EoJGQGdE@wlX4K~#T~)>10!q- z!58r6#zCRE$r!}DV9s<3A!ZwKE}hl0ETN0%v?9Ic&qiNEu2T*GQ77DCRHPFvYmi6iU7H->6U z$ycipmV+h_{xMj7PQa48`paemDD2*v&94=ys*ypejrX4&-whdBAopTSv}`|!MThH8 z1=K({^Ei`Wn`Y+GTXwG#CR7uLjLdAb?(`)jQlOo|p|lW!cIlVcrbG9K@LRMH&koxz zC5fY(RUK+-fB8S(=&1?G_0e*y4;^4PbzRSWx@%(eY)Al4Q2Qi#2kzTNjD5IO_Dp%( zzvkcc*1hiWpKAwwcHPY@6tnQVEO5Q_dr^e_TSHCtU5`!xu*Go`svzuo2kuJ>^$IUc zA_db^lR3Z}i>&hGV)FDlm=(0p&`P`dl&TfRJ!DG%Nq!(+k&v)@CDY3y4HKZ5aQA+s z(jq@9H2z_r5a8C@lBIE>0UzYGS$2{+?3u#p>)UNFk@Y|Q`Y=fbj+SVr8cK~}|W8)>UmMJ@E5!}eTZB*MNM zl67O!ukG&~_|G zCfg%@ouB@aLNLFQY%xzSL)?g8#6l)Itkxes&_J)Wj2lCKx5$4hlWgRz75u)s z0ki#%IC1E#KUF-Tno48-lv~u!R zf-%rEe*P}$p!QdhDNQo=Ix6TTuK}i(YdE^xH$6$~8^iuH`*5e5`qubGdgThwd+KB&_j%tdvN(!4MRw(14<-xGz{sj{VO{@FF1F7CUIaJRK zenUP4JY0T%a^o4&pV-QnOSAm|(+=gqqO-EI-bpV&TOg92+~xu0{tBK7Z5~bcx6b|0 zMo!=cUs>V61Xz{47rl@km>TUMxzF2UIH>MtQ`n$}=e+oo@(bM(*MUiZD7rde~({~H< zOe;kxvyhFNax0G8x|(t>S0M!!B|k_cv_O9oN^6#?Fwmb(xR#2yVOpm3fFv&*O7tHu zEF5$}s+e6~(gIhAx%#0|5O~{`%X~RSo|d8z#Kxdgp8SqY7_(UZ3UBa@5@

*u|gx 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 I(YJ|z13!*|YybcN diff --git a/dot_config/hypr/xdph.conf b/dot_config/hypr/xdph.conf deleted file mode 100644 index 242dd64..0000000 --- a/dot_config/hypr/xdph.conf +++ /dev/null @@ -1,3 +0,0 @@ -screencopy { - allow_token_by_default = true -} diff --git a/dot_config/mimeapps.list b/dot_config/mimeapps.list deleted file mode 100644 index c46a4df..0000000 --- a/dot_config/mimeapps.list +++ /dev/null @@ -1,46 +0,0 @@ -[Default Applications] -x-scheme-handler/http=brave-browser.desktop -x-scheme-handler/https=brave-browser.desktop -x-scheme-handler/ftp=brave-browser.desktop -text/html=brave-browser.desktop -application/x-extension-htm=brave-browser.desktop -application/x-extension-html=brave-browser.desktop -application/x-extension-shtml=brave-browser.desktop -application/xhtml+xml=brave-browser.desktop -application/x-extension-xhtml=brave-browser.desktop -application/x-extension-xht=brave-browser.desktop -image/jpeg=viewnior.desktop;gpicview.desktop; -image/png=viewnior.desktop;gpicview.desktop; -text/plain=mousepad.desktop -x-scheme-handler/mailto=brave-browser.desktop -message/rfc822=userapp-Thunderbird-829TE1.desktop -application/pdf=brave-browser.desktop -x-scheme-handler/webcal=brave-browser.desktop -x-scheme-handler/feed=thunderbird.desktop -application/rss+xml=thunderbird.desktop -application/x-extension-rss=thunderbird.desktop -x-scheme-handler/postman=Postman.desktop -x-scheme-handler/mid=userapp-Thunderbird-829TE1.desktop - -[Added Associations] -x-scheme-handler/http=brave-browser.desktop; -x-scheme-handler/https=brave-browser.desktop; -x-scheme-handler/ftp=brave-browser.desktop; -text/html=brave-browser.desktop; -application/x-extension-htm=brave-browser.desktop; -application/x-extension-html=brave-browser.desktop; -application/x-extension-shtml=brave-browser.desktop; -application/xhtml+xml=brave-browser.desktop; -application/x-extension-xhtml=brave-browser.desktop; -application/x-extension-xht=brave-browser.desktop; -image/jpeg=viewnior.desktop;gpicview.desktop; -image/png=viewnior.desktop;gpicview.desktop; -text/plain=mousepad.desktop; -x-scheme-handler/mailto=thunderbird.desktop;userapp-Thunderbird-829TE1.desktop; -message/rfc822=thunderbird.desktop; -application/pdf=epdfview.desktop;brave-browser.desktop; -x-scheme-handler/feed=thunderbird.desktop; -application/rss+xml=thunderbird.desktop; -application/x-extension-rss=thunderbird.desktop; -x-scheme-handler/mid=userapp-Thunderbird-829TE1.desktop; -application/x-ole-storage=org.mozilla.Thunderbird.desktop; diff --git a/dot_config/pgcli/config b/dot_config/pgcli/config deleted file mode 100644 index df0f751..0000000 --- a/dot_config/pgcli/config +++ /dev/null @@ -1,186 +0,0 @@ -# vi: ft=dosini -[main] - -# Enables context sensitive auto-completion. If this is disabled the all -# possible completions will be listed. -smart_completion = True - -# Display the completions in several columns. (More completions will be -# visible.) -wider_completion_menu = True - -# Multi-line mode allows breaking up the sql statements into multiple lines. If -# this is set to True, then the end of the statements must have a semi-colon. -# If this is set to False then sql statements can't be split into multiple -# lines. End of line (return) is considered as the end of the statement. -multi_line = True - -# If multi_line_mode is set to "psql", in multi-line mode, [Enter] will execute -# the current input if the input ends in a semicolon. -# If multi_line_mode is set to "safe", in multi-line mode, [Enter] will always -# insert a newline, and [Esc] [Enter] or [Alt]-[Enter] must be used to execute -# a command. -multi_line_mode = psql - -# Destructive warning mode will alert you before executing a sql statement -# that may cause harm to the database such as "drop table", "drop database" -# or "shutdown". -destructive_warning = True - -# Enables expand mode, which is similar to `\x` in psql. -expand = False - -# Enables auto expand mode, which is similar to `\x auto` in psql. -auto_expand = True - -# If set to True, table suggestions will include a table alias -generate_aliases = False - -# log_file location. -# In Unix/Linux: ~/.config/pgcli/log -# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\log -# %USERPROFILE% is typically C:\Users\{username} -log_file = default - -# keyword casing preference. Possible values "lower", "upper", "auto" -keyword_casing = auto - -# casing_file location. -# In Unix/Linux: ~/.config/pgcli/casing -# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\casing -# %USERPROFILE% is typically C:\Users\{username} -casing_file = default - -# If generate_casing_file is set to True and there is no file in the above -# location, one will be generated based on usage in SQL/PLPGSQL functions. -generate_casing_file = False - -# Casing of column headers based on the casing_file described above -case_column_headers = True - -# history_file location. -# In Unix/Linux: ~/.config/pgcli/history -# In Windows: %USERPROFILE%\AppData\Local\dbcli\pgcli\history -# %USERPROFILE% is typically C:\Users\{username} -history_file = default - -# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO" -# and "DEBUG". "NONE" disables logging. -log_level = INFO - -# Order of columns when expanding * to column list -# Possible values: "table_order" and "alphabetic" -asterisk_column_order = table_order - -# Whether to qualify with table alias/name when suggesting columns -# Possible values: "always", never" and "if_more_than_one_table" -qualify_columns = if_more_than_one_table - -# When no schema is entered, only suggest objects in search_path -search_path_filter = False - -# Default pager. -# By default 'PAGER' environment variable is used -# pager = less -SRXF - -# Timing of sql statments and table rendering. -timing = True - -# Table format. Possible values: psql, plain, simple, grid, fancy_grid, pipe, -# ascii, double, github, orgtbl, rst, mediawiki, html, latex, latex_booktabs, -# textile, moinmoin, jira, vertical, tsv, csv. -# Recommended: psql, fancy_grid and grid. -table_format = psql - -# Syntax Style. Possible values: manni, igor, xcode, vim, autumn, vs, rrt, -# native, perldoc, borland, tango, emacs, friendly, monokai, paraiso-dark, -# colorful, murphy, bw, pastie, paraiso-light, trac, default, fruity -syntax_style = monokai - -# Keybindings: -# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL. -# When Vi mode is disabled emacs keybindings such as Ctrl-A for home and Ctrl-E -# for end are available in the REPL. -vi = True - -# Error handling -# When one of multiple SQL statements causes an error, choose to either -# continue executing the remaining statements, or stopping -# Possible values "STOP" or "RESUME" -on_error = STOP - -# Set threshold for row limit prompt. Use 0 to disable prompt. -row_limit = 1000 - -# Skip intro on startup and goodbye on exit -less_chatty = False - -# Postgres prompt -# \t - Current date and time -# \u - Username -# \h - Short hostname of the server (up to first '.') -# \H - Hostname of the server -# \d - Database name -# \p - Database port -# \i - Postgres PID -# \# - "@" sign if logged in as superuser, '>' in other case -# \n - Newline -# \dsn_alias - name of dsn alias if -D option is used (empty otherwise) -prompt = '\t \u@\H:\d> ' - -# Number of lines to reserve for the suggestion menu -min_num_menu_lines = 4 - -# Character used to left pad multi-line queries to match the prompt size. -multiline_continuation_char = '' - -# The string used in place of a null value. -null_string = '' - -# manage pager on startup -enable_pager = True - -# Use keyring to automatically save and load password in a secure manner -keyring = True - -# Custom colors for the completion menu, toolbar, etc. -[colors] -completion-menu.completion.current = 'bg:#ffffff #000000' -completion-menu.completion = 'bg:#008888 #ffffff' -completion-menu.meta.completion.current = 'bg:#44aaaa #000000' -completion-menu.meta.completion = 'bg:#448888 #ffffff' -completion-menu.multi-column-meta = 'bg:#aaffff #000000' -scrollbar.arrow = 'bg:#003333' -scrollbar = 'bg:#00aaaa' -selected = '#ffffff bg:#6666aa' -search = '#ffffff bg:#4444aa' -search.current = '#ffffff bg:#44aa44' -bottom-toolbar = 'bg:#222222 #aaaaaa' -bottom-toolbar.off = 'bg:#222222 #888888' -bottom-toolbar.on = 'bg:#222222 #ffffff' -search-toolbar = 'noinherit bold' -search-toolbar.text = 'nobold' -system-toolbar = 'noinherit bold' -arg-toolbar = 'noinherit bold' -arg-toolbar.text = 'nobold' -bottom-toolbar.transaction.valid = 'bg:#222222 #00ff5f bold' -bottom-toolbar.transaction.failed = 'bg:#222222 #ff005f bold' - -# style classes for colored table output -output.header = "#00ff5f bold" -output.odd-row = "" -output.even-row = "" - -# Named queries are queries you can execute by name. -[named queries] - -# DSN to call by -D option -[alias_dsn] -# example_dsn = postgresql://[user[:password]@][netloc][:port][/dbname] - -# Format for number representation -# for decimal "d" - 12345678, ",d" - 12,345,678 -# for float "g" - 123456.78, ",g" - 123,456.78 -[data_formats] -decimal = "" -float = "" diff --git a/dot_config/private_user-dirs.dirs b/dot_config/private_user-dirs.dirs deleted file mode 100644 index 7f9a959..0000000 --- a/dot_config/private_user-dirs.dirs +++ /dev/null @@ -1,15 +0,0 @@ -# This file is written by xdg-user-dirs-update -# If you want to change or add directories, just edit the line you're -# interested in. All local changes will be retained on the next run. -# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped -# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an -# absolute path. No other format is supported. -# -XDG_DESKTOP_DIR="$HOME/Desktop" -XDG_DOWNLOAD_DIR="$HOME/Downloads" -XDG_TEMPLATES_DIR="$HOME/Templates" -XDG_PUBLICSHARE_DIR="$HOME/Public" -XDG_DOCUMENTS_DIR="$HOME/Documents" -XDG_MUSIC_DIR="$HOME/Music" -XDG_PICTURES_DIR="$HOME/Pictures" -XDG_VIDEOS_DIR="$HOME/Videos" diff --git a/dot_config/ranger/commands.py b/dot_config/ranger/commands.py deleted file mode 100644 index 60d8676..0000000 --- a/dot_config/ranger/commands.py +++ /dev/null @@ -1,38 +0,0 @@ -from ranger.api.commands import Command - -class paste_as_root(Command): - def execute(self): - if self.fm.do_cut: - self.fm.execute_console('shell sudo mv %c .') - else: - self.fm.execute_console('shell sudo cp -r %c .') - -class fzf_select(Command): - """ - :fzf_select - - Find a file using fzf. - - With a prefix argument select only directories. - - See: https://github.com/junegunn/fzf - """ - def execute(self): - import subprocess - import os.path - if self.quantifier: - # match only directories - command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \ - -o -type d -print 2> /dev/null | sed 1d | cut -b3- | fzf +m --reverse --header='Jump to file'" - else: - # match files and directories - command="find -L . \( -path '*/\.*' -o -fstype 'dev' -o -fstype 'proc' \) -prune \ - -o -print 2> /dev/null | sed 1d | cut -b3- | fzf +m --reverse --header='Jump to filemap fzf_select'" - fzf = self.fm.execute_command(command, universal_newlines=True, stdout=subprocess.PIPE) - stdout, stderr = fzf.communicate() - if fzf.returncode == 0: - fzf_file = os.path.abspath(stdout.rstrip('\n')) - if os.path.isdir(fzf_file): - self.fm.cd(fzf_file) - else: - self.fm.select_file(fzf_file) \ No newline at end of file diff --git a/dot_config/ranger/devicons.py b/dot_config/ranger/devicons.py deleted file mode 100644 index 216c673..0000000 --- a/dot_config/ranger/devicons.py +++ /dev/null @@ -1,219 +0,0 @@ -#!/usr/bin/python -# coding=UTF-8 -# These glyphs, and the mapping of file extensions to glyphs -# has been copied from the vimscript code that is present in -# https://github.com/ryanoasis/vim-devicons -import re; -import os; - -# all those glyphs will show as weird squares if you don't have the correct patched font -# My advice is to use NerdFonts which can be found here: -# https://github.com/ryanoasis/nerd-fonts -file_node_extensions = { - '7z' : '', - 'ai' : '', - 'apk' : '', - 'avi' : '', - 'bat' : '', - 'bmp' : '', - 'bz2' : '', - 'c' : '', - 'c++' : '', - 'cab' : '', - 'cc' : '', - 'clj' : '', - 'cljc' : '', - 'cljs' : '', - 'coffee' : '', - 'conf' : '', - 'cp' : '', - 'cpio' : '', - 'cpp' : '', - 'css' : '', - 'cxx' : '', - 'd' : '', - 'dart' : '', - 'db' : '', - 'deb' : '', - 'diff' : '', - 'dump' : '', - 'edn' : '', - 'ejs' : '', - 'epub' : '', - 'erl' : '', - 'f#' : '', - 'fish' : '', - 'flac' : '', - 'flv' : '', - 'fs' : '', - 'fsi' : '', - 'fsscript' : '', - 'fsx' : '', - 'gem' : '', - 'gif' : '', - 'go' : '', - 'gz' : '', - 'gzip' : '', - 'hbs' : '', - 'hrl' : '', - 'hs' : '', - 'htm' : '', - 'html' : '', - 'ico' : '', - 'ini' : '', - 'java' : '', - 'jl' : '', - 'jpeg' : '', - 'jpg' : '', - 'js' : '', - 'json' : '', - 'jsx' : '', - 'less' : '', - 'lha' : '', - 'lhs' : '', - 'log' : '', - 'lua' : '', - 'lzh' : '', - 'lzma' : '', - 'markdown' : '', - 'md' : '', - 'mkv' : '', - 'ml' : 'λ', - 'mli' : 'λ', - 'mov' : '', - 'mp3' : '', - 'mp4' : '', - 'mpeg' : '', - 'mpg' : '', - 'mustache' : '', - 'ogg' : '', - 'pdf' : '', - 'php' : '', - 'pl' : '', - 'pm' : '', - 'png' : '', - 'psb' : '', - 'psd' : '', - 'py' : '', - 'pyc' : '', - 'pyd' : '', - 'pyo' : '', - 'rar' : '', - 'rb' : '', - 'rc' : '', - 'rlib' : '', - 'rpm' : '', - 'rs' : '', - 'rss' : '', - 'scala' : '', - 'scss' : '', - 'sh' : '', - 'slim' : '', - 'sln' : '', - 'sql' : '', - 'styl' : '', - 'suo' : '', - 't' : '', - 'tar' : '', - 'tgz' : '', - 'ts' : '', - 'twig' : '', - 'vim' : '', - 'vimrc' : '', - 'wav' : '', - 'xml' : '', - 'xul' : '', - 'xz' : '', - 'yml' : '', - 'zip' : '', -} - -dir_node_exact_matches = { -# English - '.git' : '', - 'Desktop' : '', - 'Documents' : '', - 'Downloads' : '', - 'Dropbox' : '', - 'Music' : '', - 'Pictures' : '', - 'Public' : '', - 'Templates' : '', - 'Videos' : '', -# French - 'Bureau' : '', - 'Documents' : '', - 'Images' : '', - 'Musique' : '', - 'Publique' : '', - 'Téléchargements' : '', - 'Vidéos' : '', -# Portuguese - 'Documentos' : '', - 'Imagens' : '', - 'Modelos' : '', - 'Música' : '', - 'Público' : '', - 'Vídeos' : '', - 'Área de trabalho' : '', -# Italian - 'Documenti' : '', - 'Immagini' : '', - 'Modelli' : '', - 'Musica' : '', - 'Pubblici' : '', - 'Scaricati' : '', - 'Scrivania' : '', - 'Video' : '', -# German - 'Bilder' : '', - 'Dokumente' : '', - 'Musik' : '', - 'Schreibtisch' : '', - 'Vorlagen' : '', - 'Öffentlich' : '', -} - -file_node_exact_matches = { - '.Xdefaults' : '', - '.Xresources' : '', - '.bashprofile' : '', - '.bashrc' : '', - '.dmrc' : '', - '.ds_store' : '', - '.fasd' : '', - '.gitconfig' : '', - '.gitignore' : '', - '.jack-settings' : '', - '.mime.types' : '', - '.nvidia-settings-rc' : '', - '.pam_environment' : '', - '.profile' : '', - '.recently-used' : '', - '.selected_editor' : '', - '.vimrc' : '', - '.xinputrc' : '', - 'config' : '', - 'dropbox' : '', - 'exact-match-case-sensitive-1.txt' : 'X1', - 'exact-match-case-sensitive-2' : 'X2', - 'favicon.ico' : '', - 'gruntfile.coffee' : '', - 'gruntfile.js' : '', - 'gruntfile.ls' : '', - 'gulpfile.coffee' : '', - 'gulpfile.js' : '', - 'gulpfile.ls' : '', - 'ini' : '', - 'ledger' : '', - 'license' : '', - 'mimeapps.list' : '', - 'node_modules' : '', - 'procfile' : '', - 'react.jsx' : '', - 'user-dirs.dirs' : '', -} - -def devicon(file): - if file.is_directory: return dir_node_exact_matches.get(file.relative_path, '') - return file_node_exact_matches.get(file.relative_path, file_node_extensions.get(file.extension, '')) \ No newline at end of file diff --git a/dot_config/ranger/executable_scope.sh b/dot_config/ranger/executable_scope.sh deleted file mode 100644 index 98515e0..0000000 --- a/dot_config/ranger/executable_scope.sh +++ /dev/null @@ -1,121 +0,0 @@ -#!/usr/bin/env sh -# ranger supports enhanced previews. If the option "use_preview_script" -# is set to True and this file exists, this script will be called and its -# output is displayed in ranger. ANSI color codes are supported. - -# NOTES: This script is considered a configuration file. If you upgrade -# ranger, it will be left untouched. (You must update it yourself.) -# Also, ranger disables STDIN here, so interactive scripts won't work properly - -# Meanings of exit codes: -# code | meaning | action of ranger -# -----+------------+------------------------------------------- -# 0 | success | success. display stdout as preview -# 1 | no preview | failure. display no preview at all -# 2 | plain text | display the plain content of the file -# 3 | fix width | success. Don't reload when width changes -# 4 | fix height | success. Don't reload when height changes -# 5 | fix both | success. Don't ever reload -# 6 | image | success. display the image $cached points to as an image preview -# 7 | image | success. display the file directly as an image - -# Meaningful aliases for arguments: -path="$1" # Full path of the selected file -width="$2" # Width of the preview pane (number of fitting characters) -height="$3" # Height of the preview pane (number of fitting characters) -cached="$4" # Path that should be used to cache image previews -preview_images="$5" # "True" if image previews are enabled, "False" otherwise. - -maxln=200 # Stop after $maxln lines. Can be used like ls | head -n $maxln - -# Find out something about the file: -mimetype=$(file --mime-type -Lb "$path") -extension=$(/bin/echo "${path##*.}" | awk '{print tolower($0)}') - -# Functions: -# runs a command and saves its output into $output. Useful if you need -# the return value AND want to use the output in a pipe -try() { output=$(eval '"$@"'); } - -# writes the output of the previously used "try" command -dump() { /bin/echo "$output"; } - -# a common post-processing function used after most commands -trim() { head -n "$maxln"; } - -# wraps highlight to treat exit code 141 (killed by SIGPIPE) as success -safepipe() { "$@"; test $? = 0 -o $? = 141; } - -# Image previews, if enabled in ranger. -if [ "$preview_images" = "True" ]; then - case "$mimetype" in - # Image previews for SVG files, disabled by default. - image/svg+xml) - convert "$path" "$cached" && exit 6 || exit 1;; - # Image previews for image files. w3mimgdisplay will be called for all - # image files (unless overriden as above), but might fail for - # unsupported types. - image/*) - exit 7;; - # Image preview for video, disabled by default.: - video/*) - ffmpegthumbnailer -i "$path" -o "$cached" -s 0 && exit 6 || exit 1;; - esac -fi - -case "$extension" in - # Archive extensions: - a|ace|alz|arc|arj|bz|bz2|cab|cpio|deb|gz|jar|lha|lz|lzh|lzma|lzo|\ - rpm|rz|t7z|tar|tbz|tbz2|tgz|tlz|txz|tZ|tzo|war|xpi|xz|Z|zip) - try als "$path" && { dump | trim; exit 0; } - try acat "$path" && { dump | trim; exit 3; } - try bsdtar -lf "$path" && { dump | trim; exit 0; } - exit 1;; - rar) - # avoid password prompt by providing empty password - try unrar -p- lt "$path" && { dump | trim; exit 0; } || exit 1;; - 7z) - # avoid password prompt by providing empty password - try 7z -p l "$path" && { dump | trim; exit 0; } || exit 1;; - # PDF documents: - pdf) - try pdftotext -l 10 -nopgbrk -q "$path" - && \ - { dump | trim | fmt -s -w $width; exit 0; } || exit 1;; - # BitTorrent Files - torrent) - try transmission-show "$path" && { dump | trim; exit 5; } || exit 1;; - # ODT Files - odt|ods|odp|sxw) - try odt2txt "$path" && { dump | trim; exit 5; } || exit 1;; - # HTML Pages: - htm|html|xhtml) - try w3m -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } - try lynx -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } - try elinks -dump "$path" && { dump | trim | fmt -s -w $width; exit 4; } - ;; # fall back to highlight/cat if the text browsers fail -esac - -case "$mimetype" in - # Syntax highlight for text files: - text/* | */xml) - if [ "$(tput colors)" -ge 256 ]; then - pygmentize_format=terminal256 - highlight_format=xterm256 - else - pygmentize_format=terminal - highlight_format=ansi - fi - try safepipe highlight --out-format=${highlight_format} "$path" && { dump | trim; exit 5; } - try safepipe pygmentize -f ${pygmentize_format} "$path" && { dump | trim; exit 5; } - exit 2;; - # Ascii-previews of images: - image/*) - img2txt --gamma=0.6 --width="$width" "$path" && exit 4 || exit 1;; - # Display information about media files: - video/* | audio/*) - exiftool "$path" && exit 5 - # Use sed to remove spaces so the output fits into the narrow window - try mediainfo "$path" && { dump | trim | sed 's/ \+:/: /;'; exit 5; } || exit 1;; -esac - -exit 1 diff --git a/dot_config/ranger/rc.conf b/dot_config/ranger/rc.conf deleted file mode 100644 index 3596601..0000000 --- a/dot_config/ranger/rc.conf +++ /dev/null @@ -1,619 +0,0 @@ -# =================================================================== -# This file contains the default startup commands for ranger. -# To change them, it is recommended to create the file -# ~/.config/ranger/rc.conf and add your custom commands there. -# -# If you copy this whole file there, you may want to set the environment -# variable RANGER_LOAD_DEFAULT_RC to FALSE to avoid loading it twice. -# -# The purpose of this file is mainly to define keybindings and settings. -# For running more complex python code, please create a plugin in "plugins/" or -# a command in "commands.py". -# -# Each line is a command that will be run before the user interface -# is initialized. As a result, you can not use commands which rely -# on the UI such as :delete or :mark. -# =================================================================== - -# =================================================================== -# == Options -# =================================================================== - -# Which viewmode should be used? Possible values are: -# miller: Use miller columns which show multiple levels of the hierarchy -# multipane: Midnight-commander like multipane view showing all tabs next -# to each other -set viewmode miller -#set viewmode multipane - -# How many columns are there, and what are their relative widths? -set column_ratios 1,3,4 - -# Which files should be hidden? (regular expression) -set hidden_filter ^\.|\.(?:pyc|pyo|bak|swp)$|^lost\+found$|^__(py)?cache__$ - -# Show hidden files? You can toggle this by typing 'zh' -set show_hidden true - -# Ask for a confirmation when running the "delete" command? -# Valid values are "always", "never", "multiple" (default) -# With "multiple", ranger will ask only if you delete multiple files at once. -set confirm_on_delete never - -# Which script is used to generate file previews? -# ranger ships with scope.sh, a script that calls external programs (see -# README.md for dependencies) to preview images, archives, etc. -set preview_script ~/.config/ranger/scope.sh - -# Use the external preview script or display simple plain text or image previews? -set use_preview_script true - -# Automatically count files in the directory, even before entering them? -set automatically_count_files true - -# Open all images in this directory when running certain image viewers -# like feh or sxiv? You can still open selected files by marking them. -set open_all_images true - -# Be aware of version control systems and display information. -set vcs_aware false - -# State of the three backends git, hg, bzr. The possible states are -# disabled, local (only show local info), enabled (show local and remote -# information). -set vcs_backend_git enabled -set vcs_backend_hg disabled -set vcs_backend_bzr disabled - -# Use one of the supported image preview protocols -set preview_images true - -# Set the preview image method. Supported methods: -# -# * w3m (default): -# Preview images in full color with the external command "w3mimgpreview"? -# This requires the console web browser "w3m" and a supported terminal. -# It has been successfully tested with "xterm" and "urxvt" without tmux. -# -# * iterm2: -# Preview images in full color using iTerm2 image previews -# (http://iterm2.com/images.html). This requires using iTerm2 compiled -# with image preview support. -# -# * urxvt: -# Preview images in full color using urxvt image backgrounds. This -# requires using urxvt compiled with pixbuf support. -# -# * urxvt-full: -# The same as urxvt but utilizing not only the preview pane but the -# whole terminal window. -set preview_images_method w3m - -# Use a unicode "..." character to mark cut-off filenames? -set unicode_ellipsis false - -# Show dotfiles in the bookmark preview box? -set show_hidden_bookmarks true - -# Which colorscheme to use? These colorschemes are available by default: -# default, jungle, snow, solarized -set colorscheme default - -# Preview files on the rightmost column? -# And collapse (shrink) the last column if there is nothing to preview? -set preview_files true -set preview_directories true -set collapse_preview true - -# Save the console history on exit? -set save_console_history true - -# Draw the status bar on top of the browser window (default: bottom) -set status_bar_on_top false - -# Draw a progress bar in the status bar which displays the average state of all -# currently running tasks which support progress bars? -set draw_progress_bar_in_status_bar true - -# Draw borders around columns? -set draw_borders true - -# Display the directory name in tabs? -set dirname_in_tabs false - -# Enable the mouse support? -set mouse_enabled true - -# Display the file size in the main column or status bar? -set display_size_in_main_column true -set display_size_in_status_bar true - -# Display files tags in all columns or only in main column? -set display_tags_in_all_columns true - -# Set a title for the window? -set update_title false - -# Set the title to "ranger" in the tmux program? -set update_tmux_title false - -# Shorten the title if it gets long? The number defines how many -# directories are displayed at once, 0 turns off this feature. -set shorten_title 3 - -# Abbreviate $HOME with ~ in the titlebar (first line) of ranger? -set tilde_in_titlebar false - -# How many directory-changes or console-commands should be kept in history? -set max_history_size 20 -set max_console_history_size 50 - -# Try to keep so much space between the top/bottom border when scrolling: -set scroll_offset 8 - -# Flush the input after each key hit? (Noticeable when ranger lags) -set flushinput true - -# Padding on the right when there's no preview? -# This allows you to click into the space to run the file. -set padding_right true - -# Save bookmarks (used with mX and `X) instantly? -# This helps to synchronize bookmarks between multiple ranger -# instances but leads to *slight* performance loss. -# When false, bookmarks are saved when ranger is exited. -set autosave_bookmarks true - -# You can display the "real" cumulative size of directories by using the -# command :get_cumulative_size or typing "dc". The size is expensive to -# calculate and will not be updated automatically. You can choose -# to update it automatically though by turning on this option: -set autoupdate_cumulative_size false - -# Turning this on makes sense for screen readers: -set show_cursor false - -# One of: size, natural, basename, atime, ctime, mtime, type, random -set sort natural - -# Additional sorting options -set sort_reverse false -set sort_case_insensitive true -set sort_directories_first true -set sort_unicode false - -# Enable this if key combinations with the Alt Key don't work for you. -# (Especially on xterm) -set xterm_alt_key false - -# Whether to include bookmarks in cd command -set cd_bookmarks true - -# Avoid previewing files larger than this size, in bytes. Use a value of 0 to -# disable this feature. -set preview_max_size 0 - -# Add the highlighted file to the path in the titlebar -set show_selection_in_titlebar true - -# The delay that ranger idly waits for user input, in milliseconds, with a -# resolution of 100ms. Lower delay reduces lag between directory updates but -# increases CPU load. -set idle_delay 2000 - -# When the metadata manager module looks for metadata, should it only look for -# a ".metadata.json" file in the current directory, or do a deep search and -# check all directories above the current one as well? -set metadata_deep_search false - -# Clear all existing filters when leaving a directory -set clear_filters_on_dir_change false - -# Disable displaying line numbers in main column -set line_numbers false - -# =================================================================== -# == Local Options -# =================================================================== -# You can set local options that only affect a single directory. - -# Examples: -# setlocal path=~/downloads sort mtime - -# =================================================================== -# == Command Aliases in the Console -# =================================================================== - -alias e edit -alias q quit -alias q! quitall -alias qa quitall -alias qall quitall -alias setl setlocal - -alias filter scout -prt -alias find scout -aeit -alias mark scout -mr -alias unmark scout -Mr -alias search scout -rs -alias search_inc scout -rts -alias travel scout -aefiklst - -# =================================================================== -# == Define keys for the browser -# =================================================================== - -# Basic -map Q quit! -map q quit -copymap q ZZ ZQ - -map R reload_cwd -map reset -map redraw_window -map abort -map change_mode normal -map ~ set viewmode! - -map i display_file -map ? help -map W display_log -map w taskview_open -map S shell $SHELL - -map : console -map ; console -map ! console shell%space -map @ console -p6 shell %%s -map # console shell -p%space -map s console shell%space -map r chain draw_possible_programs; console open_with%%space -#map f console find%space -map f console scout -ftsea%space -map cd console cd%space - -# Change the line mode -map Mf linemode filename -map Mi linemode fileinfo -map Mm linemode mtime -map Mp linemode permissions -map Ms linemode sizemtime -map Mt linemode metatitle - -# Tagging / Marking -map t tag_toggle -map ut tag_remove -map " tag_toggle tag=%any -map mark_files toggle=True -map v mark_files all=True toggle=True -map uv mark_files all=True val=False -map V toggle_visual_mode -map uV toggle_visual_mode reverse=True - -# For the nostalgics: Midnight Commander bindings -map help -map display_file -map edit -map copy -map cut -map console mkdir%space -map console delete -map exit - -# In case you work on a keyboard with dvorak layout -map move up=1 -map move down=1 -map move left=1 -map move right=1 -map move to=0 -map move to=-1 -map move down=1 pages=True -map move up=1 pages=True -map move right=1 -map console delete -map console touch%space - -# VIM-like -copymap k -copymap j -copymap h -copymap l -copymap gg -copymap G -copymap -copymap - -map J move down=0.5 pages=True -map K move up=0.5 pages=True -copymap J -copymap K - -# Jumping around -map H history_go -1 -map L history_go 1 -map ] move_parent 1 -map [ move_parent -1 -map } traverse - -map gh cd ~ -map ge cd /etc -map gu cd /usr -map gd cd /dev -map gl cd -r . -map gL cd -r %f -map go cd /opt -map gv cd /var -map gm cd /media -map gM cd /mnt -map gs cd /srv -map gr cd / -map gR eval fm.cd(ranger.RANGERDIR) -map g/ cd / -map g? cd /usr/share/doc/ranger - -# External Programs -map E edit -map du shell -p du --max-depth=1 -h --apparent-size -map dU shell -p du --max-depth=1 -h --apparent-size | sort -rh -map yp shell -f echo -n %d/%f | xsel -i; xsel -o | xsel -i -b -map yd shell -f echo -n %d | xsel -i; xsel -o | xsel -i -b -map yn shell -f echo -n %f | xsel -i; xsel -o | xsel -i -b - -# Filesystem Operations -map = chmod - -#map cw console rename%space -map cw eval fm.execute_console("bulkrename") if fm.thisdir.marked_items else fm.open_console("rename ") -map a rename_append -map A eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%")) -map I eval fm.open_console('rename ' + fm.thisfile.relative_path.replace("%", "%%"), position=7) - -map pp paste -map po paste overwrite=True -map pP paste append=True -map pO paste overwrite=True append=True -map pl paste_symlink relative=False -map pL paste_symlink relative=True -map phl paste_hardlink -map pht paste_hardlinked_subtree -map pr paste_as_root - -map dD console delete - -map dd cut -map ud uncut -map da cut mode=add -map dr cut mode=remove -map dt cut mode=toggle - -map yy copy -map uy uncut -map ya copy mode=add -map yr copy mode=remove -map yt copy mode=toggle - -# Temporary workarounds -map dgg eval fm.cut(dirarg=dict(to=0), narg=quantifier) -map dG eval fm.cut(dirarg=dict(to=-1), narg=quantifier) -map dj eval fm.cut(dirarg=dict(down=1), narg=quantifier) -map dk eval fm.cut(dirarg=dict(up=1), narg=quantifier) -map ygg eval fm.copy(dirarg=dict(to=0), narg=quantifier) -map yG eval fm.copy(dirarg=dict(to=-1), narg=quantifier) -map yj eval fm.copy(dirarg=dict(down=1), narg=quantifier) -map yk eval fm.copy(dirarg=dict(up=1), narg=quantifier) - -# Searching -map / console search%space -map n search_next -map N search_next forward=False -map ct search_next order=tag -map cs search_next order=size -map ci search_next order=mimetype -map cc search_next order=ctime -map cm search_next order=mtime -map ca search_next order=atime - -# Tabs -map tab_new ~ -map tab_close -map tab_move 1 -map tab_move -1 -map tab_move 1 -map tab_move -1 -map gt tab_move 1 -map gT tab_move -1 -map gn tab_new ~ -map gc tab_close -map uq tab_restore -map tab_open 1 -map tab_open 2 -map tab_open 3 -map tab_open 4 -map tab_open 5 -map tab_open 6 -map tab_open 7 -map tab_open 8 -map tab_open 9 - -# Sorting -map or set sort_reverse! -map oz set sort=random -map os chain set sort=size; set sort_reverse=False -map ob chain set sort=basename; set sort_reverse=False -map on chain set sort=natural; set sort_reverse=False -map om chain set sort=mtime; set sort_reverse=False -map oc chain set sort=ctime; set sort_reverse=False -map oa chain set sort=atime; set sort_reverse=False -map ot chain set sort=type; set sort_reverse=False -map oe chain set sort=extension; set sort_reverse=False - -map oS chain set sort=size; set sort_reverse=True -map oB chain set sort=basename; set sort_reverse=True -map oN chain set sort=natural; set sort_reverse=True -map oM chain set sort=mtime; set sort_reverse=True -map oC chain set sort=ctime; set sort_reverse=True -map oA chain set sort=atime; set sort_reverse=True -map oT chain set sort=type; set sort_reverse=True -map oE chain set sort=extension; set sort_reverse=True - -map dc get_cumulative_size - -# Settings -map zc set collapse_preview! -map zd set sort_directories_first! -map zh set show_hidden! -map set show_hidden! -map zI set flushinput! -map zi set preview_images! -map zm set mouse_enabled! -map zp set preview_files! -map zP set preview_directories! -map zs set sort_case_insensitive! -map zu set autoupdate_cumulative_size! -map zv set use_preview_script! -map zf console filter%space - -# Bookmarks -map ` enter_bookmark %any -map ' enter_bookmark %any -map m set_bookmark %any -map um unset_bookmark %any - -map m draw_bookmarks -copymap m um ` ' - -# Generate all the chmod bindings with some python help: -eval for arg in "rwxXst": cmd("map +u{0} shell -f chmod u+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +g{0} shell -f chmod g+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +o{0} shell -f chmod o+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +a{0} shell -f chmod a+{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map +{0} shell -f chmod u+{0} %s".format(arg)) - -eval for arg in "rwxXst": cmd("map -u{0} shell -f chmod u-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -g{0} shell -f chmod g-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -o{0} shell -f chmod o-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -a{0} shell -f chmod a-{0} %s".format(arg)) -eval for arg in "rwxXst": cmd("map -{0} shell -f chmod u-{0} %s".format(arg)) - -# =================================================================== -# == Define keys for the console -# =================================================================== -# Note: Unmapped keys are passed directly to the console. - -# Basic -cmap eval fm.ui.console.tab() -cmap eval fm.ui.console.tab(-1) -cmap eval fm.ui.console.close() -cmap eval fm.ui.console.execute() -cmap redraw_window - -copycmap -copycmap - -# Move around -cmap eval fm.ui.console.history_move(-1) -cmap eval fm.ui.console.history_move(1) -cmap eval fm.ui.console.move(left=1) -cmap eval fm.ui.console.move(right=1) -cmap eval fm.ui.console.move(right=0, absolute=True) -cmap eval fm.ui.console.move(right=-1, absolute=True) -cmap eval fm.ui.console.move_word(left=1) -cmap eval fm.ui.console.move_word(right=1) - -# Line Editing -cmap eval fm.ui.console.delete(-1) -cmap eval fm.ui.console.delete(0) -cmap eval fm.ui.console.delete_word() -cmap eval fm.ui.console.delete_word(backward=False) -cmap eval fm.ui.console.delete_rest(1) -cmap eval fm.ui.console.delete_rest(-1) -cmap eval fm.ui.console.paste() - -# And of course the emacs way -copycmap -copycmap -copycmap -copycmap -copycmap -copycmap -copycmap -copycmap - -# Note: There are multiple ways to express backspaces. (code 263) -# and (code 127). To be sure, use both. -copycmap - -# This special expression allows typing in numerals: -cmap false - -# =================================================================== -# == Pager Keybindings -# =================================================================== - -# Movement -pmap pager_move down=1 -pmap pager_move up=1 -pmap pager_move left=4 -pmap pager_move right=4 -pmap pager_move to=0 -pmap pager_move to=-1 -pmap pager_move down=1.0 pages=True -pmap pager_move up=1.0 pages=True -pmap pager_move down=0.5 pages=True -pmap pager_move up=0.5 pages=True - -copypmap k -copypmap j -copypmap h -copypmap l -copypmap g -copypmap G -copypmap d -copypmap u -copypmap n f -copypmap p b - -# Basic -pmap redraw_window -pmap pager_close -copypmap q Q i -pmap E edit_file - -# =================================================================== -# == Taskview Keybindings -# =================================================================== - -# Movement -tmap taskview_move up=1 -tmap taskview_move down=1 -tmap taskview_move to=0 -tmap taskview_move to=-1 -tmap taskview_move down=1.0 pages=True -tmap taskview_move up=1.0 pages=True -tmap taskview_move down=0.5 pages=True -tmap taskview_move up=0.5 pages=True - -copytmap k -copytmap j -copytmap g -copytmap G -copytmap u -copytmap n f -copytmap p b - -# Changing priority and deleting tasks -tmap J eval -q fm.ui.taskview.task_move(-1) -tmap K eval -q fm.ui.taskview.task_move(0) -tmap dd eval -q fm.ui.taskview.task_remove() -tmap eval -q fm.ui.taskview.task_move(-1) -tmap eval -q fm.ui.taskview.task_move(0) -tmap eval -q fm.ui.taskview.task_remove() - -# Basic -tmap redraw_window -tmap taskview_close -copytmap q Q w -default_linemode devicons - -# find -map fzf_select diff --git a/dot_config/rofi/config.rasi b/dot_config/rofi/config.rasi deleted file mode 100644 index f32defb..0000000 --- a/dot_config/rofi/config.rasi +++ /dev/null @@ -1,4 +0,0 @@ -configuration { -} - -@theme "/usr/share/rofi/themes/sidebar.rasi" diff --git a/dot_config/symlink_nvim b/dot_config/symlink_nvim deleted file mode 100644 index b68ce03..0000000 --- a/dot_config/symlink_nvim +++ /dev/null @@ -1 +0,0 @@ -../.vim diff --git a/dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl b/dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl deleted file mode 100644 index 3e8f870..0000000 --- a/dot_config/systemd/user/default.target.wants/symlink_udiskie.service.tmpl +++ /dev/null @@ -1 +0,0 @@ -{{ .chezmoi.destDir }}/.config/systemd/user/udiskie.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service deleted file mode 100644 index 5301d23..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_hypridle.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/hypridle.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service deleted file mode 100644 index 3e5dae9..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpaper.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/hyprpaper.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service deleted file mode 100644 index c1bab3a..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_hyprpolkitagent.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/hyprpolkitagent.service diff --git a/dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service b/dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service deleted file mode 100644 index 70fd0a8..0000000 --- a/dot_config/systemd/user/graphical-session.target.wants/symlink_waybar.service +++ /dev/null @@ -1 +0,0 @@ -/usr/lib/systemd/user/waybar.service diff --git a/dot_config/systemd/user/udiskie.service b/dot_config/systemd/user/udiskie.service deleted file mode 100644 index 6c0f16e..0000000 --- a/dot_config/systemd/user/udiskie.service +++ /dev/null @@ -1,9 +0,0 @@ -[Unit] -Description=Udiskie daemon -Documentation=man:udiskie(8) https://github.com/coldfix/udiskie/wiki - -[Service] -ExecStart=/usr/bin/udiskie - -[Install] -WantedBy=multi-user.target diff --git a/dot_config/terminator/config b/dot_config/terminator/config deleted file mode 100644 index dff6026..0000000 --- a/dot_config/terminator/config +++ /dev/null @@ -1,22 +0,0 @@ -[global_config] - title_hide_sizetext = True -[keybindings] - layout_launcher = None - help = None -[profiles] - [[default]] - cursor_color = "#aaaaaa" - foreground_color = "#ffffff" - show_titlebar = False - scrollbar_position = hidden - scroll_on_keystroke = False -[layouts] - [[default]] - [[[child1]]] - parent = window0 - profile = default - type = Terminal - [[[window0]]] - parent = "" - type = Window -[plugins] diff --git a/dot_config/tmuxinator/dotfiles.yml.tmpl b/dot_config/tmuxinator/dotfiles.yml.tmpl deleted file mode 100644 index 8f77c02..0000000 --- a/dot_config/tmuxinator/dotfiles.yml.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -# {{ .chezmoi.homeDir }}/.config/tmuxinator/dotfiles.yml - -name: dotfiles -root: {{ .chezmoi.sourceDir }} - -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start - -# Project hooks -# Runs on project start, always -# on_project_start: command -# Run on project start, the first time -# on_project_first_start: command -# Run on project start, after the first time -# on_project_restart: command -# Run on project exit ( detaching from tmux session ) -# on_project_exit: command -# Run on project stop -# on_project_stop: command - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -startup_window: git - -# Specifies (by index) which pane of the specified window will be selected on project startup. If not set, the first pane is used. -# startup_pane: 1 - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t dotfiles - -windows: - - editor: nvim - - git: - - diff --git a/dot_config/tmuxinator/local.yml.tmpl b/dot_config/tmuxinator/local.yml.tmpl deleted file mode 100644 index 7406619..0000000 --- a/dot_config/tmuxinator/local.yml.tmpl +++ /dev/null @@ -1,47 +0,0 @@ -# {{ .chezmoi.homeDir }}/.config/tmuxinator/local.yml - -name: local -root: ~/ - -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start - -# Project hooks -# Runs on project start, always -# on_project_start: command -# Run on project start, the first time -# on_project_first_start: command -# Run on project start, after the first time -# on_project_restart: command -# Run on project exit ( detaching from tmux session ) -# on_project_exit: command -# Run on project stop -# on_project_stop: command - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -startup_window: cli - -# Specifies (by index) which pane of the specified window will be selected on project startup. If not set, the first pane is used. -# startup_pane: 1 - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t local - -windows: - - htop: htop - - cli: fastfetch diff --git a/dot_config/tmuxinator/notes.yml.tmpl b/dot_config/tmuxinator/notes.yml.tmpl deleted file mode 100644 index 59b6eee..0000000 --- a/dot_config/tmuxinator/notes.yml.tmpl +++ /dev/null @@ -1,48 +0,0 @@ -# {{ .chezmoi.homeDir }}/.config/tmuxinator/notes.yml - -name: notes -root: {{ .chezmoi.homeDir }}/projects/notes - -# Optional tmux socket -# socket_name: foo - -# Runs before everything. Use it to start daemons etc. -# pre: sudo /etc/rc.d/mysqld start - -# Project hooks -# Runs on project start, always -# on_project_start: command -# Run on project start, the first time -# on_project_first_start: command -# Run on project start, after the first time -# on_project_restart: command -# Run on project exit ( detaching from tmux session ) -# on_project_exit: command -# Run on project stop -# on_project_stop: command - -# Runs in each window and pane before window/pane specific commands. Useful for setting up interpreter versions. -# pre_window: rbenv shell 2.0.0-p247 - -# Pass command line options to tmux. Useful for specifying a different tmux.conf. -# tmux_options: -f ~/.tmux.mac.conf - -# Change the command to call tmux. This can be used by derivatives/wrappers like byobu. -# tmux_command: byobu - -# Specifies (by name or index) which window will be selected on project startup. If not set, the first window is used. -startup_window: git - -# Specifies (by index) which pane of the specified window will be selected on project startup. If not set, the first pane is used. -# startup_pane: 1 - -# Controls whether the tmux session should be attached to automatically. Defaults to true. -# attach: false - -# Runs after everything. Use it to attach to tmux with custom options etc. -# post: tmux -CC attach -t notes - -windows: - - editor: nvim - - git: - - diff --git a/dot_config/user-dirs.locale b/dot_config/user-dirs.locale deleted file mode 100644 index 3e0b419..0000000 --- a/dot_config/user-dirs.locale +++ /dev/null @@ -1 +0,0 @@ -en_US \ No newline at end of file diff --git a/dot_config/waybar/config.tmpl b/dot_config/waybar/config.tmpl deleted file mode 100644 index 719d81d..0000000 --- a/dot_config/waybar/config.tmpl +++ /dev/null @@ -1,375 +0,0 @@ -{ - /////////////////////////// - // default config - /////////////////////////// - "layer": "top", - "position": "top", - "height": 42, - "spacing": 4, - "mode": "dock", - "exclusive": true, - "gtk-layer-shell": true, - "passthrough": false, - "fixed-center": true, - - /////////////////////////// - // layout - /////////////////////////// - "modules-left": [ - "hyprland/workspaces", - "hyprland/window" - ], - "modules-center": [ - "idle_inhibitor", - "clock", - "hyprland/language", - "custom/capslock", - "privacy", - "systemd-failed-units", - ], - "modules-right": [ - {{- if .waybar.bluetooth.show }} - "bluetooth", - {{- end }} - "custom/vpn", - {{- if .waybar.net.wifi }} - "network#wifi", - {{- end }} - {{- if .waybar.net.eth }} - "network#eth", - {{- end }} - {{- if .waybar.power.show }} - "battery", - {{- end }} - "group/settings", - "cpu", - "memory", - "temperature", - "disk", - "tray", - "custom/power-buttons", - ], - - /////////////////////////// - // groups - /////////////////////////// - // see https://github.com/Alexays/Waybar/wiki/Module:-Group - "group/settings": { - "orientation": "horizontal", - "modules": [ - "wireplumber", - "backlight", - ], - "drawer": { - "transition-duration": 500, - "transition-left-to-right": false, - "click-to-reveal": false, - }, - }, - - /////////////////////////// - // custom - /////////////////////////// - // see https://github.com/Alexays/Waybar/wiki/Module:-Custom - "custom/capslock": { - "exec": "~/bin/capslock-check.sh", - "restart-interval": 1, - "return-type": "json", - "format": "{}", - }, - "custom/power-buttons": { - "format": "⏻", - "tooltip": false, - "menu": "on-click", - "menu-file": "~/.config/waybar/power_menu.xml", - "menu-actions": { - "lock": "loginctl lock-session", - "logout": "uwsm stop", - "reboot": "systemctl reboot", - "shutdown": "systemctl poweroff", - "suspend": "systemctl suspend", - }, - }, - "custom/vpn": { - "format": "{}", - "exec": "~/bin/nmcli-active-vpn-conn.sh", - "return-type": "json", - "interval": 3, - }, - - /////////////////////////// - // modules - /////////////////////////// - "backlight": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Backlight - "interval": 2, - "format": "{icon} {percent}%", - "format-icons": ["󰛩", "󱩎", "󱩏", "󱩐", "󱩑", "󱩒", "󱩓", "󱩔", "󱩕", "󱩖", "󰛨"], - "scroll-step": 5, - "on-scroll-up": "~/bin/backlight.sh \"+5%\"", - "on-scroll-down": "~/bin/backlight.sh \"-5%\"", - "smooth-scrolling-threshold": 3, - "tooltip": false, - }, - {{- if .waybar.power.show }} - "battery": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Battery - {{- if .waybar.power.battery }} - "bat": {{ .waybar.power.battery | quote }}, - {{- else }} - // The battery to monitor, as in /sys/class/power_supply/ instead of auto detect. - // "bat": "", - {{- end }} - {{- if .waybar.power.adapter }} - "adapter": {{ .waybar.power.adapter | quote }}, - {{- else }} - // The adapter to monitor, as in /sys/class/power_supply/ instead of auto detect. - // "adapter": "", - {{- end }} - "interval": 3, - "states": { - "warning": 20, - "critical": 10, - }, - "format-discharging": "{icon} {capacity}%", - "format-icons": ["", "", "", "", ""], - "format-full": " {capacity}%", - "format-plugged": " {capacity}%", - "format-charging": " {capacity}%", - "tooltip": true, - "tooltip-format": "{timeTo}", - "max-length": 25, - }, - {{- end }} - {{- if .waybar.bluetooth.show }} - "bluetooth": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth - {{- if .waybar.bluetooth.controller }} - controller: {{ .waybar.bluetooth.controller | quote }}, - {{- else }} - // Use this specific controller, otherwise a random controller - // is chosen. May only be required if there is more than 1 - // controller present. - // controller: "", - {{- end }} - "tooltip": true, - "format": "󰂯", - "tooltip-format": "{controller_address} is {status}", - "format-disabled": "󰂲", - "tooltip-format-disabled": "Bluetooth disabled ({controller_address})", - "format-off": "󰂲", - "tooltip-format-off": "Bluetooth off ({controller_address})", - "format-on": "󰂲", - "tooltip-format-on": "Bluetooth on ({controller_address})", - "format-connected": "󰂱 {num_connections}", - "tooltip-format-connected": "{device_enumerate}", - "tooltip-format-enumerate-connected": "{device_alias}\t{device_address}", - "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\tBattery: {device_battery_percentage}%", - }, - {{- end }} - "clock": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Clock - "interval": 1, - "format": "󰔠 {:%a, %Y-%m-%d %H:%M:%S}", - // locale must be enabled - "locale": "de_AT.UTF-8", - // "timezone": "Europe/Vienna", - // "timezones": [ - // "UTC", - // ], - "tooltip": true, - "tooltip-format": "{calendar}", - "calendar": { - "mode": "month", - "mode-mon-col": 3, - "weeks-pos": "left", - "on-scroll": 1, - "format": { - "months": "{}", - "days": "{}", - "weeks": "CW{}", - "weekdays": "{}", - "today": "{}", - }, - }, - "actions": { - "on-click-right": "mode", - "on-scroll-up": "tz_up", - "on-scroll-down": "tz_down", - "on-scroll-up": "shift_up", - "on-scroll-down": "shift_down", - }, - }, - "cpu": { - // see https://github.com/Alexays/Waybar/wiki/Module:-CPU - "format": " {usage}%", - "tooltip": true, - "interval": 1, - }, - "disk": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Disk - "interval": 30, - "format": "󰋊 {percentage_used}%", - "path": "/", - "unit": "GB", - "tooltip": "true", - "tooltip-format": "Free:\t\t{specific_free:0.2f} GB\t({percentage_free}%)\nUsed:\t\t{specific_used:0.2f} GB\t({percentage_used}%)\nTotal space:\t{specific_total:0.2f} GB", - }, - "hyprland/language": { - "format": "󰌌 {}", - "format-en": "en", - "format-de": "de", - "keyboard-name": "at-translated-set-2-keyboard", - "on-click": "hyprctl switchxkblayout at-translated-set-2-keyboard next", - "on-scroll-up": "hyprctl switchxkblayout at-translated-set-2-keyboard next", - "on-scroll-down": "hyprctl switchxkblayout at-translated-set-2-keyboard prev", - }, - "hyprland/workspaces": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces - "active-only": true, - "on-click": "activate", - "format": "{id}", - "all-outputs": false, - "disable-scroll": false, - "active-only": false, - }, - "hyprland/window": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#window - "format": "{title}", - "separate-outputs": true, - }, - "idle_inhibitor": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor - "start-activated": false, - "timeout": 120, // Deactivate automatically after 2h - "format": "{icon}", - "format-icons": { - "activated": "", - "deactivated": "", - }, - "tooltip": true, - }, - "memory": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Memory - "interval": 10, - "format": " {used:0.1f}Gi", - "tooltip": true, - "tooltip-format": "Used:\t\t{used:0.1f}GiB ({percentage}%)\nAvailable:\t{avail:0.1f}GiB\nTotal:\t\t{total:0.1f}GiB", - }, - {{- if .waybar.net.eth }} - "network#eth": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Network - "interface": {{ .waybar.net.eth | quote }}, - "interval": 5, - "tooltip": true, - "format-ethernet": "󰈁", - "tooltip-format-ethernet": "IP:\t\t{ipaddr}/{cidr}\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}", - "format-disabled": "󰈂", - "tooltip-format-disabled": "{ifname} is disabled", - "format-linked": "󰈂", - "tooltip-format-linked": "{ifname} is linked", - "format-disconnected": "", // do not show, when not connected at all - // "tooltip-format-disconnected": "{ifname} is not connected", - "format": "", // do not show for any other states, except for those specified above - // "tooltip-format": "", - }, - {{- end }} - {{- if .waybar.net.wifi }} - "network#wifi": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Network - "interface": {{ .waybar.net.wifi | quote }}, - "interval": 5, - "tooltip": true, - "format-icons": ["󰤯", "󰤟", "󰤢", "󰤥", "󰤨"], - "format-wifi": "{icon} {signalStrength}%", - "tooltip-format-wifi": "SSID:\t\t{essid}\nIP:\t\t{ipaddr}/{cidr}\nFrequency:\t{frequency} GHz\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}", - "format-disabled": "󰤫", - "tooltip-format-disabled": "{ifname} is disabled", - "format-linked": "󱛇", - "tooltip-format-linked": "{ifname} is linked", - "format-disconnected": "󰤮", - "tooltip-format-disconnected": "{ifname} is not connected", - }, - {{- end }} - "privacy": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Privacy - "icon-spacing": 4, - "icon-size": 18, - "transition-duration": 250, - "expand": true, - "ignore-monitor": false, - "modules": [ - { - "type": "screenshare", - "tooltip": true, - "tooltip-icon-size": 24, - }, - // { - // "type": "audio-out", - // "tooltip": true, - // "tooltip-icon-size": 24, - // }, - { - "type": "audio-in", - "tooltip": true, - "tooltip-icon-size": 24, - }, - ], - // Example for ignore object: - // { - // "type": "audio-in", - // "name": "cava" - // }, - "ignore": [ - ], - }, - "systemd-failed-units": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Systemd-failed-units - "hide-on-ok": true, - "format": " {nr_failed}", - "system": true, - "user": true, - }, - "temperature": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Temperature - {{- if .waybar.temperature.thermal_zone }} - "thermal-zone": {{ .waybar.temperature.thermal_zone }}, - {{- else }} - // Leave commented out as the module will pick sensitive defaults - // "thermal-zone": 2, - {{- end }} - {{- if .waybar.temperature.hwmon_path }} - "hwmon-path": {{ .waybar.temperature.hwmon_path | quote }} - {{- else }} - // Leave commented out as the module will pick sensitive defaults - // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", - {{- end }} - "format-icons": ["", "", ""], - "critical-threshold": 80, - "format": "{icon} {temperatureC}°C", - "format-critical": "{temperatureC}°C {icon}", - "tooltip": true, - "tooltip-format": "{temperatureC}°C", - }, - "tray": { - // see https://github.com/Alexays/Waybar/wiki/Module:-Tray - "show-passive-items": true, - "spacing": 10, - }, - "wireplumber": { - // see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber - "format": "{icon} {volume}%", - "format-muted": "󰖁", - "format-icons": ["󰕿", "󰖀", "󰕾"], - "on-scroll-up": "~/bin/sound.sh \"volume\" \"+5%\"", - "on-scroll-down": "~/bin/sound.sh \"volume\" \"-5%\"", - "on-click": "~/bin/sound.sh \"mute\" \"toggle\"", - "on-click-middle": "helvum", - "scroll-step": 5, - "max-volume": 100, - "tooltip": true, - "tooltip-format": "Volume:\t{volume}%\nNode:\t{node_name}", - "smooth-scrolling-threshold": 3, - "node-type": "Audio/Sink", - }, -} diff --git a/dot_config/waybar/power_menu.xml b/dot_config/waybar/power_menu.xml deleted file mode 100644 index 69f7fe9..0000000 --- a/dot_config/waybar/power_menu.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - -  Lock - - - - - 󰏥 Suspend - - - - - 󰗽 Logout - - - - - ⏻ Shutdown - - - - - 󰜉 Reboot - - - - diff --git a/dot_config/waybar/style.css.tmpl b/dot_config/waybar/style.css.tmpl deleted file mode 100644 index fc2eab8..0000000 --- a/dot_config/waybar/style.css.tmpl +++ /dev/null @@ -1,278 +0,0 @@ -/* General Styling */ -* { - min-height: 0; - min-width: 0; - /* pacman -S ttf-jetbrains-mono-nerd */ - font-family: Lexend, "JetBrainsMono NFP"; - font-size: 14px; - font-weight: 600; -} - - -window#waybar { - transition-property: background-color; - transition-duration: 0.5s; - /* background-color: #1e1e2e; */ - /* background-color: #181825; */ - background-color: #11111b; - /* background-color: rgba(24, 24, 37, 0.6); */ -} -window#waybar.empty #window { - background-color: transparent; -} - - -#workspaces button { - padding: 0.3rem 0.6rem; - margin: 0.4rem 0.25rem; - border-radius: 6px; - /* background-color: #181825; */ - background-color: #1e1e2e; - color: #cdd6f4; -} -#workspaces button:hover { - color: #1e1e2e; - background-color: #cdd6f4; -} -#workspaces button.active { - background-color: #1e1e2e; - color: #89b4fa; -} -#workspaces button.urgent { - background-color: #1e1e2e; - color: #f38ba8; -} - - -tooltip { - background-color: #181825; - border: 2px solid #89b4fa; -} - - - -/* Background of widgets */ -#backlight, -{{- if .waybar.power.show }} -#battery, -{{- end }} -{{- if .waybar.bluetooth.show }} -#bluetooth, -{{- end }} -#clock, -#cpu, -#custom-capslock, -#custom-power-buttons, -#custom-vpn, -#disk, -#idle_inhibitor, -#language, -#memory, -#network, -#privacy, -#systemd-failed-units, -#temperature, -#tray, -#window, -#wireplumber { - padding: 0.3rem 0.6rem; - margin: 0.4rem 0.25rem; - border-radius: 6px; - /* background-color: #181825; */ - background-color: #1e1e2e; -} - - -/* Custom widgets */ -#custom-capslock { - color: #cdc1ff; -} -#custom-capslock.active { - animation: capslock_active_blinker 2s linear infinite; -} -@keyframes capslock_active_blinker { - 50% { - color: #eb6383; - } -} - - -#custom-power-buttons { - color: #f38ba8; -} -/* Menu list of power-buttons */ -menu { - border-radius: 15px; - background: #161320; - color: #b5e8e0; -} -menuitem { - border-radius: 15px; -} - - -#custom-vpn { - color: #d1d3d4; -} -#custom-vpn.active { - color: #86b0bd; -} - - - -/* Widgets */ -#backlight { - color: #ef9c66; -} -{{- if .waybar.power.show }} - - -#battery { - color: #ece3ce; -} -#battery.full, -#battery.plugged, -#battery.charging { - color: #a3dc9a; -} -#battery.discharging.warning { - animation: battery_warning_blinker 2s linear infinite; -} -@keyframes battery_warning_blinker { - 50% { - color: #11111b; - } -} -#battery.discharging.critical { - animation: battery_critical_blinker 2s linear infinite; -} -@keyframes battery_critical_blinker { - 50% { - color: #11111b; - } -} -{{- end }} -{{- if .waybar.bluetooth.show }} - - -#bluetooth, -#bluetooth.on, -#bluetooth.connected { - color: #007aff; -} -#bluetooth.disabled, -#bluetooth.no-controller, -#bluetooth.off { - color: #65647c; -} -#bluetooth.discovering { - animation: bluetooth_scanning_blinker 2s linear infinite; -} -@keyframes bluetooth_scanning_blinker { - 50% { - color: #9cf196; - } -} -#bluetooth.discoverable { - animation: bluetooth_discoverable_blinker 2s linear infinite; -} -@keyframes bluetooth_discoverable_blinker { - 50% { - color: #eb6383; - } -} -{{- end }} - - -#clock { - color: #eff8ff; -} - - -#cpu { - color: #94e2d5; -} - - -#disk { - color: #9ad0ec; -} - - -#idle_inhibitor.deactivated { - color: #65647c; -} -#idle_inhibitor.activated { - color: #54bab9; - animation: idle_inhibitor_active 2s linear infinite; -} -@keyframes idle_inhibitor_active { - 50% { - color: #11111b; - } -} - - -#language { - color: #878ecd; -} - - -#memory { - color: #cb80ab; -} - - -#network { - color: #cba6f7; -} -#network.disabled { - color: #65647c; -} - - -#privacy { - color: #ffcf81; - animation: privacy_warning 2s linear infinite; -} -@keyframes privacy_warning { - 50% { - color: #11111b; - } -} - - -#systemd-failed-units { - color: #bb6464; - animation: systemd_failed_units_degraded 2s linear infinite; -} -@keyframes systemd_failed_units_degraded { - 50% { - color: #11111b; - } -} - - -#temperature { - color: #95d2b3; - -} -#temperature.critical { - color: #bb6464; - animation: temperature_critical 2s linear infinite; -} -@keyframes temperature_critical { - 50% { - color: #11111b; - } -} - - -#window { - color: #cdd6f4; -} - - -#wireplumber { - color: #b4befe; -} diff --git a/dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf b/dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf deleted file mode 100644 index c3d4e4b..0000000 --- a/dot_config/wireplumber/wireplumber.conf.d/alsa-config.conf +++ /dev/null @@ -1,3 +0,0 @@ -monitor.alsa.properties = { - alsa.use-ucm = false -} diff --git a/dot_dir_colors b/dot_dir_colors deleted file mode 100644 index 89c085d..0000000 --- a/dot_dir_colors +++ /dev/null @@ -1,243 +0,0 @@ -# Configuration file for dircolors, a utility to help you set the -# LS_COLORS environment variable used by GNU ls with the --color option. - -# Copyright (C) 1996-2014 Free Software Foundation, Inc. -# Copying and distribution of this file, with or without modification, -# are permitted provided the copyright notice and this notice are preserved. - -# The keywords COLOR, OPTIONS, and EIGHTBIT (honored by the -# slackware version of dircolors) are recognized but ignored. - -# You can copy this file to .dir_colors in your $HOME directory to override -# the system defaults. - -# Below, there should be one TERM entry for each termtype that is colorizable -TERM Eterm -TERM ansi -TERM color-xterm -TERM con132x25 -TERM con132x30 -TERM con132x43 -TERM con132x60 -TERM con80x25 -TERM con80x28 -TERM con80x30 -TERM con80x43 -TERM con80x50 -TERM con80x60 -TERM cons25 -TERM console -TERM cygwin -TERM dtterm -TERM eterm-color -TERM gnome -TERM gnome-256color -TERM hurd -TERM jfbterm -TERM konsole -TERM kterm -TERM linux -TERM linux-c -TERM mach-color -TERM mach-gnu-color -TERM mlterm -TERM putty -TERM putty-256color -TERM rxvt -TERM rxvt-256color -TERM rxvt-cygwin -TERM rxvt-cygwin-native -TERM rxvt-unicode -TERM rxvt-unicode-256color -TERM rxvt-unicode256 -TERM screen -TERM screen-256color -TERM screen-256color-bce -TERM screen-bce -TERM screen-w -TERM screen.Eterm -TERM screen.rxvt -TERM screen.linux -TERM st -TERM st-256color -TERM terminator -TERM vt100 -TERM xterm -TERM xterm-16color -TERM xterm-256color -TERM xterm-88color -TERM xterm-color -TERM xterm-debian - -# Below are the color init strings for the basic file types. A color init -# string consists of one or more of the following numeric codes: -# Attribute codes: -# 00=none 01=bold 04=underscore 05=blink 07=reverse 08=concealed -# Text color codes: -# 30=black 31=red 32=green 33=yellow 34=blue 35=magenta 36=cyan 37=white -# Background color codes: -# 40=black 41=red 42=green 43=yellow 44=blue 45=magenta 46=cyan 47=white -#NORMAL 00 # no color code at all -#FILE 00 # regular file: use no color at all -RESET 0 # reset to "normal" color -DIR 01;34 # directory -LINK 01;36 # symbolic link. (If you set this to 'target' instead of a - # numerical value, the color is as for the file pointed to.) -MULTIHARDLINK 00 # regular file with more than one link -FIFO 40;33 # pipe -SOCK 01;35 # socket -DOOR 01;35 # door -BLK 40;33;01 # block device driver -CHR 40;33;01 # character device driver -ORPHAN 01;05;37;41 # orphaned syminks -MISSING 01;05;37;41 # ... and the files they point to -SETUID 37;41 # file that is setuid (u+s) -SETGID 30;43 # file that is setgid (g+s) -CAPABILITY 30;41 # file with capability -STICKY_OTHER_WRITABLE 30;42 # dir that is sticky and other-writable (+t,o+w) -OTHER_WRITABLE 34;42 # dir that is other-writable (o+w) and not sticky -STICKY 37;44 # dir with the sticky bit set (+t) and not other-writable - -# This is for files with execute permission: -EXEC 01;32 - -# List any file extensions like '.gz' or '.tar' that you would like ls -# to colorize below. Put the extension, a space, and the color init string. -# (and any comments you want to add after a '#') - -# If you use DOS-style suffixes, you may want to uncomment the following: -#.cmd 01;32 # executables (bright green) -#.exe 01;32 -#.com 01;32 -#.btm 01;32 -#.bat 01;32 -# Or if you want to colorize scripts even if they do not have the -# executable bit actually set. -#.sh 01;32 -#.csh 01;32 - - # archives or compressed (bright red) -.tar 01;31 -.tgz 01;31 -.arc 01;31 -.arj 01;31 -.taz 01;31 -.lha 01;31 -.lz4 01;31 -.lzh 01;31 -.lzma 01;31 -.tlz 01;31 -.txz 01;31 -.tzo 01;31 -.t7z 01;31 -.zip 01;31 -.z 01;31 -.Z 01;31 -.dz 01;31 -.gz 01;31 -.lrz 01;31 -.lz 01;31 -.lzo 01;31 -.xz 01;31 -.bz2 01;31 -.bz 01;31 -.tbz 01;31 -.tbz2 01;31 -.tz 01;31 -.deb 01;31 -.rpm 01;31 -.jar 01;31 -.war 01;31 -.ear 01;31 -.sar 01;31 -.rar 01;31 -.alz 01;31 -.ace 01;31 -.zoo 01;31 -.cpio 01;31 -.7z 01;31 -.rz 01;31 -.cab 01;31 - -# image formats -.jpg 01;35 -.jpeg 01;35 -.gif 01;35 -.bmp 01;35 -.pbm 01;35 -.pgm 01;35 -.ppm 01;35 -.tga 01;35 -.xbm 01;35 -.xpm 01;35 -.tif 01;35 -.tiff 01;35 -.png 01;35 -.svg 01;35 -.svgz 01;35 -.mng 01;35 -.pcx 01;35 -.mov 01;35 -.mpg 01;35 -.mpeg 01;35 -.m2v 01;35 -.mkv 01;35 -.webm 01;35 -.ogm 01;35 -.mp4 01;35 -.m4v 01;35 -.mp4v 01;35 -.vob 01;35 -.qt 01;35 -.nuv 01;35 -.wmv 01;35 -.asf 01;35 -.rm 01;35 -.rmvb 01;35 -.flc 01;35 -.avi 01;35 -.fli 01;35 -.flv 01;35 -.gl 01;35 -.dl 01;35 -.xcf 01;35 -.xwd 01;35 -.yuv 01;35 -.cgm 01;35 -.emf 01;35 - -# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions -.axv 01;35 -.anx 01;35 -.ogv 01;35 -.ogx 01;35 - -# Document files -.pdf 00;32 -.ps 00;32 -.txt 00;32 -.patch 00;32 -.diff 00;32 -.log 00;32 -.tex 00;32 -.doc 00;32 - -# audio formats -.aac 00;36 -.au 00;36 -.flac 00;36 -.m4a 00;36 -.mid 00;36 -.midi 00;36 -.mka 00;36 -.mp3 00;36 -.mpc 00;36 -.ogg 00;36 -.ra 00;36 -.wav 00;36 - -# http://wiki.xiph.org/index.php/MIME_Types_and_File_Extensions -.axa 00;36 -.oga 00;36 -.spx 00;36 -.xspf 00;36 diff --git a/dot_editorconfig b/dot_editorconfig deleted file mode 100644 index 8d478bd..0000000 --- a/dot_editorconfig +++ /dev/null @@ -1,66 +0,0 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -indent_size = 8 -indent_style = tab -insert_final_newline = true -max_line_length = 80 -trim_trailing_whitespace = true - - - -# File extensions -[*.css] -indent_size = 2 -indent_style = space - -[*.go] -# Nothing to add here - -[*.md] -trim_trailing_whitespace = false - -[*.nix] -indent_size = 2 -indent_style = space - -[*.js] -indent_size = 2 -indent_style = space - -[*.php] -indent_size = 4 -indent_style = space - -[*.py] -indent_size = 4 -indent_style = space - -[*.sass] -indent_size = 2 -indent_style = space - -[*.scss] -indent_size = 2 -indent_style = space - -[*.ts] -indent_size = 2 -indent_style = space - -[*.vue] -indent_size = 2 -indent_style = space - -[*.{yaml,yml}] -indent_size = 2 -indent_style = space - - - -# Files -[package.json] -indent_size = 2 -indent_style = space diff --git a/dot_editrc b/dot_editrc deleted file mode 100644 index f06812c..0000000 --- a/dot_editrc +++ /dev/null @@ -1,5 +0,0 @@ -bind "^W" ed-delete-prev-word -bind "^U" vi-kill-line-prev - -# Show all bindings -# bind diff --git a/dot_fzf.bash b/dot_fzf.bash deleted file mode 100644 index 15758e9..0000000 --- a/dot_fzf.bash +++ /dev/null @@ -1,7 +0,0 @@ -# Setup fzf -# --------- -if [[ ! "$PATH" == */home/rtucek/.fzf/bin* ]]; then - PATH="${PATH:+${PATH}:}/home/rtucek/.fzf/bin" -fi - -eval "$(fzf --bash)" diff --git a/dot_gitconfig.tmpl b/dot_gitconfig.tmpl deleted file mode 100644 index 96df348..0000000 --- a/dot_gitconfig.tmpl +++ /dev/null @@ -1,117 +0,0 @@ -[core] - autocrlf = input - editor = nvim - excludesfile = ~/.gitignore_global - ; pager = /usr/share/git/diff-highlight/diff-highlight | less -RFX - pager = delta - ; pager = delta --keep-plus-minus-markers --theme='zenburn' - ; pager = diff-so-fancy | less -RFX - -[user] - name = {{ .git.name }} - email = {{ .git.email }} -{{- if .git.signingkey }} - signingkey = {{ .git.signingkey }} -{{- end }} - -[alias] - fork-point = !bash -c 'diff -u <(git rev-list --first-parent "${1:-master}") <(git rev-list --first-parent "${2:-HEAD}") | sed -ne \"s/^ //p\" | head -1' - - get-branch = !bash -c 'git branch -ra | grep -i $1' - - lg = !git lg1 - lg1 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --branches --remotes --tags - lg2 = log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --all - patch = !git --no-pager diff --no-color - permission-reset = !git diff -p -R | grep -E \"^(diff|(old|new) mode)\" | git apply - no-ci-push = push -o ci.skip - -[credential] - helper = cache --timeout=3600 - -[init] - defaultBranch = main - -[commit] -{{- if .git.signingkey }} - gpgsign = true -{{- end }} - verbose = true - cleanup = scissors - -[gpg] - program = gpg - -[tag] -{{- if .git.signingkey }} - forceSignAnnotated = true - gpgSign = true -{{- end }} - -[format] - coverFromDescription = auto - coverLetter = auto - signOff = true - -[fetch] - prune = true - -[pull] - rebase = merges - -[push] - default = simple - -[merge] - autoStash = true - conflictstyle = diff3 - ff = false - log = true - tool = nvimdiff - -[mergetool] - prompt = true - -[mergetool "nvimdiff"] - cmd = nvim -d $BASE $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J' - -[diff] - colorMoved = default - renames = copies - tool = nvimdiff - -[difftool] - prompt = true - -[difftool "nvimdiff"] - cmd = nvim -d $LOCAL $REMOTE -c '$wincmd w' -c 'wincmd L' - -[interactive] - diffFilter = delta --color-only --hunk-header-style raw - -[color] - ui = true - -[color "diff"] - commit = yellow bold - frag = magenta bold - meta = 11 - new = green bold - old = red bold - ; whitespace = red reverse - -[diff-so-fancy] - changeHunkIndicators = false - markEmptyLines = false - stripLeadingSymbols = false - useUnicodeRuler = false - -[delta] - color-only = true - hunk-header-style = syntax - line-numbers = true - minus-style = syntax "#3f0001" - ; side-by-side = true - syntax-theme = Monokai Extended - whitespace-error-style = normal - -[rebase] - autoStash = true diff --git a/dot_gitignore_global b/dot_gitignore_global deleted file mode 100644 index 0671cf6..0000000 --- a/dot_gitignore_global +++ /dev/null @@ -1,10 +0,0 @@ -*.sublime-project -*.sublime-workspace -*.swp -*~ -.DS_Store -.tags -.tags.lock -.tags.temp -/.tmuxinator.yml -Session.vim diff --git a/dot_inputrc b/dot_inputrc deleted file mode 100644 index 04c93c3..0000000 --- a/dot_inputrc +++ /dev/null @@ -1,46 +0,0 @@ -# Make Tab autocomplete regardless of filename case -set completion-ignore-case on - -# List all matches in case multiple possible completions are possible -set show-all-if-ambiguous on - -# Immediately add a trailing slash when autocompleting symlinks to directories -set mark-symlinked-directories on - -# Use the text that has already been typed as the prefix for searching through -# commands (i.e. more intelligent Up/Down behavior) - -# Do not autocomplete hidden files unless the pattern explicitly begins with a dot -set match-hidden-files off - -# Show all autocomplete results at once -set page-completions off - -# If there are more than 200 possible completions for a word, ask to show them all -set completion-query-items 200 - -# Show extra file information when completing, like `ls -F` does -set visible-stats on - -# Be more intelligent when autocompleting by also looking at the text after -# the cursor. For example, when the current line is "cd ~/src/mozil", and -# the cursor is on the "z", pressing Tab will not autocomplete it to "cd -# ~/src/mozillail", but to "cd ~/src/mozilla". (This is supported by the -# Readline used by Bash 4.) -set skip-completed-text on - -# Allow UTF-8 input and output, instead of showing stuff like $'\0123\0456' -set input-meta on -set output-meta on -set convert-meta off - -# Key bindings -"\e[B": history-search-forward -"\e[A": history-search-backward -"\e[3;3~": kill-word -"\e[1;5C": forward-word -"\e[1;5D": backward-word -"\e[5C": forward-word -"\e[5D": backward-word -"\e\e[C": forward-word -"\e\e[D": backward-word diff --git a/dot_my.cnf b/dot_my.cnf deleted file mode 100644 index d56a634..0000000 --- a/dot_my.cnf +++ /dev/null @@ -1,10 +0,0 @@ -[mysql] -auto-rehash -auto-vertical-output -pager = less -FX - -[mysql] -pager = less -FX - -[mysqldump] -column-statistics = 0 diff --git a/dot_myclirc b/dot_myclirc deleted file mode 100644 index a2fdb00..0000000 --- a/dot_myclirc +++ /dev/null @@ -1,104 +0,0 @@ -# vi: ft=dosini -[main] - -# Enables context sensitive auto-completion. If this is disabled the all -# possible completions will be listed. -smart_completion = True - -# Multi-line mode allows breaking up the sql statements into multiple lines. If -# this is set to True, then the end of the statements must have a semi-colon. -# If this is set to False then sql statements can't be split into multiple -# lines. End of line (return) is considered as the end of the statement. -multi_line = True - -# Destructive warning mode will alert you before executing a sql statement -# that may cause harm to the database such as "drop table", "drop database" -# or "shutdown". -destructive_warning = True - -# log_file location. -log_file = ~/.mycli.log - -# Default log level. Possible values: "CRITICAL", "ERROR", "WARNING", "INFO" -# and "DEBUG". "NONE" disables logging. -log_level = INFO - -# Log every query and its results to a file. Enable this by uncommenting the -# line below. -# audit_log = ~/.mycli-audit.log - -# Timing of sql statments and table rendering. -timing = True - -# Table format. Possible values: psql, plain, simple, grid, fancy_grid, pipe, -# orgtbl, rst, mediawiki, html, latex, latex_booktabs, tsv. -# Recommended: psql, fancy_grid and grid. -table_format = psql - -# Syntax coloring style. Possible values (many support the "-dark" suffix): -# manni, igor, xcode, vim, autumn, vs, rrt, native, perldoc, borland, tango, emacs, -# friendly, monokai, paraiso, colorful, murphy, bw, pastie, paraiso, trac, default, -# fruity. -# Screenshots at http://mycli.net/syntax -syntax_style = monokai - -# Keybindings: Possible values: emacs, vi. -# Emacs mode: Ctrl-A is home, Ctrl-E is end. All emacs keybindings are available in the REPL. -# When Vi mode is enabled you can use modal editing features offered by Vi in the REPL. -key_bindings = vi - -# Enabling this option will show the suggestions in a wider menu. Thus more items are suggested. -wider_completion_menu = True - -# MySQL prompt -# \t - Product type (Percona, MySQL, Mariadb) -# \u - Username -# \h - Hostname of the server -# \d - Database name -# \n - Newline -prompt = "\t \u@\h:\d> " -prompt_continuation = "-> " - -# Skip intro info on startup and outro info on exit -less_chatty = False - -# Use alias from --login-path instead of host name in prompt -login_path_as_host = False - -# Enable the pager on startup. -enable_pager = True - -# Cause result sets to be displayed vertically if they are too wide for the current window, -# and using normal tabular format otherwise. (This applies to statements terminated by ; or \G.) -; auto_vertical_output = True - -# Custom colors for the completion menu, toolbar, etc. -[colors] -# Completion menus. -Token.Menu.Completions.Completion.Current = "bg:#00aaaa #000000" -Token.Menu.Completions.Completion = "bg:#008888 #ffffff" -Token.Menu.Completions.MultiColumnMeta = "bg:#aaffff #000000" -Token.Menu.Completions.ProgressButton = "bg:#003333" -Token.Menu.Completions.ProgressBar = "bg:#00aaaa" - -# Selected text. -Token.SelectedText = "#ffffff bg:#6666aa" - -# Search matches. (reverse-i-search) -Token.SearchMatch = "#ffffff bg:#4444aa" -Token.SearchMatch.Current = "#ffffff bg:#44aa44" - -# The bottom toolbar. -Token.Toolbar = "bg:#222222 #aaaaaa" -Token.Toolbar.Off = "bg:#222222 #888888" -Token.Toolbar.On = "bg:#222222 #ffffff" - -# Search/arg/system toolbars. -Token.Toolbar.Search = noinherit bold -Token.Toolbar.Search.Text = nobold -Token.Toolbar.System = noinherit bold -Token.Toolbar.Arg = noinherit bold -Token.Toolbar.Arg.Text = nobold - -# Favorite queries. -[favorite_queries] diff --git a/dot_npmrc.tmpl b/dot_npmrc.tmpl deleted file mode 100644 index 587c46e..0000000 --- a/dot_npmrc.tmpl +++ /dev/null @@ -1,8 +0,0 @@ -git=git -git-tag-version=true -sign-git-commit=true -sign-git-tag=true -tag-version-prefix=v -{{- if .npm.token }} -//registry.npmjs.org/:_authToken={{ .npm.token }} -{{- end }} diff --git a/dot_profile b/dot_profile deleted file mode 100644 index 135da8d..0000000 --- a/dot_profile +++ /dev/null @@ -1,29 +0,0 @@ -# ~/.profile: executed by the command interpreter for login shells. -# This file is not read by bash(1), if ~/.bash_profile or ~/.bash_login -# exists. -# see /usr/share/doc/bash/examples/startup-files for examples. -# the files are located in the bash-doc package. - -# the default umask is set in /etc/profile; for setting the umask -# for ssh logins, install and configure the libpam-umask package. -#umask 022 - -# if running bash -if [ -n "$BASH_VERSION" ]; then - # include .bashrc if it exists - if [ -f "$HOME/.bashrc" ]; then - . "$HOME/.bashrc" - fi -fi - -# set PATH so it includes user's private bin if it exists -if [ -d "$HOME/bin" ] ; then - PATH="$HOME/bin:$PATH" -fi - -export QT_QPA_PLATFORMTHEME="qt5ct" -export EDITOR=/usr/bin/nvim -export GTK2_RC_FILES="$HOME/.gtkrc-2.0" -# fix "xdg-open fork-bomb" export your preferred browser from here -export BROWSER=/usr/bin/google-chrome-stable -export TERMINAL=/usr/bin/kitty diff --git a/dot_selected_editor b/dot_selected_editor deleted file mode 100644 index d7052d4..0000000 --- a/dot_selected_editor +++ /dev/null @@ -1,2 +0,0 @@ -# Generated by /usr/bin/select-editor -SELECTED_EDITOR="/usr/bin/nvim" diff --git a/dot_signature/ixo-raw.html b/dot_signature/ixo-raw.html deleted file mode 100644 index 4c1e294..0000000 --- a/dot_signature/ixo-raw.html +++ /dev/null @@ -1,22 +0,0 @@ -

- - - - - -
- - IXOPAY - - -
- Rudolf Tucek -
-
- Staff Engineer, IXOPAY
- -
-
\ No newline at end of file diff --git a/dot_signature/ixo-thunderbird.html b/dot_signature/ixo-thunderbird.html deleted file mode 100644 index d868ec1..0000000 --- a/dot_signature/ixo-thunderbird.html +++ /dev/null @@ -1,25 +0,0 @@ - - -
- - - - - -
- - IXOPAY - - -
- Rudolf Tucek -
-
- Staff Engineer, IXOPAY
- -
-
- diff --git a/dot_tmux.conf b/dot_tmux.conf deleted file mode 100644 index 17a1eff..0000000 --- a/dot_tmux.conf +++ /dev/null @@ -1,183 +0,0 @@ -### GENERAL CONFIG ### -# Prefix -unbind C-b -set -g prefix C-Space -bind Space send-prefix - -# Quick config reload -bind-key r source-file ~/.tmux.conf \; display-message "tmux.conf reloaded." - -# Set ability to capture on start and restore on exit window data when -# running an application -setw -g alternate-screen on - -# Scrolling -set -g terminal-overrides 'xterm*:smcup@:rmcup@' - -# Cursor shape -set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' - -# Ensure colors are set properly -set-option -sa terminal-overrides ',rxvt-unicode-256color:RGB' # urxvt -set-option -sa terminal-overrides ',xterm-256color:RGB' # terminator - -# Set window title -set-option -g set-titles on -set-option -g set-titles-string "#S: #{pane_current_command}" - -# Mouse Mode -set -g mouse on - -# Don't set the clipboard via escape sequence -set-option -s set-clipboard off - - - -### GENERAL KEY BINDINGS ### -# Clock mode (default binding "t" gets overridden via tmux-sessionist plugin) -bind T clock-mode - -# Move back and forward -bind -r 'C-p' previous-window -bind -r 'C-n' next-window - -# Split windows -bind 'c' new-window -c '#{pane_current_path}' - -# send-keys -X copy-pipe-and-cancel "xclip -selection clipboard" -bind -T copy-mode Enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard" -bind -T copy-mode-vi Enter send-keys -X copy-pipe-and-cancel "xclip -selection clipboard" -bind ']' run "tmux set-buffer \"$(xclip -o -sel clipboard)\"; tmux paste-buffer" - - - -### TWEAK UI ### -# Derived from -# http://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/ - -# Start window numbering at 1 for easier switching -set -g base-index 1 -setw -g pane-base-index 1 -# Re-enumerate windows on close -set-option -g renumber-windows on -# Re-name windows, based on current program -setw -g automatic-rename on - -# Panes -set -g pane-border-style fg=black -set -g pane-active-border-style fg=brightred - - -## Status bar design -# Status line -set -g status-justify left -set -g status-bg default -set -g status-fg colour12 -set -g status-interval 1 - - -# Messaging -set -g message-style fg=black -set -g message-style bg=yellow -set -g message-command-style fg=blue -set -g message-command-style bg=black - - -# Window mode -setw -g mode-style bg=colour6 -setw -g mode-style fg=colour0 - - -# Window status -setw -g window-status-format " #F#I:#W#F " -setw -g window-status-current-format " #F#I:#W#F " -setw -g window-status-format "#[fg=magenta]#[bg=black] #I #[bg=cyan]#[fg=colour8] #W " -setw -g window-status-current-format "#[bg=brightmagenta]#[fg=colour8] #I #[fg=colour8]#[bg=colour14] #W " -setw -g window-status-current-style bg=colour0 -setw -g window-status-current-style fg=colour11 -setw -g window-status-current-style dim -setw -g window-status-style bg=green -setw -g window-status-style fg=black -setw -g window-status-style reverse - - -# Info on left (I don't have a session display for now) -set -g status-left '' - - -# Loud or quiet? -set-option -g visual-activity off -set-option -g visual-bell off -set-option -g visual-silence off -set-window-option -g monitor-activity off -set-option -g bell-action none - - -# The modes -setw -g clock-mode-colour colour135 -setw -g mode-style bold -setw -g mode-style fg=colour196 -setw -g mode-style bg=colour238 - - -# The panes -set -g pane-border-style bg=colour235 -set -g pane-border-style fg=colour238 -set -g pane-active-border-style bg=colour236 -set -g pane-active-border-style fg=colour51 - - -# The statusbar -set -g status-position bottom -set -g status-bg colour234 -set -g status-fg colour137 -set -g status-style dim -set -g status-left '' -set -g status-right '#[fg=colour233,bg=colour241,bold] %Y-%m-%d #[fg=colour233,bg=colour245,bold] %H:%M:%S ' -set -g status-right-length 100 -set -g status-left-length 20 - -setw -g window-status-current-style fg=colour81 -setw -g window-status-current-style bg=colour238 -setw -g window-status-current-style bold -setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F ' - -setw -g window-status-style fg=colour138 -setw -g window-status-style bg=colour235 -setw -g window-status-style none -setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F ' - -setw -g window-status-bell-style bold -setw -g window-status-bell-style fg=colour255 -setw -g window-status-bell-style bg=colour1 - - -# The messages -set -g message-style bold -set -g message-style fg=colour232 -set -g message-style bg=colour166 - - - -### TMUX PLUGINS ### -# List of plugins -set -g @plugin 'tmux-plugins/tpm' - -set -g @plugin 'tmux-plugins/tmux-copycat' -set -g @plugin 'tmux-plugins/tmux-open' -set -g @plugin 'tmux-plugins/tmux-pain-control' -set -g @plugin 'tmux-plugins/tmux-sensible' -set -g @plugin 'tmux-plugins/tmux-sessionist' -set -g @plugin 'tmux-plugins/tmux-yank' -set -g @plugin 'tmux-plugins/vim-tmux-focus-events' - - - -### TMUX PLUGINS ### -## tmux-yank -set -g @yank_selection 'clipboard' - - - -### INIT PLUGIN MANAGER ### -run '~/.tmux/plugins/tpm/tpm' diff --git a/dot_vim/symlink_init.vim b/dot_vim/symlink_init.vim deleted file mode 100644 index 1e8c5aa..0000000 --- a/dot_vim/symlink_init.vim +++ /dev/null @@ -1 +0,0 @@ -../.vimrc diff --git a/dot_vimrc.tmpl b/dot_vimrc.tmpl deleted file mode 100644 index 11f3862..0000000 --- a/dot_vimrc.tmpl +++ /dev/null @@ -1,837 +0,0 @@ -set nocompatible - -" -----VIM-PLUG----- -" Install vim-plug automatically -if empty(glob('~/.vim/autoload/plug.vim')) - silent !curl -fLo ~/.vim/autoload/plug.vim --create-dirs - \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim - augroup vimPlugInstall - autocmd! - autocmd VimEnter * PlugInstall --sync | source $MYVIMRC - augroup end -endif - - -" PLUGINS -call plug#begin('~/.vim/bundle') -if !has('nvim') - " vim-sensible - ONLY for vim - Plug 'tpope/vim-sensible' -endif -if !has('nvim-0.9') - " editorconfig is built-in as of nvim 0.9 - Plug 'editorconfig/editorconfig-vim' -endif -if has('nvim') - " treesitter works only with nvim - Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} -endif - - -Plug 'airblade/vim-gitgutter' -Plug 'alvan/vim-closetag' -Plug 'arnaud-lb/vim-php-namespace' -Plug 'dense-analysis/ale' -Plug 'djoshea/vim-autoread' -Plug 'dyng/ctrlsf.vim' -Plug 'easymotion/vim-easymotion' -Plug 'gregsexton/matchtag' -Plug 'haya14busa/incsearch-easymotion.vim' -Plug 'haya14busa/incsearch.vim' -Plug 'haya14busa/vim-asterisk' -Plug 'honza/vim-snippets' -Plug 'iamcco/markdown-preview.nvim', { 'do': 'cd app && yarn install' } -Plug 'itchyny/lightline.vim' -Plug 'jiangmiao/auto-pairs' -Plug 'jlanzarotta/bufexplorer' -Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } -Plug 'junegunn/fzf.vim' -Plug 'junegunn/gv.vim' -Plug 'ludovicchabant/vim-gutentags' -Plug 'majutsushi/tagbar' -Plug 'MarcWeber/vim-addon-mw-utils' -Plug 'mattn/emmet-vim' -Plug 'maximbaz/lightline-ale' -Plug 'mbbill/undotree' -Plug 'mg979/vim-visual-multi' -Plug 'mileszs/ack.vim' -Plug 'nelsyeung/twig.vim' -Plug 'neoclide/coc.nvim', { 'branch': 'release' } -Plug 'preservim/nerdcommenter' -Plug 'qpkorr/vim-bufkill' -Plug 'scrooloose/nerdtree' -Plug 'SirVer/ultisnips' -Plug 'svermeulen/vim-subversive' -Plug 'svermeulen/vim-yoink' -Plug 'szw/vim-maximizer' -Plug 'tommcdo/vim-lion' -Plug 'tomtom/tlib_vim' -Plug 'towolf/vim-helm' -Plug 'tpope/vim-fugitive' -Plug 'tpope/vim-markdown' -Plug 'tpope/vim-obsession' -Plug 'tpope/vim-repeat' -Plug 'tpope/vim-surround' -Plug 'tpope/vim-vinegar' -Plug 'vim-php/tagbar-phpctags.vim' -Plug 'vim-scripts/tinykeymap' - -" COC extensions -Plug 'clangd/coc-clangd', {'do': 'yarn install --frozen-lockfile'} -Plug 'fannheyward/coc-pyright', {'do': 'yarn install --frozen-lockfile'} -Plug 'iamcco/coc-svg', {'do': 'yarn install --frozen-lockfile'} -Plug 'iamcco/coc-tailwindcss', {'do': 'yarn install --frozen-lockfile && yarn run build'} -Plug 'josa42/coc-go', {'do': 'yarn install --frozen-lockfile'} -Plug 'josa42/coc-sh', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-css', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-emmet', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-eslint', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-html', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-json', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-stylelint', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-tsserver', {'do': 'yarn install --frozen-lockfile'} -" Plug 'neoclide/coc-vetur', {'do': 'yarn install --frozen-lockfile'} -Plug 'neoclide/coc-yaml', {'do': 'yarn install --frozen-lockfile'} -Plug 'yaegassy/coc-intelephense', {'do': 'yarn install --frozen-lockfile'} -Plug 'yaegassy/coc-volar', {'do': 'yarn install --frozen-lockfile'} - -" COLORSCHEMES -Plug 'crusoexia/vim-monokai' -Plug 'gosukiwi/vim-atom-dark' -Plug 'joshdick/onedark.vim' -Plug 'morhetz/gruvbox' -Plug 'romainl/Apprentice' -call plug#end() - - -" vim-sensible -" Apply configs from vim-sensible -if !has('nvim') - runtime! plugin/sensible.vim -endif - - - -" -----GENERAL----- -" The default leader is a backslash, but we use ',' -" let mapleader = ',' - -set encoding=UTF-8 - -" Fix backspace key" -set backspace=indent,eol,start - -" Set language for spell check -setlocal spell spelllang=en_us -set spell - -" Fixing tabs and indentation -set autoindent -set copyindent -set noexpandtab -set preserveindent -set softtabstop=0 - -" Case-insensitive tab completion -set wildignorecase - -" Make scrolling faster and more accurate -set ttyfast - -" Refresh buffer automatically -set autoread - -" Use system clipboard -set clipboard=unnamedplus - -" Add mouse support -set mouse=a - -" Suppress warning when changing FROM unsaved buffer -set hidden - -" Demand explicit confirmation when closing unsaved buffers -set confirm - -" Deactivate folding -set nofoldenable -set foldmethod=syntax - -" Don't use swapfiles -set noswapfile - -" Don't change default cursor -" Kudos @binaryreverse https://github.com/neovim/neovim/issues/6005 -set guicursor= - -" Disable some unused provider -let g:loaded_python_provider = 0 -let g:loaded_perl_provider = 0 - - - -" -----MAPPINGS----- -" Quick edit ~/.vimrc -nmap ev :e $MYVIMRC - -" Toggle Spell check -nnoremap s :set spell!:set spell? - -" Tab navigation -nnoremap tab :tabnew -nnoremap w :tabclose -nnoremap tabthis :tabnew %:tabprevious - -" Better navigation with wrapped lines -noremap k gk -noremap j gj -noremap 0 g0 -noremap $ g$ - -" Fix whitespace errors -nnoremap fwe :%s/^ //g:nohlsearch - -" Unexpand 4 spaces to tab -nnoremap uex :%s/ /\t/g:nohlsearch - -" Don't yank selected text after overwriting via paste -vnoremap p "_dP - -" Move lines up and down in visual mode -vnoremap :m '>+1gv -vnoremap :m '<-2gv - -" (Un-)Indent lines and preserve selection -vnoremap < <gv -vnoremap > >gv - -" Toggle relative line numbers -nnoremap r :set relativenumber!:set relativenumber? -vnoremap r :set relativenumber!gv - -" Toggle folding -nnoremap f :set foldenable!:set foldenable? - -" Sudo write -cmap w!! w !sudo tee > /dev/null % - - - -" -----AUTO-COMMANDS----- -augroup generalAutocmd - autocmd! - autocmd BufEnter * :syntax sync fromstart -augroup end - - - -" -----FUNCTIONS----- -function! s:DiffWithSaved() - let filetype=&ft - diffthis - vnew | r # | normal! 1Gdd - diffthis - exe "setlocal bt=nofile bh=wipe nobl noswf ro ft=" . filetype -endfunction -com! DiffSaved call s:DiffWithSaved() - - - -" -----PLUGIN CONFIGURATION----- -if !has('nvim-0.9') - " editorconfig is built-in as of nvim v0.9 - - " editorconfig - " Show visual mark, depending on max_line_length value - let g:EditorConfig_verbose = 1 - let g:EditorConfig_max_line_indicator = "line" - let g:EditorConfig_enable_for_new_buf = 1 - let g:EditorConfig_preserve_formatoptions = 1 - let g:EditorConfig_exclude_patterns = [ - \ '.*\.diff', - \ '.*\.patch', - \ ] -else - " Neovim v0.9 and above specific config - " - " set colorcolumn explicitly, so the ruler of max_line_indicator gets - " displayed - set colorcolumn=+1 -endif - - -" NERDTree -let NERDTreeShowHidden = 1 -nnoremap d :NERDTreeToggle -nnoremap D :NERDTreeFind -let NERDTreeIgnore = [ - \ '\~$', - \ '\.sw[op]$', - \'\.\=tags$', '^\.tags\.\(lock\|temp\)$', - \ '^Session.vim', - \ '^.git$[[dir]]', -\ ] - - -" fzf -nnoremap :Files -nnoremap cwdp :Files =expand('%:p:h') . '/' -nnoremap p :GFiles -nnoremap gp :GFiles? -nnoremap buf :Buffers -nnoremap lin :BLines -nnoremap tag :BTags -nnoremap com :Commits -let g:fzf_layout = { 'down': '~40%' } -let g:fzf_buffers_jump = 1 - - -" vim-gitgutter -let g:gitgutter_sign_added = '+' -let g:gitgutter_sign_removed = '-' -let g:gitgutter_sign_modified = '±' -let g:gitgutter_sign_modified_removed = '±' -if exists('&signcolumn') - set signcolumn=yes -else - let g:gitgutter_sign_column_always = 1 -endif - - -" php.vim -let php_html_load = 0 -let php_html_in_heredoc = 0 -let php_html_in_nowdoc = 0 -let php_sql_query = 0 -let php_sql_heredoc = 0 -let php_sql_nowdoc = 0 - -function! PhpSyntaxOverride() - hi! def link phpDocTags phpDefine - hi! def link phpDocParam phpType -endfunction - -augroup phpVimAutocmd - autocmd! - autocmd FileType php call PhpSyntaxOverride() -augroup end - - -" vim-php-namespace -" Insert use statement -let g:php_namespace_sort_after_insert = 1 - -function! IPhpInsertUse() - call PhpInsertUse() - call feedkeys('a', 'n') -endfunction - - -" Expand Namespace -function! IPhpExpandClass() - call PhpExpandClass() - call feedkeys('a', 'n') -endfunction - -augroup phpInsertUseAutocmd - autocmd! - autocmd FileType php inoremap u :call IPhpInsertUse() - autocmd FileType php noremap u :call PhpInsertUse() - autocmd FileType php inoremap e :call IPhpExpandClass() - autocmd FileType php noremap e :call PhpExpandClass() -augroup end - - -" nerdcommenter -filetype plugin on -let g:NERDSpaceDelims = 1 -let g:NERDDefaultAlign = 'left' -let g:NERDCommentEmptyLines = 1 -let g:NERDCommentEmptyLines = 1 - -" Make NERDCommenter work with vue files -let g:ft = '' -function! NERDCommenter_before() - if &ft == 'vue' - let g:ft = 'vue' - let stack = synstack(line('.'), col('.')) - if len(stack) > 0 - let syn = synIDattr((stack)[0], 'name') - if len(syn) > 0 - let syn = tolower(syn) - exe 'setf '.syn - endif - endif - endif -endfunction -function! NERDCommenter_after() - if g:ft == 'vue' - setf vue - let g:ft = '' - endif -endfunction - - -" vim-fugitive -noremap gstatus :Git -noremap gblame :Git blame -w - - -" tagbar -nnoremap tb :TagbarToggle -" needs manual installation/build of https://github.com/vim-php/phpctags via -" ``` -" cgr techlivezheng/phpctags -" ln -s ~/.config/composer/global/techlivezheng/phpctags/vendor/bin/phpctags ~/.config/composer/vendor/bin/ -" ``` -let g:tagbar_autoclose = 1 - - -" lightline -set laststatus=2 -set noshowmode -let g:lightline = { - \ 'colorscheme': 'onedark', - \ 'active': { - \ 'left': [ - \ ['mode', 'paste'], - \ ['gitbranch', 'readonly', 'filename', 'TreeSitterStatus'], - \ ['gutentags'], - \ ], - \ 'right': [ - \ ['linter_checking', 'linter_errors', 'linter_warnings', 'linter_ok'], - \ ['lineinfo'], - \ ['fileformat', 'fileencoding', 'filetype'], - \ ], - \ }, - \ 'component_function': { - \ 'gitbranch': 'FugitiveHead', - \ 'filename': 'LightlineFilename', - \ 'TreeSitterStatus': 'TreeSitterStatus', - \ }, - \ 'component': { - \ 'lineinfo': '%l>%c', - \ 'tagbar': '%{tagbar#currenttag("[%s]", "", "f")}', - \ 'gutentags': '%{gutentags#statusline("[Generating...]")}', - \ }, - \ 'component_expand': { - \ 'linter_checking': 'lightline#ale#checking', - \ 'linter_warnings': 'lightline#ale#warnings', - \ 'linter_errors': 'lightline#ale#errors', - \ 'linter_ok': 'lightline#ale#ok', - \ }, - \ 'component_type': { - \ 'linter_checking': 'left', - \ 'linter_warnings': 'warning', - \ 'linter_errors': 'error', - \ 'linter_ok': 'left', - \ }, -\ } - -function! LightlineFilename() - let filename = expand('%:t') !=# '' ? expand('%:t') : '[No Name]' - let modified = &modified ? ' +' : '' - return filename . modified -endfunction - -if has('nvim') - function! TreeSitterStatus() - return nvim_treesitter#statusline(500) - endfunction -else - " even tough, tree-sitter is not loaded, lightline expects this function - " just declare a noop so it doesn't break - function! TreeSitterStatus() - return '' - endfunction -endif - - -" gutentags -let g:gutentags_ctags_tagfile = '.tags' -set tags='.tags' - - -" ack.vim -let g:ackprg = 'ag --vimgrep --hidden --smart-case --ignore .git/' -cnoreabbrev Ack Ack! -nnoremap a :Ack! - - -" ctrlsf.vim -let g:ctrlsf_regex_pattern = 1 -let g:ctrlsf_auto_close = 0 -nnoremap A :CtrlSF -let g:ctrlsf_extra_backend_args = { - \ 'ag': '--hidden --smart-case --ignore .git/' -\ } - - -" vim-markdown -augroup vimMarkdownAutocmd - autocmd! - autocmd BufNewFile,BufReadPost *.md.erb set filetype=markdown -augroup end - - -" bufexplorer -let g:bufExplorerShowRelativePath = 1 - - -" ultisnips -let g:UltiSnipsExpandTrigger = 'st' -let g:UltiSnipsJumpForwardTrigger = 'sn' -let g:UltiSnipsJumpBackwardTrigger = 'sb' - - -" ale -nnoremap [e :ALEPreviousWrap -nnoremap ]e :ALENextWrap -let g:ale_fix_on_save = 1 -let g:ale_completion_enabled = 0 -let g:ale_set_highlights = 1 -let g:ale_php_phpstan_level = 9 - -let g:ale_linter_aliases = { - \ 'vue': [ - \ 'css', - \ 'javascript', - \ ] -\ } - -let g:ale_linters = { - \ 'css': [ - \ 'stylelint', - \ ], - \ 'go': [ - \ 'gobuild', - \ 'gofmt', - \ 'golint', - \ 'gotype', - \ 'govet', - \ ], - \ 'javascript': [ - \ 'eslint', - \ ], - \ 'javascriptreact': [ - \ 'eslint', - \ ], - \ 'php': [ - \ 'phpstan', - \ ], - \ 'sass': [ - \ 'stylelint', - \ ], - \ 'scss': [ - \ 'stylelint', - \ ], - \ 'typescript': [ - \ 'eslint', - \ ], - \ 'vue': [ - \ 'eslint', - \ 'stylelint', - \ ], -\ } - -let g:ale_fixers = { - \ 'css': [ - \ 'stylelint', - \ ], - \ 'go': [ - \ 'gofmt', - \ 'goimports', - \ ], - \ 'javascript': [ - \ 'eslint', - \ ], - \ 'javascriptreact': [ - \ 'eslint', - \ ], - \ 'sass': [ - \ 'stylelint', - \ ], - \ 'scss': [ - \ 'stylelint', - \ ], - \ 'typescript': [ - \ 'eslint', - \ ], - \ 'vue': [ - \ 'eslint', - \ 'stylelint', - \ ], -\ } - - -" undotree -nnoremap u :NERDTreeClose:UndotreeToggle -if has("persistent_undo") - set undodir=~/.undodir/ - set undofile -endif - - -" vim-maximizer -let g:maximizer_set_default_mapping = 0 -nmap m :MaximizerToggle! - - -" vim-closetag -let g:closetag_filenames = '*.html,*.xhtml,*.phtml,*.vue,*.twig,*.blade.php' - - -" vim-vue -let g:vue_disable_pre_processors = 1 - - -" incsearch.vim, vim-asterisk & incsearch-easymotion.vim -set hlsearch -set ignorecase -let g:incsearch#auto_nohlsearch = 1 -let g:asterisk#keeppos = 1 -" search -map / (incsearch-forward) -map ? (incsearch-backward) -map g/ (incsearch-stay) -" Search with easymotion -map z/ (incsearch-easymotion-/) -map z? (incsearch-easymotion-?) -map zg/ (incsearch-easymotion-stay) -" search forth- and backwards -map n (incsearch-nohl-n) -map N (incsearch-nohl-N) -" search word under cursor (move) -map * (incsearch-nohl)(asterisk-*) -map # (incsearch-nohl)(asterisk-#) -map g* (incsearch-nohl)(asterisk-g*) -map g# (incsearch-nohl)(asterisk-g#) -" search word under cursor (stay) -map z* (incsearch-nohl)(asterisk-z*) -map z# (incsearch-nohl)(asterisk-z#) -map gz* (incsearch-nohl)(asterisk-gz*) -map gz# (incsearch-nohl)(asterisk-gz#) - - -" COC -" Config -call coc#config('suggest', { - \ 'noselect': 1, - \ 'enablePreselect': 0, - \ }) -call coc#config('diagnostic', { - \ 'displayByAle': 1, - \ 'refreshOnInsertMode': 1, - \ 'signOffset': 999999, -\ }) -call coc#config('yaml.schemas', { - \ 'kubernetes': '*.yaml', -\ }) - -" General config -" Some server have issues with backup files, see #649 -set nobackup -set nowritebackup -" Better display for messages -set cmdheight=2 -" Better experience as with the default 4000 -set updatetime=300 -" Don't give |ins-completion-menu| messages. -set shortmess+=c - -" Configure completion -" Use tab for trigger completion with characters ahead and navigate. -function! CheckBackspace() abort - let col = col('.') - 1 - return !col || getline('.')[col - 1] =~# '\s' -endfunction -inoremap - \ coc#pum#visible() ? coc#pum#next(1): - \ CheckBackspace() ? "\" : - \ coc#refresh() -inoremap - \ coc#pum#visible() ? - \ coc#pum#prev(1) : - \ "\" -" Make to accept selected completion item or notify coc.nvim to format -" u breaks current undo, please make your own choice. -inoremap - \ coc#pum#visible() ? - \ coc#pum#confirm() : - \ "\u\\=coc#on_enter()\" - -" Use to trigger completion. -if has('nvim') - inoremap coc#refresh() -else - inoremap coc#refresh() -endif - -" General mappings -" Remap for rename current word -nmap rn (coc-rename) -" Remap for format selected region -vmap f (coc-format-selected) -nmap f (coc-format-selected) -" Remap keys for gotos -nmap gd (coc-definition) -nmap gy (coc-type-definition) -nmap gi (coc-implementation) -nmap gr (coc-references) -" Use K for show documentation in preview window -nnoremap K :call show_documentation() -function! s:show_documentation() - if (index(['vim','help'], &filetype) >= 0) - execute 'h '.expand('') - else - call CocAction('doHover') - endif -endfunction -" Using CocList -nnoremap a :CocList diagnostics -nnoremap e :CocList extensions -nnoremap c :CocList commands -nnoremap o :CocList outline -nnoremap s :CocList -I symbols -nnoremap j :CocNext -nnoremap k :CocPrev -nnoremap p :CocListResume -" Remap for do codeAction of selected region, ex: `aap` for current paragraph -" vmap a (coc-codeaction-selected) -" nmap a (coc-codeaction-selected) -" Remap for do codeAction of current line -nmap ac (coc-codeaction) -" Fix autofix problem of current line -nmap qf (coc-fix-current) - -" Highlight symbol under cursor on CursorHold -augroup cocCursorhold - autocmd! - " Highlight element under cursor when idle - autocmd CursorHold * silent call CocActionAsync('highlight') - " Show signature help for parameters in insert mode when idle - autocmd CursorHoldI * silent call CocActionAsync('showSignatureHelp') -augroup end - -augroup coc - autocmd! - " Setup formatexpr specified filetype(s). - autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') - " Format/re-organize imports - autocmd BufWritePre *.go :call CocAction('runCommand', 'editor.action.organizeImport') - " Update signature help on jump placeholder - autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') -augroup end - -" Use `:Format` for format current buffer -command! -nargs=0 Format :call CocAction('format') -" Use `:Fold` for fold current buffer -command! -nargs=? Fold :call CocAction('fold', ) -" use `:OR` for organize import of current buffer -command! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport') - -{{- if .vim.coc.intelephense_licensekey}} - -" Coc Config (if any) -call coc#config('intelephense', { - \ 'licenceKey': '{{ .vim.coc.intelephense_licensekey }}', -\ }) -{{- end }} - - -" lightline-ale -let g:lightline#ale#indicator_checking = "\uf110" -let g:lightline#ale#indicator_warnings = "\uf071" -let g:lightline#ale#indicator_errors = "\uf05e" -let g:lightline#ale#indicator_ok = "\uf00c" - - -" Tinykeymap -let g:tinykeymaps_default = [] -call tinykeymap#Load('windows') -call tinykeymap#Map('windows', '', 'wincmd >') -call tinykeymap#Map('windows', '', 'wincmd <') -call tinykeymap#Map('windows', '', 'wincmd +') -call tinykeymap#Map('windows', '', 'wincmd -') - - -" vim-yoink -let g:yoinkMaxItems = 50 -let g:yoinkIncludeDeleteOperations = 1 -let g:yoinkSyncSystemClipboardOnFocus = 1 -if has('nvim') - let g:yoinkSavePersistently = 1 -endif - -" Basic functionality -nmap [p (YoinkPostPasteSwapBack) -nmap ]p (YoinkPostPasteSwapForward) -nmap p (YoinkPaste_p) -nmap P (YoinkPaste_P) - -" Swap pointer of current yank -nmap [y (YoinkRotateBack) -nmap ]y (YoinkRotateForward) - - -" vim-subversive -" For supporting yoink in visual mode -xmap s (SubversiveSubstitute) -xmap p (SubversiveSubstitute) -xmap P (SubversiveSubstitute) - - -" vim-lion -let g:lion_squeeze_spaces = 1 - - -" tpope/vim-markdown -let g:markdown_fenced_languages = [ - \ 'bash=sh', - \ 'css', - \ 'html', - \ 'javascript', - \ 'php', - \ 'python', - \ 'vue', -\ ] - - - -" -----VISUAL----- - -" Syntax highlighting -syntax enable - -set t_ut= -set t_Co=256 -colorscheme onedark - -" Link color definition for menu highlighting -highlight! link CocMenuSel PmenuSel - -" Always display tabline -set showtabline=2 - -" Highlight current line -set cursorline - -" Show column length -set ruler - -" Show line numbers -set number - - - -" -----END----- -" Auto sourcing the .vimrc file on safe -augroup sourcingAutocmd - autocmd! - autocmd BufWritePost $MYVIMRC nested source $MYVIMRC - - " Reload lightline - call lightline#init() - call lightline#colorscheme() - call lightline#update() -augroup end diff --git a/private_dot_gnupg/common.conf b/private_dot_gnupg/common.conf deleted file mode 100644 index 5add401..0000000 --- a/private_dot_gnupg/common.conf +++ /dev/null @@ -1 +0,0 @@ -use-keyboxd diff --git a/private_dot_gnupg/gpg-agent.conf b/private_dot_gnupg/gpg-agent.conf deleted file mode 100644 index e100b95..0000000 --- a/private_dot_gnupg/gpg-agent.conf +++ /dev/null @@ -1,10 +0,0 @@ -pinentry-program /usr/bin/pinentry - -# Cache GPG password -max-cache-ttl 60480000 -default-cache-ttl 60480000 - -# Support SSH emulation -enable-ssh-support -default-cache-ttl-ssh 60480000 -max-cache-ttl-ssh 60480000 diff --git a/private_dot_gnupg/gpg.conf.tmpl b/private_dot_gnupg/gpg.conf.tmpl deleted file mode 100644 index bbf67a7..0000000 --- a/private_dot_gnupg/gpg.conf.tmpl +++ /dev/null @@ -1,79 +0,0 @@ -# This is an implementation of the Riseup OpenPGP Best Practices -# Copied and modified from -# https://raw.githubusercontent.com/jessfraz/dotfiles/master/.gnupg/gpg.conf -# on the 2017-01-29 - -charset utf-8 - -{{- if .gpg.signingkey }} - -#----------------------------- -# default key -#----------------------------- - -# The default key to sign with. If this option is not used, the default key is -# the first key found in the secret keyring -default-key {{ .gpg.signingkey }} - -{{ end -}} - -#----------------------------- -# behavior -#----------------------------- - -# Disable inclusion of the version string in ASCII armored output -no-emit-version - -# Disable comment string in clear text signatures and ASCII armored messages -no-comments - -# Display long key IDs -keyid-format 0xlong - -# List all keys (or the specified ones) along with their fingerprints -with-fingerprint - -# Display the calculated validity of user IDs during key listings -list-options show-uid-validity -verify-options show-uid-validity - -# Try to use the GnuPG-Agent. With this option, GnuPG first tries to connect to -# the agent before it asks for a passphrase. -use-agent - -{{- if .gpg.keyserver }} - -#----------------------------- -# keyserver -#----------------------------- - -# This is the server that --recv-keys, --send-keys, and --search-keys will -# communicate with to receive keys from, send keys to, and search for keys on -keyserver {{ .gpg.keyserver }} - -{{ end -}} - -# When using --refresh-keys, if the key in question has a preferred keyserver -# URL, then disable use of that preferred keyserver to refresh the key from -keyserver-options no-honor-keyserver-url - -# When searching for a key with --search-keys, include keys that are marked on -# the keyserver as revoked -keyserver-options include-revoked - -#----------------------------- -# algorithm and ciphers -#----------------------------- - -# list of personal digest/cipher preferences. When multiple are supported by all -# recipients, choose the strongest one -personal-cipher-preferences AES256 AES192 AES CAST5 -personal-digest-preferences SHA512 SHA384 SHA256 SHA224 - -# message digest algorithm used when signing a key -cert-digest-algo SHA512 -s2k-digest-algo SHA512 - -# This preference list is used for new keys and becomes the default for -# "setpref" in the edit menu -default-preference-list SHA512 SHA384 SHA256 SHA224 AES256 AES192 AES CAST5 ZLIB BZIP2 ZIP Uncompressed diff --git a/private_dot_ssh/config b/private_dot_ssh/config deleted file mode 100644 index 7937841..0000000 --- a/private_dot_ssh/config +++ /dev/null @@ -1,6 +0,0 @@ -WarnWeakCrypto no-pq-kex - -Host * - SetEnv TERM=xterm-256color - -Include config.d/* diff --git a/projects/symlink_dotfiles b/projects/symlink_dotfiles deleted file mode 100644 index dbcb50c..0000000 --- a/projects/symlink_dotfiles +++ /dev/null @@ -1 +0,0 @@ -../.local/share/chezmoi From 1d6924acc3b1a986a077b294a1cfa2f9a9f0981d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 24 May 2026 23:26:38 +0200 Subject: [PATCH 002/184] Instantiate flake via flake-parts Created via `nix flake init -t github:hercules-ci/flake-parts` --- flake.lock | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ flake.nix | 35 +++++++++++++++++++++++++++++++ 2 files changed, 96 insertions(+) create mode 100644 flake.lock create mode 100644 flake.nix diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..39a77a8 --- /dev/null +++ b/flake.lock @@ -0,0 +1,61 @@ +{ + "nodes": { + "flake-parts": { + "inputs": { + "nixpkgs-lib": "nixpkgs-lib" + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1779508470, + "narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "29916453413845e54a65b8a1cf996842300cd299", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-unstable", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixpkgs-lib": { + "locked": { + "lastModified": 1777168982, + "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=", + "owner": "nix-community", + "repo": "nixpkgs.lib", + "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14", + "type": "github" + }, + "original": { + "owner": "nix-community", + "repo": "nixpkgs.lib", + "type": "github" + } + }, + "root": { + "inputs": { + "flake-parts": "flake-parts", + "nixpkgs": "nixpkgs" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..9dce8bf --- /dev/null +++ b/flake.nix @@ -0,0 +1,35 @@ +{ + description = "Description for the project"; + + inputs = { + flake-parts.url = "github:hercules-ci/flake-parts"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + }; + + outputs = inputs@{ flake-parts, ... }: + flake-parts.lib.mkFlake { inherit inputs; } { + imports = [ + # To import an internal flake module: ./other.nix + # To import an external flake module: + # 1. Add foo to inputs + # 2. Add foo as a parameter to the outputs function + # 3. Add here: foo.flakeModule + + ]; + systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; + perSystem = { config, self', inputs', pkgs, system, ... }: { + # Per-system attributes can be defined here. The self' and inputs' + # module parameters provide easy access to attributes of the same + # system. + + # Equivalent to inputs'.nixpkgs.legacyPackages.hello; + packages.default = pkgs.hello; + }; + flake = { + # The usual flake attributes can be defined here, including system- + # agnostic ones like nixosModule and system-enumerating ones, although + # those are more easily expressed in perSystem. + + }; + }; +} From d8038892fa47795e385520729147d3a57275d1af Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 24 May 2026 23:31:41 +0200 Subject: [PATCH 003/184] Stick with `x86_64-linux` architecture --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 9dce8bf..68c3750 100644 --- a/flake.nix +++ b/flake.nix @@ -16,7 +16,7 @@ # 3. Add here: foo.flakeModule ]; - systems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" "x86_64-darwin" ]; + systems = [ "x86_64-linux" ]; perSystem = { config, self', inputs', pkgs, system, ... }: { # Per-system attributes can be defined here. The self' and inputs' # module parameters provide easy access to attributes of the same From 790ace0e83315269a74770d0b44c1594805627e7 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 24 May 2026 23:33:49 +0200 Subject: [PATCH 004/184] Update description --- flake.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index 68c3750..9fda227 100644 --- a/flake.nix +++ b/flake.nix @@ -1,5 +1,5 @@ { - description = "Description for the project"; + description = "rtucek's NixOS and Home-Manager flake"; inputs = { flake-parts.url = "github:hercules-ci/flake-parts"; From 97b9c84cf9f5f2af0f294e7ee65c1c43d899cfc5 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 30 May 2026 12:54:42 +0200 Subject: [PATCH 005/184] Apply `treefmt` --- flake.nix | 39 +++++++++++++++++++++++---------------- 1 file changed, 23 insertions(+), 16 deletions(-) diff --git a/flake.nix b/flake.nix index 9fda227..347f323 100644 --- a/flake.nix +++ b/flake.nix @@ -6,30 +6,37 @@ nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; }; - outputs = inputs@{ flake-parts, ... }: + outputs = + inputs@{ flake-parts, ... }: flake-parts.lib.mkFlake { inherit inputs; } { - imports = [ - # To import an internal flake module: ./other.nix - # To import an external flake module: - # 1. Add foo to inputs - # 2. Add foo as a parameter to the outputs function - # 3. Add here: foo.flakeModule + systems = [ "x86_64-linux" ]; + imports = [ + ./hosts ]; - systems = [ "x86_64-linux" ]; - perSystem = { config, self', inputs', pkgs, system, ... }: { - # Per-system attributes can be defined here. The self' and inputs' - # module parameters provide easy access to attributes of the same - # system. - # Equivalent to inputs'.nixpkgs.legacyPackages.hello; - packages.default = pkgs.hello; - }; + perSystem = + { + config, + self', + inputs', + pkgs, + system, + ... + }: + { + # Per-system attributes can be defined here. The self' and inputs' + # module parameters provide easy access to attributes of the same + # system. + + # Equivalent to inputs'.nixpkgs.legacyPackages.hello; + packages.default = pkgs.hello; + }; + flake = { # The usual flake attributes can be defined here, including system- # agnostic ones like nixosModule and system-enumerating ones, although # those are more easily expressed in perSystem. - }; }; } From 0e6d9ec8d828b86c174a291cbe214b254c886711 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 30 May 2026 19:31:01 +0200 Subject: [PATCH 006/184] Setup initial flack foundation (without FS) --- hosts/default.nix | 19 +++++++++ hosts/nixos-btw/default.nix | 9 ++++ hosts/nixos-btw/disko.nix | 4 ++ hosts/nixos-btw/hardware-configuration.nix | 28 +++++++++++++ system/core/boot.nix | 35 ++++++++++++++++ system/core/default.nix | 13 ++++++ system/core/i18n.nix | 12 ++++++ system/core/ram.nix | 3 ++ system/core/security.nix | 5 +++ system/core/security/default.nix | 9 ++++ system/core/security/firewall.nix | 8 ++++ system/core/security/ssh.nix | 24 +++++++++++ system/core/security/sudo.nix | 11 +++++ system/core/security/sysctl.nix | 49 ++++++++++++++++++++++ system/core/time.nix | 14 +++++++ system/core/users.nix | 12 ++++++ system/default.nix | 28 +++++++++++++ system/hardware/bluetooth.nix | 7 ++++ system/hardware/fwupd.nix | 5 +++ system/hardware/graphics.nix | 5 +++ system/network/avahi.nix | 6 +++ system/network/default.nix | 18 ++++++++ system/nix/default.nix | 6 +++ system/nix/flakes.nix | 34 +++++++++++++++ system/nix/store.nix | 28 +++++++++++++ system/programs/default.nix | 3 ++ system/services/blacklight.nix | 5 +++ system/services/default.nix | 3 ++ system/services/power.nix | 24 +++++++++++ 29 files changed, 427 insertions(+) create mode 100644 hosts/default.nix create mode 100644 hosts/nixos-btw/default.nix create mode 100644 hosts/nixos-btw/disko.nix create mode 100644 hosts/nixos-btw/hardware-configuration.nix create mode 100644 system/core/boot.nix create mode 100644 system/core/default.nix create mode 100644 system/core/i18n.nix create mode 100644 system/core/ram.nix create mode 100644 system/core/security.nix create mode 100644 system/core/security/default.nix create mode 100644 system/core/security/firewall.nix create mode 100644 system/core/security/ssh.nix create mode 100644 system/core/security/sudo.nix create mode 100644 system/core/security/sysctl.nix create mode 100644 system/core/time.nix create mode 100644 system/core/users.nix create mode 100644 system/default.nix create mode 100644 system/hardware/bluetooth.nix create mode 100644 system/hardware/fwupd.nix create mode 100644 system/hardware/graphics.nix create mode 100644 system/network/avahi.nix create mode 100644 system/network/default.nix create mode 100644 system/nix/default.nix create mode 100644 system/nix/flakes.nix create mode 100644 system/nix/store.nix create mode 100644 system/programs/default.nix create mode 100644 system/services/blacklight.nix create mode 100644 system/services/default.nix create mode 100644 system/services/power.nix diff --git a/hosts/default.nix b/hosts/default.nix new file mode 100644 index 0000000..11f5623 --- /dev/null +++ b/hosts/default.nix @@ -0,0 +1,19 @@ +{ self, inputs, ... }: +{ + flake.nixosConfigurations = + let + sys = "${self}/system"; + inherit (import sys) laptop; + + specialArgs = { inherit inputs self; }; + in + { + nixos-btw = inputs.nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = laptop ++ [ + ./nixos-btw + ]; + }; + }; +} diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix new file mode 100644 index 0000000..a7c65db --- /dev/null +++ b/hosts/nixos-btw/default.nix @@ -0,0 +1,9 @@ +{ ... }: +{ + imports = [ + ./hardware-configuration.nix + ./disko.nix + ]; + + networking.hostName = "nixos-btw"; +} diff --git a/hosts/nixos-btw/disko.nix b/hosts/nixos-btw/disko.nix new file mode 100644 index 0000000..d4f47c9 --- /dev/null +++ b/hosts/nixos-btw/disko.nix @@ -0,0 +1,4 @@ +{ ... }: +{ + # TODO!!! +} diff --git a/hosts/nixos-btw/hardware-configuration.nix b/hosts/nixos-btw/hardware-configuration.nix new file mode 100644 index 0000000..92d7b83 --- /dev/null +++ b/hosts/nixos-btw/hardware-configuration.nix @@ -0,0 +1,28 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + pkgs, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/profiles/qemu-guest.nix") + ]; + + boot.initrd.availableKernelModules = [ + "ata_piix" + "nvme" + "floppy" + "sr_mod" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ ]; + boot.extraModulePackages = [ ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/system/core/boot.nix b/system/core/boot.nix new file mode 100644 index 0000000..de04057 --- /dev/null +++ b/system/core/boot.nix @@ -0,0 +1,35 @@ +{ pkgs, config, ... }: +{ + boot = { + bootspec.enableValidation = true; + + initrd = { + systemd.enable = true; + + # Managed via Disko + # supportedFilesystems = []; + }; + + # Default to latest and greatest kernel by default. + kernelPackages = pkgs.linuxPackages_latest; + + # Typical kernel parameters, which we'd usually pass via GRUB's + # `GRUB_CMDLINE_LINUX_DEFAULT`. + # + # Nothing at the moment... \o/ + # kernelParams = []; + + # Set console logging verbosity to KERN_ERR. + # see https://www.kernel.org/doc/html/next/core-api/printk-basics.html + consoleLogLevel = 3; + + # Use systemd-boot on UEFI instead of GRUB. + loader = { + efi.canTouchEfiVariables = true; + systemd-boot.enable = true; + }; + }; + + # Ensure cpupower is using the same version, as the current kernel. + environment.systemPackages = [ config.boot.kernelPackages.cpupower ]; +} diff --git a/system/core/default.nix b/system/core/default.nix new file mode 100644 index 0000000..1f82093 --- /dev/null +++ b/system/core/default.nix @@ -0,0 +1,13 @@ +{ ... }: +{ + imports = [ + ./boot.nix + ./i18n.nix + ./ram.nix + ./security + ./time.nix + ./users.nix + + ../nix + ]; +} diff --git a/system/core/i18n.nix b/system/core/i18n.nix new file mode 100644 index 0000000..07b3a0e --- /dev/null +++ b/system/core/i18n.nix @@ -0,0 +1,12 @@ +{ + i18n = { + defaultCharset = "UTF-8"; + defaultLocale = "en_US.UTF-8"; + supportedLocales = [ + "de_AT.UTF-8/UTF-8" + ]; + + # allow switching keymap via `localectl set-keymap` + imperativeLocale = false; + }; +} diff --git a/system/core/ram.nix b/system/core/ram.nix new file mode 100644 index 0000000..f8ddd9c --- /dev/null +++ b/system/core/ram.nix @@ -0,0 +1,3 @@ +{ + zramSwap.enable = true; +} diff --git a/system/core/security.nix b/system/core/security.nix new file mode 100644 index 0000000..f5e67b5 --- /dev/null +++ b/system/core/security.nix @@ -0,0 +1,5 @@ +{ + # Credits to: + # - https://github.com/fufexan/dotfiles/blob/main/system/core/security.nix + # - https://github.com/hlissner/dotfiles/blob/master/modules/security.nix +} diff --git a/system/core/security/default.nix b/system/core/security/default.nix new file mode 100644 index 0000000..d863949 --- /dev/null +++ b/system/core/security/default.nix @@ -0,0 +1,9 @@ +{ ... }: +{ + imports = [ + ./firewall.nix + ./ssh.nix + ./sudo.nix + ./sysctl.nix + ]; +} diff --git a/system/core/security/firewall.nix b/system/core/security/firewall.nix new file mode 100644 index 0000000..7cbeda0 --- /dev/null +++ b/system/core/security/firewall.nix @@ -0,0 +1,8 @@ +{ + # There's lots of network-related security config already done via ./sysctl.nix + + networking.firewall.enable = true; + + # Have iptables replaced with more modern nftables implementation. + networking.nftables.enable = true; +} diff --git a/system/core/security/ssh.nix b/system/core/security/ssh.nix new file mode 100644 index 0000000..b5def74 --- /dev/null +++ b/system/core/security/ssh.nix @@ -0,0 +1,24 @@ +{ lib, pkgs, ... }: +{ + services.openssh = { + # OpenSSH should generally be disabled by default. Nonetheless, for the + # event the sshd will be manually (and hopefully only temporarily) started + # and/or activated via an overlay, this config shall apply with the + # following sensitive defaults. + enable = false; + + allowSFTP = true; + + # Rely on the NixOS packaging team to have algorithms up2date. + enableRecommendedAlgorithms = true; + + # ... never ever ... + settings.PermitRootLogin = lib.mkForce "no"; + }; + + environment.systemPackages = [ + # In any case, install openssh anyways, since we'll need the ssh client + # anyways. + pkgs.openssh + ]; +} diff --git a/system/core/security/sudo.nix b/system/core/security/sudo.nix new file mode 100644 index 0000000..37cb071 --- /dev/null +++ b/system/core/security/sudo.nix @@ -0,0 +1,11 @@ +{ + # Switch to sudo-rs + security.sudo.enable = false; + security.sudo-rs.enable = true; + + # Limit to %wheel group + security.sudo-rs.execWheelOnly = true; + + # Demand passwords + security.sudo-rs.wheelNeedsPassword = true; +} diff --git a/system/core/security/sysctl.nix b/system/core/security/sysctl.nix new file mode 100644 index 0000000..0bf75a8 --- /dev/null +++ b/system/core/security/sysctl.nix @@ -0,0 +1,49 @@ +{ + # All credit to... + # - @fufexan via https://github.com/fufexan/dotfiles/blob/main/system/core/security.nix + # - @hlissner via https://github.com/hlissner/dotfiles/blob/master/modules/security.nix + + boot.kernel.sysctl = { + # The Magic SysRq key is a key combo that allows users connected to the + # system console of a Linux kernel to perform some low-level commands. + # Disable it, since we don't need it, and is a potential security concern. + "kernel.sysrq" = 0; + + ## TCP hardening + # Prevent bogus ICMP errors from filling up logs. + "net.ipv4.icmp_ignore_bogus_error_responses" = 1; + # Reverse path filtering causes the kernel to do source validation of + # packets received from all interfaces. This can mitigate IP spoofing. + "net.ipv4.conf.default.rp_filter" = 1; + "net.ipv4.conf.all.rp_filter" = 1; + # Do not accept IP source route packets (we're not a router) + "net.ipv4.conf.all.accept_source_route" = 0; + "net.ipv6.conf.all.accept_source_route" = 0; + # Don't send ICMP redirects (again, we're not a router) + "net.ipv4.conf.all.send_redirects" = 0; + "net.ipv4.conf.default.send_redirects" = 0; + # Refuse ICMP redirects (MITM mitigations) + "net.ipv4.conf.all.accept_redirects" = 0; + "net.ipv4.conf.default.accept_redirects" = 0; + "net.ipv4.conf.all.secure_redirects" = 0; + "net.ipv4.conf.default.secure_redirects" = 0; + "net.ipv6.conf.all.accept_redirects" = 0; + "net.ipv6.conf.default.accept_redirects" = 0; + # Protects against SYN flood attacks + "net.ipv4.tcp_syncookies" = 1; + # Incomplete protection again TIME-WAIT assassination + "net.ipv4.tcp_rfc1337" = 1; + + ## TCP optimization + # TCP Fast Open is a TCP extension that reduces network latency by packing + # data in the sender’s initial TCP SYN. Setting 3 = enable TCP Fast Open for + # both incoming and outgoing connections: + "net.ipv4.tcp_fastopen" = 3; + # Bufferbloat mitigations + slight improvement in throughput & latency + "net.ipv4.tcp_congestion_control" = "bbr"; + "net.core.default_qdisc" = "cake"; + }; + + # make sure, kernel module is available for `net.ipv4.tcp_congestion_control` + boot.kernelModules = [ "tcp_bbr" ]; +} diff --git a/system/core/time.nix b/system/core/time.nix new file mode 100644 index 0000000..840e3f7 --- /dev/null +++ b/system/core/time.nix @@ -0,0 +1,14 @@ +{ lib, ... }: +{ + # Set a sensitive default, which shall be overridden via + # `services.automatic-timezoned.enable`, based on the current geolocation. + # + # see https://search.nixos.org/options?channel=unstable&query=services.automatic-timezoned.enable + # for details. + time.timeZone = lib.mkDefault "Europe/Vienna"; + + services = { + automatic-timezoned.enable = true; + tzupdate.enable = true; + }; +} diff --git a/system/core/users.nix b/system/core/users.nix new file mode 100644 index 0000000..831395c --- /dev/null +++ b/system/core/users.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + users.users.rtucek = { + isNormalUser = true; + shell = pkgs.fish; + extraGroups = [ + "wheel" # sudo make me a sandwich + ]; + }; + + programs.fish.enable = true; +} diff --git a/system/default.nix b/system/default.nix new file mode 100644 index 0000000..0027680 --- /dev/null +++ b/system/default.nix @@ -0,0 +1,28 @@ +let + desktop = [ + ./core + + ./hardware/fwupd.nix + ./hardware/graphics.nix + + ./network + ./network/avahi.nix + + ./programs + + ./services + # TODO: coming soon + # ./servcies/greetd.nix + # ./services/pipewire.nix + ]; + + laptop = desktop ++ [ + ./hardware/bluetooth.nix + + ./services/blacklight.nix + ./services/power.nix + ]; +in +{ + inherit desktop laptop; +} diff --git a/system/hardware/bluetooth.nix b/system/hardware/bluetooth.nix new file mode 100644 index 0000000..3778ddd --- /dev/null +++ b/system/hardware/bluetooth.nix @@ -0,0 +1,7 @@ +{ + hardware.bluetooth = { + enable = true; + + powerOnBoot = true; + }; +} diff --git a/system/hardware/fwupd.nix b/system/hardware/fwupd.nix new file mode 100644 index 0000000..10dda7e --- /dev/null +++ b/system/hardware/fwupd.nix @@ -0,0 +1,5 @@ +{ + services.fwupd = { + enable = true; + }; +} diff --git a/system/hardware/graphics.nix b/system/hardware/graphics.nix new file mode 100644 index 0000000..4c63dba --- /dev/null +++ b/system/hardware/graphics.nix @@ -0,0 +1,5 @@ +{ + hardware.graphics = { + enable = true; + }; +} diff --git a/system/network/avahi.nix b/system/network/avahi.nix new file mode 100644 index 0000000..890a58d --- /dev/null +++ b/system/network/avahi.nix @@ -0,0 +1,6 @@ +{ + services.avahi = { + enable = true; + nssmdns4 = true; + }; +} diff --git a/system/network/default.nix b/system/network/default.nix new file mode 100644 index 0000000..ad60ae2 --- /dev/null +++ b/system/network/default.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: +{ + networking = { + # DNS resolver via systemd + resolvconf = { + enable = true; + }; + + networkmanager = { + enable = true; + dns = "systemd-resolved"; + wifi.powersave = true; + plugins = [ + pkgs.networkmanager-openvpn + ]; + }; + }; +} diff --git a/system/nix/default.nix b/system/nix/default.nix new file mode 100644 index 0000000..2ad8082 --- /dev/null +++ b/system/nix/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./flakes.nix + ./store.nix + ]; +} diff --git a/system/nix/flakes.nix b/system/nix/flakes.nix new file mode 100644 index 0000000..7214a28 --- /dev/null +++ b/system/nix/flakes.nix @@ -0,0 +1,34 @@ +{ + pkgs, + lib, + inputs, + config, + ... +}: +{ + # Require git for flakes + environment.systemPackages = [ + pkgs.git + ]; + + nix = + let + flakeInputs = lib.filterAttrs (_: v: lib.istype "flake" v) inputs; + in + { + # Pin the registry. + # This avoids downloading and evaling a new nixpkgs version every time. + registry = lib.mapAttrs (_: v: { flake = v; }) flakeInputs; + + # Set the path for channels compat + nixPath = lib.mapAttrsToList (key: _: "${key}=flake:${key}") config.nix.registry; + + settings = { + experimental-features = [ + "nix-command" + "flakes" + ]; + flake-registry = "/etc/nix/registry.json"; + }; + }; +} diff --git a/system/nix/store.nix b/system/nix/store.nix new file mode 100644 index 0000000..d5070b1 --- /dev/null +++ b/system/nix/store.nix @@ -0,0 +1,28 @@ +{ + system.stateVersion = "26.05"; + + nixpkgs = { + config.allowUnfree = true; + }; + + nix = { + settings = { + auto-optimise-store = true; + + gc = { + automatic = true; + dates = "weekly"; + persitent = true; + }; + + # for direnv GC roots + keep-derivations = true; + keep-outputs = true; + + trusted-users = [ + "root" + "@wheel" + ]; + }; + }; +} diff --git a/system/programs/default.nix b/system/programs/default.nix new file mode 100644 index 0000000..eb9a5f5 --- /dev/null +++ b/system/programs/default.nix @@ -0,0 +1,3 @@ +{ + # nothing here at the moment +} diff --git a/system/services/blacklight.nix b/system/services/blacklight.nix new file mode 100644 index 0000000..b43204e --- /dev/null +++ b/system/services/blacklight.nix @@ -0,0 +1,5 @@ +{ + hardware.brillo = { + enable = true; + }; +} diff --git a/system/services/default.nix b/system/services/default.nix new file mode 100644 index 0000000..eb9a5f5 --- /dev/null +++ b/system/services/default.nix @@ -0,0 +1,3 @@ +{ + # nothing here at the moment +} diff --git a/system/services/power.nix b/system/services/power.nix new file mode 100644 index 0000000..548eb4b --- /dev/null +++ b/system/services/power.nix @@ -0,0 +1,24 @@ +{ + services = { + logind = { + enable = true; + + settings.Login = { + SleepOperation = "suspend-then-hibernate suspend"; + HandlePowerKey = "suspend"; + HandlePowerKeyLongPress = "poweroff"; + HandleLidSwitch = "suspend"; + HandleLidSwitchExternalPower = "suspend"; + HandleLidSwitchDocked = "suspend"; + }; + }; + + auto-cpufreq = { + enable = true; + }; + + upower = { + enable = true; + }; + }; +} From 419f6deb25b078de36410afcdf2722aebe09ed67 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 02:53:43 +0200 Subject: [PATCH 007/184] Add disko POC config --- flake.lock | 22 ++++++++++++++++++++++ flake.nix | 5 +++++ hosts/default.nix | 1 + hosts/nixos-btw/disko.nix | 34 ++++++++++++++++++++++++++++++++-- 4 files changed, 60 insertions(+), 2 deletions(-) diff --git a/flake.lock b/flake.lock index 39a77a8..2d75e2a 100644 --- a/flake.lock +++ b/flake.lock @@ -1,5 +1,26 @@ { "nodes": { + "disko": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1768920986, + "narHash": "sha256-CNzzBsRhq7gg4BMBuTDObiWDH/rFYHEuDRVOwCcwXw4=", + "owner": "nix-community", + "repo": "disko", + "rev": "de5708739256238fb912c62f03988815db89ec9a", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "latest", + "repo": "disko", + "type": "github" + } + }, "flake-parts": { "inputs": { "nixpkgs-lib": "nixpkgs-lib" @@ -51,6 +72,7 @@ }, "root": { "inputs": { + "disko": "disko", "flake-parts": "flake-parts", "nixpkgs": "nixpkgs" } diff --git a/flake.nix b/flake.nix index 347f323..d7a1640 100644 --- a/flake.nix +++ b/flake.nix @@ -4,6 +4,11 @@ inputs = { flake-parts.url = "github:hercules-ci/flake-parts"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + + disko = { + url = "github:nix-community/disko/latest"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = diff --git a/hosts/default.nix b/hosts/default.nix index 11f5623..d61a197 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -13,6 +13,7 @@ modules = laptop ++ [ ./nixos-btw + inputs.disko.nixosModules.disko ]; }; }; diff --git a/hosts/nixos-btw/disko.nix b/hosts/nixos-btw/disko.nix index d4f47c9..9e73ec4 100644 --- a/hosts/nixos-btw/disko.nix +++ b/hosts/nixos-btw/disko.nix @@ -1,4 +1,34 @@ -{ ... }: { - # TODO!!! + disko.devices = { + disk = { + main = { + # When using disko-install, we will overwrite this value from the commandline + device = "/dev/disk/by-id/some-disk-id"; + type = "disk"; + content = { + type = "gpt"; + partitions = { + esp = { + type = "EF00"; + size = "1G"; + content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + mountOptions = [ "umask=0077" ]; + }; + }; + root = { + size = "100%"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + }; + }; + }; + }; + }; + }; + }; } From dcda6623b6bb195458d013c745bc49cd174974e9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 02:54:16 +0200 Subject: [PATCH 008/184] Fix typos and errors --- system/core/security/ssh.nix | 3 +-- system/nix/flakes.nix | 2 +- system/nix/store.nix | 13 +++++++------ 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/system/core/security/ssh.nix b/system/core/security/ssh.nix index b5def74..a2bcd28 100644 --- a/system/core/security/ssh.nix +++ b/system/core/security/ssh.nix @@ -17,8 +17,7 @@ }; environment.systemPackages = [ - # In any case, install openssh anyways, since we'll need the ssh client - # anyways. + # In any case, install openssh anyways, since we'll need the ssh client. pkgs.openssh ]; } diff --git a/system/nix/flakes.nix b/system/nix/flakes.nix index 7214a28..cc960d1 100644 --- a/system/nix/flakes.nix +++ b/system/nix/flakes.nix @@ -13,7 +13,7 @@ nix = let - flakeInputs = lib.filterAttrs (_: v: lib.istype "flake" v) inputs; + flakeInputs = lib.filterAttrs (_: v: lib.isType "flake" v) inputs; in { # Pin the registry. diff --git a/system/nix/store.nix b/system/nix/store.nix index d5070b1..a49354c 100644 --- a/system/nix/store.nix +++ b/system/nix/store.nix @@ -6,15 +6,16 @@ }; nix = { + gc = { + automatic = true; + dates = "weekly"; + options = "--delete-older-than 30d"; + persistent = true; + }; + settings = { auto-optimise-store = true; - gc = { - automatic = true; - dates = "weekly"; - persitent = true; - }; - # for direnv GC roots keep-derivations = true; keep-outputs = true; From 5740b2b5b844ca46bc869535d2ddb46f4ebebbc2 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 03:17:48 +0200 Subject: [PATCH 009/184] Fix flake-check warning --- system/core/i18n.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/system/core/i18n.nix b/system/core/i18n.nix index 07b3a0e..606c5d1 100644 --- a/system/core/i18n.nix +++ b/system/core/i18n.nix @@ -2,7 +2,7 @@ i18n = { defaultCharset = "UTF-8"; defaultLocale = "en_US.UTF-8"; - supportedLocales = [ + extraLocales = [ "de_AT.UTF-8/UTF-8" ]; From 370fd09e79825c58d978695cbfb896b799776c65 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 04:13:08 +0200 Subject: [PATCH 010/184] Fix having sshd disabled by default --- system/core/security/ssh.nix | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/system/core/security/ssh.nix b/system/core/security/ssh.nix index a2bcd28..4594de0 100644 --- a/system/core/security/ssh.nix +++ b/system/core/security/ssh.nix @@ -1,11 +1,11 @@ { lib, pkgs, ... }: { + # OpenSSH should generally be disabled by default and only activated when + # needed via systemd. + systemd.services.sshd.wantedBy = lib.mkForce [ ]; + services.openssh = { - # OpenSSH should generally be disabled by default. Nonetheless, for the - # event the sshd will be manually (and hopefully only temporarily) started - # and/or activated via an overlay, this config shall apply with the - # following sensitive defaults. - enable = false; + enable = true; allowSFTP = true; From 239a6c7ba37173e913d0fba3a4855f27750dc311 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 04:13:26 +0200 Subject: [PATCH 011/184] Add Yubikey 13364058 for SSH --- system/core/users.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/system/core/users.nix b/system/core/users.nix index 831395c..a62ccb6 100644 --- a/system/core/users.nix +++ b/system/core/users.nix @@ -2,6 +2,9 @@ { users.users.rtucek = { isNormalUser = true; + openssh.authorizedKeys.keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" + ]; shell = pkgs.fish; extraGroups = [ "wheel" # sudo make me a sandwich From 496617ff1d0420c9cc71b88f9993702298623ce6 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 05:31:55 +0200 Subject: [PATCH 012/184] disko: switch to lvm on luks setup --- hosts/nixos-btw/disko.nix | 41 +++++++++++++++++++++++++++++++++++---- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/hosts/nixos-btw/disko.nix b/hosts/nixos-btw/disko.nix index 9e73ec4..374fa7f 100644 --- a/hosts/nixos-btw/disko.nix +++ b/hosts/nixos-btw/disko.nix @@ -18,17 +18,50 @@ mountOptions = [ "umask=0077" ]; }; }; - root = { + luks = { size = "100%"; content = { - type = "filesystem"; - format = "ext4"; - mountpoint = "/"; + type = "luks"; + name = "volgroup0"; + extraOpenArgs = [ ]; + settings = { + }; + additionalKeyFiles = [ ]; + content = { + type = "lvm_pv"; + vg = "volgroup0"; + }; }; }; }; }; }; }; + lvm_vg = { + volgroup0 = { + type = "lvm_vg"; + lvs = { + lv_root = { + size = "30%VG"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/"; + mountOptions = [ + "defaults" + ]; + }; + }; + lv_home = { + size = "30%VG"; + content = { + type = "filesystem"; + format = "ext4"; + mountpoint = "/home"; + }; + }; + }; + }; + }; }; } From 3deedaee885355a084596ac2c1835ed8e8824ed0 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 21:57:38 +0200 Subject: [PATCH 013/184] Use systemd-resolved --- system/network/default.nix | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/system/network/default.nix b/system/network/default.nix index ad60ae2..be23672 100644 --- a/system/network/default.nix +++ b/system/network/default.nix @@ -1,10 +1,26 @@ { pkgs, ... }: { - networking = { - # DNS resolver via systemd - resolvconf = { - enable = true; + services.resolved = { + enable = true; + settings.Resolve = { + DNSOverTLS = "opportunistic"; + DNSSEC = "allow-downgrade"; }; + }; + + networking = { + # /etc/resolv.conf to be managed via systemd-resolved + # resolvconf = { + # enable = true; + # }; + + nameservers = [ + # Cloudflare + "1.1.1.1" + "1.0.0.1" + # Google + "8.8.8.8" + ]; networkmanager = { enable = true; From 210c913fd1bedbd419e9d0b94c490c98dfe6851f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 31 May 2026 22:00:39 +0200 Subject: [PATCH 014/184] Rename ESP partition --- hosts/nixos-btw/disko.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hosts/nixos-btw/disko.nix b/hosts/nixos-btw/disko.nix index 374fa7f..2bd8833 100644 --- a/hosts/nixos-btw/disko.nix +++ b/hosts/nixos-btw/disko.nix @@ -8,7 +8,7 @@ content = { type = "gpt"; partitions = { - esp = { + ESP = { type = "EF00"; size = "1G"; content = { From 8ab74baec51c5bc39ddf565d998edf7abdb804b4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 1 Jun 2026 01:20:10 +0200 Subject: [PATCH 015/184] Add substituters --- system/nix/store.nix | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/system/nix/store.nix b/system/nix/store.nix index a49354c..ff821d7 100644 --- a/system/nix/store.nix +++ b/system/nix/store.nix @@ -24,6 +24,17 @@ "root" "@wheel" ]; + + builders-use-substitutes = true; + substituters = [ + # high priority since it's almost always used + "https://cache.nixos.org?priority=10" + "https://nix-community.cachix.org" + ]; + trusted-public-keys = [ + "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" + "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs=" + ]; }; }; } From 7a580ab03ba2c01a264573a38eaa7e0a58c8a893 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 1 Jun 2026 01:46:44 +0200 Subject: [PATCH 016/184] Login with greetd, regreet and Hyprland --- system/default.nix | 3 -- system/programs/default.nix | 4 +- system/programs/hyprland/default.nix | 21 ++++++++++ system/services/default.nix | 4 +- system/services/greetd.nix | 63 ++++++++++++++++++++++++++++ 5 files changed, 90 insertions(+), 5 deletions(-) create mode 100644 system/programs/hyprland/default.nix create mode 100644 system/services/greetd.nix diff --git a/system/default.nix b/system/default.nix index 0027680..33522cf 100644 --- a/system/default.nix +++ b/system/default.nix @@ -11,9 +11,6 @@ let ./programs ./services - # TODO: coming soon - # ./servcies/greetd.nix - # ./services/pipewire.nix ]; laptop = desktop ++ [ diff --git a/system/programs/default.nix b/system/programs/default.nix index eb9a5f5..3fbd598 100644 --- a/system/programs/default.nix +++ b/system/programs/default.nix @@ -1,3 +1,5 @@ { - # nothing here at the moment + imports = [ + ./hyprland + ]; } diff --git a/system/programs/hyprland/default.nix b/system/programs/hyprland/default.nix new file mode 100644 index 0000000..aa50062 --- /dev/null +++ b/system/programs/hyprland/default.nix @@ -0,0 +1,21 @@ +{ + inputs, + pkgs, + lib, + ... +}: +let + inherit (pkgs.stdenv.hostPlatform) system; +in +{ + environment.systemPackages = [ + pkgs.hyprland + pkgs.kitty + ]; + + programs.hyprland = { + enable = true; + withUWSM = true; + xwayland.enable = true; + }; +} diff --git a/system/services/default.nix b/system/services/default.nix index eb9a5f5..d393437 100644 --- a/system/services/default.nix +++ b/system/services/default.nix @@ -1,3 +1,5 @@ { - # nothing here at the moment + imports = [ + ./greetd.nix + ]; } diff --git a/system/services/greetd.nix b/system/services/greetd.nix new file mode 100644 index 0000000..91389c2 --- /dev/null +++ b/system/services/greetd.nix @@ -0,0 +1,63 @@ +{ + lib, + pkgs, + config, + ... +}: +{ + environment.systemPackages = [ + pkgs.hyprland + pkgs.regreet + ]; + + services.greetd = + let + session = { + command = "${lib.getBin pkgs.hyprland}/bin/start-hyprland -- -c /etc/greetd/hyprland.lua"; + user = "greeter"; + }; + in + { + enable = true; + restart = false; + + settings = { + terminal.vt = 1; + default_session = session; + }; + }; + + environment.etc = { + "greetd/hyprland.lua" = { + mode = "0644"; + text = '' + hl.on("hyprland.start", function() + hl.exec_cmd("${lib.getExe pkgs.regreet}; ${lib.getBin pkgs.hyprland}/bin/hyprctl dispatch 'hl.dsp.exit()'") + end) + hl.config({ + misc = { + disable_hyprland_logo = true, + disable_splash_rendering = true, + disable_hyprland_guiutils_check = true, + }, + }) + ''; + }; + }; + + programs.regreet = { + enable = true; + settings = { + commands = { + reboot = [ + "systemctl" + "reboot" + ]; + poweroff = [ + "systemctl" + "poweroff" + ]; + }; + }; + }; +} From 52d5d88858f944ea64ef69175b0ef146f0af2008 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 1 Jun 2026 03:32:21 +0200 Subject: [PATCH 017/184] Prototype home manager implementation --- flake.lock | 30 ++++++++++++++++++++++++++---- flake.nix | 7 ++++++- hosts/default.nix | 1 + hosts/nixos-btw/default.nix | 9 ++++++++- hosts/nixos-btw/home.nix | 36 ++++++++++++++++++++++++++++++++++++ 5 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 hosts/nixos-btw/home.nix diff --git a/flake.lock b/flake.lock index 2d75e2a..236cf41 100644 --- a/flake.lock +++ b/flake.lock @@ -39,18 +39,39 @@ "type": "github" } }, + "home-manager": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1779726825, + "narHash": "sha256-RUkMrREjKDQrA+dA9+xZviGAxM5W1aVdyOr/bSYpHrE=", + "owner": "nix-community", + "repo": "home-manager", + "rev": "b179bde238977f7d4454fc770b1a727eaf55111c", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "release-26.05", + "repo": "home-manager", + "type": "github" + } + }, "nixpkgs": { "locked": { - "lastModified": 1779508470, - "narHash": "sha256-Ap9KJX+5xHIn3bPIpfNgT6MEXdAECECwo4/rmlQD74M=", + "lastModified": 1780203844, + "narHash": "sha256-K5sT4jTpGs15ADhviMKNBH38REpPf5Q6mM1+N6cArVE=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "29916453413845e54a65b8a1cf996842300cd299", + "rev": "b51242d7d43689db2f3be91bd05d5b24fbb469c4", "type": "github" }, "original": { "owner": "NixOS", - "ref": "nixos-unstable", + "ref": "nixos-26.05", "repo": "nixpkgs", "type": "github" } @@ -74,6 +95,7 @@ "inputs": { "disko": "disko", "flake-parts": "flake-parts", + "home-manager": "home-manager", "nixpkgs": "nixpkgs" } } diff --git a/flake.nix b/flake.nix index d7a1640..4b7233d 100644 --- a/flake.nix +++ b/flake.nix @@ -3,12 +3,17 @@ inputs = { flake-parts.url = "github:hercules-ci/flake-parts"; - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; disko = { url = "github:nix-community/disko/latest"; inputs.nixpkgs.follows = "nixpkgs"; }; + + home-manager = { + url = "github:nix-community/home-manager/release-26.05"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = diff --git a/hosts/default.nix b/hosts/default.nix index d61a197..b1fec55 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -14,6 +14,7 @@ modules = laptop ++ [ ./nixos-btw inputs.disko.nixosModules.disko + inputs.home-manager.nixosModules.home-manager ]; }; }; diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix index a7c65db..921c062 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/nixos-btw/default.nix @@ -1,9 +1,16 @@ -{ ... }: +{ inputs, home-manager, ... }: { imports = [ ./hardware-configuration.nix ./disko.nix ]; + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = { inherit inputs; }; + users.rtucek = ./home.nix; + }; + networking.hostName = "nixos-btw"; } diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix new file mode 100644 index 0000000..31fd74b --- /dev/null +++ b/hosts/nixos-btw/home.nix @@ -0,0 +1,36 @@ +{ config, pkgs, ... }: +{ + # Home Manager needs a bit of information about you and the + # paths it should manage. + home.username = "rtucek"; + home.homeDirectory = "/home/rtucek"; + + # Packages that should be installed to the user profile. + home.packages = [ + pkgs.htop + pkgs.fortune + ]; + + # This value determines the Home Manager release that your + # configuration is compatible with. This helps avoid breakage + # when a new Home Manager release introduces backwards + # incompatible changes. + # + # You can update Home Manager without changing this value. See + # the Home Manager release notes for a list of state version + # changes in each release. + home.stateVersion = "26.05"; + + # Let Home Manager install and manage itself. + programs.home-manager.enable = true; + + programs.neovim = { + enable = true; + }; + + services.gpg-agent = { + enable = true; + defaultCacheTtl = 1800; + enableSshSupport = true; + }; +} From 0a01c44b034666b8f28795740a4ca90f453239e2 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 3 Jun 2026 23:14:25 +0200 Subject: [PATCH 018/184] Prototype Hyprland login --- home/default.nix | 5 +++++ home/hyprland.nix | 16 ++++++++++++++++ hosts/nixos-btw/home.nix | 6 ++++++ system/programs/hyprland/default.nix | 1 - 4 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 home/default.nix create mode 100644 home/hyprland.nix diff --git a/home/default.nix b/home/default.nix new file mode 100644 index 0000000..96e5300 --- /dev/null +++ b/home/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./hyprland.nix + ]; +} diff --git a/home/hyprland.nix b/home/hyprland.nix new file mode 100644 index 0000000..808bca4 --- /dev/null +++ b/home/hyprland.nix @@ -0,0 +1,16 @@ +{ lib, pkgs, ... }: +{ + home.packages = [ + pkgs.kitty + pkgs.pcmanfm + pkgs.rofi + ]; + + wayland.windowManager.hyprland = { + enable = true; + xwayland.enable = true; + + systemd.enable = true; + systemd.variables = [ "--all" ]; + }; +} diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix index 31fd74b..941330c 100644 --- a/hosts/nixos-btw/home.nix +++ b/hosts/nixos-btw/home.nix @@ -5,10 +5,16 @@ home.username = "rtucek"; home.homeDirectory = "/home/rtucek"; + imports = [ + ../../home + ]; + # Packages that should be installed to the user profile. home.packages = [ pkgs.htop pkgs.fortune + pkgs.fastfetch + pkgs.brave ]; # This value determines the Home Manager release that your diff --git a/system/programs/hyprland/default.nix b/system/programs/hyprland/default.nix index aa50062..801f62d 100644 --- a/system/programs/hyprland/default.nix +++ b/system/programs/hyprland/default.nix @@ -10,7 +10,6 @@ in { environment.systemPackages = [ pkgs.hyprland - pkgs.kitty ]; programs.hyprland = { From 6bcf3641ab77f871a023397b0584b52b1282ed2a Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 4 Jun 2026 19:49:17 +0200 Subject: [PATCH 019/184] Port Hyprland UI config (1/2) --- home/hyprland.nix | 380 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 380 insertions(+) diff --git a/home/hyprland.nix b/home/hyprland.nix index 808bca4..64b69da 100644 --- a/home/hyprland.nix +++ b/home/hyprland.nix @@ -12,5 +12,385 @@ systemd.enable = true; systemd.variables = [ "--all" ]; + + configType = "lua"; + settings = with lib.generators; { + ######################## + ## VARS + ######################## + + mod = { + _var = "ALT"; + }; + + terminal = { + _var = "${lib.getExe pkgs.kitty}"; + }; + + fileManager = { + _var = "${lib.getExe pkgs.pcmanfm}"; + }; + + menu = { + _var = "${lib.getExe pkgs.rofi} -show drun -drun-show-actions"; + }; + + ######################## + ## Monitors + ######################## + + # See https://wiki.hypr.land/Configuring/Basics/Monitors/ + monitor = [ + { + # Sensitive default for arbitrary new monitors + output = ""; + mode = "preferred"; + position = "auto"; + scale = 1; + } + ]; + + ############################# + ### ENVIRONMENT VARIABLES ### + ############################# + + # See https://wiki.hypr.land/Configuring/Environment-variables/ + env = [ + { + _args = [ + "XCURSOR_SIZE" + "24" + ]; + } + { + _args = [ + "HYPRCURSOR_SIZE" + "24" + ]; + } + ]; + + ################### + ### PERMISSIONS ### + ################### + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem + config.ecosystem = { + no_update_news = false; + no_donation_nag = true; + # enforce_permissions = true; + }; + + ##################### + ### LOOK AND FEEL ### + ##################### + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#general + config.general = { + gaps_in = 5; + gaps_out = 20; + + border_size = 2; + + col.active_border = { + colors = [ + "rgba(33ccffee)" + "rgba(00ff99ee)" + ]; + angle = 45; + }; + col.inactive_border = { + colors = [ "rgba(595959aa)" ]; + }; + + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = true; + + # See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ + allow_tearing = false; + + layout = "dwindle"; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#decoration + config.decoration = { + rounding = 10; + rounding_power = 2; + + # Change transparency of focused and unfocused windows + active_opacity = 1.0; + inactive_opacity = 1.0; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#shadow + shadow = { + enabled = true; + range = 4; + render_power = 3; + color = "rgba(1a1a1aee)"; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#blur + blur = { + enabled = true; + size = 3; + passes = 1; + vibrancy = 0.1696; + }; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#animations + # as well as https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ + config.animations = { + enabled = true; + }; + curve = [ + { + _args = [ + "easeOutQuint" + { + type = "bezier"; + points = [ + [ + 0.23 + 1 + ] + [ + 0.32 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "easeInOutCubic" + { + type = "bezier"; + points = [ + [ + 0.65 + 0.05 + ] + [ + 0.36 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "linear" + { + type = "bezier"; + points = [ + [ + 0 + 0 + ] + [ + 1 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "almostLinear" + { + type = "bezier"; + points = [ + [ + 0.5 + 0.5 + ] + [ + 0.75 + 1.0 + ] + ]; + } + ]; + } + { + _args = [ + "quick" + { + type = "bezier"; + points = [ + [ + 0.15 + 0 + ] + [ + 0.1 + 1 + ] + ]; + } + ]; + } + ]; + animation = [ + { + leaf = "global"; + enabled = true; + speed = 10; + bezier = "default"; + } + { + leaf = "border"; + enabled = true; + speed = 5.39; + bezier = "easeOutQuint"; + } + { + leaf = "windows"; + enabled = true; + speed = 4.79; + bezier = "easeOutQuint"; + } + { + leaf = "windowsIn"; + enabled = true; + speed = 4.1; + bezier = "easeOutQuint"; + stye = "popin 87%"; + } + { + leaf = "windowsOut"; + enabled = true; + speed = 1.49; + bezier = "linear"; + style = "popin 87%"; + } + { + leaf = "fadeIn"; + enabled = true; + speed = 1.73; + bezier = "almostLinear"; + } + { + leaf = "fadeOut"; + enabled = true; + speed = 1.46; + bezier = "almostLinear"; + } + { + leaf = "fade"; + enabled = true; + speed = 3.03; + bezier = "quick"; + } + { + leaf = "layers"; + enabled = true; + speed = 3.81; + bezier = "easeOutQuint"; + } + { + leaf = "layersIn"; + enabled = true; + speed = 4; + bezier = "easeOutQuint"; + style = "fade"; + } + { + leaf = "layersOut"; + enabled = true; + speed = 1.5; + bezier = "linear"; + style = "fade"; + } + { + leaf = "fadeLayersIn"; + enabled = true; + speed = 1.79; + bezier = "almostLinear"; + } + { + leaf = "fadeLayersOut"; + enabled = true; + speed = 1.39; + bezier = "almostLinear"; + } + { + leaf = "workspaces"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesIn"; + enabled = true; + speed = 1.21; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesOut"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + ]; + + # Smart gaps + # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps + workspace_rule = [ + { + workspace = "w[tv1]"; + gaps_out = 0; + gaps_in = 0; + } + { + workspace = "f[1]"; + gaps_out = 0; + gaps_in = 0; + } + ]; + window_rule = [ + { + match = { + float = false; + workspace = "w[tv1]"; + }; + border_size = 0; + rounding = 0; + } + { + match = { + float = false; + workspace = "f[1]"; + }; + border_size = 0; + rounding = 0; + } + ]; + + # Dwindle Layout + # See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ + config.dwindle.preserve_split = true; + + # Master Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.master.new_status = "master"; + + # Scrolling Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.scrolling.fullscreen_on_one_column = true; + + # Get rid of default wallpaper + config.misc = { + force_default_wallpaper = false; + disable_hyprland_logo = true; + }; + }; }; } From 58094d6769fa113e0ebc4058133250e60e3d8a44 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 03:09:12 +0200 Subject: [PATCH 020/184] Port Hyprland UI config (1/2) --- home/hyprland.nix | 948 +++++++++++++++++++++++++++++----------------- 1 file changed, 592 insertions(+), 356 deletions(-) diff --git a/home/hyprland.nix b/home/hyprland.nix index 64b69da..6f127ec 100644 --- a/home/hyprland.nix +++ b/home/hyprland.nix @@ -1,9 +1,11 @@ { lib, pkgs, ... }: { home.packages = [ + pkgs.hyprshutdown pkgs.kitty pkgs.pcmanfm pkgs.rofi + pkgs.yazi ]; wayland.windowManager.hyprland = { @@ -14,383 +16,617 @@ systemd.variables = [ "--all" ]; configType = "lua"; - settings = with lib.generators; { - ######################## - ## VARS - ######################## + settings = + let + # Smart gaps + # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps + smart-gaps = { + workspace-rule = [ + { + workspace = "w[tv1]"; + gaps_out = 0; + gaps_in = 0; + } + { + workspace = "f[1]"; + gaps_out = 0; + gaps_in = 0; + } + ]; + window-rule = [ + { + match = { + float = false; + workspace = "w[tv1]"; + }; + border_size = 0; + rounding = 0; + } + { + match = { + float = false; + workspace = "f[1]"; + }; + border_size = 0; + rounding = 0; + } + ]; + }; + in + with lib.generators; + { + ######################## + ## VARS + ######################## - mod = { - _var = "ALT"; - }; + mod = { + _var = "ALT"; + }; - terminal = { - _var = "${lib.getExe pkgs.kitty}"; - }; + terminal = { + _var = "${lib.getExe pkgs.kitty}"; + }; - fileManager = { - _var = "${lib.getExe pkgs.pcmanfm}"; - }; + fileManager = { + _var = "${lib.getExe pkgs.pcmanfm}"; + }; - menu = { - _var = "${lib.getExe pkgs.rofi} -show drun -drun-show-actions"; - }; + fileManagerCli = { + _var = "${lib.getExe pkgs.yazi}"; + }; - ######################## - ## Monitors - ######################## - - # See https://wiki.hypr.land/Configuring/Basics/Monitors/ - monitor = [ - { - # Sensitive default for arbitrary new monitors - output = ""; - mode = "preferred"; - position = "auto"; - scale = 1; - } - ]; - - ############################# - ### ENVIRONMENT VARIABLES ### - ############################# - - # See https://wiki.hypr.land/Configuring/Environment-variables/ - env = [ - { - _args = [ - "XCURSOR_SIZE" - "24" - ]; - } - { - _args = [ - "HYPRCURSOR_SIZE" - "24" - ]; - } - ]; - - ################### - ### PERMISSIONS ### - ################### - - # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem - config.ecosystem = { - no_update_news = false; - no_donation_nag = true; - # enforce_permissions = true; - }; + menu = { + _var = "${lib.getExe pkgs.rofi} -show drun -drun-show-actions"; + }; - ##################### - ### LOOK AND FEEL ### - ##################### + shutdown = { + _var = "${lib.getExe pkgs.hyprshutdown}"; + }; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#general - config.general = { - gaps_in = 5; - gaps_out = 20; + ######################## + ## Monitors + ######################## - border_size = 2; + # See https://wiki.hypr.land/Configuring/Basics/Monitors/ + monitor = [ + { + # Sensitive default for arbitrary new monitors + output = ""; + mode = "preferred"; + position = "auto"; + scale = 1; + } + ]; - col.active_border = { - colors = [ - "rgba(33ccffee)" - "rgba(00ff99ee)" - ]; - angle = 45; - }; - col.inactive_border = { - colors = [ "rgba(595959aa)" ]; + ############################# + ### ENVIRONMENT VARIABLES ### + ############################# + + # See https://wiki.hypr.land/Configuring/Environment-variables/ + env = [ + { + _args = [ + "XCURSOR_SIZE" + "24" + ]; + } + { + _args = [ + "HYPRCURSOR_SIZE" + "24" + ]; + } + ]; + + ################### + ### PERMISSIONS ### + ################### + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem + config.ecosystem = { + no_update_news = false; + no_donation_nag = true; + # enforce_permissions = true; }; - # Set to true enable resizing windows by clicking and dragging on borders and gaps - resize_on_border = true; + ##################### + ### LOOK AND FEEL ### + ##################### - # See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ - allow_tearing = false; + # See https://wiki.hypr.land/Configuring/Basics/Variables/#general + config.general = { + gaps_in = 5; + gaps_out = 20; - layout = "dwindle"; - }; + border_size = 2; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#decoration - config.decoration = { - rounding = 10; - rounding_power = 2; + col.active_border = { + colors = [ + "rgba(33ccffee)" + "rgba(00ff99ee)" + ]; + angle = 45; + }; + col.inactive_border = { + colors = [ "rgba(595959aa)" ]; + }; - # Change transparency of focused and unfocused windows - active_opacity = 1.0; - inactive_opacity = 1.0; + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = true; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#shadow - shadow = { - enabled = true; - range = 4; - render_power = 3; - color = "rgba(1a1a1aee)"; - }; + # See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ + allow_tearing = false; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#blur - blur = { - enabled = true; - size = 3; - passes = 1; - vibrancy = 0.1696; + layout = "dwindle"; }; - }; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#animations - # as well as https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ - config.animations = { - enabled = true; - }; - curve = [ - { - _args = [ - "easeOutQuint" - { - type = "bezier"; - points = [ - [ - 0.23 - 1 - ] - [ - 0.32 - 1 - ] - ]; - } - ]; - } - { - _args = [ - "easeInOutCubic" - { - type = "bezier"; - points = [ - [ - 0.65 - 0.05 - ] - [ - 0.36 - 1 - ] - ]; - } - ]; - } - { - _args = [ - "linear" - { - type = "bezier"; - points = [ - [ - 0 - 0 - ] - [ - 1 - 1 - ] - ]; - } - ]; - } - { - _args = [ - "almostLinear" - { - type = "bezier"; - points = [ - [ - 0.5 - 0.5 - ] - [ - 0.75 - 1.0 - ] - ]; - } - ]; - } - { - _args = [ - "quick" - { - type = "bezier"; - points = [ - [ - 0.15 - 0 - ] - [ - 0.1 - 1 - ] - ]; - } - ]; - } - ]; - animation = [ - { - leaf = "global"; - enabled = true; - speed = 10; - bezier = "default"; - } - { - leaf = "border"; - enabled = true; - speed = 5.39; - bezier = "easeOutQuint"; - } - { - leaf = "windows"; - enabled = true; - speed = 4.79; - bezier = "easeOutQuint"; - } - { - leaf = "windowsIn"; - enabled = true; - speed = 4.1; - bezier = "easeOutQuint"; - stye = "popin 87%"; - } - { - leaf = "windowsOut"; - enabled = true; - speed = 1.49; - bezier = "linear"; - style = "popin 87%"; - } - { - leaf = "fadeIn"; - enabled = true; - speed = 1.73; - bezier = "almostLinear"; - } - { - leaf = "fadeOut"; - enabled = true; - speed = 1.46; - bezier = "almostLinear"; - } - { - leaf = "fade"; - enabled = true; - speed = 3.03; - bezier = "quick"; - } - { - leaf = "layers"; - enabled = true; - speed = 3.81; - bezier = "easeOutQuint"; - } - { - leaf = "layersIn"; - enabled = true; - speed = 4; - bezier = "easeOutQuint"; - style = "fade"; - } - { - leaf = "layersOut"; - enabled = true; - speed = 1.5; - bezier = "linear"; - style = "fade"; - } - { - leaf = "fadeLayersIn"; - enabled = true; - speed = 1.79; - bezier = "almostLinear"; - } - { - leaf = "fadeLayersOut"; - enabled = true; - speed = 1.39; - bezier = "almostLinear"; - } - { - leaf = "workspaces"; - enabled = true; - speed = 1.94; - bezier = "almostLinear"; - style = "fade"; - } - { - leaf = "workspacesIn"; - enabled = true; - speed = 1.21; - bezier = "almostLinear"; - style = "fade"; - } - { - leaf = "workspacesOut"; - enabled = true; - speed = 1.94; - bezier = "almostLinear"; - style = "fade"; - } - ]; - - # Smart gaps - # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps - workspace_rule = [ - { - workspace = "w[tv1]"; - gaps_out = 0; - gaps_in = 0; - } - { - workspace = "f[1]"; - gaps_out = 0; - gaps_in = 0; - } - ]; - window_rule = [ - { - match = { - float = false; - workspace = "w[tv1]"; + # See https://wiki.hypr.land/Configuring/Basics/Variables/#decoration + config.decoration = { + rounding = 10; + rounding_power = 2; + + # Change transparency of focused and unfocused windows + active_opacity = 1.0; + inactive_opacity = 1.0; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#shadow + shadow = { + enabled = true; + range = 4; + render_power = 3; + color = "rgba(1a1a1aee)"; }; - border_size = 0; - rounding = 0; - } - { - match = { - float = false; - workspace = "f[1]"; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#blur + blur = { + enabled = true; + size = 3; + passes = 1; + vibrancy = 0.1696; }; - border_size = 0; - rounding = 0; - } - ]; - - # Dwindle Layout - # See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ - config.dwindle.preserve_split = true; - - # Master Layout - # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ - config.master.new_status = "master"; - - # Scrolling Layout - # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ - config.scrolling.fullscreen_on_one_column = true; - - # Get rid of default wallpaper - config.misc = { - force_default_wallpaper = false; - disable_hyprland_logo = true; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#animations + # as well as https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ + config.animations = { + enabled = true; + }; + curve = [ + { + _args = [ + "easeOutQuint" + { + type = "bezier"; + points = [ + [ + 0.23 + 1 + ] + [ + 0.32 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "easeInOutCubic" + { + type = "bezier"; + points = [ + [ + 0.65 + 0.05 + ] + [ + 0.36 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "linear" + { + type = "bezier"; + points = [ + [ + 0 + 0 + ] + [ + 1 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "almostLinear" + { + type = "bezier"; + points = [ + [ + 0.5 + 0.5 + ] + [ + 0.75 + 1.0 + ] + ]; + } + ]; + } + { + _args = [ + "quick" + { + type = "bezier"; + points = [ + [ + 0.15 + 0 + ] + [ + 0.1 + 1 + ] + ]; + } + ]; + } + ]; + animation = [ + { + leaf = "global"; + enabled = true; + speed = 10; + bezier = "default"; + } + { + leaf = "border"; + enabled = true; + speed = 5.39; + bezier = "easeOutQuint"; + } + { + leaf = "windows"; + enabled = true; + speed = 4.79; + bezier = "easeOutQuint"; + } + { + leaf = "windowsIn"; + enabled = true; + speed = 4.1; + bezier = "easeOutQuint"; + stye = "popin 87%"; + } + { + leaf = "windowsOut"; + enabled = true; + speed = 1.49; + bezier = "linear"; + style = "popin 87%"; + } + { + leaf = "fadeIn"; + enabled = true; + speed = 1.73; + bezier = "almostLinear"; + } + { + leaf = "fadeOut"; + enabled = true; + speed = 1.46; + bezier = "almostLinear"; + } + { + leaf = "fade"; + enabled = true; + speed = 3.03; + bezier = "quick"; + } + { + leaf = "layers"; + enabled = true; + speed = 3.81; + bezier = "easeOutQuint"; + } + { + leaf = "layersIn"; + enabled = true; + speed = 4; + bezier = "easeOutQuint"; + style = "fade"; + } + { + leaf = "layersOut"; + enabled = true; + speed = 1.5; + bezier = "linear"; + style = "fade"; + } + { + leaf = "fadeLayersIn"; + enabled = true; + speed = 1.79; + bezier = "almostLinear"; + } + { + leaf = "fadeLayersOut"; + enabled = true; + speed = 1.39; + bezier = "almostLinear"; + } + { + leaf = "workspaces"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesIn"; + enabled = true; + speed = 1.21; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesOut"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + ]; + + # Dwindle Layout + # See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ + config.dwindle.preserve_split = true; + + # Master Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.master.new_status = "master"; + + # Scrolling Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.scrolling.fullscreen_on_one_column = true; + + # Get rid of default wallpaper + config.misc = { + force_default_wallpaper = false; + disable_hyprland_logo = true; + }; + + ############# + ### INPUT ### + ############# + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#input + config.input = { + kb_layout = "us,de"; + kb_variant = ""; + kb_model = ""; + kb_options = ""; + kb_rules = ""; + + follow_mouse = true; + + sensitivity = 0; # between -1.0 and 1.0; 0 means no modification. + + touchpad.natural_scroll = true; + }; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#gestures + config.gesture = [ + { + fingers = 3; + direction = "horizontal"; + action = "workspace"; + } + ]; + + ##################### + #### KEYBINDINGS #### + ##################### + + # See https://wiki.hypr.land/Configuring/Basics/Binds/ + + bind = [ + # Common bindings + { + _args = [ + (mkLuaInline "mod .. \" + Q\"") + (mkLuaInline "hl.dsp.exec_cmd(terminal)") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + C\"") + (mkLuaInline "hl.dsp.window.close()") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + M\"") + (mkLuaInline "hl.dsp.exec_cmd(shutdown)") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + E\"") + (mkLuaInline "hl.dsp.exec_cmd(fileManager)") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + SHIFT + E\"") + (mkLuaInline "hl.dsp.exec_cmd(terminal .. \" \" .. fileManagerCli)") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + V\"") + (mkLuaInline "hl.dsp.window.float({ action = \"toggle\" })") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + R\"") + (mkLuaInline "hl.dsp.exec_cmd(menu)") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + P\"") + (mkLuaInline "hl.dsp.window.pseudo()") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + J\"") + (mkLuaInline "hl.dsp.layout(\"togglesplit\")") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + F\"") + (mkLuaInline "hl.dsp.window.fullscreen({ [\"mode\"] = \"maximized\" })") + ]; + } + + # Move focus with main mod + arrow keys + { + _args = [ + (mkLuaInline "mod .. \" + left\"") + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"l\" })") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + right\"") + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"r\" })") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + up\"") + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"u\" })") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + down\"") + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"d\" })") + ]; + } + + # Special workspace (aka scratchpad) + { + _args = [ + (mkLuaInline "mod .. \" + S\"") + (mkLuaInline "hl.dsp.workspace.toggle_special(\"magic\")") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + SHIFT + S\"") + (mkLuaInline "hl.dsp.workspace.move({ [\"workspace\"] = \"special:magic\", [\"monitor\"] = \"current\" })") + ]; + } + + # Scroll through existing workspaces with mod + scroll + { + _args = [ + (mkLuaInline "mod .. \" + mouse_down\"") + (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m+1\" })") + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + mouse_up\"") + (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m-1\" })") + ]; + } + + # Move/resize windows with mod + LMB/RMB and dragging + { + _args = [ + (mkLuaInline "mod .. \" + mouse:272\"") + (mkLuaInline "hl.dsp.window.drag()") + { mouse = true; } + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + mouse:273\"") + (mkLuaInline "hl.dsp.window.resize()") + { mouse = true; } + ]; + } + + # Multimedia keys + # TODO: volume (require pipewire setup) + # TODO: multimedia keys (play, stop, next, previous...) + # TODO: brightness + # TODO: screenshots + ]; + + ################################ + #### WINDOWS AND WORKSPACES #### + ################################ + + # See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ + # and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ + workspace_rule = smart-gaps.workspace-rule ++ [ ]; + window_rule = smart-gaps.window-rule ++ [ + # Suppress maximize request from all apps + { + name = "suppress-maximize-events"; + match = { + class = ".*"; + }; + + suppress_event = "maximize"; + } + { + name = "fix-xwayland-drags"; + match = { + class = "^$"; + title = "^$"; + xwayland = true; + float = true; + fullscreen = false; + pin = false; + }; + + no_focus = true; + } + ]; }; - }; + + extraConfig = '' + for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 + + -- Switch workspaces with mod + [0-9] + hl.bind(mod .. " + " .. key, hl.dsp.focus({ ["workspace"] = i})) + + -- Move active window to a workspace with mod + SHIFT + [0-9] + hl.bind(mod .. " + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i })) + + -- Move active window to a workspace with mod + SHIFT + [0-9] + hl.bind(mod .. " + CTRL + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i, ["follow"] = false })) + end + ''; }; } From 4c40839dc99de441f4b4bbb1d9393887cd0eccd4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 03:41:13 +0200 Subject: [PATCH 021/184] Add hyprpaper --- home/default.nix | 2 +- home/hyprland/default.nix | 6 ++++++ home/{ => hyprland}/hyprland.nix | 0 home/hyprland/hyprpaper.nix | 18 ++++++++++++++++++ home/hyprland/screensaver.jpeg | Bin 0 -> 181886 bytes 5 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 home/hyprland/default.nix rename home/{ => hyprland}/hyprland.nix (100%) create mode 100644 home/hyprland/hyprpaper.nix create mode 100644 home/hyprland/screensaver.jpeg diff --git a/home/default.nix b/home/default.nix index 96e5300..3fbd598 100644 --- a/home/default.nix +++ b/home/default.nix @@ -1,5 +1,5 @@ { imports = [ - ./hyprland.nix + ./hyprland ]; } diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix new file mode 100644 index 0000000..ea2b0b1 --- /dev/null +++ b/home/hyprland/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./hyprland.nix + ./hyprpaper.nix + ]; +} diff --git a/home/hyprland.nix b/home/hyprland/hyprland.nix similarity index 100% rename from home/hyprland.nix rename to home/hyprland/hyprland.nix diff --git a/home/hyprland/hyprpaper.nix b/home/hyprland/hyprpaper.nix new file mode 100644 index 0000000..276d36f --- /dev/null +++ b/home/hyprland/hyprpaper.nix @@ -0,0 +1,18 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.hyprpaper + ]; + + services.hyprpaper = { + enable = true; + settings = { + splash = false; + wallpaper = { + monitor = ""; + path = toString ./screensaver.jpeg; + fit_mode = "cover"; + }; + }; + }; +} diff --git a/home/hyprland/screensaver.jpeg b/home/hyprland/screensaver.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..c7f5b8ab0e18aa52f1e904be90897c5b8107caa1 GIT binary patch literal 181886 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

$rS&K8gM=4=2GQ2b7)hVTRowh^6 z0Bxl@OmH`=R>{>DmD-$v zv)(4gsPh97bTU|-#6DxOH9hO-)XW8_Agy_bcivypowUuIzIB6u^Dr^>3V@$RazfgZ zR}2l#irA82ZRJi?ISmaEo zzXZ3DyLR_7C7tl=0$ zhtD(*tW-v#4eef$r~F`^cLXzKZUEv2TfM&zTO-pV$PX!94l9fyecGvCSK}b=UTqrgPw#(!EiTRy(8~ zMGzKR;avftbU~VTo#v{MKg}Y~wTx4P0kDd)1 zmH)_d)jrxZ+j-V+-BkIImDjvb*M~a(C9;OO2U(Uda@LUr>|JBR`*_N|vl6d#9+j}% ziaBbFO>^P1r|3nOGK~F*K#Njn0I5oRc$iPQ_-B$cDR(2mF(%IQma;93DJ;a4D!Crm zBajso7UTp})!z$kMORZ%?8=34E@9|4Zj8CJnYfAy(`?zfQDf|sPdF8_L%3C+G>Pb#Y%0Eqio7z_JRWcl#=d zb;AK*$hc7|*`u*gcKTnG zeWx9H)q21UcLnNj5!{sMDYk8}C*&LFHv7axWrq!+t%pJ{T!8!c4#m6gcBOxesL9m$ z+<7*ex3I!LHg)GBL8v7c#qI)F(yJrblZFD`1!Jii$0?%NsB4q^2XcOm{%4EN;^c2B zw1m@v*s1Y~f{`7fs}=|BWGhdK8&V{F7w2z#?gu@)#-_l4-!010R&-M?1c-Oaz5b3o zpIRADEVmEj4Cl`Tqse%Tz0ETrze>3ZR7snb}{Dd4lI4O>h9Yji*najy_@Q|;rg}k6FpiUlUrT( z`Ofm)F6QOwbb*d{^iZzr;^;q==(VkrikD>o2(3paPf;C;tSmZLhS%Nj|566!njrRF zR%8Q!wku7hNo zhBOsQaU`i;X-7C8l3k_zW)ig+?4{K7H&NKQA_E#~g!(^I0lN8`93%wbYL}BSgZlqW zF&*E`8~}-OZ;&fly9)zhw9lrox;CM`dLa()mf}kb1DnOr5%Z5J4c}YN=7{8$w_2@($Qy|6{$&X}sBO0T6faF;l-; zM#n6d=1-2ttI*q~yG9?jVCj!raaGWi2#9s>=9isvt$1MbA6n8k75wkG2urMy&n*Kw z8ox)qqlkeB$j1K+phklM^+?G#R*5QWzaEk`0d>I!DPY|Hfr{#^2g>`(HY>_Th9Lmf z!C8)S9<0%SOhrtR5tBi5&0Yd*p>lq{%^@(b4p&Udn>F0gJN=DeaN~`dpTh04d3=H* z+zo59#jq}m?*Q69T@FOwOGE`G!R=;(5DY~<=+B313%$1o*S+0LoyL4dvh*(%88|&_ zS-I>VZkEwyWO?R`%8SQvzO7N^woN)YnW_1|*n1bRq|^29zrEX2d#1AOIBMl-CQHZ6 zOwA)IdnU~$59~6}r%B8cBB^;qVb3^aYQm)D357;e^MGiIXJpzQh!n{aC@7>T<^d7$ zfFR8CneX#F>v?|v!FT=E!%{!2C9DtJAGq)Px~}*2eod7-8rx&>Y)1C4%%Uj$5RYg1 z7uzF?@}j(rJQAF(^Ibfv_~7{Yn%|fPBiJoqy0=<&MdJV|H{uKQ$HzH*MWh!Wodi_3 zZ0^a9t@atcXwGn-Q$Auep@=VG0ipfu#Lf$oK35ZD9(TP4MWdrlSt&6Jlb>=5UJVaM zd@7-7e_Pc4UGucAx9ml%!D0}e`EJ|E0`N0Bi%5-1f@Q8ceQW-);tsfHT!$!@Rhppm+VfYSVtq^NdB*LN zW`e%ay?>R&rEZF6Re5tt!_;qV^?EldtF77+zU+QBSaxo1_#Plu29=iBNkFF8^wWIwFY>~ax78m`o8Rm)a@9)ps*d z9(=tnN)U>TQQlmp!&*UWjDDm2&Wn6Ul5FtE9Bc8)e@X%?;%&Q)3LTTxpqciQI|N^OB@kBdJstN%Fi)(*Y-z0)0)SYCZ-T%uZQJh=b$=h>2dkPc?wpy=ZL z2C|DYNYP}d-0zZet0Lwb^-k!7gbmk;~oz1nRTgstOCNp2tKUKF(A z2X2*x=f4QSMw$P0ne%O}4<7a!e8RpZ=vDfLCOInVxYJoH7Z+E7R+g^%<4LZ9>vi(a zb7@=ydbsecl0|c^*j>o!@^R|bU952~~mWkvZ-(GB!03PE`<@@{a z7qw6!6dmw+f)> z1^9i2+_@B5G#SQ-5tQZT9?r;uzv|2Mpk;6Xr+)BNE*`Ar0nVX3p$Cw<>j>7! zL0U!_$}y@Pun3J&8t%WW+mLwV=*)pcxz^*Z8`!e_*AMJScst=vV-|MGdz}nhXG*#U zzr7<)q8Z%k>WuAAlTYqvbwn)|g*k^lT}XoFBOMNvP6_~uqv%0e4=r=|IUP^L5}xr2 zm3K;(!pJx9-3DYKXOj}ND=fgs8<(d#LV*N|`Cwp?1t7M_OnH=i_+(w@SoJ0;FgztF z6&?|>&xCGtm{1ZM$cr_Oc)UqmL$U<+CgUJcnbIrMW=-TE{G=v8)e%z0o1_Xpj>YfO}PL*4$W zWKtEZ@I+BGnU3-kl=Kyul$n^4>L^vJQsY(}J0P#Z4PVK_4Mj@q1M1rR{m-V7tfm}y zn138`PKWHwt=q`Xsb=)MX*;{A_Y;^hFytrZ0l36~en)k|Im-%I+D}TtWN$9>zY{`9 zEhzxY4R766hAFdSB+NW+WKXxuK|QXN%R6x1%0`J?o`PD@xps#vbH_A z_i-6vt$+f&wLP;o{Lnh&*;w{&YJN|43Pl*dx=xX{TkGL`SY404&>t|+oZ)_^ozl?N z`qwEyVH2`f>xW}294ee%xe^MJ`8e2D5iw9`IHG^+&?7T5(5MxJI!o;c5{4a;$kY$1_Z$8=GN`>1GWN$2 zQI~jU)cyE)*y@Q#Dk4>?=EpF0ly2W!jki}Vhk$7YJb^qr84ZR=0mk(5^2(vZA4gpK zAcu-#z(fF8qK>1R!zK)XO{O)VOR>!1xvEA^Uqufaz5+rM-#4xDweuNP4M0s!iv1Ok zpY)s<=g%JfMhF~6`S~qgSG@cPev33%wRTrqD?n!`@%nv)T4~5T2VUj$n)!LR8tgOc1En&X4&@b@U7;tKR)SP_k)ugzUL@Nke8l4W!< zF@y;7;CB8J_BWS1<4!AMli4pn`E59=zS5ColD#8Ul{GSY`#sqHiJ#Vb-eUW6x|JKzB@Ax^Z-s=<~HMZ zSE7z}*37$!0}c5FW|_cVAS7S3NHz^q#t_Y&s@s7xNi;a)JBVX(s;US2(~((aGt5G$ zV$N=BDW8MR3ZFIA*vBZV(2svS;Bi`T2Jf!03kDP1ggf|-b-3TXZdWj5h%rC(12?9j zK_dcun`d52f^J<}$!n5&+93uo{c)jy(9xd^BfsD7-a2qOyoXyH(C}Bn zHt*3bEcVOrqoiiVnYN5<@|oH;cs%I(vCv6%u36Sbkyaar232TH0hYZ4F1>C1aTR8;%9Ojm?9E!TiJq zv&lrf;dBVdAISAeH0hF*R||rkLWT8Pj>N+XTTBae50v`1vpf2ylVb0fsaq4w|DNa3 z6q>@HCH>ZyYWTx`XAdd?IjJcwc7D7!$1E~! zZ|<;j=am-4bsfE0r3oh38{Vf3N<*GKAKK71Z79=>yxQ&ASbx>#;P48Zhkea!8``|= zLXJPoehF1L?2a_bo5wTf&>rDbymc7_aIDhEn2e-F6Q(ziYWG8_vVV;4;f?0r zBb>o=54z&`wqJW6G<^N3Ek1g@^|tUfjX&y7ahnNzJm3tG)Vj`@`7S3U`d}`2FDx!P zXiN0o#dr+sgBn|wMt*LMu02b=h_QuUxmiZTWZIJVuTF%UTiAnKSO^ra-wlvw8hpQ# z(sH-9Uk>HHt%9uI?19f1HAg1S*GY4H*k>`V{50|>PqXrpl>%SPz_j0f#nADz!3O89)h{O{{M_T?YuYU zUIiMd2Nh{1x?1*dTarV1M6ailTT0wu9U8%d9*Hvx;^Evn^JN`#R-fSk5nZL-z5s0kIuzRZjbFS%}}Rb+o1xB z%f~RPlat{1nZw0yYGc1?pb^?%MtA}TZC5W{M$|baN!T--_JFgZupX-qJ#EM_|L(zp zjLk=YlSh+3vK2LgP7XN9%C+rS;dJ{1&k{5~|1z(;Al@t$HVMAj!%==Sj(Yt-kO!w+PdOL+a-*V(aCk$xXjwU}V^HCe}M~ z7o*&b`D)3627n-MyowL&MB~Q+1hXGg^m%F&sIER^|COZsjAcuR4vTev>1$dm!^#3F zj=I@eK01Um#GBNL8g`zV2QeP$&pVFmKB9Q|+@HMdtL4AGjnzQBw&K^K7*@c|*y5*92gT;<3 z0{6fi#!2b{xe}luM^9)tg&JEy`2U{DPu}tJ!f8U0NzE1tUvOC>s(p^RTkGW#+iLML zWCdq=X$00ghWy5+Crv0;-|c5LV?mg?36FLVI*_Doo`Zpt15nTH;4oVb)!fak~+A!y%gz#)< z7-aD9j`N2Ku$F#Mwm`LXU?QS$Pn^)Gd&pa;Sl2WDvD-X<_V1NQ(hVF}VXg~g7YJ{2 zo{hf=u`gc~tu-`=6sh6TjJ%h8VGnzH^9?ol0k3$gC!lqCZfWPLSR78%(CgM~>XKDF zEFTyqA}bAf(ziAEzS7`I1($Ftfa zhj5|iCwUd=H?aFLp#3M@7zdCa&!6 z29nPwkEC=1N_+*7KJ-4sb^e~<-{q{4yRhZkJ~S-hl;8G$f{|vQGJ$yvx_EFTNJ#V( zG2#h{ndL6*)~)C?d$%0`hlL?ip^=f3yv)S=l=`r>8Y426-JUtB!hNY?FjeYG_dkyO zwTG>$;BZF%ziMjSUt|bieVq6F#AXj`)t(KR=VWZTXwv;|;3K!&UW#|Kw;*`z^bdTw2yLyipK|v2Wg0 z>^D|T%q$lH-yHAu9MhntMsCqkYs?6>X*%Z*1>EkEJMK7vko;~L=r z2J)Qmb(7Ax*%Q~|L)tFwR5*tPQiofQM>5BsbZ1o1zJv`gZKXA=R;n#Ed^%XJu4myJ zGhQ%v&2Qdk4*)g+$`rg%80)QuuRYmXKRj&5$d1H|BzKa$zxr4{$hHQ|-KBjxI!+f? zJO8;gcl_?+ETjG%45<^?Q%Z{Cg3iY5>fo0a8N{@j$ms#(uzy+JL>uo-6H@_5h@*f_ zpJwy$A4e2dfV}B^E|98&8sze23qwG@!jAvPk#8Er8`v!%N2zIlT2%z3sF#x))9NTF z=PdXng)9JHgCTEJvwv+jd(470cg#q`gID}Fa0kJWw8AMnhA1dP-t^DWrTUVh=AoJK zgtNqKZOdt0_xDLj<$hE8<-6up-D3vCp57?$q@ocjDN`5!IM_zq_S-c^j@HzVlT)_{_Ffus_M8ay@X6tEW9CM^De$noQ`K5!>pkLoQ28t|RmVJ?_nkbBsdL8LgeD zDSCznvl52cC$4Jn?$?|~>|$sWl=_)0x6Ya7VLDsqF&Z+G#WHv6G`ex(;`vi&&lCe; zO@|NW{Y)F|;#2CrpG!q%*MwPccdSTrdgpjudS!goM_Dt%ix+r^$Mo}@m9;Q&I8o%D zQuc&m6xm5im$ZAh|B&8q4*g~MK;JOl5hynI$!DF7S`n~|joM8??F_iOMu5Ttk|qnK zZ2-b$fQR(QktaRi_01+Wc*t$v90;Q32%mIL@VAzg<4J^%F~IuF^6qQ{Y+O!H1KXk( z;;^0Sc9OXlwaXdUepk==$&D_8*`xg z-GWf`m*q$#<2k;qBKA) zfcw1~MAOpwx`8G0)0sf9)`gi8^Bd1#;@SrAmkiD)MSTN-#KNa7{=QSB21k22xE~w7 z++`KM*upl_oe}3>0j2zDHE$Zr0sFVR&^EtUdN6XJ&2pU0$u4O)oqnHexkyQbQjor& zKY3o&0>V;1o}zn!E1P2-H$G~W^KQ5??*gEM>GrJ^2x$!sv9&nK z{Qxp*+Q-|+(a+UU3USOzTVZxK<{FzFrgEW{g*k1>ryO%YT|b@o-i;1j&&~Pi*OBly z55h-rReJ*Y%GLo(rw?l|v?AGYAqY;VzU6{J@x@Ds1ac`QMd4AR+oC4Pp zX%y*6CiWiLpUy`8CLNRmvD!Uk)Q#yLL}T33p5F)^$A^t~JEnLVa`4Uq7HQ{Y`$nkh9Vu;cD7gZe)283;@0L zSz@rm^X53a!@jyJtl`HFfVq}qqfLVb`g$4$*S8&VkJX3LHw=^%&OBIGI$4-g&7K*&pbx;B7dn|N@ zsPRqS3#OS_Akn4-kny$(+JbLCo*F1|YVlmRrrFS()dSO5m-T;J!yLu!6qQglvqH@L zr#lFGv@ob9(80*{vVnSX>BCaZ1eMUYl!}i({!h{G@yHP-pj_&r+OkFv^z(T6gA~+g3gG z$*W_Ky3~~ceU<)9(oi^SnoD!e;QBO;y4I=r=a%n3AxG|t^+N>SJ$|qE9lY^^1ID-8 z^tzJ%U@K?qS$1EVkllBfl0OmEKFWZl5o-ZcoQ?H)y%P(N^5D?Mc|8kW8me?BtK#lS zo9SOhhKI(umS<*C(uFohv)1i()c%U{LaFV(f4NS{Z&)_}z2vFz#-$KZ@fGmr27yyv zgf;MOzwM54M-57>{Rxrf;*l&gq0hyjfPC!|n_*bFWL;q@G3z-`z8_ zw~Uh@`bg#Hsec3&Hh zGCBG=DZ)zQM`?siNWrs5CQDTHO#U6%{l%UWRq4SM{XB4#zR-Pamuz0>h{(*y z$mk@BZW1o1OX1-|c~GW}Nt1^Q^7;pq;ZL(PdUBngWJX2|Qp{SnPV^*mn!$`)OC0VD z_KQ(kTxkOAKE2R*Kr3*RnHIIp-ZpQ@pqkh2xDhr`B|@)qO6;cAZjTx?S2-QjM3wO^8tqG~o?!ut?H1+n5yv~U5m&xh!hb!vV zd)uz&dA;2dXoa2FBUM69PL`zB_J#Hb80}LU!_Ilu7;kLG%R_Np8Rf!-PT0AcZaMod zH#>BMF!bYVTySRXE<=9a=Xr^CuC@Q-azDa5s{DXFG?K|4a`ba!naip_@OXe= z=2>dEvZ0Zj!B|iBPMqc@`@{oY4k4OJ5XYpkp@%i**qWZ$GSk@5isPr;Cw9w2OGtV| zE#i7KfPO43CBy%8YOv7w!t^yfNP4)u8p|sd+Jk_9k>Nq{E9IPy+)@Ca2i*QN0z+QL zeq4!QCqvTLXS1rE9sTqH}6gS%t|NUXwTquR9D~V;>Ix8w9 z%&)xtCJ8luvYaW-+>QVSxUvniVwPo%H}vA{t(MDK2j^K&(;8u;ZtE5X2I;Z@{hW>U zwOw9+NRuqN6*a~q^%Bgk3i3S@_HyZk)2}>K&#W}S)n8<`30oA}@1km~>`r#r+UF1m zlg;0~Us!PkI7_z?P3<^s(|iX_?s&v)SA}03+ozE%@#LnOO*1ve{d6Ohr`a>pJG9ys z_>T-CzI4BDYlW6+AG1t{a~vg0L`3LrX?yAuv4+N8u?`@mPXUsfgb@->E7OmWO}nD| zd;~L3elRFoqS@5+dU!x$2rrV&9zFOK1=&1mr?fcJ}tVqT5pow>QL0FaBKWAZfoB^Bxyz`<(c*a+Avw| z*tmfo6Y?Jpb09a$u%u1PCh$qHXInVS+c16_aM{c)G^xuc$FF!Moz2Mp_hNb<$KGzV zqPAF%{$T_eL2uk-k8mjBoX<$svct(719Vy5Ua9DHpIFCBr)(*$0_neB{~Ng|)Yih+ z#6!i8-Z#Cq%=jv|j4-mfq(Fnj>QBptFQUWR7P?{s5!J~4cz*kOPm_I?as1@~q!B_V zJKxApht-NKWnG9^8X{-7edIQaf!{_#j%%`#3U`zazfl=qOHJ)T)R|P*k-IZ9m&F;e zFySo4!~vwf9J^2>3fz|g-GaPuu)nw^EQi7HbVdSmGOM3xKEQd=KbGll3d{2Cld)#u zH_Jp)jxiNMctZwh^zHXQ-A6x64f7CHEOZp4j#H@RY-uT7O9-{>Ita;a^-KBc{pGm^ zeMB%5y6K~p>9F2?`XZ(%#L;J`d7c9g)v1+jR_{#yysARF&rfq!`>oUf`#6Tx`f`C| z=-GsW!LVavC-%r@>Om9ZobYgX0I}N(iT?LG4_dy^K_OP6l8{#}cac`|Z9sAS5q-$# z<;!o&3B|hy#6~AU`(U8WnT@kNw}bla$Dm|FNAk+`jCJCVKKX6P$Qemm`WdHeoX^OL zAH(k%Rp*=b`X z5;EkSCn-F`fw-(HNJ|iZ!wq2X~1vowVpu3hZi~)8)7E zr>FYCe$VNo#w-t9S6is!OxBa~MM=J&W9S2}p2}EnJ-zwXsAuH86;!xYmuJZma=e?E zWRb^QsGXjw7#O*isBYOs&vg65YtKiQwteJLwcNBW`cu#C+cdLfcP`Jjg>e(-A5QXR zsOj0s9cJF!P7=Y-DK-6v4!w$itC3AXiP8W7$wXY&!j_M+K(x`+96w@^gCYb?zt3Xk zKsCt^fo8dg+Bo0R0ZzCj6n7`mcro0}N<;E($@1A}7OEQQ-GlAww?7^Kpl59vH(Np+ z&Q-e*Kg<&U@Zyr^+Uqv`YshPU8A`?Ucr2sAv^%jUy0)RKMb0Uqk1IW~dgetJWg+s3 z=R^{c^B{-}3moJC0@o)`%78zczw8vOVjJvEEKy=^ZTF;*#Q@*kpAmoyWR>Qz48>L! z>hkwMu`k*RF|}{t`LIvq7R~N>eLLgQRDhNBD9hIVOGgr4G%Q{w(T9I{5jll13+_zC z*_zghwKjuD`x~|T_vFj*tMFCMVMpIYZ^kT{m?n2PWOdiO2ZEov&?Ld= zCs_>7G33wvcvi=}$#4`AP-kgnuqImr@_-(@wA|7Ik(I{mUgoVsOftgf6E`*ADR~go zkKAx*n_35X#ZMhR*0@W0kbj`pd4ntPM!EfCN3W`3bNTBf$%AUtW?c8losIcK3+`tD zo>6Tq<}Lf?u;)|jo4MQg-##>d&YO69jn+nX@ZFx`P2ybqY=q~0ORavS)bZcupGxp$ z6IY9JUg2LQI7U8Zy6&bHq&cmQgoHGW!#=VrOGSjBNW(q>Yb2(kOL_k2RKoYBW2@X>NIkPHVH+Zbyo>t=A9~7PC73;w=Hr9C;J84r> zd)|rb=R6oFwW-xjE`1f1N-;_~FShaLhOo|;M8o~2hkLbq_|e6grqsh{ znRal^C;1WWgPcTa;5z=C%yn{~vJaZ;BHffv#g+{7T>bDq*~|@9ncFCQ(Eq#Ho_ZAwDu_Aqa&h>T-nb{Y4a!bz=RsPIm9U?aRWYv z{E=L1>Vfl{A890py2V;}t~WL|lD=YB6z{`1(ig>o^eW+C;kevKZ4?G6xsaHAJ-<~Ulcj@2lkF`b2G&zlu<+&6Y=W|y|p|%YPc;% z0CWT=_R1Dy-YNOTgfc*Y7jatBn)@~?gDR=&`Lo8*2c`A5rLta1 z0%u${79pmQ$F7?^!M&6mKg)Q(nGkihu<}d3LAFh8i|T?LQAqk`f^z@u>c$2lmTRon z2ETkZDXOlm*!H1iAYivEbKQos*zGLCZNI)jRmjgf8kK?-@7MC6(i!$Z4LKOu1ta71 zFWZvWH{f^7igz&5;50MMSEHi`f#JqNV76rtP>Y~WuKiQ}x}uz-@gBdM(-|Y7C65>Z zBd~P)3L2$zBR$UNAC27w1t=aQQaN3D*S)0s8N&O~5SQ<+)#TQKK3!==`011XJnt>x zwDFYgW419lq&%=}{ju3O&J-o_PTBcLi~G#OSLq%rIJcpyNX_-If87&i^e10?v&f)r zWu)1OkRQp2$Ft}Ag)k`DEY>5X<8qQUeqORiD1U$ZP%}jwveb%d*)~Yo_>eGyIDKf;!HU0*nHixiSDIyZxA_^QaVN->JnjWSvp+XKHJ6mxY5)`?J3oZNuzPZB z%|SsyrbF;!T~L<*=IrQCDsI~lWeO=V%h#Iw2Hi$wK(c1_->M|a=lPpxsM`ejq|(0f zM0JKDWKxnTuuQPbXsRTHw+%11NA9k-T;b(1Ex*3M3x}Gd%x6v~`r=$MXwG7w{5@JN z%cAw|PAJpl9Zbkx%E&2VwiV;-5IK=OJ#BW@>&2F66KQ$MHm$-JT`X4T!C^N5SmRdW zydR17X=Mm^{g)54`o}YtlSZF2OK3(hwAjF@(x=Jnx(q-Q<>7JY;(E2?GxsC16$O7? zl_aN%Fo4KIox3aM${;Z+12B7Eb!ruLg?1(7Ef2rV`f0o`qCIZ|4$?Y( z^!eN6hfOz9UD$6dHkOTDDd%^1HM16b=F3f!K3^V;MiA$ENAVZO-NwLv4xsXd3`Kpi ztl9k8$gtG6b`xAZHOm>o9TNrzrCWr`B%!U*OUa@VV8lrnds*(2g3TRjLmJAjD(&(i zeh+iy`s1gZHc*iNgZs3SAiXU=Ytte#xCPupl4owg8Ml3MusMlihcJ;Jcokx2VKYRy zAg+AYy0oQj-zoD6nmX^%s8Qq6fQhLh^{Z85{`0n>_xWU^==MQxQXZ_iA&tlT`J-X2 z1Gr8GiMLpu5F}RvQ}*EIecIU$F)tj%*t3jiXGR~C$*@miI{l?q%w1dSk#tYVCSs-k zb3z}?SL&IuCw8jpY787qRk(O$x=*Hg_n1gmNQe8}JLZ$xn#7bF=k)1Dy?ueTHouWk zHkDmKb*Z5W+cQiejD%L8`zl_4ZvB+ z?pE!*?#?eZ>6JqtMIPNy+jgIfxuCKiZbv^0DUT0o5NV}1Hv$z#9|=t}f$7jDBMA2Q zW%0$em}1_tWV@o^jh|nb%}{;NI!wlqJT56`Wx_dd4rov%975^aUfb#Rs_qc-I%*Q5 zKMjN8R)&5yw`R85; zO`eop{SFHxdpUn*3qJKmih9-nv+cWV*WgJ%U1^J+w!2_eA3!9O(25L>4tX1a05eDP zkjvI&b9a}(4nWER15Tr%@dcy-;ZgYmGfb~BBdlb}%za`UFnnw){4cBU>Cyw>Gf;Z) z_^TgEwWbYDDO9;lhfx`{&s#TpimB!A_6(AFv_&hVzJccR%2>#E$$dBX@BL1&9IW?U zawn&l$xLkh|+E#LZR+i_}nV8sZMKKv( zqz}5&L5wtu#<>hd8X;Zw;gITz$B#SfDt)q}kdQDNj|yyOj`P?_`^5Bw=_ln-dIoRY zN<-Z`7bD?rzD7UUd^OqY#tnfLZo~;mKaD%&&Ea_r9yjqr%gh|!{Z7#_9wDc|)X?a% zsdRmA+y5jvP0?w3C^S$n5#Y4pfxUY?d{xGw0hOWPUSt;wd0jO;-dyhUeifCk@EejWXJfjN7SdI{~2AkH){jOk4^S& z_y@Jvck9n9ragaOJ%H3G4(F)VoJMgip{D05At$tuFby7w>YSrvZFD}) z&}terh&B0_Bc9NCW;!6v?YzC_!8EoIkx6R~f#eg`K21(BvC!+kunRl_EFzkNQ#lN4 z2Dz~06~oA=m4wNJBN%x|CM~-5(P2#yUtm6Auy;iPu0tOG=9xgRHp&V-C1`C9ZkSgG zCwBHUEi5zN1$Wa}b9yifUyTHcPs8hOro-}A=#HS~UTxTEe+MszftTIHlm3)>r3biO z_Nm#PUYOF36z;XUq;}$2-_jcoU@@f(3(d09+!l)Y8h8WR)J5DVbG#;9mYc2O(k53s zsD-#CyhQ&DA~p&S1j)LP)mb}KMh1=aQts|4R<&{3E3w-1pAxnDA+aTlz_B0!r+G-&s@Dn~!L~EexinI6m|p11$u)g*ggflC1?fzu zp4rqt_N3}#@T|>SNvV|8dQwUF zZqug?w-=3%OUN+30N50u`2G6W0iLjy0A?)BaoAHeUAaU=8$tgI4&RUDY~2xb#|Y_$ z8n<%lN4>}Ho%|F44$3Gp#FU&vIissVJ#n9ZAaP!(#o33HwebOt2Ts#3(j&$OR<)bI z2Wy^Q_Zd%|PreOIDarCItdV}ss$)PaUn@BC_*swA?K@L+ceb~#C*sdJC0AC?IUkPN zs?XpWIa0!=x)Van68L3H0O&&$G_hNmKN?ul#DE82OH0dgl^69i{ucb-ss{Ogy%@38 zKK|p8EIYXpMWA7q0m|NF=c>QrN325sjkU=js%u&f-WtNu6wo^Yda z1#&7^_U@=)m9~>`h$iea_x^-3D)|OeDDi^S;6Lb0)CyCoLerFK0NRCi(53qMykVb9 zO71}^phQ+IDVXUB8VBtUIK!RB))|D6Cb6W+Re(}5DR-uRNWlU*A}U&70Mvf}ad1Rr zfZ|*15$5@uM~?jYXqxQLb8e~7Oh6b6k**vb{&D071vQ5&L*E9rnVG4IJtZ1K;7hg+ zPOJ2&Lk7{R*GG;VZHL55G`N6L>b2NnuPpn&-cp@h2^I=4pC2d=_Y|py0+B=+COV8z zlY-MXkLa!J|63+cIP9;;0#_f-p&2w?bkWZ!6fg#Q{U{VTbvM)P;B+TxtXg)cpq+&{`o%moNK>*o7T!#Nj_uIRZU@53`vL+ZDl!~I2Vl8 zBiad^dC_z`$yo4sPFO52W163{jW=3_9VBg^vM&k61FNi z_ti&}5rG^dEp44u$m`$^yp!@u8MmV&@P>!q?5tqNys$`bapx_yn}~-+mzHx9ToD=? zKeT7Q^hF*oW?7XHVNPH4r6h%pM6{$=WO0k*=dxc6dQhepcR-7N=m|11qbiQx*gUDAALxp4tEMsUjy4`g>$PLA6 zg8b)rD*%^)IyaBm54DntWmeF3R+N5lN_l9JHO`l3lZ(B?nFgGRtqiWzuRi?ukt4c* zSrVX?`uCsXj34*Mc`#Si^@Qjl1M?Zcq#9dR_T-7m%Bfn#m!Nj?HcwxaTfHPZLDDz% z>t`MUM@r;y9d3j_FrSa3pwAA6GrHOZ+ewH?M%ozKmL`~OqX7Y?TKXcj=3CNdET!pG zZ*N8FXAD>(s4p`x)q2a%G3;-C7Z%!iiQzRyro~1@0vHOhU}1G$=-~ERcFHqk6Ph1@PGam-jzB-e z2yhgGc_=^tIXdd%;xRh9_vDFUbW~Xd4p17j0#FrzL+ey^9*8lORp-G05qi>kkYA(8 zTc6qa`!h~SUXw>Fn%jI2YU45#p~z@mFlyGlH2ZA*n?Q(3x%ff5)1BPs8VJ8 zVo~r}x3kr+f<`hVH86FjBiRsYK-(@ghU(ifAf<=0!$zsW<;?f3AOF`Rc$EK155mc6 zH8nln=rGv=x)iT=+&*~D>8R&Sr-^@N7*KMyzuc6Ss`HG3{b}f~6k>I8JQ56qySj67 z3G-ysMaI^g*#my*vTV!IujekO2i>pJ z9!}JK(Q+qI*!&njw%j7X=F*F;B})|#a}_*^rpo+y;(SVTFwl7?nkR?&ZgRUJf71W* zx@&t=ziq@^s_MBUD37gbwreQwTEV0V@MkY^I*9Nf*T(-UeV23E^cJT}f%@*BHx5*& zf5LaVoi%Pvj)cW>jLd>u_DV|$z)x=OL9VQ1ONshl!|>nt@VT{sV0Uwu_Nr%+sh+a# zptm{ntSwLgfA$Lr+L==wII-vSes}Ca@pjj(H=6I;n&+}(*=rxVsx}(T{Zh-#rd|J~ zqO5Ut!0w4o?pY@i6KG1uEX@??og}Z}VW(KYf!0`!+4)t6e>=0aF!Fr(dC-2Y+l?KD zocj7<+DRl?AnvuVTO*M`K0_X7ETgE~)(ny@x!RxrI{(UrnT{Wyomb!(GSYcD_D!bb z(d@QPg??`?yZC@(`Kw`gjWAIM?6(?J8}4_etE47?c3oiJI@VT@JxbrNg2G*}riRa6 z#P4ub5YHYew7JLadVR{nEy+P@hyA4+wI@p$9(LsPQp6o25*^S~`w4 z!B>`e0ex%w4G&TJ)T*)Ls)SK=vn?JQjDCfRQXv2lY$JI(zE|_ipC2JJgN2dmWYpe1 z)_*be=0B1ghO?i}f*{}gOn0lgdwG=MrPmm^6r*)T$wK(&kncZ8&zAtGF#Y>a@6X&Z z^NaKx`-)8pR_#MF66h-eDL*I*z*a409VW#t({kbygP>eWq#0&^;IV9Rx3qj{rG5WJ z-6!^mI>s(vF9)e<^>K2b^_{{VXan;o@1KL_vruN5{WqyGva+UB@m^W=HenmSVRn?0 zRWhagj$0PmyuSGxuIb*@G`OGMBXW|(bCTcSN?QP>D$-r=*^6=jRD~=0E6Z}1n;~j) zw$*gCgG|Zj%Zb09zTx!EC%pSh*%;!rU9c|GaO}nyV_US$v}U~xso>0zcO{E-Ojo#R z_Iw4I@EQo-56-uqS-08sp4KOQSif@p$wGSYoGa#7nBeGAM7?kL>C2X6o4&DuQ&C_T%m0(6a5-k6Fxqlz1-MHo+)o`eU_>hkN(i-k{ z>xQqnV?@K)i1Lfw%->gz(ll17x0Gi|wS5FLdeG~{#QmkK(CN2%>9BLKruc2fYC6}_B`2b6+wr0&G*B2rK{=~R7udx zt27S|W!qChL%Kb^bTO^re}ldM5(_?uz6g9oklu6Z5f7*FGmkjb?n1kUVFC0e{a)?r z)CQ|*JTWV`RFE0&JrWfkH=-e*Rm+iL+|f(o(lCdxM+va&`GE+ zQ42|PVPT&*>38ZX`{H4^;d=?h6o3LVqsv4*7%J#jsu_J-x7NddYiY^W#@0ONs}x!u z_bj|PVRBbeSMtJiE5|IaCiB7#Pl5uAz!EmcS{I{Ld+?~bVN~d=V zE2%_Q5veV%?=GY6PB#%7Sq9^zy(7i0F)Ps2NTYFymD4AtYWEX1N6BP45#PwMQ%=9J zvqXg}Zi0+S^6VY>y{*H6b-44fwgb@Jhs|79Fky0W{on^(NlS$Do4T+Se7KZ(wfctA zV$C3E#{q@)I$7#S1;9 ze`4a)W<7sqt@-tmj2ABhWO&|zh%*TjJzb3?YtcZwA7$$X2m;Rs7HUa=EbpQRFL z6(CR5t6GW>UVDm?@UK3c>wDkO5bAd~cWS;B8cKiP@VZnLTLjjKztA`*{i`-OH-)r+ z0ih_+P9@sgzL8tKyT5!@z+T#3dk|oMDl?3;70*xd;`+yMuS9Rr$`QBrMhZc`pomUs zEn$bCUkmoJJIpu>$KAl`4qe+0qvAbd*Wm19?jDo63=+mPMvNg?fs3h{`QSa;FAkvS zy^>m|q)q$^Wjr+cMN4udi9NGnzBo-yQ6beo%*SY0p@Ye=<8M4kp#%57c{dc+Nm@s$ z!Az`lS_4V@kyo@Tn!hjKS((DTn)rk{UghKnc)oCzKI(MQwvLX4I_-gc_8@CyVZX0! zP0*3qB|dxpV6O$XK-}7Ep5G4B(g`AEX#B)k*M~J`tmE(+wL&{()@3`e4S+eooi-o^ z_YZojjolo=Uho33wK{^?rF}y!zGONI{jc=XANg}Ok;zdNZ+bCBoCmEX+rH~L9ecwD zS-2B=u07^U3yYwiiP#@z!lgdJx84u3TPv8kIyiP?XHM&oEqq@}NtWg8Y|k8^8sE~y zlCw#7Dv8wtD}q+;h0$S(bc+C?5{o*QhO#OqJ&N;&%*r#XGP*FB9V_B0%Dh&Jh)HY* zg!<#1?-zJ|cR3 z?HM_@ibx>M4kscgqS>PynMPb7d`1lA`Q*D5n=)YbSGoFOUkoh*tk)3J?(sg=%JJ^B zkqu7-sV$HZ(?%>lKa=EZ+~>k+Q!jjG188{bt*k<&l>j*e)N934{!}!)@W!BP-n&NS zD-Pd#IGPopW5;ca=}yvXTKE4S%)R+H+j-;v-RqibI@io}xjKrf?c16%swisTu9+^{ z3Z@jbrj1&&5Nb<;Yc4ajwKA<*W0_V_YZ^olk&hB75h)=dAxi8KM2Lh$@Avoq{&fEV z_c>oD&T+yy$a&?pJYUb}<2m~Hy3moh1fM2nWGjcU`F%pukm2P^_u@A-)hqH3s@JR3 z*GRfg6>%&BW~_p)P4h7#uAD7-h6}QXlt!NFFmAuWBH1!tLa{nY(jlz<+Dct8Hgs#T z)`{?%7R`*zcu8^oSoaFVK7Jx0=9b5^N-Lh>WUa%^*1!meF&Z|U=(Qo;jR^Jf+QL2M zPV>_pFZ@YcK_6dc%^vEX2i*P0uo9`2v!hy&sB5N=Dldv&`5Qh0unu2j@&ocy8uC+? z3;UQyM%~!Z@-40EYFbn{9ds}QPjtxevmtn`Ccl8`1X!=Gk2P38D2d)fW-#MqkfAfC+FNiRb=+NpN_Swp=bgGl@ zQdK}gEZ_2saVjS{wA0zHfnBF!s~BU>skDW8hbrBjM;u0$MhHwh=v=hDc^#p#QUPx! z+BMq0U!qq5q-!tOecIgF@H|xJnydamTqlZLoqDB*;noNiKxh1D~G#W)deA>--C4ni5?^ zO>d3_4=rsUyb>_5SfYQxXE;0dZ|z7=hi`Nc0ii!(S=S`V#$S%5N#3S+C%81gkuxn> z_nxe1SC6Hjio$Z2-uqE~+pwqLJS0%rz}OfW9eq0rs@O$(y~1!$9Nn5ZupdAr;Hk8& zxE|TjoL~6oUxtw%(Ip>Ucx8Rj|1&P_9z5find9;52;G z+*6j+y!NeYSyja+g7@38|73O2*o0k?ywPTD?b)o(O&r8Uk355H|0pc02?3xRg9oY( z=Of(S=@!(i1sj#-JnrPO^mi~LXdzyG& zwE4}LQn~*tB0=}wFf>tp3%U^%MihQ+YY?RKh!#2nOvuErv#i7AS!JD+zV=TS`*fQF zHBRNvTbuHYp8ZH+vL}8zdB&5h<~e0O6H2{k*2Xz65azF#er5VDGGd4l8f1QXrh8#= z{$7&04UA8M?5W>w`LG9`%&%QdZ(i&DK6i3{Cno*?mD;g_4uZO%9@?k;usp#` zEgg!+r3ebFOYn5WIxy)1I+9B|b@AZKu~Y)m`6zw%2;%xAeM_jykp1#3Usc_+U&TQu zZ7I>FD+{)LD(g+AsB^DHIFh8Hcl@^osQt*LQ7ZHE`&PXBNchgxOJgs($~iV@e<3@< zw4v!9WW>E_Gfg>}v}B!D?(ITCVOgle!8mle#wjb8P<&UbKfJB5g0^Y2JN`X$XOR)4;M;VJ1Uh;< z-teQ;t@Nl0i)YSPT3r|Sj*q=BHVo+p`hCgkDY!0e&fCXk!bB#{I4d(L@zCbtG{ti9 zK~iHu(nyr7k-|(2BE;mUyuk(4b)A^Of88ICR;PoMS?YAeO6_@GXCn^kqk$phn?re> z${mn*2W6ROSZx@;Osh)lMV6=+Zc@sg3^n{n9&@ciI!GSAzPQS?+>l@3fES-Onu8D;A-y zo*0eKFER}Y3Y%KAbp#zw&~e92p(&hwW=8TUldQke^zimHmQP}=0pk0*Hw8EyZ+V;; z_OMC0F&7rm(O1`OrDT9l!Ah%pI3){6!T3{wwhZ|&xDJnBvgvtsh+L?9tIFYN;8zkJ4uJ*Qzd$L{RI&96m z%AG*SR2OB%+6;o1EW&ER@m=t|E1{N$Jfo&EZ4QK@UAjP zun29=3d!h9&--$$u=8Z_b5ZI}rR*f(P}E@C-|?ddqh<7ISh#+vzXId{B{Vm2)8oa2P_-j!O1qYx8#{ z^kUP6Ua&_UroGoZ-o&~W#A%kyQYUf09&4mMh~x#K_$hILhI98m@*~ml28Jm_BaLR`{3!yxtN0TBrA1i(-ci;~ ziBpp#O&|A4P+QUJgMKl`=db`(1AbQaq#h3pV33anZX-0pGKgsWpgBU8nWy{rB)gQN zRxQl^@0DDS(&?YBZuufwjJrJQy_+9&`F1zdHl*NlO;*b60l5<>Ed>-;{ZMH?QpRC!O(`vBG zCtD8O9goFR&Gq%1bw3~KWsuncy+b3uJYQLwBXH+Z$(25#3q7jw4Yc%v!PECSuBP%H zvAzE25ww(=N9(N0RAls%<-6u@TS$G9HkRM>PRxGG^ zKHJ%T^&m0N>pFI<&U6A(W18mSR7{ME zS=bV@BV+Z<_Xnef${=M2^2oCr%y{_*q&&lp1yWftxT#4bTU*n?xZo!PaPfG1`83|b zw%ma;GB6{Y}l>3dAi%B&K||SZNhk@y25>V-HG_@ z1cU}x=<~je=FA{BGt>IowC4>=<X?;?nB= zx6S{(D^%2iv@*g<#57b@^V`=R zGc+Us&=3;pK0bFcBoZJHU^nSoA>7Ehc)dSFjEO)>tQz6-<@JsBJ1Xw?puX^hhm8~K zQwCFvRV`3NWQnE>RTC!tp@DRfT9fyud~?keY(Lt(XOgofc6PBk?GfLFq=nhEjKohl zB7F#ir+f?YuB_LT_n5xv?>{IPDZ+?vSmxd+3)&O=r6X8IF~IdlU~4*IkUJFBXS<4Yf?(1Bb@5mh5S$l_H2 z;>UAHAO;duhadklepr!aQ399zA zIbWMO0vc8bjY-fQYo{xSNa1HNeQ;$*0qUrSq1fwQp+EotT%&89-|aBF=G3x$!d~X+ zQEN;nc9CJ6T=h5or9M6oT);9x&_QAvJidzZ`V^u`hsNvG?43L!K`u@Tuk9?+@B$Mx zjGZJ#1Wd4LT~#_bJ9uMmn?*n~I(2S5x)&+ekQsutCTF#}5V}^=T><_JqU{Z!Z{_z9 zSo}JX{;!1_jXh19sHBLc!^w=UxCa4$c0}(5bwx~`O}~`8E{)gqm%m&E1=y!ok9}I{ z#8|j*2omi=o}HH;9;No|DpzBn@_{3mg0M767Z`FX*{A)AJr2I%*hde>1(C~bjb6e- zP=hSfOhcM7It_@6gDjqtbVF6JLP?%aeu3}_pL_le?7=!_=8+$@5!lpmsMz)#azu<*~6-y`20a z&g~{}r2la==Y_@X4p1WT4Z$ipcOOumBOt(KjnrD>=)0ILM2ryUVJ%B|RD-v$DHHZ^ z+7M%B=Gp=OA)mT-VB;=uInmw!P`ZyJe^Y0xV)#!v{=Kr7hwe`i>lXV}anr&kyIg9g zlHnpGHaiO+Q~Es#sgS2!iO|q##%0e)3*U@_FZ}(Rm82`7HORT_(b%AOsN(!(d9Q22 z@!#Ve%1>d>)OY2*TvT8%ExpD1^#x`g%_Hfv@4+r08NE@nDz^7B_(%3BkAg+#?-ttP z(i}g=Df2gLJ=WOM%loMw&x5;llC{%a%|-=GBpd8^Km7$9YTIjLcG})G9TBpGC-I5DthAi@A9Rft`@o%R}Wy{9J?s`RknAj?6cA#_L zU=fO~{dPx%kGzwfQZ!n_uW)ROAi4ZD7vDh?CBov7r6=?5@P34BE)m`vh7*v4F`E;| z8OKirBEB)zRzJV&Ql2&v3Rx`GL{2;P2*>aNR*5o?-tXU8TkoQZub=F=$RqaZhFz&Fd4w5FG&A_y zcTBQv#A9hdPI(Ynp<{Mh>wIXCsd=7%OF-ri0D)0BRKP6ZwwTqdyO_U~du*ahSQ}BR z5GgfkX9#zx)+7u3waY%UOnR0MCZ+DQ)1c6s0sj*hjP;J^VQe+C1pJwyvrQm5Tf~$62cN&zEZVyB(FSJ@d@;|=xgCs@e%iVM1u)I5D;x+EK%>!|~ z!!vggLE!6VpeJG_bJV?@DBn=5kh(DE&)+LPX&&ei?*`*epE#;GaQo!I+Y?oSU5$sA z`&QEKh6`x!{1vGvI!+QYVh4#Z4kqIgu$LN_)I6p67KLD4R~;8VMH?cQZh{1kuFbH( zmg}wE`VSeA)sM{*+n*g-9_O2Q9o2VsC!athXlEB#KEAS1UU^tQ%rMU;rDQoollT=G@|Va+n4E>=<38A*pGKs8;g6+1Iym z>~YBQp1+AQ-MBH=m_Sk6)2`T4%ULF+&Zb)(N4WmUndsArI9Y-6bm}xR6&I1U(Fst6 zTT~gZF#AZBF8#+|!fQLk?~5tTp4zq-a2m3fv}YZQRu7pdz8>g)lXo06hC`IJ@8>kv zQKPpGF6Sg)zN-0+geke+dieeKwq$ZLjLNPIUXQ5n~L z)Roy55z@qZxcp|x;@4JW3q&G^P0EA5W~OKFd2yJYPkDH+xWF^4L_eAZGf})bTBYxJ zM&CpG!8Qm6hehCS5>}ye8t!4lSeU#=!o4)K#(hiH1^-t$XGM0h_4tfaY}^QI8J&St zE!BYyQ_9cFkpm!btZDqXsYWvrJjf29#|Eg%d#MFbyj7|gPiTE%@&Y@Q1RvqPwS3X+ z{-$9=dU4qu4;Pg^_0C23czl!sXoyQsDIQP!<;C!Xgj^H(jM8TZ03XMQL{SnT!NU28PZ^Oe%{i2gBVX{hXl2hIx<#48O86{Nhe7Uc_+3*F=~!DXd- zcO!cCV*Bwf3@vT8NED(eKmB_rybkv&$ zs<8$MXp{RRj~&l3O23m+EOoA&qP^2KmFKTJE1f#17e1`+%>G;Z($ zD^4GlSAKu;8Hz{PT*5tW^1MTVTIepYh3?xZT)k@~9y5G>wa0Ldv|`&dffFRY>&S&W3D4wpHc5j$S1RfuO&I`fj&7g93%Sr^L6HBK@| z4i(MktQF3)m9gH_I|2+;9G<%_DQpjF_e)q0qotN)=h0pV%>6{w8FxB4#j8Qp_7~4| zgWH5l_^9dG|CZ?Ybiz9R-ie9WGcA*u4LD)eUQ|COq+UTFY^+XdTbzH~DYHn5ePk5e z1w%Qn6VvVplP$K^KLfkpsz}i`)bqjQ6s>Cb>L$QTDI|FB*MgF{9hm+8nB?-JX3=HF zq`n9KljFfYdx}Nwj}KjHPuRHWthAx=;-MRS_2_(VP3)bPz(@4p!gdg+Bd5u?VcGZL z|Bd(bfB)q2|1nh=Q^6T;Mymn!a4@53PowV5+_?GIUyd08JUai4F4t>w{HwcoIVxH8 zx5TjO?R}McoW8U&QWe|1xko*?wVbi6^gkf^4$2=NO-Giw?z8}0yPs!EHunw>uB_`T zFp&ogU-l|#H?J>aXwh}@@JgSwpN}(CYg!>Mncvp*ps05!r|KmW)J)l{Sr}hB3-Icg7=JDMR_3nrg9i z`-chFD7KyoyW z{m>i4y0drcG$ne%3WMZ}HH7VG4#f3#$(G88XCPdjQr=p4n`rwju00i;*%Tz~;e`R# zx=3n9mEPDKDMhSIH+B0M8Y}*O?t8getMsud$bB2!}G{}vn0+YO)|9gue-S}A6&>~!ybrT(P1@p2g?L2;BM0`o?~2aDNGzB zAgFxX=|}U-zGUz*{pqy~rJKx1Wn4#;N-R{`{zrdGGM1BzBmZ(8KkmBiYVhS)UVw&6 z0JY=Ny15+s^vkh#2MuAXb-O`hbDx29l1O(VXcD`o){wCx|8nfpUU9Yp|m{!c14F? z(c4o?vAF`P1FvPd$}zc$-9Aed|8xHt#f4tg1Ah}rZCu@c(wGKh`ySwuUO$R|kkVy; z-rsk=vzFOlc7$sRnMl^sfuvAI9lA8*5@K()_!(%UXkW=8Ya2RGS>Ai33xVPti>^c4 zAeRTYa2n3qgiLMIz$JBf;4@Ad%IYc%bd|Au)7Oard%1~c*LmtCyOc9_aC?rGsUIU` zV0FcfjsM-t7SCr+4@K3bbEMdxs?N(ex}DF1bu2St7+;RHGL8_VDS+Z029(ExmA?w0 z(*nI|)ihh6FG|tML-k^tK-`YaF<#0tb0pvDS0d-r!o257EBpP4qyQAoUv17jj4UAVT z@8{jbzP|(n2{rE%r^~s3paqBMB&ZOqr=USg$3Qrm2M%qx0;)YZwYC zG>nBHxDEJA9gB60-!#I1ZHX{kG4pa$S@YK`f9Y*V+>BaEw%3^p>0gTgh@Ck(NABoI zUGzc|M65nGp55Y%No?M_)8nIezHU;FI=Ln`-?v|F@}Wnsh8=kN$Eru_-Km`2S%(TB zU8eSi5lJ$!6^7eB=y(&;To5$KBi3zxMdoD4-*TzaP5q-6&m{4#iu^4lBUZ_*9CZb5 z#eorA2?Z*5V0(vms`jg%Qx)cb^L3}CEavpQ5Ac0ahAQji5&9*JwP5?@n9bU0g*J70 zFBJNj{V7csx7xeAT^9u#+pWM6J51}$o9^OD2v70JA7nOvWPY;IIgWP-uNn&A@2y+& z1O6Eod#CHqkq1mZC5Jv-{dLjuT%+XV`0US(6EjBd$~|jCRAyGkpW6sEzGdj7r<*4o zq7<^md`{0gY!v+c<6OUz$g_j)oOt1r1N{jnJ=WJFyRJqg58W2eLygH^P$6ya{tV{; z*7-j0$ok-!#RHF zoEYmKSZWMQe#?w?AK>f~BZ-YMyo=D7k)(DIfMXr#EjC*4l|vhmY3z;D_K8JF%+d!Z zaUIrXHs}1;7RdIx$tV9Ly@#D6znb*8ud+;m-B)JlOnN+F-_MO%&Xo(xQZrG-BjKMN zPB+*GYxX)n)A1a2hP|rf(1>kbwUa|?`Z!9$GTl`zbWB(I+HBR#O4DLe^0-s9v z3QQOu6Oj7zCB>#jyUMAxs6$ZN0wlxzKdLvC^ZcDO1$*}7jrHoi&8o>UwE44;yjHPK z!OXsCK@9h;*YMPW+hT;|>Hn<%3K4NlvIctm?U~hi@law3Ibu>v9{70|`ajZHH;gsa zh&XgK(n9Nv#d?9kK@g;{bnDu_6|i7qA`E`?*Dnu5av%cbjrc=*`(C5pTHO7wyZ=J2 z9Kd+<19kwghUpne?1{7Vz+|AT;1#WUc+6qlrUe2}4;_J5a6nZHP_8nXTaZ@3E8b2Y z0se&yG@@l-!vhcWGDK!nFp`GBOqhT7;ji5A@Ni#wfzkCbl|knCRnqd@N+rS_=cg7* zM_R%U8Vek}G{c9x;%|ybm&ZcQ^Csr0YANm4kla&5``Pkc+U;DnF3AqP8QyH7ul_ci zl~NN%gx+q3o;hDYylOwdnf5=AIUYR3;mylu_sPT(wZ_1&|L1HTIcZbbM z|5>P%qj-}KZOj!1fpd=hBi-M$+letnbWd<8Ei2x{x!SPzgtoRXJz6~1z5(gW$Y~n! zhD6ebJDM|22S=O~H1h?_yMh_8CWa@tr<_r=Li%j8kIv!CfM6kL03eb43@&gHPm_f+ zdYRKnS}*axOrTGPuTvbpUh{u@t3SE|TJ~{$D!Wr;+qqDl_Uvu8l`Q8|7~3N^fqXpF z%W0NkC_e1auby?TW(%sGESrMv*CMWCxl6V?v}jEhiJDK=GP)!R2@ib*k?Busay<|M<%=Z*s`rbM5sB(9sR455 z&8#{t^F6GqQLFxHlP?XhUepR>s4+_)Em{J`UGGNg8i+{F?6OqD@}$8~=r3iHL{Tmh z!qg7*C7QU{_O{rSr|g8funPu_H$8%4*PU1DDLS7Ov)!D-Dd-@K?;0hQ4n0M}L0$v2 zgg_#(@r;G!jPv1jjdW(#mt(#ZEO2Gq4eZl8(7%-{{ealZYSsEOfD=bPvz?~`>;0VK zyuREfke>uTI&=8dkv2SIcSAP4J$Im=3z)BgTH>`5!HGtM`M);SW5W}E8bzG_fKosgkx8y{G(-@MR)hu#RZ zVNX{2K(V{Hx^3v=-pf0$=693ecO*pOmtzrgkcrYmW-R91!sKBfWns+1O6{EiI`9eK zqRv9%{4MV(auLk!V~DUI%73eCi;m+v+HLt9NR%;w7g1>Gk)v z!JHUV?}mkj&kyYj?t6g0iCnu$?a-q%57HifzUS+j_Ai3WxXU-$ zOxs=0DJ3ywHlRmX1Kr$Mrh)kOTm0o|t4PWgG!P!Wb;hQ0SijLettI)LBHt^)bZ2R5 zZaSB_3>VMSil*K#)Me!Q=sEZi0tftiK(Z~XxeM~^tu~eQGFzOD*v-H|_r*~Y>J-H_ z&o+j1%RQK%1WF>b&4(iaJWnvF_Z!ncGts&4@Y@OsDDR0Ro!PK9cu+d9CUyRH;sD** zSfGOp3bI?C%<0g54oYHWx)@g;X;}zfShpw1aeinHCujeO<|QI6G3#%nx|dTsM`PT+ z3~di+!KuO9!2EC2?;_NLwKNXFB*JT%=h#H6Pd(^Y99BmXcR7MS=~f*H#GLVfDq(u%;UpFhRlN?_9$+x(jn6S)E;tuMYb{+n|b}X z_G3C?j5k(g7&TO|LRlu*RPIbr0no!3uyBbFzZ{cWYah)CWt-F5vM1zXSN#q&d$i5m zy{cwoHqi_Ifj(4-l3AT5#E_4ZYnRP_8JuZ&*RcpssbFYAEevywy9`HbvIv0q>efa( zUnsAcw}#Spx!!<47W`CqW(E=R40(2_IOvj5WT<(RQdR+*Y8^F6#_FSgOcD$E;nY(- z9W;_+^DEO8!>5Cl&chFftY9fp@5tk{M({G7nm^IJ5J{vouwr|dCI^oHrYC|4ht(}t z39!Dt=+K(e(J*PeW{!Nhe}P>o%qr& zyk|Rebe4c?+P3Mkba>iXQVs;3!(xTp<|>-c;~4)Y4UwYtM&B>vVP2*O z5F(0;2^|w$rC-2B*q8&Qo?50M!T0lII6s0#KvSRu{s*wB!acAn+_WLPb3* zR0Kr@Odx>)-~_KDZRUIVP!E4$??T4F_fm{Yv$wP-vrDr}aZ#`vNn3pC2wkEYv)rw+ zkzeUGSS+B#YyI@YqYpe}$enWT+c}aiIRFMiRE;I#r1O*hI>;pFrcFv2jT_<`YFC_J z2vzMhbP8$mWLBPeO^=IHax)%J9)U0c?g4UIf7E9 zALTh@9f7ruS|?M}G>%@RxGJ2o4yfTD6*WLmvxa(TRsrZr&i7Z9&KWn$Pb-DMEmv@? zvtH+yW4Dzorw{uyc-Qbu{b(eEqK^K=ayoo$=k5V>7IKKn^ub1%BH_Ju^3Z`YQ>bW?iJyQ?N%A zo+?tP>UF%Ew0n}t=VTne7Oi{c{ffbUvj4-{n7F1Gdsr`(aEphkPR$|pPki>I3-T_? z++m{cOH%%X2fi3FerXdm7AwHUm!7@Z;(%R68A-lQ+pM184E4q13VA)7^R%{R2dB!4 zb|LhVCHoS@I@ttP>S}~ye_gjjYkVyFZ^xED%4ip(F*@iH`Hb7~9oNTs8#XwYKLYnW z9|RPN9Xd$GY|0y8{3n-eooR%zenGkGngyT8O5Xqd+wC9c{%|-U7@mWSWLcUHHx1`p zwpLDRRu4T#Dt9vwcYMv8ctIV=(_lM#@$6)vA)_MSPzuk z6j)p%!vDW>LD2us<(F)o^c$Mc^~ky;iC9+51Rw()DXi6FHe>3YH z2LO+D(yxwL6Nh@5Q4As4pPEp%S)ZTd7(di6IQ;&?Q!X+9Qx5uvmZJ_M0Q#QrXKO0v z)fK0^JDOK`r4HdGei=XP2~4Gv#hI%VkLMm3rK`ILzWJDV?dp=SvnfbB02$VS=KAQq z9|QqKB6JM*nQyz0o=|5BslvLG9%4g{NGuLpu*;k9l+?z$U5#++;Vx8CMues zyDw6Z+?kR*!Q|UyfcBq$_u~KgaJ=C*aKnvv(e?K48PtqYfIeac5T=0INGdBs^tbtb--*V{5FD{);uMYFoD#@-H{! z{upq$D%`5xI1uEvI;bgXW>GhC5kQfs{49Bn$1^k{22bZ}-?&`_L zu5k)@KuAolHbe7Fmh?g$%g!|CN4QAT3e?{KN9zHl5_GE>mtWl)r5!p{y=j+IauR=! zxnw{m{UP?8ZQ9}iK={UJa?W*0t_JI?hzW>s|Doid8^Uq&(ODs;|iSJly&Tc`IZ>(9%&< zh!1FrtUxdKVqWF>8BR2}`sh4vVwy%#AQ4dKcjm5BHr>T@rM(<#M3;>NV=C3<1Lgdz zPH@-7(c;-;nPbOKz@76#_g2v0WK3E5dU_9c_h5T!Hq=bHQiD>u*f)hQIT-j~*O?nO z(d5lrJjyA>FJ}X~yOq9k-TaM+Md(1Ha;GSV_{5>nW%7+d5A$j~i4i51?&oF{@0%yA za9L_(u-7UJw&$d!-SQecZalHyob@$x=9%4WT1lbj$|V1fPKnUhw;8cW!NCcyM!{52 zkY)mkS@w=JP}Y*rLVeouuJ1#9$j_f&%$6rqa}tF{4!%>Y#xFD?)y^ z+(_>yY`j!!p*LM^KJ`Gso>n|JQ)}w%9^EW5y(|(h^{Kt=BqjtVB_`Dk8g*#%twm5) z4133eoZ9baj@M_?r3V?s2d@39t>u|50J?TXh80R(^ob1cHIcX^b) zz|+Vf*{$!0hD?U$<>wBjrSISR+~h?!G^$;=O)xXvv|FCZCT)Bq`X;s93kk6*&2D2KZ6M0TjUgeWsy&3J%25Dv72#{qq?(h{x$RAvl1(jm=A`$ zcrZQ2%MTQcF1Ostkx3z>Jt5;xug+wzPVw7K|9Xno@GjPCSJP@>xjgm#;&=;8qx2w+ zf<_Ye6J^nAdMT}Lb3OYtZ!Eo`FNy78=C@Ks)xA+l5q2-57y!vlP~7T-rjKM|M+3u4 zIjLP!Q%<+Z9P~u)PkE7h4<>x&s^}?dCPc$uGwB(?LXYw{Rt+v8Zt zF_33y2QCo;2v2W8l0ynP!}tMqzi82)D3NniYu3*ks$kuMzB-sa#S7a1m^h0I8us|G zvTdJT{8zYz77UiVFiK}-T`V(qE7Z8zScDJk@&bxfoVI75J2O4qe86b8FbzSa;Cv)! zx-VrY%SPwL5~yTLU!(a=hFAN3ldK(ds|LOfTisY@&-537p+T1jk$pvNppw?{2vUtG zDksk`Ob)C_P0R>Glv~Y8GK%%(*x9oEqqKgY%+R9J3@B5znEi6B6b^j0P1AwE4G%13 zW+>s6)M%?Csf6_9*rhG%kuTfhXQ01uWj6N9vG?;-R=h{4^46DQ%d;2095YB(3L5>% zCFSjyV5hwq#H~>c%v$G0dc>l=jU>VH0psf1#}BW6oJ5qoGzt?g61dAW0*WlTvUnkc zdb9h|gNEgWK_EZ8IPq*MwhgOm88P_`V8-iRVWR-!+=;+=AH9GYkvoqN#57kgEgQM@ z-cvUhLT|Hc^Eu_tD`^{b=212H+r)^;=30Oj1@McLJHY?I)E*qZJ#=q8 zSdQ2yB)j>;(D~$gU_ssS5Z4(Y42Mbw9@VRcrfVfe&<~F#vc~1|Qx^w4{qXYr%`u~p zg7`f$$JpE_O?MTM{Kv9A43kv%w~?4AF@jzAsVREC*8`@Na5I@`!F(b!E*ldTo40w8 zlkxEU$y_FBZNDMy(TAO$NUbz+eq`PhudhDcF+CD`$+*hYVxK)tO>5Gismi`WwVBS72j*e_rUzzf*o6B1Vd7QyHEAU0JgrMT za%W67^HksHRdLdmmK|!-Fz^1@#eaxeFM$8p%qU*83;k=}HX&mA(|nTMp`^=_i4Rs6 zv}~-f`=K}F3v_sJYIJ^w_zoi@JMR}?dG>tDtV`t6r9>ozJF{dh>m}Zm z^S8O0?5ZY;N05t&8QbgRE)R@t*?3Z7yy!ERan2Ze z%YBi{z|T3|gtXVfe1N!e9!_$SO)eOcRCs0Twjvd~jWvX#LY)8cL6gOyyqWgoTp=Ux z$6NN5Y^XP|pz+Y6=YRBv%ba@6!CXn|iREP5KXY>W9}%u@En1ca*Zy*|^F2~7w}8(U zSi-t&;q>R{oyo;`K}%lJYD0HtT}2CTnmf*6b&+s-9W5PKN~J4Il#rIEaoJ-BpqGIB z+M6%Jp}+y&1+Y5@&f+s&1eicxXFLoRIRtv}e*W#^5T?{ry#^Y%Uy1_==x(evfL4pF zy1N^i!L0hbqPLW9FMN*o5ed2r+W^K{;@Gn(+35ZR>B{mCI8H2>U|6o<^RV#gLUx&MG7o1aJl)Er<%Gbdl$bX2!1yH; z!B&gTX^vd5wR$IaQrWL2g&M?MBnQqUeGlUp8uh!RWwVO)Q>v;E3e(#vN8nJWUl!y3 z*|saL0xEVYdO=vaB7Bq_84$7Cb6Rul5biFpu*c|e|C<+FnWA)5XY?=FWZ(OV;_Cz& za{ui+8iw&gk0#o zc8M2}9H32Fib-k?t89MKyYHEZH7N$xgK7pmV)2O$CX&bSz@fX4eiDJx-i}~u%N+!6 z_nYm3t67WdV}fiB+df}wHvgtzx`SC~a{605R31fS4u|h_eLpdk^W9k}#@ClYLil@0 zjym$5Abt77v6x&@?Zl$(uAHLV;`Zkht-h`<({ONb5PcK5K+kQ12C}X6WAn%K%OW5q z09wu(FyONcNcbAyr$$FPF%SE*)FbwXUdnQ5&@*a+^z<+}Mt0coN)b|#y91`tOO-)r z6Sc~|X;`Ab;1TUc%VL9}5XILHi`cj#u0P9vGh3dPhBF8j>Vop4x-4fz)IuOJdTxz4 z#df{99U(IJ@2&#km6Q}Ftfy$uiS(8eW^|!4`gN8x8JlEn3|%P$0S#HXw0O7tiGya` z>AR>$>{)%xB*}n)y;W-Ahd%Ofy62c0VL*ZynLr2XaCA<*;t;`Ntfnc>Z(aDa@g|K4@JgZt%}CktM6 z^2@Q;a{P8WUeQ3L0%!MeWgW1cg(}53H_RYlScTH`w;7{fjvaI)`FN;~AC)@rmHHFl zqaP&j>b( zp$!MzBZYICN-kKHcuQA>JL=;|La^&*_$tRd?OXeGd$qIpzLweGdyeYdQfIC@VG`lx zDh8Kg6W(w8M`f|bRjW$IikEv@aeqvj!zun3(DA0dH1!^(b~Zf#jRbg=|qV@F_gde7t3 zXDE7&Rj-BuKSCnXPkCv(TuaN|{c^0n^QdXfOuP6K3)CAJcyO4~7*$?|>%7X=8|{su zGtJ%UC>q&A!YjRKNXogVg8o13y=yp|`P%nCYt5!>rY(=9sM@WmmT47Lwco9oZnU+V zR%;iVR+JJ1AtH7&(~Z3pwI`XOq)Mb|L_|cUCDN2oLPA265Zees2x6XV-S?~iaXjz; z_lrA64o42JuKcd+%60zE^ZWgL|AZz^dna_ou9<+VBw{wc7-H3!9ynnNYrkAQoyI((0n3=}w}u}&YJ8w*kT+o;#OhvkdGQE-^3QF;!GDG*uVEbOe|@c7+; zF{UPNLFHI-P32qH`IiVTM;+NKPB&X(3+q<&jrH421fVMsnumwISNDHB^6lP$88i)?1AoHm z?SpLAjqJ(|R_xRtuab2E#5GEqX^scdLW6aN)P<+P5({;`?rBpO2|qQ19y^U^_Jrdn z4i*Q>3VhS|eF@PYM(u~xcrXCd;5R`Gd3^L}IfMD}r^$Vn(7NV>4U-zrKcF7G2V)g= zL$*zquo3^dUYe1ieokNW_Y5QC<0I!Vje7=pbZ!EH=8#&oC(oN!3CiV!6pnSdB6j4) zW`V@Qvsd0ITA2%S_6#x z6zLy%UEBvhIngGpsU@7LBEjv&k|=|RJ7^9Kyy}L{O9&NN*RI7vv{kk{Aykjf8L;?z z9=qEtaCZ9hhU=`aTsgU#^<@tT+o@A9W3D6?EUgAm=+B~&nfQHQ=9 zkFftwx$h?1&{NhoxZr`d2ZF?!%AiU6})kPW;vl*d$iT^*q z&H!)p*B8L(6%*-xLZNn1f(L~f?50*Z*IVSM_M8?V2Jo^e7B-OPC z7mij2GHSg72cmuBZK)w43|5$AW@e!EtD_-Mmz+z!n)Sn53u_c6r)++0GcZ~2q~rs1 z>5;GX4aT!%_?xJ{K%$&k2%BSSU-DYIwbOR^d@LyFxMYbHq-RQFF>V4Z&m>v2=Y{y4 z?i)RB>~jV<9G|e)&!Q24I7&cgAvSUj1xtm-5*O7oy}bkOz^k|Sz#Y(DfVV1?|0Cti z+6J#2KnaV&Ps0wWcx(VOHYnvS7@qc3j&*adNmFHgluL;@|D69kA4zdf zbSpOVz3a|cv!kZoYg2x??SQpzx3YH|b=QR+A*a-EnUsMIs<)=(CM(v(`$D)G`wP0*g>^K&yz0q+h!&U29&9DQsF)UA45av~9;VFd*ULODkdg_UNt* zkJR~b)^GcMo5B0)zi}*MD%*k&fgBsJ(z6_=kSwhIN7_A9UTfefW5R9Tr!@Zq2i z%#?HY=vGumv(0tGudhmnd|SqfMQDrLE~f4uLt%`=XxM2fk<(pB{&5Ry!10+ge9>O! zFlJQ<=v&!K+ERia}%mtUV@F)P<~AX?9Q} z*&bH=>L2wWUe`mAYYFT+!xM;JIa;>aQ|r_{JeE!#tNjC}<&!WCk~^d5zEA5SPA_I}u8DWF6nTcZF5gj({2UJ(j7y`dYKsC=JRM*^ zSsNSBPDVh!Uf(C?UJ9)#@^Uf%2g}QBs;iz3SARN}8J2Jman3d()K)2pVZGCmV=qAF zTW>P8jmWtkb+kH;+f}c{O3WE&X@OKYI-F``>=&}!kBkTr3@`VvCQaAw%|YrP3`V4| zyzRN97H>^-nRRC47f8w$rVZy=|az!jy7y$y%oZZewjFlpq#MU>(@K@B*@e z=-sca>$b)e%3SK12&iz1HKYH&nzTK1Qi;0FKhNk}^=uzEp+mnWi{i_r_w-j&ic-Wr zM;l8F%&uLpFlMGEe20;OBwY83w zryaQ4U5M4FFjA!5HZIEZMhjp$OW;;U&Md~##ht1d`;Lj62rtNc>Opv~U`ZZ%Q>xj} z?CfWKPW=%B4VaYp!zG#l9!)luwF<~Cey!Vd4gGXoGvqA4*bHW9VtpiVt9?fy*aFq% zU7oW!Xz%}hHT8I*^E9zKr2tm#^GJm0A;8v}3m*lATvdiGE!C=2Y+HV#uTRim0JD?9 z4dGOH#K-vf4w9WyP%2!J^Ns{^KkyK>`6osrDNDXK7SvH^OnCoCcf}k~Q9KpO$k1#S ztvuq2Gb8oDJ)Bn|k%{)MUXa`LUvHjD|B{#zGKjvrGVPeioqo>zz&Cm9X(S9Wjrbb@ z0&@PlTs?4Py{ZiVYEbD4B0%im4?(n)lUkPp`t08$`^Rw3&|k-wGHRAQ z9k3ngEic-K@$coCnU|r=oYsA^~IRLGa1}YvgGjP;D|e^(?aRO+F^*k&~kb0 ztRlN^;g55CCJTR>^z3$5rv$1uYahsA3!C}s)s7;G6d~WiPc!?wk|ifwaSP3(O4pCF zv9a3on;?y$Q|)XW^=Bqon&#T3IOI`b?=n+S{qI~CFOHDM+A7pmQ%}xHfl?o$Co;fvdUZgnOZ~&9ViH}Yun5~Lbb0Z_HXCGq#HFK&AW zCCc!D$$y|*6O}l|f3`k;iHM^D686aVgG=EJ(CJB5R$dPt=rcv`N~3iPO+ps>FT-=H znVDR3_mtPX=VF>mKZWf>5KIlv$O*w?+3U>eB38A^VDvpqMSiE9N${{JZ=vl$cc)@Y zkYqMF(LPDXSm~$iWYT7E_~{OSQ8`6(j)20av|-Wknci`o(+T(ZbgkT*!b zYhHdJozZscX!9PF1uGl5`>zVUQ|0A`G`eKpfH>FKK#-t#U(Dzf~PaEi2d zCTxv0YU!8CT`4!>*>(w4^ejWY8q;0344Xo)J}1LT%VFb#f+0s3^)~R zJ(yPX%)B`A1`EA$3*-!9obFC}3!*imR`g%deYW)%Tw-(s)8Wol9c^#sYe+p=zTY^d z`7K-!F*M0!pwq=WZZdBv$}N?ATP}4eu?-$uQhC0#IAvwh8oRZ%YZ)7@wIgu2M|+$d zkadb|y~q%7wwDPtQ_Y1&8~3~ylr`yKnMa_~Ty|t@dgMaw-$oq)cTYw}O$!XMInqfI znPTlZCCSTm5tpTs>wdWdBcT>xsY~^&v$_gx+d(TJF3|Y6r0zDCU|Om!KZ)TkU?8%f%6SA2P|Eu9KCM#^9Ciu-cK@eiiCTWqtDFiRbV% zpefM8%t~SP$BLJ*v8Hwj2g+40qOA$*G z7vNW_(}c5MEy6O7=I+*SWS%<>49?!~D;n{{4Hs3(emC#{#q%T!OIr)|5yw^`3-2^@ zJ)^bb7>y2$biRjUBY__ynx;RhknT_MC(;Y@wHv!{XIVQE{m>j}?66Z^s=F&fs<-bo z^sqjyJncn~;vYngW?kZH>#M_;B>C6A=Syf4Q<=fa9jsepA)xN7Z_cRRgRYeZj_tr4 zWSJOIp^K>^HdDWL3p3*0T^S9ld<*MPREXo3?wEMm^VRY8+D5gNVLkFU>uux3q#`Y$d zgAQ5J1yt3_zlm=It#EZ*Bjz0pzb`Jyyf=RSX{s>}5+M0GWu<@@Lc=e__F)5OujTOM zHBM=_i;4`^5eLp@!aii_(h<8c+O@o9B&7N6mek^LVGmQpxFuQPj`ozB-2&_|&)C+a z*~9JnvtVCG5GmX-)hi8)J$$vUw0Qq;sXMb_Lsk=`dRg^kwRa5F=_XJk0KaOV0!$JcQ6+$; zMvdX1n9wbpiAx!&)iJ5XTf-#aj-kxs)mrQFT1bl`t&472T$FmJBWXL1(Tr>QjcDDf zYem8X5>p@xoyUS!Ruqn9kCfNV@Qu6v%hv8WF8k^OE% zHz~31=@BcK9b+!}A0>E?~_W-rD>Nw`Vm*&==$Nd^)05wvRB z4~A062c5f*8y7#U>T9ffVjJb{w{(}|m8IhWHi1jz%d1bOJK4$ce(9QU!3!1`k^@(2 z%vuPZl^)qRPxKI6sspu}PG(^KIQ&C)*oS|GekqZzk0*d@YP|I5AE7*$rd>{UKjt~J zK2Ou@hn#%M<(;=ar_)T`1cOe3j5moc$F<@1I=?4frbM>^sPEK0U3e|Y98skRWj0j9 z%x=l|XB)X_U{VM@&wSFazd20~B(Exkf_=<=R(Pr*N%X*SB%xYk@Q40rik_6iO-@U! zw(cOuvel%^zUK!-53UgOzj8kTvW_RL{+poB)>!a}NBX&_jc;`v4|pK5^%&TV%sbI5 zdY4r=(_CN1t*j(1EY~y7HipY-lGK3#erUwdrcP!0cYAB#P{ocS${SF(OEg&}$*IpH0KcQ^IN)QCME?XQL!#( zQProY3EvMsHe*!YKI=z`-Ad8K0g*XY!ybW9v%&7;?6f^9B0d_jI?Kv()@{q1?MIo0 zSDr%#7_~PvTl)XUZ5D2H_EmsF26+g?I+Yt8+ckIZND#Ggj4r&WAen=FLIJ#`m2l87^ux8;3XTs z5%rN(NqEp+5O6%voe=sBrJ!}7($Wf6b6~f&xH+Mqdvub)jj*}G-8RdILS8{?0Jq&8 zky3lCeX_NIe#Se*8qHo&gPP_SMRBPbJ$n)?rEhlDe!npe2B1!S_B#lXs~|_f2@qnV zMJw#&5cC>jFe<|D1_lr_FM9{}s2Gdje=PoEd}GUGw6(F@(J6B|*rU}! zV*|9<2B&xiR6+`eE!FZe4K$h_J2GE*hwlmC4P7y|n^zGu?-k>JCmw{chl4R9-ZaaN zYrSLDA++BG)IT{jRmpR3Sg2H%rZI#Ex%LLr_8CX_EQhB^%iY|eWCPf0>8e9)Z1v9~ zKLTVEVG916%2xF_&i7s~CrE%ONL5!*bQyV!iGRNQSY&BhR$Vd}_BQ1v)nFw3?EAzJ z)yGdhCxJtJRmH4gj@HEF(4%Y?iCo?08Le<|O@-sm`Q;;;P#Tf9KGANDcG2%`Rw^~eE;!N=y-=1w$cuiQ=_-Wl15KKED={4d#%)r|wDu0Ng@u!S*i;(nIo z)iQfBm<7@wSWHmnvT;IExPwP>lG7{ZslUE(5*e45FHKl)@kaAAFs|kcy&z|Ppjjw5X-8>KQu-NC$VgQpGYXtLg{p6C-BYY&J)7Ve(08<`c8VGAFs zdo!RLu{^C5BID3hmYnCai?7N!{Gq-uLufi>n)z~cbX2xu2ntbAburMUlWw#Kn6$1m zYO-YBi7J=6q_pf%d-GAc#51copA{TGUo5SX7ABpOJeR0m+ ziv_!ihGs;KS$xtjoLfW_7wp@WKYHG>D~NUb>XC1L`^yzzaB1B9!AC}P5U7<|Tql#F z_D>#&4{t}wCDvFFvfi_GDORg->Am15L`|o^DLH0$VrQkPzWfg4q@mXlvYlzMxn>O+ z;1GtJTFy0DeSXF5Po109kQM-0uP(28Uq2kqFDMj|=$S2Jr+|I<*;cN2$3A2&-6nFj zIT7|`-vxPIT%{0wzXM}(wN9iv>9M@-;g)^nKe~b2g+Ul#YD+ZL%4YQn3UZanya9JE zcPBif*r6BUI-s~lh2Cv~dY=0fLNM1h$XSSJKu4K}JfNynks|d0TWR6j2{vaS;sly~XGIJv3S@c>9}IqhRnT>6=+pQhRTaGn`JrQq1$bZoC1Vg#up<@*lfESzosNHcKrunh^!6mdV?V{Dikr`us8XX(A%3@nM7)~ z)W65L8T~LFx;Xg92qUW%X}kh|1J30bwUZ54v(-b9v~}0-tG&S2$!*Cs2-(8!ZcQ2L z*~OlN>hZO~Y1wp%{&`pryR#yVwio68p<;3Q!QKvyXVte&nAz2Ihr21taUebyWEDko+=+{<$Ba~>SnlC zgqOCTn_`zca|0gI3tK#rtO)GcjPl9c;0_7YTU0f_>sh*3STnj5Y>-?wRzSxxAM39v z&sCXQbwz<0dBJ534&v(`z zuU6*8E9y}zuUZ+l<_vLb=F`NF0Gy;|c!)<|C*ToFvGo%bk~|xSJbgRK24rO^w7S>p zuq8aF;t*evlayfyw;1|)z3T9`-Nkr+b41Qz3~V9$CEq1+PzSEe%z~EDO&cJuj{dN& z#o{IH+8Ek=`{dW7Z#yIIvjRV^(r#lugfRHzQtGLJDA`^tGt}%Sc@vr*d&X7)5D5JT zoPCa?-q${%JSP==6rFduldiWkeY@GCMUk+fEAMuJgj9?%+&O6$mQfIC6o0oK`i+D8 z;18|oY2*8B2u4uJw1)m0*)W)>w+WeLdU|CIl}xf3t6?>_-AnkU<=&wt#rz3#HU6QW zOhn%q@1h2qewX|)xi@15K7AjWsmGg#GX%*CbB6q7=bS+ZM@CMez?&;Q3WM2?i!fs4 zekm-~s&Y6i%vMxomf<0 zsaMVZ1bK|TfAQzj!x@ahgbByF%n#T5#?k0Kot{Lfq27=E33hw+O^%Y{nrC7=Cce2$ z7TFzmY9c}MkVQhYaraYo>@LBjwoT7spg$M{?!D_z3NBv_wsckXic-)`j-t<1V`D}dD3&wy*rlE_|yJtgV}*y+1^jtOV^4WGFH9-{ zcao_N*p;r>(WS&;hHk(pDU*}wp&V(hqAXNSS0DWKg>HN=v>(RaOCEvVytMa_FeqjX zip1awX8kR0O;Vdv&S>|T#L`+gxpNx8yQ>+TkceD>t)pgElXC-jXbNjyQpF0k?s`a)JeId_#q@%rl8M)pxlFR< zNs~2q1(0NMk2)%R#d(D^%wGC#y?vCfHsm7X`ZWXdY@FFJU5w zFf#PcZ2g=R*QJh2HftDHdQ=PQr6UBYGrjGRPh4V*ujP1j%t5q=TQnW>aaMA#QMNng z#R#+5dFaVaP;WOG{Y<3eE)pOUQj?bie|S4Ly1HC>%N zRlXKpxHda?!NYR*SIuri*T!be9~Sa7I~LZLI&IA^P1+o1#M|&$)L0wT=t#TJuWD|* zz5P^Z4Yy_b3~#bZfnZB5EcsAqXXE@%^T&iqlyOiRvWQM0kWP(v$A8XO#1vcH0Yqd0 zDTrPMWJ8UA+FAd28Tgm~kzTg{*Fk-W**+9Ka|`H@Mln-;%1Ge0q10>Pp$@JCI~Cay z1IxWMiYS-Ag~Rr>(?YpYH9qlC4q7HOY)eMV)BzqdV)q}!@m*WJERpKZN%H;1h*i-; zaC}gXWsb$~e$?E&WJ8bEp_LmBW;PE>2Cq}ep;s2J@aV?hT+1#Nvx+n+M5_?gft!~G z8I!j%STwgQVMkLUqYr%S8s7R`5?TywICcjGc5dfh3x)2xMohK^Y~xI#Myws6pH%tC z@f7{S!hw*O;j3HDi}UL9Z*HH&aN9BS=v7B@{f zp{9dEUMB^UjQZRh@>g2AgO#ho^GvO%Qg!pL*j*1}jryyt+ZG+PB4WXWneb^~vt|mz zt+jVWPw(1p)z}o5Z15@FZU6v$Ce_$lCRAMHUJOGirqeiC%U@1J+(PUoUtW&6568uj+wGU?!JpmglSf9N1f9D&hw65 z4VzLbYEMyk(G66$rjpfb1{a);Y%wdBl!dOiPO9F9>|oG=1M&uUNmlMp^hfWfI&kK# zTDfwsqn_X5DZjnQVIk+(B`S{QE$H7j9EE!N#Y=f32L@_Lz*KJ`2mxCki_iK-?`8$c zDLvp?9VOJ!GC(HMWV$DlRNDQ2O#ko8T^;l%I%8?tb4Q8BthEl{n@GyXw*=;p>ZC3% z<(XKxqjEWlgwTj@12r2|lFloWmuYy{qC%E9#;?`L#rW^n?tZBI+p@2>EZu;kZ6`dE zgSR5#XxN}yll%N3b*7NF*F~2)Tn|*g<>L^|r&!#tzP35b3i()_c*HAS@Al}483o!+ z?$h0eX1|Hq=kKP*as+!wuTeR(%G{cqrqS+LnTp_?HJ*XhXq zKI-lT@kD0ICt3MximOJ*Yfoypzo(gN?dN5o@l&4(`mki6Ls=LsGXPEg^Dt1HA!ke%SR?AZsr-qC#XhcqI8w zs;A>VTsX`Ida1&_-6XqXNvIK{YJZ~)W8jYBcnvszBa7%I@s&ZV83!EL)E~d{u!7<3 z8mB@qIIc1<-|k|Ul8#pCG~jL2me1;eqP^QnrPD2^%`kTsj*7s>c8BE z;z~SGi@{aXV>7bo+4jRhNNQz!q#HM0P&D++IWM2nW4RXAv#n!iZ5jY)IW<2EpECdC zWVv)EEXVhaI`0HFkHwzpW+24 zZ!_$i3u*lMDbT*RBN0)C%{b&*mARfD-rTX;0|6jj% z|Fi%1B`0dXb^fJ0_4$Zgg83PfksBkdZI0OFAM|q<_qzqjVY3f=X$iR*dxv}ozAAEm zWiOsN<;w%?+KUM%BP;CTB(Sd2MnEvv+%&$>b{2h}3hzc>3(twrwxY!k58gcn zX~eC}FaTgGzv2zJ@xooyR3Ks{z{lZW=ux3;bA2Az*ttC%DmRNJqjvyQ_U2sM;eN23 zggtO8sbxX^=tF9?G+`50-uFW@guma-hk>~r!z0kpo z_24D50n+0GjAJ^Ye2>HqtJ>6JjX3DoepJNs#A@2|w7mieFesuStAualwXuh8nn`OZ#MMJnB6MkEl& z%=2CRU7O3+0w_Vv?JFesR1%01HLn4p#LjELJm71$Lv($wCEjCR=3NVnzh@Ocq!ABL zU*6va`2b$g(6P2_%~1m$G5&=B-UWEe)D6@PE*1`WghK!*KhYxUKU#3F$ebKSPR?!x zrlNdZneoLJ$Esg#O+SPpwI0bcu+1L^9@U!b+%2CFeBHF0%}w&#@AmOj^`RQ+PCki# zv6nD$BOw$dQd9l@ZdA({9IDm=^WeXsPF?GX@4{-lmqNWmN)}AfT|Nzj1(IBX1GFk8 zX$X9t0r_T5CA&n|i%+y%|G2bX(|DL=$XZ$kS)YRi`wg^p7XQe3F zRc2v;sEaw^+ty2fSTnx(()i|5Ykv-BckQ64`38A3B}ne-2i`G@n2jnhOwD;pdGmp{ z+jskUvt6vD%c{C0r8-#)s(tUWEGma|V<9haCVpG%XnD=}QdjD@guT2ZnjZS&q^!>! zSsA0z7|F7&|B8XL(6{QhDO8FH$67trUod(iZ$5+m@+q zeAy!uECcEKWYXH?WftKTzyH_Wo8jIIaMG?`9T-|iRc7?M4_r+f7`W=XfgzrQ58aYy zUJqZlUx->Rw$kOYvG;8bbhYh{IbUzudp3NvxBXXcEo zx1!zdb>aD*xb$m1Nk;84gX+lYJ^sFb8}T6%<@`eF8o4K@a22pK= z>@HR2%iq0V&Rnd>PtTnj`Y66MvifHq_)Yr*vWW0^?Yc z=#?c%gh0SXh4_Lr-S@RO`R7n7y7#K*fbrc%z#W2h+YtZz86Izlj8SQCHxZAI_q*H1 zi3$~$=7H#3a6^WigmbDhl$u`~S3+q?n$kDh^oJ|j9yTdsMxbBctoT=7p7jO6ZjxE@U87BoLH#Zi7m9Aq!E+YYV=j`)Jdis{<*gcgJ7#C9(ZUDXTo%=zJ7Lw!G1N!vX&FJv+|c%DQp5TT zBTFOo>f8{4SfbMY-PHltvgo#)N{PDV`leGgw;JmOO*IIB8=dAJO&pz{c#LNF_0L$! zPv0o|&g?o<(=tHlX8s$?pY~m}zh*<|CMOzrWH zo*rr3cLW@SYkC=Dn%?DS9UoxopVJt4xywCmY<8|=N@$o0E}XmAcbpB{PucLbKAy{+ z?xc|3hQBLz*(N-sMQoKn2}A#%FTyD4HvBmIdUYWz(IeOV=LI+mX=d;S`tQ~Pm|^=* zS;(}S3;s2-ZOZA2;c(ft!5?O=_QzLiKw4|J`ob>s^?;Z4)y-`%Sc^?$`GVDUBn^`f zFn9g76Wp)C0&1yS}YugR1~SD!e9 zpP#17>H$jXRd?=KP9?6+qW%)&moL6>x?a>6J%yq~)n+z?wnii$pAPL=u4>mD&5k#l zZ$JL{djpMZCaCmz(LcY65)YN?JK2ao7HINpY+IH4K25EiX^xn)^*xI*n>A&Ku}{PA zN+O`4qb%giyIjY&VWfC(qno+R0meCq*U~??7asw#j;g&=wh>?$)D+m(;F@l-il+gM z=-H-QJIWmrc&Gm~oDe(|2nStI;Q`PU~yLYxGZpv~;LM$Y&k^GN+;f)AgSR;bD^j z{?9MI$Z%%>0ljZ9O57gf z@HhJB&n!&#hcTC*`9BoFzO1a1Ykgl_5H9>FyV$PoLLN6_{J!tSX86UbzCy$T za}3IRD0rI7(+mF>ZY>^}2`Y66$N#k;{ zCDO}HL^{BSFGLUZUL(C0$tyQE5Z_+=JpT=phGuA>-jG#Yj{lcc|~{xJ-QY3 z?Z*WBK-BjQP0@R4o{lLg$F^C|2so5!V}~Saj^$py+2#&sxDCK7E3yk$1KEUs1Bd!Q z?R8{7L!_i5MP0m1ty$vUsNrW#LN7*N4-FWTn3wTYeNzJb+$ z{M8|P;oO&2uNkF9#G$1-qM6u$Mj!R>iJ#@)9c_k?mQ`Qv9irz1G9v(0#jqVPp!A+Fo zC#I6q4hexm$gD?P*mC)t7snio%dpZF@a7(v^tuw*)zrIKWo2ph8BNQ%_fBgP&tJ9C|lba{)OPUhGcZ_6K zQ&a3_YYavwlF#E*xn>C2Z#->L{WEHM=p%J|M?0JVu6K-i5IvjF5pE}NP$iJ{Mm%sK z_c(7pJ>(Tl?gaJSMYv==>;3bCXWeM?&+(MlYbEw&%3W;gvd-b^YM z=uDQ0=bQ03Eb8L~yj>3Dbu$Xv+XlE5B3VEi4&3$AgZmi{2m3&IPD`C1dT!PwRXND} z($FSkIgRHISG_GF_mA6_M~E!~yudMb=l0|<^IlsH^ug?S9;2o~4N{KuaX2398E{z( zJm%T(dHwUeJ)Pt1`^!?-1c75?m4%*FYioUt#{2OjexeDeiF|ERK9;Kas`$Wsb>`kf0 z!3U}sst4829^W?`^ab`sgj!c5cu8oGCzldF2JEhsQNTuS zcdGW1a2uX6&5Bej7D#ZS*WJ*`Y8a&ak;L-09;6>QT7bLKi|&RvT^YlS0X z>-eQdo1^00wcm&LR;QG>pp{3V@6uIWNHIupWgBSLVnktrW-Tpfd{~r95~2P}+n&=} zSw=#sR)%5flgV1g^aI(_b+J2XGWV(nUZd)&4D0+8eAR(~ zrx@>y1(W10`k;8$g3am^os^TE!8yD=<+y@IwbDG1ZFh{Fy*V@aYhG<^BFN4j9ESUI za69?cy`@9Yl}3c;m#NK2e9^m@0Y|ekZu>LS^z*?c>D^a~CS*NLzfEH%+C*((EYy20 zLufRPu2{?z1ZFHa^~(aLtT{V zda%iGmCBk4v8$S0KfEyS%N)n?*?BZ{16*m4$3_Eo--Q$Dm>k!sop?ODR&pKXyEg>L zR1JM!04$|hp*n&$GF0Bv-zRj=(02~D1eEHLl8J<*M*0|FL2B45%7iW>#(6uAXmIf%(b``$#*eMY`@!RcbG(N?3IK6sdN#`L>yc6j8?ma$=_!J*R0&2V0_u++R zx1Zt9RkftPqFVD!iR|F1qY0P)Qa~!OZ zX;oRrxNZJ0<~`N^@J_|p?I;R>^f(L7d%<5%B)>YP_u~l23DC3$tD-n;7AMLw=K5IN ztO$PTb9W^Bq}6QtG~{E4vZI0|(hUIAaPn={>#=cDZg`G;3bt%gz+g@XkCP7331QRk zP)_mtaCUW{1>+zlg~bmg#*U$~pM#*k9ni<_YzC!FVoob#ULlWs`S&DTc?+qqWVQPp zCrQ%nR9$`{vQlM^;r=Vm{{ts=Jzhc4+VFYB+q^rNW$$9uQ%AADsovS6R{;{9-?qr5 z(@QOim7riy#4ALrc`C#cDoS4s)E_jFgc!u`^xRsI61=``;l@0AnV0-KG6WET>JGiC zi7j`@I*xVG#=lPpENs-n8=Q{{n_qv(#A_RccWio*)t+&j4(d*GrDtYfI>tTaw^#Uw zW*JbYT7_PJ=*98qyKb`0%D`5)2IF3)D1JRuKs5?mdW)Yxow|_fYaT*N$b;j?f&$|Q zRlT4gUOdl6p^%O80)_msMO+n+)8a)uX5n_X+r$5~nO^#EB9#v5)B~sefQfdR(UQ_5 zFnMBpXso&;F7%y#GCP%{Z-3nuwcvqsQJbE1mZ_=#fLo@UgdSi#a~fjOiP?Oozm>js z9hBp5N9~?B3f=RmDMddFwPKgQ!A0NsetrkC-r7@C%p+87Q%_cz1=C=rr@x*&vnt6M z4uW8C^heUAb^onS=r;_~E*b)ZFm3E?C8F{OP=4*LX_XfNrYFW(q{x0}t5#bw_2dJZ z??^?b=jBAXBF!OC9&Ldso=qYh5H{2ho6N@%smn2e)$kTB?_E$-pS{B4ZL(Zsc5)G2 zDs<8k@U?DkGxC#^LvLg+9$cIh8_5a*Ac*134`B(F{xAGXG6pSGbDuhxJQwTUBr3AL zQ(pWRyOLc&hABNp12b;{fuTPqz{(dpRxPVdj7gajxq1&2;G-SXjLP6;`JHlNh@cau?N z2jye@U}fr!9WhA|^zQeNJXFb;t?<{?T3?+v4`ZTFu4*!m`mL@GdR`}%k$=f^y^Rx?WaKu3GPw8ae*(iPGyfpisEnvD2-Y{{CH}muu{H zBk!p5v<)%X*Y!6MfQPz4v$BvvIcH+l?l|o4?QV?3@ge>s+`@@95mFUZXzW(8JlH(8 zKp$5>vgjG_AKyim?!=q?K2&_?#0PxdStFuM~$+S@>UHyj&Su ztHM9nUWkF%rc1HZlAwbvJxj!}jMMu5X&JqD|6b6a593J!Y%MmJo{@-4t{$e)PT!4; zYq&X-m=(CZ9ij7Km8nDTOXxD|3o?WJI)O`wU6h7mYaTQ#iSi;ekq65QFGnbKrj`NM z!u>K{EgdhcnjU@^qclBqDC_ZPHLmEfVKz~ki-pdT6-4#Q^a*)EzE7U#IZ~);WMy_a z(uL_-Lj{A0oT;0eCS&_MFW;VQ!7K(rziimI)Zu}Q1kV_(k6zq3Cs9dJL@?{>>rrib z<3ioaPUJ^E>DqY3P%qH6jq7$B3&ze^WyZ+RWis6eH*e?js|gc8>zBofiW0K|{p9V) zOqC1Oesrr9yNiNwV}lGXEut;JzkZ45u{n|XFkZiIgQ~olW>cdZ?yO$Y_-t^{-b0Fe zT-lGj->-mJxWDMJD9#A2r4BqWH$fbQZprCOlmlpmK5kG^Hdvn;(HHv(L3%RV2XP{X zwoexJ6FKFm>kT<81K~{-3QM4I9!OCzb=#uPm@uHvEyv zJAPye=UNyp1ANqT#RpzYpkT2|YrKaqO2oED*>ZjfJ#s#YnC9F(DnyPBb*_{!+E z>&&K9M}x2Ty<6i`0X5{a5o~D|KeTV3AQvkrKxP#{!rhy z+GFXa^4%xo0o}?G>b|Xyv0$z&{a@zJ^quWQ|NC>!oSFV+I^}fKR@<3s8C8_jzMV5I z+S;a7(k7Nx>_JMbNpNO5Qzgi>YA2a$F+`%4h#-s-p+rhZNQjaUL})BQNaoJ(!F~S? z_p@AA9^|?N-_P>?yk33>W)q@G-qK!1^*ySp#1)er+g6|D)7~x`AfvZ!o4pDNVdnfk z!oPF7ug;+M?7?6tIuxCl)N zd9H@vB><10LHPd7kKGMKN8k5xaDL_H-l9=EzCB~by)6__Uf^h^GMJpHv2eNHX)7sh zwO)aOtc8_RlK{ZEwG}!1O@_id{xKEVGOah8Mp{31mz^>m2AeoXG)Ig+fks<=5)s`L zs}KW|8JtsgC<}V$=zn%|y|x#giwNQm**#OJ$)CnEO>0wYoHfHj6SHW2@qnv`>zp>q z_|sQ)K=m4LZ_-5g^fzfN+0bfJ!nWGoIM*1sWBa>;}4ugl87Vv+KqD zmp!xht4Y*V7)V0BHDBo=?iggoI?D!coN;bVvc4c}90_mms8I`f|NEVi<&}b>%PSep zS$i0mM(ksbM#EL#`j2T38G%3->eoa6(gq7Bu|2I(Fh|aB==&+tS#Be2(qg zYy@`_rCG_%@2Oa0C@VK60KXR9t}xD)>*)jS>w;g_`(}-o)Eo5PD<~O7TRP&*!wYuf zd~R^8pg|An{d3ca3r7~*6KHq(R&+dnB}#Vl2rJ`VrDVOfeLKOH_xT;)7{{6eD2rp> zR7*RXiN7x-%Z@Z@uhBLcl;oMpM{kohymbGRKN#L0&h>$=Nhub1w6_1+=0ny%qc35U z-LX7Mpaa$8{7Ykru9y98RbbFQbEV1wiW+qK%+^bli#icDm6nhVfommH^MIUz;OAQb zZj!d_oUtN{EPTcd;I;wY;IGd@PU2D&_ETeOP#KZG%!XUxh?TJvq-kPPBAxc}d!kG8%P}CO zC;Q9GUqUPjYW6W9(wgsRvB|nu<9Di1eJD`1kp`Uxqr6WLHG{RTz}<@t-Pn1IN`B}< zl!>*Fg!jIVfV@6Zs~2{5K&!%vI0Eai=rSSMf){{c(_)D}6)s5roC(w#ea<7{MR>Ty z{k%5Ve%P?r4TNdTh*+6$uvN@+??&)v+SC5=fNDV9pP2iJwq)HqGPJVK0K#Wq1yG?C z`c%75y7R+&wo%GPfLY7Ue)Q;#_wzkp_pegJHrz_52U};dE0guD*qd?Cq|TN*(q1fa zIR3~5{%Dpv#j2Q`9emO^?BbZZ9rCO`IH^i=-4I>`V5yz{1HL-Q%F25Eei(a(P_x#5 zs-M2OOnYKLD3Z&0Nb8VsM;ni%Fv~0Zon|B}iSW%h%~_Su=d3H-2Ql05z0mTOEeO4s z3`>5g>M@Qp*%mxio%p}~#_RsA0CLN(l2FA-LYyk3BdsV>^qizijzwf?{1+dwuXeY* z1P${x?bzPowYy0B&|RUW=(*ySeKTRvg+@zTT`~gy^rA)2iRp@gbZpK{ICa~GLO=s^ z&jTH?7w3)}ML`PhRe5C}KIKx8K3zM}4Kgnw zYjt`_tKgt z$c1JaZkztGzow>O@-`3r(tBi0$de|7Vo>(oQ@$7>!aMs{7-}^ z_UNf;v-9aG5XN&q+nu~?5ZUW9w>QqF<%H1%sk4qZGi#Ey`b%2?)XmK5VW4jAliKCS zA6B!ys)++|fX@{dyyoK#^?R}m?Ay6DBH#_VJGZ>Z8Jzw@Wp&Y+7+zmyhp?U|OBI|l zAhZ+}$5&C>SDX2>t)5?1*NBhbA<|n$Q~3RX$*$gw?~>p>xPatiC&y0HQ0ugUw80RR zQn`gUy6xY6HM8HEgBz+P)eI$U!;&hID4cep_HWFmR%99vu6DAv zx@{e=L20@DXijCmR_Ts(BpT9x{x`Xj3ql?{&F6flPsHjMhh%$p&s`If(ZlV!*=4rd zRsR?tXD9JlG16^-!PL7&@5E#jfa5xf+g>O$VpX&}2-~nkAOZmkcPPMV6F1P3-d7lTOD@u&2Is&SR=w2G}ZwB7}cVZ{kiGqny&}P)BaIF=(dQqn8;-`$LnfcZjyiAEI(Fp zdb$U2ZybH+!7gM!XfnuA-r#Mb_KZ!khq}$cJz5i&85omOR$s5MSQ4xi$EaS-)vJv|GALx$38AJ&Av4&wIS0F_*ndj zZ24B)6B5>w4vP@(WgaB*e(I8RPn4MJrQaM_O<>(%q@9QIVRdcaa^9DHQcD-_372j%AlgOvN*PL)XHtjsvwHpfdl)cPIb+5}>f0g>hT$ybZ^^s*!_549IU-X3W zXqi8fP?e|-oP|A-<3PW*^Kng&RwR0;#yN4hK3^rWI`iN5uT$25>SFC5_ubDNht*N9 z2`L4L#Q^;`O!rr>2n}UtM1x`ecI-O%4iAvqi8>^a%tA6o(MFUq6Tg|#9k;T_)!LW* zod4)P#w@qRb3i9q=7Wjb(Q|a{b3hqXtCL9@ULxL-wF+nFdRHp>%7xg_O(4e*wt%YI zDHA0YEnb4ORfL4GT)(g~Xnho0A~&2Nh|+z5)-9X&^H=8DlmB2zSr&ILGxhlmMkTG! zX}c!ABidG+7aM8>ft)vqZP-wAHq1hSL)_mB#_;Xu3JXK3&#Gi+-?Vyz+LvCGe(Lo> zzLfSCB4v=SqRNGJ_kb=xZKTPSIoqQwz2(^fyJ}~rBmCA!Cgwd!b!EBzpmIE&(2M7z zkZoU@HaMT^?z^u1_otAg1!s59m3>ry`@u=)XjAY62-gO6Vn(erjjsXB|J>~EC0aXs zXk6jqhAP@0!hJyQws|%5Ip1D;nFlRJREMqFOjbD7O_!%9tLCUiPk?E*4Tkj-sPs+) zx#t8{Vrtnd*uF`0$#mvXlUd}6+w=Cu48*VOt_(g5`tukew`_i_wb60;Sm!FE!K6kM z1`Xo#GjMuGp?i{(&GcjA{*qn~bJl{#n%dlJa>^E-mMI5yA)+ z9Io|xRq%MUQ>WGEmMJcF&cU;7yhOh}gB(r6;UD4=L~r@nbazUwGwbA=$9lbe**QRn zWnIR}ULo#}!8piZ0~%EPz`9jcit0eQkH~iQs!w$r z`1xJB<#{GhLUr$oIh!`hmLfW7e&ntd8%LKdYU%sHV9VrtUc=mmPb~|%!`BO<2L03- zgNTavVNKVZ{PA)t*c*FFVf@@-uxvFYlj?iCF_paeu`kQTA(l{Ct_&}ZZ@0tfWn|t> zMmUE4ENI=6iSF*vgW~o*ak^DnmcVb4z$nj&LO5?wEpCZBhCOy@$(D-FKE2Rid4X@A zpMm{JT4eMVQJeEh@i%@Yr_AMOm~QMjlisX+)tY9!cGekgDxmMOzA& zA`6sb<6X0xsEwGP&KDHU&b@zIp;o_t+Fg4hpsqW*{=lif5dx~>Ri5W{_Xgqg>Ru%1 z>}>B;&GhwsGgp6M)>hF2+B;#{?lj=g4RUjJ<00N3h$q^bDRh$-K`8`$im>NnmbWY;A z@2u6zK!err-Lc410^uGb-&R~kRP7$3-}jUZdpvjJXkErwUV#C`)c22r$zM@e z2L6LU!-Oqu801TdX@HAtfLu2s_PCn(u|w%oR%hn0!~7*^e>-Ds16$Pcc_Up#X0*mn zySl%h@Ij!6#J()=EKi;7GBC^=GGUhzh%wuPCRdpc0rh{$aUb8%! zBoPk6b`CsdS#qPmwRstt`8d2y&%{%If`?BSp3#25sTWBpS0)(F25*N--iC_66cvW4 z-NxGTPD^NhYBVT0gOcUv)sSiFRXDd%^n2%aK;pg@k+~T>Gc^z=J^LC9qqL*LEM0W0 z7r~co@%sVAS`PJBTJ2#?3fn1Ewx50Ub=-%U#R1ldK`J6A;OAMkq9K2-Ehy8!nYPrJ zYr?Q9cDo%-XlJ$yUdTv|)-RO*IT1`AA4FvCBKC}kd$?;4+myG~vYj?=kompn73js_^VnA*Fz}(5$ z&e;WKJ#w<)12ws2rog3AWm|8!hCtV0!1Hd1A-_{x!PP|>> z+xrrV`)wpLDP4N>fJ63@|3pg-^OdBYkwz}P&L5)?CSqZsrK7Zj7$7sT!X{wYMo{la zSTD6^O_+pF*R3PiuQ!VFg$NjS;2qG?GC=m!HU7ktT@4<5!C4>|5u{TKirxwfetQuN zrk8fY0(-ouGMBE1{D>3pHnwk}a#I`p(*OEw?%TrR=1&W@vmvjW*N#-%#BW>gyOKMv zKF|-s=Z&(og5%of7ut{X&v3VP(;`OfHX}@KT$MLYpY+uyM%PiVt{hENz7f`Bhq*fr zKRyP}K4!eO%d#|rXbrQ6FCTIrGm@u{md!QmEbIu8x~@*^6ZQ~o?P<5#q-uXxm=1IJ z(Go??9~@wLKachVRx(hg)_3}#189YU2Lt#P$h7VFus=}nv|n0M;zG}F))Z^k#v`*F zV-Jf)h9H*`5l^E*=vSLazFz!H3^BANl>U>7h`S}YGEyJvw)xe*Z=oGSLmFUx5=qVi zE?dhp+c!>WH{f1yRBE&^NItW)H*Kp^D0w(D%i`f+iC3f8od|At*AB-56;&#UB_)Bd z)yYBPU<2(D$r6j%iZ&Tm^ZL?kVS0AD5Y?k&w~ya~`UQi}=0go6-jE91_c$H2m)g&3 z=!Nw)W&iF10n2YkA~(OjcH6F}JikrWS~7Fl2R6O&j`d=gV}o_KVB{1F%=ECTKVtH( zOIClnO<(OszUn!AbH@OfV8$ip>Vl#D&(WDKq?u61(~s>BRNNX6*;52%ywS-4KX+z^6Px|Yd&i9Rn%k6 zTVg_PDDw9orTG!!Vt>nhgR{4~aUmT<@cwO)hKIP0o(p>E-BW+&#!Y$!H6P z-ALB&4@gYm7Y(b)b;-uC7u;<^BcZVl8DO`SQ{7(lTwu_sf%I(w9pFSJUI8bON8-s4 z+_Mdw!^zXNthzQ{aWR$h?~#;H1?R{oid--}(vt(3ypo`M?2yQ;cLS9t+1wxZ9LO(G zSHIvndcL{f`>>xboE}H?Pb;j4!pb)=-ba?ks&ZAKh05|6-qA@GF=FzeFkS#?t_#nv z+0H*AwF56LKW36s1`GBE8z{=#z0v-NJo-+L!)uF!$Go2xKa8QZ&NE9xjGE>OTuPuB z`9k8ASqX?sG1qR%KpGWc8^&OU5l5hnU{6>uZM>&x@971<8FGX~jHp-FAf%~3^kGV> z3~z6*QidPC&G7N_axH0MP<9grauL%yl&^Z}g*l&Z^xLBY@L7hUwhc+-n+Rd2xULSf zK?X!{rv;)fu_X5w1(cl?hL28fgFyn)gK(`SljzMN8d-8a-w0F3M1wV7f7wZr$y)a0 zv#nx@h!|4MKH2q2q36#f+*d(q$L@D11hScrhWLp+`-JqcQfe+<9u@Y(^+Azy&W(0f z&q2V-ClJ9>XOQ$HpbnUf=5xU5JR-qaba^bl%;YV z{Ji2=R3<*-_GWZ|V;Bndbg0=fxBNyMXOsitW!ivYnlLSl!(hI}S-@Go%Z1kd%H=?n z|5my9@c*}X*=L`fqN_*%Ie!|lyR$Lu)nl9hg1ekLa}w%3rMxFOIY^8#NWBp36AEp0 zicZRX-a{H-9aUMz=1ds1Ir`wAEAiK|tXE2-nCA7E{ z9Psg>L-zHOI;%1x?Xi!ex>v)}-#IUH#xR;HhsuLvA*ufP)96bJ0~^c`1l-kXIJ9iT zuTr?PQ;A9?1g8r#HV;=T@OY85*i8=vLkuYt-LwReo7$f+B z0A5;fXg+wnp&>`41p9m+pkmDoCuI7*24Gp{@1c`%gOC12E6MKdv!f9&+&RjQd7fTL zJj!}BwMVX6FG_E+BD1P-^z)Zj*V|^^m~iB zwY`4WbhZ(08Ihw!c76Sh_p+cGi}gFdPcI@j4?{)FD$nGlHw^QY*s+^=%6NJ@ao7Fq zLC)=y{!Bq||JSGB^3OqgPsyyQNa1(k+wl*4w4)Lps5pNhLDcPjBWyG*W3)7J#wfqv zY61{EGFBDR^UouEb#%~COiE6z;ugt={866s+q#4pJ$R;#1yl>U&C>p^(o7>x!0wNu zW5$JJ_X#GuH*x8{9_db1Gj6B9ka9{__b7yH8}jJ6&WX5qhNJ=0e{dunVlv|n1r>Qk ztnZ&o1*@=s56MKgSK1a*`%)+L>U%VFXKV1JEyM)O|IamU)KBL7)NTR}fc+KoB##6z z_|i}NQ{*Bkv_KgFTSKCeO=!H++Y%^BY4aedJtq$9?j@bU&@EWjE}>UT!qEKPi}5 zXB3@+AYCEr8CVF!+aPxT!SOhBBBO$%V)cC;pawod-Wx-Vzl~@JQf)Mp3}@i4|;`l;e7%3tFKGl*$ag%?0{(Q`XE--MRtGX zq=q2481uLFFwIe^3-c0l2LujIKQr{Ww=P|lp1K?NsMF_=+KV7{qEZgvEB!GA_qMqg zT$bBycWzI~5)Tg3H@?Za^{}nS)1R4Lx@qPreZ7%nwIcht1aFLPQSse_FPc!wwILKYh_G{`#9a_>oQ$P z_y(Ct@PSuy8m9fM%&@yfxQR}k(GBj*?1uX-Rq^l$D&%2}8V@=%T`hdl##+&aY-i8T znSJS9nBLhuZb40GyY23Ky z)NxSYgRGw?P8)~Y{ZNxABviUtY1FLJezci$Ny|QGKC|$Sv5d0^?rW=$A(-pgxw@1m zIriFBrSi@0Of%e<-}Hds4kSWrJ}e(TRj!!t3g1OJ?1WdBv{2OeRUavSR#W`Gd0}eX zdbrSfEz8oNI(-mlaaAOVR}SB=zc~QqCb6!t1~09@FpJGUxC@Oq2NF_4O40w_aUTpy z%L<-6b()xN2ueT&1O^6Z81T-Yqi6>Bx&#IWv*H-3Nxs*11A|pMmZD728YlD@TD-zn z{8T@+Dsr^PK|0kBfC>ejv7n)>)hKrJ4KJ}d9&ZB~97Noyx>VaiYj|==0^pk8-m!*) za&A6*whd5SjP$1)uUIicw&!w;L!JZvy`dOL#nX~EQ>;>0M!~&G{_feBit>=buGp+Qy8;$P`R91}?;D5B z?)RZn@F`&c^o*Wa>)t;K-9e-Lim+qfXXoNoWlmA_2yyymTF%1%rlP`Exc{1WD?I=l zri!ekp{j#i9NHL4=O7!OAPZ~Wu2)7tdRE3?pG|Yiem^$;_pJO$hn>Yc zDhG=53;z=LHtJuJ4;NRWBf1u>DP6xsKtxM6Z;64G&r9ng?|ghf^mRnO6%JO#(T=95 zsgt}cv%wu5$1P)EfRWMb7Sw}-{nVWe5iQs7s~JWMs$>jpYcrL^QdOLp&txadGgSc# zUQ@0CglQBJo2~tl(OQgzg;TDsZ$=Ncqb=hrpzUZkmo!?jLF+hZ?gHQT2+fG<%%8XV zZ`NtHA@oqP!C;Z3$%Kb?R*7l;VGyMK8Fhn~T)CbrImPGMkIuz+Xi-TO%|YH4`1@oV z{by6w0alaG#)QJ_=;9towHhRhdSjgkZc^Oc@O9I;5~)g+7iqs3qeYUWDuPyJg}~0w z7-C`$Vcd?V|1zcWijvmP^=8L~8H{~UfsV9U)W7{HNj|JEPjlP?Ue`9we>qBe7at#9 zXFdvLStN&(KBbqFOH5{37*XwDk4D^FU$_JYkWG(-psVn$kFyGg3jg|yh-CkxXRZ*| zvyW12*`$$CiD|-Kj12(bfD89y7L>fGc|I(Rn!G@%@bU9MjUA77Z=i;~+YkHd=JLLZ z7_%H+oo>pSyI>vvsp`JDgcmgH90d7?pR>XZ#5Q|TQh5?dyzODmUa)$ARk}%^RMnpl8Q05270QSxC|m)1YeXz>e@@ zB)&VyD)ilMTV$K|RRbvLNZp-Z}b3s*=CzR%w1Pb<>RZeg!4 zY~h605O~WzHFdZ_DjARv?^%B(TO!s;*ayT7e^bIZ*LkHlCSRCO&&;cwFt1O`TyTSV zLmRB4nPVGVo>SM`hw>^FsG{MbU#|zDvbZQg*Gv<;SLKsdzC$3&PKE7b+E4=i zUIiS*UJE7V72jOj>1Fzd~?w@2N&;%WU040T2EO#=!D@jLn@XK z&ZWz8^9Dpi{wS;4DJQIFXh$ELWk8Loj1shgy?$fYQkW>dvEwxVQ43&5(f-}E~LMf)IgoKLu9LS-?~Me=mQ@m@N%vS<16~8BaoCl z+yCT+H~0B9*JR9Z>fS#FHXyp^)&KL@@O3KY=DxZqySL9rhcLRC43@ieelN_BsIJiB zD>5V&mwB_a9$mZRsL_}~m7v5qGw6eYPy}wK^gUZIs{6Qy2q>)gR>cZFe3%!sI62Qr zCvMSw6%0xPwd{+=7PlF5`_WkC-G1obcJ5ulzTRe?sL8z1Z`X(jrO7b^@vSQ8H2}*5Rjuos>N$lymVx4+W-Cf(5*JAe3FDbD%IE zWx|zBa2KZac#`~xbf^Z%dHP|wJt2Nk3mUV!w3i}++nxC)DW|bB;g4s1I-{jsITjbP zrZQ||<>=g}OH}*iE+U|SKc>n)jjZqV^kT2*Kwp&bXz#ZYI6$qCo{WjFA94Cs83>wV ztVW9O2L9mn9-XNnCY6>=XR+2)XuewPm>E)y**o2bdTJYBRcNhGXO%ZS&+Hs-CB{KpFa z?#&A2yMd2x8!;GwndzC*;eqzt6Q+g@?vJca$O1Y%b!{pv$cFV)4D*)bigrcJ<7e!V{gw#`e~;{3O<;b@%rf8NhXkU9ZpGX4CpZ!u!3Ju#~M|*z?<$=&|v! zP+BeJ;8WbnXuNzDN#7}L$+0r}zT>#$nJTo82is27&iY1E>m!L6Qn@a*vP<+U1%7R@_w*%x!c1qdZDTmPphDZE9L?UxvAYNxs3m z%yZyXJ63w7nEcVOSFMto?>Eks~qat*4mXuSz=} z54u48>$BTKH?m6Ao9#OGPiboatV64pFSG&xT+>hsYol(HD3$Ehd7R0Ql(^<5_fU7G zx@nTsU`qO6_E(hT?xWQvJdwbOXlmLJ;RK98IMZc@=}yPqNqlm+jtdr_Jqy}53Y0xN z_R2z@czrsI?(U1qT)d5B=A2*#vQ#$c@+omkQxk@JaXzk=7~52X?ue^z%9N{q@iH-v zOnoWyz)^q`(66YQpM?#EeeQk3H=%vVqc-Qhf@E#2Q0bI5`M=2a`ztz7KH)1p{$itT zHN|qyt?hr}t@4qat|PUbeZJ-V3ApM+X&JKGO`*Wiax7g1`&$g-Y_&)U^F%Z*-9@p- z0cvJt<00(-!5sW+)tqZ$T(Eqcj#)iioi3N0iPVzMX3kA2qgpc=8V?v*lIK z5Qoi9Qv*Lccl(RNi>nU@F@_Rg-?T>KE-Psk~XBRplH0oDXK*Pfo6e;e*wU!rWkKd)yf|-L*Xd3f+qCi$|#JP^+a4 z*}Ir!B;VX%b#k%r(~PKZbr9j6zR9S%!P`qP{&5}4;p{vpB!BgS9Uj$*lC@uUbN8XK zD##dWIfJF86%bMJ_b>A11=ii0d6`a+;KAp&gw)K9KHThjqWd$JFokkPdA(w}^J@6y z+yL3ZmL&VMGDazV489URka(!lu~1tlz?*l?v|4a5_t#W=#z)b?kp)56CFj(bx-vl;Esy7(!-X(mK`)95CyAuxv%{PH(97<{bkYU4P2mCI|>`tyg_{$p!(X8zTrG-(rnij3K_~OgZnH z%v8pc{1f4PO8l9lcE|&AsC`A3G6xn`@0zl7#LwQFUdqJ27=4%2Tgt#=yw%MxX>+i~ z;&4_lLPmmZdF=Wojc>BeGdsq;$iL1orww21^m?7nKMroup1x0U-Et2#InLa(XbDc? z(p6sZHjXC#n&f8HIHbxK>6IxwNr*xAdxU4@t{Z-2rMYU{P?cw+ejxzK?1 z*7<8CRr{WpfM7>mgjT6REC6~T-!?-ew=ua*y{VZ!zgY;S`?nC(5vk%<`vp3fy@Njv?}-oh=9{YQ zl{WzUd@|krc4A<3?an;+xWCLc$;;kcl%J_2V>9KubQcvA1d%bGiU~WygD%Wj?|GJ( zXBH`H=hn4V;hdvh^Tpou!$ZmLB4adkam$sK!G(hN-4yk$QVs5N0pD1u{!%7!H(0rc zUiT+JBa~B|kiR}Vxo)Svr}5&)lW0{ZJ#DmS@2$9?wfLPv{Zr0fSATJS?6se_t~`2OnFcbX3sS+qeH2!w1&Rm zBpy|~ILB5+O0sJZk6Q8g*7hd>g{xvx)tCAetzzEBTcHGdD2|~WSquA-heJW771+tk z$s$aPk^j<3PVTPKh<@B3COC0W=ImPa?sfV&wodW2`<$mbDsB#J|j2l zwXd^TrV8GdjCzCIl!1iWsD65{7fh91+ zh5To#w{MHAIql+gcjxHHAoRN3nJYYp0~?N|+I6FTR0nI+m<&dN--EN+0*t$YcE|1B;p~x@7Bzqxf6&GVd!(bt0|cbTSQgu8LU=q^`#l zp{I0E98XkC#=(Swq^2~dkkyX(u3tQxf(PEwOAuSW>Bo$SbvDyz|1F{ECZzEdHSd9> z@Ygq64d<)MPpEm^7X8a;&(AJ<=|?W0&e5ED z?wg4#vZ*(I=AdG0-bGNmgTz}XVmx9D>}g+r985Aj1;EuX#{&HAh1{tR%=VkK?MI~W zLrByllwB&x8RJU9?3n`iu6@WD?jpbF#JgmEnd5pZj-xrl2nLb-J@!i`EO-Lk!OQGR zyfQbw+e^iPIevY=iI~YmoH}b*mNa>mYYHo`cy_oAAeZ$rrMSg|M~a6PN~T?Oe`cYj zrExzqrcjl8PFFZ9aS@Yyg}fJTKf0Mmh7s{?k^AXC32*g>xu^0Dwzk_S6odq&N*ss0 zKN1whsXju44J6;n`2pL+k$`rxfFSxh==gqgNA{X(CemL}pYdy7ifo3nFT`J%-cF(&_Ruk6Hr3b)!`W3N#8Yn5MZs2|s9 zxX_bV`q6)VR?N5Hgy@INp(5i%=K>k-S=~KwQ$~{F|71{jv73U7>iP}J-?B>)4#FpG=K z67=4XVWmARk3O9Tbjh)dYuFM=L|FG+7Zu>R z!3YR!3Nw5ycZ^Y{?3_@MvZHcY2ZT=Mkz>mxJW)S0UF|3GU!Q$v_=X-+t|+08)0xcp z17)A0HkwTTv{hOz`Rg-x(`DvxmHXWz=xb_Z(K?~5cTa7FmZl2!hm=&TGcXZ+3yITS zmrjUt;*5>XeBx4WG2{|%A`DYH%u4peYi%~8#`fom|EVa;Rd23=H%#p3{+N>J2M^0z zT(Zj`dVA&5#>LAs1rM(BAUW4zTHsiaMXuV{Jgvk%rfoq9p}tMNqocaTjfw9`0ZEyNBxc*@B!&x(c$*{ z{7Lb2X!yDThTK-uP!HtPJebXb!V~%X27ZOW@TxD_>wTMPHurfBAuJ6&Qzygo`BvlY zMTHRagFi=xRwve!CF=>6EkegWcLJr4uwjvXzB*KqX&8-OF$QAh=7^}Xr6~>!D5N)% z)e%n5DpCT<`Yc&m&(!bjTm6`jGJ(;cOt}DkK2>C1sgkFESf&^{+1W{#svV;Z($i(( z`<*V6TM_l{y>~AxYG{D)srQM172Z8=GBT&+U_OoX)^D=$6R_&AB`Npm$mk3qkRd6u z*V>NPf&lZ{(<^jQzPN!NOLTAWdx6<%k>kkqWf@hjO|5(Kt60t4Zk6cf=d|6Ja9(>> zbv+jJI8H{jmBgrqpRJYQ)6Mkw2PQ}lQ_|$dR?*5)Vx=%?V>3b^dM!ubz&?%^c2j}q{{@njpmftn*IR5-caahEOb((hgNFn4d2j#wW zQZ!IHGUI>ts?2ibpzGyk`xZyJV@bK}Tk~^>(xGVu@4(&S)%J8udi>~DDIin)(EA*W zz#J(NZ4}kjf1~qy%p|h_4j|+gOQD;fo8iX((NLKN}eK)7F)^y#4=kt2lg<27*5a`+# zp1!I5P__F}k}LmQmA;LH{O@^bY2naT{B4Rn==S`4ihT3^lMDG47(e;qn`oBuv@N9% z;IDmla3fZ=yardwD>~9rY{j{dFNgb3FUP!9Nynt2yIC8)7EfW|si@D{ic8Z{HmdV- zlFL)RUqCUl^;LUIBMzdrdS;werWWrgojR;<_oi2?lt3@aNy!<$30(Gtgi3zZjzUWP zJvt5LLT!0B+rW|6-1Co-gcoxhOsFjpZ~79cb|6 z>XHiU_(_r=U8d08S6#Zb;MN?s@Czb`N~Aq{WjSdFl$k))InD%rv5vMlsW&EF7MZG{akD&6Qs#m`UAW!n_ORPHpq|mUwNlwK3?s+q0B`v{0rMRD5y| z%}Ia}d$S*l(P%XA}s7(5-O#A(TC1}Tgd?ttpjB9!u@*h~GWQL&` z828s_@!K-kor3_T{%+!aRSB2kf6ObzH|2M&R#F7GQxAr~%~_{*o^|B(MR(9MwnOa; z%dxCu!ddI%dUuqwJdPEL-A{u8G?p~6EZ*{b(U6b-r}BzC4Es{Pn++^<*=Xb!KTFOK z_^;1&-D-;w?wW8~RojJ|A7Tm-D@NOKJ>eC1V@Y8yS<^|`+vj%ai(`&rpc1)`Qufas z7@c)*_Q0QwQTatw<3xqxRo)(1;NJo@Vvuh~?_j1-FgI1$A1@+rZGW#0Z$SRQ37~I# zce`a5y(*(Dh-Z%#cQOQjOHXbuRDgOl?UjFhHoWXFbRbH!n_7LG%PhhQ6Md6kFSaKx z6unxqm;l!cUd$*cz79guf`bco*+ra6&zLtSpw<}deqI%uN{FLHbyhCQOf5n$R14SQ zl_P!3N#Jhb&+)lMy&Zk=UP*qE>iT17kuCSu?>i>Vig}=>a^9Hr59@n-%t-Pcgg33Q1vQ+a3dB>zlfki4J(ICs9 zKPl^U=^_Nb?8ugLO%LB}4Q#`p5+}v^PUKA1zWXT})|j8ijFQ|TGFxd)&AZVSZictr zyZ|atBK(lOGqrjryT6XNH&6AocX%d7K-Xnh4jY;h?HfLa&IDdeIv-S!w#~Od8%V)g zdcb4eqdF5+ulLWF@%sm0iCAGt4}u?E&B*X`=OP1ln@@ZqsmY!`t*UA+lDeFeYyko2 zqAWpbIqD^&;q6@%woUmw+b*SCR~2Zq*og2P85s5GiHo=;72feU{#L*zUtny+_9U*@ zvS`6R0H}CV)r8=_)aTA6@zg?4U9G}_;xl+bJa7;(;T%rNxgsD%6^G>&E&flZMZqCF z0HTJP?X>3Gu-sh8^>Gn-+q&kZovIT>ja_ZDM{PFp;HKZ7GGH?jeCPEKn;6dn%k}!~ z(D_&pe_&Sc+)0os2k>r{qkG6P&FV2o6SpTydMfzI_TN+K_KkQnDKN~s$o}_k^V~(O zKYBg%)b*VAY$Bhm+la9<2X8ych*k$3{+W4&IdSb8TnITLH;3Rve#t6S^J;V?EV%0s zNHRx*=JFl3+a$KVSRv)@RV!Eej8~rQDOgG31&m%-jC1Jdn}l*?34dr)UIe>DjMo_> zCji4G87IRRd|ZCHO`N49)A;c>$%mzhz_|YIh17uY+?=8hE2+tAI|xwkQ*4ZM4Byj| z3k|!Np7*TpOnw9{k#*L3<(9-+!^ryEcd@YTq#hmFp@Km$XbxC399BUEGV=wF{nP1<40 zJ2n1%1KOnSoSwapEKSOG94-AG{Tr?>zQX5=2RBP8MEsAtTK~G$u5JA_W2}VVu5K0{ z0R+{zS;32L9sfN^4$1S6xRa@!eJRS4f^dL#6MOL-c3F6Metfls}IM5{E zK}GYpf7vsUW6>$sPKQMQ^a4hPbTrGNnyXwf77bb?@kyh8e|_d=kM_!8@ZMj5bnvKp zYiHz2Nlxn4*6iHTW_j0rgP$O_v(ER{z*u__&dR)bIW0!Jjr7C#vTgIrBi8=7&*6b| z_N#!4{2|ZWz>Omjqi)L8d|08rsjT|gAsG&{40V#9_!YTyJHpu=%rcSI)F%a7ZH2Kf1`Hj$5Leu2*%!x3l?AIg~f^uXqUVdP`Od_BShn=IUGm}&=9a=-% zG5X_&LCsfxdy4_rERv}WpEqvw*oiwg5q-aE8=vxE@Aeo%tbUqWiWEL5E6r_O+R?ZO z*&m_Yx+54Jp%2n?PnP?a1ad zqVM=@63b-b_Rx6H5dnF_KL*PTrGM8?MuWd(%T_1OxWLf?YQq!pv!o=S@d?-XOslwu zbN~S06G(`Pih}f5()Je{|FvHjVy*t6Wr`KKV`1H*~GK5M)4Gx?V$S8FI|(^I7a z^J0rJbh||8^DWRoFgb*43E5bdOk92!_Nv>;%Ip|sbvs4r2cAD@$UX^rBkD|)x+w^f zw9bt3yaHMCYM#U`=Pb__)7;&nt#@o}^yBV10m`-ib&D}s2cjLDHwaQq#{MzHL}^O$ zvst(Du!lJ*d~){4!~)k@BbiHHsNB1M6&4S!A1vd-$*&+6cuxv*)2*s2oU%r`4ucY| zKQV07pUcyl>5{IIqw-?}j<1H3dV|Q5(&}uCL8GYHbZRXQx-Ldm!0gA0XE}6?HWvK9 z`b{Hqew0eoSn(*`{(z$Y*JlAEiIVM2hFMXXeHuI=x-z^uz`)cFDIB$>-^`ytSAj+&z+=fCdUJATzN!nDZ#ZJoEH0ZUFx7>f06u+Jp-#~r(=g3A6mh`r96 zWT;2&xb{a?&ZNol{sQ) z%gJ!^?K(2;OOLy6t2`SkM#Q`?FZiY<4pVaU%7;ete)}~|2t5#l5U-(AgE5Hx{G+BB z?i#*72lIcQ2h~qY5r?Ab1rCiwD5V|`MGRJw>4~ge12Ny^LU?%iC00WZg&r@M7szBO zX`h&-7BxO|wz~rIczS(s5J4;jXmF7}K0^n2<&oI=eg8MdVk7ml^9v#sI`J1epJZZq zDsCR2Ymn_Sc5b1T{X@Z-yRn12#kC9K&cpY>ubXr2@J$?>OtJ!c`dv!&t-V#~=Hn2@ zK`Ger!vA6KP2Abe_y6xXTj$Ku_H-0g#hEHbZ4>+MoT*k@+iBGnL5s#3X{7dub55r% zLNcn>Ag2^#i&`Rr$h1TRks+0k5N#rqh%}Z+Z1el{e81QIC*0S4UH8uw$z{1NAD`=; z_xrUxUytYP{~ieqO@rd1ye8_ofstGj?E;in*5MV4iPYEtWMA{6%2i5)_X($b;z{a) z`ax!pOVIYe;pbv6p_EKpJR|dP$*SpRw<{lp{#o?XqnX9|`JC9oi3p0B$&qMr@23GQwS1Cn*Gfx+$Ay1iw)kZPE&%%pc_BXB75$2ZlVY>~^;d8j;Tb zoMtuv)sKQy>Nu8lFzZ}fQ8!CeeHL*4er>;lbifY1de~)W$fBS3bh_77)djXdIWSOK zFYi+8ERyWn5k4d7FO}H&qS{{R$^La-Y>U$d?P>ccZW4&ExLj;>% z<5T#O?ucQyVPM;jlmLrupGxiI;A-aUkCYU|JYawq;WOxl$|$5b9(gZ|r0*eU*HqaP zSbb#j^Cnn4UH@!*b_Vz2_d61bPwHZ$yZ28GPNwp)89d&Oc&MK8J0KMn>jrFsdGcCo z|7sSk#>UEnm^7eYQ!@%XkIi*x*_aEpWeq2Rg+b`kE_s!{cGI4N5s^A*%OC#O@*S~1 zo~CuRwTBaaM-eZImUT-_wuH+5U+TjAn;9E1zwBY5~<&A*ADf8vkkdmKBbiu+c<66rF zQQPOIr}Ydt2RimDzsmQH)V9uqr9^)$kKSoZ+g9*w1K9dzUKzdSNFSsIKVB)Tk~j~v zWVW520+pUtqbNp?Zwy$s~@VYULunN0fSq8eCw`e0vY{P)PN2(L68d`%5!5J&$XFNEvbh z=(LeKBO>ObPs@Kn2N^Rr@f7!#$Dx-*o9|5!jNOtl)=={%tHxoT!tL!uZw(5KI<`zq zzLE~lwg7QXT5l$;%rku)#SHz+OK$Q6F(b0zwy{}=s?F1VgAuLNANKgic^-d*(mx;~|(r2kT>Hny-PgS4ieic@nwNrS)@MMaX$LTEDMBfJm5z<1; zN>#aQ2WuVcMHphZ!{ad%_!4>tWBnd|Y=y0%vn3ZZp7aQqRmRblzIn`~VjFGzm2L;K z@uZly6P-->>ck75jGYwd!rVlOx4v0s6oBnnCXt%4(^?FO&CQu0hYw1T;9R{ilfT3vcEZ+pBt#SL53%Dw|X|n$v$ru2l7h8Go4$CF_e@)Z6@Z2 z2T`On{|DLth>iD7mHkl#Eu+&T3unl>1#|LEadno>zfSzlF(&0_~62xW?-5=rDlvf|@bf1`l(0e{LYd0LtC z)K~ERZKv`d=XZU$-r;i(w$@20^xKHgHqVMoa}+iyVjvbjeQBP;Y9(822hWE?kkSP) z;Q8ctnEUOE2I`Avq()yo7DU%M)AUAugH=00?<2pbikldAJE}Vb@KHPM-mBa!V>vwB zvnM%#_`F78?-bAgL{O^>umG*Y#J>6#5HvLT8GJ43DOI`e@Y6c_wA~OUvFN=cECSpQo>Ppx!z&yV4ZDUU1f%Smlg z<*+fSpBhllsU{le)xeI!O4*~=xMBR9aZd3|@Y^|Z966~(f5V6ITv@B!E7&O79)~Dn zU${Np93t;9V4iC^(stLynQ-`mT7QG-wK(w2*(6u0z{ST5u`8th5(O%2ZH$>HcA}9+ zi;Kz0IXbTTHk!5dWXB@?UYaJy?W;Am>5Qv|I>*wxS-lz1gm|cQt;*8L*^f_LGKbC! z+2!UzbE4k11YwUHJC`D1Vuiy@_`~*0{r^by2gUn@vJPExJ!b(JRgGC`_pKR36bM{2 zJD!|$4Np6a1dZ7N=!YQxYk?u!LgXo(_Qo^TD_zRIbBudj53=prm9Oe$} z=nBqPsmZoE`>NP|x9SQRK1|rOJh36HmE>9+Foro#e_G;k=Vy4rh1X33j;qLkQ&UM` z0rCka$)@|?-C~4<5jNi=sXXfbl$96`~HmbYa$6x z(%%h|7Hbri>EF2#_@J(BDr<{)>Yf<-6>di-l`EDQ9aeZlZkfmem*luZ*Lt- zc(=gAdu6mAwe2vkQ?uDcqRuQf3u+>nxbkc{qrE_;$Udk}o4pt{;2h?ZiuCjs4z1|U za6)D3RvWt>6xi5Z|A0)j`w($l_ov#mO)PU`ETeVs`e>9=Mh2C=5jP-`Wwp>>UN4nS z>0j925K^EUs$XF~G$;`kK}*3pHWfyGKBH&F33#^f`R_&)4lI4Al(o2bfD}A??<2Dl zoW0kSkzWvbX~x*y?CYnXS-q?5QRi*Qk_nS@c8`HWBJGoG$;rZp!-)sBG%OhJ5<>6Q6h%$w(E?z5QrBpkK`unzUS)G0Rov8HqBWeug2iu%S=bes|p{IimjPa(Zu|Nn&a*}O>Ojp!o$yS77~W|yBMp`y)O zFZl}ke9p;~hyP6bSuTE!hq4%Q15)bPdaOlre5X`-N( zmri`K5p1ujI=P6kLf*vmM*J(ta+9qaM2vMb)74zKpDHFo+yB;N1o?9P>Hl0AN>kL= z|KBSEk`3g&|L4l2+-%+n-#Lb^!*HmYXcklDc}S0n7)a6G<1iSJ>B$Rd^IjI_n!pJl zC)QYMjP>v==6T?MkmXFVEnRkZr*}q zr~S$PU|G&d6uuAMk&FCOYi<0d@2i+Y6?8kEp3B0GE}54R0(MUuFp?1GA#9^|x{POJ z|M2_G*hV7we#aBA;3WKP-h@B1%nI7LsdC^fG z1-Kp*;en-Mi}}HfN(dd^5g_ckOt$yCn89>raiLCg<5)NOh+g=nT7A}4$Zv1 zb(Zx16UEZGXkS8Z2p`=(s5GaY&_UNki@X37}8df|}s`=t#B^tJP< zcpp%hI&8|-C2V~0V6V&!o|~JSkWMD2ksV-hRI+{dGP^sG8^%Uzk? zK-$x()q%|#T-P$$eORC@+I}#(tx-M7qpWTTu1%D#8vNe!^5;(Gn<SD3IECf5v*W-Hk z9)y9q*YUlP-2-2lQ9dBP|BEebz^Ff|q&LUKTUUIq*bz z3P!G|N0f~CcWF6<^w-MByZ6X$eD`4uq@dHKjDek3e!wTyLS=|v)S+u>H4*L3vZ=kl zVV}|^5wLEo;?EmmiTg>2`-8b`Avg_P#<-#)7f zHj)8dmz;0bLHH@zkF&}g!;^h5$0Dn=fyXq;`Z?Aki$4SlI;1Jmu|#q&>W`smolXaR zI(ugL$CT21%RxxLwB&QVcFPLDPgFplqnjOu1njS@vA7x44tZ-$y1d9?l)1z-5@!_x zcdE4)U5YU>%TV=rw;C9Z-J50CW3rK2WwWh0HLlrC&8^*8sN3pYX$HOOZGJ_2*KJPZ z%su5@vP>HMi>#`*yI7Pj{lGHnVQ6E)SW5E(STtOnS)Gfq87&z-d*ICE=7vR!_* zEkb35Bye_uB0d(Nx500~DGFAyE@O zKxeE%-_|G=-M*;66V{U7E;-Z8N=Q(5@U_zJ`wz6XL1IMiR_8Y2uT0WccKSxQUxw#L zo9W-LAj^Z%Zd!6A9hIRTs#@E8N%sLnBwvjp&nbMH&ZeBtu!lW?3C15RGjA}T!1%81 z1v{hxPcYzS88@1vW`zxfN=r$-g%;2?)4gNBagO;$D?RyBv1QMZSX>a5CmgPxO_ zY2~XHY$QaPuz_@K1PHff#USrw+3LJfl$}nzECJf8-5?D+hGs{Gd>*4yW`u9p5B@b^ zzo7OJVPUb@rQzq6)AswLP(ej$Q&=~qM%T3PQQ~QI;25_vWTVZI5)zXAkdu!o#YLMy zH8nQ)#hxiO-_Fdbo7c^A+(x2TW2a!_oGTId-d>-y;b+^mJ(#Jm_tcL|R=Fvvj-<4n z8C0lr*X!1@sQwX?wUz0ZrBW%#f(aOyZlz-i7H`SG0hfY}K-{QOW(YM=TW*6R>m6io z+)y2M+)W-x-Yyw=58`vp4Er`Ri>lBzkYP?*wI2;vSygH8X>M$Z-)m+>)k8?X*K{B% z&eMsO!Mo%CllKjsGQ<8V{{B8Ir?4X9$Sub_)J9UPMlR|1x;`9ADmml8Okl}9?0Y)# z_=5%PP3W>i+FqBK;p4cK{J(i$udD44kW?X}aRt%&1zdNtGpAeQ7WaIY_OkalaK62K zQ7=-Xem$3}bJ&}^7w!GaarBPGm58Gt2yHqQWwjzXF8Sx^ahL}7@GXux(yiJ~W06CXt`QjeXDaNMjS`1WK_F5ZTTEd`RpT^&bbG!HcrNK2&L*H-L@%NAy~;~eA!j$+*Q4@&h&4!o4Qg>cEUohubNH;RC-je z8ckin6Ywj!*2i6xN)@eQ#mjYRWmNLGP0#e}`Ebtud^930BtyP;PiaQ{W{pY=Hz zjzg6`FKU>|FXd)Z`MNn2$H5^F*^!H#=LdD7O$@Yi3GOQH*0^+?`OAuAGwNnH>tKPW zF}t(Ww7a+Zxq&16Oco+Y`EhlY?x+y;4msvEz{9Sh z;`!kYP2DV{Jz441`Z~o%$Npo=LWd##8YNA%+rwQbMQy#G1EQqS#B@B^9mt8pEuZ!& z4a&)bkw3dJw|>Vvep)<}HN|szv46V#=yx9dNSCI#)l{Ej{L`9p-g_@n0q?;pg+S{j zMeveuIu@K=(c7@>@q4T9V}EsR(xvY{`EjSCX{ch0YUMh*`7-tMTPZa*Pn#aZBSLJV z*@RPWg`5(1A*8n<(bp#c99^Xbpr!T=oO<%u4tG^~m3#aGvG{k_h}yRgs!jCR%d0jp z_zFD<@bP$EV5l`@p4!7wrZ8$mC{!!x3@k@+R618tn6~|R819mG`t$k0(bdlH9o;Zi zPk)i0{h`Lh_qA8)a3CSk=4QF1J~py zD~vA+D*C7_ss*fws#6&9aml!G6q3$rN0Au*PQzKgb%2}E#j}6hI(!~hT&O#c)#n5$ zW71mNyYZ)ncxB#_k8^bF4x{rXcu}eoAD1r&ow2cT)r(GFw5_$bv}Mua-ew3$C}MFh zqAhl7PTxMq%55^CyXpyj|4tvFJwaXdVr13qpGW=| zPT)+jaRahUlqxe#e(0`8BT<~hiNow~$*zIOskeyZWB-@?m>@GJfC9Eu&AsR{;>GuP z=&EbX_~-xkgc|?%ivI5%`2X`AFlPKsJ#kIu@m=<#!QKmH)7r_~X=X2=A08ky6bRB` z(I$HdSvC54lyfTLeA*8=eSL@bF%?yaOo$ao!b@B3ZvwYq&IT>|b1yV~#dG_d1Fm=o zfALniV))YpK`T)v!g>TzJ|5}cOo|@H!s9C@mRne)fWDM zZ1DRKrvcACjqR;(xARA*4z`e>j7i%szVSGJpO03}jRB*0OttWpC|NFqK zo8d3phfgdZF4e>zVM)<547@(c$|)sUG3=vOrf_STHTdc-|4af)@V-pyrxD!b+*I}6 zwhI{0689bz>ezQ+544&{I1?0k7<0lbjJo2&J839#@kG_%DU9&DbR8)XH_;#cBqHAR zEk1R%q9mgpsP2F+Es%XHU2g$(9wfA1)kJvD<~;AByb|s)eEQ@i2FmeZBUo1Ykwr*l z75ig_+`#R4Y_aoxyV1H$&t2)ko z-XP6FM=0Rz(5mAI&eE#5XD@|h<((lcZ$I`hYED>M1%OK+Ex?NxhpVWlQ00bxo$RfV zn@5454r7S0Te*4j=Tg4CzQUSH5Mc&GOOj`&U_6#4!WR{woMpKlIjw#;WRzYA#?{G?vZ4AiRPfSm|3t`hf2BqmK=ZJbM-KLHtQV58-(@oGS{MT)Sx(OX-_^vHKQtZXEH@d%!GZ{H}vf zhf~-*p4*DU)M-}3aKBJ4duliJmp@;19&U5wzvmt^`qK{64O&S)K}AJCb)-E_ZSF9! z>(IstswAyx7NL-<4mdNVstoCBU_gJ!^O5^1W2;s{o5?G~B}OJ;+6KOu#5G}s^hu>z z5|>`Kop`@$B!f|yrp9nVPNCn&NDQO4tU*6XMGJ#PdDg_&m`K-K!DnxjC(qv62v#oC zb@a-{GeuQvtF`Xcit$vZS3Dy`nB`>&jRgubGJ7_CAidE8o<58+I!nC3Ywv)B!mtEw z<~g}-+p#o~Tog-Y#{&z*BQ|0qmGTNixzJX1Po&sRNm*}fS;OG+(MeT5*W=n#IZ<{4 z;jWirv@t#_u7{1eKMLgfRrw4rqf1YU|;dnHKR*Heqx?!EjT{q z3|9X3*@r|852Ygy7T%dA!zedHsZdE;N9e%SpiTZjGBJ*lAnR9&2GT8fzITE@Sv_ka zSazSRo`-8-VV>Y_t@b+O-nNmEk;9P@2Jo2lL3tOo+5w)Si3yXy*YWwd{QufK=fHXI zKFc|tdV@AG!-(ucT_e17eI_D{zG?n=|4L&Zp~3aoJmDpnOg}&&!Y^!x6BC+nL%0qP zUcl};gK#ReCyIqJpUIBoQ&Te7o8%t_J->bSh5Go^glGaYni4(a*puESEPDy|$bn9u z0UbsU=4x+iXqSwE%h4yCQPOhx2$g2xA8o_ za?vdLxs-SXjWa*JantotjR{ zDIEpe!mx8&?|WEQfd1JOt2h&1fmLW|oc2=@J*uScUlmI1#PBQdSR?z?CS!=*#C0Ak zqrL0ykn3z7H4(nNbvu?EU%M!ZE>C`s$l@g`(E~qXM!vTE!>c`rg_)?>mm1bAW zyI(MLwS(1-0iTRwS*U0O!-GRa*vkWHlJS<-%Gl34@$kp*mAzI@Y4$+nG}_(&JdbS; z^9fA>97N1+sw24M1TG1C)Otqm#RbX7D6WL!n{-zBQM%>Q_q{luR9DfNBw=7{gYgkj zJ#Aj4vP2)RY;f%0;GM$=f6c%G>x?xOe|f&qC&6U6_!Q-g^taD4(JX5VL5r;FxcZ13 zCu+I8kKAc3yP^*Xjf&L*p1SSG4i&PJW!|01Y|Z^&TOv}YJ_g*%fx)t!13l1P;?lU zFHVj{byZ+`LMEcE&kgLs0?@P7g{I#pFLXz`DtrZL5-=$|ZGEMxPt>2WQky9zG+Cb8 zzQ@u?azaSjV@F{HyUa6im5nW+5J7j^0BD1!<`rF{io!m50Zc!zu(ZmDcYOA0opDsG z$k^Q&?Xvek4@gwYFJmTf7naFI7x&tYfsN>XMOU+$udSp18o_wu1;R+h_7Ahh*5l~#Y=r@zZ`FE>fu62&o;0GcILlLARD_e z-5{d$7I|}&c~>b7QcPQeKF*&>rgS1*<2@pS1(Z-h|;r_x(=ep&8R&1%hAM`&D zNI@W6M{&2H%RS-~UyV-r>OnG7JDlKH!MRmUna!D}md*m%Gcurw(Ej2LA}oTCigV~} z*2#3YLHdj9 z)XkVw@jbxo_my^Z}B!<9dkK+pd9 zS*%ZS@O;!I7ws4(E%NMkur0U~TClm$Dr;;R;+w7#nl5bb>_3oXbM#=S@^;fme1x)q z+o_ZTo~(wedlNZEqoI zzn>fgOauc?xH9)ZALYyDSDK8hb!Ob+o47jrxKm}dQzU0(CHoDONlFS=rlq#R(=E+2 z+H)^}vXl%5S`FZG`($40o)0SNB*V|JF((*^npHk9ZKT+m2SchE-n7G8q zBp10Ry44vgY(Rf?Tb$+_1TPQ9;?`l#oBF{CDi?MQmGbw|8|>9f8#P6J+mu;SQgsN^ zZ+xjJ+XSxpWozGt|6dfK?=Y-?bSnB;RTqURLy*aNjG z+4C!vDJxa1I-2e4bBZ8C@r9ffTC#u=B@sBZFLYt>%S~6Xl}*Ew_=^dwOVvo*vO~AX((zM1Ogq1&>REC1`%r94T`Jyv}S-0gN%v_ zIj|ecmS~Jc7AbEcf+3s;r7tIo>VxUcIxY|H2je=^YvaV2^hQo%1(%3q2~dcu>G7>n zKrul8H}CHX+|Mr)b)gIhS4}jfMjHVL5r&Nfq}a=o9flWUEII`ih?w5Xhhdj)bFkeW z4IO918i&SF(Yrt9ZFN*ABLkHuChDZw`lo}AewA8?Nyti{#pbQP)yU}=UM2Qgm(S|j zAss;Wo^xpz=gO^gzQhOKD9*~Un56rste8Fq0c%4>#dMVif4@1&+ZNSNxyP8~xiVx#(bZd0ig+b6Y2 zDyz(E1II^JRt~1gKsDA4gKJ@FG6`5f-rUNoT~gKqGEU;K`BMPA7)zq(U38KR1+TX>FH_ASIuk{uMx<Ev>ZW+Eu2VUzb*?JnBP&YKbj$i6Ym z@21e$n1mbD_!;!kkz(G-3DZ4rz1oabS&awiIVkvv`YRTB!#)`nSpr((y$-V7fp25> zs5LonT==hSvsmq7Dy9he@nuZ=4<$$geK{BFNJhi7T8f~nt_x(wS;zo@3j#DdVrjSs z{TU)CJM2>Qpg8}CgBF60gCk_A zM~jaau7OA0N5M)f!&q%&+MA-1ffIp)C=3lSv?Yb&!-bj=}y^-=^{U{Q~fc!QC_h(DUn>?mZ9 z95wI;!jm5!LcKN9W(ymg(e}I2vp2dEzdhyYQeF>PX@QNAJn?Dk6zEWVYk}o7!!{5| z!AZy+2@hv~VcLGUTtB3}v9~&%cpc*FoTpR08) zK=N&%v2T*=`EUumssH(2IU*^G-c}y-@Hl%y;k*iMHLAp=gNtZNORq1;U=sFeG49Ej zqJln0`bH9pO8cR2Fn~U%IYMPSIJNC#es(G{2j>8>s^UQ{3 zoF!@1-Y0mD?${9zxDO(@OQ4LNw7ge+5vL3JI|prS^X>?at)f!(uUClet!HtM3m@4STCZv%lg-cZ8kiJ%eM!1!Opig^Y zZ!2Oc;dU>Tmdo!1GGL@6T#>x)RIZz@&ck2-fy`cWr?;d712RuM=jw9bk{?UMGK9TtN?F2W zdOq`GmMTqMYZe>@V8d#?{7)pIgF0%>2hOc!se__sx7r(BxKYzfqA2w3=;hOmq=*J3 z{Kfvn&kxlhezafH;%+I4YfE9 z(9Z_=f^fc0i&OCb^hZ{#>~(IWpvp?Sl9KKhfbDB^tjFhe0I#+>>ZNr?JhRD^OehN>;ftqQ^0Hc91V0AOV=<6r!X zf(;DrSc#8m(qn(oD-Xfm(XYg*aX$mAFE98MPDWh2^u=M$T~_IdI~gU82WWX)s5a~t z)XN}thSuI970Xr&Xu@rVWj}QI8Mo1Ot|JR21jsQFgsn9#e6U>E<2hjU)ZUq^2E{a3 z2otl#r1&`8AeWohPCKY1^c=6rc3%I>!^C*OHOaJ6ryRWr^L%vvkm=x9SDV;TW$slc z;j0>JomzR}7DN643Gl{KCT_@7&i7 zP$gl#JqnsjKiznQQFMgkj9GJA<`CknR9nV_?&5m_S$3ZmArOjwT6hU{{TVH_8J`wj zxeOM@weY^$8Yd460#@0PF_5O2>;PfJzK2EFZ78{oJ8h#8=9TEl5E^&$f#W?NhgB@e zPd78^tPY)Lf+D?aQxD^p=vVi*pf*v1C55#pMk*H!R9m5*x0?R z2N^(!{pZ?E?PJ2nT>V_u5if=v2i!~41o0v?+iP;7b4+ACSI~B=jJ}L0y-89jn#bOh zeA%pp9z>{mGfEP84zQz4F>VNZxk<|ANOx1ktf#hM1a!E}%-vquC1#3&{Plgj%tJ%r z;qlD|koQ{(H_a;s>!~@D=?sa1f!%hVTtn#Mlb$a(u%ygMbIOtyi?iNlD2Yonv_vau zzB_q<+!0O*J{v|#SRA@cluVRv(`|40y3PVDUSC%L@%8|K4wd4Cvkhi?K)oV}gj=$& z%*#8rvEp-i743P>M~cIUGa47q$jyG^7Z$f;w5Q%j(2i9m87 zTi&ilFCL8%bQtg9$O&4qP;YPmNGj8FQbgYWGTt#&#Js80Cw@oM3deN5obUKlO-P=j zUe&gkW!VJ;pXK>q*!G14G7S7OBnRFcqbQXe@|?_qdta4$Fzx#Gq6KIhT9~(6`F*O2*v{g4IV-G^?`x42`v2=E7tqeiJd9m zdGhD&(|kyop3duko8fXz3^$hN3wP<^c<@|Zyllzt6$7onTIg}@SHGY~?Jx?~zfAB< zIdBW0FzyQq=MMw{`p;JwPad#jk4Py&u~U7m&$5;HNiXO(G8!mJ@5-a|Vs+jYyvbt0ZSGxxfr!8-mfU%)Ogc)}fBNb+s%z!=oDV$R;h&Zk85GVLp>Lqwep zuaP+x-LF4Ze{R=FdSvJP=oD&yUzJ$GK4I?AU?`+Y!7RCCX|yw?bqVHYAF<&Q6~ zl|(q`{4_TG<&t(|;EA)94@bKHTL*PzkdS#wifC~v_ZzwGt(`iWl-9nwX3Zp=GB`JZ z*D@Vc%~;=WFjgMTV!+0nqg&qzU7fnKeh!Xv$jB zTzXTilhPj>z2QHy+>(1I>uHS`K>q00EH#}OOO14UR6w?ZL0l?r?M(E2D!Zi8jr7+r z47ju*htKc4L4$wAf`=J$hBTfo8~&V0MEWh1;rtLfnO`c3JIjOcf-?ymE!X*1zA2p3 ztaf@uXKyXwy|Ry z-PSr2$}RPEB$8*r#vA`!zLkD&jxw336?FRZ7gV~U;-T6yHnx^ecY>h<(oYb3M-!GT zLHE)OfT`8IDN%Bj;YSi5*M(0ECFt;z6&&*hh)#|E-q)BkRe0Q$<` zARk`vGXR-0h-@{&xnEd3s_yHe$C8?~ZY~$F+4RN|cN>L=mdqUO2Cy?%6mtny2!yYF1) zpP&6_vNQPXQogm@TvyU;pe@hWA$qB9QILwfdWXl*oc4F+1ll1Efh;-KG%KbpQg7{9 z$r5QTLD9gnyiXNk>myiKmJ)+L%lqV3!Hf9sA-MgK8yY}jz)pN&%@nHN7-x$ zf|PhDKa6)3d!Q&YwBV-)v!f0Bi+A4BGAXaoxrL{ll5>5;rjrq|zkNo@)m{@xaud+3 zMeH}Wxrs;a{_~vi98bkkpxB+wz4mgH%~31&a%$DCv0Gjl>Kz5ZPTu9yNQMa+OKG&Q z^X_kxr%wI$S*=~H$Cmycd?mZ{{gQeqLzV^rx;*kM`D^kY(xDWyzX=6PGR6q3ruP zi`RN{yYtuJZF}_}fXoukr}^$EZl>4dNun3`R;{WTWH?;#5jzbxt?F)Wsz0ueJUET5 zD~gOg+I73?n*P==*CkEq5u0lw%gET;=|CSyAP{rXyB1+$BrV59n@jZTIGjbK_a>1^L z;E48Aer!N_IB*(&4B9tn9PI4bcg`ip!fPLYkR|rM+~!oCdWQd5w0S?iarByAj+i3u+44nOBeuJ>kyR_+W% zheD#e*A>f~oD;jL(AmO%wTSl2M!Z!p3cgJuH7+rEjP1L*H)8ky5Gy+>v0HJ|KuD9T zN=}E@L*9}Hc{+HF$AC7lX4&GiPyy7!`F;T~_D~R}D)j+b+-A#H90%>|l z%Bl}|{Q6Owlf|j9>Oz4%n=&dL9U^^PiZ&v}LlBRGjOTV&^<5?t#e~a~zFm{qWNfNF z!+&F|GG%A#iClMN%KQu_EZ2e72_Z2w*_kwIr@O<17WE=Bk_0n2dwl-^y$yQvP)Enx zQO)c8Y4cV>#I?6KwEs#UKvu<*6MXtDwxj41)jY4W0Ix$cc#or0uooHJD@lE=S>j$u zDl?<9(IuiY8!&F@slR=8TzL}EqUo1b0h#k(r()hANrILwANl0 zOFxwXx-;nIS~nQ(PKNq``E$Hl7S}e(&HYhH;B2mW7i6iLUMy@ah)2w+s40W zVK7R4{~GADRMwcRwwrVwK9&g&ref^l1m*bk?Lg;CUqd$T7a@(<57Lq&{rFD&d*j2b zF}BF~^4HmY?x4&hE076bg}2^yOIl~qGSTcjQTqPq?;p_5xx@8nhi1f9`O*a8RCcnc z7fbCD?fdj80S9EQ9?zIU{(%N)=}o+K%||MTu@$Z}>vol3x#-a6%6Hray$4Xa6f;sr zVM#Yu1us*!p`w-D_u6uE!X_tQRI&d4S=wI^PLLYw#8I)e&iQY{L_6dEc~fFpQI;th z%AlH5D2WJto@*F|Eec;LaDN_rl)gK7IDY5h15kHU z_W=4otF|h)5Z=(`fK#vm&+G$jX0igK=h}V-TWOK)89=%SRa{ylmd&q6^0yzwo@jSO zJ2;qhI<*30FgWep{(t)OA|2*S0!>@ojEqdE!Lo2esRM49^ z={MwK6Hj2<=jCB^U#cvvir4&T%jv0!g!Cukj76-Ct7MMhOhIm}GRkHf&F2*N@!Zn< z!kvi_nL06Ii^$&0^;da3lBu75OrSLg;eH z2G+BOfsH^+W8~(mVuibNC^-Sg*--<(xtDXwPy1(5wFeTi(0ksdEN$~0Cf9I^)gvua z5lV=sw7-Qe>zfB$&G;_evInr?{TESX({Uq!~dFlY8J8>@couXmc{QsP<+z zJlp-xh22@Sf zCZ@L>dgsDgHW85?`Cc=%=zVn8g?YtoE1ZxH*~TgxotXYe5zr)H*kgRsvA=zm%;AS5 zg``BpXVRZNn7TPLf3Zv{f=+8hB70^m_~?tVw2#mC)%I)Xt`CvEoENE zbH9D&)m_56|MO97H0MRkb^y(xmU%z+h|?5KLAScz6xr1#96EB71mXfs^2_kQPo`Sk z3@cvQGs#YKLPvsa1gD0+P}-5V-@o=hnG}LR`#fxq5-xxj2ZXSAypR0tls4vF7PjB@ zT3h@&TYEIg@4E?ttskt&Co^S<9c>J$k!Slhx*kT;61biGGr0fQ#tG8XAG&{@^owuJ z%j6>_m){7k)av>kF+X@MF?Cqf9Wvn*GJBOmzkN5d{JdlmH4$K_V5QDep}YObx6Ib3 z0!$1zIakOp$T;n9Ukq>QhQJ~dEyGcBsn*NG&mIV^A}5}aDu|HahNd2HH_)pas{XZ6 z?(|x^nHXt|m76qml#f#Y(3Cm;oMM@-V`^K058~!mMOZ{|_)+MnaODtnIpSY?UTqKc zXV=3g?yuzp$zky|p$)soyq`vw?O;m<<{{F_ zHv6kzES($0si z5{zh}4E#zrkXT1HZ39n71W8z@@SWsro>y zz1&Cy5)sGMro9lErKUu&v!)DE%+75EMQ#5dlFl?P=|pe)ozp#a&uOyLm|7Wn%1Nh89X0oDW-6`R zrYtv9$~8qKMNz@!Oih_9QNwugb0X;j=2yinxdehn1Tx;A_|Bo_Hcimx4hvE z{|~?awR|t27c)FOVa~^_Kj5|cYBg9_kzi~3A=BU0$@YwX$=kK4yj=%d%jn*qd?qB8 zX2yGN87Oh#e@gc0ks?89$rGo$gLboQ2SH%@#Obxlt*ZF|^bZ;4rbk_Uka^p8RP@)ExY)=vm6lhB6N zdS2m0w4=Gn1;XT{;&c-+B;nlsEXv6(X^79j5RR|26a9yaQZ zOKrBKCv2jr`l>3}s$s(!j`#YiIGizXZ%H`_^0gpC-wx9G>Y8TzP4M)&ww4%N+J0)) z*8`V1lHZY5AdfU70S>>>KAU}ivQ1q2>D8*vGXA$MrM-S6Mw0>lAOhx`YvGL;JV zG@H!2D62j)9X27gs7Kn}DQuFsh7P5~B(CUN#EH<(UbI2v5=E=PomwxjN`o{X+_8sm zl<=3{VI@|A34>XsJ#xb_EktL*ajTA`c9m_98x$|VTh|_>gpn;iYzB9_57);hW3dy< z#!LIoLCKq%%5iL^?oJD`3X?`owLzPlAEjNvu&W@S)t(G6zn82b+kz}>iG$#^1!99M z$-cL_?uC+sAG)1Lrz(^h^haT8OJugC({X>q`jra>^t)Q;Z^f0vo7o$r^RO(1oneyv zQ~MKeMZ%}0ergDp5Up0Nv%GBrLPNyn1Ns9Rx^1n&(aK4}@TKQB*{=0U@yShr6t`5y zuqiLk_kAGVI{t4?#;Inf(ncYkEs~9&*oXh;(13 zcYoI?fs<5)lKwthVX(}<F#CG7jfZb|?RgPq$FLqJ1!mUP-Fv-IqOXP9biZ!0@on7|Vr`%iK-voqcy z0ZHzFYf(kzE)DPLIluSJu^&>+Ie$!%)cHr>-Tl2(6$yYI)jsMDz0h`z>SR{-rro|t zABPcYzU_`X&gFw#FGQ}@Rq~x5YfqPK`iYagb1i~Q$?ux50yf10h9-h#g`Sh|f zfqh=m-APiY=@^{E*S(0mOmez7&>g)=`in>Sr%t!v1R2enbceP@-`oMu`>Q&0G^0aWQVs1Nq+Hx0-m_FpdVmn@<-p*(G*4^QQW z-H&j&Un%*n3)2LA-m$%J*p#YX{s%N_OvUYJ4XS{wAlXcf>hm#!zcDlVk{lhsYj-~) z$?rdrKZFk4(wA4JWReHuCZ;RC*TAwRGiC=1m^Znk|C)3yBmpl1*$b;pKq&!@Te;CxfzD`nu)YJJ0omUl_yS?hVbgP+2C<>3Azag34 zmT0!@I=O~WN4{HP&yMxr7e_8m?K>SfELidBT@%AWK*f473`aJ9JCtxcB66c_rz~{N zkCS++1;i~HiCMwpmcAbNl~7XnuZ;FU25Cb!m|w10O|f{}!C6fADVpEhaJk#Jv76my zpWvw=)tKcRx`>>*P;&(eHSbEREVJB+>6Hlj?JzOM7Y1!Ap}_lci||UQ;e>O&YfMAB zfnV_DbjY`SxN?S)6p3|=?4>p1P_Cyo7}g;UnPr{+$lLO_p;5E^$C5c~_z&iJn|c)I zqk{cctKYfT9sXl1!%Yv@>?uXgbd}(YsCfG~TqkFeOOcyK z+e2$Z^M+&JE|iJ4aeqAQzo&8oY=IZ6^52jW>L;ZxxdohUnu_keR(7;TQ)Hg1sfD&f zwhlLXaYWd@>sB#eS|B>VR4IcDEaFRz!%(N4KjK?%TCJs+`~K`m^=oWP$G8+(*nO66 zuO5X|h53T>8qU_0dfE=S}FiB1JjEFDaF1rns{9`G9L@7Dl`EM_m&b9_8gZug;hli z)$|Pe$Vy9!S#~fpur6XTvaEd#&a_(rb;kt~LVS8`+&n$K zoOn*wo&P!wk}-pN=W@*mEU_GuecPIG&6@ICcfd9SOvmE=WqdALNZ0%@^$DP~e(IMs>3YTGS;L8KC9$-9&}1 z=VvtpKRcG<^I7%{W2gB=#~A!cneqBo)i^zp{B*&Qd6QOIzV zid8hqk{>KvRQr8#$VzqGIp-Voxs@J1{jn!zac7(9%e|%kQ?1@ONPfgfI_g-Q zm6t~2b@YH`gKO=F?O0u~y!j3sC?b4s4uE$=R5sWxZZ$&8Ff&1x%UH+0+Z}R79^U!| zbl&oK@$qyEBB5iOm}&M(Q9Xf`A8UoXHjTup?{jJVI*~M``n`l3s0JTzf;j9&I_uE< zK;_7g-~Z*Wmx0q!=>$$kMVilj;!dU2T9k{5v_a6nQ~{dZM0Cc;uW_4gGfVaf)dF}c zB&pKa6J#EL(xS%Idp0j(B>p+tV-_3i#W~}5W&ss(e9XB%Gof|WRE}knb=dl+t#SRE zGfUN{!HIiBe2=fuDRPQVXq*po+7GCX@T914r&r{+ansD)uBl#)nt@aMwge zs(uy8{0Na5{E>L3^Iku0NQ$&(fRid-=5N>8D%I+Ob`igr784O>#fDn@W{sxj_Nek* zYgxKQ1mNcX2*wpTsEap^;>1e0ji`;O@5q-yrZt;d{Js((Z)LDMF>;)aicA4!sko-YDF{oU|Q_B0@?$SQ&nJE1D`&%ezp<5V2v>QXb&~vVNLHJttnPPZ za0b1)hTzP={-Rfvw>+=a^F};Hvsaqk9#jukz4;>9vTZ#BbT9fRg+*_R7m>kRU|%w*aC|`xCmlU=QZAPi!5g$L_FJ;d=T3PS z@N{yebtdLOuiJPXT-L-h)Uy^h)Uc~&xJlCpnIBRAshg&P?YW_rH!CyUdgURmud}b7 z;iym0zaEILzVP(`bTf0J!M$&!u`~W^YRwwTPUU|`s{DH3<1c*~rO0K|mwoh+h{Vho zar{${Z>*@KH_`V#tl3*dEkuP7?&@LaA18@P0G0Tz_p}+WsY#=&*e~aejK>Grx){n> zhc0n?itQ{$)9}l5m)83v?=$1rVBc7A2Fw!S8@o4=E4GwccRgZy88oD@!3*_>aDE5* z{Ck1KezV{9-2Uu>tE?NU?;#4RDchy#(Npoeo@{*-Tn1_ik5!L+KB-}INJ49Jg;T09 z3}zL91vW>Cro3YSb-;-YWuqh8;LMR1iO2t<(-37EXZHdkkJ24|Evb{&l5BVEvkKra z4lseN>%ZHSA1c)&4&N7~Zb=dr1P_<%heH|M=@FD`2)QMyjd{)($!fbDZbW5ai2@Z4 zTse;@HE1yFiI`VVj%FFzmSD|7Jy)1XBK~+`ynSmpy$CO6Lhd;ld2gD`XCoxCN)eJCmA0y)P6gv zzj1Gn8oD!T{|ZJO56jiOpZZ=_c{Do$wb(gMkDJmUfMK81ZJ2mdwf9Fn5TAH&QgLD$5zu!8@cPD12eM>lVpIk2vbSIB%#4-cYeVc4 z=Z;#kM}z4U>*Ijkq3P&{%bH(E6o)luSaTkL(hg>mI){lBn^9sgfV^;S?X>LZo9uh> zN(?fl^zlbOnEtC*4T9wX?oS)7&l|!eF+VBSt$vEWvLMgf+OL;tkErT|H9Agc$3R;d z;)R{nYBU2!DD^b>?i69w&(+k={Gynzu@GACcWK_^(UA^ zI&s_n2snJYH$-VE2D&2dO?8>}u`Y?iMr#08{>tU^rpun3&0()ilLlms!071eF)J1S z!IK%sx)B?NFEnMp|NZK8r*~}=)f!9bXY|A)s=)_yduJbO`L1#83~ypm}{|{oRtwul?hp78BePOExjT^A?kB;WjC;HH9;u^QKAc!N*$15-8{7 zEq(j1D#p%{h(Q)iHIR}V@H^rl!I{6}Yr2!)p|(Mz z?ZPh|prWZcR=tAv!h4~xmBaPl^ng^P!Xd?~U9_a-0Uj8gS{os4MxTf%-)wousRgla>^wC|qA*#`ZX z{Pn;+`1Tv;+BpN}I5OtKUu#aO=-p%2xiI~&2W~7ATdGqJqSwl%6-J>SuMe(p4}Cw3 z&##I3)=>MHPAPFG_xsiz>bCu#s?gAVCyc|e^;2O&t8o4C+(IL*p>cdKVO{fjT*@Ii zBLkBmgv=&)vlWKJn_{AEZoTh!HbtzH7PnlBk@abz>!5ckziN@0_g)8DpXT&24zkGO zCtaNj+a+@7nterfS%v!z_A_bQwbrn33rxjC#nBEe3&*L*ud44DOHO@O0 z*0$1$&u~o z4-EWQg)YsG>p3fiD4e4r^`Yi4pjJfLl3hg5sy622)~4|&)~~ofl)?CWA%Sz`A9gwg z_#wyG+<&>~L0PFmF4`*w&ovO*((|P`^h{obDB+6l;}IvIT9!g=_~E{$3P?Oj=r`IG zS47jgyNRWeCIDnYyH7^S5d+mGE-ZU^dc2!=-Em5VB9|zBz~1V&wlpmL2Ji27vzM&E z5u9K{9i{($pOsa5u!Y>YOiwK*=r_dkH>MRaiBlo#Ju+Nzeo7 z*?hb=iZx5GH)~1s3}<+9bz1u(B-8Ec5iosoH?!-+*}1TMjn$rjN9xg1)14H{M?jC8 z`k9~lz>`4I`;$`?=Ylh-i#C<+dWNCLm!ho#gxyK!Z#OU9y%W+MN`=28x6#bTIuBo$ z66nbifRCN8E3{?sQMrQ9uSg2l^eNEdsgP_{2|#w zljgW}uGJJ=4(Pjq)4{BpX`=hRH}aSbZOrI7H>>yA->_cQ_H zK`N&$)_l|tMZSi1;_2cF%2L-z`euaZQtB;)AM)Lgk`}FvwBSo}f z#UISLl#__Y`b!xtkko=7(0@h-S9t|-+H;NjIv_Xen`Y!!D!H7R^+5j}RN!v0syTx~u*n%~I}kCPxpC!F&>Q zOHu;7j}L<;6e>^%1|=7iy}^$Id2%oM%ohJBtIn*1rJr( z)s~sCw^vq`p^1f`?*7Xb^{NN<-=>WGQ}LG*!q<|-k+nX1OIJ)&4z<*2bFg#fIE)PisybNwN zHbp~|E!EQ}U}}5f#9Sb-LHgi<2O!MJ0QBuRqbQ|bQCZe(!^n2KK&uDywfWj%F~u2M zn2ch$NB9KiWVza|Nr|)A)WOQ`ek4)Y7nt-9{2%$h4u-D>(+u4IS=Hg=`2df*hSEP4 zJsUW4?Bpu(BN>0&R4LMEWU}VGg_x2loOL$`w2rKK7rkA-78~FkAWB@^l!WH8i7Cr& zlv7UEaHm`*w~b?6F8qB@uJ>FZ9=O+is&UMc-8P?r6srBb3~n{XgIohmYjz&=^X-?S zCzl9C(a(<~>=vQyT}ifF(Kv&QrcKQnP9YWK*Am*X5)o6snq2-GLTOi;s@C<6K*RRd z9eMxMy*aB+SY8bf?1OdkiIvYQa{DH?OaLA$-Pfd{ri`RB#`Pnbm18#m`uXQo=Zu`Q z&NZCX`&IcdQ-hFq{S~lbC-*pS(;Jl~B*%r^KRh4HK}|abe~peV+1l*59(g%Se@*U* z8XYVAc4DODr(OHRfPj(j!V6wj1e42av=nH#awOQzUCzm;rY?f0DNOM3_Lz(t{y7C( z^@g!eV!}Bo-;MlbTfQOpev{>9a&332b32g#BmK$%qttW*7s9__rS2X#{~3+SPYS&; zm@;={W!pPJycTy)RN$1ZDvj|yPb8(LC>_IWZNP{8OAET9MX_m`v`7HA~dK+GlQ(Hr?POsx?LRdCoF1;+!}P@N#2eO zTC3Kt5OrULJfvpn@Lr46IbOqSrw1BQlPXbo&bvXrk#*3ZXwvKIvvv&X+oS}2r^giK zFpw3&{XdYa;mWdQ8Z06RoO z&MU!}9zw9K{2?U-Ta6EDVd3ra^QuqnGTDCr%`|z!9i4OMnc}|J^VYBtfAk(se_ZeM)s3s-;ittyAji~JgWr6WJ>7DNP=ow#lqK-EgLY`E8umF*2ROJshj94 zZZGp>RSnI1b(0SJ{4EcdYD{1-z@iyacj%dH#Y~p)$kCVmA6J>BQI9c!eb)*rh}f{I zBj+nf9C4f70l`lEAnnd`ar-j2;{1VXZ z%^LZJ)&!2|;o6)t0pK7RiLsq~+&0t0e|2w&$7=X6Ot+|7=b;=5T>~~csk`qd%|UmH zQh=A5pYGZ6&glx9JI#x7KuldFb z5;;<8;CK&5)SY5%9gpptUOOE4aCdsYWqDlaYH?^l-MR{0eK7o;E(@DkbqVOODd;bW z#e~==MUsLlN!W`csI)vq%T&XSTf(j>>WX=(BKv(OPMGN#xrK}UR5gkS6V^)f*I!ZZ zC61chSFHS&oJH*;jQT)&iS9UhN+S+pyk0orVr z3$%vuGpRYZlAKe|)(&hUf;NN8Q(B`14qjCKJG^}N>*W*WgGFXVTSer~OI^oye_S+U zZqQ=c0F&`x>KR)ZS2NDUniX8O-H6EN59Vv30H{MmBIHKhF2w70whh=8V|>=_kzEMS zbAZs%FaThUR~=pVRI^G()=S7=56sR&5$j#=mqXqR;NHnc?m^1DN({uuw=xFy0LJB( zl4-`@gUdhMYs=+E$PU47^QyN zO?~4bEm}!#n8DD^v&)GgUiq&I6J{!stSL*)GqaiB=G4BI@!lq%CpI*|qDE?hZD8UU zddQTSHr_Kc!3%Al#8%Uo8P8Eu<lNP**|Mf~M_ zq+Ltg?K10#w)AT-*2u8YZq&kAhb*1VlWV?jskjSeeL<6!_H%&k&b|6W*F<>!lJxWH z_z&KFpy%OD&`H9J!h|)a(v}Ht?wznEYKAn_ISK3b@3husp-)Xuj*WbCNtAF{*IBuA zP6>TMZPWMxee@ECwlIRF3ns9drSMjt81!=S7+PfHQKSpPFxdGGP&c`v4QuLSst~*C ziTMw5i=@_DhVXQyLP1VNh(62G4}K2vh9+*!Wu|O{V@axNgC}qAU9Rp>ANhGQH8VQw zF{<~=S?1qR{os;!ALo|zmg1w#IVMj3)C#@~9@of-9oer{5r>0hvv!v|Y91}7 z#qT&!1a<_;X6h7=Gd^AY>#ozO#%fzL^eh8(nw?FAD~y%(zX&BjSk?WJXrWK4dDooJ z=1i(lj-j?=a2e5FC5nrl_*A`rqMLefro{ikF^FLrm z(&!ALOZr;o`-^}S@&hD~epl?IbG&soHDaoF(aq*5&N|{qX`kOa!4eIMI~HW&!Vk4Rb+u9Cgcye$8N*jF-=jVA+4Rp<%fYG zUY(&INmAGwUSVkJ8xVHM)#L<_9`J&`_%N$B8T5@t`>bWFzim#a610c;<<~EndDGS^ zX6PE;jJMace#eet)6dMp0i52}ClCYErYXjh#3h7LGo`v~ZdPcHpDco*7L)BHn9>;F zZStNE|Hh z4Z2VTbkq-hS;dI{dZ*MHayDvid;j>aylNhp)ty%F>95H+8k?qTlGxAGbJT9h&Q4gv zEyOYSRzNQsKN$)d&;v{*(KrNAaLMA!zZc+VP@t_pS3O}{`nGk3PTFVl9=Cb+F4V31 zx4uYZnP2^TZTFj>goUoMpwSd+g)r0rE9VsR)6+*vpZ1RiJ0Vpk;jmS{pus?m7sZL^ zf|Uf2e>p5O6dz!AZil$BllnH8kg<|tujguMDY}P zV~s(`-I0uB(*H8zyc%Xw@D+cTLH&EnW+a>CPat_Iu>?w1fbd>vLJjRO5r7 z437|DYW+Ry)1|>dj8zIP;m|~@_&1X%+w{N!14pWA*xiLvB4Fg;n7v;dn`W-56jjG4 ztV|$N=H{^x47xEkYf{(!kz=k{yilq;XLeaYB+LPUdhw?V=;? zJbVLIVYAkKDcN_DcApc*LwzX?uQL!8Z9(wPPuKM!$| zd}~h=^>!@5K4+mfJ!)zB9NK&Yph*HaI(<4}ma^2Lcb}8sXA0!L0hiIj{9_7?=lf?0 z%Ud6Q|E@P;t#^;))4xZ8SC)WTdq@quI{kfe!*w~?Q|5NzLsS*d?Ol7(72hjjDuE5r9KP+0UFsOVwVZj*cql8UP+;@FbBPLI0-lrij%R#l(RC z@ebG z3!|B~gQE#vlns_}we@lU_TRS#FU>1%~t^Th{}WiB3Vwm-C1uHWnwrsjvm{M)91b)9?EG1I`7ZPZEel)xFO#@3W*xvBH{ zS=o${M6q-B2;FTdOTI_n#i)KUq?)+REo7^Qvo*Th+-?KeaI^x@8;T?g)YqQ2E=oi zhLFLOQRbb^-bNfvgz^(Y_yyC{tg1NhS~xlwU#ykjGr4&i;^{BXzs(Ah6CnT%^J0$* zw_co(WjEM93`<<@;Q-6u3!b$wts?m1xZrc6aU+FqOo(s7vjfXKEug#26J%G{j0?|k zWRnT&aT;vZ1=@wnT3gwJP1=WKF|cv}{_?4|FeX3kW<0ojjbw$M?mu}$=ayBYp2c1B ziCo>kTq{)Rqf~=>#1jnqkNyl7)1iku_W$zXoIOql4T9}nMN<>wHO2FL{aIYUY9|&s zf%Tvq3QC#tk66hnBsw73v%mDObINM!KG$HLk(@JebN-n)Ml5dgcplPMvZk0W60L~2 z!`10TsWlIfj`a`?mvdgHW|#hSCuNw%gE`^!ucB#Bre5IDywi7v2L{$^^1*1Uv?17G zv_1I5moLL;<9#=MR!xBrYuDsh!Xs@s*Dq3B!8Yw$%~R?I0!!ImP<*_O&T<3P7_QBf zQLm-}52s1e83_Nb^vn*f`U;Je0mwYRq?`p!?L|dY2&)j%>AfW%_p0THq)GDo;8fuY zCyg6z$v=THI$sY)g+jK^k`~Dr)`jjMv>}oKL7!2xT|IT6-~5Rpc@23#$4^%MK{#d@ zbIfWuTrhY$(f_Ys$wf5phby_K(au4&acM0fSz6Yp-aam%eaI1^Y~KwZ$*hDmc-<{b zuOIL#Pl{|+0qDG?@xmM5WPZlWZP2ye4Qn~ zKaH`dTNiu1rH^fT98j7oZ4`m7#JXPEwxu;It`7Md4y$c)xvB)6lYraaj{bC##7XPQ zeFmLochJ~9xbr0=KoVehPjmShqH7|rOU0~fCq&)NY8{q7E%q}I8FJS;KE?3Xz0XUn zz!*4z)`&WEybeXUr=b+zfSgUew<)9($E6ds>+)nK65(D(XULbnk6Zbrcb9)8(? z+xA+!6j?rn8Mj(&V)od#xXTFYCLWpOhOo!;brID93+e8V$JhxvMyl zJUQRtx(8pj{uKK_4B-!c1dF1(E`>yGTSb%7*+X3K-NtF*hpVTZ-q|)3c1`K`GbCUbgjM9lXqCplqys z;=-W(_5Rodc0m=vZ*J5@lQsT&;4Ed#)Lu==6TXtZ2ADueMJC{R1<>Yv1UMR)ppya$Pmk zpD);)NhZ!oRkoAxtKu`W^c!J?4I!!$R?)tBn}hwa4l@tF*6o;DJ|(QVv4asir&-V* zV=g?t65)CYdAtFidFHr&nKTL`1-d#X#_=@^FPP}92SrldJg~TEa?N~m4UkWC3W)3` zOLn7%Qf6}^ijU|OJujx@_VPDQs@D5@e;MFII1$=;ziU_2_7a$q!F`wggzFTznEA&S zrMYRnayHBG4;D5@zj-~=6=M}M7!tN9ejx>}MKMdlIYi9#l(7b%a@FI*t3^tYXZ763 zr=(p!N;ko#a@Urgqtlw^e<7&i9zFkzmp>kqcXjA$YI#kGQ&iamF0FPKlzj=bVK_J^ zbb{Urd-L_c%`nv01H%ZE`tU!wD>zMgdmOhzKDPe~?xXDHEu^4c?EmKUPapgrGv=$I z$j_%L-490Px_g8b6Z*O2;gk#IL!pwEi~-Z5ZFiqBeLr~e%Yxob?v_#7CcY0{O&?G( z2SDW_w;T2ykoZ{lZIkiSQ}C1|AF~3)j!paAJM1N*I3soNkyZHig*e{xbfU4@am(j2 z+@Cm|v97u#ZQSFy6nm_Zt+T#8-~324c6fvkU$)#C*1qYTq#Qv^#~y!BCeao;e?1^v zU)wpk>KmNyGzt`8nQNEkZhNe|*)bUlDb6-Spm15nOvy;ugw4w7CA}j<1?;Z}umZu) zdkK)6OS(snmJk)({1F!F*j-ubK_S#>G&E{#Ceyy!8d#=Ajh9KeusEv+TPgHr@3kEg z32qUBC~pqR>wjZbV`etZvIg!VkWJ~`x9qbTg$b{D>RMW9p}OI3-Xw7YXt1nfH{w`k zsqs1js|x(m%FC)Jg*N#CZCCI4w7(iD+qXgn;G41SfO5%ERrPZX$v}6u9PX&yc#(f$ zde`URg}A)8p#u=71b+^2O-Zqfm@K{;lF@8?KGC3=6q(TyfXNJ-Z*R{X{GiGl;8f1# z@k;x%QcIr|xgCnnTpr|((?bj3`*5e=Q3IQ{-F5@Vm^zosg6$=jF5i}IOn)4(jboNp z?HIAT$!|-Wu14CD%xCM#n5=A{i94M!;(dEfa9FciBe8b-cccDMm7&}G+OZpZQP<@- zkV-op9rJPeyUNJ0H`8rvx|GyF@XQ}tjFO|xEL-i%>D?KPIedBW3Z0{4@v z@wpmCm+rnWdob(GDA_rIu~al8LRY0MSGn4jn*8!9xxR69rzwR})VF&<$FHVJ5v^Q`f2vla-6$F%3*0F!MMHBTM`hWv&cL(;zdt< zcia1AY)Qcvy4wp&p$`%Ks2m)}n=&gg1;`D7#)`0#)y$)7$WZIS#ybEcNeMd z#_bw4foR;X2bvCF>E_PzoxUCjSi86#p7qy`o<#HUe^i=`^HgyoKcknb3iEImILi-T zWj**DDRf%eMPdb<(uI93AD9E)n^IB>o+5o$9e!1fj&90atNJ9>mW106!+0e!_AyUb z%K1hLx;bsXw0|Ug)vHniO|Y36|6Fv%z}a7giqWb+&9-?6Ug)_Q-V;c2WZ5l;+h^ZG zJhpgeuR>64ER)$17j%wBVes@@aV-TWsVJKLX_py_gvUK)9XXg$Zei&;LY~IY?+uQr z!Q)+3JErUD!M3!HxUT;t@U%Nhf1P?0_UTL0+#9(2U}MUiHMXMwd*Rc({9W+AyMTJT zz57mj3V+KI>duHb3u>5}sNA+5lKIw!n56>>T~NPiB7IBg0I&~$8q4v}8rXLZN>mOw ziMc=cv-9YP?YHb$+qXLi61xL}5fYb-Us^caq}x97?|yZABhHee8Zm-JO}W4aiom4 zqvW4I-AkGA@d)|I&DE%-!#UpvoXjX9*D(9bi>MdZVxK35VO0U6vzEf`3!jqNMG1N^ zpUa7h3>=O2!oe&a-EKJteBNIJHV5P}F{eb?{}Ryg`GCd;Z+)C1Gc__v6XJ1;%zphZ zZtvhKWOz{;KGN8LQe+|GmKa{DQ$LCLj7MOdO6$PRu}NGS4HCPVcY4j-6|InJGFx5x zc4`}k)=InmXM8u`?WZ_R@@?s|I{WUiLEkLjKg*OT%#_BuOZ_vlO#XT&peRkr+6h^% zcHrk>mB74o4S8$<8!O4ouV`$jS!CYPP}wGY&!{yVJcs2X`{kna*Bx`JSXrs^{_3|i z^M*Ila%<+TwU4`XIc2gXp4r!`UuOfb#zxAK$_x+b4#M~6ExOzB8pAoCv}N&nwr64h zYqxS=F4$4Q)c*(HhSASxLVOPVn#GZ0An&VmtP7N9?6z}iA!ZMBE7cW|t^Rj%>Bcfe z17T5HoN2Gjj zEKi4IT1%&-`%FfDo5z#)sYTnBrFG!tl5|Y>xYMj%4`(b4S~#Ju8Sr<&mUD0b+;F5I zmIt>p%SV3GkX3HfNsnh4Sl%473XX2y$R2<;(cBv6c8-q6By+Qf|*Q=Fg225jPqZ64g8C-Sm6kvCfss~Z5k7OsU zxsYW=aKH<9x8wP=7t7x~8UP34x(*#S%`$m|~eX5=Kv*&Y+e&&3$^f($Mt@*eZbf3ft+IK@D@74vbH zz>_vfNsea>h;UoziQfDXSadYIe0StQS)I|+cEy-$d{38X{ib91p#XmK>-YM0!Lrid z*6s$0<4fp;wEwPwJQSU-MibB1T=t7%3GhNAQG{VOCIy_lRYds%l{*zR_YsH-c-(xQ zW+U89(TzjA9_J!DyB&tWT!lG_baO4S%DR8r?08+Bo2Ap%R;aj4j2N2x4!$|Km?OeQ zcj{VfJAX-m+w%+y2EQJ71&ilbI%$l=^MRNKa1tSSD3;R(^!=Z{v5994>xA*^bH64l zEV|V}(r;PiyJRykcl&W?(9PL?8= zyjWbGLqi$##unPeW-P0Ht0FOo%kP+LvKFO#AUMu*2A2ZL)EO2p$m&_qmUPx=)yL?V z%XrqGiTc`H5VFqRIjCz6tph=y7g}4Z)v=drs?`|j)>NTdXERf1-Yq*EAqU;{9=}{; zlj6S9D)+}NAIU`4`mC-sgvJ8@rz$RiMqIEuEna)-&y(oun1?Zw_B{*!NOu@|)p=L_ixQ3<*c$Ca&LC6$HtX!l&vlx!usChuALz zM6NUL4;Y3emb711b8bs#Jt%!r2b*LBv~Z?dAIF;D%OLc{G0x!0q=o5vZ{(aADY~?> z+<8Hbn*%gk+mf83_) z)ZCKo!{}N119C>XD36>M2DR30V?y+vwRxpi8=;nI;r;UIHU?cNQ{XH!zulW8xYwM@ zF|&bcmPGn(iO$W(wO!tr0jTWzAosmS6|PMkFz&c~FIrw${FYoK6wSs-e)%{mt3Ygr zu&t;icKVo~SxP)ENR!ygOdlG82Y61Mi(DBV7y?hGr(Y;Hg$o9X9ai1k5q8g3!hoqL zO}20qV15vWP+#-8k~LGrUQFJMn(mt6#!c^@w1Wa8CVS$;Cf+Y~-nQgL{BTuiao4fo z`Rcx%FDwEW@yGO{Tz=ti!RQ$FDXCM;GWeIszhh!B-yD+x&2dTEeKmL;y^UMUy)tgd zjoq>Pdf<4L=DOM=-tny7f9hiV^}yRqzg+D0fFX_n``$fmikc% z7fw%!^NpQre2Xvnormx(e_wIEJ!97pn#u_0uqP)u+%F~ps~fBc-J|)@OfO*Az;)6k zGMiXy>$q4a-F=Cxf`mz3`8Q=I;N4O_pC@&>_P$T-C8^>kcSp+}}ymaqA1?J(yB0uXYkF8s!LzGvgHpwefSyCCF`ABF*EIeD0T&Vb{iyumCsT zd!Gf$s-gCuBBt030^0aeS!1!*B|ovZWvbY1qZ8>3zK*gvLQvoiWFXSP@ApJWhhFns znUl!k@HHO+?g%a#zGwVuLf_Wz?uV4&#%!D1kHLNStTG}Kch+8UlLP)#hxe&4jQXK= z5}sGS(5Cj5`!=^@8?g{x%}U6bXdK`JCnn-hQRcpfuGdsLpyM7RZwKbzj>~(sCCyXr zrS16h5S!?*8Woa-Ry*0t9l9{gZUSX+_{=HN`;}Nh{pkmyIa_C9zxIpK7c8B8Zs+#i z1g3eNWOx(0U!^RNbOATN)oY-l0*=xEh|w%2tq?*=X`ViiSJLJ-#?Fc@_E0m*L6KF z$kCV9$<#jhc~6R-j;;Y!o`vr*Z|pxjIP&IrZK3V#aO;s=jtG8uqOI1LUd{U$*54L| zg{%!yO=@R*j7UBg53Q11FHM~kD>UXTv~291lvgGFmhxi4SuGpeR+L^!?|W-m7`@!= z|A?&s^Ssdb+n2XpoTWEaD(?U5|0krvko*(U)qS92NtN%%ma3bEB216dqV0D5Uo?YaKrTF1@yU93!Vt$nw#H-h-i(@;gmZe^>3 zx53@@5Tm$Z8ZD?5b;Up%zs?;URrU#4)_=-HBym3w1lcj3Lq!{R-p^{*bID9VRE6TS zKDzV^rNAnb+tfM~-&K_YtKtwYE^!Bxo2a0NmFB_mkX!udf}K~Jd{XUiz^oZ6eXBce zCuWhP>nsgXVky)~9-#iJN^`A+od)oB;HbYTk{wA#-AZe|3>=Cx^56fvloh(-;N}sz zIyTeyVGW%LfV~!7PYoHsk&ZLfvbe;&!Mt1e_o^D{jK>|6I}cm86A;m*g)icO;wN)8 zr=(9|9##o@mCr&n83|fR_JlL4z3F{#@pfvC<`MC{8xAnQ64%c!_2W=-?+VpXP2UkXG z;M2NsHuVa}4amaPQ<^c{1G2}i#z5C%d@688*txDetq;FA(1XX8!hBj)#gGV&-3TmI z#|CHk$n&L{O69{wuvu91znDwmZbQtX$i9MUMelxlyE0Ne$&7PV4F&>+DWLt>Pd~WM*{jINyHt7a=N?kavHY8Fw;xX2u+t)g%hzpjend*pgQlvkN=G^s{h7(Uy+c%ogzQdzZ06!kN>1VHosHkSIV$jUo zgu@vj=X@=|+V~~EL-MAI2X~`+L}FtC$DLc?t<=~XrvWtCrK*f(X7dM_-12{`lZqnT1= zm0q_hipuFZKfK*_r0FZ~Gs07ofL=h*3T!BhfzDgBwt)bX3l||TjjXRT*C3OIS0jkd zqdl$6WnEda9OxgfM0uP4nWXnJ!vjm0#_y$XyNXKG|L~!vqW-ex-1rgh`$SL&k)HxKe?4HAX62UTx_HePo*_Jin@5Z- zJ*9O$FB(JK3ifxoCg9nX5m;E~EivZU}j3i5Oj_FJ9I(Ue0L}y;cs;34&8GYr>9gW$*7iBZj(G_+KjaPV;WAf4Quk z4Qe0s^qKvx-wuaXX`A3(2bkG2?+Iues%AFhp5RarShHYy;5kU}X>zuep%;7q%$JLM{A3-GPe>$l6Jll9}Va$-vpz+Ddv$RaJMUF*=({1u@%R?tN5JQ<~@CHY8Vj zlEa?YrgaM?V_W7q86m8-4Byw!+RvV-AMM-oUulEnPP70rHZ__BSTq73A2QrQj+wnN z9#`1#!z9%y{?h?xAS6xenLnHOYyo?fzpdN{-J^!ZMpss1#El_nt7MH$Acw)O zN&P$CR88=35U&oQo^y2|;jiwmK;{- zP}|taidkJbi5pBl)mQu{n6U6M1vZgHX?3uC+{fFACEHV11D6m8)Cqm zqDpi1Jn;_%)4^S2{AXwPiJIH&wB`E=-N_~yjSTv_uS<0#wRWyw0pRZv6CjhSBrQhk z4^z}ENF3zXQi3POZxfmsl2mwlD$U(9KFvtGi?;A3KK2PorD>o*0d3=p*FikuJZgcU@HVNl=o}ch8&b^nkzcdRm_@bsXch!S%OWULvl~ z>B1kjDGS6A?V+t!=dEow2H6lu4kA3as-iD52m7bua+>WuT& zO0t>miAJB5(zvAg820m*^sIM^bGYT?vt#W39TMt2!l?x?KEcNderL+6XGp<6yh_H+ z?4YfTc6o=%v6I_K|ZG~ zbasT8t8S)VAvufnQLApj@xdsR)(2?>wQ#ti&RU$nB*rz%$>;7btSN(^xP)zc+onEr zE{{QVSHTmDw_~gKVsqvIZFVgX0Z@5yHZB(0Fw!11gI-luZRjfxV4L$9fy-~~!v#X_ zhDr&NXB~Jjyn)VDbYlT{re2*HoH*B1Kw?kcNlf&&axziSs& zCpY`EUwcGWt!%)X?S(<_k~)7)@%A-?@<}3CLvH!>NHo>%V~{G8k|-4#r=>>Qj-2

;!cRS-55PClO-M5^MiBzV6TR{M<-+8p82HUMm>vy}2+)%wITg zoOXFZm{a*YljW9>Zc!5HvaJ35y{M8tB(veQ&zaR&#urJUF%MDS7d@ zKb+5fcK&WtwM(vA^9Eto_t`n=Bdz@jaK1;H)m11Y+>RM`TidNmc0*%K* zt;*Pp^bk}evpCXP5+qXo9-@^mz1jI3#<{j$5gCI7>hqj4E7uFJAB^pw)cAazyN}lm zrP}8+p~LHeadU)4d%_V!8(TOAGC-a(YaWC;@k$6Xlu?Y_6X9)Cf^&8fF56|iW>U8v z+l>)cW&)EJ?6pO`>1V_P_^eYx4D)iwR*-wbv%#Pr!*-h<<9l%a2~QcTk}=}M0>!(Y z%7}_wL`J?(hy@f+;3ZjzijV8zOnh4lDwK<(;4c_LJi@CH?R@8<3hX^a2-8)hslw@U z%Cv`^&}L8`&M{6Za04N)pqV32SG8SDk+i|5ep>4&728z*=bOc+W1nu)!p*4t89-}; zE16Y|AdCNelP&r3;h?X!XcE&XSP4Klv0FN?spgOS?d=@_r!d-~Q%WdS zt~eL;HHT_?T_R360OsC|ae$u=h)YO)8{HC@Y^#ZHs8froMOw%dB(G-TtE$`PH>egc z`^xrPKDJm(eJxF-=uYX}-_zTgcfHA;V>Y;1ZO5h`CE6h?`_1)7dcgCUDP8`Vz!6z~ z(JQ(SIqcnsYqM0qRh3$%cb6rm_mBQH6^e_yrjJ;D2>G|5*{we5lwM4AL1{u5!HJtN zSy)&pizHC-DNpFcC1llY{4JdjB|)R?&~N3?jB^*UAHyP~*k zhJ`4I3i{OR@~ByeqW7%pKT6f)U>Y_sBE?*2GN!I!V^7IiVH4#p{qG`nrDk}|@6H9Z zMS^>}X)k`^gQQwR|M}(}IFgZNZjv`d`{mmU35yrah8wl1iIKr_*E`RujczBT+xHDc zOJR{qb?=Deq`leU&81#uop*K8$H?g#D2EvT(9%~|#wuO2`nr>#>pP(vG`?w;g4|*1n-)^6_9ZVVGBLpxFcqEMOJ47Lvj1hhML2pK>*^9MygpeoLuGab;!? zF3#>hXyzc_8+To1_Qp`WipHWN7CYjC3i_dmtUlU?WWG0=7!NQT>-D@r@=(sNS__=) zZgzP)pqm=&{Pu~HH``e?s9=s6Bv8d{5NLr5If5%q&z&uW7F7H_rkGgK9H_`9M=8s% z+A>LpbYFSxdsJj8#I{xsOblom51hLh6eIL4ELp=!xZ34V3 zEVuF7V4NR3IcJqHd;a7%33H=jr9cf!-dY6hY?mZ~Xf zS*ul=mQ-j&1Yb6U_dFe2O*#$OIy%8PR|ldF_jW!gb=Rv&9+W1Klfys z5l5ApeIf-u*ch|B` zLAmi!qA4CVr5_DZPdkdW!(TAxJAuaoHvN-7J3o+xjJp&}AK#wV1*~DNH{*Bp74A`+?W%-Gc+lwogKTBXTSq252y z-eA~Gob%OrhpcnHvNQl-9R`dOT)45@GDyqPSE!+4Bc`xUMQy|~%u*ddk2ZETiCo|j z8dj8l@kp|cX3JSfGqE2D_YD z;1L>Rk_aYB$jC&Ny75swoO8VhjUE zLIpoC$c5_0cTQ&Qw!y^6{Zhs*$mg#ILASQ%zzFa%SF46>kvpT@ity8Yb6Xq#HLz&J z<&sk>y0j|Wq~JEb9QF9I;#1d{+pW}xje%HP8jbF;T-8x$x?1SARTDcXyQt%zu97yB zd0*B|f+So(ScH*CH3_sp<%2Mb#|RfuNj=5|D4()>N6CZo(+^kVEteS5Ej!XSXm+05 zvF8uE|XWrNF36koirUoQyMu+0p9u)hj(OQ?zd zGu{cHS$h)*y7?|8BglGpYdvfrHqNEXn(2w)O!K>!+r=%!AQ09OLB`xe6dWC#X_7kx zRV=2e-c%Js9nGj`A}knoL5qjl4p&*DXVQxJD$iu zDPXsg=Yn9fB`@WP8&z4JDwh75=e$i+>cu_KNEU&#ZFWe0AtBUDPBL>B?RC<2;v7Zy_zvX1EzOP74~9Q zp^a+z@NCwe?Cs(HQWBU@R^U-gSKn#d3fQ-6o>c9@EoJGQGdE@wlX4K~#T~)>10!q- z!58r6#zCRE$r!}DV9s<3A!ZwKE}hl0ETN0%v?9Ic&qiNEu2T*GQ77DCRHPFvYmi6iU7H->6U z$ycipmV+h_{xMj7PQa48`paemDD2*v&94=ys*ypejrX4&-whdBAopTSv}`|!MThH8 z1=K({^Ei`Wn`Y+GTXwG#CR7uLjLdAb?(`)jQlOo|p|lW!cIlVcrbG9K@LRMH&koxz zC5fY(RUK+-fB8S(=&1?G_0e*y4;^4PbzRSWx@%(eY)Al4Q2Qi#2kzTNjD5IO_Dp%( zzvkcc*1hiWpKAwwcHPY@6tnQVEO5Q_dr^e_TSHCtU5`!xu*Go`svzuo2kuJ>^$IUc zA_db^lR3Z}i>&hGV)FDlm=(0p&`P`dl&TfRJ!DG%Nq!(+k&v)@CDY3y4HKZ5aQA+s z(jq@9H2z_r5a8C@lBIE>0UzYGS$2{+?3u#p>)UNFk@Y|Q`Y=fbj+SVr8cK~}|W8)>UmMJ@E5!}eTZB*MNM zl67O!ukG&~_|G zCfg%@ouB@aLNLFQY%xzSL)?g8#6l)Itkxes&_J)Wj2lCKx5$4hlWgRz75u)s z0ki#%IC1E#KUF-Tno48-lv~u!R zf-%rEe*P}$p!QdhDNQo=Ix6TTuK}i(YdE^xH$6$~8^iuH`*5e5`qubGdgThwd+KB&_j%tdvN(!4MRw(14<-xGz{sj{VO{@FF1F7CUIaJRK zenUP4JY0T%a^o4&pV-QnOSAm|(+=gqqO-EI-bpV&TOg92+~xu0{tBK7Z5~bcx6b|0 zMo!=cUs>V61Xz{47rl@km>TUMxzF2UIH>MtQ`n$}=e+oo@(bM(*MUiZD7rde~({~H< zOe;kxvyhFNax0G8x|(t>S0M!!B|k_cv_O9oN^6#?Fwmb(xR#2yVOpm3fFv&*O7tHu zEF5$}s+e6~(gIhAx%#0|5O~{`%X~RSo|d8z#Kxdgp8SqY7_(UZ3UBa@5@

*u|gx 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 I(YJ|z13!*|YybcN literal 0 HcmV?d00001 From 4313cd76f07b96c1abc14c3d5f006185a8e4fcf2 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 05:56:48 +0200 Subject: [PATCH 022/184] Add hyprlock --- home/hyprland/default.nix | 1 + home/hyprland/hyprlock.nix | 122 ++++++++++++++++++++++++++++++++++++ hosts/nixos-btw/default.nix | 4 ++ 3 files changed, 127 insertions(+) create mode 100644 home/hyprland/hyprlock.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index ea2b0b1..68b88ea 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -1,6 +1,7 @@ { imports = [ ./hyprland.nix + ./hyprlock.nix ./hyprpaper.nix ]; } diff --git a/home/hyprland/hyprlock.nix b/home/hyprland/hyprlock.nix new file mode 100644 index 0000000..e1e873b --- /dev/null +++ b/home/hyprland/hyprlock.nix @@ -0,0 +1,122 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.hyprlock + ]; + + programs.hyprlock = { + enable = true; + settings = + let + fingerprint_auth_enabled = false; + in + { + # Refer https://wiki.hypr.land/Hypr-Ecosystem/hyprlock/ + "$font" = "Monospace"; + + general = { + hide_cursor = false; + ignore_empty_input = true; + immediate_render = false; + text_trim = true; + screencopy_mode = 0; + fail_timeout = 2000; # 2 seconds + }; + + auth = { + pam = { + enabled = true; + module = "hyprlock"; + }; + fingerprint = { + enabled = fingerprint_auth_enabled; + ready_message = "Scan fingerprint to unlock or enter password"; + present_message = "Scanning..."; + retry_delay = 250; # in milliseconds + }; + }; + + animations = { + enabled = true; + bezier = "linear, 1, 1, 0, 0"; + animation = [ + "fadeIn, 1, 5, linear" + "fadeOut, 1, 5, linear;" + "inputFieldDots, 1, 2, linear" + ]; + }; + + background = { + monitor = ""; + path = "screenshot"; + blur_passes = 3; + }; + + input-field = { + monitor = ""; + size = "20%, 5%"; + outline_thickness = 3; + inner_color = "rgba(0, 0, 0, 0.0)"; # no fill + + outer_color = "rgba(33ccffee) rgba(00ff99ee) 45deg"; + check_color = "rgba(00ff99ee) rgba(ff6633ee) 120deg"; + fail_color = "rgba(ff6633ee) rgba(ff0066ee) 40deg"; + + font_color = "rgb(143, 143, 143)"; + fade_on_empty = false; + rounding = 15; + + font_family = "$font"; + placeholder_text = if fingerprint_auth_enabled then "$FPRINTPROMPT" else "Password"; + fail_text = if fingerprint_auth_enabled then "$FPRINTFAIL" else "$PAMFAIL"; + + # Uncomment to use a letter instead of a dot to indicate the typed password + # dots_text_format = "*"; + # dots_size = 0.4; + dots_spacing = 0.3; + + # Uncomment to use an input indicator that does not show the password + # length (similar to swaylock's input indicator) + # hide_input = true; + position = "0, -20"; + halign = "center"; + valign = "center"; + }; + + label = [ + { + # TIME + monitor = ""; + text = "$TIME"; # ref. https://wiki.hypr.land/Hypr-Ecosystem/hyprlock/#variable-substitution + font_size = 90; + font_family = "$font"; + + position = "-30, 0"; + halign = "right"; + valign = "top"; + } + { + # DATE + monitor = ""; + text = "cmd[update:60000] date +\"%A, %d %B %Y\""; # update every 60 seconds + font_size = 25; + font_family = "$font"; + + position = "-30, -150"; + halign = "right"; + valign = "top"; + } + { + monitor = ""; + text = "$LAYOUT[en,de]"; + font_size = 24; + onclick = "hyprctl switchxkblayout all next"; + + position = "0, 80"; + halign = "center"; + valign = "center"; + } + ]; + }; + }; +} diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix index 921c062..cae5ac1 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/nixos-btw/default.nix @@ -13,4 +13,8 @@ }; networking.hostName = "nixos-btw"; + + security.pam.services.hyprlock = { + enable = true; + }; } From 242297918613d198123731b0b6045f1d936a35bc Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 08:02:15 +0200 Subject: [PATCH 023/184] Add Hypridle --- home/hyprland/default.nix | 1 + home/hyprland/hypridle.nix | 61 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 home/hyprland/hypridle.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index 68b88ea..fe71969 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -3,5 +3,6 @@ ./hyprland.nix ./hyprlock.nix ./hyprpaper.nix + ./hypridle.nix ]; } diff --git a/home/hyprland/hypridle.nix b/home/hyprland/hypridle.nix new file mode 100644 index 0000000..1aa9e38 --- /dev/null +++ b/home/hyprland/hypridle.nix @@ -0,0 +1,61 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.brightnessctl + pkgs.hypridle + ]; + + services.hypridle = { + enable = true; + settings = { + + general = { + # Avoid starting multiple hyprlock instances. + lock_cmd = "pidof hyprlock || hyprlock"; + # Lock before suspend. + before_sleep_cmd = "loginctl lock-session"; + # To avoid having to press a key twice to turn on the display. + after_sleep_cmd = "hyprctl dispatch dpms on"; + }; + + listener = [ + { + # Dim screen + timeout = 150; + # Set monitor backlight to minimum, avoid 0 on OLED monitor. + on-timeout = "brightnessctl -s set 10"; + # Monitor backlight restore. + on-resume = "brightnessctl -r"; + } + { + # Turn off keyboard backlight. + timeout = 150; + # Turn off keyboard backlight. + on-timeout = "brightnessctl -sd chromeos::kbd_backlight set 1"; + # Turn on keyboard backlight. + on-resume = "brightnessctl -rd chromeos::kbd_backlight"; + } + { + # Lock screen + timeout = 300; + # Lock screen when timeout has passe + on-timeout = "loginctl lock-session"; + } + { + # Turn off screen + timeout = 450; + # Screen off when timeout has passed + on-timeout = "hyprctl dispatch dpms off"; + # Screen on when activity is detected after timeout has fired. + on-resume = "hyprctl dispatch dpms on && brightnessctl -r"; + } + { + # Suspend the machine + timeout = 600; + # Suspend pc + on-timeout = "systemctl suspend"; + } + ]; + }; + }; +} From 2c30799bba0678cb7a70c6dd47ee4159267be902 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 08:23:30 +0200 Subject: [PATCH 024/184] Add hyprpolkitagent --- home/hyprland/default.nix | 3 ++- home/hyprland/hyprpolkitagent.nix | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 home/hyprland/hyprpolkitagent.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index fe71969..20bc1c7 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -1,8 +1,9 @@ { imports = [ + ./hypridle.nix ./hyprland.nix ./hyprlock.nix ./hyprpaper.nix - ./hypridle.nix + ./hyprpolkitagent.nix ]; } diff --git a/home/hyprland/hyprpolkitagent.nix b/home/hyprland/hyprpolkitagent.nix new file mode 100644 index 0000000..dc3d597 --- /dev/null +++ b/home/hyprland/hyprpolkitagent.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.hyprpolkitagent + ]; + + services.hyprpolkitagent = { + enable = true; + }; +} From c348b69dcf7d0da145fd8683aac4e96affc8ba4e Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 08:25:50 +0200 Subject: [PATCH 025/184] Add hyprsysteminfo --- home/hyprland/default.nix | 1 + home/hyprland/hyprsysteminfo.nix | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 home/hyprland/hyprsysteminfo.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index 20bc1c7..e391447 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -5,5 +5,6 @@ ./hyprlock.nix ./hyprpaper.nix ./hyprpolkitagent.nix + ./hyprsysteminfo.nix ]; } diff --git a/home/hyprland/hyprsysteminfo.nix b/home/hyprland/hyprsysteminfo.nix new file mode 100644 index 0000000..78172f3 --- /dev/null +++ b/home/hyprland/hyprsysteminfo.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.hyprsysteminfo + ]; +} From 36ba666103fc40e338d536dcea07a668b942f213 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 20:40:12 +0200 Subject: [PATCH 026/184] Add clipboard via cliphist --- home/hyprland/clipboard.nix | 11 +++++++++++ home/hyprland/default.nix | 1 + 2 files changed, 12 insertions(+) create mode 100644 home/hyprland/clipboard.nix diff --git a/home/hyprland/clipboard.nix b/home/hyprland/clipboard.nix new file mode 100644 index 0000000..909d5f5 --- /dev/null +++ b/home/hyprland/clipboard.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.cliphist + ]; + + services.cliphist = { + enable = true; + allowImages = true; + }; +} diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index e391447..7dba453 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./clipboard.nix ./hypridle.nix ./hyprland.nix ./hyprlock.nix From 9035c8701593d380fc962dce3294f46f1ac0812d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 6 Jun 2026 21:01:19 +0200 Subject: [PATCH 027/184] Add Qt support --- home/hyprland/default.nix | 1 + home/hyprland/qt.nix | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 home/hyprland/qt.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index 7dba453..f6f66bc 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -7,5 +7,6 @@ ./hyprpaper.nix ./hyprpolkitagent.nix ./hyprsysteminfo.nix + ./qt.nix ]; } diff --git a/home/hyprland/qt.nix b/home/hyprland/qt.nix new file mode 100644 index 0000000..e2091c8 --- /dev/null +++ b/home/hyprland/qt.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + home.packages = [ + # Proper Qt support for wayland + # See https://wiki.hypr.land/Useful-Utilities/Must-have/#qt-wayland-support + pkgs.qt6.qtwayland + pkgs.libsForQt5.qt5.qtwayland + # QML Style for Qt6 apps + # See https://wiki.hypr.land/Hypr-Ecosystem/hyprland-qt-support/ + pkgs.hyprland-qt-support + ]; +} From 968b09b4c9973c9ded757070ebe8774ab67be5d3 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 7 Jun 2026 19:48:35 +0200 Subject: [PATCH 028/184] Prototype waybar setup --- home/hyprland/default.nix | 1 + home/hyprland/waybar/default.nix | 406 ++++++++++++++++++++++++++++ home/hyprland/waybar/power-menu.xml | 30 ++ home/hyprland/waybar/style.css | 269 ++++++++++++++++++ 4 files changed, 706 insertions(+) create mode 100644 home/hyprland/waybar/default.nix create mode 100644 home/hyprland/waybar/power-menu.xml create mode 100644 home/hyprland/waybar/style.css diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index f6f66bc..a80d7a6 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -8,5 +8,6 @@ ./hyprpolkitagent.nix ./hyprsysteminfo.nix ./qt.nix + ./waybar ]; } diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix new file mode 100644 index 0000000..42eb27c --- /dev/null +++ b/home/hyprland/waybar/default.nix @@ -0,0 +1,406 @@ +{ pkgs, lib, ... }: +{ + home.packages = [ + pkgs.waybar + ]; + + programs.waybar = { + enable = true; + systemd.enable = true; + + settings = [ + { + ########################### + ## default config + ########################### + layer = "top"; + position = "top"; + height = 42; + spacing = 4; + mode = "dock"; + exclusive = true; + gtk-layer-shell = true; + passthrough = false; + fixed-center = true; + + ########################### + ## layout + ########################### + modules-left = [ + "hyprland/workspaces" + "hyprland/window" + ]; + modules-center = [ + "idle_inhibitor" + "clock" + "hyprland/language" + # "custom/capslock" + "privacy" + "systemd-failed-units" + ]; + modules-right = [ + "bluetooth" + "custom/vpn" + "network#wifi" + "network#ethernet" + "battery" + "group/settings" + "cpu" + "memory" + "temperature" + "disk" + "tray" + "custom/power-buttons" + ]; + + ########################### + ## groups + ########################### + + # See https://github.com/Alexays/Waybar/wiki/Module:-Group + "group/settings" = { + orientation = "horizontal"; + modules = [ + "wireplumber" + "backlight" + ]; + drawer = { + transition-duration = 500; + transition-left-to-right = false; + click-to-reveal = false; + }; + }; + + ########################### + ## custom + ########################### + + # See https://github.com/Alexays/Waybar/wiki/Module:-Custom + # TODO: add script + # "custom/capslock" = { + # exec = "~/bin/capslock-check.sh"; + # restart-interval = 1; + # return-type = "json"; + # format = "{}"; + # }; + "custom/power-buttons" = { + format = "⏻"; + tooltip = false; + menu = "on-click"; + menu-file = ./power-menu.xml; + menu-actions = { + lock = "${lib.getBin pkgs.systemd}/bin/loginctl lock-session"; + logout = "${lib.getExe pkgs.hyprshutdown}"; + reboot = "${lib.getBin pkgs.systemd}/bin/systemctl reboot"; + shutdown = "${lib.getBin pkgs.systemd}/bin/systemctl poweroff"; + suspend = "${lib.getBin pkgs.systemd}/bin/systemctl suspend"; + }; + }; + # TODO: add script + # "custom/vpn" = { + # format = "{}"; + # exec = "~/bin/nmcli-active-vpn-conn.sh"; + # return-type = "json"; + # interval = 3; + # }; + + ########################### + ## modules + ########################### + + # TODO: add script + # backlight = { + # # see https://github.com/Alexays/Waybar/wiki/Module:-Backlight + # interval = 2; + # format = "{icon} {percent}%"; + # format-icons = [ + # "󰛩" + # "󱩎" + # "󱩏" + # "󱩐" + # "󱩑" + # "󱩒" + # "󱩓" + # "󱩔" + # "󱩕" + # "󱩖" + # "󰛨" + # ]; + # scroll-step = 5; + # on-scroll-up = "~/bin/backlight.sh \"+5%\""; + # on-scroll-down = "~/bin/backlight.sh \"-5%\""; + # smooth-scrolling-threshold = 3; + # tooltip = false; + # }; + + battery = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Battery + interval = 3; + states = { + warning = 20; + critical = 10; + }; + format-discharging = "{icon} {capacity}%"; + format-icons = [ + "" + "" + "" + "" + "" + ]; + format-full = " {capacity}%"; + format-plugged = " {capacity}%"; + format-charging = " {capacity}%"; + tooltip = true; + tooltip-format = "{timeTo}"; + max-length = 25; + }; + + bluetooth = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth + tooltip = true; + format = "󰂯"; + tooltip-format = "{controller_address} is {status}"; + format-disabled = "󰂲"; + tooltip-format-disabled = "Bluetooth disabled ({controller_address})"; + format-off = "󰂲"; + tooltip-format-off = "Bluetooth off ({controller_address})"; + format-on = "󰂲"; + tooltip-format-on = "Bluetooth on ({controller_address})"; + format-connected = "󰂱 {num_connections}"; + tooltip-format-connected = "{device_enumerate}"; + tooltip-format-enumerate-connected = "{device_alias}\t{device_address}"; + tooltip-format-enumerate-connected-battery = "{device_alias}\t{device_address}\tBattery: {device_battery_percentage}%"; + }; + + clock = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Clock + interval = 1; + format = "󰔠 {:%a, %Y-%m-%d %H:%M:%S}"; + # locale MUST be enabled + locale = "de_AT.UTF-8"; + ## "timezone": "Europe/Vienna", + ## "timezones": [ + ## "UTC", + ## ], + tooltip = true; + tooltip-format = "{calendar}"; + calendar = { + mode = "month"; + mode-mon-col = 3; + weeks-pos = "left"; + on-scroll = 1; + format = { + months = "{}"; + days = "{}"; + weeks = "CW{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + # TODO: figure out how to deal with duplicate keys... + # "on-click-right"= "mode"; + # "on-scroll-up"= "tz_up"; + # "on-scroll-down"= "tz_down"; + # "on-scroll-up"= "shift_up"; + # "on-scroll-down"= "shift_down"; + }; + }; + + cpu = { + # see https://github.com/Alexays/Waybar/wiki/Module:-CPU + format = " {usage}%"; + tooltip = true; + interval = 1; + }; + + disk = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Disk + interval = 30; + format = "󰋊 {percentage_used}%"; + path = "/"; + unit = "GB"; + tooltip = true; + tooltip-format = "Free:\t\t{specific_free:0.2f} GB\t({percentage_free}%)\nUsed:\t\t{specific_used:0.2f} GB\t({percentage_used}%)\nTotal space:\t{specific_total:0.2f} GB"; + }; + + "hyprland/language" = { + format = "󰌌 {}"; + format-en = "en"; + format-de = "de"; + keyboard-name = "at-translated-set-2-keyboard"; + on-click = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-up = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-down = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard prev"; + }; + + "hyprland/workspaces" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces + active-only = true; + on-click = "activate"; + format = "{id}"; + all-outputs = false; + disable-scroll = false; + # "active-only"= false; + }; + + "hyprland/window" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#window + format = "{title}"; + separate-outputs = true; + }; + + idle_inhibitor = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor + start-activated = false; + # Deactivate automatically after 2h + timeout = 120; + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = true; + }; + + memory = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Memory + interval = 10; + format = " {used:0.1f}Gi"; + tooltip = true; + tooltip-format = "Used:\t\t{used:0.1f}GiB ({percentage}%)\nAvailable:\t{avail:0.1f}GiB\nTotal:\t\t{total:0.1f}GiB"; + }; + + "network#ethernet" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Network + interface = ""; + interval = 5; + tooltip = true; + format-ethernet = "󰈁"; + tooltip-format-ethernet = "IP:\t\t{ipaddr}/{cidr}\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; + format-disabled = "󰈂"; + tooltip-format-disabled = "{ifname} is disabled"; + format-linked = "󰈂"; + tooltip-format-linked = "{ifname} is linked"; + # Do not show, when not connected at all + format-disconnected = ""; + # "tooltip-format-disconnected"= "{ifname} is not connected"; + format = ""; # do not show for any other states, except for those specified above + # "tooltip-format"= ""; + }; + + "network#wifi" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Network + interface = ""; + interval = 5; + tooltip = true; + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-wifi = "{icon} {signalStrength}%"; + tooltip-format-wifi = "SSID:\t\t{essid}\nIP:\t\t{ipaddr}/{cidr}\nFrequency:\t{frequency} GHz\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; + format-disabled = "󰤫"; + tooltip-format-disabled = "{ifname} is disabled"; + format-linked = "󱛇"; + tooltip-format-linked = "{ifname} is linked"; + format-disconnected = "󰤮"; + tooltip-format-disconnected = "{ifname} is not connected"; + }; + + privacy = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Privacy + icon-spacing = 4; + icon-size = 18; + transition-duration = 250; + expand = true; + ignore-monitor = false; + modules = [ + { + type = "screenshare"; + tooltip = true; + tooltip-icon-size = 24; + } + # { + # "type"= "audio-out"; + # "tooltip"= true; + # "tooltip-icon-size"= 24; + # } + { + type = "audio-in"; + tooltip = true; + tooltip-icon-size = 24; + } + # # Example for ignore object: + # { + # "type"= "audio-in"; + # "name"= "cava"; + # } + ]; + ignore = [ ]; + }; + + systemd-failed-units = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Systemd-failed-units + hide-on-ok = true; + format = " {nr_failed}"; + system = true; + user = true; + }; + + temperature = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Temperature + # Leave commented out as the module will pick sensitive defaults + # "thermal-zone"= 2; + # Leave commented out as the module will pick sensitive defaults + # "hwmon-path"= "/sys/class/hwmon/hwmon2/temp1_input"; + format-icons = [ + "" + "" + "" + ]; + critical-threshold = 80; + format = "{icon} {temperatureC}°C"; + format-critical = "{temperatureC}°C {icon}"; + tooltip = true; + tooltip-format = "{temperatureC}°C"; + }; + + tray = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Tray + show-passive-items = true; + spacing = 10; + }; + + # TODO: add script + wireplumber + # wireplumber = { + # # see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber + # format = "{icon} {volume}%"; + # format-muted = "󰖁"; + # format-icons = [ + # "󰕿" + # "󰖀" + # "󰕾" + # ]; + # on-scroll-up = "~/bin/sound.sh \"volume\" \"+5%\""; + # on-scroll-down = "~/bin/sound.sh \"volume\" \"-5%\""; + # on-click = "~/bin/sound.sh \"mute\" \"toggle\""; + # on-click-middle = "helvum"; + # scroll-step = 5; + # max-volume = 100; + # tooltip = true; + # tooltip-format = "Volume:\t{volume}%\nNode:\t{node_name}"; + # smooth-scrolling-threshold = 3; + # node-type = "Audio/Sink"; + # }; + + } + ]; + + style = builtins.readFile ./style.css; + }; +} diff --git a/home/hyprland/waybar/power-menu.xml b/home/hyprland/waybar/power-menu.xml new file mode 100644 index 0000000..69f7fe9 --- /dev/null +++ b/home/hyprland/waybar/power-menu.xml @@ -0,0 +1,30 @@ + + + + + +  Lock + + + + + 󰏥 Suspend + + + + + 󰗽 Logout + + + + + ⏻ Shutdown + + + + + 󰜉 Reboot + + + + diff --git a/home/hyprland/waybar/style.css b/home/hyprland/waybar/style.css new file mode 100644 index 0000000..647aa15 --- /dev/null +++ b/home/hyprland/waybar/style.css @@ -0,0 +1,269 @@ +/* General Styling */ +* { + min-height: 0; + min-width: 0; + font-family: Lexend, "JetBrainsMono NFP"; + font-size: 14px; + font-weight: 600; +} + + +window#waybar { + transition-property: background-color; + transition-duration: 0.5s; + /* background-color: #1e1e2e; */ + /* background-color: #181825; */ + background-color: #11111b; + /* background-color: rgba(24, 24, 37, 0.6); */ +} +window#waybar.empty #window { + background-color: transparent; +} + + +#workspaces button { + padding: 0.3rem 0.6rem; + margin: 0.4rem 0.25rem; + border-radius: 6px; + /* background-color: #181825; */ + background-color: #1e1e2e; + color: #cdd6f4; +} +#workspaces button:hover { + color: #1e1e2e; + background-color: #cdd6f4; +} +#workspaces button.active { + background-color: #1e1e2e; + color: #89b4fa; +} +#workspaces button.urgent { + background-color: #1e1e2e; + color: #f38ba8; +} + + +tooltip { + background-color: #181825; + border: 2px solid #89b4fa; +} + + + +/* Background of widgets */ +#backlight, +#battery, +#bluetooth, +#clock, +#cpu, +#custom-capslock, +#custom-power-buttons, +#custom-vpn, +#disk, +#idle_inhibitor, +#language, +#memory, +#network, +#privacy, +#systemd-failed-units, +#temperature, +#tray, +#window, +#wireplumber { + padding: 0.3rem 0.6rem; + margin: 0.4rem 0.25rem; + border-radius: 6px; + /* background-color: #181825; */ + background-color: #1e1e2e; +} + + +/* Custom widgets */ +#custom-capslock { + color: #cdc1ff; +} +#custom-capslock.active { + animation: capslock_active_blinker 2s linear infinite; +} +@keyframes capslock_active_blinker { + 50% { + color: #eb6383; + } +} + + +#custom-power-buttons { + color: #f38ba8; +} +/* Menu list of power-buttons */ +menu { + border-radius: 15px; + background: #161320; + color: #b5e8e0; +} +menuitem { + border-radius: 15px; +} + + +#custom-vpn { + color: #d1d3d4; +} +#custom-vpn.active { + color: #86b0bd; +} + + + +/* Widgets */ +#backlight { + color: #ef9c66; +} + + +#battery { + color: #ece3ce; +} +#battery.full, +#battery.plugged, +#battery.charging { + color: #a3dc9a; +} +#battery.discharging.warning { + animation: battery_warning_blinker 2s linear infinite; +} +@keyframes battery_warning_blinker { + 50% { + color: #11111b; + } +} +#battery.discharging.critical { + animation: battery_critical_blinker 2s linear infinite; +} +@keyframes battery_critical_blinker { + 50% { + color: #11111b; + } +} + + +#bluetooth, +#bluetooth.on, +#bluetooth.connected { + color: #007aff; +} +#bluetooth.disabled, +#bluetooth.no-controller, +#bluetooth.off { + color: #65647c; +} +#bluetooth.discovering { + animation: bluetooth_scanning_blinker 2s linear infinite; +} +@keyframes bluetooth_scanning_blinker { + 50% { + color: #9cf196; + } +} +#bluetooth.discoverable { + animation: bluetooth_discoverable_blinker 2s linear infinite; +} +@keyframes bluetooth_discoverable_blinker { + 50% { + color: #eb6383; + } +} + + +#clock { + color: #eff8ff; +} + + +#cpu { + color: #94e2d5; +} + + +#disk { + color: #9ad0ec; +} + + +#idle_inhibitor.deactivated { + color: #65647c; +} +#idle_inhibitor.activated { + color: #54bab9; + animation: idle_inhibitor_active 2s linear infinite; +} +@keyframes idle_inhibitor_active { + 50% { + color: #11111b; + } +} + + +#language { + color: #878ecd; +} + + +#memory { + color: #cb80ab; +} + + +#network { + color: #cba6f7; +} +#network.disabled { + color: #65647c; +} + + +#privacy { + color: #ffcf81; + animation: privacy_warning 2s linear infinite; +} +@keyframes privacy_warning { + 50% { + color: #11111b; + } +} + + +#systemd-failed-units { + color: #bb6464; + animation: systemd_failed_units_degraded 2s linear infinite; +} +@keyframes systemd_failed_units_degraded { + 50% { + color: #11111b; + } +} + + +#temperature { + color: #95d2b3; + +} +#temperature.critical { + color: #bb6464; + animation: temperature_critical 2s linear infinite; +} +@keyframes temperature_critical { + 50% { + color: #11111b; + } +} + + +#window { + color: #cdd6f4; +} + + +#wireplumber { + color: #b4befe; +} From 23e4b2ba0ae0096ed7e5d55a6a07abfc68cbdf91 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 7 Jun 2026 23:17:29 +0200 Subject: [PATCH 029/184] Provide proper wildcard names for network links --- home/hyprland/waybar/default.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index 42eb27c..d681a41 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -274,7 +274,7 @@ "network#ethernet" = { # see https://github.com/Alexays/Waybar/wiki/Module:-Network - interface = ""; + interface = "en*"; interval = 5; tooltip = true; format-ethernet = "󰈁"; @@ -292,7 +292,7 @@ "network#wifi" = { # see https://github.com/Alexays/Waybar/wiki/Module:-Network - interface = ""; + interface = "wl*"; interval = 5; tooltip = true; format-icons = [ From 93143fd3016f4c49c2e94a7334061d5e1b148825 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 8 Jun 2026 00:16:49 +0200 Subject: [PATCH 030/184] Fix hyprland logout --- home/hyprland/waybar/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index d681a41..ad0aa4c 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -90,7 +90,7 @@ menu-file = ./power-menu.xml; menu-actions = { lock = "${lib.getBin pkgs.systemd}/bin/loginctl lock-session"; - logout = "${lib.getExe pkgs.hyprshutdown}"; + logout = "${lib.getExe pkgs.uwsm} stop"; reboot = "${lib.getBin pkgs.systemd}/bin/systemctl reboot"; shutdown = "${lib.getBin pkgs.systemd}/bin/systemctl poweroff"; suspend = "${lib.getBin pkgs.systemd}/bin/systemctl suspend"; From c2e7193015fe9d4f1df30597d6a2189264ed41a5 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 8 Jun 2026 00:17:03 +0200 Subject: [PATCH 031/184] Add desktop fonts --- home/hyprland/default.nix | 1 + home/hyprland/fonts.nix | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 home/hyprland/fonts.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index a80d7a6..196aa5b 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -1,6 +1,7 @@ { imports = [ ./clipboard.nix + ./fonts.nix ./hypridle.nix ./hyprland.nix ./hyprlock.nix diff --git a/home/hyprland/fonts.nix b/home/hyprland/fonts.nix new file mode 100644 index 0000000..0f7dea6 --- /dev/null +++ b/home/hyprland/fonts.nix @@ -0,0 +1,22 @@ +{ pkgs, ... }: +{ + home.packages = with pkgs; [ + # Icon fonts + material-symbols + + # Sans(Serif) fonts + libertinus + noto-fonts + noto-fonts-cjk-sans + noto-fonts-color-emoji + roboto + (google-fonts.override { fonts = [ "Inter" ]; }) + + # Monospace fonts + jetbrains-mono + + # Nerdfonts + nerd-fonts.jetbrains-mono + nerd-fonts.symbols-only + ]; +} From 96196a82c9c21e5433668d9f5f26cc40fe8b4b76 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 8 Jun 2026 23:59:55 +0200 Subject: [PATCH 032/184] Add audio support --- system/default.nix | 1 + system/hardware/sound.nix | 16 ++++++++++++++++ 2 files changed, 17 insertions(+) create mode 100644 system/hardware/sound.nix diff --git a/system/default.nix b/system/default.nix index 33522cf..a15e58f 100644 --- a/system/default.nix +++ b/system/default.nix @@ -4,6 +4,7 @@ let ./hardware/fwupd.nix ./hardware/graphics.nix + ./hardware/sound.nix ./network ./network/avahi.nix diff --git a/system/hardware/sound.nix b/system/hardware/sound.nix new file mode 100644 index 0000000..5eedb14 --- /dev/null +++ b/system/hardware/sound.nix @@ -0,0 +1,16 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.hyprpwcenter + ]; + + services.pipewire = { + enable = true; + audio.enable = true; + + wireplumber.enable = true; + alsa.enable = true; + jack.enable = true; + pulse.enable = true; + }; +} From 6eafc9d5fd296386d6bb5c28c943a9e5096009c4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 9 Jun 2026 00:02:10 +0200 Subject: [PATCH 033/184] Move hyprpaper assets to dedicated folder --- home/hyprland/default.nix | 2 +- .../{hyprpaper.nix => hyprpaper/default.nix} | 0 home/hyprland/{ => hyprpaper}/screensaver.jpeg | Bin 3 files changed, 1 insertion(+), 1 deletion(-) rename home/hyprland/{hyprpaper.nix => hyprpaper/default.nix} (100%) rename home/hyprland/{ => hyprpaper}/screensaver.jpeg (100%) diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index 196aa5b..b94bb76 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -5,7 +5,7 @@ ./hypridle.nix ./hyprland.nix ./hyprlock.nix - ./hyprpaper.nix + ./hyprpaper ./hyprpolkitagent.nix ./hyprsysteminfo.nix ./qt.nix diff --git a/home/hyprland/hyprpaper.nix b/home/hyprland/hyprpaper/default.nix similarity index 100% rename from home/hyprland/hyprpaper.nix rename to home/hyprland/hyprpaper/default.nix diff --git a/home/hyprland/screensaver.jpeg b/home/hyprland/hyprpaper/screensaver.jpeg similarity index 100% rename from home/hyprland/screensaver.jpeg rename to home/hyprland/hyprpaper/screensaver.jpeg From ebc6c36eb061506b112eac01f6a77b34eb9fcdba Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 11 Jun 2026 22:15:17 +0200 Subject: [PATCH 034/184] Add dunstrc for notifications --- home/hyprland/default.nix | 1 + home/hyprland/notification/default.nix | 448 +++++++++++++++++++++++++ 2 files changed, 449 insertions(+) create mode 100644 home/hyprland/notification/default.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index b94bb76..3fe2162 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -8,6 +8,7 @@ ./hyprpaper ./hyprpolkitagent.nix ./hyprsysteminfo.nix + ./notification ./qt.nix ./waybar ]; diff --git a/home/hyprland/notification/default.nix b/home/hyprland/notification/default.nix new file mode 100644 index 0000000..40f9fd5 --- /dev/null +++ b/home/hyprland/notification/default.nix @@ -0,0 +1,448 @@ +{ pkgs, ... }: +{ + services.dunst = { + enable = true; + + settings = { + # See dunst(5) for all configuration options + global = { + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0; + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = "mouse"; + + ### Geometry ### + + # dynamic width from 0 to 300 + # width = (0, 300) + # constant width of 300 + width = 300; + + # The maximum height of a single notification, excluding the frame. + height = "(0, 150)"; + + # Position the notification in the top right corner + origin = "top-right"; + + # Offset from the origin + offset = "(10, 50)"; + + # Scale factor. It is auto-detected if value is 0. + scale = 0; + + # Maximum number of notification (0 means no limit) + notification_limit = 0; + + ### Progress bar ### + + # Turn on the progess bar. It appears when a progress hint is passed with + # for example dunstify -h int:value:12 + progress_bar = true; + + # Set the progress bar height. This includes the frame, so make sure + # it's at least twice as big as the frame width. + progress_bar_height = 10; + + # Set the frame width of the progress bar + progress_bar_frame_width = 1; + + # Set the minimum width for the progress bar + progress_bar_min_width = 150; + + # Set the maximum width for the progress bar + progress_bar_max_width = 300; + + # Show how many messages are currently hidden (because of + # notification_limit). + indicate_hidden = "yes"; + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). (X11 only) + transparency = 15; + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 1; + + # Padding between text and separator. + padding = 8; + + # Horizontal padding. + horizontal_padding = 10; + + # Padding between text and icon. + text_icon_padding = 0; + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 0; + + # Defines color of the frame around the notification window. + frame_color = "#788388"; + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = "frame"; + + # Sort messages by urgency. + sort = "yes"; + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + # idle_threshold = 120 + + ### Text ### + + font = "Noto Sans 10"; + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0; + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = "full"; + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "%s %p\n%b"; + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = "left"; + + # Vertical alignment of message text and icon. + # Possible values are "top", "center" and "bottom". + vertical_alignment = "center"; + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60; + + # Specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = "start"; + + # Ignore newlines '\n' in notifications. + ignore_newline = "no"; + + # Stack together notifications with the same content + stack_duplicates = "true"; + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = "false"; + + # Display indicators for URLs (U) and actions (A). + show_indicators = "yes"; + + ### Icons ### + + # Align icons left/right/off + icon_position = "left"; + + # Scale small icons up to this size, set to 0 to disable. Helpful + # for e.g. small files or high-dpi screens. In case of conflict, + # max_icon_size takes precedence over this. + min_icon_size = 96; + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 128; + + # Paths to default icons. + # Managed via nix package path + # icon_path = "/usr/share/icons/Adwaita/96x96/status/:/usr/share/icons/Adwaita/96x96/devices/"; + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = "yes"; + + # Maximum amount of notifications kept in history + history_length = "20"; + + ### Misc/Advanced ### + + # dmenu path. + # dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + # browser = /usr/bin/xdg-open + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = "true"; + + # Define the title of the windows spawned by dunst + title = "Dunst"; + + # Define the class of the windows spawned by dunst + class = "Dunst"; + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 0; + + # Ignore the dbus closeNotification message. + # Useful to enforce the timeout set by dunst configuration. Without this + # parameter, an application may close the notification sent before the + # user defined timeout. + ignore_dbusclose = "false"; + + ### Wayland ### + # These settings are Wayland-specific. They have no effect when using X11 + + # Uncomment this if you want to let notications appear under fullscreen + # applications (default: overlay) + # layer = top + + # Set this to true to use X11 output on Wayland. + force_xwayland = false; + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = "false"; + + ### mouse + + # Defines list of actions for each mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: Invoke the action determined by the action_name rule. If there is no + # such action, open the context menu. + # * open_url: If the notification has exactly one url, open it. If there are multiple + # ones, open the context menu. + # * close_current: Close current notification. + # * close_all: Close all notifications. + # * context: Open context menu for the notification. + # * context_all: Open context menu for all notifications. + # These values can be strung together for each mouse event, and + # will be executed in sequence. + mouse_left_click = "close_current"; + mouse_middle_click = "do_action, close_current"; + mouse_right_click = "close_all"; + }; + + # Experimental features that may or may not work correctly. Do not expect them + # to have a consistent behaviour across releases. + experimental = { + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = "false"; + }; + + urgency_low = { + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#263238"; + foreground = "#556064"; + timeout = 10; + # Icon for notifications with low urgency, uncomment to enable + #new_icon = /path/to/icon + }; + + urgency_normal = { + background = "#263238"; + foreground = "#F9FAF9"; + timeout = 10; + # Icon for notifications with normal urgency, uncomment to enable + #new_icon = /path/to/icon + }; + + urgency_critical = { + background = "#D62929"; + foreground = "#F9FAF9"; + frame_color = "#ff0000"; + timeout = 0; + # Icon for notifications with critical urgency, uncomment to enable + #new_icon = /path/to/icon + }; + + # Every section that isn't one of the above is interpreted as a rules to + # override settings for certain messages. + # + # Messages can be matched by + # appname (discouraged, see desktop_entry) + # body + # category + # desktop_entry + # icon + # match_transient + # msg_urgency + # stack_tag + # summary + # + # and you can override the + # background + # foreground + # format + # frame_color + # fullscreen + # new_icon + # set_stack_tag + # set_transient + # set_category + # timeout + # urgency + # skip_display + # history_ignore + # action_name + # word_wrap + # ellipsize + # alignment + # + # Shell-like globbing will get expanded. + # + # Instead of the appname filter, it's recommended to use the desktop_entry filter. + # GLib based applications export their desktop-entry name. In comparison to the appname, + # the desktop-entry won't get localized. + # + # SCRIPTING + # You can specify a script that gets run when the rule matches by + # setting the "script" option. + # The script will be called as follows: + # script appname summary body icon urgency + # where urgency can be "LOW", "NORMAL" or "CRITICAL". + # + # NOTE: It might be helpful to run dunst -print in a terminal in order + # to find fitting options for rules. + + # Disable the transient hint so that idle_threshold cannot be bypassed from the + # client + #[transient_disable] + # match_transient = yes + # set_transient = no + # + # Make the handling of transient notifications more strict by making them not + # be placed in history. + #[transient_history_ignore] + # match_transient = yes + # history_ignore = yes + + # fullscreen values + # show: show the notifications, regardless if there is a fullscreen window opened + # delay: displays the new notification, if there is no fullscreen window active + # If the notification is already drawn, it won't get undrawn. + # pushback: same as delay, but when switching into fullscreen, the notification will get + # withdrawn from screen again and will get delayed like a new notification + #[fullscreen_delay_everything] + # fullscreen = delay + #[fullscreen_show_critical] + # msg_urgency = critical + # fullscreen = show + + #[espeak] + # summary = "*" + # script = dunst_espeak.sh + + #[script-test] + # summary = "*script*" + # script = dunst_test.sh + + #[ignore] + # # This notification will not be displayed + # summary = "foobar" + # skip_display = true + + #[history-ignore] + # # This notification will not be saved in history + # summary = "foobar" + # history_ignore = yes + + #[skip-display] + # # This notification will not be displayed, but will be included in the history + # summary = "foobar" + # skip_display = yes + + #[signed_on] + # appname = Pidgin + # summary = "*signed on*" + # urgency = low + # + #[signed_off] + # appname = Pidgin + # summary = *signed off* + # urgency = low + # + #[says] + # appname = Pidgin + # summary = *says* + # urgency = critical + # + #[twitter] + # appname = Pidgin + # summary = *twitter.com* + # urgency = normal + # + #[stack-volumes] + # appname = "some_volume_notifiers" + # set_stack_tag = "volume" + # + # vim: ft=cfg + }; + }; +} From 275fd31be39684ec84d49eec6c0a12644e7b8cf1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 11 Jun 2026 22:25:53 +0200 Subject: [PATCH 035/184] Cleanup system --- system/core/security.nix | 5 ----- system/hardware/sound.nix | 12 ++++++------ 2 files changed, 6 insertions(+), 11 deletions(-) delete mode 100644 system/core/security.nix diff --git a/system/core/security.nix b/system/core/security.nix deleted file mode 100644 index f5e67b5..0000000 --- a/system/core/security.nix +++ /dev/null @@ -1,5 +0,0 @@ -{ - # Credits to: - # - https://github.com/fufexan/dotfiles/blob/main/system/core/security.nix - # - https://github.com/hlissner/dotfiles/blob/master/modules/security.nix -} diff --git a/system/hardware/sound.nix b/system/hardware/sound.nix index 5eedb14..697467c 100644 --- a/system/hardware/sound.nix +++ b/system/hardware/sound.nix @@ -5,12 +5,12 @@ ]; services.pipewire = { - enable = true; - audio.enable = true; + enable = true; + audio.enable = true; - wireplumber.enable = true; - alsa.enable = true; - jack.enable = true; - pulse.enable = true; + wireplumber.enable = true; + alsa.enable = true; + jack.enable = true; + pulse.enable = true; }; } From 698af7d69f48dd37f3107ea1391db67b9768fc22 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 12 Jun 2026 20:35:23 +0200 Subject: [PATCH 036/184] Waybar: add capslock check --- home/hyprland/waybar/default.nix | 734 ++++++++++++++++--------------- home/scripts/capslock-check.nix | 18 + 2 files changed, 390 insertions(+), 362 deletions(-) create mode 100644 home/scripts/capslock-check.nix diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index ad0aa4c..493634f 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -1,4 +1,9 @@ -{ pkgs, lib, ... }: +{ + self, + pkgs, + lib, + ... +}: { home.packages = [ pkgs.waybar @@ -8,398 +13,403 @@ enable = true; systemd.enable = true; - settings = [ - { - ########################### - ## default config - ########################### - layer = "top"; - position = "top"; - height = 42; - spacing = 4; - mode = "dock"; - exclusive = true; - gtk-layer-shell = true; - passthrough = false; - fixed-center = true; + settings = + let + capslock-check = "${ + import ../../scripts/capslock-check.nix { inherit pkgs lib; } + }/bin/capslock-check.sh"; + in + [ + { + ########################### + ## default config + ########################### + layer = "top"; + position = "top"; + height = 42; + spacing = 4; + mode = "dock"; + exclusive = true; + gtk-layer-shell = true; + passthrough = false; + fixed-center = true; - ########################### - ## layout - ########################### - modules-left = [ - "hyprland/workspaces" - "hyprland/window" - ]; - modules-center = [ - "idle_inhibitor" - "clock" - "hyprland/language" - # "custom/capslock" - "privacy" - "systemd-failed-units" - ]; - modules-right = [ - "bluetooth" - "custom/vpn" - "network#wifi" - "network#ethernet" - "battery" - "group/settings" - "cpu" - "memory" - "temperature" - "disk" - "tray" - "custom/power-buttons" - ]; + ########################### + ## layout + ########################### + modules-left = [ + "hyprland/workspaces" + "hyprland/window" + ]; + modules-center = [ + "idle_inhibitor" + "clock" + "hyprland/language" + "custom/capslock" + "privacy" + "systemd-failed-units" + ]; + modules-right = [ + "bluetooth" + "custom/vpn" + "network#wifi" + "network#ethernet" + "battery" + "group/settings" + "cpu" + "memory" + "temperature" + "disk" + "tray" + "custom/power-buttons" + ]; - ########################### - ## groups - ########################### + ########################### + ## groups + ########################### - # See https://github.com/Alexays/Waybar/wiki/Module:-Group - "group/settings" = { - orientation = "horizontal"; - modules = [ - "wireplumber" - "backlight" - ]; - drawer = { - transition-duration = 500; - transition-left-to-right = false; - click-to-reveal = false; + # See https://github.com/Alexays/Waybar/wiki/Module:-Group + "group/settings" = { + orientation = "horizontal"; + modules = [ + "wireplumber" + "backlight" + ]; + drawer = { + transition-duration = 500; + transition-left-to-right = false; + click-to-reveal = false; + }; }; - }; - ########################### - ## custom - ########################### + ########################### + ## custom + ########################### - # See https://github.com/Alexays/Waybar/wiki/Module:-Custom - # TODO: add script - # "custom/capslock" = { - # exec = "~/bin/capslock-check.sh"; - # restart-interval = 1; - # return-type = "json"; - # format = "{}"; - # }; - "custom/power-buttons" = { - format = "⏻"; - tooltip = false; - menu = "on-click"; - menu-file = ./power-menu.xml; - menu-actions = { - lock = "${lib.getBin pkgs.systemd}/bin/loginctl lock-session"; - logout = "${lib.getExe pkgs.uwsm} stop"; - reboot = "${lib.getBin pkgs.systemd}/bin/systemctl reboot"; - shutdown = "${lib.getBin pkgs.systemd}/bin/systemctl poweroff"; - suspend = "${lib.getBin pkgs.systemd}/bin/systemctl suspend"; + # See https://github.com/Alexays/Waybar/wiki/Module:-Custom + "custom/capslock" = { + exec = capslock-check; + restart-interval = 1; + return-type = "json"; + format = "{}"; + }; + "custom/power-buttons" = { + format = "⏻"; + tooltip = false; + menu = "on-click"; + menu-file = ./power-menu.xml; + menu-actions = { + lock = "${lib.getBin pkgs.systemd}/bin/loginctl lock-session"; + logout = "${lib.getExe pkgs.uwsm} stop"; + reboot = "${lib.getBin pkgs.systemd}/bin/systemctl reboot"; + shutdown = "${lib.getBin pkgs.systemd}/bin/systemctl poweroff"; + suspend = "${lib.getBin pkgs.systemd}/bin/systemctl suspend"; + }; }; - }; - # TODO: add script - # "custom/vpn" = { - # format = "{}"; - # exec = "~/bin/nmcli-active-vpn-conn.sh"; - # return-type = "json"; - # interval = 3; - # }; + # TODO: add script + # "custom/vpn" = { + # format = "{}"; + # exec = "~/bin/nmcli-active-vpn-conn.sh"; + # return-type = "json"; + # interval = 3; + # }; - ########################### - ## modules - ########################### + ########################### + ## modules + ########################### - # TODO: add script - # backlight = { - # # see https://github.com/Alexays/Waybar/wiki/Module:-Backlight - # interval = 2; - # format = "{icon} {percent}%"; - # format-icons = [ - # "󰛩" - # "󱩎" - # "󱩏" - # "󱩐" - # "󱩑" - # "󱩒" - # "󱩓" - # "󱩔" - # "󱩕" - # "󱩖" - # "󰛨" - # ]; - # scroll-step = 5; - # on-scroll-up = "~/bin/backlight.sh \"+5%\""; - # on-scroll-down = "~/bin/backlight.sh \"-5%\""; - # smooth-scrolling-threshold = 3; - # tooltip = false; - # }; + # TODO: add script + # backlight = { + # # see https://github.com/Alexays/Waybar/wiki/Module:-Backlight + # interval = 2; + # format = "{icon} {percent}%"; + # format-icons = [ + # "󰛩" + # "󱩎" + # "󱩏" + # "󱩐" + # "󱩑" + # "󱩒" + # "󱩓" + # "󱩔" + # "󱩕" + # "󱩖" + # "󰛨" + # ]; + # scroll-step = 5; + # on-scroll-up = "~/bin/backlight.sh \"+5%\""; + # on-scroll-down = "~/bin/backlight.sh \"-5%\""; + # smooth-scrolling-threshold = 3; + # tooltip = false; + # }; - battery = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Battery - interval = 3; - states = { - warning = 20; - critical = 10; + battery = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Battery + interval = 3; + states = { + warning = 20; + critical = 10; + }; + format-discharging = "{icon} {capacity}%"; + format-icons = [ + "" + "" + "" + "" + "" + ]; + format-full = " {capacity}%"; + format-plugged = " {capacity}%"; + format-charging = " {capacity}%"; + tooltip = true; + tooltip-format = "{timeTo}"; + max-length = 25; }; - format-discharging = "{icon} {capacity}%"; - format-icons = [ - "" - "" - "" - "" - "" - ]; - format-full = " {capacity}%"; - format-plugged = " {capacity}%"; - format-charging = " {capacity}%"; - tooltip = true; - tooltip-format = "{timeTo}"; - max-length = 25; - }; - bluetooth = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth - tooltip = true; - format = "󰂯"; - tooltip-format = "{controller_address} is {status}"; - format-disabled = "󰂲"; - tooltip-format-disabled = "Bluetooth disabled ({controller_address})"; - format-off = "󰂲"; - tooltip-format-off = "Bluetooth off ({controller_address})"; - format-on = "󰂲"; - tooltip-format-on = "Bluetooth on ({controller_address})"; - format-connected = "󰂱 {num_connections}"; - tooltip-format-connected = "{device_enumerate}"; - tooltip-format-enumerate-connected = "{device_alias}\t{device_address}"; - tooltip-format-enumerate-connected-battery = "{device_alias}\t{device_address}\tBattery: {device_battery_percentage}%"; - }; + bluetooth = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Bluetooth + tooltip = true; + format = "󰂯"; + tooltip-format = "{controller_address} is {status}"; + format-disabled = "󰂲"; + tooltip-format-disabled = "Bluetooth disabled ({controller_address})"; + format-off = "󰂲"; + tooltip-format-off = "Bluetooth off ({controller_address})"; + format-on = "󰂲"; + tooltip-format-on = "Bluetooth on ({controller_address})"; + format-connected = "󰂱 {num_connections}"; + tooltip-format-connected = "{device_enumerate}"; + tooltip-format-enumerate-connected = "{device_alias}\t{device_address}"; + tooltip-format-enumerate-connected-battery = "{device_alias}\t{device_address}\tBattery: {device_battery_percentage}%"; + }; - clock = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Clock - interval = 1; - format = "󰔠 {:%a, %Y-%m-%d %H:%M:%S}"; - # locale MUST be enabled - locale = "de_AT.UTF-8"; - ## "timezone": "Europe/Vienna", - ## "timezones": [ - ## "UTC", - ## ], - tooltip = true; - tooltip-format = "{calendar}"; - calendar = { - mode = "month"; - mode-mon-col = 3; - weeks-pos = "left"; - on-scroll = 1; - format = { - months = "{}"; - days = "{}"; - weeks = "CW{}"; - weekdays = "{}"; - today = "{}"; + clock = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Clock + interval = 1; + format = "󰔠 {:%a, %Y-%m-%d %H:%M:%S}"; + # locale MUST be enabled + locale = "de_AT.UTF-8"; + ## "timezone": "Europe/Vienna", + ## "timezones": [ + ## "UTC", + ## ], + tooltip = true; + tooltip-format = "{calendar}"; + calendar = { + mode = "month"; + mode-mon-col = 3; + weeks-pos = "left"; + on-scroll = 1; + format = { + months = "{}"; + days = "{}"; + weeks = "CW{}"; + weekdays = "{}"; + today = "{}"; + }; + }; + actions = { + # TODO: figure out how to deal with duplicate keys... + # "on-click-right"= "mode"; + # "on-scroll-up"= "tz_up"; + # "on-scroll-down"= "tz_down"; + # "on-scroll-up"= "shift_up"; + # "on-scroll-down"= "shift_down"; }; }; - actions = { - # TODO: figure out how to deal with duplicate keys... - # "on-click-right"= "mode"; - # "on-scroll-up"= "tz_up"; - # "on-scroll-down"= "tz_down"; - # "on-scroll-up"= "shift_up"; - # "on-scroll-down"= "shift_down"; - }; - }; - cpu = { - # see https://github.com/Alexays/Waybar/wiki/Module:-CPU - format = " {usage}%"; - tooltip = true; - interval = 1; - }; + cpu = { + # see https://github.com/Alexays/Waybar/wiki/Module:-CPU + format = " {usage}%"; + tooltip = true; + interval = 1; + }; - disk = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Disk - interval = 30; - format = "󰋊 {percentage_used}%"; - path = "/"; - unit = "GB"; - tooltip = true; - tooltip-format = "Free:\t\t{specific_free:0.2f} GB\t({percentage_free}%)\nUsed:\t\t{specific_used:0.2f} GB\t({percentage_used}%)\nTotal space:\t{specific_total:0.2f} GB"; - }; + disk = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Disk + interval = 30; + format = "󰋊 {percentage_used}%"; + path = "/"; + unit = "GB"; + tooltip = true; + tooltip-format = "Free:\t\t{specific_free:0.2f} GB\t({percentage_free}%)\nUsed:\t\t{specific_used:0.2f} GB\t({percentage_used}%)\nTotal space:\t{specific_total:0.2f} GB"; + }; - "hyprland/language" = { - format = "󰌌 {}"; - format-en = "en"; - format-de = "de"; - keyboard-name = "at-translated-set-2-keyboard"; - on-click = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; - on-scroll-up = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; - on-scroll-down = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard prev"; - }; + "hyprland/language" = { + format = "󰌌 {}"; + format-en = "en"; + format-de = "de"; + keyboard-name = "at-translated-set-2-keyboard"; + on-click = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-up = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-down = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard prev"; + }; - "hyprland/workspaces" = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces - active-only = true; - on-click = "activate"; - format = "{id}"; - all-outputs = false; - disable-scroll = false; - # "active-only"= false; - }; + "hyprland/workspaces" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces + active-only = true; + on-click = "activate"; + format = "{id}"; + all-outputs = false; + disable-scroll = false; + # "active-only"= false; + }; - "hyprland/window" = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#window - format = "{title}"; - separate-outputs = true; - }; + "hyprland/window" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#window + format = "{title}"; + separate-outputs = true; + }; - idle_inhibitor = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor - start-activated = false; - # Deactivate automatically after 2h - timeout = 120; - format = "{icon}"; - format-icons = { - activated = ""; - deactivated = ""; + idle_inhibitor = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Idle-Inhibitor + start-activated = false; + # Deactivate automatically after 2h + timeout = 120; + format = "{icon}"; + format-icons = { + activated = ""; + deactivated = ""; + }; + tooltip = true; }; - tooltip = true; - }; - memory = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Memory - interval = 10; - format = " {used:0.1f}Gi"; - tooltip = true; - tooltip-format = "Used:\t\t{used:0.1f}GiB ({percentage}%)\nAvailable:\t{avail:0.1f}GiB\nTotal:\t\t{total:0.1f}GiB"; - }; + memory = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Memory + interval = 10; + format = " {used:0.1f}Gi"; + tooltip = true; + tooltip-format = "Used:\t\t{used:0.1f}GiB ({percentage}%)\nAvailable:\t{avail:0.1f}GiB\nTotal:\t\t{total:0.1f}GiB"; + }; - "network#ethernet" = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Network - interface = "en*"; - interval = 5; - tooltip = true; - format-ethernet = "󰈁"; - tooltip-format-ethernet = "IP:\t\t{ipaddr}/{cidr}\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; - format-disabled = "󰈂"; - tooltip-format-disabled = "{ifname} is disabled"; - format-linked = "󰈂"; - tooltip-format-linked = "{ifname} is linked"; - # Do not show, when not connected at all - format-disconnected = ""; - # "tooltip-format-disconnected"= "{ifname} is not connected"; - format = ""; # do not show for any other states, except for those specified above - # "tooltip-format"= ""; - }; + "network#ethernet" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Network + interface = "en*"; + interval = 5; + tooltip = true; + format-ethernet = "󰈁"; + tooltip-format-ethernet = "IP:\t\t{ipaddr}/{cidr}\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; + format-disabled = "󰈂"; + tooltip-format-disabled = "{ifname} is disabled"; + format-linked = "󰈂"; + tooltip-format-linked = "{ifname} is linked"; + # Do not show, when not connected at all + format-disconnected = ""; + # "tooltip-format-disconnected"= "{ifname} is not connected"; + format = ""; # do not show for any other states, except for those specified above + # "tooltip-format"= ""; + }; - "network#wifi" = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Network - interface = "wl*"; - interval = 5; - tooltip = true; - format-icons = [ - "󰤯" - "󰤟" - "󰤢" - "󰤥" - "󰤨" - ]; - format-wifi = "{icon} {signalStrength}%"; - tooltip-format-wifi = "SSID:\t\t{essid}\nIP:\t\t{ipaddr}/{cidr}\nFrequency:\t{frequency} GHz\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; - format-disabled = "󰤫"; - tooltip-format-disabled = "{ifname} is disabled"; - format-linked = "󱛇"; - tooltip-format-linked = "{ifname} is linked"; - format-disconnected = "󰤮"; - tooltip-format-disconnected = "{ifname} is not connected"; - }; + "network#wifi" = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Network + interface = "wl*"; + interval = 5; + tooltip = true; + format-icons = [ + "󰤯" + "󰤟" + "󰤢" + "󰤥" + "󰤨" + ]; + format-wifi = "{icon} {signalStrength}%"; + tooltip-format-wifi = "SSID:\t\t{essid}\nIP:\t\t{ipaddr}/{cidr}\nFrequency:\t{frequency} GHz\nBandwith:\t {bandwidthDownBits} /  {bandwidthUpBits}\nInterface:\t{ifname}"; + format-disabled = "󰤫"; + tooltip-format-disabled = "{ifname} is disabled"; + format-linked = "󱛇"; + tooltip-format-linked = "{ifname} is linked"; + format-disconnected = "󰤮"; + tooltip-format-disconnected = "{ifname} is not connected"; + }; - privacy = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Privacy - icon-spacing = 4; - icon-size = 18; - transition-duration = 250; - expand = true; - ignore-monitor = false; - modules = [ - { - type = "screenshare"; - tooltip = true; - tooltip-icon-size = 24; - } - # { - # "type"= "audio-out"; - # "tooltip"= true; - # "tooltip-icon-size"= 24; - # } - { - type = "audio-in"; - tooltip = true; - tooltip-icon-size = 24; - } - # # Example for ignore object: - # { - # "type"= "audio-in"; - # "name"= "cava"; - # } - ]; - ignore = [ ]; - }; + privacy = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Privacy + icon-spacing = 4; + icon-size = 18; + transition-duration = 250; + expand = true; + ignore-monitor = false; + modules = [ + { + type = "screenshare"; + tooltip = true; + tooltip-icon-size = 24; + } + # { + # "type"= "audio-out"; + # "tooltip"= true; + # "tooltip-icon-size"= 24; + # } + { + type = "audio-in"; + tooltip = true; + tooltip-icon-size = 24; + } + # # Example for ignore object: + # { + # "type"= "audio-in"; + # "name"= "cava"; + # } + ]; + ignore = [ ]; + }; - systemd-failed-units = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Systemd-failed-units - hide-on-ok = true; - format = " {nr_failed}"; - system = true; - user = true; - }; + systemd-failed-units = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Systemd-failed-units + hide-on-ok = true; + format = " {nr_failed}"; + system = true; + user = true; + }; - temperature = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Temperature - # Leave commented out as the module will pick sensitive defaults - # "thermal-zone"= 2; - # Leave commented out as the module will pick sensitive defaults - # "hwmon-path"= "/sys/class/hwmon/hwmon2/temp1_input"; - format-icons = [ - "" - "" - "" - ]; - critical-threshold = 80; - format = "{icon} {temperatureC}°C"; - format-critical = "{temperatureC}°C {icon}"; - tooltip = true; - tooltip-format = "{temperatureC}°C"; - }; + temperature = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Temperature + # Leave commented out as the module will pick sensitive defaults + # "thermal-zone"= 2; + # Leave commented out as the module will pick sensitive defaults + # "hwmon-path"= "/sys/class/hwmon/hwmon2/temp1_input"; + format-icons = [ + "" + "" + "" + ]; + critical-threshold = 80; + format = "{icon} {temperatureC}°C"; + format-critical = "{temperatureC}°C {icon}"; + tooltip = true; + tooltip-format = "{temperatureC}°C"; + }; - tray = { - # see https://github.com/Alexays/Waybar/wiki/Module:-Tray - show-passive-items = true; - spacing = 10; - }; + tray = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Tray + show-passive-items = true; + spacing = 10; + }; - # TODO: add script + wireplumber - # wireplumber = { - # # see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber - # format = "{icon} {volume}%"; - # format-muted = "󰖁"; - # format-icons = [ - # "󰕿" - # "󰖀" - # "󰕾" - # ]; - # on-scroll-up = "~/bin/sound.sh \"volume\" \"+5%\""; - # on-scroll-down = "~/bin/sound.sh \"volume\" \"-5%\""; - # on-click = "~/bin/sound.sh \"mute\" \"toggle\""; - # on-click-middle = "helvum"; - # scroll-step = 5; - # max-volume = 100; - # tooltip = true; - # tooltip-format = "Volume:\t{volume}%\nNode:\t{node_name}"; - # smooth-scrolling-threshold = 3; - # node-type = "Audio/Sink"; - # }; + # TODO: add script + wireplumber + # wireplumber = { + # # see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber + # format = "{icon} {volume}%"; + # format-muted = "󰖁"; + # format-icons = [ + # "󰕿" + # "󰖀" + # "󰕾" + # ]; + # on-scroll-up = "~/bin/sound.sh \"volume\" \"+5%\""; + # on-scroll-down = "~/bin/sound.sh \"volume\" \"-5%\""; + # on-click = "~/bin/sound.sh \"mute\" \"toggle\""; + # on-click-middle = "helvum"; + # scroll-step = 5; + # max-volume = 100; + # tooltip = true; + # tooltip-format = "Volume:\t{volume}%\nNode:\t{node_name}"; + # smooth-scrolling-threshold = 3; + # node-type = "Audio/Sink"; + # }; - } - ]; + } + ]; style = builtins.readFile ./style.css; }; diff --git a/home/scripts/capslock-check.nix b/home/scripts/capslock-check.nix new file mode 100644 index 0000000..592f505 --- /dev/null +++ b/home/scripts/capslock-check.nix @@ -0,0 +1,18 @@ +{ pkgs, lib, ... }: +pkgs.writeShellScriptBin "capslock-check.sh" '' + while true + do + # Check if caps-lock LED is enabled for first-best input device + CAPS_ON="$(cat "$(find /sys/class/leds/input*::capslock/ -name 'brightness' | head -1)")" + + # empty string causes waybar to show nothing + TEXT="{ \"text\": \"\"}" + + if [[ "$CAPS_ON" == "1" ]]; then + TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" + fi + + echo "$TEXT" | ${lib.getExe pkgs.jq} --unbuffered --compact-output + sleep 1 + done +'' From 212686832f14a369505f3461f91a2460ed513328 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 12 Jun 2026 21:31:39 +0200 Subject: [PATCH 037/184] waybar: have capslock-check.sh reference proper coreutil bin paths --- home/scripts/capslock-check.nix | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/home/scripts/capslock-check.nix b/home/scripts/capslock-check.nix index 592f505..ddcff28 100644 --- a/home/scripts/capslock-check.nix +++ b/home/scripts/capslock-check.nix @@ -1,9 +1,15 @@ { pkgs, lib, ... }: +let + find = "${lib.getExe pkgs.findutils}"; + cat = "${lib.getBin pkgs.coreutils-full}/bin/cat"; + head = "${lib.getBin pkgs.coreutils-full}/bin/head"; + jq = "${lib.getExe pkgs.jq}"; +in pkgs.writeShellScriptBin "capslock-check.sh" '' while true do # Check if caps-lock LED is enabled for first-best input device - CAPS_ON="$(cat "$(find /sys/class/leds/input*::capslock/ -name 'brightness' | head -1)")" + CAPS_ON="$(${cat} "$(${find} /sys/class/leds/input*::capslock/ -name 'brightness' | ${head} -1)")" # empty string causes waybar to show nothing TEXT="{ \"text\": \"\"}" @@ -12,7 +18,7 @@ pkgs.writeShellScriptBin "capslock-check.sh" '' TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" fi - echo "$TEXT" | ${lib.getExe pkgs.jq} --unbuffered --compact-output + echo "$TEXT" | ${jq} --unbuffered --compact-output sleep 1 done '' From ea3998edda42fd40ae6fdaa2373fffa7cf79bf92 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 12 Jun 2026 21:32:50 +0200 Subject: [PATCH 038/184] waybar: fix active VPN detection --- home/hyprland/waybar/default.nix | 16 +++++++++------- home/scripts/nmcli-active-vpn-conn.nix | 22 ++++++++++++++++++++++ 2 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 home/scripts/nmcli-active-vpn-conn.nix diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index 493634f..9497aff 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -18,6 +18,9 @@ capslock-check = "${ import ../../scripts/capslock-check.nix { inherit pkgs lib; } }/bin/capslock-check.sh"; + nmcli-active-vpn-conn = "${ + import ../../scripts/nmcli-active-vpn-conn.nix { inherit pkgs lib; } + }/bin/nmcli-active-vpn-conn.sh"; in [ { @@ -106,13 +109,12 @@ suspend = "${lib.getBin pkgs.systemd}/bin/systemctl suspend"; }; }; - # TODO: add script - # "custom/vpn" = { - # format = "{}"; - # exec = "~/bin/nmcli-active-vpn-conn.sh"; - # return-type = "json"; - # interval = 3; - # }; + "custom/vpn" = { + format = "{}"; + exec = nmcli-active-vpn-conn; + return-type = "json"; + interval = 3; + }; ########################### ## modules diff --git a/home/scripts/nmcli-active-vpn-conn.nix b/home/scripts/nmcli-active-vpn-conn.nix new file mode 100644 index 0000000..0ca84c6 --- /dev/null +++ b/home/scripts/nmcli-active-vpn-conn.nix @@ -0,0 +1,22 @@ +{ pkgs, lib, ... }: +let + nmcli = "${lib.getBin pkgs.networkmanager}/bin/nmcli"; + awk = "${lib.getBin pkgs.gawk}/bin/awk"; + wc = "${lib.getBin pkgs.coreutils-full}/bin/wc"; + jq = "${lib.getBin pkgs.jq}/bin/jq"; +in +pkgs.writeShellScriptBin "nmcli-active-vpn-conn.sh" '' + ALL_ACTIVE_CONNS="$(${nmcli} con show --active)" + ALL_ACTIVE_VPN_CONNS="$(echo "$ALL_ACTIVE_CONNS" | ${awk} '{ if ($3=="vpn") print $1}')" + ALL_ACTIVE_VPN_CONNS_CNT="$(echo "$ALL_ACTIVE_VPN_CONNS" | ${wc} -l)" + + if [[ "$ALL_ACTIVE_VPN_CONNS" == "" ]]; then + echo "{ \"text\": \" 0\", \"tooltip\": \"No active VPN connections\", \"class\": \"inactive\" }" + + exit 0 + fi + + echo "{ \"text\": \" ''${ALL_ACTIVE_VPN_CONNS_CNT}\", \"tooltip\": "$(echo -n "$ALL_ACTIVE_VPN_CONNS" | ${jq} -Rsa .)", \"class\": \"active\" }" + + exit 0 +'' From 6fb771974d173505bda9e81c0508f9a3d5dc0a7f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 12 Jun 2026 23:01:16 +0200 Subject: [PATCH 039/184] waybar: add support for screen brigtness --- home/hyprland/waybar/default.nix | 50 +++++++++++++------------- home/scripts/backlight.nix | 32 +++++++++++++++++ home/scripts/capslock-check.nix | 2 +- home/scripts/nmcli-active-vpn-conn.nix | 18 +++++----- 4 files changed, 67 insertions(+), 35 deletions(-) create mode 100644 home/scripts/backlight.nix diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index 9497aff..d71388b 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -21,6 +21,7 @@ nmcli-active-vpn-conn = "${ import ../../scripts/nmcli-active-vpn-conn.nix { inherit pkgs lib; } }/bin/nmcli-active-vpn-conn.sh"; + backlight = "${import ../../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; in [ { @@ -120,30 +121,29 @@ ## modules ########################### - # TODO: add script - # backlight = { - # # see https://github.com/Alexays/Waybar/wiki/Module:-Backlight - # interval = 2; - # format = "{icon} {percent}%"; - # format-icons = [ - # "󰛩" - # "󱩎" - # "󱩏" - # "󱩐" - # "󱩑" - # "󱩒" - # "󱩓" - # "󱩔" - # "󱩕" - # "󱩖" - # "󰛨" - # ]; - # scroll-step = 5; - # on-scroll-up = "~/bin/backlight.sh \"+5%\""; - # on-scroll-down = "~/bin/backlight.sh \"-5%\""; - # smooth-scrolling-threshold = 3; - # tooltip = false; - # }; + backlight = { + # see https://github.com/Alexays/Waybar/wiki/Module:-Backlight + interval = 2; + format = "{icon} {percent}%"; + format-icons = [ + "󰛩" + "󱩎" + "󱩏" + "󱩐" + "󱩑" + "󱩒" + "󱩓" + "󱩔" + "󱩕" + "󱩖" + "󰛨" + ]; + scroll-step = 5; + on-scroll-up = "${backlight} \"+5%\""; + on-scroll-down = "${backlight} \"-5%\""; + smooth-scrolling-threshold = 3; + tooltip = false; + }; battery = { # see https://github.com/Alexays/Waybar/wiki/Module:-Battery @@ -193,7 +193,7 @@ locale = "de_AT.UTF-8"; ## "timezone": "Europe/Vienna", ## "timezones": [ - ## "UTC", + ## "UTC", ## ], tooltip = true; tooltip-format = "{calendar}"; diff --git a/home/scripts/backlight.nix b/home/scripts/backlight.nix new file mode 100644 index 0000000..b01c2e4 --- /dev/null +++ b/home/scripts/backlight.nix @@ -0,0 +1,32 @@ +{ pkgs, lib, ... }: +let + cut = "${lib.getBin pkgs.coreutils-full}/bin/cut"; + grep = "${lib.getBin pkgs.gnugrep}/bin/grep"; + brightnessctl = "${lib.getExe pkgs.brightnessctl}"; + notify-send = "${lib.getExe pkgs.libnotify}"; + + tela-circle-icon-theme."display-brightness-symbolic.svg" = + "${pkgs.tela-circle-icon-theme}/share/icons/Tela-circle/symbolic/status/display-brightness-symbolic.svg"; +in +pkgs.writeShellScriptBin "backlight.sh" '' + BRIGHTNESS="$(${brightnessctl} -m | ${cut} -d',' -f4 | ${grep} -Po '\d+')" + DIFF="$(echo "$1" | ${grep} -Po "[\+\-]\d+(?=%)")" + + # Round properly + TARGET_BRIGHTNESS="$(( (("$BRIGHTNESS" / 5) * 5) + "$DIFF" ))" + + # Do not go beyond the boundaries of 0 and 100 + TARGET_BRIGHTNESS="$(( 0 <= $TARGET_BRIGHTNESS ? $TARGET_BRIGHTNESS : 0 ))" + TARGET_BRIGHTNESS="$(( $TARGET_BRIGHTNESS <= 100 ? $TARGET_BRIGHTNESS : 100 ))" + + # Set brightness + ${brightnessctl} set "''${TARGET_BRIGHTNESS}%" + + # Show the brightness notification + ${notify-send} \ + -a "changeBrightness" \ + -u normal \ + -t 1500 \ + -i ${tela-circle-icon-theme."display-brightness-symbolic.svg"} \ + -h string:synchronous:my-progress "Brightness: ''${BRIGHTNESS}" +'' diff --git a/home/scripts/capslock-check.nix b/home/scripts/capslock-check.nix index ddcff28..8d997a7 100644 --- a/home/scripts/capslock-check.nix +++ b/home/scripts/capslock-check.nix @@ -15,7 +15,7 @@ pkgs.writeShellScriptBin "capslock-check.sh" '' TEXT="{ \"text\": \"\"}" if [[ "$CAPS_ON" == "1" ]]; then - TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" + TEXT="{ \"text\": \"󰘲\", \"class\": \"active\"}" fi echo "$TEXT" | ${jq} --unbuffered --compact-output diff --git a/home/scripts/nmcli-active-vpn-conn.nix b/home/scripts/nmcli-active-vpn-conn.nix index 0ca84c6..f12c86d 100644 --- a/home/scripts/nmcli-active-vpn-conn.nix +++ b/home/scripts/nmcli-active-vpn-conn.nix @@ -6,17 +6,17 @@ let jq = "${lib.getBin pkgs.jq}/bin/jq"; in pkgs.writeShellScriptBin "nmcli-active-vpn-conn.sh" '' - ALL_ACTIVE_CONNS="$(${nmcli} con show --active)" - ALL_ACTIVE_VPN_CONNS="$(echo "$ALL_ACTIVE_CONNS" | ${awk} '{ if ($3=="vpn") print $1}')" - ALL_ACTIVE_VPN_CONNS_CNT="$(echo "$ALL_ACTIVE_VPN_CONNS" | ${wc} -l)" + ALL_ACTIVE_CONNS="$(${nmcli} con show --active)" + ALL_ACTIVE_VPN_CONNS="$(echo "$ALL_ACTIVE_CONNS" | ${awk} '{ if ($3=="vpn") print $1}')" + ALL_ACTIVE_VPN_CONNS_CNT="$(echo "$ALL_ACTIVE_VPN_CONNS" | ${wc} -l)" - if [[ "$ALL_ACTIVE_VPN_CONNS" == "" ]]; then - echo "{ \"text\": \" 0\", \"tooltip\": \"No active VPN connections\", \"class\": \"inactive\" }" + if [[ "$ALL_ACTIVE_VPN_CONNS" == "" ]]; then + echo "{ \"text\": \" 0\", \"tooltip\": \"No active VPN connections\", \"class\": \"inactive\" }" - exit 0 - fi + exit 0 + fi - echo "{ \"text\": \" ''${ALL_ACTIVE_VPN_CONNS_CNT}\", \"tooltip\": "$(echo -n "$ALL_ACTIVE_VPN_CONNS" | ${jq} -Rsa .)", \"class\": \"active\" }" + echo "{ \"text\": \" ''${ALL_ACTIVE_VPN_CONNS_CNT}\", \"tooltip\": "$(echo -n "$ALL_ACTIVE_VPN_CONNS" | ${jq} -Rsa .)", \"class\": \"active\" }" - exit 0 + exit 0 '' From f4afce8473f1d418a66f07832fc7547f2821c8da Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 13 Jun 2026 18:11:33 +0200 Subject: [PATCH 040/184] waybar: add wireplumber sound module + script --- home/hyprland/waybar/default.nix | 43 +++++++-------- home/scripts/sound.nix | 90 ++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 21 deletions(-) create mode 100644 home/scripts/sound.nix diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index d71388b..dfea099 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -7,6 +7,7 @@ { home.packages = [ pkgs.waybar + pkgs.hyprpwcenter ]; programs.waybar = { @@ -22,6 +23,7 @@ import ../../scripts/nmcli-active-vpn-conn.nix { inherit pkgs lib; } }/bin/nmcli-active-vpn-conn.sh"; backlight = "${import ../../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; + sound = "${import ../../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; in [ { @@ -388,27 +390,26 @@ spacing = 10; }; - # TODO: add script + wireplumber - # wireplumber = { - # # see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber - # format = "{icon} {volume}%"; - # format-muted = "󰖁"; - # format-icons = [ - # "󰕿" - # "󰖀" - # "󰕾" - # ]; - # on-scroll-up = "~/bin/sound.sh \"volume\" \"+5%\""; - # on-scroll-down = "~/bin/sound.sh \"volume\" \"-5%\""; - # on-click = "~/bin/sound.sh \"mute\" \"toggle\""; - # on-click-middle = "helvum"; - # scroll-step = 5; - # max-volume = 100; - # tooltip = true; - # tooltip-format = "Volume:\t{volume}%\nNode:\t{node_name}"; - # smooth-scrolling-threshold = 3; - # node-type = "Audio/Sink"; - # }; + wireplumber = { + # see https://github.com/Alexays/Waybar/wiki/Module:-WirePlumber + format = "{icon} {volume}%"; + format-muted = "󰖁"; + format-icons = [ + "󰕿" + "󰖀" + "󰕾" + ]; + on-scroll-up = "${sound} \"volume\" \"+5%\""; + on-scroll-down = "${sound} \"volume\" \"-5%\""; + on-click = "${sound} \"mute\" \"toggle\""; + on-click-middle = "${lib.getExe pkgs.hyprpwcenter}"; + scroll-step = 5; + max-volume = 100; + tooltip = true; + tooltip-format = "Volume:\t{volume}%\nNode:\t{node_name}"; + smooth-scrolling-threshold = 3; + node-type = "Audio/Sink"; + }; } ]; diff --git a/home/scripts/sound.nix b/home/scripts/sound.nix new file mode 100644 index 0000000..1acc893 --- /dev/null +++ b/home/scripts/sound.nix @@ -0,0 +1,90 @@ +{ pkgs, lib, ... }: +let + bc = "${lib.getBin pkgs.bc}/bin/bc"; + wpctl = "${lib.getBin pkgs.wireplumber}/bin/wpctl"; + pw-play = "${lib.getBin pkgs.pipewire}/bin/pw-play"; + grep = "${lib.getBin pkgs.gnugrep}/bin/grep"; + notify-send = "${lib.getExe pkgs.libnotify}"; + sed = "${lib.getExe pkgs.gnused}"; + + freedesktop-sounds-path = + sound: "${pkgs.sound-theme-freedesktop}/share/sounds/freedesktop/stereo/${sound}"; + freedesktop-sounds = { + "audio-volume-change.oga" = freedesktop-sounds-path "audio-volume-change.oga"; + }; + + tela-icon-path = + icon: "${pkgs.tela-circle-icon-theme}/share/icons/Tela-circle-light/24/panel/${icon}"; + tela-circle-icon-theme = { + "audio-volume-muted-blocking.svg" = tela-icon-path "audio-volume-muted-blocking.svg"; + "audio-volume-muted.svg" = tela-icon-path "audio-volume-muted.svg"; + "audio-volume-low.svg" = tela-icon-path "audio-volume-muted.svg"; + "audio-volume-medium.svg" = tela-icon-path "audio-volume-medium.svg"; + "audio-volume-high.svg" = tela-icon-path "audio-volume-high.svg"; + }; +in +pkgs.writeShellScriptBin "sound.sh" '' + VOLUME="$(printf '%f * 100\n' "$(${wpctl} get-volume "@DEFAULT_SINK@" | ${grep} -Eo '[-+]?[0-9]+(\.[0-9]+)?')" | ${bc} -l | ${sed} -E 's/^([0-9]*)\.[0-9]*/\1/')" + MUTED="$(if [[ "$(${wpctl} get-volume "@DEFAULT_SINK@" | ${grep} -Eo 'MUTED')" ]]; then echo yes; else echo no; fi)" + + if [[ "$1" == "mute" && "$2" == "toggle" ]]; then + # toggle mute + ${wpctl} set-mute "@DEFAULT_SINK@" toggle + + MSG="Volume muted" + ICON="${tela-circle-icon-theme."audio-volume-muted-blocking.svg"}" + if [[ "$MUTED" == "yes" ]]; then + # in this case, we toggle to unmute + MSG="Volume unmuted" + ICON="${tela-circle-icon-theme."audio-volume-muted.svg"}" + fi + + ${notify-send} \ + -a "changeVolume" \ + -u normal \ + -t 1500 \ + -i "$ICON" \ + -h string:synchronous:my-progress "$MSG" + + exit 0 + fi + + if [[ "$1" == "volume" ]]; then + # Force unmuting upon changing sound + ${wpctl} set-mute @DEFAULT_SINK@ 0 + + DIFF="$(echo "$2" | ${grep} -Po "[\+\-]\d+(?=%)")" + + # Round properly + TARGET_VOLUME="$(( (("$VOLUME" / 5) * 5) + "$DIFF" ))" + + # Do not go beyond the boundaries of 0 and 100 + TARGET_VOLUME="$(( 0 <= $TARGET_VOLUME ? $TARGET_VOLUME : 0 ))" + TARGET_VOLUME="$(( $TARGET_VOLUME <= 100 ? $TARGET_VOLUME : 100 ))" + + # Set again with properly rounded value + # As a special case, wpctl wants to target volume as a fraction. + # That is, 50 % => 0.50; 100 % => 1.00; etc + ${wpctl} set-volume "@DEFAULT_SINK@" "$(printf '%.2f' "$(echo "$TARGET_VOLUME / 100" | ${bc} -l)")" + + # icon to display + ICON="${tela-circle-icon-theme."audio-volume-low.svg"}" + if [[ "$TARGET_VOLUME" -ge "33" ]]; then + ICON="${tela-circle-icon-theme."audio-volume-medium.svg"}" + fi + if [[ "$TARGET_VOLUME" -ge "66" ]]; then + ICON="${tela-circle-icon-theme."audio-volume-high.svg"}" + fi + + # Show the volume notification + ${notify-send} \ + -a "changeVolume" \ + -u normal \ + -t 1500 \ + -i "$ICON" \ + -h string:synchronous:my-progress "Volume: ''${TARGET_VOLUME}%" + + # Play the volume changed sound + ${pw-play} "${freedesktop-sounds."audio-volume-change.oga"}" + fi +'' From 9a0cee6e2ae1f3fdd20dd16110fec9fb88cfc28f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 13 Jun 2026 18:15:59 +0200 Subject: [PATCH 041/184] Minor `treefmt` formatting fixes --- home/hyprland/waybar/default.nix | 1 - hosts/nixos-btw/default.nix | 6 +++++- hosts/nixos-btw/disko.nix | 3 +-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index dfea099..f2fe501 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -410,7 +410,6 @@ smooth-scrolling-threshold = 3; node-type = "Audio/Sink"; }; - } ]; diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix index cae5ac1..32b1687 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/nixos-btw/default.nix @@ -1,4 +1,8 @@ -{ inputs, home-manager, ... }: +{ + inputs, + home-manager, + ... +}: { imports = [ ./hardware-configuration.nix diff --git a/hosts/nixos-btw/disko.nix b/hosts/nixos-btw/disko.nix index 2bd8833..3f2ffde 100644 --- a/hosts/nixos-btw/disko.nix +++ b/hosts/nixos-btw/disko.nix @@ -24,8 +24,7 @@ type = "luks"; name = "volgroup0"; extraOpenArgs = [ ]; - settings = { - }; + settings = { }; additionalKeyFiles = [ ]; content = { type = "lvm_pv"; From d16c8d3435f3ebf184aaf8f74741daebc83ca856 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 13 Jun 2026 18:33:21 +0200 Subject: [PATCH 042/184] hyprland: add sound XF86 keys --- home/hyprland/hyprland.nix | 37 ++++++++++++++++++++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 6f127ec..15398dc 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -18,6 +18,8 @@ configType = "lua"; settings = let + sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + # Smart gaps # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps smart-gaps = { @@ -83,6 +85,10 @@ _var = "${lib.getExe pkgs.hyprshutdown}"; }; + sound = { + _var = "${sound}"; + }; + ######################## ## Monitors ######################## @@ -575,7 +581,36 @@ } # Multimedia keys - # TODO: volume (require pipewire setup) + { + _args = [ + "XF86AudioRaiseVolume" + (mkLuaInline "hl.dsp.exec_cmd(sound .. \" \\\"volume\\\" \\\"+5%\\\"\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86AudioLowerVolume" + (mkLuaInline "hl.dsp.exec_cmd(sound .. \" \\\"volume\\\" \\\"-5%\\\"\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86AudioMute" + (mkLuaInline "hl.dsp.exec_cmd(sound .. \" \\\"mute\\\" \\\"toggle\\\"\")") + { + locked = true; + repeating = true; + } + ]; + } # TODO: multimedia keys (play, stop, next, previous...) # TODO: brightness # TODO: screenshots From 940cd42ffa1fcc33dcad30f6418c0d52eb9dda29 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 14 Jun 2026 00:11:04 +0200 Subject: [PATCH 043/184] hyprland: add brigthness bindings for XF86 keys --- home/hyprland/hyprland.nix | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 15398dc..63c6233 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -19,6 +19,7 @@ settings = let sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; # Smart gaps # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps @@ -65,8 +66,8 @@ _var = "ALT"; }; - terminal = { - _var = "${lib.getExe pkgs.kitty}"; + backlight = { + _var = "${backlight}"; }; fileManager = { @@ -89,6 +90,10 @@ _var = "${sound}"; }; + terminal = { + _var = "${lib.getExe pkgs.kitty}"; + }; + ######################## ## Monitors ######################## @@ -611,7 +616,29 @@ } ]; } - # TODO: multimedia keys (play, stop, next, previous...) + + # Brightness control + { + _args = [ + "XF86MonBrightnessUp" + (mkLuaInline "hl.dsp.exec_cmd(backlight .. \" \\\"+5%\\\"\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86MonBrightnessDown" + (mkLuaInline "hl.dsp.exec_cmd(backlight .. \" \\\"-5%\\\"\")") + { + locked = true; + repeating = true; + } + ]; + } + # TODO: brightness # TODO: screenshots ]; From e3da0ddc7ae48fcf02aa688a143639eb5db1eebf Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 14 Jun 2026 02:41:55 +0200 Subject: [PATCH 044/184] hyprland: add multi-media bindings for XF86 keys --- home/hyprland/hyprland.nix | 36 +++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 63c6233..7805de1 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -6,6 +6,7 @@ pkgs.pcmanfm pkgs.rofi pkgs.yazi + pkgs.playerctl ]; wayland.windowManager.hyprland = { @@ -82,6 +83,10 @@ _var = "${lib.getExe pkgs.rofi} -show drun -drun-show-actions"; }; + playerctl = { + _var = "${lib.getExe pkgs.playerctl}"; + }; + shutdown = { _var = "${lib.getExe pkgs.hyprshutdown}"; }; @@ -639,7 +644,36 @@ ]; } - # TODO: brightness + # Multimedia control + { + _args = [ + "XF86AudioNext" + (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"next\\\"\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPrev" + (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"previous\\\"\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPlay" + (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"play-pause\\\"\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPause" + (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"play-pause\\\"\")") + { locked = true; } + ]; + } + # TODO: screenshots ]; From 45ba3a03c092662ad484f265401de36ad2df3f0f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 14 Jun 2026 02:51:55 +0200 Subject: [PATCH 045/184] hyprland: add rfkill toggle for XF86 key --- home/hyprland/hyprland.nix | 14 +++++++++++++ home/scripts/rfkill-toggle.nix | 38 ++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 home/scripts/rfkill-toggle.nix diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 7805de1..20013b0 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -21,6 +21,7 @@ let sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; + rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; # Smart gaps # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps @@ -87,6 +88,10 @@ _var = "${lib.getExe pkgs.playerctl}"; }; + rfkillToggle = { + _var = "${rfkill-toggle}"; + }; + shutdown = { _var = "${lib.getExe pkgs.hyprshutdown}"; }; @@ -675,6 +680,15 @@ } # TODO: screenshots + + # Other XF86 key bindings + { + _args = [ + "XF86RFKill" + (mkLuaInline "hl.dsp.exec_cmd(rfkillToggle)") + { locked = true; } + ]; + } ]; ################################ diff --git a/home/scripts/rfkill-toggle.nix b/home/scripts/rfkill-toggle.nix new file mode 100644 index 0000000..ae9181b --- /dev/null +++ b/home/scripts/rfkill-toggle.nix @@ -0,0 +1,38 @@ +{ pkgs, lib, ... }: +let + rfkill = "${lib.getBin pkgs.util-linux}/bin/rfkill"; + xargs = "${lib.getBin pkgs.findutils}/bin/xargs"; + jq = "${lib.getExe pkgs.jq}"; + notify-send = "${lib.getExe pkgs.libnotify}"; + + tela-icon-path = icon: "${pkgs.tela-circle-icon-theme}/share/icons/Tela-circle/22/panel/${icon}"; + tela-circle-icon-theme = { + "network-flightmode-off.svg" = tela-icon-path "network-flightmode-off.svg"; + "network-flightmode-on.svg" = tela-icon-path "network-flightmode-on.svg"; + }; +in +pkgs.writeShellScriptBin "rfkill-toggle.sh" '' + # Toggle rfkill switches + ${rfkill} --json | ${jq} --raw-output0 '.rfkilldevices | map(.type) | .[]' | ${xargs} -0 -L1 ${rfkill} toggle + + # Check current status on first-best device + STATUS="$(${rfkill} --json | ${jq} -r '.rfkilldevices[0].soft')" + + # Show notification + UNBLOCKED="${tela-circle-icon-theme."network-flightmode-off.svg"}" + BLOCKED="${tela-circle-icon-theme."network-flightmode-on.svg"}" + + ICON="$UNBLOCKED" + STATUS_TXT="off" + if [[ $STATUS == "blocked" ]]; then + ICON="$BLOCKED" + STATUS_TXT="on" + fi + + ${notify-send} \ + -a "changeFlightmode" \ + -u normal \ + -t 1500 \ + -i "$ICON" \ + -h string:synchronous:my-progress "Flightmode: $STATUS_TXT" +'' From bf5b5b1139a74de26e894f28657592e2bccd1080 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 14 Jun 2026 20:35:13 +0200 Subject: [PATCH 046/184] waybar: add screenshot support via grimblast --- home/hyprland/hyprland.nix | 44 +++++++++++++++++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 20013b0..b7105e0 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -2,11 +2,13 @@ { home.packages = [ pkgs.hyprshutdown + pkgs.coreutils-full pkgs.kitty pkgs.pcmanfm pkgs.rofi pkgs.yazi pkgs.playerctl + pkgs.grimblast ]; wayland.windowManager.hyprland = { @@ -72,6 +74,10 @@ _var = "${backlight}"; }; + date = { + _var = "${lib.getBin pkgs.coreutils-full}/bin/date"; + }; + fileManager = { _var = "${lib.getExe pkgs.pcmanfm}"; }; @@ -80,6 +86,10 @@ _var = "${lib.getExe pkgs.yazi}"; }; + grimblast = { + _var = "${lib.getExe pkgs.grimblast}"; + }; + menu = { _var = "${lib.getExe pkgs.rofi} -show drun -drun-show-actions"; }; @@ -104,6 +114,10 @@ _var = "${lib.getExe pkgs.kitty}"; }; + xdgUserDirs = { + _var = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; + }; + ######################## ## Monitors ######################## @@ -679,7 +693,35 @@ ]; } - # TODO: screenshots + # Screenshots + { + _args = [ + "Print" + (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify save area \\\"$(\" .. xdgUserDirs .. \" PICTURES)/$(\" .. date .. \" --utc '+%F_%H.%M.%S').png\\\"\")") + { locked = true; } + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + Print\"") + (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify copy area\")") + { locked = true; } + ]; + } + { + _args = [ + "CTRL + Print" + (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify save active \\\"$(\" .. xdgUserDirs .. \" PICTURES)/$(\" .. date .. \" --utc '+%F_%H.%M.%S').png\\\"\")") + { locked = true; } + ]; + } + { + _args = [ + (mkLuaInline "mod .. \" + CTRL + Print\"") + (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify copy active\")") + { locked = true; } + ]; + } # Other XF86 key bindings { From 2909c7cd78553023946713c9d679e13dd6319f93 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 15 Jun 2026 22:02:15 +0200 Subject: [PATCH 047/184] hyprland: remove unecessasry lua vars Remove unnecessary lua vars - we can already template placeholders in nix directly, which allows us to avoid bogus nix-to-lua templating and string-concatenation voodoo. --- home/hyprland/hyprland.nix | 96 ++++++++++++-------------------------- 1 file changed, 29 insertions(+), 67 deletions(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index b7105e0..730acf1 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -24,6 +24,16 @@ sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; + fileManager = "${lib.getExe pkgs.pcmanfm}"; + fileManagerCli = "${lib.getExe pkgs.yazi}"; + terminal = "${lib.getExe pkgs.kitty}"; + menu = "${lib.getExe pkgs.rofi}"; + playerctl = "${lib.getExe pkgs.playerctl}"; + rfkillToggle = "${rfkill-toggle}"; + logout = "${lib.getExe pkgs.hyprshutdown}"; + date = "${lib.getBin pkgs.coreutils-full}/bin/date"; + grimblast = "${lib.getExe pkgs.grimblast}"; + xdgUserDirs = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; # Smart gaps # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps @@ -70,54 +80,6 @@ _var = "ALT"; }; - backlight = { - _var = "${backlight}"; - }; - - date = { - _var = "${lib.getBin pkgs.coreutils-full}/bin/date"; - }; - - fileManager = { - _var = "${lib.getExe pkgs.pcmanfm}"; - }; - - fileManagerCli = { - _var = "${lib.getExe pkgs.yazi}"; - }; - - grimblast = { - _var = "${lib.getExe pkgs.grimblast}"; - }; - - menu = { - _var = "${lib.getExe pkgs.rofi} -show drun -drun-show-actions"; - }; - - playerctl = { - _var = "${lib.getExe pkgs.playerctl}"; - }; - - rfkillToggle = { - _var = "${rfkill-toggle}"; - }; - - shutdown = { - _var = "${lib.getExe pkgs.hyprshutdown}"; - }; - - sound = { - _var = "${sound}"; - }; - - terminal = { - _var = "${lib.getExe pkgs.kitty}"; - }; - - xdgUserDirs = { - _var = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; - }; - ######################## ## Monitors ######################## @@ -481,7 +443,7 @@ { _args = [ (mkLuaInline "mod .. \" + Q\"") - (mkLuaInline "hl.dsp.exec_cmd(terminal)") + (mkLuaInline "hl.dsp.exec_cmd('${terminal}')") ]; } { @@ -493,19 +455,19 @@ { _args = [ (mkLuaInline "mod .. \" + M\"") - (mkLuaInline "hl.dsp.exec_cmd(shutdown)") + (mkLuaInline "hl.dsp.exec_cmd('${logout}')") ]; } { _args = [ (mkLuaInline "mod .. \" + E\"") - (mkLuaInline "hl.dsp.exec_cmd(fileManager)") + (mkLuaInline "hl.dsp.exec_cmd('${fileManager}')") ]; } { _args = [ (mkLuaInline "mod .. \" + SHIFT + E\"") - (mkLuaInline "hl.dsp.exec_cmd(terminal .. \" \" .. fileManagerCli)") + (mkLuaInline "hl.dsp.exec_cmd('${terminal} ${fileManagerCli}')") ]; } { @@ -517,7 +479,7 @@ { _args = [ (mkLuaInline "mod .. \" + R\"") - (mkLuaInline "hl.dsp.exec_cmd(menu)") + (mkLuaInline "hl.dsp.exec_cmd('${menu} -show drun -drun-show-actions')") ]; } { @@ -613,7 +575,7 @@ { _args = [ "XF86AudioRaiseVolume" - (mkLuaInline "hl.dsp.exec_cmd(sound .. \" \\\"volume\\\" \\\"+5%\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '+5%'\")") { locked = true; repeating = true; @@ -623,7 +585,7 @@ { _args = [ "XF86AudioLowerVolume" - (mkLuaInline "hl.dsp.exec_cmd(sound .. \" \\\"volume\\\" \\\"-5%\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '-5%'\")") { locked = true; repeating = true; @@ -633,7 +595,7 @@ { _args = [ "XF86AudioMute" - (mkLuaInline "hl.dsp.exec_cmd(sound .. \" \\\"mute\\\" \\\"toggle\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} mute toggle\")") { locked = true; repeating = true; @@ -645,7 +607,7 @@ { _args = [ "XF86MonBrightnessUp" - (mkLuaInline "hl.dsp.exec_cmd(backlight .. \" \\\"+5%\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '+5%'\")") { locked = true; repeating = true; @@ -655,7 +617,7 @@ { _args = [ "XF86MonBrightnessDown" - (mkLuaInline "hl.dsp.exec_cmd(backlight .. \" \\\"-5%\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '-5%'\")") { locked = true; repeating = true; @@ -667,28 +629,28 @@ { _args = [ "XF86AudioNext" - (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"next\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'next'\")") { locked = true; } ]; } { _args = [ "XF86AudioPrev" - (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"previous\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'previous'\")") { locked = true; } ]; } { _args = [ "XF86AudioPlay" - (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"play-pause\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") { locked = true; } ]; } { _args = [ "XF86AudioPause" - (mkLuaInline "hl.dsp.exec_cmd(playerctl .. \" \\\"play-pause\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") { locked = true; } ]; } @@ -697,28 +659,28 @@ { _args = [ "Print" - (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify save area \\\"$(\" .. xdgUserDirs .. \" PICTURES)/$(\" .. date .. \" --utc '+%F_%H.%M.%S').png\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save area \"$(${xdgUserDirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") { locked = true; } ]; } { _args = [ (mkLuaInline "mod .. \" + Print\"") - (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify copy area\")") + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy area')") { locked = true; } ]; } { _args = [ "CTRL + Print" - (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify save active \\\"$(\" .. xdgUserDirs .. \" PICTURES)/$(\" .. date .. \" --utc '+%F_%H.%M.%S').png\\\"\")") + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save active \"$(${xdgUserDirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") { locked = true; } ]; } { _args = [ (mkLuaInline "mod .. \" + CTRL + Print\"") - (mkLuaInline "hl.dsp.exec_cmd(grimblast .. \" --notify copy active\")") + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy active')") { locked = true; } ]; } @@ -727,7 +689,7 @@ { _args = [ "XF86RFKill" - (mkLuaInline "hl.dsp.exec_cmd(rfkillToggle)") + (mkLuaInline "hl.dsp.exec_cmd('${rfkillToggle}')") { locked = true; } ]; } From af82feb23ff763dd722d8537b0af8a1b0791dc68 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 15 Jun 2026 22:10:30 +0200 Subject: [PATCH 048/184] hyprland: sort and fix some binary path vars --- home/hyprland/hyprland.nix | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 730acf1..a2b1353 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -21,19 +21,19 @@ configType = "lua"; settings = let - sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + # Paths to binaries backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; - rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; + date = "${lib.getBin pkgs.coreutils-full}/bin/date"; fileManager = "${lib.getExe pkgs.pcmanfm}"; - fileManagerCli = "${lib.getExe pkgs.yazi}"; - terminal = "${lib.getExe pkgs.kitty}"; + filemanager-cli = "${lib.getExe pkgs.yazi}"; + grimblast = "${lib.getExe pkgs.grimblast}"; + logout = "${lib.getExe pkgs.hyprshutdown}"; menu = "${lib.getExe pkgs.rofi}"; playerctl = "${lib.getExe pkgs.playerctl}"; - rfkillToggle = "${rfkill-toggle}"; - logout = "${lib.getExe pkgs.hyprshutdown}"; - date = "${lib.getBin pkgs.coreutils-full}/bin/date"; - grimblast = "${lib.getExe pkgs.grimblast}"; - xdgUserDirs = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; + rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; + sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + terminal = "${lib.getExe pkgs.kitty}"; + xdg-user-dirs = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; # Smart gaps # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps @@ -467,7 +467,7 @@ { _args = [ (mkLuaInline "mod .. \" + SHIFT + E\"") - (mkLuaInline "hl.dsp.exec_cmd('${terminal} ${fileManagerCli}')") + (mkLuaInline "hl.dsp.exec_cmd('${terminal} ${filemanager-cli}')") ]; } { @@ -659,7 +659,7 @@ { _args = [ "Print" - (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save area \"$(${xdgUserDirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save area \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") { locked = true; } ]; } @@ -673,7 +673,7 @@ { _args = [ "CTRL + Print" - (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save active \"$(${xdgUserDirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save active \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") { locked = true; } ]; } @@ -689,7 +689,7 @@ { _args = [ "XF86RFKill" - (mkLuaInline "hl.dsp.exec_cmd('${rfkillToggle}')") + (mkLuaInline "hl.dsp.exec_cmd('${rfkill-toggle}')") { locked = true; } ]; } From b8ee0d4db11778b7118f4988eb8951fbffb4311d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 15 Jun 2026 22:32:09 +0200 Subject: [PATCH 049/184] hyprland: avoid lua templating for MOD key --- home/hyprland/hyprland.nix | 1389 ++++++++++++++++++------------------ 1 file changed, 697 insertions(+), 692 deletions(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index a2b1353..ff58293 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -11,736 +11,741 @@ pkgs.grimblast ]; - wayland.windowManager.hyprland = { - enable = true; - xwayland.enable = true; - - systemd.enable = true; - systemd.variables = [ "--all" ]; - - configType = "lua"; - settings = - let - # Paths to binaries - backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; - date = "${lib.getBin pkgs.coreutils-full}/bin/date"; - fileManager = "${lib.getExe pkgs.pcmanfm}"; - filemanager-cli = "${lib.getExe pkgs.yazi}"; - grimblast = "${lib.getExe pkgs.grimblast}"; - logout = "${lib.getExe pkgs.hyprshutdown}"; - menu = "${lib.getExe pkgs.rofi}"; - playerctl = "${lib.getExe pkgs.playerctl}"; - rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; - sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; - terminal = "${lib.getExe pkgs.kitty}"; - xdg-user-dirs = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; - - # Smart gaps - # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps - smart-gaps = { - workspace-rule = [ - { - workspace = "w[tv1]"; - gaps_out = 0; - gaps_in = 0; - } - { - workspace = "f[1]"; - gaps_out = 0; - gaps_in = 0; + wayland.windowManager.hyprland = + let + # Mod key + MOD = "ALT"; + in + { + enable = true; + xwayland.enable = true; + + systemd.enable = true; + systemd.variables = [ "--all" ]; + + configType = "lua"; + settings = + let + # Paths to binaries + backlight = "${import ../scripts/backlight.nix { inherit pkgs lib; }}/bin/backlight.sh"; + date = "${lib.getBin pkgs.coreutils-full}/bin/date"; + fileManager = "${lib.getExe pkgs.pcmanfm}"; + filemanager-cli = "${lib.getExe pkgs.yazi}"; + grimblast = "${lib.getExe pkgs.grimblast}"; + logout = "${lib.getExe pkgs.hyprshutdown}"; + menu = "${lib.getExe pkgs.rofi}"; + playerctl = "${lib.getExe pkgs.playerctl}"; + rfkill-toggle = "${import ../scripts/rfkill-toggle.nix { inherit pkgs lib; }}/bin/rfkill-toggle.sh"; + sound = "${import ../scripts/sound.nix { inherit pkgs lib; }}/bin/sound.sh"; + terminal = "${lib.getExe pkgs.kitty}"; + xdg-user-dirs = "${lib.getBin pkgs.xdg-user-dirs}/bin/xdg-user-dir"; + + # Smart gaps + # See https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/#smart-gaps + smart-gaps = { + workspace-rule = [ + { + workspace = "w[tv1]"; + gaps_out = 0; + gaps_in = 0; + } + { + workspace = "f[1]"; + gaps_out = 0; + gaps_in = 0; + } + ]; + window-rule = [ + { + match = { + float = false; + workspace = "w[tv1]"; + }; + border_size = 0; + rounding = 0; + } + { + match = { + float = false; + workspace = "f[1]"; + }; + border_size = 0; + rounding = 0; + } + ]; + }; + in + with lib.generators; + { + ######################## + ## VARS + ######################## + + # mod = { + # _var = "ALT"; + # }; + + ######################## + ## Monitors + ######################## + + # See https://wiki.hypr.land/Configuring/Basics/Monitors/ + monitor = [ + { + # Sensitive default for arbitrary new monitors + output = ""; + mode = "preferred"; + position = "auto"; + scale = 1; } ]; - window-rule = [ + + ############################# + ### ENVIRONMENT VARIABLES ### + ############################# + + # See https://wiki.hypr.land/Configuring/Environment-variables/ + env = [ { - match = { - float = false; - workspace = "w[tv1]"; - }; - border_size = 0; - rounding = 0; + _args = [ + "XCURSOR_SIZE" + "24" + ]; } { - match = { - float = false; - workspace = "f[1]"; - }; - border_size = 0; - rounding = 0; + _args = [ + "HYPRCURSOR_SIZE" + "24" + ]; } ]; - }; - in - with lib.generators; - { - ######################## - ## VARS - ######################## - - mod = { - _var = "ALT"; - }; - ######################## - ## Monitors - ######################## - - # See https://wiki.hypr.land/Configuring/Basics/Monitors/ - monitor = [ - { - # Sensitive default for arbitrary new monitors - output = ""; - mode = "preferred"; - position = "auto"; - scale = 1; - } - ]; - - ############################# - ### ENVIRONMENT VARIABLES ### - ############################# - - # See https://wiki.hypr.land/Configuring/Environment-variables/ - env = [ - { - _args = [ - "XCURSOR_SIZE" - "24" - ]; - } - { - _args = [ - "HYPRCURSOR_SIZE" - "24" - ]; - } - ]; - - ################### - ### PERMISSIONS ### - ################### - - # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem - config.ecosystem = { - no_update_news = false; - no_donation_nag = true; - # enforce_permissions = true; - }; + ################### + ### PERMISSIONS ### + ################### - ##################### - ### LOOK AND FEEL ### - ##################### + # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem + config.ecosystem = { + no_update_news = false; + no_donation_nag = true; + # enforce_permissions = true; + }; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#general - config.general = { - gaps_in = 5; - gaps_out = 20; + ##################### + ### LOOK AND FEEL ### + ##################### - border_size = 2; + # See https://wiki.hypr.land/Configuring/Basics/Variables/#general + config.general = { + gaps_in = 5; + gaps_out = 20; - col.active_border = { - colors = [ - "rgba(33ccffee)" - "rgba(00ff99ee)" - ]; - angle = 45; - }; - col.inactive_border = { - colors = [ "rgba(595959aa)" ]; - }; + border_size = 2; - # Set to true enable resizing windows by clicking and dragging on borders and gaps - resize_on_border = true; + col.active_border = { + colors = [ + "rgba(33ccffee)" + "rgba(00ff99ee)" + ]; + angle = 45; + }; + col.inactive_border = { + colors = [ "rgba(595959aa)" ]; + }; - # See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ - allow_tearing = false; + # Set to true enable resizing windows by clicking and dragging on borders and gaps + resize_on_border = true; - layout = "dwindle"; - }; + # See https://wiki.hypr.land/Configuring/Advanced-and-Cool/Tearing/ + allow_tearing = false; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#decoration - config.decoration = { - rounding = 10; - rounding_power = 2; + layout = "dwindle"; + }; - # Change transparency of focused and unfocused windows - active_opacity = 1.0; - inactive_opacity = 1.0; + # See https://wiki.hypr.land/Configuring/Basics/Variables/#decoration + config.decoration = { + rounding = 10; + rounding_power = 2; + + # Change transparency of focused and unfocused windows + active_opacity = 1.0; + inactive_opacity = 1.0; + + # See https://wiki.hypr.land/Configuring/Basics/Variables/#shadow + shadow = { + enabled = true; + range = 4; + render_power = 3; + color = "rgba(1a1a1aee)"; + }; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#shadow - shadow = { - enabled = true; - range = 4; - render_power = 3; - color = "rgba(1a1a1aee)"; + # See https://wiki.hypr.land/Configuring/Basics/Variables/#blur + blur = { + enabled = true; + size = 3; + passes = 1; + vibrancy = 0.1696; + }; }; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#blur - blur = { + # See https://wiki.hypr.land/Configuring/Basics/Variables/#animations + # as well as https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ + config.animations = { enabled = true; - size = 3; - passes = 1; - vibrancy = 0.1696; }; - }; + curve = [ + { + _args = [ + "easeOutQuint" + { + type = "bezier"; + points = [ + [ + 0.23 + 1 + ] + [ + 0.32 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "easeInOutCubic" + { + type = "bezier"; + points = [ + [ + 0.65 + 0.05 + ] + [ + 0.36 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "linear" + { + type = "bezier"; + points = [ + [ + 0 + 0 + ] + [ + 1 + 1 + ] + ]; + } + ]; + } + { + _args = [ + "almostLinear" + { + type = "bezier"; + points = [ + [ + 0.5 + 0.5 + ] + [ + 0.75 + 1.0 + ] + ]; + } + ]; + } + { + _args = [ + "quick" + { + type = "bezier"; + points = [ + [ + 0.15 + 0 + ] + [ + 0.1 + 1 + ] + ]; + } + ]; + } + ]; + animation = [ + { + leaf = "global"; + enabled = true; + speed = 10; + bezier = "default"; + } + { + leaf = "border"; + enabled = true; + speed = 5.39; + bezier = "easeOutQuint"; + } + { + leaf = "windows"; + enabled = true; + speed = 4.79; + bezier = "easeOutQuint"; + } + { + leaf = "windowsIn"; + enabled = true; + speed = 4.1; + bezier = "easeOutQuint"; + stye = "popin 87%"; + } + { + leaf = "windowsOut"; + enabled = true; + speed = 1.49; + bezier = "linear"; + style = "popin 87%"; + } + { + leaf = "fadeIn"; + enabled = true; + speed = 1.73; + bezier = "almostLinear"; + } + { + leaf = "fadeOut"; + enabled = true; + speed = 1.46; + bezier = "almostLinear"; + } + { + leaf = "fade"; + enabled = true; + speed = 3.03; + bezier = "quick"; + } + { + leaf = "layers"; + enabled = true; + speed = 3.81; + bezier = "easeOutQuint"; + } + { + leaf = "layersIn"; + enabled = true; + speed = 4; + bezier = "easeOutQuint"; + style = "fade"; + } + { + leaf = "layersOut"; + enabled = true; + speed = 1.5; + bezier = "linear"; + style = "fade"; + } + { + leaf = "fadeLayersIn"; + enabled = true; + speed = 1.79; + bezier = "almostLinear"; + } + { + leaf = "fadeLayersOut"; + enabled = true; + speed = 1.39; + bezier = "almostLinear"; + } + { + leaf = "workspaces"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesIn"; + enabled = true; + speed = 1.21; + bezier = "almostLinear"; + style = "fade"; + } + { + leaf = "workspacesOut"; + enabled = true; + speed = 1.94; + bezier = "almostLinear"; + style = "fade"; + } + ]; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#animations - # as well as https://wiki.hypr.land/Configuring/Advanced-and-Cool/Animations/ - config.animations = { - enabled = true; - }; - curve = [ - { - _args = [ - "easeOutQuint" - { - type = "bezier"; - points = [ - [ - 0.23 - 1 - ] - [ - 0.32 - 1 - ] - ]; - } - ]; - } - { - _args = [ - "easeInOutCubic" - { - type = "bezier"; - points = [ - [ - 0.65 - 0.05 - ] - [ - 0.36 - 1 - ] - ]; - } - ]; - } - { - _args = [ - "linear" - { - type = "bezier"; - points = [ - [ - 0 - 0 - ] - [ - 1 - 1 - ] - ]; - } - ]; - } - { - _args = [ - "almostLinear" - { - type = "bezier"; - points = [ - [ - 0.5 - 0.5 - ] - [ - 0.75 - 1.0 - ] - ]; - } - ]; - } - { - _args = [ - "quick" - { - type = "bezier"; - points = [ - [ - 0.15 - 0 - ] - [ - 0.1 - 1 - ] - ]; - } - ]; - } - ]; - animation = [ - { - leaf = "global"; - enabled = true; - speed = 10; - bezier = "default"; - } - { - leaf = "border"; - enabled = true; - speed = 5.39; - bezier = "easeOutQuint"; - } - { - leaf = "windows"; - enabled = true; - speed = 4.79; - bezier = "easeOutQuint"; - } - { - leaf = "windowsIn"; - enabled = true; - speed = 4.1; - bezier = "easeOutQuint"; - stye = "popin 87%"; - } - { - leaf = "windowsOut"; - enabled = true; - speed = 1.49; - bezier = "linear"; - style = "popin 87%"; - } - { - leaf = "fadeIn"; - enabled = true; - speed = 1.73; - bezier = "almostLinear"; - } - { - leaf = "fadeOut"; - enabled = true; - speed = 1.46; - bezier = "almostLinear"; - } - { - leaf = "fade"; - enabled = true; - speed = 3.03; - bezier = "quick"; - } - { - leaf = "layers"; - enabled = true; - speed = 3.81; - bezier = "easeOutQuint"; - } - { - leaf = "layersIn"; - enabled = true; - speed = 4; - bezier = "easeOutQuint"; - style = "fade"; - } - { - leaf = "layersOut"; - enabled = true; - speed = 1.5; - bezier = "linear"; - style = "fade"; - } - { - leaf = "fadeLayersIn"; - enabled = true; - speed = 1.79; - bezier = "almostLinear"; - } - { - leaf = "fadeLayersOut"; - enabled = true; - speed = 1.39; - bezier = "almostLinear"; - } - { - leaf = "workspaces"; - enabled = true; - speed = 1.94; - bezier = "almostLinear"; - style = "fade"; - } - { - leaf = "workspacesIn"; - enabled = true; - speed = 1.21; - bezier = "almostLinear"; - style = "fade"; - } - { - leaf = "workspacesOut"; - enabled = true; - speed = 1.94; - bezier = "almostLinear"; - style = "fade"; - } - ]; - - # Dwindle Layout - # See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ - config.dwindle.preserve_split = true; - - # Master Layout - # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ - config.master.new_status = "master"; - - # Scrolling Layout - # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ - config.scrolling.fullscreen_on_one_column = true; - - # Get rid of default wallpaper - config.misc = { - force_default_wallpaper = false; - disable_hyprland_logo = true; - }; + # Dwindle Layout + # See https://wiki.hypr.land/Configuring/Layouts/Dwindle-Layout/ + config.dwindle.preserve_split = true; - ############# - ### INPUT ### - ############# + # Master Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.master.new_status = "master"; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#input - config.input = { - kb_layout = "us,de"; - kb_variant = ""; - kb_model = ""; - kb_options = ""; - kb_rules = ""; + # Scrolling Layout + # See https://wiki.hypr.land/Configuring/Layouts/Scrolling-Layout/ + config.scrolling.fullscreen_on_one_column = true; - follow_mouse = true; + # Get rid of default wallpaper + config.misc = { + force_default_wallpaper = false; + disable_hyprland_logo = true; + }; - sensitivity = 0; # between -1.0 and 1.0; 0 means no modification. + ############# + ### INPUT ### + ############# - touchpad.natural_scroll = true; - }; + # See https://wiki.hypr.land/Configuring/Basics/Variables/#input + config.input = { + kb_layout = "us,de"; + kb_variant = ""; + kb_model = ""; + kb_options = ""; + kb_rules = ""; - # See https://wiki.hypr.land/Configuring/Basics/Variables/#gestures - config.gesture = [ - { - fingers = 3; - direction = "horizontal"; - action = "workspace"; - } - ]; - - ##################### - #### KEYBINDINGS #### - ##################### - - # See https://wiki.hypr.land/Configuring/Basics/Binds/ - - bind = [ - # Common bindings - { - _args = [ - (mkLuaInline "mod .. \" + Q\"") - (mkLuaInline "hl.dsp.exec_cmd('${terminal}')") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + C\"") - (mkLuaInline "hl.dsp.window.close()") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + M\"") - (mkLuaInline "hl.dsp.exec_cmd('${logout}')") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + E\"") - (mkLuaInline "hl.dsp.exec_cmd('${fileManager}')") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + SHIFT + E\"") - (mkLuaInline "hl.dsp.exec_cmd('${terminal} ${filemanager-cli}')") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + V\"") - (mkLuaInline "hl.dsp.window.float({ action = \"toggle\" })") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + R\"") - (mkLuaInline "hl.dsp.exec_cmd('${menu} -show drun -drun-show-actions')") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + P\"") - (mkLuaInline "hl.dsp.window.pseudo()") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + J\"") - (mkLuaInline "hl.dsp.layout(\"togglesplit\")") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + F\"") - (mkLuaInline "hl.dsp.window.fullscreen({ [\"mode\"] = \"maximized\" })") - ]; - } + follow_mouse = true; - # Move focus with main mod + arrow keys - { - _args = [ - (mkLuaInline "mod .. \" + left\"") - (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"l\" })") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + right\"") - (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"r\" })") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + up\"") - (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"u\" })") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + down\"") - (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"d\" })") - ]; - } + sensitivity = 0; # between -1.0 and 1.0; 0 means no modification. - # Special workspace (aka scratchpad) - { - _args = [ - (mkLuaInline "mod .. \" + S\"") - (mkLuaInline "hl.dsp.workspace.toggle_special(\"magic\")") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + SHIFT + S\"") - (mkLuaInline "hl.dsp.workspace.move({ [\"workspace\"] = \"special:magic\", [\"monitor\"] = \"current\" })") - ]; - } + touchpad.natural_scroll = true; + }; - # Scroll through existing workspaces with mod + scroll - { - _args = [ - (mkLuaInline "mod .. \" + mouse_down\"") - (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m+1\" })") - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + mouse_up\"") - (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m-1\" })") - ]; - } - - # Move/resize windows with mod + LMB/RMB and dragging - { - _args = [ - (mkLuaInline "mod .. \" + mouse:272\"") - (mkLuaInline "hl.dsp.window.drag()") - { mouse = true; } - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + mouse:273\"") - (mkLuaInline "hl.dsp.window.resize()") - { mouse = true; } - ]; - } + # See https://wiki.hypr.land/Configuring/Basics/Variables/#gestures + config.gesture = [ + { + fingers = 3; + direction = "horizontal"; + action = "workspace"; + } + ]; - # Multimedia keys - { - _args = [ - "XF86AudioRaiseVolume" - (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '+5%'\")") - { - locked = true; - repeating = true; - } - ]; - } - { - _args = [ - "XF86AudioLowerVolume" - (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '-5%'\")") - { - locked = true; - repeating = true; - } - ]; - } - { - _args = [ - "XF86AudioMute" - (mkLuaInline "hl.dsp.exec_cmd(\"${sound} mute toggle\")") - { - locked = true; - repeating = true; - } - ]; - } + ##################### + #### KEYBINDINGS #### + ##################### - # Brightness control - { - _args = [ - "XF86MonBrightnessUp" - (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '+5%'\")") - { - locked = true; - repeating = true; - } - ]; - } - { - _args = [ - "XF86MonBrightnessDown" - (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '-5%'\")") - { - locked = true; - repeating = true; - } - ]; - } - - # Multimedia control - { - _args = [ - "XF86AudioNext" - (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'next'\")") - { locked = true; } - ]; - } - { - _args = [ - "XF86AudioPrev" - (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'previous'\")") - { locked = true; } - ]; - } - { - _args = [ - "XF86AudioPlay" - (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") - { locked = true; } - ]; - } - { - _args = [ - "XF86AudioPause" - (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") - { locked = true; } - ]; - } - - # Screenshots - { - _args = [ - "Print" - (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save area \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") - { locked = true; } - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + Print\"") - (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy area')") - { locked = true; } - ]; - } - { - _args = [ - "CTRL + Print" - (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save active \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") - { locked = true; } - ]; - } - { - _args = [ - (mkLuaInline "mod .. \" + CTRL + Print\"") - (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy active')") - { locked = true; } - ]; - } - - # Other XF86 key bindings - { - _args = [ - "XF86RFKill" - (mkLuaInline "hl.dsp.exec_cmd('${rfkill-toggle}')") - { locked = true; } - ]; - } - ]; - - ################################ - #### WINDOWS AND WORKSPACES #### - ################################ - - # See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ - # and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ - workspace_rule = smart-gaps.workspace-rule ++ [ ]; - window_rule = smart-gaps.window-rule ++ [ - # Suppress maximize request from all apps - { - name = "suppress-maximize-events"; - match = { - class = ".*"; - }; + # See https://wiki.hypr.land/Configuring/Basics/Binds/ - suppress_event = "maximize"; - } - { - name = "fix-xwayland-drags"; - match = { - class = "^$"; - title = "^$"; - xwayland = true; - float = true; - fullscreen = false; - pin = false; - }; + bind = [ + # Common bindings + { + _args = [ + "${MOD} + Q" + (mkLuaInline "hl.dsp.exec_cmd('${terminal}')") + ]; + } + { + _args = [ + "${MOD} + C" + (mkLuaInline "hl.dsp.window.close()") + ]; + } + { + _args = [ + "${MOD} + M" + (mkLuaInline "hl.dsp.exec_cmd('${logout}')") + ]; + } + { + _args = [ + "${MOD} + E" + (mkLuaInline "hl.dsp.exec_cmd('${fileManager}')") + ]; + } + { + _args = [ + "${MOD} + SHIFT + E" + (mkLuaInline "hl.dsp.exec_cmd('${terminal} ${filemanager-cli}')") + ]; + } + { + _args = [ + "${MOD} + V" + (mkLuaInline "hl.dsp.window.float({ action = \"toggle\" })") + ]; + } + { + _args = [ + "${MOD} + R" + (mkLuaInline "hl.dsp.exec_cmd('${menu} -show drun -drun-show-actions')") + ]; + } + { + _args = [ + "${MOD} + P" + (mkLuaInline "hl.dsp.window.pseudo()") + ]; + } + { + _args = [ + "${MOD} + J" + (mkLuaInline "hl.dsp.layout(\"togglesplit\")") + ]; + } + { + _args = [ + "${MOD} + F" + (mkLuaInline "hl.dsp.window.fullscreen({ [\"mode\"] = \"maximized\" })") + ]; + } - no_focus = true; - } - ]; - }; + # Move focus with main mod + arrow keys + { + _args = [ + "${MOD} + left" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"l\" })") + ]; + } + { + _args = [ + "${MOD} + right" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"r\" })") + ]; + } + { + _args = [ + "${MOD} + up" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"u\" })") + ]; + } + { + _args = [ + "${MOD} + down" + (mkLuaInline "hl.dsp.focus({ [\"direction\"] = \"d\" })") + ]; + } + + # Special workspace (aka scratchpad) + { + _args = [ + "${MOD} + S" + (mkLuaInline "hl.dsp.workspace.toggle_special(\"magic\")") + ]; + } + { + _args = [ + "${MOD} + SHIFT + S" + (mkLuaInline "hl.dsp.workspace.move({ [\"workspace\"] = \"special:magic\", [\"monitor\"] = \"current\" })") + ]; + } + + # Scroll through existing workspaces with mod + scroll + { + _args = [ + "${MOD} + mouse_down" + (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m+1\" })") + ]; + } + { + _args = [ + "${MOD} + mouse_up" + (mkLuaInline "hl.dsp.focus({ [\"workspace\"] = \"m-1\" })") + ]; + } + + # Move/resize windows with mod + LMB/RMB and dragging + { + _args = [ + "${MOD} + mouse:272" + (mkLuaInline "hl.dsp.window.drag()") + { mouse = true; } + ]; + } + { + _args = [ + "${MOD} + mouse:273" + (mkLuaInline "hl.dsp.window.resize()") + { mouse = true; } + ]; + } + + # Multimedia keys + { + _args = [ + "XF86AudioRaiseVolume" + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '+5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86AudioLowerVolume" + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} volume '-5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86AudioMute" + (mkLuaInline "hl.dsp.exec_cmd(\"${sound} mute toggle\")") + { + locked = true; + repeating = true; + } + ]; + } + + # Brightness control + { + _args = [ + "XF86MonBrightnessUp" + (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '+5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + { + _args = [ + "XF86MonBrightnessDown" + (mkLuaInline "hl.dsp.exec_cmd(\"${backlight} '-5%'\")") + { + locked = true; + repeating = true; + } + ]; + } + + # Multimedia control + { + _args = [ + "XF86AudioNext" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'next'\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPrev" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'previous'\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPlay" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") + { locked = true; } + ]; + } + { + _args = [ + "XF86AudioPause" + (mkLuaInline "hl.dsp.exec_cmd(\"${playerctl} 'play-pause'\")") + { locked = true; } + ]; + } + + # Screenshots + { + _args = [ + "Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save area \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") + { locked = true; } + ]; + } + { + _args = [ + "${MOD} + Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy area')") + { locked = true; } + ]; + } + { + _args = [ + "CTRL + Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify save active \"$(${xdg-user-dirs} PICTURES)/$(${date} --utc \\'+%F_%H.%M.%S\\').png')") + { locked = true; } + ]; + } + { + _args = [ + "${MOD} + CTRL + Print" + (mkLuaInline "hl.dsp.exec_cmd('${grimblast} --notify copy active')") + { locked = true; } + ]; + } + + # Other XF86 key bindings + { + _args = [ + "XF86RFKill" + (mkLuaInline "hl.dsp.exec_cmd('${rfkill-toggle}')") + { locked = true; } + ]; + } + ]; + + ################################ + #### WINDOWS AND WORKSPACES #### + ################################ + + # See https://wiki.hypr.land/Configuring/Basics/Window-Rules/ + # and https://wiki.hypr.land/Configuring/Basics/Workspace-Rules/ + workspace_rule = smart-gaps.workspace-rule ++ [ ]; + window_rule = smart-gaps.window-rule ++ [ + # Suppress maximize request from all apps + { + name = "suppress-maximize-events"; + match = { + class = ".*"; + }; + + suppress_event = "maximize"; + } + { + name = "fix-xwayland-drags"; + match = { + class = "^$"; + title = "^$"; + xwayland = true; + float = true; + fullscreen = false; + pin = false; + }; + + no_focus = true; + } + ]; + }; - extraConfig = '' - for i = 1, 10 do - local key = i % 10 -- 10 maps to key 0 + extraConfig = '' + for i = 1, 10 do + local key = i % 10 -- 10 maps to key 0 - -- Switch workspaces with mod + [0-9] - hl.bind(mod .. " + " .. key, hl.dsp.focus({ ["workspace"] = i})) + -- Switch workspaces with mod + [0-9] + hl.bind("${MOD} + " .. key, hl.dsp.focus({ ["workspace"] = i})) - -- Move active window to a workspace with mod + SHIFT + [0-9] - hl.bind(mod .. " + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i })) + -- Move active window to a workspace with mod + SHIFT + [0-9] + hl.bind("${MOD} + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i })) - -- Move active window to a workspace with mod + SHIFT + [0-9] - hl.bind(mod .. " + CTRL + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i, ["follow"] = false })) - end - ''; - }; + -- Move active window to a workspace with mod + SHIFT + [0-9] + hl.bind("${MOD} + CTRL + SHIFT + " .. key, hl.dsp.window.move({ ["workspace"] = i, ["follow"] = false })) + end + ''; + }; } From dbdd0184481af0bc6e7b3a4e5a3b4782224fbf57 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 15 Jun 2026 22:36:57 +0200 Subject: [PATCH 050/184] waybar: add support for calendar mode switch --- home/hyprland/waybar/default.nix | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index f2fe501..755ec61 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -193,10 +193,10 @@ format = "󰔠 {:%a, %Y-%m-%d %H:%M:%S}"; # locale MUST be enabled locale = "de_AT.UTF-8"; - ## "timezone": "Europe/Vienna", - ## "timezones": [ - ## "UTC", - ## ], + # "timezone": "Europe/Vienna", + # "timezones": [ + # "UTC", + # ], tooltip = true; tooltip-format = "{calendar}"; calendar = { @@ -213,12 +213,11 @@ }; }; actions = { - # TODO: figure out how to deal with duplicate keys... - # "on-click-right"= "mode"; + "on-click-right" = "mode"; + "on-scroll-up" = "shift_up"; + "on-scroll-down" = "shift_down"; # "on-scroll-up"= "tz_up"; # "on-scroll-down"= "tz_down"; - # "on-scroll-up"= "shift_up"; - # "on-scroll-down"= "shift_down"; }; }; From 23aedd9a7f11b5e68378b6cb02a6032447f2a6a8 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 19 Jun 2026 20:03:02 +0200 Subject: [PATCH 051/184] Replace neovim with nixvim --- flake.lock | 76 ++++++++++++++++++++++++++++++++++++- flake.nix | 2 + hosts/default.nix | 1 + hosts/nixos-btw/default.nix | 7 ++++ hosts/nixos-btw/home.nix | 4 -- 5 files changed, 85 insertions(+), 5 deletions(-) diff --git a/flake.lock b/flake.lock index 236cf41..619a6fa 100644 --- a/flake.lock +++ b/flake.lock @@ -39,6 +39,27 @@ "type": "github" } }, + "flake-parts_2": { + "inputs": { + "nixpkgs-lib": [ + "nixvim", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1778716662, + "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "owner": "hercules-ci", + "repo": "flake-parts", + "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "flake-parts", + "type": "github" + } + }, "home-manager": { "inputs": { "nixpkgs": [ @@ -91,12 +112,65 @@ "type": "github" } }, + "nixpkgs_2": { + "locked": { + "lastModified": 1781216227, + "narHash": "sha256-9mUW6gNwoN2SWc/l0fW4svPNOulXLl8ijqKyeSOGgJE=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "a0374025a863d007d98e3297f6aa46cc3141c2f0", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-26.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "nixvim": { + "inputs": { + "flake-parts": "flake-parts_2", + "nixpkgs": "nixpkgs_2", + "systems": "systems" + }, + "locked": { + "lastModified": 1781713927, + "narHash": "sha256-U18jyPH/pIx/YZlGv3FbcFw95NRFjQv4aDjlvxhUxNY=", + "owner": "nix-community", + "repo": "nixvim", + "rev": "110376ed06939ee0ccbcfce11e748064c00e666d", + "type": "github" + }, + "original": { + "owner": "nix-community", + "ref": "nixos-26.05", + "repo": "nixvim", + "type": "github" + } + }, "root": { "inputs": { "disko": "disko", "flake-parts": "flake-parts", "home-manager": "home-manager", - "nixpkgs": "nixpkgs" + "nixpkgs": "nixpkgs", + "nixvim": "nixvim" + } + }, + "systems": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" } } }, diff --git a/flake.nix b/flake.nix index 4b7233d..b7e564c 100644 --- a/flake.nix +++ b/flake.nix @@ -5,6 +5,8 @@ flake-parts.url = "github:hercules-ci/flake-parts"; nixpkgs.url = "github:NixOS/nixpkgs/nixos-26.05"; + nixvim.url = "github:nix-community/nixvim/nixos-26.05"; + disko = { url = "github:nix-community/disko/latest"; inputs.nixpkgs.follows = "nixpkgs"; diff --git a/hosts/default.nix b/hosts/default.nix index b1fec55..8114a21 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -15,6 +15,7 @@ ./nixos-btw inputs.disko.nixosModules.disko inputs.home-manager.nixosModules.home-manager + inputs.nixvim.nixosModules.nixvim ]; }; }; diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix index 32b1687..979b741 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/nixos-btw/default.nix @@ -18,6 +18,13 @@ networking.hostName = "nixos-btw"; + programs.nixvim = { + enable = true; + defaultEditor = true; + # TODO: enable, once using home manager + # vimdiffAlias = true; + }; + security.pam.services.hyprlock = { enable = true; }; diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix index 941330c..1a7c35a 100644 --- a/hosts/nixos-btw/home.nix +++ b/hosts/nixos-btw/home.nix @@ -30,10 +30,6 @@ # Let Home Manager install and manage itself. programs.home-manager.enable = true; - programs.neovim = { - enable = true; - }; - services.gpg-agent = { enable = true; defaultCacheTtl = 1800; From 5a43ecc0a8489d954390874adbc4fe29fb969732 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 19 Jun 2026 20:49:35 +0200 Subject: [PATCH 052/184] Add dummy config for nixvim --- hosts/nixos-btw/default.nix | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix index 979b741..63be176 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/nixos-btw/default.nix @@ -23,6 +23,20 @@ defaultEditor = true; # TODO: enable, once using home manager # vimdiffAlias = true; + enableMan = true; + enablePrintInit = true; + waylandSupport = true; + + withNodeJs = true; + withPerl = true; + withPython3 = true; + withRuby = true; + + editorconfig = { + enable = true; + }; + + colorschemes.gruvbox.enable = true; }; security.pam.services.hyprlock = { From d0a6e3a004da51305a0c3262cc26b12dd3fda94d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 19 Jun 2026 21:10:18 +0200 Subject: [PATCH 053/184] Migrate nixvim to home module --- home/default.nix | 1 + home/neovim/default.nix | 22 ++++++++++++++++++++++ hosts/default.nix | 1 - hosts/nixos-btw/default.nix | 21 --------------------- hosts/nixos-btw/home.nix | 8 +++++++- 5 files changed, 30 insertions(+), 23 deletions(-) create mode 100644 home/neovim/default.nix diff --git a/home/default.nix b/home/default.nix index 3fbd598..a90f0e5 100644 --- a/home/default.nix +++ b/home/default.nix @@ -1,5 +1,6 @@ { imports = [ ./hyprland + ./neovim ]; } diff --git a/home/neovim/default.nix b/home/neovim/default.nix new file mode 100644 index 0000000..f246a6d --- /dev/null +++ b/home/neovim/default.nix @@ -0,0 +1,22 @@ +{ ... }: +{ + programs.nixvim = { + enable = true; + defaultEditor = true; + vimdiffAlias = true; + enableMan = true; + enablePrintInit = true; + waylandSupport = true; + + withNodeJs = true; + withPerl = true; + withPython3 = true; + withRuby = true; + + editorconfig = { + enable = true; + }; + + colorschemes.gruvbox.enable = true; + }; +} diff --git a/hosts/default.nix b/hosts/default.nix index 8114a21..b1fec55 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -15,7 +15,6 @@ ./nixos-btw inputs.disko.nixosModules.disko inputs.home-manager.nixosModules.home-manager - inputs.nixvim.nixosModules.nixvim ]; }; }; diff --git a/hosts/nixos-btw/default.nix b/hosts/nixos-btw/default.nix index 63be176..32b1687 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/nixos-btw/default.nix @@ -18,27 +18,6 @@ networking.hostName = "nixos-btw"; - programs.nixvim = { - enable = true; - defaultEditor = true; - # TODO: enable, once using home manager - # vimdiffAlias = true; - enableMan = true; - enablePrintInit = true; - waylandSupport = true; - - withNodeJs = true; - withPerl = true; - withPython3 = true; - withRuby = true; - - editorconfig = { - enable = true; - }; - - colorschemes.gruvbox.enable = true; - }; - security.pam.services.hyprlock = { enable = true; }; diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix index 1a7c35a..564b900 100644 --- a/hosts/nixos-btw/home.nix +++ b/hosts/nixos-btw/home.nix @@ -1,4 +1,9 @@ -{ config, pkgs, ... }: +{ + config, + pkgs, + inputs, + ... +}: { # Home Manager needs a bit of information about you and the # paths it should manage. @@ -6,6 +11,7 @@ home.homeDirectory = "/home/rtucek"; imports = [ + inputs.nixvim.homeModules.nixvim ../../home ]; From ed3002de0b551893e786b6f559e1f579979ae3dc Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 19 Jun 2026 22:18:45 +0200 Subject: [PATCH 054/184] Add general system config --- home/neovim/default.nix | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/home/neovim/default.nix b/home/neovim/default.nix index f246a6d..29001a2 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -5,9 +5,9 @@ defaultEditor = true; vimdiffAlias = true; enableMan = true; - enablePrintInit = true; waylandSupport = true; + # Language providers withNodeJs = true; withPerl = true; withPython3 = true; @@ -17,6 +17,8 @@ enable = true; }; - colorschemes.gruvbox.enable = true; + colorschemes.onedark.enable = true; + + clipboard.register = "unnamedplus"; }; } From 21e6e826f6e089a8c7900fc581b813ea0c1dabc4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 22 Jun 2026 01:22:25 +0200 Subject: [PATCH 055/184] Add LSP integrations for shells, goland and nix --- home/neovim/default.nix | 4 ++++ home/neovim/languages/default.nix | 7 +++++++ home/neovim/languages/golang.nix | 9 +++++++++ home/neovim/languages/nix.nix | 12 ++++++++++++ home/neovim/languages/sh.nix | 12 ++++++++++++ 5 files changed, 44 insertions(+) create mode 100644 home/neovim/languages/default.nix create mode 100644 home/neovim/languages/golang.nix create mode 100644 home/neovim/languages/nix.nix create mode 100644 home/neovim/languages/sh.nix diff --git a/home/neovim/default.nix b/home/neovim/default.nix index 29001a2..928f7d8 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -1,5 +1,9 @@ { ... }: { + imports = [ + ./languages + ]; + programs.nixvim = { enable = true; defaultEditor = true; diff --git a/home/neovim/languages/default.nix b/home/neovim/languages/default.nix new file mode 100644 index 0000000..002fbed --- /dev/null +++ b/home/neovim/languages/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./golang.nix + ./nix.nix + ./sh.nix + ]; +} diff --git a/home/neovim/languages/golang.nix b/home/neovim/languages/golang.nix new file mode 100644 index 0000000..a1ee5eb --- /dev/null +++ b/home/neovim/languages/golang.nix @@ -0,0 +1,9 @@ +{ + programs.nixvim = { + lsp.servers = { + gopls = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/languages/nix.nix b/home/neovim/languages/nix.nix new file mode 100644 index 0000000..623d92b --- /dev/null +++ b/home/neovim/languages/nix.nix @@ -0,0 +1,12 @@ +{ + programs.nixvim = { + lsp.servers = { + nil_ls = { + enable = true; + }; + nixd = { + enable = true; + }; + }; + }; +} diff --git a/home/neovim/languages/sh.nix b/home/neovim/languages/sh.nix new file mode 100644 index 0000000..9341056 --- /dev/null +++ b/home/neovim/languages/sh.nix @@ -0,0 +1,12 @@ +{ + programs.nixvim = { + lsp.servers = { + bashls = { + enable = true; + }; + fish_lsp = { + enable = true; + }; + }; + }; +} From 28f935ed1f08ef789b1641536fa19b6cbcc328aa Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 22 Jun 2026 20:10:30 +0200 Subject: [PATCH 056/184] nixvim: migrate global settings --- home/neovim/default.nix | 20 ++--------- home/neovim/settings.nix | 74 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 76 insertions(+), 18 deletions(-) create mode 100644 home/neovim/settings.nix diff --git a/home/neovim/default.nix b/home/neovim/default.nix index 928f7d8..c75a1c9 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -1,28 +1,12 @@ { ... }: { imports = [ + ./settings.nix + ./languages ]; programs.nixvim = { enable = true; - defaultEditor = true; - vimdiffAlias = true; - enableMan = true; - waylandSupport = true; - - # Language providers - withNodeJs = true; - withPerl = true; - withPython3 = true; - withRuby = true; - - editorconfig = { - enable = true; - }; - - colorschemes.onedark.enable = true; - - clipboard.register = "unnamedplus"; }; } diff --git a/home/neovim/settings.nix b/home/neovim/settings.nix new file mode 100644 index 0000000..f1ae9f7 --- /dev/null +++ b/home/neovim/settings.nix @@ -0,0 +1,74 @@ +{ ... }: +{ + programs.nixvim = { + defaultEditor = true; + vimdiffAlias = true; + enableMan = true; + + # Clip-board syncing + waylandSupport = true; + clipboard.register = "unnamedplus"; + + # Language providers + withNodeJs = true; + withPerl = true; + withPython3 = true; + withRuby = true; + + editorconfig = { + enable = true; + }; + + colorschemes = { + onedark = { + enable = true; + }; + }; + + opts = { + # -----GENERAL----- + encoding = "UTF-8"; + backspace = "indent,eol,start"; + + # Set language for spell check + spell = true; + + # Fixing tabs and indentation + autoindent = true; + copyindent = true; + expandtab = false; + preserveindent = true; + softtabstop = 0; + + # Case-insensitive tab completion + wildignorecase = true; + + # Make scrolling faster and more accurate + ttyfast = true; + + # Refresh buffer automatically + autoread = true; + + # Add mouse support + mouse = "a"; + + # Suppress warning when changing FROM unsaved buffer + hidden = true; + + # Demand explicit confirmation when closing unsaved buffers + confirm = true; + + # Deactivate folding + foldenable = false; + foldmethod = "syntax"; + + # Don't use swapfiles + swapfile = false; + }; + + localOpts = { + # Set language for spell check + spelllang = "en_us"; + }; + }; +} From 1bfd42096704005e28486b81469d40cc5d48d796 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 23 Jun 2026 00:13:45 +0200 Subject: [PATCH 057/184] Add keybindings --- home/neovim/default.nix | 4 +- home/neovim/keybindings.nix | 197 ++++++++++++++++++++++++++++++++++++ 2 files changed, 199 insertions(+), 2 deletions(-) create mode 100644 home/neovim/keybindings.nix diff --git a/home/neovim/default.nix b/home/neovim/default.nix index c75a1c9..40e4bf0 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -1,9 +1,9 @@ { ... }: { imports = [ - ./settings.nix - + ./keybindings.nix ./languages + ./settings.nix ]; programs.nixvim = { diff --git a/home/neovim/keybindings.nix b/home/neovim/keybindings.nix new file mode 100644 index 0000000..79a354e --- /dev/null +++ b/home/neovim/keybindings.nix @@ -0,0 +1,197 @@ +{ config, ... }: +{ + programs.nixvim = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + { + keymaps = [ + { + # Quick edit ~/.vimrc + action = ":e $MYVIMRC"; + key = "ev"; + mode = [ "n" ]; + options = { + silent = true; + }; + } + + { + # Toggle Spell check + action = nixvimLua '' + function() + vim.opt.spell = not vim.opt.spell:get() + print(string.format("spellcheck=%s", vim.opt.spell:get())) + end + ''; + key = "s"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + + # Tab navigation + { + # Create new tab + action = ":tabnew"; + key = "tab"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + # Close tab (keep buffer intact) + action = ":tabclose"; + key = "w"; + mode = [ "n" ]; + options = { + silent = true; + noremap = true; + }; + } + { + # Close tab (keep buffer intact) + action = ":tabnew %:tabprevious"; + key = "tabthis"; + mode = [ "n" ]; + options = { + silent = true; + noremap = true; + }; + } + + # Better navigation with wrapped lines + { + action = "gk"; + key = "k"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + action = "gj"; + key = "j"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + action = "g0"; + key = "0"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + { + action = "g$"; + key = "$"; + mode = [ "n" ]; + options = { + noremap = true; + }; + } + + { + # Don't yank selected text after overwriting via paste + action = "\"_dP"; + key = "p"; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + + # Move blocks of selected lines up and down in visual mode + { + action = ":m '>+1gv"; + key = ""; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + { + action = ":m '<-2gv"; + key = ""; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + + # In- and un-indent lines while also preserving selection + { + action = "<gv"; + key = "<"; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + { + action = ">gv"; + key = ">"; + mode = [ "v" ]; + options = { + noremap = true; + silent = true; + }; + } + + { + # Toggle relative line numbers + action = nixvimLua '' + function() + vim.opt.relativenumber = not vim.opt.relativenumber:get() + print(string.format("relativenumber=%s", vim.opt.relativenumber:get())) + end + ''; + key = "r"; + mode = [ + "n" + "v" + ]; + options = { + noremap = true; + silent = true; + }; + } + + { + # Toggle relative line numbers + action = nixvimLua '' + function() + vim.opt.foldenable = not vim.opt.foldenable:get() + print(string.format("foldenable=%s", vim.opt.foldenable:get())) + end + ''; + key = "f"; + mode = [ + "n" + "v" + ]; + options = { + noremap = true; + silent = true; + }; + } + + ## Leave commented out for now, since it does not work with sudo-rs + # { + # # Sudo write + # action = "w !sudo -S tee > /dev/null %"; + # key = "w!!"; + # mode = [ "c" ]; + # } + ]; + }; +} From cd60ab4acc6d1876a8e753b321553a76824a10c9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 23 Jun 2026 21:59:14 +0200 Subject: [PATCH 058/184] Add UI tweaking --- home/neovim/settings.nix | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/home/neovim/settings.nix b/home/neovim/settings.nix index f1ae9f7..a6b414f 100644 --- a/home/neovim/settings.nix +++ b/home/neovim/settings.nix @@ -64,6 +64,23 @@ # Don't use swapfiles swapfile = false; + + # -----VISUAL----- + + # Syntax highlighting + syntax = "enable"; + + # Always display tabline + showtabline = 2; + + # Highlight line of the current cursor + cursorline = true; + + # Show column length + ruler = true; + + # Show line numbers + number = true; }; localOpts = { From 9da6259c8a5f9a05076cfe3e40722bfefc533ffa Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 24 Jun 2026 00:16:40 +0200 Subject: [PATCH 059/184] Add git plugins Add gitgutter and fugitive vim plugins --- home/neovim/default.nix | 1 + home/neovim/plugins/default.nix | 5 +++++ home/neovim/plugins/git.nix | 17 +++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 home/neovim/plugins/default.nix create mode 100644 home/neovim/plugins/git.nix diff --git a/home/neovim/default.nix b/home/neovim/default.nix index 40e4bf0..aaed645 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -3,6 +3,7 @@ imports = [ ./keybindings.nix ./languages + ./plugins ./settings.nix ]; diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix new file mode 100644 index 0000000..d8438c3 --- /dev/null +++ b/home/neovim/plugins/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./git.nix + ]; +} diff --git a/home/neovim/plugins/git.nix b/home/neovim/plugins/git.nix new file mode 100644 index 0000000..c05ef18 --- /dev/null +++ b/home/neovim/plugins/git.nix @@ -0,0 +1,17 @@ +{ ... }: +{ + programs.nixvim = { + plugins = { + # see https://github.com/airblade/vim-gitgutter/ + gitgutter = { + enable = true; + recommendedSettings = true; + }; + + # see https://github.com/tpope/vim-fugitive/ + fugitive = { + enable = true; + }; + }; + }; +} From 0126361fba16b39ed1e0e653c30677b9d9be67e8 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 26 Jun 2026 00:43:01 +0200 Subject: [PATCH 060/184] Add CHADtree for file navigation --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/fs.nix | 37 +++++++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 home/neovim/plugins/fs.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index d8438c3..c78b890 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -1,5 +1,6 @@ { imports = [ ./git.nix + ./fs.nix ]; } diff --git a/home/neovim/plugins/fs.nix b/home/neovim/plugins/fs.nix new file mode 100644 index 0000000..7705871 --- /dev/null +++ b/home/neovim/plugins/fs.nix @@ -0,0 +1,37 @@ +{ ... }: +{ + programs.nixvim = { + keymaps = [ + { + # Quick edit ~/.vimrc + action = ":CHADopen"; + key = "d"; + mode = [ "n" ]; + options = { + silent = true; + }; + } + ]; + plugins = { + # see https://github.com/ms-jpq/chadtree/ + chadtree = { + enable = true; + settings = { + ignore.name_exact = [ + ".DS_Store" + ".directory" + "thumbs.db" + ".git" + ]; + + options = { + show_hidden = true; + follow = true; + follow_links = true; + version_control.enable = true; + }; + }; + }; + }; + }; +} From 3544f0408d30553ce6ac352269dab3abaa0aab38 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 26 Jun 2026 01:57:30 +0200 Subject: [PATCH 061/184] Add devicons for proper file- and extension symbols --- home/neovim/plugins/default.nix | 3 ++- home/neovim/plugins/icons.nix | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) create mode 100644 home/neovim/plugins/icons.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index c78b890..b30d9f8 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -1,6 +1,7 @@ { imports = [ - ./git.nix ./fs.nix + ./git.nix + ./icons.nix ]; } diff --git a/home/neovim/plugins/icons.nix b/home/neovim/plugins/icons.nix new file mode 100644 index 0000000..ed1df86 --- /dev/null +++ b/home/neovim/plugins/icons.nix @@ -0,0 +1,18 @@ +{ ... }: +{ + programs.nixvim = { + plugins = { + # see https://github.com/nvim-tree/nvim-web-devicons + # + # web-devicons provides Nerd Font icons, used by several plugins (e.g. + # CHADtree and telescope, just to name a few...). + web-devicons = { + enable = true; + settings = { + color_icons = true; + strict = true; + }; + }; + }; + }; +} From a655f87b8e1a96ebf90c716ffd60e20efcafe83f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 26 Jun 2026 01:58:16 +0200 Subject: [PATCH 062/184] Add telescope --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/finder.nix | 105 ++++++++++++++++++++++++++++++++ 2 files changed, 106 insertions(+) create mode 100644 home/neovim/plugins/finder.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index b30d9f8..89eef20 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./finder.nix ./fs.nix ./git.nix ./icons.nix diff --git a/home/neovim/plugins/finder.nix b/home/neovim/plugins/finder.nix new file mode 100644 index 0000000..d242192 --- /dev/null +++ b/home/neovim/plugins/finder.nix @@ -0,0 +1,105 @@ +{ ... }: +{ + programs.nixvim = { + dependencies = { + ripgrep.enable = true; + }; + plugins = { + # see https://github.com/nvim-telescope/telescope.nvim + telescope = { + enable = true; + keymaps = { + # Fuzzy search + "" = { + action = "find_files"; + options = { + desc = "Search files"; + }; + }; + "p" = { + action = "git_files"; + options = { + desc = "Search files via `git ls-files` (respects .gitignore)"; + }; + }; + "buf" = { + action = "buffers"; + options = { + desc = "Search buffers"; + }; + }; + "lin" = { + action = "current_buffer_fuzzy_find"; + options = { + desc = "Search for lines in current buffer"; + }; + }; + "tag" = { + action = "current_buffer_tags"; + options = { + desc = "Search by tags in current buffer"; + }; + }; + + # Git integration + "gitstatus" = { + action = "git_status"; + options = { + desc = "List current changes per file with diff preview"; + }; + }; + "gitbranch" = { + action = "git_branches"; + options = { + desc = "List current branches"; + }; + }; + "gitstash" = { + action = "git_stash"; + options = { + desc = "List stash item"; + }; + }; + "gitcom" = { + action = "git_commits"; + options = { + desc = "List git commits with diff preview; checkout via "; + }; + }; + "gitbcom" = { + action = "git_bcommits"; + options = { + desc = "List git commits with diff preview of current file only; checkout via "; + }; + }; + "a" = { + action = "live_grep"; + options = { + desc = "Search for string by using ripgrep (respecting .gitignore)"; + }; + }; + + # LSP integration + "gd" = { + action = "lsp_definitions"; + optons = { + desc = "Goto definition under the cursor"; + }; + }; + "gr" = { + action = "lsp_references"; + options = { + desc = "Find references under the cursor"; + }; + }; + "gi" = { + action = "lsp_implementations"; + options = { + desc = "Find implementations under the cursor"; + }; + }; + }; + }; + }; + }; +} From 3ca45d0c97ba3ca0b87b96b9bb6d9b9bae181d14 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 30 Jun 2026 22:54:06 +0200 Subject: [PATCH 063/184] Test LSP changes --- home/neovim/default.nix | 2 +- home/neovim/languages/default.nix | 7 --- home/neovim/lsp/default.nix | 68 +++++++++++++++++++++++ home/neovim/{languages => lsp}/golang.nix | 0 home/neovim/{languages => lsp}/nix.nix | 0 home/neovim/{languages => lsp}/sh.nix | 0 home/neovim/plugins/finder.nix | 38 ++++++------- 7 files changed, 88 insertions(+), 27 deletions(-) delete mode 100644 home/neovim/languages/default.nix create mode 100644 home/neovim/lsp/default.nix rename home/neovim/{languages => lsp}/golang.nix (100%) rename home/neovim/{languages => lsp}/nix.nix (100%) rename home/neovim/{languages => lsp}/sh.nix (100%) diff --git a/home/neovim/default.nix b/home/neovim/default.nix index aaed645..0398d5c 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -2,7 +2,7 @@ { imports = [ ./keybindings.nix - ./languages + ./lsp ./plugins ./settings.nix ]; diff --git a/home/neovim/languages/default.nix b/home/neovim/languages/default.nix deleted file mode 100644 index 002fbed..0000000 --- a/home/neovim/languages/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - imports = [ - ./golang.nix - ./nix.nix - ./sh.nix - ]; -} diff --git a/home/neovim/lsp/default.nix b/home/neovim/lsp/default.nix new file mode 100644 index 0000000..3a76369 --- /dev/null +++ b/home/neovim/lsp/default.nix @@ -0,0 +1,68 @@ +{ config, ... }: +{ + imports = [ + ./golang.nix + ./nix.nix + ./sh.nix + ]; + + programs.nixvim = { + lsp = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + { + inlayHints.enable = true; + keymaps = [ + { + key = "gd"; + lspBufAction = "definition"; + } + { + key = "gD"; + lspBufAction = "references"; + } + { + key = "gt"; + lspBufAction = "type_definition"; + } + { + key = "gi"; + lspBufAction = "implementation"; + } + { + key = "K"; + lspBufAction = "hover"; + } + { + action = nixvimLua "function() vim.diagnostic.jump({ count=-1, float=true }) end"; + key = "k"; + } + { + action = nixvimLua "function() vim.diagnostic.jump({ count=1, float=true }) end"; + key = "j"; + } + { + action = "LspStop"; + key = "lx"; + } + { + action = "LspStart"; + key = "ls"; + } + { + action = "LspRestart"; + key = "lr"; + } + { + action = nixvimLua "require('telescope.builtin').lsp_definitions"; + key = "gd"; + } + { + action = "Lspsaga hover_doc"; + key = "K"; + } + ]; + }; + }; +} diff --git a/home/neovim/languages/golang.nix b/home/neovim/lsp/golang.nix similarity index 100% rename from home/neovim/languages/golang.nix rename to home/neovim/lsp/golang.nix diff --git a/home/neovim/languages/nix.nix b/home/neovim/lsp/nix.nix similarity index 100% rename from home/neovim/languages/nix.nix rename to home/neovim/lsp/nix.nix diff --git a/home/neovim/languages/sh.nix b/home/neovim/lsp/sh.nix similarity index 100% rename from home/neovim/languages/sh.nix rename to home/neovim/lsp/sh.nix diff --git a/home/neovim/plugins/finder.nix b/home/neovim/plugins/finder.nix index d242192..f5782d0 100644 --- a/home/neovim/plugins/finder.nix +++ b/home/neovim/plugins/finder.nix @@ -79,25 +79,25 @@ }; }; - # LSP integration - "gd" = { - action = "lsp_definitions"; - optons = { - desc = "Goto definition under the cursor"; - }; - }; - "gr" = { - action = "lsp_references"; - options = { - desc = "Find references under the cursor"; - }; - }; - "gi" = { - action = "lsp_implementations"; - options = { - desc = "Find implementations under the cursor"; - }; - }; + # # LSP integration + # "gd" = { + # action = "lsp_definitions"; + # options = { + # desc = "Goto definition under the cursor"; + # }; + # }; + # "gr" = { + # action = "lsp_references"; + # options = { + # desc = "Find references under the cursor"; + # }; + # }; + # "gi" = { + # action = "lsp_implementations"; + # options = { + # desc = "Find implementations under the cursor"; + # }; + # }; }; }; }; From 18d61c1e1fed57326e9870f76f047ce171503387 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 30 Jun 2026 23:59:17 +0200 Subject: [PATCH 064/184] Add treesitter + language grammars --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/treesitter.nix | 103 +++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+) create mode 100644 home/neovim/plugins/treesitter.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index 89eef20..9df3fc0 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -4,5 +4,6 @@ ./fs.nix ./git.nix ./icons.nix + ./treesitter.nix ]; } diff --git a/home/neovim/plugins/treesitter.nix b/home/neovim/plugins/treesitter.nix new file mode 100644 index 0000000..532a7c2 --- /dev/null +++ b/home/neovim/plugins/treesitter.nix @@ -0,0 +1,103 @@ +{ config, ... }: +{ + programs.nixvim = { + dependencies = { + tree-sitter.enable = true; + }; + + # see https://github.com/nvim-treesitter/nvim-treesitter/ + plugins = { + treesitter = + let + grammarBuilder = config.programs.nixvim.plugins.treesitter.package.builtGrammars; + in + { + enable = true; + highlight.enable = true; + indent.enable = true; + folding.enable = true; + grammarPackages = with grammarBuilder; [ + awk + bash + blade + c + cmake + comment + cpp + css + csv + desktop + diff + dockerfile + ebnf + editorconfig + fish + gitattributes + gitcommit + git_config + gitignore + git_rebase + go + gomod + gosum + gotmpl + gpg + graphql + hlsplaylist + html + http + hyprlang + ini + java + javadoc + javascript + jq + jsdoc + json + just + kconfig + latex + llvm + lua + luadoc + make + markdown + meson + nginx + nix + objdump + passwd + pem + php + phpdoc + printf + properties + puppet + python + rasi + regex + requirements + robots_txt + rust + scss + sql + ssh_config + strace + svelte + sway + textproto + tmux + toml + twig + typescript + udev + vim + vimdoc + vue + xml + yaml + ]; + }; + }; + }; +} From 6e5b9d6145d46df8259ee6f357ea45a9781181f7 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 1 Jul 2026 01:20:21 +0200 Subject: [PATCH 065/184] Add vim-surround --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/editing.nix | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 home/neovim/plugins/editing.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index 9df3fc0..499cb17 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./editing.nix ./finder.nix ./fs.nix ./git.nix diff --git a/home/neovim/plugins/editing.nix b/home/neovim/plugins/editing.nix new file mode 100644 index 0000000..084f694 --- /dev/null +++ b/home/neovim/plugins/editing.nix @@ -0,0 +1,11 @@ +{ ... }: +{ + programs.nixvim = { + plugins = { + # see https://github.com/tpope/vim-surround/ + vim-surround = { + enable = true; + }; + }; + }; +} From 48577da70ff8b35e9568dd417c7904cae2cc2dc2 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 1 Jul 2026 22:08:58 +0200 Subject: [PATCH 066/184] Avoid signcolumn jumps --- home/neovim/plugins/git.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/home/neovim/plugins/git.nix b/home/neovim/plugins/git.nix index c05ef18..06c67d0 100644 --- a/home/neovim/plugins/git.nix +++ b/home/neovim/plugins/git.nix @@ -1,6 +1,12 @@ { ... }: { programs.nixvim = { + opts = { + # Set signcolumn to be always present. + # This way, we don't have awkward flash jumps. + signcolumn = "yes"; + }; + plugins = { # see https://github.com/airblade/vim-gitgutter/ gitgutter = { From 4e0ad9b61d46097c6dccaf86c916cfaa093969e9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 1 Jul 2026 23:09:59 +0200 Subject: [PATCH 067/184] Optimize search --- home/neovim/settings.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/home/neovim/settings.nix b/home/neovim/settings.nix index a6b414f..ae33311 100644 --- a/home/neovim/settings.nix +++ b/home/neovim/settings.nix @@ -65,6 +65,12 @@ # Don't use swapfiles swapfile = false; + # Optimize search + incsearch = true; + hlsearch = true; + ignorecase = true; + smartcase = true; + # -----VISUAL----- # Syntax highlighting From 179931f7238832b3a1e3fb510360041799c6769f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 2 Jul 2026 23:32:08 +0200 Subject: [PATCH 068/184] Add lightline plugin --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/lightline.nix | 60 +++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 home/neovim/plugins/lightline.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index 499cb17..9d583a4 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -5,6 +5,7 @@ ./fs.nix ./git.nix ./icons.nix + ./lightline.nix ./treesitter.nix ]; } diff --git a/home/neovim/plugins/lightline.nix b/home/neovim/plugins/lightline.nix new file mode 100644 index 0000000..5fdd235 --- /dev/null +++ b/home/neovim/plugins/lightline.nix @@ -0,0 +1,60 @@ +{ ... }: +{ + programs.nixvim = { + opts = { + # Always leave space for lightline + laststatus = 2; + + # Don't show mode as we'll have lightline display it + showmode = false; + }; + + plugins = { + # Install fugitive, so we have lightline integration. + # + # see https://github.com/tpope/vim-fugitive/ + fugitive = { + enable = true; + }; + + # See https://github.com/itchyny/lightline.vim/ + lightline = { + enable = true; + + settings = { + colorscheme = "one"; + + active = { + left = [ + [ + "mode" + "paste" + ] + [ + "gitbranch" + "readonly" + ] + ]; + + right = [ + [ "lineinfo" ] + [ + "fileformat" + "fileencoding" + "filetype" + ] + ]; + }; + + component = { + lineinfo = "%l>%c"; + }; + + component_function = { + gitbranch = "FugitiveHead"; + }; + }; + }; + }; + }; +} From a0e0967e8e4deb2da1896edad21b01db37ecce36 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 7 Jul 2026 01:22:14 +0200 Subject: [PATCH 069/184] Add undotree --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/undotree.nix | 33 ++++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) create mode 100644 home/neovim/plugins/undotree.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index 9d583a4..91bb915 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -7,5 +7,6 @@ ./icons.nix ./lightline.nix ./treesitter.nix + ./undotree.nix ]; } diff --git a/home/neovim/plugins/undotree.nix b/home/neovim/plugins/undotree.nix new file mode 100644 index 0000000..fa520fa --- /dev/null +++ b/home/neovim/plugins/undotree.nix @@ -0,0 +1,33 @@ +{ config, ... }: +{ + programs.nixvim = { + keymaps = [ + { + action = ":UndotreeToggle"; + key = "u"; + mode = [ "n" ]; + options = { + silent = true; + }; + } + ]; + + opts = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + { + undodir = nixvimLua '' + vim.fn.expand('~') .. '/.undodir' + ''; + undofile = true; + }; + + plugins = { + # see https://github.com/mbbill/undotree/ + undotree = { + enable = true; + }; + }; + }; +} From 9f6f8b5784deacb218c847c57e29a692711c7ca9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 9 Jul 2026 03:04:36 +0200 Subject: [PATCH 070/184] Fix golang dependency of gopls LSP --- home/neovim/lsp/golang.nix | 3 +++ 1 file changed, 3 insertions(+) diff --git a/home/neovim/lsp/golang.nix b/home/neovim/lsp/golang.nix index a1ee5eb..dc3e328 100644 --- a/home/neovim/lsp/golang.nix +++ b/home/neovim/lsp/golang.nix @@ -1,6 +1,9 @@ { programs.nixvim = { + dependencies.go.enable = true; + lsp.servers = { + # see https://github.com/golang/tools/tree/master/gopls gopls = { enable = true; }; From 422478c64327380d9b0adb684e163864c0dfbecb Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 9 Jul 2026 03:05:14 +0200 Subject: [PATCH 071/184] Tweak LSP integration The following changes, related to LSP make neovim feel more like an IDE: - Add ultisnips plugin - Format code on-save - Show LSP diagnostic errors - Show current function signature + highlight active parameter - Add proper LSP key-mappings - Add CMP plugin + ultisnips integration for auto-complete --- home/neovim/lsp/default.nix | 158 +++++++++++++++++++++++------------- 1 file changed, 100 insertions(+), 58 deletions(-) diff --git a/home/neovim/lsp/default.nix b/home/neovim/lsp/default.nix index 3a76369..c9938b8 100644 --- a/home/neovim/lsp/default.nix +++ b/home/neovim/lsp/default.nix @@ -1,68 +1,110 @@ -{ config, ... }: +{ pkgs, ... }: { imports = [ ./golang.nix - ./nix.nix - ./sh.nix + # ./nix.nix + # ./sh.nix ]; programs.nixvim = { - lsp = - let - nixvimLua = config.lib.nixvim.mkRaw; - in + extraPlugins = with pkgs.vimPlugins; [ + ultisnips + ]; + + autoGroups = { + format_on_save = { + clear = true; + }; + }; + autoCmd = [ { - inlayHints.enable = true; - keymaps = [ - { - key = "gd"; - lspBufAction = "definition"; - } - { - key = "gD"; - lspBufAction = "references"; - } - { - key = "gt"; - lspBufAction = "type_definition"; - } - { - key = "gi"; - lspBufAction = "implementation"; - } - { - key = "K"; - lspBufAction = "hover"; - } - { - action = nixvimLua "function() vim.diagnostic.jump({ count=-1, float=true }) end"; - key = "k"; - } - { - action = nixvimLua "function() vim.diagnostic.jump({ count=1, float=true }) end"; - key = "j"; - } - { - action = "LspStop"; - key = "lx"; - } - { - action = "LspStart"; - key = "ls"; - } - { - action = "LspRestart"; - key = "lr"; - } - { - action = nixvimLua "require('telescope.builtin').lsp_definitions"; - key = "gd"; - } - { - action = "Lspsaga hover_doc"; - key = "K"; - } - ]; + event = [ "BufWritePre" ]; + buffer = 0; + command = "lua vim.lsp.buf.format()"; + desc = "Auto-format on save"; + group = "format_on_save"; + } + ]; + + # Required for the `lsp-lines` plugin + diagnostic = { + settings = { + virtual_lines = true; + virtual_text = false; + }; + }; + + highlight = { + LspSignatureActiveParameter = { + fg = "#282c34"; + bg = "#61afef"; + }; + }; + + plugins = { + # see https://github.com/neovim/nvim-lspconfig/ + lsp = { + enable = true; + keymaps = { + lspBuf = { + K = "hover"; + gD = "references"; + gd = "definition"; + gi = "implementation"; + gt = "type_definition"; + }; + }; + }; + + # see https://git.sr.ht/~whynothugo/lsp_lines.nvim + lsp-lines = { + enable = true; + }; + + # see https://github.com/ray-x/lsp_signature.nvim/ + lsp-signature = { + enable = true; + settings = { + hint_enable = false; + }; + }; + + # see https://github.com/hrsh7th/nvim-cmp + cmp = { + enable = true; + autoEnableSources = true; + settings = { + sources = [ + { name = "nvim_lsp"; } + { name = "buffer"; } + { name = "path"; } + { name = "ultisnips"; } + ]; + + snippet = { + expand = '' + function(args) + -- ultisnips + vim.fn["UltiSnips#Anon"](args.body) + end + ''; + }; + + mapping = { + "" = "cmp.mapping.complete()"; + "" = "cmp.mapping.scroll_docs(-4)"; + "" = "cmp.mapping.close()"; + "" = "cmp.mapping.scroll_docs(4)"; + "" = "cmp.mapping.confirm({ select = true })"; + "" = "cmp.mapping(cmp.mapping.select_prev_item(), {'i', 's'})"; + "" = "cmp.mapping(cmp.mapping.select_next_item(), {'i', 's'})"; + }; + }; + }; + # see https://github.com/quangnguyen30192/cmp-nvim-ultisnips/ + cmp-nvim-ultisnips = { + enable = true; }; + }; }; } From c62ac6626195b0e2cecea46be05778d478d3255e Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 9 Jul 2026 03:13:56 +0200 Subject: [PATCH 072/184] Adjust git-diff signs --- home/neovim/plugins/git.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/home/neovim/plugins/git.nix b/home/neovim/plugins/git.nix index 06c67d0..640fd11 100644 --- a/home/neovim/plugins/git.nix +++ b/home/neovim/plugins/git.nix @@ -12,6 +12,12 @@ gitgutter = { enable = true; recommendedSettings = true; + settings = { + sign_added = "+"; + sign_removed = "-"; + sign_modified = "±"; + sign_modified_removed = "±"; + }; }; # see https://github.com/tpope/vim-fugitive/ From 8d3ed061fd8baaad832912c37f95e34d80fbb32b Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 9 Jul 2026 23:25:55 +0200 Subject: [PATCH 073/184] Waybar: fix showing active window exclusively --- home/hyprland/waybar/default.nix | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index 755ec61..42dd491 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -250,12 +250,11 @@ "hyprland/workspaces" = { # see https://github.com/Alexays/Waybar/wiki/Module:-Hyprland#workspaces - active-only = true; + active-only = false; on-click = "activate"; format = "{id}"; all-outputs = false; disable-scroll = false; - # "active-only"= false; }; "hyprland/window" = { From 67cd5494950a139f28b3c217dc40324fd5601820 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 10 Jul 2026 00:08:11 +0200 Subject: [PATCH 074/184] Re-add nix LSP --- home/neovim/lsp/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/neovim/lsp/default.nix b/home/neovim/lsp/default.nix index c9938b8..9e20da6 100644 --- a/home/neovim/lsp/default.nix +++ b/home/neovim/lsp/default.nix @@ -2,7 +2,7 @@ { imports = [ ./golang.nix - # ./nix.nix + ./nix.nix # ./sh.nix ]; From e8515ba75270b0ced62e8f9e6c89346afd89131a Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 10 Jul 2026 00:41:51 +0200 Subject: [PATCH 075/184] Re-add shell LSP --- home/neovim/lsp/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/neovim/lsp/default.nix b/home/neovim/lsp/default.nix index 9e20da6..feda27f 100644 --- a/home/neovim/lsp/default.nix +++ b/home/neovim/lsp/default.nix @@ -3,7 +3,7 @@ imports = [ ./golang.nix ./nix.nix - # ./sh.nix + ./sh.nix ]; programs.nixvim = { From 92f3a2a13873aa0828df268dc75879f784c0bf66 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 11 Jul 2026 00:02:21 +0200 Subject: [PATCH 076/184] Add motion jump plugin Add hop.nvim plugin for wide motion jumping. Historically, I used easymotion. However, easymotion is no longer maintained nor available in nixvim. --- home/neovim/plugins/default.nix | 1 + home/neovim/plugins/motion.nix | 60 +++++++++++++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 home/neovim/plugins/motion.nix diff --git a/home/neovim/plugins/default.nix b/home/neovim/plugins/default.nix index 91bb915..a1ffc40 100644 --- a/home/neovim/plugins/default.nix +++ b/home/neovim/plugins/default.nix @@ -6,6 +6,7 @@ ./git.nix ./icons.nix ./lightline.nix + ./motion.nix ./treesitter.nix ./undotree.nix ]; diff --git a/home/neovim/plugins/motion.nix b/home/neovim/plugins/motion.nix new file mode 100644 index 0000000..2cfa433 --- /dev/null +++ b/home/neovim/plugins/motion.nix @@ -0,0 +1,60 @@ +{ config, ... }: +{ + programs.nixvim = { + keymaps = + let + nixvimLua = config.lib.nixvim.mkRaw; + in + [ + { + mode = [ + "n" + "v" + ]; + key = "s"; + action = nixvimLua '' + function() + local hop = require('hop') + local directions = require('hop.hint').HintDirection + + hop.hint_char1({ + direction = directions.AFTER_CURSOR + }) + end + ''; + options = { + desc = "Quick jump after the cursor via hop motion plugin"; + silent = true; + }; + } + { + mode = [ + "n" + "v" + ]; + key = "S"; + action = nixvimLua '' + function() + local hop = require('hop') + local directions = require('hop.hint').HintDirection + + hop.hint_char1({ + direction = directions.BEFORE_CURSOR + }) + end + ''; + options = { + desc = "Quick jump before the cursor via hop motion plugin"; + silent = true; + }; + } + ]; + + plugins = { + # see https://github.com/smoka7/hop.nvim/ + hop = { + enable = true; + }; + }; + }; +} From 4bf6758045b7012ddf4d4a3b1c4c8c484b812e95 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 11 Jul 2026 00:31:49 +0200 Subject: [PATCH 077/184] Add indentscope for indentation visualization --- home/neovim/plugins/editing.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/home/neovim/plugins/editing.nix b/home/neovim/plugins/editing.nix index 084f694..7160f22 100644 --- a/home/neovim/plugins/editing.nix +++ b/home/neovim/plugins/editing.nix @@ -6,6 +6,11 @@ vim-surround = { enable = true; }; + + # see https://github.com/nvim-mini/mini.indentscope/ + mini-indentscope = { + enable = true; + }; }; }; } From d2cb4b62161db9b71a205462b39707ba9851f4bd Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 11 Jul 2026 00:46:45 +0200 Subject: [PATCH 078/184] Telescope: remove unused telescope LSP config --- home/neovim/plugins/finder.nix | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/home/neovim/plugins/finder.nix b/home/neovim/plugins/finder.nix index f5782d0..ff6639d 100644 --- a/home/neovim/plugins/finder.nix +++ b/home/neovim/plugins/finder.nix @@ -78,26 +78,6 @@ desc = "Search for string by using ripgrep (respecting .gitignore)"; }; }; - - # # LSP integration - # "gd" = { - # action = "lsp_definitions"; - # options = { - # desc = "Goto definition under the cursor"; - # }; - # }; - # "gr" = { - # action = "lsp_references"; - # options = { - # desc = "Find references under the cursor"; - # }; - # }; - # "gi" = { - # action = "lsp_implementations"; - # options = { - # desc = "Find implementations under the cursor"; - # }; - # }; }; }; }; From ce2950d496bfd6f545ef2dd6af137c0a2b158038 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 11 Jul 2026 01:41:00 +0200 Subject: [PATCH 079/184] Change cursor theme to adwaita --- system/programs/hyprland/default.nix | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/system/programs/hyprland/default.nix b/system/programs/hyprland/default.nix index 801f62d..6c948b1 100644 --- a/system/programs/hyprland/default.nix +++ b/system/programs/hyprland/default.nix @@ -10,8 +10,15 @@ in { environment.systemPackages = [ pkgs.hyprland + # For adwaita cursor theme + pkgs.adwaita-icon-theme ]; + environment.sessionVariables = { + XCURSOR_THEME = "Adwaita"; + XCURSOR_SIZE = "24"; + }; + programs.hyprland = { enable = true; withUWSM = true; From 65e84427ac6d6ef6424ac27a2755c757a32ab005 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 11 Jul 2026 23:54:08 +0200 Subject: [PATCH 080/184] Tweak rofi config --- home/hyprland/default.nix | 1 + home/hyprland/rofi.nix | 11 +++++++++++ 2 files changed, 12 insertions(+) create mode 100644 home/hyprland/rofi.nix diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index 3fe2162..93134ce 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -10,6 +10,7 @@ ./hyprsysteminfo.nix ./notification ./qt.nix + ./rofi.nix ./waybar ]; } diff --git a/home/hyprland/rofi.nix b/home/hyprland/rofi.nix new file mode 100644 index 0000000..3e23c92 --- /dev/null +++ b/home/hyprland/rofi.nix @@ -0,0 +1,11 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.rofi + ]; + + programs.rofi = { + enable = true; + theme = "sidebar"; + }; +} From 0f98eb03add213d50c6f4968b0813ffa3b655882 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 11 Jul 2026 23:58:24 +0200 Subject: [PATCH 081/184] Move dunst config --- home/hyprland/default.nix | 2 +- home/hyprland/{notification/default.nix => dunst.nix} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename home/hyprland/{notification/default.nix => dunst.nix} (100%) diff --git a/home/hyprland/default.nix b/home/hyprland/default.nix index 93134ce..f911f7a 100644 --- a/home/hyprland/default.nix +++ b/home/hyprland/default.nix @@ -1,6 +1,7 @@ { imports = [ ./clipboard.nix + ./dunst.nix ./fonts.nix ./hypridle.nix ./hyprland.nix @@ -8,7 +9,6 @@ ./hyprpaper ./hyprpolkitagent.nix ./hyprsysteminfo.nix - ./notification ./qt.nix ./rofi.nix ./waybar diff --git a/home/hyprland/notification/default.nix b/home/hyprland/dunst.nix similarity index 100% rename from home/hyprland/notification/default.nix rename to home/hyprland/dunst.nix From bdd4b4267cda119a8d6882762d9e8ee82fedd171 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 12 Jul 2026 17:16:52 +0200 Subject: [PATCH 082/184] Manage .editorconfig --- home/default.nix | 1 + home/editorconfig/default.nix | 63 +++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 home/editorconfig/default.nix diff --git a/home/default.nix b/home/default.nix index a90f0e5..cc887e8 100644 --- a/home/default.nix +++ b/home/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./editorconfig ./hyprland ./neovim ]; diff --git a/home/editorconfig/default.nix b/home/editorconfig/default.nix new file mode 100644 index 0000000..f78d00b --- /dev/null +++ b/home/editorconfig/default.nix @@ -0,0 +1,63 @@ +{ ... }: +{ + editorconfig = { + enable = true; + + settings = { + "*" = { + charset = "utf-8"; + end_of_line = "lf"; + indent_size = 4; + tab_width = 8; + indent_style = "tab"; + insert_final_newline = true; + max_line_length = 100; + trim_trailing_whitespace = true; + }; + + "*.{css,scss,sass}" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.go" = { + tab_width = 8; + indent_style = "tab"; + }; + + "*.html" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.md" = { + trim_trailing_whitespace = false; + }; + + "*.nix" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.{js,ts,json}" = { + indent_size = 2; + indent_style = "space"; + }; + + "*.php" = { + indent_size = 4; + indent_style = "space"; + }; + + "*.py" = { + indent_size = 4; + indent_style = "space"; + }; + + "*.{yml,yaml}" = { + indent_size = 2; + indent_style = "space"; + }; + }; + }; +} From aa0cc45cfa3961656d619a7df58535e6482ee7ac Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 14 Jul 2026 01:23:56 +0200 Subject: [PATCH 083/184] Configure gpg and gpg-agent --- home/default.nix | 1 + home/gpg/default.nix | 75 ++++++++++++++++++++++++++++++++++++++++ hosts/nixos-btw/home.nix | 6 ---- 3 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 home/gpg/default.nix diff --git a/home/default.nix b/home/default.nix index cc887e8..842b161 100644 --- a/home/default.nix +++ b/home/default.nix @@ -1,6 +1,7 @@ { imports = [ ./editorconfig + ./gpg ./hyprland ./neovim ]; diff --git a/home/gpg/default.nix b/home/gpg/default.nix new file mode 100644 index 0000000..2ebe849 --- /dev/null +++ b/home/gpg/default.nix @@ -0,0 +1,75 @@ +{ pkgs, ... }: +{ + programs.gpg = { + enable = true; + + # Have GPG database being managed by the user. + mutableKeys = true; + mutableTrust = true; + + settings = { + charset = "utf=8"; + default-key = "0x49593BD010DE4723"; + no-emit-version = true; + no-comments = true; + keyid-format = "0xlong"; + with-fingerprint = true; + list-options = "show-uid-validity"; + verify-options = "show-uid-validity"; + use-agent = true; + keyserver = "keys.openpgp.org"; + keyserver-options = [ + "no-honor-keyserver-url" + "include-revoked" + ]; + personal-cipher-preferences = [ + "AES256" + "AES192" + "AES" + "CAST5" + ]; + personal-digest-preferences = [ + "SHA512" + "SHA384" + "SHA256" + "SHA224" + ]; + cert-digest-algo = "SHA512"; + s2k-digest-algo = "SHA512"; + default-preference-list = [ + "SHA512" + "SHA384" + "SHA256" + "SHA224" + "AES256" + "AES192" + "AES" + "CAST5" + "ZLIB" + "BZIP2" + "ZIP" + "Uncompressed" + ]; + }; + }; + + services.gpg-agent = { + enable = true; + pinentry.package = pkgs.pinentry-gnome3; + + enableBashIntegration = true; + enableFishIntegration = true; + + enableScDaemon = true; + enableSshSupport = true; + + # Cache passphrase for the given TTL in seconds. + # Extend the cache lifetime on cache hits. + defaultCacheTtl = 60 * 60; + defaultCacheTtlSsh = 60 * 60; + + # Maximum cache TTL beyond which it cannot be extended. + maxCacheTtl = 60 * 60 * 8; + maxCacheTtlSsh = 60 * 60 * 8; + }; +} diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix index 564b900..6bdcbc4 100644 --- a/hosts/nixos-btw/home.nix +++ b/hosts/nixos-btw/home.nix @@ -35,10 +35,4 @@ # Let Home Manager install and manage itself. programs.home-manager.enable = true; - - services.gpg-agent = { - enable = true; - defaultCacheTtl = 1800; - enableSshSupport = true; - }; } From 749ca706e867a38d85a3baa04cd3c5231c33fdef Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 14 Jul 2026 01:40:48 +0200 Subject: [PATCH 084/184] gpg: tweak pinentry --- home/gpg/default.nix | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/home/gpg/default.nix b/home/gpg/default.nix index 2ebe849..6c7d7ea 100644 --- a/home/gpg/default.nix +++ b/home/gpg/default.nix @@ -55,7 +55,10 @@ services.gpg-agent = { enable = true; - pinentry.package = pkgs.pinentry-gnome3; + pinentry = { + package = pkgs.pinentry-all; + program = "pinentry-gnome3"; + }; enableBashIntegration = true; enableFishIntegration = true; From 540668220dfa1a4739b8f98faa9029998dd14b43 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 14 Jul 2026 12:56:17 +0200 Subject: [PATCH 085/184] Add git config --- home/default.nix | 1 + home/git/default.nix | 175 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 176 insertions(+) create mode 100644 home/git/default.nix diff --git a/home/default.nix b/home/default.nix index 842b161..4ce92ab 100644 --- a/home/default.nix +++ b/home/default.nix @@ -1,6 +1,7 @@ { imports = [ ./editorconfig + ./git ./gpg ./hyprland ./neovim diff --git a/home/git/default.nix b/home/git/default.nix new file mode 100644 index 0000000..6d241c6 --- /dev/null +++ b/home/git/default.nix @@ -0,0 +1,175 @@ +{ pkgs, lib, ... }: +{ + programs.git = + let + bash = "${lib.getExe pkgs.bash}"; + delta = "${lib.getExe pkgs.delta}"; + diff = "${lib.getBin pkgs.diffutils}/bin/diff"; + git = "${lib.getExe pkgs.git}"; + grep = "${lib.getExe pkgs.gnugrep}"; + head = "${lib.getBin pkgs.coreutils}/bin/head"; + nvim = "${lib.getExe pkgs.neovim}"; + sed = "${lib.getExe pkgs.gnused}"; + in + { + enable = true; + package = pkgs.gitFull; + + ignores = [ + "*.sublime-project" + "*.sublime-workspace" + "*.swp" + "*~" + ".DS_Store" + ".tags" + ".tags.lock" + ".tags.temp" + "/.tmuxinator.yml" + "Session.vim" + ]; + + maintenance.enable = true; + + signing = { + format = "openpgp"; + key = "0x49593BD010DE4723"; + signByDefault = true; + }; + + settings = [ + { + core = { + autocrlf = "input"; + editor = "nvim"; + pager = delta; + }; + } + { + user = { + name = "Rudolf Tucek"; + email = "tucek.rudolf@gmail.com"; + }; + } + { + alias = { + fork-point = "!${bash} -c '${diff} -u <(${git} rev-list --first-parent \"\${1:-master}\") <(${git} rev-list --first-parent \"\${2:-HEAD}\") | ${sed} -ne \"s/^ //p\" | ${head} -1' -"; + lg = "lg1"; + lg1 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --branches --remotes --tags"; + lg2 = "log --graph --abbrev-commit --decorate --date=relative --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset) %C(bold yellow)%d%C(reset)' --all"; + patch = "!${git} --no-pager diff --no-color"; + permission-reset = "!${git} diff -p -R | ${grep} -E \"^(diff|(old|new) mode)\" | ${git} apply"; + }; + } + { + commit = { + verbose = true; + cleanup = true; + }; + } + { + tag = { + forceSignAnnotated = true; + }; + } + { + format = { + coverFromDescription = "auto"; + coverLetter = "auto"; + signOff = "true"; + }; + } + { + fetch = { + prune = true; + }; + } + { + prune = { + rebase = "merges"; + }; + } + { + pull = { + rebase = "merges"; + }; + } + { + push = { + default = "simple"; + }; + } + { + rebase = { + autoStash = true; + }; + } + { + merge = { + autoStash = true; + conflictstyle = "diff3"; + ff = false; + log = true; + tool = "nvimdiff"; + }; + } + { + mergetool = { + prompt = true; + }; + } + { + "mergetool \"nvimdiff\"" = { + cmd = "${nvim} -d $BASE $LOCAL $REMOTE $MERGED -c '$wincmd w' -c 'wincmd J'"; + }; + } + { + color = { + ui = true; + }; + } + { + diff = { + colorMoved = "default"; + renames = "copies"; + tool = "nvimdiff"; + }; + } + { + difftool = { + prompt = true; + }; + } + { + "difftool \"nvimdiff\"" = { + cmd = "${nvim} -d $LOCAL $REMOTE -c '$wincmd w' -c 'wincmd L'"; + }; + } + { + delta = { + color-only = true; + hunk-header-style = "syntax"; + line-numbers = true; + minus-style = "syntax \"#3f0001\""; + # side-by-side = true; + syntax-theme = "Monokai Extended"; + whitespace-error-style = "normal"; + }; + } + { + interactive = { + diffFilter = "${delta} --color-only --hunk-header-style raw"; + }; + } + { + "color \"diff\"" = { + commit = "yellow bold"; + frag = "magenta bold"; + meta = "11"; + new = "green bold"; + old = "red bold"; + # whitespace = "red reverse"; + }; + } + ]; + }; +} From d46f0c499f76e9797c39942b41b3d0bd28ad657d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 14 Jul 2026 23:09:50 +0200 Subject: [PATCH 086/184] Setup tmux --- home/default.nix | 1 + home/tmux/default.nix | 156 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 157 insertions(+) create mode 100644 home/tmux/default.nix diff --git a/home/default.nix b/home/default.nix index 4ce92ab..d010856 100644 --- a/home/default.nix +++ b/home/default.nix @@ -5,5 +5,6 @@ ./gpg ./hyprland ./neovim + ./tmux ]; } diff --git a/home/tmux/default.nix b/home/tmux/default.nix new file mode 100644 index 0000000..359e155 --- /dev/null +++ b/home/tmux/default.nix @@ -0,0 +1,156 @@ +{ pkgs, ... }: +{ + programs.tmux = { + enable = true; + sensibleOnTop = true; + + secureSocket = true; + + prefix = "C-Space"; + + mouse = true; + baseIndex = 1; + clock24 = true; + + extraConfig = '' + # Set ability to capture on start and restore on exit window data when + # running an application + setw -g alternate-screen on + + # Scrolling + set -g terminal-overrides 'xterm*:smcup@:rmcup@' + + # Cursor shape + set -ga terminal-overrides '*:Ss=\E[%p1%d q:Se=\E[ q' + + # Ensure colors are set properly + set-option -sa terminal-overrides ',rxvt-unicode-256color:RGB' # urxvt + set-option -sa terminal-overrides ',xterm-256color:RGB' # terminator + + # Set window title + set-option -g set-titles on + set-option -g set-titles-string "#S: #{pane_current_command}" + + # Don't set the clipboard via escape sequence + set-option -s set-clipboard off + + + + ### GENERAL KEY BINDINGS ### + # Clock mode (default binding "t" gets overridden via tmux-sessionist plugin) + bind T clock-mode + + # Move back and forward + bind -r 'C-p' previous-window + bind -r 'C-n' next-window + + # Split windows + bind 'c' new-window -c '#{pane_current_path}' + + + + ### TWEAK UI ### + # Derived from + # https://www.hamvocke.com/blog/a-guide-to-customizing-your-tmux-conf/ + + # Re-enumerate windows on close + set-option -g renumber-windows on + # Re-name windows, based on current program + setw -g automatic-rename on + + # Panes + set -g pane-border-style fg=black + set -g pane-active-border-style fg=brightred + + + ## Status bar design + # Status line + set -g status-justify left + set -g status-bg default + set -g status-fg colour12 + set -g status-interval 1 + + + # Messaging + set -g message-style fg=black + set -g message-style bg=yellow + set -g message-command-style fg=blue + set -g message-command-style bg=black + + + # Window mode + setw -g mode-style bg=colour6 + setw -g mode-style fg=colour0 + + + # Window status + setw -g window-status-format " #F#I:#W#F " + setw -g window-status-current-format " #F#I:#W#F " + setw -g window-status-format "#[fg=magenta]#[bg=black] #I #[bg=cyan]#[fg=colour8] #W " + setw -g window-status-current-format "#[bg=brightmagenta]#[fg=colour8] #I #[fg=colour8]#[bg=colour14] #W " + setw -g window-status-current-style bg=colour0 + setw -g window-status-current-style fg=colour11 + setw -g window-status-current-style dim + setw -g window-status-style bg=green + setw -g window-status-style fg=black + setw -g window-status-style reverse + + + # Info on left (I don't have a session display for now) + set -g status-left ''' + + + # Loud or quiet? + set-option -g visual-activity off + set-option -g visual-bell off + set-option -g visual-silence off + set-window-option -g monitor-activity off + set-option -g bell-action none + + + # The modes + setw -g clock-mode-colour colour135 + setw -g mode-style bold + setw -g mode-style fg=colour196 + setw -g mode-style bg=colour238 + + + # The panes + set -g pane-border-style bg=colour235 + set -g pane-border-style fg=colour238 + set -g pane-active-border-style bg=colour236 + set -g pane-active-border-style fg=colour51 + + + # The statusbar + set -g status-position bottom + set -g status-bg colour234 + set -g status-fg colour137 + set -g status-style dim + set -g status-left ''' + set -g status-right '#[fg=colour233,bg=colour241,bold] %Y-%m-%d #[fg=colour233,bg=colour245,bold] %H:%M:%S ' + set -g status-right-length 100 + set -g status-left-length 20 + + setw -g window-status-current-style fg=colour81 + setw -g window-status-current-style bg=colour238 + setw -g window-status-current-style bold + setw -g window-status-current-format ' #I#[fg=colour250]:#[fg=colour255]#W#[fg=colour50]#F ' + + setw -g window-status-style fg=colour138 + setw -g window-status-style bg=colour235 + setw -g window-status-style none + setw -g window-status-format ' #I#[fg=colour237]:#[fg=colour250]#W#[fg=colour244]#F ' + + setw -g window-status-bell-style bold + setw -g window-status-bell-style fg=colour255 + setw -g window-status-bell-style bg=colour1 + + + # The messages + set -g message-style bold + set -g message-style fg=colour232 + set -g message-style bg=colour166 + ''; + }; +} From 88c658fcfd2f5d675659acb82a7116b94aaf63f0 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 12:29:04 +0200 Subject: [PATCH 087/184] Switch to vi-keybindings --- home/tmux/default.nix | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/home/tmux/default.nix b/home/tmux/default.nix index 359e155..878737d 100644 --- a/home/tmux/default.nix +++ b/home/tmux/default.nix @@ -7,6 +7,7 @@ secureSocket = true; prefix = "C-Space"; + keyMode = "vi"; mouse = true; baseIndex = 1; @@ -152,5 +153,13 @@ set -g message-style fg=colour232 set -g message-style bg=colour166 ''; + + plugins = with pkgs; [ + tmuxPlugins.copycat + tmuxPlugins.open + tmuxPlugins.pain-control + tmuxPlugins.sessionist + tmuxPlugins.yank + ]; }; } From 74433cb389ac8a5ae5cd15c4ddb264088eaa6f64 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 12:36:37 +0200 Subject: [PATCH 088/184] tmux: fix yank plugin --- home/tmux/default.nix | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/home/tmux/default.nix b/home/tmux/default.nix index 878737d..40ba4b4 100644 --- a/home/tmux/default.nix +++ b/home/tmux/default.nix @@ -1,5 +1,9 @@ -{ pkgs, ... }: +{ pkgs, lib, ... }: { + home.packages = [ + pkgs.wl-clipboard + ]; + programs.tmux = { enable = true; sensibleOnTop = true; @@ -154,12 +158,22 @@ set -g message-style bg=colour166 ''; - plugins = with pkgs; [ - tmuxPlugins.copycat - tmuxPlugins.open - tmuxPlugins.pain-control - tmuxPlugins.sessionist - tmuxPlugins.yank - ]; + plugins = + let + wl-copy = "${lib.getBin pkgs.wl-clipboard}/bin/wl-copy"; + in + with pkgs; + [ + tmuxPlugins.copycat + tmuxPlugins.open + tmuxPlugins.pain-control + tmuxPlugins.sessionist + { + plugin = tmuxPlugins.yank; + extraConfig = '' + set -g @override_copy_command '${wl-copy}' + ''; + } + ]; }; } From d70d36c7b5a8d3f9ebe04b64b477547e778c849f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 12:49:09 +0200 Subject: [PATCH 089/184] Add tmux jump plugin --- home/tmux/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/home/tmux/default.nix b/home/tmux/default.nix index 40ba4b4..732b1f5 100644 --- a/home/tmux/default.nix +++ b/home/tmux/default.nix @@ -174,6 +174,7 @@ set -g @override_copy_command '${wl-copy}' ''; } + tmuxPlugins.jump ]; }; } From 945a303dba84994a2a6c19add835b1104014f056 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 15:05:59 +0200 Subject: [PATCH 090/184] Add tmuxinator + home port --- home/tmux/default.nix | 4 ++++ home/tmux/tmuxinator/default.nix | 10 ++++++++++ home/tmux/tmuxinator/home.nix | 23 +++++++++++++++++++++++ 3 files changed, 37 insertions(+) create mode 100644 home/tmux/tmuxinator/default.nix create mode 100644 home/tmux/tmuxinator/home.nix diff --git a/home/tmux/default.nix b/home/tmux/default.nix index 732b1f5..6a88261 100644 --- a/home/tmux/default.nix +++ b/home/tmux/default.nix @@ -1,5 +1,9 @@ { pkgs, lib, ... }: { + imports = [ + ./tmuxinator + ]; + home.packages = [ pkgs.wl-clipboard ]; diff --git a/home/tmux/tmuxinator/default.nix b/home/tmux/tmuxinator/default.nix new file mode 100644 index 0000000..dfdd88d --- /dev/null +++ b/home/tmux/tmuxinator/default.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + imports = [ + ./home.nix + ]; + + programs.tmux.tmuxinator = { + enable = true; + }; +} diff --git a/home/tmux/tmuxinator/home.nix b/home/tmux/tmuxinator/home.nix new file mode 100644 index 0000000..36e6a4f --- /dev/null +++ b/home/tmux/tmuxinator/home.nix @@ -0,0 +1,23 @@ +{ pkgs, lib, ... }: +{ + programs.tmux.tmuxinator.projects = { + home = { + name = "home"; + root = "~/"; + + windows = + let + htop = "${lib.getExe pkgs.htop}"; + fastfetch = "${lib.getExe pkgs.fastfetch}"; + in + [ + { + htop = htop; + } + { + cli = fastfetch; + } + ]; + }; + }; +} From 882491e672c7a00abab8c2523c795817f72b8b54 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 15:48:56 +0200 Subject: [PATCH 091/184] tmuxinator: add dotfiles definition --- home/tmux/tmuxinator/default.nix | 1 + home/tmux/tmuxinator/dotfiles.nix | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) create mode 100644 home/tmux/tmuxinator/dotfiles.nix diff --git a/home/tmux/tmuxinator/default.nix b/home/tmux/tmuxinator/default.nix index dfdd88d..e48589b 100644 --- a/home/tmux/tmuxinator/default.nix +++ b/home/tmux/tmuxinator/default.nix @@ -1,6 +1,7 @@ { ... }: { imports = [ + ./dotfiles.nix ./home.nix ]; diff --git a/home/tmux/tmuxinator/dotfiles.nix b/home/tmux/tmuxinator/dotfiles.nix new file mode 100644 index 0000000..9648fca --- /dev/null +++ b/home/tmux/tmuxinator/dotfiles.nix @@ -0,0 +1,26 @@ +{ pkgs, config, ... }: +{ + programs.tmux.tmuxinator.projects = { + dotfiles = { + name = "dotfiles"; + root = "~/projects/dotfiles/"; + + startup_window = "git"; + + windows = + let + nvim = "${config.programs.nixvim.build.package}/bin/nvim"; + in + [ + { + nvim = nvim; + } + { + git = [ + "" + ]; + } + ]; + }; + }; +} From 0dfa6cda7bcf66acae618d166af9ee881ed34ce1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 15:51:27 +0200 Subject: [PATCH 092/184] tmuxinator: declare startup window for home profile --- home/tmux/tmuxinator/home.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/home/tmux/tmuxinator/home.nix b/home/tmux/tmuxinator/home.nix index 36e6a4f..581fe38 100644 --- a/home/tmux/tmuxinator/home.nix +++ b/home/tmux/tmuxinator/home.nix @@ -5,6 +5,8 @@ name = "home"; root = "~/"; + startup_window = "cli"; + windows = let htop = "${lib.getExe pkgs.htop}"; From c175b381cfef268b10f50af92bdb1b44be0d59d5 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 15 Jul 2026 16:55:59 +0200 Subject: [PATCH 093/184] tmuxinator: clone dotfile repo if not already present --- home/tmux/tmuxinator/dotfiles.nix | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/home/tmux/tmuxinator/dotfiles.nix b/home/tmux/tmuxinator/dotfiles.nix index 9648fca..e92db81 100644 --- a/home/tmux/tmuxinator/dotfiles.nix +++ b/home/tmux/tmuxinator/dotfiles.nix @@ -1,9 +1,29 @@ -{ pkgs, config, ... }: { + pkgs, + config, + lib, + ... +}: +let + targetDir = "${config.home.homeDirectory}/projects/dotfiles"; + repoUrl = "https://github.com/rtucek/dotfiles.git"; + git = "${lib.getExe pkgs.git}"; + mkdir = "${lib.getBin pkgs.coreutils-full}/bin/mkdir"; +in +{ + home.activation.cloneDotfiles = lib.hm.dag.entryAfter [ "writeBoundary" "installPackages" "git" ] '' + # Only clone if the .git directory doesn't exist + # This preserves local changes if the repo already exists + if [ ! -d "${targetDir}/.git" ]; then + ${mkdir} -p ${targetDir} + ${git} clone ${repoUrl} ${targetDir} + fi + ''; + programs.tmux.tmuxinator.projects = { dotfiles = { name = "dotfiles"; - root = "~/projects/dotfiles/"; + root = "${targetDir}/"; startup_window = "git"; From 1d3b8bc5869c5eb7eb14decd400e59b58c6be7e1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 16 Jul 2026 20:11:59 +0200 Subject: [PATCH 094/184] Migrate to new package structure --- home/default.nix | 1 + home/tools/default.nix | 11 +++++++++++ home/tools/dev.nix | 6 ++++++ home/tools/fs.nix | 5 +++++ home/tools/misc.nix | 7 +++++++ home/tools/network.nix | 5 +++++ home/tools/sys.nix | 7 +++++++ home/tools/virt.nix | 5 +++++ home/tools/web.nix | 6 ++++++ hosts/nixos-btw/home.nix | 8 -------- 10 files changed, 53 insertions(+), 8 deletions(-) create mode 100644 home/tools/default.nix create mode 100644 home/tools/dev.nix create mode 100644 home/tools/fs.nix create mode 100644 home/tools/misc.nix create mode 100644 home/tools/network.nix create mode 100644 home/tools/sys.nix create mode 100644 home/tools/virt.nix create mode 100644 home/tools/web.nix diff --git a/home/default.nix b/home/default.nix index d010856..f41086a 100644 --- a/home/default.nix +++ b/home/default.nix @@ -6,5 +6,6 @@ ./hyprland ./neovim ./tmux + ./tools ]; } diff --git a/home/tools/default.nix b/home/tools/default.nix new file mode 100644 index 0000000..c4b3281 --- /dev/null +++ b/home/tools/default.nix @@ -0,0 +1,11 @@ +{ + imports = [ + ./dev.nix + ./fs.nix + ./misc.nix + ./network.nix + ./sys.nix + ./virt.nix + ./web.nix + ]; +} diff --git a/home/tools/dev.nix b/home/tools/dev.nix new file mode 100644 index 0000000..93ff28f --- /dev/null +++ b/home/tools/dev.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.go + ]; +} diff --git a/home/tools/fs.nix b/home/tools/fs.nix new file mode 100644 index 0000000..2a9f4e3 --- /dev/null +++ b/home/tools/fs.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: +{ + home.packages = [ + ]; +} diff --git a/home/tools/misc.nix b/home/tools/misc.nix new file mode 100644 index 0000000..91ce21f --- /dev/null +++ b/home/tools/misc.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.fastfetch + pkgs.fortune + ]; +} diff --git a/home/tools/network.nix b/home/tools/network.nix new file mode 100644 index 0000000..2a9f4e3 --- /dev/null +++ b/home/tools/network.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: +{ + home.packages = [ + ]; +} diff --git a/home/tools/sys.nix b/home/tools/sys.nix new file mode 100644 index 0000000..c721b37 --- /dev/null +++ b/home/tools/sys.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.coreutils-full + pkgs.htop + ]; +} diff --git a/home/tools/virt.nix b/home/tools/virt.nix new file mode 100644 index 0000000..2a9f4e3 --- /dev/null +++ b/home/tools/virt.nix @@ -0,0 +1,5 @@ +{ pkgs, ... }: +{ + home.packages = [ + ]; +} diff --git a/home/tools/web.nix b/home/tools/web.nix new file mode 100644 index 0000000..8e7b9ad --- /dev/null +++ b/home/tools/web.nix @@ -0,0 +1,6 @@ +{ pkgs, ... }: +{ + home.packages = [ + pkgs.brave + ]; +} diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix index 6bdcbc4..d87d274 100644 --- a/hosts/nixos-btw/home.nix +++ b/hosts/nixos-btw/home.nix @@ -15,14 +15,6 @@ ../../home ]; - # Packages that should be installed to the user profile. - home.packages = [ - pkgs.htop - pkgs.fortune - pkgs.fastfetch - pkgs.brave - ]; - # This value determines the Home Manager release that your # configuration is compatible with. This helps avoid breakage # when a new Home Manager release introduces backwards From f95769f0d737c9c40b6f92714d13b73a1426fb53 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 16 Jul 2026 20:12:22 +0200 Subject: [PATCH 095/184] Use "coreutils-full" over "coreutils" consistently --- home/git/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/git/default.nix b/home/git/default.nix index 6d241c6..d87762a 100644 --- a/home/git/default.nix +++ b/home/git/default.nix @@ -7,7 +7,7 @@ diff = "${lib.getBin pkgs.diffutils}/bin/diff"; git = "${lib.getExe pkgs.git}"; grep = "${lib.getExe pkgs.gnugrep}"; - head = "${lib.getBin pkgs.coreutils}/bin/head"; + head = "${lib.getBin pkgs.coreutils-full}/bin/head"; nvim = "${lib.getExe pkgs.neovim}"; sed = "${lib.getExe pkgs.gnused}"; in From 26ca7561a0a781b09a95f096e85ca2226f9a8569 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 17 Jul 2026 00:09:53 +0200 Subject: [PATCH 096/184] Add standard packages --- home/tools/crypto.nix | 12 ++++++++++++ home/tools/default.nix | 2 ++ home/tools/desktop.nix | 23 +++++++++++++++++++++++ home/tools/dev.nix | 10 ++++++++++ home/tools/fs.nix | 41 +++++++++++++++++++++++++++++++++++++++++ home/tools/k8s.nix | 14 ++++++++++++++ home/tools/misc.nix | 2 ++ home/tools/network.nix | 21 +++++++++++++++++++++ home/tools/sys.nix | 14 ++++++++++++++ home/tools/virt.nix | 10 ++++++++++ home/tools/web.nix | 5 +++++ 11 files changed, 154 insertions(+) create mode 100644 home/tools/crypto.nix create mode 100644 home/tools/desktop.nix create mode 100644 home/tools/k8s.nix diff --git a/home/tools/crypto.nix b/home/tools/crypto.nix new file mode 100644 index 0000000..60e258e --- /dev/null +++ b/home/tools/crypto.nix @@ -0,0 +1,12 @@ +{ pkgs, ... }: +{ + home.packages = [ + # General + pkgs.openssl + + # Certificate inspection and management + pkgs.certigo + pkgs.testssl + pkgs.mkcert + ]; +} diff --git a/home/tools/default.nix b/home/tools/default.nix index c4b3281..de54ff9 100644 --- a/home/tools/default.nix +++ b/home/tools/default.nix @@ -1,7 +1,9 @@ { imports = [ + ./crypto.nix ./dev.nix ./fs.nix + ./k8s.nix ./misc.nix ./network.nix ./sys.nix diff --git a/home/tools/desktop.nix b/home/tools/desktop.nix new file mode 100644 index 0000000..bda9a0a --- /dev/null +++ b/home/tools/desktop.nix @@ -0,0 +1,23 @@ +{ pkgs, ... }: +{ + home.packages = [ + # CLI & terminal + pkgs.wl-clipboard + pkgs.kitty + + # Email + pkgs.thunderbird + + # Encryption + pkgs.veracrypt + + # Sound + pkgs.hyprpwcenter + + # Office + pkgs.libreoffice + + # HTTP client + pkgs.postman + ]; +} diff --git a/home/tools/dev.nix b/home/tools/dev.nix index 93ff28f..956c432 100644 --- a/home/tools/dev.nix +++ b/home/tools/dev.nix @@ -1,6 +1,16 @@ { pkgs, ... }: { home.packages = [ + # Common tools + pkgs.delta + pkgs.jless + pkgs.jq + + # Golang pkgs.go + + # Nix + pkgs.nix-diff + pkgs.nixfmt-tree ]; } diff --git a/home/tools/fs.nix b/home/tools/fs.nix index 2a9f4e3..b7abba2 100644 --- a/home/tools/fs.nix +++ b/home/tools/fs.nix @@ -1,5 +1,46 @@ { pkgs, ... }: { home.packages = [ + # Compression + pkgs.gnutar + pkgs.gzip + pkgs.xz + pkgs.zip + pkgs.zstd + + # Inspect + pkgs.bat + pkgs.file + pkgs.less + pkgs.tree + + # Search'n'replace + pkgs.findutils + pkgs.gawk + pkgs.gnugrep + pkgs.gnused + pkgs.ripgrep + + # Debugging + pkgs.lsof + pkgs.ncdu + + # File system support + pkgs.bcachefs-tools + pkgs.btrfs-progs + pkgs.cryptsetup + pkgs.dosfstools + pkgs.exfatprogs + pkgs.hfsprogs + pkgs.hfsutils + pkgs.lvm2 + pkgs.mtools + pkgs.ntfs3g + pkgs.xfsprogs + pkgs.zfs + + # Misc + pkgs.rsync + pkgs.socat ]; } diff --git a/home/tools/k8s.nix b/home/tools/k8s.nix new file mode 100644 index 0000000..90e5e6a --- /dev/null +++ b/home/tools/k8s.nix @@ -0,0 +1,14 @@ +{ pkgs, ... }: +{ + home.packages = [ + # k8s + pkgs.kubectl + + # Deployment + pkgs.helm + + # Monitoring + pkgs.k9s + pkgs.stern + ]; +} diff --git a/home/tools/misc.nix b/home/tools/misc.nix index 91ce21f..e8db2f8 100644 --- a/home/tools/misc.nix +++ b/home/tools/misc.nix @@ -3,5 +3,7 @@ home.packages = [ pkgs.fastfetch pkgs.fortune + pkgs.gitlogue + pkgs.pwgen ]; } diff --git a/home/tools/network.nix b/home/tools/network.nix index 2a9f4e3..9ab473b 100644 --- a/home/tools/network.nix +++ b/home/tools/network.nix @@ -1,5 +1,26 @@ { pkgs, ... }: { home.packages = [ + # General + pkgs.inetutils + pkgs.iproute2 + pkgs.ethtool + + # DNS + pkgs.doggo + pkgs.dig + pkgs.whois + + # Debugging + pkgs.ipcalc + pkgs.traceroute + pkgs.mtr # Better alternative to traceroute + pkgs.netcat-gnu + pkgs.nmap + pkgs.tcpdump + pkgs.ptcpdump # Better alternative to traceroute + + # Monitoring + pkgs.speedtest-cli ]; } diff --git a/home/tools/sys.nix b/home/tools/sys.nix index c721b37..762b88d 100644 --- a/home/tools/sys.nix +++ b/home/tools/sys.nix @@ -1,7 +1,21 @@ { pkgs, ... }: { home.packages = [ + # Standard UNIX tools pkgs.coreutils-full + + # System management (local & remote) + pkgs.util-linux + pkgs.openssh + + # System monitoring pkgs.htop + pkgs.inxi + pkgs.lshw + pkgs.pstree + + # Shells + pkgs.bash + pkgs.fish ]; } diff --git a/home/tools/virt.nix b/home/tools/virt.nix index 2a9f4e3..7245f67 100644 --- a/home/tools/virt.nix +++ b/home/tools/virt.nix @@ -1,5 +1,15 @@ { pkgs, ... }: { home.packages = [ + # docker + pkgs.docker + pkgs.docker-compose + + # container + pkgs.podman + pkgs.podman-compose + + # container dev + pkgs.kind ]; } diff --git a/home/tools/web.nix b/home/tools/web.nix index 8e7b9ad..99fd927 100644 --- a/home/tools/web.nix +++ b/home/tools/web.nix @@ -1,6 +1,11 @@ { pkgs, ... }: { home.packages = [ + # Browsers pkgs.brave + + # CLI clients + pkgs.curl + pkgs.httpie ]; } From 37243a1370b689c9b49a937e8c42f2170212ab78 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 17 Jul 2026 00:34:01 +0200 Subject: [PATCH 097/184] Install language packages for thunderbird --- home/tools/desktop.nix | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/home/tools/desktop.nix b/home/tools/desktop.nix index bda9a0a..197e695 100644 --- a/home/tools/desktop.nix +++ b/home/tools/desktop.nix @@ -5,9 +5,6 @@ pkgs.wl-clipboard pkgs.kitty - # Email - pkgs.thunderbird - # Encryption pkgs.veracrypt @@ -20,4 +17,14 @@ # HTTP client pkgs.postman ]; + + programs = { + thunderbird = { + enable = true; + languagePacks = [ + "en-US" + "de" + ]; + }; + }; } From c4c35748ac89e79f6b1f9170f76dbd9155910437 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 17 Jul 2026 01:15:19 +0200 Subject: [PATCH 098/184] Add docker daemon setup --- system/core/users.nix | 1 + system/default.nix | 2 ++ system/virtualisation/default.nix | 5 +++++ system/virtualisation/docker.nix | 17 +++++++++++++++++ 4 files changed, 25 insertions(+) create mode 100644 system/virtualisation/default.nix create mode 100644 system/virtualisation/docker.nix diff --git a/system/core/users.nix b/system/core/users.nix index a62ccb6..cdf2da6 100644 --- a/system/core/users.nix +++ b/system/core/users.nix @@ -8,6 +8,7 @@ shell = pkgs.fish; extraGroups = [ "wheel" # sudo make me a sandwich + "docker" # run docker commands without sudo ]; }; diff --git a/system/default.nix b/system/default.nix index a15e58f..abce26e 100644 --- a/system/default.nix +++ b/system/default.nix @@ -9,6 +9,8 @@ let ./network ./network/avahi.nix + ./virtualisation + ./programs ./services diff --git a/system/virtualisation/default.nix b/system/virtualisation/default.nix new file mode 100644 index 0000000..9045632 --- /dev/null +++ b/system/virtualisation/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./docker.nix + ]; +} diff --git a/system/virtualisation/docker.nix b/system/virtualisation/docker.nix new file mode 100644 index 0000000..cf8f6be --- /dev/null +++ b/system/virtualisation/docker.nix @@ -0,0 +1,17 @@ +{ ... }: +{ + virtualisation.docker = { + enable = true; + + # Needed for having `--restart=always` flag working. + # Otherwise, systemd will only start docker on demand upon socket + # activation. + enableOnBoot = true; + + autoPrune = { + enable = true; + persistent = true; + dates = "weekly"; + }; + }; +} From 2bce94185dba77d6bac1358367b1ea1646183759 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 17 Jul 2026 19:09:36 +0200 Subject: [PATCH 099/184] Add podman setup --- system/virtualisation/default.nix | 1 + system/virtualisation/podman.nix | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+) create mode 100644 system/virtualisation/podman.nix diff --git a/system/virtualisation/default.nix b/system/virtualisation/default.nix index 9045632..f768e96 100644 --- a/system/virtualisation/default.nix +++ b/system/virtualisation/default.nix @@ -1,5 +1,6 @@ { imports = [ ./docker.nix + ./podman.nix ]; } diff --git a/system/virtualisation/podman.nix b/system/virtualisation/podman.nix new file mode 100644 index 0000000..70b7be2 --- /dev/null +++ b/system/virtualisation/podman.nix @@ -0,0 +1,22 @@ +{ ... }: +{ + virtualisation.podman = { + enable = true; + + # Avoid conflicts with docker + dockerCompat = false; + dockerSocket.enable = false; + + autoPrune = { + enable = true; + dates = "weekly"; + }; + + defaultNetwork = { + settings = { + # Allow container-to-container DNS resolution + dns_enabled = true; + }; + }; + }; +} From 55684bce3d89c7ac0ae64bbacc1ef2f0ee711e1a Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 17 Jul 2026 19:58:35 +0200 Subject: [PATCH 100/184] Add support for nixos-container --- system/virtualisation/containers.nix | 10 ++++++++++ system/virtualisation/default.nix | 1 + 2 files changed, 11 insertions(+) create mode 100644 system/virtualisation/containers.nix diff --git a/system/virtualisation/containers.nix b/system/virtualisation/containers.nix new file mode 100644 index 0000000..950544e --- /dev/null +++ b/system/virtualisation/containers.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.nixos-container + ]; + + virtualisation.containers = { + enable = true; + }; +} diff --git a/system/virtualisation/default.nix b/system/virtualisation/default.nix index f768e96..0338bb7 100644 --- a/system/virtualisation/default.nix +++ b/system/virtualisation/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./containers.nix ./docker.nix ./podman.nix ]; From 321ef8b3f286a9e60e401d1a56d5ecc1d953fc4d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 18 Jul 2026 00:27:55 +0200 Subject: [PATCH 101/184] Add some misc packages --- home/tools/misc.nix | 2 ++ 1 file changed, 2 insertions(+) diff --git a/home/tools/misc.nix b/home/tools/misc.nix index e8db2f8..cc413d3 100644 --- a/home/tools/misc.nix +++ b/home/tools/misc.nix @@ -1,9 +1,11 @@ { pkgs, ... }: { home.packages = [ + pkgs.cowsay pkgs.fastfetch pkgs.fortune pkgs.gitlogue + pkgs.lolcat pkgs.pwgen ]; } From b20f1cc15d654102da17d3270a23d1ab1532ac34 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 18 Jul 2026 02:01:28 +0200 Subject: [PATCH 102/184] Re-organise pkgs and remove unnecessary `home.packages` imports --- home/hyprland/clipboard.nix | 1 + home/hyprland/dunst.nix | 1 - home/hyprland/hypridle.nix | 37 ++++++++++++++++------------- home/hyprland/hyprland.nix | 11 --------- home/hyprland/hyprlock.nix | 5 ---- home/hyprland/hyprpaper/default.nix | 4 ---- home/hyprland/hyprpolkitagent.nix | 5 ---- home/hyprland/rofi.nix | 5 ---- home/hyprland/waybar/default.nix | 37 +++++++++++++---------------- home/tmux/default.nix | 4 ---- home/tools/fs.nix | 2 ++ hosts/nixos-btw/home.nix | 7 +----- 12 files changed, 41 insertions(+), 78 deletions(-) diff --git a/home/hyprland/clipboard.nix b/home/hyprland/clipboard.nix index 909d5f5..331f371 100644 --- a/home/hyprland/clipboard.nix +++ b/home/hyprland/clipboard.nix @@ -2,6 +2,7 @@ { home.packages = [ pkgs.cliphist + pkgs.wl-clipboard ]; services.cliphist = { diff --git a/home/hyprland/dunst.nix b/home/hyprland/dunst.nix index 40f9fd5..8b70081 100644 --- a/home/hyprland/dunst.nix +++ b/home/hyprland/dunst.nix @@ -1,4 +1,3 @@ -{ pkgs, ... }: { services.dunst = { enable = true; diff --git a/home/hyprland/hypridle.nix b/home/hyprland/hypridle.nix index 1aa9e38..8060e8f 100644 --- a/home/hyprland/hypridle.nix +++ b/home/hyprland/hypridle.nix @@ -1,21 +1,24 @@ -{ pkgs, ... }: +{ lib, pkgs, ... }: +let + pidof = "${lib.getBin pkgs.procps}/bin/pidof"; + hyprlock = "${lib.getExe pkgs.hyprlock}"; + loginctl = "${lib.getBin pkgs.systemd}/bin/loginctl"; + hyprctl = "${lib.getBin pkgs.hyprland}/bin/hyprctl"; + brightnessctl = "${lib.getExe pkgs.brightnessctl}"; + systemctl = "${lib.getBin pkgs.systemd}/bin/systemctl"; +in { - home.packages = [ - pkgs.brightnessctl - pkgs.hypridle - ]; - services.hypridle = { enable = true; settings = { general = { # Avoid starting multiple hyprlock instances. - lock_cmd = "pidof hyprlock || hyprlock"; + lock_cmd = "${pidof} ${hyprlock} || ${hyprlock}"; # Lock before suspend. - before_sleep_cmd = "loginctl lock-session"; + before_sleep_cmd = "${loginctl} lock-session"; # To avoid having to press a key twice to turn on the display. - after_sleep_cmd = "hyprctl dispatch dpms on"; + after_sleep_cmd = "${hyprctl} dispatch dpms on"; }; listener = [ @@ -23,37 +26,37 @@ # Dim screen timeout = 150; # Set monitor backlight to minimum, avoid 0 on OLED monitor. - on-timeout = "brightnessctl -s set 10"; + on-timeout = "${brightnessctl} -s set 10"; # Monitor backlight restore. - on-resume = "brightnessctl -r"; + on-resume = "${brightnessctl} -r"; } { # Turn off keyboard backlight. timeout = 150; # Turn off keyboard backlight. - on-timeout = "brightnessctl -sd chromeos::kbd_backlight set 1"; + on-timeout = "${brightnessctl} -sd chromeos::kbd_backlight set 1"; # Turn on keyboard backlight. - on-resume = "brightnessctl -rd chromeos::kbd_backlight"; + on-resume = "${brightnessctl} -rd chromeos::kbd_backlight"; } { # Lock screen timeout = 300; # Lock screen when timeout has passe - on-timeout = "loginctl lock-session"; + on-timeout = "${loginctl} lock-session"; } { # Turn off screen timeout = 450; # Screen off when timeout has passed - on-timeout = "hyprctl dispatch dpms off"; + on-timeout = "${hyprctl} dispatch dpms off"; # Screen on when activity is detected after timeout has fired. - on-resume = "hyprctl dispatch dpms on && brightnessctl -r"; + on-resume = "${hyprctl} dispatch dpms on && brightnessctl -r"; } { # Suspend the machine timeout = 600; # Suspend pc - on-timeout = "systemctl suspend"; + on-timeout = "${systemctl} suspend"; } ]; }; diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index ff58293..c0bf654 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -1,16 +1,5 @@ { lib, pkgs, ... }: { - home.packages = [ - pkgs.hyprshutdown - pkgs.coreutils-full - pkgs.kitty - pkgs.pcmanfm - pkgs.rofi - pkgs.yazi - pkgs.playerctl - pkgs.grimblast - ]; - wayland.windowManager.hyprland = let # Mod key diff --git a/home/hyprland/hyprlock.nix b/home/hyprland/hyprlock.nix index e1e873b..becd163 100644 --- a/home/hyprland/hyprlock.nix +++ b/home/hyprland/hyprlock.nix @@ -1,9 +1,4 @@ -{ pkgs, ... }: { - home.packages = [ - pkgs.hyprlock - ]; - programs.hyprlock = { enable = true; settings = diff --git a/home/hyprland/hyprpaper/default.nix b/home/hyprland/hyprpaper/default.nix index 276d36f..d4404d8 100644 --- a/home/hyprland/hyprpaper/default.nix +++ b/home/hyprland/hyprpaper/default.nix @@ -1,9 +1,5 @@ { pkgs, ... }: { - home.packages = [ - pkgs.hyprpaper - ]; - services.hyprpaper = { enable = true; settings = { diff --git a/home/hyprland/hyprpolkitagent.nix b/home/hyprland/hyprpolkitagent.nix index dc3d597..79f55e0 100644 --- a/home/hyprland/hyprpolkitagent.nix +++ b/home/hyprland/hyprpolkitagent.nix @@ -1,9 +1,4 @@ -{ pkgs, ... }: { - home.packages = [ - pkgs.hyprpolkitagent - ]; - services.hyprpolkitagent = { enable = true; }; diff --git a/home/hyprland/rofi.nix b/home/hyprland/rofi.nix index 3e23c92..0ed896b 100644 --- a/home/hyprland/rofi.nix +++ b/home/hyprland/rofi.nix @@ -1,9 +1,4 @@ -{ pkgs, ... }: { - home.packages = [ - pkgs.rofi - ]; - programs.rofi = { enable = true; theme = "sidebar"; diff --git a/home/hyprland/waybar/default.nix b/home/hyprland/waybar/default.nix index 42dd491..f908503 100644 --- a/home/hyprland/waybar/default.nix +++ b/home/hyprland/waybar/default.nix @@ -1,15 +1,12 @@ +{ pkgs, lib, ... }: +let + hyprctl = "${lib.getBin pkgs.hyprland}/bin/hyprctl"; + hyprpwcenter = "${lib.getExe pkgs.hyprpwcenter}"; + loginctl = "${lib.getBin pkgs.systemd}/bin/loginctl"; + systemctl = "${lib.getBin pkgs.systemd}/bin/systemctl"; + uwsm = "${lib.getExe pkgs.uwsm}"; +in { - self, - pkgs, - lib, - ... -}: -{ - home.packages = [ - pkgs.waybar - pkgs.hyprpwcenter - ]; - programs.waybar = { enable = true; systemd.enable = true; @@ -105,11 +102,11 @@ menu = "on-click"; menu-file = ./power-menu.xml; menu-actions = { - lock = "${lib.getBin pkgs.systemd}/bin/loginctl lock-session"; - logout = "${lib.getExe pkgs.uwsm} stop"; - reboot = "${lib.getBin pkgs.systemd}/bin/systemctl reboot"; - shutdown = "${lib.getBin pkgs.systemd}/bin/systemctl poweroff"; - suspend = "${lib.getBin pkgs.systemd}/bin/systemctl suspend"; + lock = "${loginctl} lock-session"; + logout = "${uwsm} stop"; + reboot = "${systemctl} reboot"; + shutdown = "${systemctl} poweroff"; + suspend = "${systemctl} suspend"; }; }; "custom/vpn" = { @@ -243,9 +240,9 @@ format-en = "en"; format-de = "de"; keyboard-name = "at-translated-set-2-keyboard"; - on-click = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; - on-scroll-up = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard next"; - on-scroll-down = "${lib.getBin pkgs.hyprland}/bin/hyprctl switchxkblayout at-translated-set-2-keyboard prev"; + on-click = "${hyprctl} switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-up = "${hyprctl} switchxkblayout at-translated-set-2-keyboard next"; + on-scroll-down = "${hyprctl} switchxkblayout at-translated-set-2-keyboard prev"; }; "hyprland/workspaces" = { @@ -400,7 +397,7 @@ on-scroll-up = "${sound} \"volume\" \"+5%\""; on-scroll-down = "${sound} \"volume\" \"-5%\""; on-click = "${sound} \"mute\" \"toggle\""; - on-click-middle = "${lib.getExe pkgs.hyprpwcenter}"; + on-click-middle = "${hyprpwcenter}"; scroll-step = 5; max-volume = 100; tooltip = true; diff --git a/home/tmux/default.nix b/home/tmux/default.nix index 6a88261..8873ecb 100644 --- a/home/tmux/default.nix +++ b/home/tmux/default.nix @@ -4,10 +4,6 @@ ./tmuxinator ]; - home.packages = [ - pkgs.wl-clipboard - ]; - programs.tmux = { enable = true; sensibleOnTop = true; diff --git a/home/tools/fs.nix b/home/tools/fs.nix index b7abba2..310e2a6 100644 --- a/home/tools/fs.nix +++ b/home/tools/fs.nix @@ -9,6 +9,8 @@ pkgs.zstd # Inspect + pkgs.pcmanfm + pkgs.yazi pkgs.bat pkgs.file pkgs.less diff --git a/hosts/nixos-btw/home.nix b/hosts/nixos-btw/home.nix index d87d274..05811f6 100644 --- a/hosts/nixos-btw/home.nix +++ b/hosts/nixos-btw/home.nix @@ -1,9 +1,4 @@ -{ - config, - pkgs, - inputs, - ... -}: +{ inputs, ... }: { # Home Manager needs a bit of information about you and the # paths it should manage. From f68c2994508815e4ee087ab964f7b4af84c30aef Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 18 Jul 2026 02:11:17 +0200 Subject: [PATCH 103/184] Require dbus broker --- system/services/dbus.nix | 7 +++++++ system/services/default.nix | 1 + 2 files changed, 8 insertions(+) create mode 100644 system/services/dbus.nix diff --git a/system/services/dbus.nix b/system/services/dbus.nix new file mode 100644 index 0000000..011b7d6 --- /dev/null +++ b/system/services/dbus.nix @@ -0,0 +1,7 @@ +{ + services = { + dbus = { + implementation = "broker"; + }; + }; +} diff --git a/system/services/default.nix b/system/services/default.nix index d393437..9a9d1f5 100644 --- a/system/services/default.nix +++ b/system/services/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./dbus.nix ./greetd.nix ]; } From 0ca028991a3a8a2445b7dad274be6c5c8652e970 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 18 Jul 2026 02:14:26 +0200 Subject: [PATCH 104/184] Update flake --- flake.lock | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/flake.lock b/flake.lock index 619a6fa..1ee5110 100644 --- a/flake.lock +++ b/flake.lock @@ -26,11 +26,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1778716662, - "narHash": "sha256-m1Yf0wZ8j1OHjTc2UwHwyQRSnNeSgLJOd7q5Y45hzi4=", + "lastModified": 1782949081, + "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "f7c1a2d347e4c52d5fb8d10cb4d94b5884e546fb", + "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", "type": "github" }, "original": { @@ -67,11 +67,11 @@ ] }, "locked": { - "lastModified": 1779726825, - "narHash": "sha256-RUkMrREjKDQrA+dA9+xZviGAxM5W1aVdyOr/bSYpHrE=", + "lastModified": 1783740085, + "narHash": "sha256-qajyHfZY29G2oEQk+uHxmsJcRoBUBXP9maTpFlwP/dI=", "owner": "nix-community", "repo": "home-manager", - "rev": "b179bde238977f7d4454fc770b1a727eaf55111c", + "rev": "3cd22efe6471dc7365c822bd9ad73a21e55f38fb", "type": "github" }, "original": { @@ -83,11 +83,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1780203844, - "narHash": "sha256-K5sT4jTpGs15ADhviMKNBH38REpPf5Q6mM1+N6cArVE=", + "lastModified": 1784280462, + "narHash": "sha256-DtoqIqM7VkR6NxAkcLpMwmi02USwWb3JdmNGLyhthc0=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "b51242d7d43689db2f3be91bd05d5b24fbb469c4", + "rev": "293d6abedf0478e681a4dfcfcb35b30fc796a32f", "type": "github" }, "original": { @@ -99,11 +99,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1777168982, - "narHash": "sha256-GOkGPcboWE9BmGCRMLX3worL4EMnsnG8MyKmXNeYuhQ=", + "lastModified": 1782614948, + "narHash": "sha256-ePjCwr1sNm9NYUqywL7QfK3JnlS015msC+eBu2zKlp8=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "f5901329dade4a6ea039af1433fb087bd9c1fe14", + "rev": "db3f255737b94216eb71cce308e2912cf6bc2d7c", "type": "github" }, "original": { @@ -135,11 +135,11 @@ "systems": "systems" }, "locked": { - "lastModified": 1781713927, - "narHash": "sha256-U18jyPH/pIx/YZlGv3FbcFw95NRFjQv4aDjlvxhUxNY=", + "lastModified": 1782919967, + "narHash": "sha256-pRwjfB5HQJ3m8J8bOR43pPHtHI7VUJSqwLA3P06cOY0=", "owner": "nix-community", "repo": "nixvim", - "rev": "110376ed06939ee0ccbcfce11e748064c00e666d", + "rev": "667c8471f4a0fb24d702d1a61af8609f1a5f1ba6", "type": "github" }, "original": { From 791c0eb8d989ce34a1a6914aa3af61e46882e627 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 18 Jul 2026 13:27:39 +0200 Subject: [PATCH 105/184] Add secret management tools --- home/tools/crypto.nix | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/home/tools/crypto.nix b/home/tools/crypto.nix index 60e258e..6116155 100644 --- a/home/tools/crypto.nix +++ b/home/tools/crypto.nix @@ -8,5 +8,11 @@ pkgs.certigo pkgs.testssl pkgs.mkcert + + # Secret management + pkgs.age + pkgs.keepassxc + pkgs.lastpass-cli + pkgs.sops ]; } From 40ae819bbd1250f971f1de10df528bad845a5b35 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 21 Jul 2026 00:12:29 +0200 Subject: [PATCH 106/184] Add vulnix --- home/tools/default.nix | 1 + home/tools/security.nix | 7 +++++++ 2 files changed, 8 insertions(+) create mode 100644 home/tools/security.nix diff --git a/home/tools/default.nix b/home/tools/default.nix index de54ff9..7f0dc6f 100644 --- a/home/tools/default.nix +++ b/home/tools/default.nix @@ -6,6 +6,7 @@ ./k8s.nix ./misc.nix ./network.nix + ./security.nix ./sys.nix ./virt.nix ./web.nix diff --git a/home/tools/security.nix b/home/tools/security.nix new file mode 100644 index 0000000..ebb8bdd --- /dev/null +++ b/home/tools/security.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + home.packages = [ + # General + pkgs.vulnix + ]; +} From a880fea3be81f19fe764608fe8b434700fd9edb1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 21 Jul 2026 03:51:09 +0200 Subject: [PATCH 107/184] Rename for scoping to QEMU setup --- hosts/default.nix | 4 ++-- hosts/{nixos-btw => qemu-nixos-btw}/default.nix | 2 +- hosts/{nixos-btw => qemu-nixos-btw}/disko.nix | 7 +++---- .../hardware-configuration.nix | 0 hosts/{nixos-btw => qemu-nixos-btw}/home.nix | 0 5 files changed, 6 insertions(+), 7 deletions(-) rename hosts/{nixos-btw => qemu-nixos-btw}/default.nix (88%) rename hosts/{nixos-btw => qemu-nixos-btw}/disko.nix (88%) rename hosts/{nixos-btw => qemu-nixos-btw}/hardware-configuration.nix (100%) rename hosts/{nixos-btw => qemu-nixos-btw}/home.nix (100%) diff --git a/hosts/default.nix b/hosts/default.nix index b1fec55..7fce33c 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -8,11 +8,11 @@ specialArgs = { inherit inputs self; }; in { - nixos-btw = inputs.nixpkgs.lib.nixosSystem { + qemu-nixos-btw = inputs.nixpkgs.lib.nixosSystem { inherit specialArgs; modules = laptop ++ [ - ./nixos-btw + ./qemu-nixos-btw inputs.disko.nixosModules.disko inputs.home-manager.nixosModules.home-manager ]; diff --git a/hosts/nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix similarity index 88% rename from hosts/nixos-btw/default.nix rename to hosts/qemu-nixos-btw/default.nix index 32b1687..2634d73 100644 --- a/hosts/nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -16,7 +16,7 @@ users.rtucek = ./home.nix; }; - networking.hostName = "nixos-btw"; + networking.hostName = "qemu-nixos-btw"; security.pam.services.hyprlock = { enable = true; diff --git a/hosts/nixos-btw/disko.nix b/hosts/qemu-nixos-btw/disko.nix similarity index 88% rename from hosts/nixos-btw/disko.nix rename to hosts/qemu-nixos-btw/disko.nix index 3f2ffde..90d636f 100644 --- a/hosts/nixos-btw/disko.nix +++ b/hosts/qemu-nixos-btw/disko.nix @@ -2,8 +2,7 @@ disko.devices = { disk = { main = { - # When using disko-install, we will overwrite this value from the commandline - device = "/dev/disk/by-id/some-disk-id"; + device = "/dev/nvme0n1"; type = "disk"; content = { type = "gpt"; @@ -41,7 +40,7 @@ type = "lvm_vg"; lvs = { lv_root = { - size = "30%VG"; + size = "33%VG"; content = { type = "filesystem"; format = "ext4"; @@ -52,7 +51,7 @@ }; }; lv_home = { - size = "30%VG"; + size = "33%VG"; content = { type = "filesystem"; format = "ext4"; diff --git a/hosts/nixos-btw/hardware-configuration.nix b/hosts/qemu-nixos-btw/hardware-configuration.nix similarity index 100% rename from hosts/nixos-btw/hardware-configuration.nix rename to hosts/qemu-nixos-btw/hardware-configuration.nix diff --git a/hosts/nixos-btw/home.nix b/hosts/qemu-nixos-btw/home.nix similarity index 100% rename from hosts/nixos-btw/home.nix rename to hosts/qemu-nixos-btw/home.nix From 5e16724964a4392c3eee8432ff6ab4a2c93dd1fa Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 21 Jul 2026 20:18:22 +0200 Subject: [PATCH 108/184] Add sops-nix flake --- flake.lock | 23 ++++++++++++++++++++++- flake.nix | 5 +++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/flake.lock b/flake.lock index 1ee5110..1bce779 100644 --- a/flake.lock +++ b/flake.lock @@ -155,7 +155,28 @@ "flake-parts": "flake-parts", "home-manager": "home-manager", "nixpkgs": "nixpkgs", - "nixvim": "nixvim" + "nixvim": "nixvim", + "sops-nix": "sops-nix" + } + }, + "sops-nix": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1783174389, + "narHash": "sha256-aCWC8ngycU7OdJrU2+Je3qf+1a2ykuBvpPhZT/9tXMc=", + "owner": "Mic92", + "repo": "sops-nix", + "rev": "f1406619a3884cd5c47992a70b8b35c9c0fcb4c9", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "sops-nix", + "type": "github" } }, "systems": { diff --git a/flake.nix b/flake.nix index b7e564c..c6ce9ad 100644 --- a/flake.nix +++ b/flake.nix @@ -16,6 +16,11 @@ url = "github:nix-community/home-manager/release-26.05"; inputs.nixpkgs.follows = "nixpkgs"; }; + + sops-nix = { + url = "github:Mic92/sops-nix"; + inputs.nixpkgs.follows = "nixpkgs"; + }; }; outputs = From fb9d9f4ef57d75eec8166166008019172a227449 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 21 Jul 2026 20:20:10 +0200 Subject: [PATCH 109/184] Add xdg --- home/default.nix | 1 + home/xdg/default.nix | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 home/xdg/default.nix diff --git a/home/default.nix b/home/default.nix index f41086a..5f24487 100644 --- a/home/default.nix +++ b/home/default.nix @@ -7,5 +7,6 @@ ./neovim ./tmux ./tools + ./xdg ]; } diff --git a/home/xdg/default.nix b/home/xdg/default.nix new file mode 100644 index 0000000..56b2cd7 --- /dev/null +++ b/home/xdg/default.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + xdg = { + enable = true; + + userDirs = { + createDirectories = true; + }; + }; +} From e652b95976089cdb9ff6d9ef9e68b7c6492a5d76 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 21 Jul 2026 20:21:31 +0200 Subject: [PATCH 110/184] Add .sops.yaml file with public keys --- .sops.yaml | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 .sops.yaml diff --git a/.sops.yaml b/.sops.yaml new file mode 100644 index 0000000..ab5b4ed --- /dev/null +++ b/.sops.yaml @@ -0,0 +1,7 @@ +creation_rules: + - key_groups: + - pgp: + - "0x416CF1EF9AAF90BC" + age: + - | + age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk From 7c564447b586dc507c9cb80415b674fc81dc74c4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 21 Jul 2026 20:36:22 +0200 Subject: [PATCH 111/184] nixos-anywhere: adjust `disko.main.device` `disko.main.device` needs to be configurable, since the disk may have a different ID. --- hosts/qemu-nixos-btw/disko.nix | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/hosts/qemu-nixos-btw/disko.nix b/hosts/qemu-nixos-btw/disko.nix index 90d636f..3a347e7 100644 --- a/hosts/qemu-nixos-btw/disko.nix +++ b/hosts/qemu-nixos-btw/disko.nix @@ -1,8 +1,9 @@ +{ lib, ... }: { disko.devices = { disk = { main = { - device = "/dev/nvme0n1"; + device = lib.mkDefault "/dev/nvme0n1"; type = "disk"; content = { type = "gpt"; @@ -17,18 +18,31 @@ mountOptions = [ "umask=0077" ]; }; }; + luks = { size = "100%"; content = { type = "luks"; name = "volgroup0"; - extraOpenArgs = [ ]; - settings = { }; - additionalKeyFiles = [ ]; + # To be provided via nisos-anywhere. + # e.g. via... + # + # ``` + # nix run github:numtide/nixos-anywhere -- \ + # --disk-encryption-keys /tmp/disk.key <(echo -n "MyFullDiskPassword123#") \ + # --flake .#qemu-nixos-btw \ + # user@host + # ``` + passwordFile = "/tmp/disk.key"; + settings = { + allowDiscards = true; + }; content = { type = "lvm_pv"; vg = "volgroup0"; }; + # additionalKeyFiles = [ ]; + # extraOpenArgs = [ ]; }; }; }; @@ -50,6 +64,7 @@ ]; }; }; + lv_home = { size = "33%VG"; content = { From 76bda30bdcfc772c2b2b93a21c09506562d8c597 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 22 Jul 2026 02:22:20 +0200 Subject: [PATCH 112/184] nixos-anywhere + sops-nix: allow initial deployment --- hosts/default.nix | 1 + secrets/users/rtucek.yaml | 70 ++++++++++++++++++++++++++++++++ system/core/security/default.nix | 1 + system/core/security/sops.nix | 14 +++++++ system/core/users.nix | 4 +- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 secrets/users/rtucek.yaml create mode 100644 system/core/security/sops.nix diff --git a/hosts/default.nix b/hosts/default.nix index 7fce33c..e28da2a 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -15,6 +15,7 @@ ./qemu-nixos-btw inputs.disko.nixosModules.disko inputs.home-manager.nixosModules.home-manager + inputs.sops-nix.nixosModules.sops ]; }; }; diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml new file mode 100644 index 0000000..e1f19dc --- /dev/null +++ b/secrets/users/rtucek.yaml @@ -0,0 +1,70 @@ +#ENC[AES256_GCM,data:QD60jviicqMzaDhFfKxKv+D+gsTH2eyIYEb+02Yeipf7MFesLyiR3toGRAen5P97wg==,iv:J/cr1UdRHGEkARsy9LiFFdHxZoI/NnM/I6yaExCObFQ=,tag:VmOL67SoU9JE3C8aT8ppLg==,type:comment] +initial_hashed_password: ENC[AES256_GCM,data:VfFPh19wuUhgF8Dvs/KT1Q6CDoCTaxLPeHUXfKFZNdfjClFZw0ks71sXLOozGvYfKUjkGav3yUMOtUCPlP2o0u5QdfH4kfukMg==,iv:NXm4xJIUBKG0V8SVdqpTBUVlk84dAp9HKyTTRNGWPVY=,tag:rQsyOtVbYtqUNbmiNzUG+w==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGIyZkQ1VUFW + RWFQSDJMMDhieDlxb2k0cEhjME9KYm95MGtMcjFHaFRZdHJOWnBZMi9JOUtNNjdC + eWtUZEZjMllsZ29YdDFMd0kxeDNhMVlselJ1UWEzbFc5NVZPcGpCZTd0VlFwV3BT + ZXFKRzRhaVdCeUVQM3JZK3VpbXNtSUJmU1M0SHlNSE1uN2hSVXRWYTV1Skk1UFZ6 + Mlk2NlVkV2V1MTBqdXlWY2dNL01Qb2xacUowUXUxMzJLeG9Wa0ZPU2RmRVdVaUJJ + TTJFUU5ZQktEdHNKY0xoeG40aWVXVTB5NXNDTmc2bTR4VFAvVGRQdkNMM0tGNUpV + S0R0M2haVW1LdFlLZVRiVHQwTkxHZEtqczdqT2drQmErNW53THlSR2E1THRITGhm + WGY5UFRBZkUxYUsyODJoRUt0emhRV2RmaTlnMHJmZmhwdmFlNko0a3BPb09YQnk1 + dUZpdUQ5d05XbWFlWjFxOFJFRE5QdkQrN3hNVEMrMGFjM1ZPR05RdVQ4NncwTTNE + RWdjenV5R2ZZaWlJMDk5UVIzVktQbG9Xb3R6UjM5VWNUT3dBN3hoZEtnaUp4REtC + WTZZd1V3d2xvSys0WXNBMU52ZWZWSHhQNERUS3J3QmdTeWc5ellKKytKNTg2akFQ + UWVkL1VXa1o0UkZ6MmFaUXBLM3djdGtkQ3pVMXJiQVJidXpMZVowc2lSYVhXRjkx + eXNYWEl2QW8xUGNUOENpUS8xTmI2bmpIZDNxTENxZk15cjdKTjIrM3dWV29Ka1By + WUs0UGNOR0x6QWxCbU9tdDl6bTZnVDJTb0RnQjA3S01ZVE9UY0xtL1VxM2hqckk1 + Smk1ejR4U1ZwT21EclhTUDM5bXNJajZEenF5WHJKSmdkRzhPR21wK3BTWkYwbTdJ + c1FMc1lVNzdCUGluRm9Ha21QckIwaHNQL2xabmo4cytnQWVvNTQ4T0pndWZEMVNU + T29EZVE5Y2VpNG50QWJ3d0NZRGp6SHB1Wlg3QVl5VzJGK0N2OUdYOExWS1VCWFVV + eFhoelU3R1BqaVE0Znpwckpod3c1N3YrQjhzUk5jd1lXSis1ODFidmJqS0F4Y1Jn + U3VtYk05QzlzNjVzTlRkZDFYMGVONkdRS1lLTGxER0VDaW0zcTl5ZWpyZVNYc0xt + dmlYTm80Y2txYzloTmNqeWtXanJ1ZjJjdGpvOEtRcjhmY1NHRWJueDhrck9teW11 + UmFta2d6d0s5dDQyQWdpb2hVUVpmTzRSTlZmTWhadUVZa2UxV1lzclF6eXN2Nmlp + d0l4aVU2VS8yWXZzSEdyVUVUcFRwZDhZdlJIMDlpblZiQlZJMWRKNnVVREQ5clFj + dFlVNitYUm1HbE5zTFZEbE56dlgwOS83TG5wTzBXdG11UGtWeUFBUDBwaHBMdk1B + WXR0eG5VNERuclJkZlNTYVhzVHNWQXRaU2hJNVdwYXpjOVVpYTRlNlgxSmZtZ3Rw + TXhkTFVFRVovclY3T3ZaZ0R0ZzZhTTNLMnhEMDBVSW5Va240SVVCOGxZRzhLQ0Nl + R3JyNHNHTlVnaEIxaER0QmZLdk1XS1dGbUR0TGV0SGhMN0xWVlZjMjlTdlpJY0xL + dmlsZ3NuT3k1RjVJdG5yU0FTcnlkVWwyTEptUnhwYzB1MVBtS1Q2cG9sQ2pIT0tU + Q0FVaEJXS2hURmRyTGRKeU1EbGdiSHZ1WDd6Skw4U0pNUEFHUDBZSTlWSEtuR0lT + dEw5N3Y4RXlUZ1ZTUkpWbVVjS2RGUk44czdta3RhenRLaEI3SjBhK3N4VExhWGda + bDZRNml2ZWZrbFkyaFlQNUplTThaRzBRUkJHUk9TVGtiZUFpajhKVUZnMkxFSE1S + VUhVa2lCdUY2RmJuU2Vpa0NFQzRwTU1WdTd0T24vS2J3MU9aUGhraHpwcFlZaWdw + YVYyVjlySjhSQUZSN3JZZUFGK0dvQ0ZUUXdCcjA4Y01XTWorVkVOTTBNcVVPUQpa + WjRiUGowMXB6cmNXYk16NXZUSTBYa2pUT1U2WGlmZW1HN1BnT0lQTmF3Ci0tLSBl + RkxINC82aFVQL0hjb2RNMFFzdkNpa0ZIb3hFTEdLSVJVZFBBYVAwalZjCn1sHdCu + zE2D12bJvcOFlJ5dztaCUZErrQPmg6mM/G9FT/L5nCG2gsVdKyHp+gEAayMMzCzU + MiO0vOkYr1J2Cl4= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + lastmodified: "2026-07-21T23:46:16Z" + mac: ENC[AES256_GCM,data:RntKKGahB6tuQfdyGz8mZyLKjGE62i02XjlUAeVPtLIKdQH2/7OHeMi6fALWWiuZ/Jk5WpsIC6Qn3hh3GzPriynOLYKKyuZS4sic+zv5sSk4DsHgj9HSsBRR2FFyNba1tOGv8s8NVexlOae/JqzdqttZ/LIlNZopiEKlhIvF35s=,iv:tWl+yJZxN3xu+/Vf4AU1knIKeibOSzqdWw5GDKptMRE=,tag:tTew+/cMw4FZsvrHkov2rA==,type:str] + pgp: + - created_at: "2026-07-20T00:53:31Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ//RxkimXCuc6dizxo+jlPY3u6AU3C659Sz5pVNlb5yu7j3 + 00+iS0eDCbjU8Sbw4twthXvj3atF+PxIabpydWVMlrHbiY8Cg7hZTYxSA5tTvo72 + JmEd36KVX1hwWxl0xocYI2EKb6tPegNFWoQfI0L1AwXaolNY+V9h+khKjrPK5212 + j9NbqVMT0/aidDyS7jH4pXQ91oWM9VyOFJG3cup2wfRCZCAi7YsaiRGqrC8B3rR5 + W3SeMq/qLIijPlVpf6ycnHD8QEm0mqZwcOqRz9ezwDhuIXhdqbgf42bzrtyYXdVd + hLFa3Dnsncu4vtgv4n9cUXYaYZ8qwAv1wRUxcZCkrwc4lCLKR9DfdH8OMh3dyYDD + 3S4+lvbyRry44a5aBK4afZLTWBZhVLbmP5zA4aGKANgzI3Y8WOmZT+jAf12peDtE + hTFI6FKTJ5PU63Vm9VKLXTTfmzXKEfNxXZSiSGt4KJcQuunRert/RuxK/qRAvYxi + IULVNBpynj8O0RDuNtSwuVxcxq0+G4vOgMviujQw+7c1EL2zNjLXTgzEXF6V4y10 + /AyJ2Vngyo9CT6KzQHRNqQOliHGXMoS5TU7B4f8a96XdItCSZVHcjGSO9t0UXRSF + I3PRXXHeHK5EFjiWRjw7g80lzZQ/eJVaqhae2tZ+n0mkoUCljHTXQuyRXRoadBHS + XgEcWTU2+UKCXXguCULzCFI0pBN+wMnTM3O+m79/79r5UlVF4QJ7Y158hUIuRrRt + Jsbc3bx21JDruv5DhplTxhxybCHpZFhK4XlpCuFTpHTYPJd5brEH1ervNOCSGNA= + =BgHQ + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + shamir_threshold: 1 + unencrypted_suffix: _unencrypted + version: 3.13.2 diff --git a/system/core/security/default.nix b/system/core/security/default.nix index d863949..ab844c5 100644 --- a/system/core/security/default.nix +++ b/system/core/security/default.nix @@ -2,6 +2,7 @@ { imports = [ ./firewall.nix + ./sops.nix ./ssh.nix ./sudo.nix ./sysctl.nix diff --git a/system/core/security/sops.nix b/system/core/security/sops.nix new file mode 100644 index 0000000..dd61213 --- /dev/null +++ b/system/core/security/sops.nix @@ -0,0 +1,14 @@ +{ + sops = { + log = [ + "keyImport" + "secretChanges" + ]; + defaultSopsFormat = "yaml"; + defaultSopsFile = ../../../secrets/users/rtucek.yaml; + age = { + keyFile = "/secrets/keys.txt"; + generateKey = false; + }; + }; +} diff --git a/system/core/users.nix b/system/core/users.nix index cdf2da6..f2ae90b 100644 --- a/system/core/users.nix +++ b/system/core/users.nix @@ -1,7 +1,9 @@ -{ pkgs, ... }: +{ config, pkgs, ... }: { + sops.secrets.initial_hashed_password.neededForUsers = true; users.users.rtucek = { isNormalUser = true; + hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" ]; From 0d9c19320931d407aefb96e4e5c9fce2ed7b7265 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 22 Jul 2026 03:45:51 +0200 Subject: [PATCH 113/184] Add nixos-anywhere install script + sops for disk encryption --- nixos-anywhere.sh | 23 +++++++++++ secrets/hosts/qemu-nixos-btw.yaml | 68 +++++++++++++++++++++++++++++++ secrets/users/rtucek.yaml | 9 ++-- 3 files changed, 96 insertions(+), 4 deletions(-) create mode 100755 nixos-anywhere.sh create mode 100644 secrets/hosts/qemu-nixos-btw.yaml diff --git a/nixos-anywhere.sh b/nixos-anywhere.sh new file mode 100755 index 0000000..2d34087 --- /dev/null +++ b/nixos-anywhere.sh @@ -0,0 +1,23 @@ +#!/usr/bin/env bash + +temp=$(mktemp -d) + +cleanup() { + rm -rf "$temp" +} +trap cleanup EXIT + +install -d -m700 "$temp/secrets" +sops decrypt \ + --extract '["age_key"]' \ + --output $temp/secrets/keys.txt \ + ./secrets/users/rtucek.yaml +chmod 600 "$temp/secrets/keys.txt" + +SSHPASS=nixos nix run github:nix-community/nixos-anywhere -- \ + --env-password \ + --extra-files "$temp" \ + --disk-encryption-keys /tmp/disk.key <(sops decrypt --extract '["luks_key"]' secrets/hosts/qemu-nixos-btw.yaml) \ + --generate-hardware-config nixos-generate-config ./hosts/qemu-nixos-btw/hardware-configuration.nix \ + --flake .#qemu-nixos-btw \ + --target-host nixos@qemu diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml new file mode 100644 index 0000000..1ba10ee --- /dev/null +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -0,0 +1,68 @@ +luks_key: ENC[AES256_GCM,data:pID6l7HMEWXvVSU1QIlOGvqeTEjkqRVpkbgrqw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:ZZc2BDsu7qdbTUXkMNT+9g==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDBCMjlXOXcz + VDNwWUtvUkhZTGlFRU55NEV1VUJlUUgvS0c4Ukw0ZUQ2OVk5aFFSdThMdWI5KzZC + UlJzeERQS1FrZnk3enVFdGpRZi9RSEJBYW5KTmR6VUZlcDlVU3JzU3A5K0dsZ3Js + MnkxNVlyNGxURHZpVzVIeEtCcFRxM3RJSWZIQ1pqeXg0cFhTK0JTZWhkNlpoRHE3 + Qk1VcUs4blBUYWd5SVdnaFpjbDhuaTNPUzlZS2dYdWZvYzdlMjlSWHdEWllmL09P + UVlrSk5vY3djTWV4eVh2Yk9XeFFyQnNTd3VWSE9SMG5WTUpGaFg1OTcreE5TM2Zp + WFl4M3l6d0RzNmxNbkpaUjF5YnBOR1FhWFZ4NUtjUjVhVnB0VmRJWjMwSUZDWHVG + aWdOcGRwb0FiRnFsUDhBMm9hZXZ5ZmFuVkNDUUxpdUVTSzd2UUQ1RXMrWnlyaW83 + eU96dkN4OGMycnMzZzdMcGM2TnVFTWM0VUpEcVl6V2tYRVA4RlBkSTVBM3FoV0xr + VG9ZUnFjRml5dTJCWWxQaCthZURybTRnYTJwTTViaXdKVnVpdjEvejR4Y2Z4WGw5 + N0hSOFRVbktLOEdZZmtRVzJpb0xUbTRPL1V3WEtvajYrVVkrbVpqS013UjdGV1Ji + L3N5ZWs4YW8rc0hIRE5ZMDlpdTFRalRQYXRBa2NFZ25DMW1uSkQ4SEVEOGxIK212 + dDRmbDg5aWRwQm40a05qUGo3VE55TEY1OXJyV0RwVmZqS1VYK29uQzNwYzVuS1h3 + WkNXWXM5VWoxT2pFZzh1Qi8vQ212Q1dSTUd5RDh3K1B3T1dqaG9VTysyK2VoVWxr + ZXFzUXEwTWlYazdRUGZjODUyTTgrbWk5KzhJcGFKR2Nyd3lhNGlIc2ptVytnbUEr + S2Z5U0FBbU91ZVByN3d0NjdubGRBM3VuL3FPUkF2YnlFSFZjcWZxVWNaZS9SYmMv + cXlZL3pMZWFoNVBDMVhBZDhkOEdORWV2V1JQTWNCTCsxVXhRVWJHdi9tZk5ETVlU + bDNER1NpdmdNNTdFT1A2U1ZtVzk4WXhrR25wVGNqb3EyUGdiV1NoYm40SGlVZ1U2 + ejgrczFocy8vRGxOSHpYWGZoU1IzRWJOYnZZeFpoUDdtdzdERWFxeGQ4NzdZb3Rp + VlJaNFo4Z0JXd3ZTRUZGVXpiMmdOS241WEVyNThvUDlPNlRYZzV2S3BCcnlmRUpw + eTM1RUpzUzROS1I2ME9ocUx0MmdmQTRrclVhVXgxS0U2a2pWeUNTVVFhaUQycUkr + MGYveUFaS0MwYURGUFhKZ3Z2NDFvcW43MmtmVnN6a0RsczlndGlhWk5adWhERkNW + enN4SmdKU1BEcHp6SWxvd25LcmwwdHpsRGlGc3ZIaVAxcHZHblJKYnRJTVg0Z0U0 + TldjK1dMZnlpTVkvVDFWbXdpWmk1VGxMV1RhdDlrYWpSdmVMakU5dk5veWFaWFI3 + dkZyK0QwbHp0RkR0MDZRN0txZkxpK0VsbXIxRktsNjFUSk51ZFlsSjI4MElLeitO + RDlNdGhsQlRQNWNoOTBJRkpzYlRscW04M2Q5K3NSV3RXSHVvMFhHM0paWDlId0sz + VTltS3NMaHZ4WWJaVDAyNkdpMkdMV2tuOHJYay9aeDZsaURBMmY2eUZWSi9mdExl + dTFRNThXb2YwcDBwY2FWVjFRKzh5VEZod3JUZmllQjBBVUZLUFZFOFpwdmp5N2ZJ + Z1hjODkzQ0tFSWk2WktoL0Vpd1FOUFkxTU5jYkN3ZjRJYi94VFBjZ0dNSnZFRGow + R0VWejdDMU9QaU1Mbi9YU3RlZUdvQkhtTnRhTFlSbWlZd0ZvaEJYMjVQdlJ1TE95 + cTU5bUJ2Mnlqay9ybVFkd2xUTFZuaTBLK0NRRWNVNndTelNqbG8wcnVKaHF1Tkl1 + YW1zRGJmWVZOTEx3bURWQ05XUGRiMEVWUENCVlZKUXA4S3dWVERld2xDb2FlZwph + bGpndEpuWlF0eExsTGova1VBeWhvQkNaMDZiSTZzQ3lWc0pZRW16eXVNCi0tLSBF + TVAyZDRObGRiNS92NDh1YjF4N3pWb09JQ1pPQVdKQktsUld0N3B1RnBZCtVfgEaU + Xdlm2QQdpdXn79PlVoFLifc19ALOxXeaDHVEe3Y28bT6EWm44M0y+Y/R+3caDrEl + 3pHNIzh3uEcf03I= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + lastmodified: "2026-07-22T01:23:48Z" + mac: ENC[AES256_GCM,data:xNnJfete+Rc+z0ptT8kwBSfOf5sEHUVZmnuy443ZWSW6lvHLAMYj6YJ8I5xA+NP32dK4SWj0h54fwZsX7P6cwok8+EovjdmZ9srLo2/MBVz/1Ifhdbn16YNZr5j3gdmzUEKuKNio1LMzGDYBW+KatgiyZWgC8DYcB/a3zpc/bGI=,iv:k/XwIjTf3SyowJ2s/+gu0L8O9Z0QrjuGMZtZpMGVB+c=,tag:ES7f9DutNksBsSAzpWYvtw==,type:str] + pgp: + - created_at: "2026-07-22T01:23:29Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ//QJtAyFX6Vj/nxmWLAAs/1p3sKHGYnKOe8tzvpcwYq5+s + OKy2zceoXCxkd62T+68SC9fU/8QbaRHGhuC2pDB5/Pd1V88efmCQqr2BVLtuh/OT + cBqDJQF5163EUnNaAn0hqhy+tdO/kztDVdF+LcQ89DI2z88kNgv7gviXBv/Ozzu7 + +H0bosT1vyZtHDYTXyyJke1/GGEywtzxT5qHUS0SCO69on3LCsQNCW1pi3BOYHYN + bJ41OOiO82UKCOkPgNztwSz+lzQahCq0vnxjE28E0UqEoUmu+nSvxCcUAgk2mMoN + HzMuxlMAbEMk6K2zLX3ImoKcXtoB1GoHau8lkm0B3iLgY3IxP0uIRUp/cDDY8eoe + Q1AK2rcZl0g9Afk9mG1Xajy86MlR4JYUhA2SbLA0/lOh1UxAdO7ZWRV7I2mGT4LK + aL918ORYSI6VnfMUtnn7oZSLWCMw1+jdjXQlxGsEftZpsDPVgHHm+QpEHTinLsG2 + dkjkwuuNN2rFqmDmVlQ2gZA16CwXOO1dz5uGBlwmidxq+iC5HU3hW+cSDfPmFaRK + 0+2Kg2lwbJ0yQibwnpHq0VKAhXRxQ81Ev0i4AmbkQJL5ngsFlL1FWXnpnvHonbCl + Qjv3fzlfAInpcJBvfEVbp9Er1o6zwj1Sp9E3nL7PS2QYDQbnYxJkGBqdsISZTdTS + XAH1lnB+worUc/zc+OXGpktpINnkU+ocOH0Wm4QQ7v+H8OaoAs88CUKeN06n63t4 + Z/cDuZtS9jFnz7gXBWKotqe5QCTeibmED3A6DpOtkxfqcGn9YFBpZmdPAy2m + =W7c9 + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.2 diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index e1f19dc..e50e206 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -1,5 +1,6 @@ -#ENC[AES256_GCM,data:QD60jviicqMzaDhFfKxKv+D+gsTH2eyIYEb+02Yeipf7MFesLyiR3toGRAen5P97wg==,iv:J/cr1UdRHGEkARsy9LiFFdHxZoI/NnM/I6yaExCObFQ=,tag:VmOL67SoU9JE3C8aT8ppLg==,type:comment] -initial_hashed_password: ENC[AES256_GCM,data:VfFPh19wuUhgF8Dvs/KT1Q6CDoCTaxLPeHUXfKFZNdfjClFZw0ks71sXLOozGvYfKUjkGav3yUMOtUCPlP2o0u5QdfH4kfukMg==,iv:NXm4xJIUBKG0V8SVdqpTBUVlk84dAp9HKyTTRNGWPVY=,tag:rQsyOtVbYtqUNbmiNzUG+w==,type:str] +#ENC[AES256_GCM,data:TLfSG2miNjgA/cHWDr1uimJ8Y16E1Fq7FNaRNGI/dMl5xoP3QZzApub/8oLEMwTaEws0KmSeS2uZgl3az/WApBGE1iFdZ5jxSaJO3vI=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:3Ppo8RejKoMkvTH+GPKOow==,type:comment] +initial_hashed_password: ENC[AES256_GCM,data:zTdUF8n2KqlRht8tQ+TfKNqXubd4jdUir/NlmMsviCy/i/V1gp1BsOGuc26GjIsBMwp/xo05eufzqeTnqtIpm+vtg5QXBqHxPQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:ltx+8jdMxndU+OHk8sHhWw==,type:str] +age_key: ENC[AES256_GCM,data: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,iv:d0XpAzzgrRruuFC0WHc6fBiTLApIAnKurU8qnx/r5Ws=,tag:uko1RYNvy01isxr/39/2ag==,type:str] sops: age: - enc: | @@ -42,8 +43,8 @@ sops: MiO0vOkYr1J2Cl4= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - lastmodified: "2026-07-21T23:46:16Z" - mac: ENC[AES256_GCM,data:RntKKGahB6tuQfdyGz8mZyLKjGE62i02XjlUAeVPtLIKdQH2/7OHeMi6fALWWiuZ/Jk5WpsIC6Qn3hh3GzPriynOLYKKyuZS4sic+zv5sSk4DsHgj9HSsBRR2FFyNba1tOGv8s8NVexlOae/JqzdqttZ/LIlNZopiEKlhIvF35s=,iv:tWl+yJZxN3xu+/Vf4AU1knIKeibOSzqdWw5GDKptMRE=,tag:tTew+/cMw4FZsvrHkov2rA==,type:str] + lastmodified: "2026-07-22T01:26:26Z" + mac: ENC[AES256_GCM,data:Y/2QZfDmY58CjFnROSARAjrqlkzwrAoPdQ61nQnmfRjL5oZTM3PBHNePCOXlJJq2uPr2ELF4htVe1jSMupO2OqEV65iysuOkL7p6KEuD1WTsAwQDR2RpZjeTldmP8QPpDJ8hOKZO5r3HIuKmx2fb+UBJcbfxYgFuNUWhAWQpwYI=,iv:gt5Sfc8e0Bn2/diQPwxVxcJ229Tfh0MWxPva/g4aEJo=,tag:oJTMtdf//0Kn2LhXOl0R/Q==,type:str] pgp: - created_at: "2026-07-20T00:53:31Z" enc: |- From bf6ba357ba3365e451c8524bedd13fd906c59d1d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 22 Jul 2026 04:11:30 +0200 Subject: [PATCH 114/184] Properly separate hosts vs user key --- hosts/qemu-nixos-btw/default.nix | 1 + secrets/hosts/qemu-nixos-btw.yaml | 5 +++-- secrets/users/rtucek.yaml | 5 ++--- system/core/security/sops.nix | 1 - system/core/users.nix | 6 +++++- 5 files changed, 11 insertions(+), 7 deletions(-) diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index 2634d73..787b4d9 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -17,6 +17,7 @@ }; networking.hostName = "qemu-nixos-btw"; + sops.defaultSopsFile = ../../secrets/hosts/qemu-nixos-btw.yaml; security.pam.services.hyprlock = { enable = true; diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml index 1ba10ee..6afde87 100644 --- a/secrets/hosts/qemu-nixos-btw.yaml +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -1,4 +1,5 @@ luks_key: ENC[AES256_GCM,data:pID6l7HMEWXvVSU1QIlOGvqeTEjkqRVpkbgrqw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:ZZc2BDsu7qdbTUXkMNT+9g==,type:str] +host_key: ENC[AES256_GCM,data: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,iv:C2FoWnEUgam2oS6+eQwaNSMJXtf1v6gxYVVus6NhEIM=,tag:kTCEtI57W0BX8OZ4rLX6ig==,type:str] sops: age: - enc: | @@ -41,8 +42,8 @@ sops: 3pHNIzh3uEcf03I= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - lastmodified: "2026-07-22T01:23:48Z" - mac: ENC[AES256_GCM,data:xNnJfete+Rc+z0ptT8kwBSfOf5sEHUVZmnuy443ZWSW6lvHLAMYj6YJ8I5xA+NP32dK4SWj0h54fwZsX7P6cwok8+EovjdmZ9srLo2/MBVz/1Ifhdbn16YNZr5j3gdmzUEKuKNio1LMzGDYBW+KatgiyZWgC8DYcB/a3zpc/bGI=,iv:k/XwIjTf3SyowJ2s/+gu0L8O9Z0QrjuGMZtZpMGVB+c=,tag:ES7f9DutNksBsSAzpWYvtw==,type:str] + lastmodified: "2026-07-22T02:00:19Z" + mac: ENC[AES256_GCM,data:LJxkDPmvPuAL0TWZLdDw/+OK3ZtYfK1PKT6f/6YaVv6Zs+cRIMUWWdzfHUsq5XwrnbGoCm61ux56QOxRNzJtg/gw0Ar74UnVwsCePUfk1tn/+kv+/Pk0i1ENs7nfx6HLSH0SmeXrSxC/3TJk3rz3kt95aKVhaYoX8RQ0Vuqsi1A=,iv:SQwDUk31K8vdRmyM5M+hn2UomX44Bt100yYPqG8Cj18=,tag:HL0zN7FCmjHJfcMIEiRxxQ==,type:str] pgp: - created_at: "2026-07-22T01:23:29Z" enc: |- diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index e50e206..f7a45e3 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -1,6 +1,5 @@ #ENC[AES256_GCM,data:TLfSG2miNjgA/cHWDr1uimJ8Y16E1Fq7FNaRNGI/dMl5xoP3QZzApub/8oLEMwTaEws0KmSeS2uZgl3az/WApBGE1iFdZ5jxSaJO3vI=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:3Ppo8RejKoMkvTH+GPKOow==,type:comment] initial_hashed_password: ENC[AES256_GCM,data:zTdUF8n2KqlRht8tQ+TfKNqXubd4jdUir/NlmMsviCy/i/V1gp1BsOGuc26GjIsBMwp/xo05eufzqeTnqtIpm+vtg5QXBqHxPQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:ltx+8jdMxndU+OHk8sHhWw==,type:str] -age_key: ENC[AES256_GCM,data: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,iv:d0XpAzzgrRruuFC0WHc6fBiTLApIAnKurU8qnx/r5Ws=,tag:uko1RYNvy01isxr/39/2ag==,type:str] sops: age: - enc: | @@ -43,8 +42,8 @@ sops: MiO0vOkYr1J2Cl4= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - lastmodified: "2026-07-22T01:26:26Z" - mac: ENC[AES256_GCM,data:Y/2QZfDmY58CjFnROSARAjrqlkzwrAoPdQ61nQnmfRjL5oZTM3PBHNePCOXlJJq2uPr2ELF4htVe1jSMupO2OqEV65iysuOkL7p6KEuD1WTsAwQDR2RpZjeTldmP8QPpDJ8hOKZO5r3HIuKmx2fb+UBJcbfxYgFuNUWhAWQpwYI=,iv:gt5Sfc8e0Bn2/diQPwxVxcJ229Tfh0MWxPva/g4aEJo=,tag:oJTMtdf//0Kn2LhXOl0R/Q==,type:str] + lastmodified: "2026-07-22T02:06:39Z" + mac: ENC[AES256_GCM,data:zzAXOpsHKLGz+xhho7pvI7VyUgx/jzMmYCEPbP2nW1KK3nU3xYlEp77Mwr4YoAt3/dcOQ3osi2BPuWJoeLlGMchupJ2wuv46YGHeBpSds12PUDQ4sUO5njLXF9rKz/dKswXGJNQSyYePExpWJQxWakecPNiZhlfnITNc05ICHzU=,iv:mMGFw1caHMETYRGnqf8yaPzH4/r1moOCotP/EETR2uE=,tag:GfCaqDCLPX6siRtvZbjfGg==,type:str] pgp: - created_at: "2026-07-20T00:53:31Z" enc: |- diff --git a/system/core/security/sops.nix b/system/core/security/sops.nix index dd61213..cc6900a 100644 --- a/system/core/security/sops.nix +++ b/system/core/security/sops.nix @@ -5,7 +5,6 @@ "secretChanges" ]; defaultSopsFormat = "yaml"; - defaultSopsFile = ../../../secrets/users/rtucek.yaml; age = { keyFile = "/secrets/keys.txt"; generateKey = false; diff --git a/system/core/users.nix b/system/core/users.nix index f2ae90b..622dd06 100644 --- a/system/core/users.nix +++ b/system/core/users.nix @@ -1,6 +1,10 @@ { config, pkgs, ... }: { - sops.secrets.initial_hashed_password.neededForUsers = true; + sops.secrets.initial_hashed_password = { + sopsFile = ../../secrets/users/rtucek.yaml; + neededForUsers = true; + }; + users.users.rtucek = { isNormalUser = true; hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; From 00f342d8bd204d75578bfa1af7267196ca2a6f36 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 22 Jul 2026 23:19:14 +0200 Subject: [PATCH 115/184] Add new key to config + refactor to yaml anchors & update keys --- .sops.yaml | 21 +++- nixos-anywhere.sh | 4 +- secrets/hosts/qemu-nixos-btw.yaml | 174 ++++++++++++++++++----------- secrets/users/rtucek.yaml | 177 ++++++++++++++++++------------ 4 files changed, 236 insertions(+), 140 deletions(-) diff --git a/.sops.yaml b/.sops.yaml index ab5b4ed..623f4bd 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -1,7 +1,22 @@ +keys: + hosts: + qemu-nixos-btw: &host_qemu-nixos-btw_age | + age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + + users: + rtucek: + user_rtucek_pgp_key_yubi_13364058: &user_rtucek_pgp_key_yubi_13364058 "0x416CF1EF9AAF90BC" + user_rtucek_age_identity: &user_rtucek_age_identity | + age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + creation_rules: - key_groups: - pgp: - - "0x416CF1EF9AAF90BC" + - *user_rtucek_pgp_key_yubi_13364058 age: - - | - age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - *user_rtucek_age_identity + - *host_qemu-nixos-btw_age + +stores: + yaml: + indent: 2 diff --git a/nixos-anywhere.sh b/nixos-anywhere.sh index 2d34087..9c89624 100755 --- a/nixos-anywhere.sh +++ b/nixos-anywhere.sh @@ -9,9 +9,9 @@ trap cleanup EXIT install -d -m700 "$temp/secrets" sops decrypt \ - --extract '["age_key"]' \ + --extract '["host_key"]' \ --output $temp/secrets/keys.txt \ - ./secrets/users/rtucek.yaml + secrets/hosts/qemu-nixos-btw.yaml chmod 600 "$temp/secrets/keys.txt" SSHPASS=nixos nix run github:nix-community/nixos-anywhere -- \ diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml index 6afde87..efc7c02 100644 --- a/secrets/hosts/qemu-nixos-btw.yaml +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -1,69 +1,109 @@ -luks_key: ENC[AES256_GCM,data:pID6l7HMEWXvVSU1QIlOGvqeTEjkqRVpkbgrqw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:ZZc2BDsu7qdbTUXkMNT+9g==,type:str] -host_key: ENC[AES256_GCM,data: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,iv:C2FoWnEUgam2oS6+eQwaNSMJXtf1v6gxYVVus6NhEIM=,tag:kTCEtI57W0BX8OZ4rLX6ig==,type:str] +luks_key: ENC[AES256_GCM,data:I8oAwXxG01kfz5MwyX6m6KcrTolMh9ud5qImPw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:EL++PD1BauC5RWOJRr48NA==,type:str] +host_key: ENC[AES256_GCM,data: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,iv:C2FoWnEUgam2oS6+eQwaNSMJXtf1v6gxYVVus6NhEIM=,tag:dJZ+LPF8Yro7Acilu2ScVQ==,type:str] sops: - age: - - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDBCMjlXOXcz - VDNwWUtvUkhZTGlFRU55NEV1VUJlUUgvS0c4Ukw0ZUQ2OVk5aFFSdThMdWI5KzZC - UlJzeERQS1FrZnk3enVFdGpRZi9RSEJBYW5KTmR6VUZlcDlVU3JzU3A5K0dsZ3Js - MnkxNVlyNGxURHZpVzVIeEtCcFRxM3RJSWZIQ1pqeXg0cFhTK0JTZWhkNlpoRHE3 - Qk1VcUs4blBUYWd5SVdnaFpjbDhuaTNPUzlZS2dYdWZvYzdlMjlSWHdEWllmL09P - UVlrSk5vY3djTWV4eVh2Yk9XeFFyQnNTd3VWSE9SMG5WTUpGaFg1OTcreE5TM2Zp - WFl4M3l6d0RzNmxNbkpaUjF5YnBOR1FhWFZ4NUtjUjVhVnB0VmRJWjMwSUZDWHVG - aWdOcGRwb0FiRnFsUDhBMm9hZXZ5ZmFuVkNDUUxpdUVTSzd2UUQ1RXMrWnlyaW83 - eU96dkN4OGMycnMzZzdMcGM2TnVFTWM0VUpEcVl6V2tYRVA4RlBkSTVBM3FoV0xr - VG9ZUnFjRml5dTJCWWxQaCthZURybTRnYTJwTTViaXdKVnVpdjEvejR4Y2Z4WGw5 - N0hSOFRVbktLOEdZZmtRVzJpb0xUbTRPL1V3WEtvajYrVVkrbVpqS013UjdGV1Ji - L3N5ZWs4YW8rc0hIRE5ZMDlpdTFRalRQYXRBa2NFZ25DMW1uSkQ4SEVEOGxIK212 - dDRmbDg5aWRwQm40a05qUGo3VE55TEY1OXJyV0RwVmZqS1VYK29uQzNwYzVuS1h3 - WkNXWXM5VWoxT2pFZzh1Qi8vQ212Q1dSTUd5RDh3K1B3T1dqaG9VTysyK2VoVWxr - ZXFzUXEwTWlYazdRUGZjODUyTTgrbWk5KzhJcGFKR2Nyd3lhNGlIc2ptVytnbUEr - S2Z5U0FBbU91ZVByN3d0NjdubGRBM3VuL3FPUkF2YnlFSFZjcWZxVWNaZS9SYmMv - cXlZL3pMZWFoNVBDMVhBZDhkOEdORWV2V1JQTWNCTCsxVXhRVWJHdi9tZk5ETVlU - bDNER1NpdmdNNTdFT1A2U1ZtVzk4WXhrR25wVGNqb3EyUGdiV1NoYm40SGlVZ1U2 - ejgrczFocy8vRGxOSHpYWGZoU1IzRWJOYnZZeFpoUDdtdzdERWFxeGQ4NzdZb3Rp - VlJaNFo4Z0JXd3ZTRUZGVXpiMmdOS241WEVyNThvUDlPNlRYZzV2S3BCcnlmRUpw - eTM1RUpzUzROS1I2ME9ocUx0MmdmQTRrclVhVXgxS0U2a2pWeUNTVVFhaUQycUkr - MGYveUFaS0MwYURGUFhKZ3Z2NDFvcW43MmtmVnN6a0RsczlndGlhWk5adWhERkNW - enN4SmdKU1BEcHp6SWxvd25LcmwwdHpsRGlGc3ZIaVAxcHZHblJKYnRJTVg0Z0U0 - TldjK1dMZnlpTVkvVDFWbXdpWmk1VGxMV1RhdDlrYWpSdmVMakU5dk5veWFaWFI3 - dkZyK0QwbHp0RkR0MDZRN0txZkxpK0VsbXIxRktsNjFUSk51ZFlsSjI4MElLeitO - RDlNdGhsQlRQNWNoOTBJRkpzYlRscW04M2Q5K3NSV3RXSHVvMFhHM0paWDlId0sz - VTltS3NMaHZ4WWJaVDAyNkdpMkdMV2tuOHJYay9aeDZsaURBMmY2eUZWSi9mdExl - dTFRNThXb2YwcDBwY2FWVjFRKzh5VEZod3JUZmllQjBBVUZLUFZFOFpwdmp5N2ZJ - Z1hjODkzQ0tFSWk2WktoL0Vpd1FOUFkxTU5jYkN3ZjRJYi94VFBjZ0dNSnZFRGow - R0VWejdDMU9QaU1Mbi9YU3RlZUdvQkhtTnRhTFlSbWlZd0ZvaEJYMjVQdlJ1TE95 - cTU5bUJ2Mnlqay9ybVFkd2xUTFZuaTBLK0NRRWNVNndTelNqbG8wcnVKaHF1Tkl1 - YW1zRGJmWVZOTEx3bURWQ05XUGRiMEVWUENCVlZKUXA4S3dWVERld2xDb2FlZwph - bGpndEpuWlF0eExsTGova1VBeWhvQkNaMDZiSTZzQ3lWc0pZRW16eXVNCi0tLSBF - TVAyZDRObGRiNS92NDh1YjF4N3pWb09JQ1pPQVdKQktsUld0N3B1RnBZCtVfgEaU - Xdlm2QQdpdXn79PlVoFLifc19ALOxXeaDHVEe3Y28bT6EWm44M0y+Y/R+3caDrEl - 3pHNIzh3uEcf03I= - -----END AGE ENCRYPTED FILE----- - recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - lastmodified: "2026-07-22T02:00:19Z" - mac: ENC[AES256_GCM,data:LJxkDPmvPuAL0TWZLdDw/+OK3ZtYfK1PKT6f/6YaVv6Zs+cRIMUWWdzfHUsq5XwrnbGoCm61ux56QOxRNzJtg/gw0Ar74UnVwsCePUfk1tn/+kv+/Pk0i1ENs7nfx6HLSH0SmeXrSxC/3TJk3rz3kt95aKVhaYoX8RQ0Vuqsi1A=,iv:SQwDUk31K8vdRmyM5M+hn2UomX44Bt100yYPqG8Cj18=,tag:HL0zN7FCmjHJfcMIEiRxxQ==,type:str] - pgp: - - created_at: "2026-07-22T01:23:29Z" - enc: |- - -----BEGIN PGP MESSAGE----- + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFRQRi8xcktF + MndyWjZIUDJxazB5d2c1UlB6aitXeFZBaXpkTG9UZ0QwZWZBbUlRTTRCRjNMaW1w + d3JJVG1WWjFBOGxJemtKSktPUjBDeGRSdzFEblJrZGxQNkJKbTlseUZmbWtzY3lH + TjY3ZEtRTm9IVEg1cU1pelREMDdjeWFIVS9ncjdOa2hEREhLVHhkc3owNUFYck9D + cDVRV1MzZ1NCWDA0b1ZVLzZsM2ZKQTRXTWdVMTdCRHg3OTFTYmVvU0JDWE8zQXFB + Z0VtTnhTWUFhb0pGSzJJaVZRcGdWbUZydkZITGhGMzk2ZWdQdHdnaEtFVDhoZVQx + RjBtR3UrSWxxR0wwSElzY2VmTkdVUEp5ZENqRXcxcnhtYlpUaG9DbXNCK3ErM0hI + MUZhb3FzemczUzZVKzRadVZIQnV6VU5vL2M4Y0UzUDMwRklMWUJxL1B5SWF0R3Ez + d2xsOWZQVzU4TzRtbzhLeEV4VXV1SFhHSmlTZXF1bW5EbVdGN2RiU2ZxanpnVlcz + N0lKblVuUmFPbURGVFN1OU1wL1VJejFDb1RyTVdjczBYU21UcTUvcU5wa0Zxa3RN + OFBoVXRIczZtUG5odTJHVWJSeFJlbWlDUGVzMVlZaVdnbmZ5V2dpbVFDdWdIUzJC + UTJpcGxrd2ljT3Y5WWNvUmJUaFh6N2U1VnpFWmZwMVpPYzlBZ0FkS1dqaUg0c2NS + ZGdLWGRhbEZxOFdyOGRmcDlPM3AwL1IzUkI2UXQ2TEhGd05IODN1aW5OeXRoMmx4 + ZW1vRHVxVll5Zk1iT2hJc1pDS1I2OXhHeHV1Wkp4MlJ5Z21lU0NuVEx0c255RFEx + VEV0Y01ycDVFR2t2UmFPbTR0cElXVk56MVErd0RKeVRWb3hSZHdlUkFhdTJVVHpo + eHFqY0kyYUM4cWUyYWdIYzZnTGpPQ2hia3psakhEYXdENGM0aXRFVjhmMTFVVWxl + MUcxSlZCekh5aldxTWhzVFgrSVlnaG5tQmpHU2dkdzdTc3J4THJ6NjdUUzdmWVNG + QjB5Qml5d3hkbUVrbEh2enp3clkzY0RBRGRqNEVhdG9aREJDRGQ0NTNjWk9rSms5 + endTdk5iUjBIaTlVMnA4UmFmbEFGOFM0TE9xY1FQemNNM05DMEE2RE9mY0tpUTJn + dWR1M2hEcjJ5UVNDTWY1QklEbEluaFlEV09HNlVyNEdvQ2lCVVlScFlTMHNXczFt + MFJQaTBXTDVnS3VUc1Z2UzN6MTh0bWlxK05iMVRBeTcxZExITVQ1THJhZUp6RnQ0 + aFQ4VHNXcjlOR0ExL0FmclNMcEZvTlo0aVhQRllLZ2FNSUdiRzErL002cGE1R2dU + UklCWitTV1NKTTVPUGs2aDJTaFFWck4wVGJoUXczYXNFK1hyRVZPeUJwTC8vOVd6 + OVQyZGtTMTYyN2dhQktsSU4vQ21zQjJkRnkyVlFuUTdGUk9SbnlZRExRK3VXRGFU + U2xtci9MajdXWW9CM3cvTEZudHFtM2lxREdubmYxVWRtNmVreHZBQ29oOUZTZVhs + M3lWWTkzZUxscG9uaGhIN003NUx3eXhlYlZaOEJNUzA0Wi9QZmpUdGlKSUpsVWt1 + TGxRd1VBYjI2YUY5WXR1KzFJZ0NFVEtYUXFpdFhPNnkwUXRLbnA1Yzh3QS9pcHBv + ZGFMS0E1d20vVnE1ZmJCczBGTU1OWGxvbk9sYTFTRHF6aG1sWW1hYjkyR0RUQzVD + YmtxU204NW95eDRVN2pDU3N0U1FScjMreUhicGRzZ0g2SWYzNU5iR1ZYdGROcFd0 + UnFtVDBkemdOOE9rbUNNRHNSTjRab2hLZFJHbHdBaWQxVElRU3Vod0lQQXEvTjl2 + ajdEVXh5VSt3Z3FINWRoaEQwL2h1L3plWU5SWTVGb3BNbEFFN3hHd2RjaG9YbUZY + YmF2clNra0JCaHNSYkZYYXVyZW8wZERtSHRBU0hMQ3BzRWY3M2Vqb1B3U2piZwps + aUsrNEZtRUVYUFNrN2hFazN0bFZNZUhqeUhibUlIdnFMd0krcUtBN244Ci0tLSA0 + MUUvbEJwOXM5UHpMaU1sSVRRTDlTbXZka1JnbUNaUE93VHVpNGllUjVvCuMkYpVt + bm4hDs++uqIBnJUdNILHKbiC9oJJs2BL60a9XmItIHDrguXbLDALjIwa5grKdi7V + smlFo7Mz4gW0pe4= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFRXcy84QXBN + cHgzNnoyYTJpMWtLS2xXc0Q1MnUvOEZxYkFJV3FyNDJIRFFMQmN6L2ZrbVlYVy9h + bzVNSlZoeHFwK2RUV0pyNnIrS2p4NW9iTnFRQ3Vqb25zU0t4ZGUrQVQ5U0RtSVFZ + b2hNdnAyWDZUZFdzM0JtU2daNEpYV0UwRHU4bklEdUpJTm91YTJNOGdpYmJ1clNx + Q0VsMUlQT3hzM1REekVOZ2UwWk5VRnNTMTRrMHJVQ1lWMUVEVjNsTzdKZDh4cmFz + WVN0RmpGUFBjRDZQRFd6ZXJCc09zTXJQeVM4MDU0bU50QUFPUFdzWTQ0c1liWDBx + ZDJROEwxb1ZHeEg0K0Z6d3JvUWxxdjBVY2VMbVFGWHl6NXdkY0VEUXN6aytWYVgy + RFdFZWZKaHBrcy95akNqM2FmcWZkWnR3WlhIWVV5OFJWWkZnUDZhcFhrb29UUURN + M05TbWNlRjl4TjFpc1g4Zkp3SEVSc1d0V3VuK1hoa2NqSUpQRHBHOEZmYnk1dVJj + VzkzN1BvZVZZa3FFVGFwRVoxUk1jbS80OWlRY2tMSVdJZ2xKQWtXZHBiVjBYQ0Vs + eUJHaVlFY0o0UFZDUWFhNUxuc3JxdGp2UDdiYzlDOGQyVk40WFR4am0vS09uakta + cndUazUyTVBpM2Zqam4vOHoxSVNjemY5dTVXVGVLSHlOMWU3YXBidGNPZUdrUHVM + NklUd0tLT2l2MWtxblN4R0o2dlgvY3FMWENlZU4yZHl5UUZGV3BaVFZjT1E2Q2FX + WlpZVHFGTUtBY1Rxa01RR2xjamZVVFNNZXBYTllKSS9sK1YwWncrdHhVSjQwcXNt + TmVYcDJzUnE3aG1FMUlIbS80NTBKSEpySzV6UnExK3RIU3hmWFJzdDZZTG9zOC9I + UUJnSGFGSTJLaVB0djJwYm05Ry9hb2kvbDJQRGpUbENsMlMxam90aG5iSUlNWWZ6 + Y3ltKy9DWGV5MFhja2lHSC9Oc0dwUDRKNDhLNERqa1pZWlhPSjJZek54SUQ1cHlm + cStqVjY3a00wczJOcEc3VlFXbGQ2MGJHOWVTMHdNL0p0NmNxLzRDR3Y3YmdXK2lQ + eGFhR2JLU3BQVVZkS0xYZzl6Ym81YWlTbkNWT1crM0tnQXREK0gyVWFTSkhSWHJQ + NFV6cTVLMGZQQjBaMDhlTXhYaCtlOEthOGJHakdDNzE0VnRtc0Q5dkx4R3FCVDdL + aVpGRHFRWktGQ0hVWW1DZmpHQXh2d0xmNkVRaUlmZ2Q2UkFvUVoyTERhVkkzUEFT + VEFHYkFvM1VlZHQvdHJHVFdVaWFCaFo1bENHSno2OUdnRE9JaENGNlNDejFsVmM1 + L3k2SGQ4dVBBMVFTaVh0blRTeUxLL0wxRkN3THBoZ1BoY0dlRzRrNnJxUkRSOWZa + TzhRYlVYOHBIQnh3MjNOZDhXbFhMMG9WQmtQZUJzMG41MlZSbm9mdGhzV1dmTUFI + a0JQN2lPWXgxb2RVaUd1S1hpL2EwZmJCV04vdWR0dVJTNitlVUtHejJlWldLaThZ + UzZTdEpualZFZHRneGFKeVZTck0vejNDL3M1bjJUdlB2anNrTVg4S0lkUUR4dEl0 + K2N1dm5yRGwxU0JuaFNNdTVQVEE3WWtGeGF2ZlcrRU9wZnl2Mm5mekwrOWR4OWwz + a1JYS1lBOWg2M3UwUzF5Z0VCSHR5UUhZQzhBcm9hU25ZaVBzRkR2dGNZckYwMDZB + ZXJyQnFHaUhWdVU2ekJkQ285SFlRU0Q5NDBCNmdoMTFZUmY3R1VjUGEzZ0t6dmQ1 + U09xVmd6bVZaaFZhQURtRjBoTmZzTDlPVEV5clNhUFd6Zm1tN09yd3BTYTl6cU9y + ZmM1KzF3RDFXMS8xdXpmZ3A1MjJQZldWNm9xSkJJVFpCak90MldwVDNlWkZmMU1u + R0JkR3lZQXFiNkF4S1JueVBDR1A0SENTTGFWZkF2OXZkeENhaENQelY4bnVFdwpw + VnZ5ejExWGpkbmRBSHJZRWRxN0srNURIbXF0Qkl1N0NLL0xkQjlIYW8wCi0tLSBT + QWZndEd6MkNvYWhhR0FnQVA5dHh4dld3YllVN1Q1bEZUY1ZsY3JhUkhnCnVzRC8I + 1+3qjqtysWdyWV9/dfDxMfWSo6m1hrQF7iltgXkjPzT1ELYVesJwqoRmOyRp9mVD + zcyHTywxxm/7wPg= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + lastmodified: "2026-07-22T21:12:14Z" + mac: ENC[AES256_GCM,data:Ki4Z8/h8mqYdiT/CC5AHoFfB4GON2y9D1BGEjcTRCiURZhmZff7RjlM7mHUe0IQX+R8o0WQy7qqCQXDfEGO6mUd4CwD2KNZP9mN3wA5OjZsd5biNlfQSBECvOgs3uuxFyQTE4B9Vb827Fxo2ndFKkhU5PnuElkktuB/HyFquByM=,iv:i53tiSU/+FGe+sGnBCbUdWHz4TBChBQkJB5j4g3eG+k=,tag:Nm5/ZJyLvgURWLVpPJcTFA==,type:str] + pgp: + - created_at: "2026-07-22T21:10:16Z" + enc: |- + -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ//QJtAyFX6Vj/nxmWLAAs/1p3sKHGYnKOe8tzvpcwYq5+s - OKy2zceoXCxkd62T+68SC9fU/8QbaRHGhuC2pDB5/Pd1V88efmCQqr2BVLtuh/OT - cBqDJQF5163EUnNaAn0hqhy+tdO/kztDVdF+LcQ89DI2z88kNgv7gviXBv/Ozzu7 - +H0bosT1vyZtHDYTXyyJke1/GGEywtzxT5qHUS0SCO69on3LCsQNCW1pi3BOYHYN - bJ41OOiO82UKCOkPgNztwSz+lzQahCq0vnxjE28E0UqEoUmu+nSvxCcUAgk2mMoN - HzMuxlMAbEMk6K2zLX3ImoKcXtoB1GoHau8lkm0B3iLgY3IxP0uIRUp/cDDY8eoe - Q1AK2rcZl0g9Afk9mG1Xajy86MlR4JYUhA2SbLA0/lOh1UxAdO7ZWRV7I2mGT4LK - aL918ORYSI6VnfMUtnn7oZSLWCMw1+jdjXQlxGsEftZpsDPVgHHm+QpEHTinLsG2 - dkjkwuuNN2rFqmDmVlQ2gZA16CwXOO1dz5uGBlwmidxq+iC5HU3hW+cSDfPmFaRK - 0+2Kg2lwbJ0yQibwnpHq0VKAhXRxQ81Ev0i4AmbkQJL5ngsFlL1FWXnpnvHonbCl - Qjv3fzlfAInpcJBvfEVbp9Er1o6zwj1Sp9E3nL7PS2QYDQbnYxJkGBqdsISZTdTS - XAH1lnB+worUc/zc+OXGpktpINnkU+ocOH0Wm4QQ7v+H8OaoAs88CUKeN06n63t4 - Z/cDuZtS9jFnz7gXBWKotqe5QCTeibmED3A6DpOtkxfqcGn9YFBpZmdPAy2m - =W7c9 - -----END PGP MESSAGE----- - fp: "0x416CF1EF9AAF90BC" - unencrypted_suffix: _unencrypted - version: 3.13.2 + hQIMA9/PFHehMxwxAQ/9HW3t9MVEBXQHvZW6M1EUX34uf4zYnUssxZDIwkJTwPNi + aVVph8lJBiF0H6TIELbl7pTwdHzUDxFl2epoPr+IIYOgrbO+vmVpo/kGjBDzaAiM + 7HJPk3u9+NHhzf8A1dXtyW5iIiC124KFkhPn0hKW5LQQNjsSTm/Q692ADK16Vmlq + CM3L/usYhD0wgFETncGrT0SY23aFSWFgyOq29XMVOhV7eDmmhJg3pl07Bs3LyZOY + RWuKCgIS5Xnu53dSMEHXQyKXaKAN4bcI47ZyDIGfeta1zmuLGHBtvW1lRrFG25MB + V/SiHwUYtd6V6MgPD3XrD+IudUpU41zDM/XDQU63AWvLk4ojz4sHXQy/hrNh4VVg + gvl/8DQjWzKRlYVf6u5PkCYZfSqvYk7//5RRRW20PvyOc4aEps4ThyajrHYSp+70 + qe8fyeN/WC/3OF7rFRDNfcfuy/FJ3EhsBmAJOiZbrP/gpjaPCv0gtiUjBkP1p9Qi + PGne/Qa6Yx58gju2AEkowypTJUX2A1/0oGA014JJwS44clPHkEq3aWAaOE0Y9bRv + mOFd3SAyQ9BxXxMkN2y8ZxWIDVfX1Fj34QTuoUlbTO6X2gg4tsODH2K35BavFGL0 + Ye2wPxS2/a4o8T+1lUAqKhe6Znft8d5N+POORzO045/IfTJKhfU0Z4XGSTtyCUfS + XgHiTy9ZZ9lO5gmKbi7mWYkC69LkZN7khw46bTUwpg6wrI9kpNQS6q9t9+GLNFzx + 5basrf6aGtTFiM0apdzCobhcO9NJAyVt/EAAUB+YZJOdq+UfkaHKT8zZ1cYjgXU= + =kvD/ + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.2 diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index f7a45e3..1df6f6e 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -1,70 +1,111 @@ -#ENC[AES256_GCM,data:TLfSG2miNjgA/cHWDr1uimJ8Y16E1Fq7FNaRNGI/dMl5xoP3QZzApub/8oLEMwTaEws0KmSeS2uZgl3az/WApBGE1iFdZ5jxSaJO3vI=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:3Ppo8RejKoMkvTH+GPKOow==,type:comment] -initial_hashed_password: ENC[AES256_GCM,data:zTdUF8n2KqlRht8tQ+TfKNqXubd4jdUir/NlmMsviCy/i/V1gp1BsOGuc26GjIsBMwp/xo05eufzqeTnqtIpm+vtg5QXBqHxPQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:ltx+8jdMxndU+OHk8sHhWw==,type:str] +#ENC[AES256_GCM,data:sBkNjW4ZPpmYDx3h0dQmhCphrkbNh9QwJt3G+czU2a+zOzDRllK1QxWs8Clv7WTm70yJ6Y/z0+54w7KYaqNOu8QFYqRrcF2zOdlWePU=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:t08DkXr3F+nRunZq4hCdhQ==,type:comment] +initial_hashed_password: ENC[AES256_GCM,data:TfTHh0ylGMpFEmPxkC3Fqj6UjeZjgdlRb/K6Cu/0OM5Px7rfivWTzv3EehP8Qtki82DveAx5ffbA2KJVfKJMVsxQw6oqgaxalQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:zxileTYtCPvng5xJq/bMnQ==,type:str] +age_key: ENC[AES256_GCM,data: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,iv:unMyjM8nXInpetyh+N0W43I370to9yPy9LQlsOw4Vwc=,tag:ixi6SPrUyfCKafzOyeYfcw==,type:str] sops: - age: - - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGIyZkQ1VUFW - RWFQSDJMMDhieDlxb2k0cEhjME9KYm95MGtMcjFHaFRZdHJOWnBZMi9JOUtNNjdC - eWtUZEZjMllsZ29YdDFMd0kxeDNhMVlselJ1UWEzbFc5NVZPcGpCZTd0VlFwV3BT - ZXFKRzRhaVdCeUVQM3JZK3VpbXNtSUJmU1M0SHlNSE1uN2hSVXRWYTV1Skk1UFZ6 - Mlk2NlVkV2V1MTBqdXlWY2dNL01Qb2xacUowUXUxMzJLeG9Wa0ZPU2RmRVdVaUJJ - TTJFUU5ZQktEdHNKY0xoeG40aWVXVTB5NXNDTmc2bTR4VFAvVGRQdkNMM0tGNUpV - S0R0M2haVW1LdFlLZVRiVHQwTkxHZEtqczdqT2drQmErNW53THlSR2E1THRITGhm - WGY5UFRBZkUxYUsyODJoRUt0emhRV2RmaTlnMHJmZmhwdmFlNko0a3BPb09YQnk1 - dUZpdUQ5d05XbWFlWjFxOFJFRE5QdkQrN3hNVEMrMGFjM1ZPR05RdVQ4NncwTTNE - RWdjenV5R2ZZaWlJMDk5UVIzVktQbG9Xb3R6UjM5VWNUT3dBN3hoZEtnaUp4REtC - WTZZd1V3d2xvSys0WXNBMU52ZWZWSHhQNERUS3J3QmdTeWc5ellKKytKNTg2akFQ - UWVkL1VXa1o0UkZ6MmFaUXBLM3djdGtkQ3pVMXJiQVJidXpMZVowc2lSYVhXRjkx - eXNYWEl2QW8xUGNUOENpUS8xTmI2bmpIZDNxTENxZk15cjdKTjIrM3dWV29Ka1By - WUs0UGNOR0x6QWxCbU9tdDl6bTZnVDJTb0RnQjA3S01ZVE9UY0xtL1VxM2hqckk1 - Smk1ejR4U1ZwT21EclhTUDM5bXNJajZEenF5WHJKSmdkRzhPR21wK3BTWkYwbTdJ - c1FMc1lVNzdCUGluRm9Ha21QckIwaHNQL2xabmo4cytnQWVvNTQ4T0pndWZEMVNU - T29EZVE5Y2VpNG50QWJ3d0NZRGp6SHB1Wlg3QVl5VzJGK0N2OUdYOExWS1VCWFVV - eFhoelU3R1BqaVE0Znpwckpod3c1N3YrQjhzUk5jd1lXSis1ODFidmJqS0F4Y1Jn - U3VtYk05QzlzNjVzTlRkZDFYMGVONkdRS1lLTGxER0VDaW0zcTl5ZWpyZVNYc0xt - dmlYTm80Y2txYzloTmNqeWtXanJ1ZjJjdGpvOEtRcjhmY1NHRWJueDhrck9teW11 - UmFta2d6d0s5dDQyQWdpb2hVUVpmTzRSTlZmTWhadUVZa2UxV1lzclF6eXN2Nmlp - d0l4aVU2VS8yWXZzSEdyVUVUcFRwZDhZdlJIMDlpblZiQlZJMWRKNnVVREQ5clFj - dFlVNitYUm1HbE5zTFZEbE56dlgwOS83TG5wTzBXdG11UGtWeUFBUDBwaHBMdk1B - WXR0eG5VNERuclJkZlNTYVhzVHNWQXRaU2hJNVdwYXpjOVVpYTRlNlgxSmZtZ3Rw - TXhkTFVFRVovclY3T3ZaZ0R0ZzZhTTNLMnhEMDBVSW5Va240SVVCOGxZRzhLQ0Nl - R3JyNHNHTlVnaEIxaER0QmZLdk1XS1dGbUR0TGV0SGhMN0xWVlZjMjlTdlpJY0xL - dmlsZ3NuT3k1RjVJdG5yU0FTcnlkVWwyTEptUnhwYzB1MVBtS1Q2cG9sQ2pIT0tU - Q0FVaEJXS2hURmRyTGRKeU1EbGdiSHZ1WDd6Skw4U0pNUEFHUDBZSTlWSEtuR0lT - dEw5N3Y4RXlUZ1ZTUkpWbVVjS2RGUk44czdta3RhenRLaEI3SjBhK3N4VExhWGda - bDZRNml2ZWZrbFkyaFlQNUplTThaRzBRUkJHUk9TVGtiZUFpajhKVUZnMkxFSE1S - VUhVa2lCdUY2RmJuU2Vpa0NFQzRwTU1WdTd0T24vS2J3MU9aUGhraHpwcFlZaWdw - YVYyVjlySjhSQUZSN3JZZUFGK0dvQ0ZUUXdCcjA4Y01XTWorVkVOTTBNcVVPUQpa - WjRiUGowMXB6cmNXYk16NXZUSTBYa2pUT1U2WGlmZW1HN1BnT0lQTmF3Ci0tLSBl - RkxINC82aFVQL0hjb2RNMFFzdkNpa0ZIb3hFTEdLSVJVZFBBYVAwalZjCn1sHdCu - zE2D12bJvcOFlJ5dztaCUZErrQPmg6mM/G9FT/L5nCG2gsVdKyHp+gEAayMMzCzU - MiO0vOkYr1J2Cl4= - -----END AGE ENCRYPTED FILE----- - recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - lastmodified: "2026-07-22T02:06:39Z" - mac: ENC[AES256_GCM,data:zzAXOpsHKLGz+xhho7pvI7VyUgx/jzMmYCEPbP2nW1KK3nU3xYlEp77Mwr4YoAt3/dcOQ3osi2BPuWJoeLlGMchupJ2wuv46YGHeBpSds12PUDQ4sUO5njLXF9rKz/dKswXGJNQSyYePExpWJQxWakecPNiZhlfnITNc05ICHzU=,iv:mMGFw1caHMETYRGnqf8yaPzH4/r1moOCotP/EETR2uE=,tag:GfCaqDCLPX6siRtvZbjfGg==,type:str] - pgp: - - created_at: "2026-07-20T00:53:31Z" - enc: |- - -----BEGIN PGP MESSAGE----- + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGY1bmJrUU1N + Nlp3V2lQMU55R0VUVHdCZWpjK0pPTXkwQStpazJ6bjBxUWZ2WmJnZHJ0ZWc3THYy + alZ2QTRLUk1ZVk5oc2ZtcjRaUzBwQmV4d3gxZVV3ZmpYUlBGaFYwN0orSkcxR3dw + bHZaRHhzWXhyNkpmOWNZaWZzamJWQmxZZzN2M0lwSURxcFFhTTAvTHBuaGhmVEVj + QUF5TXFwN0Vtend6eUZTaVE3N2lIR016UTViV2wvcWVJL1BnVmp3ZjhqRWN6VGFn + WHdwb2ZrNUtkUmpmU1NnSk9hdkdNL3pvVnpwOGxvaEZMNzR0Q05qdUxyM3dGMEpn + OGRlUU5oZ3kxUjFkaTJrZkNtZFd3Ry9IdDB1NUhzT3hhVTFuOGNVSGI2alQzQ1A5 + YWRTMUgycXBmMFo4a3hTMGJ1MTRVYnIrVGxrOHluWXZuaFY3UGFzRVk0dW9pS2dI + bmx0SWZFdUEvWVlxbHZQcCtDbTUwbGEyLzZOUGVtcC9IRVRrNE1WaVZFdy9YMCtU + Q1ZuZGlYWEpuQ2NzYmRoOTBxTnhEeW9uSHA5TmczajMxK241aUJMdEExOE5pU00w + eWRDbFcySU9SOWRWNldpUjFvZDhCVnM2SkNQK25QZmZVLzFVcXZNbG5yQTRUdUYz + WlhaMUlBRjgzaE9pTEdhemZqZ3lPbEl2TjI3aWpFYUZ0N0lkUm5ldWxRTXpreWZF + djYvc1YzTHhjZ0p2blcrZ29WdHpYbUVrbnR0Vzczd09JVVhDbkZJcExLUks3MWV5 + YjU4UTUvRTV5UDVSay9QandFT2Jja1pDNUdNSnc5QW1kV3h1cndxbU5vNGN6blNZ + R2grRmg1MXhpdzdxRi9ncHdabTZtSFprN0hSTXNTMGNGQm5WYldUeEVRWEx6cG15 + T0dOZ3ZCNVdQQTF3aTE4ZkN5aUpvOFJ4WFN0Wk5sY2JiYWlUeU00ZnVjOGgrc0Nz + c3hqY2pRRWFVS1dSeU1XTkxaL1ByRHpxbmo4c0tIeHB5R3YyQklnMjBFcTVDd3JP + VzlaNG5TMXhNdW9WejVST1o5YTVBU3JMNFhESWFTR0laVk1OS3AySGl1N2J3aGFZ + RDV6ZVRVTGRoRVhUeUJ6WUZ1c3ZGZndRTThUQ3p5SGRNdTlNUHNUOWVYWnZMQnRH + TDhmenhkbmgySk5IZWl6dzhMYlpFVHhQdUE2M3Y5YUVabGFQVlV6ZjRGaVRvWnlw + MWhhUlJvZk9QZHovSS9qOWtGNGRiNmNzdGkvdTRuTFh5NlZBbEgwWmJlSFhLYmdz + S2o0SGNndDBQK0ZFWUw5bjllNjJnQVg3Uk1Mc3Fla3dZMTRDUm52RGZZNUh5OTFr + WWZNdC9hRm5iOHpPUVkzWFVMdDUzMVR4dmVYa01oRnBUMk51ZFpNem44RTVtVUJo + dml0eVZXRUgvdUh5dG1Cc3hLem81UVJ5MVZ4ZGVRMExSZnAyRlpVU0h4cmQvNENL + L3AyNkhOV2dhbVNUNU5uOGxodkpXY0lxSFkvbUwvNHVuNTg1RXl6TUlpcHEzUXRp + VHNpZ3pCZkc0WGhIR0FLT3V3WUtya3R6OFR0dHdHZ1pSTTkyTC9lTFF6Sk91aTgr + Tkh1VVVxb0JxNVFIS2VKdjJCeFkyeW1XR1ZLUkV0dlRObWh4T25RRFlBekxLSDdq + YThYa1JmZ0lBOSswU1phZ2c5Sk1rRkF6QVhiMFVhR01KczNndmUwUWEzTHFBVFlt + VHFxR1pwdnJySEtsSkpDTCt3UnNMSzIxSFJtTWNJRm9BVElJeDNyc1VMNHRZaFFq + Szk1dW5OQm1WZWFiQVhvVTgrc3Fqa241Y3JkcXQ5UG9JdHpRWDRhRDlZQWpmdWtW + RjlkWk8wSkVoOW93VTJyUHpNT3BVNkJkVGMyZHdTV0x2Wk5OSktnUXBnUnRDQ21t + eFhPQ2xPUGNsaHhibVpnTHlUeEE4QzZLd1JlNGR0S3FiMHdKblVRRW1uR1hjdwpW + NEZiTWdCdmVITk51Vkh3djVPZlpvN0hqc05RdnZiZVcrbEJ1NEhjKzFzCi0tLSA0 + SjMzZEVZOGF3enVKTC9KWUFsdE5BbWJFd3NuSitRSU5CaWJQcnVMbCt3CqOeP5Zf + Jx71Bw1LFgP1++G4CljkwTKlz7mk8iGHDNPFgdW1AQXZBhuRfwXpo5y0Y9gIsi70 + 1y4LIhTJ1h3IIZ4= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IENFMyt3Rjdi + QWpHNkY2WEJUbC9xKzJ2QVJhNjRpbnFub2F3V3hXekFSUlNqL0lVNHhHN1ovK2d4 + MUhwbHNqaTdVb3U3QjlRNTlOMzQ3ZFpKZ1QrQXFId0I4OVdHa21iREFyd04wSzM1 + UEVuaUphU1BGQW9aYzE2N3A3SVlxcUtnWVUrYUxRYnczRHdWUWtCZ3E4WkRKOVRz + dXVqcEhSMHpqM2p2SXQ4dTZIdDNhdnQvbTlYMDREV0tHYlBnOG1ZZEZpL0FaS1ZZ + SzI1d0ZlaWI4QWc3TUZTcWZEdDBFSEZsTEVSdVhZMHVaMC9mYTBMQjY0RHZVbmZk + bW1TSUMvZDVXb3FPaUxWQ1RLeFNaMjllWkprMEJmVkp1RW1QR25aampqUEtLUmZo + L1pEK3d0d2FoUTBBcWxHWitudWtMWTIyRnVWeWp4UFlDWkIvT2lrVW5sSDVLV05w + K3VrSXBBM0t3c3dJMEh4OW54c21iTE11c3RYUlJZZkxCYWY5V0JHSUZDQXgyUUs5 + MzZ3eHVhY3VUb081UDhqM1pBM3JENkoxaFk0a0ROa3hNbWMrTWxqNFRXTSswdFVG + K3ZiNWJhWEg0VVRwQUNXb211R2hjMWs5VG9LelpuZG5RcGNTZVhNNnRBMThHZkk5 + VFRnM1Qva1NUUVI5WmpVQ25GVU5Dc0pCVDIzZ1ZnMEpxTFYrYnhtRnBlZ1prSWJB + NklnUHlnWUVlakdFK2hqazRvdTN4dFFYNFhpQUk0RjRjZ1BtT2FSZFhTWFVnellF + azBWL2ZNbzk3aXN2MnFNa1lMMFNCK1EvbVhOSXVmSVpTai93RmZsS1IwbTF5TjQ0 + WmUrWFFmRUZpVTlTOFgwOVVSMEt0TmJGWE1iNHBBKzFzcks4OVRKZjZVUVlvcUxY + Y3FSZVZMVkgwd3VITWxnTWZITDZjSU14TjJyZTkyQU9DeHpodEo1UStqY2ZIVnVS + WFdXYTVIZzJKWlJJdklNUnBiTFpLL1BmeTNXSjJReUF6YnkzdnYvTEdNWmluSjFl + dk5vNVB5NGM3SHkzMnQ5cnNTcjV5WWhzN3pDTDVoVklXeDZ5UVlNcDNCRzg0bXgr + UUpPQjRic2k4bnM0M2dza3hDa1hOT0gyWVRYcE1IVVFyNDVGRk5hTWRFM0JxMklD + OXl0VlRoQVNqQ1c1Y0RxcEpqUVppdXFUTHFhVFpqZXBZbVZ2amdyNzEwVklIczJQ + V2RyTVNKdGV1aDAyZmhXQlZqajdkZnNOOE5oKzBDZUU1cm03RTJETjFIYUU4YVFR + cGZkVmVOV2NlNTlZSi9JSGdIUFpNL0hZK3BVeFdpSkV3QVRFV1RXcmtuejJnNVF0 + Z3JBK2J1bnZ2RG5UbHQvTnR0c3g3VUt5TldxZGN3dmNTVnZ0OXJqUmZuUDZjQWVD + Y1JzdDBBcFJwNmZ1ektORjZpbFNoejNkYkl2c3NVSkIzbmIvTVQwOTFWNlh6NkZQ + OC9rWFRDT01HZllZUWVPYVNjaFh2Z1dUK056QlRoanZyMDFNMFVudlV3bzRFRE1E + VGxXWUZ4V2tuNjNSMzRDYXhaejlxZm5IV01LZGhxeHUyczJBaHg3Nm1iQ08xOEtk + WDVlYkNtZlF4Y1JBQnhBT1JEcDBvbXhvcS91OWMxT1VZRS9iRmdlZEdLNnd6aDZT + LzRnQjFMUXM2TE55R1o1RVFKSEw5RXk0VU8vSnVBekdPbDdhQnBpSEdPN3JrZ3Ix + TGVMbnN3Rk9aNGdFSHhLZGxrVXEyNlZSQTFJeUtTOHB6Q0Q0aW5Qc3hwR0I4UVNB + OGR1UkZjb0tsbXBqMWNJNkpndWhtMGgxbmJZWE4vSE1xVlhZdGY4UXFhTkdtblE1 + M3ZsbGp4eUFIMmNWQVFiKzFvbnVRbzV4WEk4UGF0Qm0vQUczN3NFUFQwYTRYVzU1 + RlRHVSt1TUhwMnJaUkVEa2FYU1ZVd0RqRmRCVTIwK0VrMVlxSUF3SGVqSGRPdwpo + am11ekJGN0IwQ09PVzFJeWw4Z3U3bmhKbXdSN1I1elFaYVh4S1lUOE9JCi0tLSBF + R1AyRlFlUkF2ZnhkVWJYWDZZdEFMdEhhOE80R3hmREpKUGgzc2hFV0RZCt6RhjwU + LmR9y4xtwfoW+f9R84+ACCcWwqzGQwOIRXc0zaUqaXjqNXZDDUjgNOnQP/iXQgDB + aVxhFakbIzH+POY= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + lastmodified: "2026-07-22T21:11:21Z" + mac: ENC[AES256_GCM,data:FU3Jn6p+vM3x+QyC/1rDtrCM12xLTA9Nj+eCWYkYSHTqkv8C0O96gcuOabHUBDqw3vnnnphaTHWjk/cuYHxHYhtGoPsV8WxOE/nm6dVQhCXzAMVm4yM2gLP5pojI2Q0/ygG707a3YMWmHyi/vqLECPilEmN9ZaaY5FAaKFKrrwU=,iv:ZFNBao4MwCbuY/1wyxzDSjWJFS/z0dPRMVhEWeLiHQY=,tag:MU+SC7/acbjKFDJHt07NnA==,type:str] + pgp: + - created_at: "2026-07-22T21:10:52Z" + enc: |- + -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ//RxkimXCuc6dizxo+jlPY3u6AU3C659Sz5pVNlb5yu7j3 - 00+iS0eDCbjU8Sbw4twthXvj3atF+PxIabpydWVMlrHbiY8Cg7hZTYxSA5tTvo72 - JmEd36KVX1hwWxl0xocYI2EKb6tPegNFWoQfI0L1AwXaolNY+V9h+khKjrPK5212 - j9NbqVMT0/aidDyS7jH4pXQ91oWM9VyOFJG3cup2wfRCZCAi7YsaiRGqrC8B3rR5 - W3SeMq/qLIijPlVpf6ycnHD8QEm0mqZwcOqRz9ezwDhuIXhdqbgf42bzrtyYXdVd - hLFa3Dnsncu4vtgv4n9cUXYaYZ8qwAv1wRUxcZCkrwc4lCLKR9DfdH8OMh3dyYDD - 3S4+lvbyRry44a5aBK4afZLTWBZhVLbmP5zA4aGKANgzI3Y8WOmZT+jAf12peDtE - hTFI6FKTJ5PU63Vm9VKLXTTfmzXKEfNxXZSiSGt4KJcQuunRert/RuxK/qRAvYxi - IULVNBpynj8O0RDuNtSwuVxcxq0+G4vOgMviujQw+7c1EL2zNjLXTgzEXF6V4y10 - /AyJ2Vngyo9CT6KzQHRNqQOliHGXMoS5TU7B4f8a96XdItCSZVHcjGSO9t0UXRSF - I3PRXXHeHK5EFjiWRjw7g80lzZQ/eJVaqhae2tZ+n0mkoUCljHTXQuyRXRoadBHS - XgEcWTU2+UKCXXguCULzCFI0pBN+wMnTM3O+m79/79r5UlVF4QJ7Y158hUIuRrRt - Jsbc3bx21JDruv5DhplTxhxybCHpZFhK4XlpCuFTpHTYPJd5brEH1ervNOCSGNA= - =BgHQ - -----END PGP MESSAGE----- - fp: "0x416CF1EF9AAF90BC" - shamir_threshold: 1 - unencrypted_suffix: _unencrypted - version: 3.13.2 + hQIMA9/PFHehMxwxAQ/8C0xLmEN648feRJJgzfHAPZsIf/Zc9lDlQM340JwLchPL + tl/X4mHMzxWLjlROILvhPSjbRyl4YZEq87WETqfQ8qdF7AHK0pL3+9o9ovb3ZlQg + 3z/Oj5Es8AQ7xrSMDN3/tFTiqJmdCi3qZDiswHPre71GPiwMuZPUiJ6dctTYRlDx + CcC68ZQmYK7jENp4HuGhMy3Q/m4A0H5ogPpwI+AcAS5qGy+8P+6gerd/bN+H16tQ + svHaV/5UDCySGduRqeQEeEhAI7QNFLEtNynqJiWcAfE5ziugB/zVF9rTnd4GBhlk + GtA68KYGmR9OAKwBj2JaSFZkUO26kxMSyNlSu3X5gnd3HXRu2WW8T8tyn4u4a+LG + RuqpI/hhIvul/kv9EBXHHMlZCfF8SLGVzoyYS/EFjQnyCpGD8apcaCApghab0KAh + nBA9NzvsJdS174WtzI+UDpW1JDIETyzSfZIkgWDJPhBzj+SzbPStiCLEJ/hzIUMH + pLrKkcYNjW28rQdZSeB6H4lGYIw5o1R8BkXyu2KTLN3gsewO2Mj8WK0XAYXJ/1cF + Ji1SfwozuMYK6d1bBa9m3PEwXGqwjO0n6GIbjo5o0mnj0KP9duMKeVDAnLfjXr8t + FB42U6okun75qulVurCIqT0PPQHGSAcJsEglt/FJJ3Di63cNIF2A8oXH7uAgKUzS + XAGp+2lYr4CebAKg2X2u6xzM7eOrFo7dYc+VwGe/ykG3kVYN99qVdRCoAKvEGstR + Tv96JvpgYtZ7OA9Jo9vQb4O+AJtbcXZ9pIEu7xWr7W1OGiUslhyJOsuXyYIN + =SJgm + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + shamir_threshold: 1 + unencrypted_suffix: _unencrypted + version: 3.13.2 From 08da1332ccc3ed7a81defa7c6697a40d3ab98987 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 23 Jul 2026 00:35:49 +0200 Subject: [PATCH 116/184] Add efibootmgr --- home/tools/sys.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/home/tools/sys.nix b/home/tools/sys.nix index 762b88d..ba12ae3 100644 --- a/home/tools/sys.nix +++ b/home/tools/sys.nix @@ -5,6 +5,7 @@ pkgs.coreutils-full # System management (local & remote) + pkgs.efibootmgr pkgs.util-linux pkgs.openssh From 8734506d02428978e9d764858ad6fc7f8f132ed6 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 23 Jul 2026 01:54:36 +0200 Subject: [PATCH 117/184] Extract dotfiles cloning to systemd user unit The issue is, that upon nixos-anywhere install, home manager activations fails entirely due to the fact, that upon the very-very first activation, when the dotfiles repo is absent, it attempts to clone it but fails, due to the fact, that no internet connection is available at the immediate boot time. As such, it has been extracted into a systemd-user unit for having the following benefits: - We can depend on the network-online.target state. - If cloning fails for whatever reason, the entire home manager activation doesn't blow up. --- home/scripts/clone-dotfiles.nix | 21 +++++++++++++++++++ home/tmux/tmuxinator/dotfiles.nix | 34 +++++++++++++++++++++---------- 2 files changed, 44 insertions(+), 11 deletions(-) create mode 100644 home/scripts/clone-dotfiles.nix diff --git a/home/scripts/clone-dotfiles.nix b/home/scripts/clone-dotfiles.nix new file mode 100644 index 0000000..c01562d --- /dev/null +++ b/home/scripts/clone-dotfiles.nix @@ -0,0 +1,21 @@ +{ + pkgs, + lib, + config, + targetDir, + ... +}: +let + targetDir = "${config.home.homeDirectory}/projects/dotfiles"; + repoUrl = "https://github.com/rtucek/dotfiles.git"; + git = "${lib.getExe pkgs.git}"; + mkdir = "${lib.getBin pkgs.coreutils-full}/bin/mkdir"; +in +pkgs.writeShellScriptBin "clone-dotfiles.sh" '' + # Only clone if the .git directory doesn\'t exist + # This preserves local changes if the repo already exists + if [ ! -d "${targetDir}/.git" ]; then + ${mkdir} -p ${targetDir} + ${git} clone ${repoUrl} ${targetDir} + fi +'' diff --git a/home/tmux/tmuxinator/dotfiles.nix b/home/tmux/tmuxinator/dotfiles.nix index e92db81..f904d6d 100644 --- a/home/tmux/tmuxinator/dotfiles.nix +++ b/home/tmux/tmuxinator/dotfiles.nix @@ -6,19 +6,31 @@ }: let targetDir = "${config.home.homeDirectory}/projects/dotfiles"; - repoUrl = "https://github.com/rtucek/dotfiles.git"; - git = "${lib.getExe pkgs.git}"; - mkdir = "${lib.getBin pkgs.coreutils-full}/bin/mkdir"; + clone-dotfiles = "${ + import ../../scripts/clone-dotfiles.nix { + inherit + pkgs + lib + config + targetDir + ; + } + }/bin/clone-dotfiles.sh"; in { - home.activation.cloneDotfiles = lib.hm.dag.entryAfter [ "writeBoundary" "installPackages" "git" ] '' - # Only clone if the .git directory doesn't exist - # This preserves local changes if the repo already exists - if [ ! -d "${targetDir}/.git" ]; then - ${mkdir} -p ${targetDir} - ${git} clone ${repoUrl} ${targetDir} - fi - ''; + systemd.user.services.clone-dotfiles = { + Unit = { + Description = "Clone dotfiles repo"; + Wants = "network-online.target"; + After = "network-online.target"; + }; + Service = { + Type = "oneshot"; + RemainAfterExit = true; + WorkingDirectory = "%h"; + ExecStart = clone-dotfiles; + }; + }; programs.tmux.tmuxinator.projects = { dotfiles = { From 653fff9dcddaeeb944fc889d111dbeb82c7ade86 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 23 Jul 2026 02:34:32 +0200 Subject: [PATCH 118/184] Wait until network manager assumes connectivity --- home/tmux/tmuxinator/dotfiles.nix | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/home/tmux/tmuxinator/dotfiles.nix b/home/tmux/tmuxinator/dotfiles.nix index f904d6d..d4c8aea 100644 --- a/home/tmux/tmuxinator/dotfiles.nix +++ b/home/tmux/tmuxinator/dotfiles.nix @@ -21,8 +21,8 @@ in systemd.user.services.clone-dotfiles = { Unit = { Description = "Clone dotfiles repo"; - Wants = "network-online.target"; - After = "network-online.target"; + Wants = "NetworkManager-wait-online.service"; + After = "NetworkManager-wait-online.service"; }; Service = { Type = "oneshot"; From afb54477ccb57fc96c22925c9ac4b3d61b6eda1c Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 25 Jul 2026 16:42:16 +0200 Subject: [PATCH 119/184] Add sops for home manager + self-host key --- home/default.nix | 1 + home/sops/default.nix | 15 +++++++++++++++ hosts/qemu-nixos-btw/home.nix | 1 + nixos-anywhere.sh | 14 +++++++++++++- secrets/users/rtucek.yaml | 6 +++--- 5 files changed, 33 insertions(+), 4 deletions(-) create mode 100644 home/sops/default.nix diff --git a/home/default.nix b/home/default.nix index 5f24487..1a518bb 100644 --- a/home/default.nix +++ b/home/default.nix @@ -5,6 +5,7 @@ ./gpg ./hyprland ./neovim + ./sops ./tmux ./tools ./xdg diff --git a/home/sops/default.nix b/home/sops/default.nix new file mode 100644 index 0000000..b82c1e5 --- /dev/null +++ b/home/sops/default.nix @@ -0,0 +1,15 @@ +{ config, ... }: +{ + sops = { + log = [ + "keyImport" + "secretChanges" + ]; + defaultSopsFormat = "yaml"; + defaultSopsFile = ../../secrets/users/rtucek.yaml; + age = { + keyFile = "${config.xdg.configHome}/sops/age/keys.txt"; + generateKey = false; + }; + }; +} diff --git a/hosts/qemu-nixos-btw/home.nix b/hosts/qemu-nixos-btw/home.nix index 05811f6..08ffb99 100644 --- a/hosts/qemu-nixos-btw/home.nix +++ b/hosts/qemu-nixos-btw/home.nix @@ -7,6 +7,7 @@ imports = [ inputs.nixvim.homeModules.nixvim + inputs.sops-nix.homeManagerModules.sops ../../home ]; diff --git a/nixos-anywhere.sh b/nixos-anywhere.sh index 9c89624..6ccb29c 100755 --- a/nixos-anywhere.sh +++ b/nixos-anywhere.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +set -e + temp=$(mktemp -d) cleanup() { @@ -7,16 +9,26 @@ cleanup() { } trap cleanup EXIT +# Setup machine key install -d -m700 "$temp/secrets" sops decrypt \ --extract '["host_key"]' \ - --output $temp/secrets/keys.txt \ + --output "$temp/secrets/keys.txt" \ secrets/hosts/qemu-nixos-btw.yaml chmod 600 "$temp/secrets/keys.txt" +# Setup user key +install -d -m700 "$temp/home/rtucek/.config/sops/age" +sops decrypt \ + --extract '["age_key"]' \ + --output "$temp/home/rtucek/.config/sops/age/keys.txt" \ + secrets/users/rtucek.yaml +chmod 600 "$temp/home/rtucek/.config/sops/age/keys.txt" + SSHPASS=nixos nix run github:nix-community/nixos-anywhere -- \ --env-password \ --extra-files "$temp" \ + --chown "/home/rtucek" "1000:100" \ --disk-encryption-keys /tmp/disk.key <(sops decrypt --extract '["luks_key"]' secrets/hosts/qemu-nixos-btw.yaml) \ --generate-hardware-config nixos-generate-config ./hosts/qemu-nixos-btw/hardware-configuration.nix \ --flake .#qemu-nixos-btw \ diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index 1df6f6e..ad7a47b 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -1,6 +1,6 @@ #ENC[AES256_GCM,data:sBkNjW4ZPpmYDx3h0dQmhCphrkbNh9QwJt3G+czU2a+zOzDRllK1QxWs8Clv7WTm70yJ6Y/z0+54w7KYaqNOu8QFYqRrcF2zOdlWePU=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:t08DkXr3F+nRunZq4hCdhQ==,type:comment] initial_hashed_password: ENC[AES256_GCM,data:TfTHh0ylGMpFEmPxkC3Fqj6UjeZjgdlRb/K6Cu/0OM5Px7rfivWTzv3EehP8Qtki82DveAx5ffbA2KJVfKJMVsxQw6oqgaxalQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:zxileTYtCPvng5xJq/bMnQ==,type:str] -age_key: ENC[AES256_GCM,data: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,iv:unMyjM8nXInpetyh+N0W43I370to9yPy9LQlsOw4Vwc=,tag:ixi6SPrUyfCKafzOyeYfcw==,type:str] +age_key: ENC[AES256_GCM,data:gNIws3z38ZhDZ8qsubRtvznBvBqUMcn2htBWYFenUxtK49jRE1Gfty2g7P45kCT8Wql9kA94grsyE6Na4/A3nvPKvhKdAFmTl3Qstnuw0u9ZxE9x0CdfsQP7qSVthWe/+ODGLSBZNRR+4yA2KsTdcbUMfEuuKOGpheoIJKCe2JSuEHPBh8xLbSXqTGA90COGNvndyN227wQ6+f/4JiuKWPYFTRZBLVWTLPRtNRzAYhPEtRJUU4QfJRBW/N7i0ObMhjNW+4jTU+ABlwF/Lizk6j7QwMkwbLDzJg6hr3inrkEFtPSjHYSzIYfRepWruKHHw9yZhCVM7MayjO3+jdI0MLt1fhdvw/+qbgxkeucXyfKtX7RzSfnwedGctoIrWcBV7DyAn/Y/2sccsEvbQQDouFS9n6Skp5L1BGu4H4bBA5QgVNGIDDwZNPW+j4mMXvH1+tkeN8q1bvCmfq/aC4teEvkd91YHO/VdCY/5xOjq11DrH0g14Mxh1WPHcZwU30Cwp/EjqHHC0WXw3KBGvGWzXZHFx/bQvXuYQrfESt9rGgauMS276W+DZbskm2RXJ4L/tDcL6vR/zC/QLwAQ5OTDiHpx5PL0IEbeXnGyUMLJFrQBAHskG9toJPBfY0t59P3KSGI0bXbpZJyqVRrI109HotJGXd9PsiAqdfbDyBOkTh9NaoE6JNt85Ip6EXwwMz/8Ey3LTtkpQLMuBWQl5GUIi0/0n29SvSfhQyHzPqnCqbGs9CgQ16ttVSmKgM5s9YwccltviR1OSVLPOTMMuL2JFGfrsh9g783Q+ORFgdvKdQpY/V7JP8nhC9dofqLTHFHWlsXMEwOAX9AI9i6uGoPpKc4fpLLQTkKhOrMqtrasbqM3rYUntRiLaEmiqxn0tq3JPVQAQVPVWTtPBHF4bS1VC1TYb1kfwL2b/JV5Y/Z9oiRydM6KBYn56yUIY1yVsPHjpNNjK1FdowRv30DOcvz2bU/HD0fT6J0/FpOTZGpTgch/g/wbZSOkjRcUf9iAMZgT3bbWgdL7XFiTRxEJF3uweNBC6jya9Mt94uKxBmw2rHFHm0M6Z85Ida6Mrskr3qgAQ0O//ID3ej9rarAoWCxEJroZgG76MP8PSkbwkOzAbgpmE5mQlMrEbVM1X/PxpSTjkiQBqbB66AOfMFIvSGoJq9stR3a599x4XKaD5VAg0Wa/Sd7tHvw6cA2YWRZmF9yiR3viOAim5FuGpQGC9EvJKKkN/atHqpUtUuylY/tEvj9qi0C8apIBDAFHuuEx8//yDB8BUHucjDZk+ptS+4z2D0mCHVdpH+EW/kmohH42x7C813Bdv1J3AQtcFeOXMw6ozWIDRIZegA3i9vCdG65BNhR9lj7bz6uEPgYdBtiFS/qy8zMfN/JFb1RwDg04yFbtIP+Q1BLVQoIc4elxyblPWWKDxCe6tuN2W38L01sTdy+BbG4DPOUWwPvpinXAobnkFyIlt/szUT+2iWPkAIf+NO9KDYg9EPDuzRPSoHIwzPE/41qa1BFXI8Az1UM6SMxVPo6wT+5UEb3IgvBC4SRgEpMwRm7oW96w+kAc7V5SqgFp1NBt9wlD8efvW8QwGGQk0nGVkAdz5Vsy2SFah3KO8uHluVpkWhtO6eLdInixWWCjyn9MGRetMotjtNWUsB7jk5pMjcqPcguiKomj7KgBJ5tJpSCtBTFl0IGAhTQj37fwmSwFltOlEHdgFDNRKHGnsUU2V8bpEkKigBRwfUPdH+T4zz+bIWu9OMyc+fX9OsP2fy0P5DE20MXjDX+SkTj3U0BPtKfnv7zki2yOtYI3ll7g1Lm9M/4/AgDlnIj6sOvEtI5vJgWdvaD+22V0j16wo9QLL8Qe5+riz/C+U/yMrdtn3bB/0gIJ+D8KVyF4eWCimwl2Z276AEtgm3qYBJn78Pab09bnytp65COWo1aVfZMZ3qEiKqUyH2ejeaopFYn6enkNlPCVjQeuUedIJrRrRSYhXgZcfRxjjTOQW7Nc5It6OZwQG9u+QQYg33iSGLBKm4vuvGhYI0tZAUmZdMmFDHeHVgbKJ3AzgFqrJNCgxECrP8wWlxhmo4PteHky4/n/Lrv1AcxeRz6edftfsnYNSLO9JzHzY8Jr0x7s/yEGlmQHJ4yMzzWJBY/8ZBxXl3dQHU1KnpUmKcOMo34ECrTrP/I/Gtzbs4CIBOGK0CvC+EEWwProvxNk5amoKz7IlFYh/YLsi+smOycpiUl95SLG7uEdGv0e9iGVAcFrZ+ZF9bN4sOUKl26c6bMtok/6fHpMzzmduxpHDZjuT8rzl1ZbSBX5oFptbaEXXfiFt91/7UNiWJpCIk3jkwgvVlRwp+8phySwP3o0jXVxNg5TtRs2OFT8GPqkAKTsgTr63kYcXyu1QGY4mI8dm9DReO55JzDT+deCgQCF3kuWcn/Mpfb5bZs6iH9u5ueAyFi2E8cbqWxTWypgDr2AyRI/8dtYviprATXE9In/wX7+kMNvflM3W6zykcKzOPw/WSBAclay/6XTYos6qZl4zPd9zaYgZXOmW6YIMWKfK423xrGa2TolQ0UcNC3PegwUWwQgsRAjN5kv7q7Uz9bRPPLpdUp+JQQf362dGciCdO0q9h0zL/zBLUImfLSWg4WvpR/BzgF1j5awo+itSFU5qoEK6EzHqBT1hpgsBMxLtkN33EWXGU7PYQlbIgwXjGNA43+Oq1qdoHYn6hdaI+c5p/5+/KvBW0UnOABfU6jqk4Pk4a0yU3wMvzjvUxBxGHwwMAlhDgzPiSlapuPGAXojHA==,iv:STuVuYAx3YBDFeknKYIEHAZVJZS6mak8pCVxJmhj2BA=,tag:sKjq2ILGpwRHYrUovhRNzQ==,type:str] sops: age: - enc: | @@ -83,8 +83,8 @@ sops: aVxhFakbIzH+POY= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - lastmodified: "2026-07-22T21:11:21Z" - mac: ENC[AES256_GCM,data:FU3Jn6p+vM3x+QyC/1rDtrCM12xLTA9Nj+eCWYkYSHTqkv8C0O96gcuOabHUBDqw3vnnnphaTHWjk/cuYHxHYhtGoPsV8WxOE/nm6dVQhCXzAMVm4yM2gLP5pojI2Q0/ygG707a3YMWmHyi/vqLECPilEmN9ZaaY5FAaKFKrrwU=,iv:ZFNBao4MwCbuY/1wyxzDSjWJFS/z0dPRMVhEWeLiHQY=,tag:MU+SC7/acbjKFDJHt07NnA==,type:str] + lastmodified: "2026-07-24T12:45:05Z" + mac: ENC[AES256_GCM,data:7SD5/Sq0MA+TnY1LZryMjpyU1Q2RAaxF+/4TCRvTy6L1HYnra4Y2hWU1y9Z7L4aj2TIgOGfTaNzSQJv8Yhb9SdWcaC1rjoDxwMPcyem095UpoVXUXO4IRIc84YtrzauivUUIKf1imSootGZ/DW6aZZ0Cx17nzozYdcVERvAKFHE=,iv:u2M9ODvaQM5AJdWuKTm8CltN+yW/14k51F0P29f+/IM=,tag:2Bj5sPwY9/fN/4gAs9rNJQ==,type:str] pgp: - created_at: "2026-07-22T21:10:52Z" enc: |- From ae200b0a0691d1d3ab8bfffb3400ea507435c462 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 26 Jul 2026 01:56:35 +0200 Subject: [PATCH 120/184] Add powertop support + whitelisting certain USB devices --- system/services/power.nix | 40 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/system/services/power.nix b/system/services/power.nix index 548eb4b..2b0ae94 100644 --- a/system/services/power.nix +++ b/system/services/power.nix @@ -1,4 +1,44 @@ +{ lib, pkgs, ... }: +let + find = "${lib.getExe pkgs.findutils}"; + xargs = "${lib.getBin pkgs.findutils}/bin/xargs"; + grep = "${lib.getExe pkgs.gnugrep}"; + sed = "${lib.getExe pkgs.gnused}"; + + # Prevent auto-suspension of connected mouse, keyboard and yubikey hardware + powertopPostScript = pkgs.writeShellScriptBin "powertop-post-script.sh" '' + DEVS="$( + ${find} -L /sys/bus/usb/devices/ -maxdepth 2 -type f -name 'product' -print0 \ + | ${xargs} -0 ${grep} -liE "mouse|keyboard|yubikey" \ + )" + + if [[ "$DEVS" == "" ]]; then + echo "no devices" + + exit 0 + fi + + while IFS= read -r DEV; do + DEV_POWER_CONTROL="$(echo "$DEV" | ${sed} "s/product/power\\/control/")" + echo "Keeping "$(cat "$DEV")" enabled ("$DEV")" + echo "on" >| "$DEV_POWER_CONTROL" + done <<< "$DEVS" + ''; +in { + environment.systemPackages = [ + pkgs.powertop + ]; + + powerManagement = { + enable = true; + + powertop = { + enable = true; + postStart = "${powertopPostScript}/bin/powertop-post-script.sh"; + }; + }; + services = { logind = { enable = true; From bd2d1f5cb7d2afa01cdd7e78c208c525d9173355 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 26 Jul 2026 02:12:50 +0200 Subject: [PATCH 121/184] Add udisk2 service --- system/services/default.nix | 1 + system/services/disks.nix | 6 ++++++ 2 files changed, 7 insertions(+) create mode 100644 system/services/disks.nix diff --git a/system/services/default.nix b/system/services/default.nix index 9a9d1f5..c94676f 100644 --- a/system/services/default.nix +++ b/system/services/default.nix @@ -1,6 +1,7 @@ { imports = [ ./dbus.nix + ./disks.nix ./greetd.nix ]; } diff --git a/system/services/disks.nix b/system/services/disks.nix new file mode 100644 index 0000000..c53239b --- /dev/null +++ b/system/services/disks.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + services.udisks2 = { + enable = true; + }; +} From ea7dc901029d1c6c794da175b8bbf7934615987e Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 26 Jul 2026 02:13:51 +0200 Subject: [PATCH 122/184] Add udiskie --- home/default.nix | 1 + home/udiskie/default.nix | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 home/udiskie/default.nix diff --git a/home/default.nix b/home/default.nix index 1a518bb..25d7d83 100644 --- a/home/default.nix +++ b/home/default.nix @@ -8,6 +8,7 @@ ./sops ./tmux ./tools + ./udiskie ./xdg ]; } diff --git a/home/udiskie/default.nix b/home/udiskie/default.nix new file mode 100644 index 0000000..104344a --- /dev/null +++ b/home/udiskie/default.nix @@ -0,0 +1,10 @@ +{ ... }: +{ + services.udiskie = { + enable = true; + + automount = true; + notify = true; + tray = "never"; + }; +} From 5ac04674457b92ed2d67affffb7751e6fd76ba79 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 26 Jul 2026 12:29:27 +0200 Subject: [PATCH 123/184] Setup auditrules for keyfiles --- system/core/security/audit.nix | 22 ++++++++++++++++++++++ system/core/security/default.nix | 1 + 2 files changed, 23 insertions(+) create mode 100644 system/core/security/audit.nix diff --git a/system/core/security/audit.nix b/system/core/security/audit.nix new file mode 100644 index 0000000..2a315ce --- /dev/null +++ b/system/core/security/audit.nix @@ -0,0 +1,22 @@ +{ ... }: +{ + security = { + audit = { + enable = true; + + rules = [ + # Host key + "-a always,exit -F arch=b32 -F path=/secrets -F key=secrets_dir_host" + "-a always,exit -F arch=b64 -F path=/secrets -F key=secrets_dir_host" + + # User sops dir + "-a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" + "-a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" + ]; + }; + + auditd = { + enable = true; + }; + }; +} diff --git a/system/core/security/default.nix b/system/core/security/default.nix index ab844c5..3f46515 100644 --- a/system/core/security/default.nix +++ b/system/core/security/default.nix @@ -1,6 +1,7 @@ { ... }: { imports = [ + ./audit.nix ./firewall.nix ./sops.nix ./ssh.nix From 4aef555101690c1b3ad6bf8382ab7b8a4c9d2dcc Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sun, 26 Jul 2026 23:22:42 +0200 Subject: [PATCH 124/184] Extract hyprlock pam extension to system config --- home/hyprland/hyprlock.nix | 3 +++ hosts/qemu-nixos-btw/default.nix | 4 ---- system/core/security/default.nix | 1 + system/core/security/pam.nix | 11 +++++++++++ 4 files changed, 15 insertions(+), 4 deletions(-) create mode 100644 system/core/security/pam.nix diff --git a/home/hyprland/hyprlock.nix b/home/hyprland/hyprlock.nix index becd163..3878a6d 100644 --- a/home/hyprland/hyprlock.nix +++ b/home/hyprland/hyprlock.nix @@ -1,6 +1,9 @@ { programs.hyprlock = { + # Note: `security.pam.services.hyprlock.enable = true` is required in order + # to work. enable = true; + settings = let fingerprint_auth_enabled = false; diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index 787b4d9..fa47717 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -18,8 +18,4 @@ networking.hostName = "qemu-nixos-btw"; sops.defaultSopsFile = ../../secrets/hosts/qemu-nixos-btw.yaml; - - security.pam.services.hyprlock = { - enable = true; - }; } diff --git a/system/core/security/default.nix b/system/core/security/default.nix index 3f46515..8d9c522 100644 --- a/system/core/security/default.nix +++ b/system/core/security/default.nix @@ -3,6 +3,7 @@ imports = [ ./audit.nix ./firewall.nix + ./pam.nix ./sops.nix ./ssh.nix ./sudo.nix diff --git a/system/core/security/pam.nix b/system/core/security/pam.nix new file mode 100644 index 0000000..6a50e10 --- /dev/null +++ b/system/core/security/pam.nix @@ -0,0 +1,11 @@ +{ ... }: +{ + security.pam = { + services = { + # Required for home manager's hyprlock a implementation. + hyprlock = { + enable = true; + }; + }; + }; +} From f7ca9659723f80664a9981c8a407a7b8173d550d Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 00:31:34 +0200 Subject: [PATCH 125/184] Move disko to common part --- hosts/common/default.nix | 6 ++++++ hosts/{qemu-nixos-btw => common}/disko.nix | 17 +++++++++++------ hosts/default.nix | 1 + hosts/qemu-nixos-btw/default.nix | 8 +++++++- 4 files changed, 25 insertions(+), 7 deletions(-) create mode 100644 hosts/common/default.nix rename hosts/{qemu-nixos-btw => common}/disko.nix (76%) diff --git a/hosts/common/default.nix b/hosts/common/default.nix new file mode 100644 index 0000000..f76cdef --- /dev/null +++ b/hosts/common/default.nix @@ -0,0 +1,6 @@ +{ ... }: +{ + imports = [ + ./disko.nix + ]; +} diff --git a/hosts/qemu-nixos-btw/disko.nix b/hosts/common/disko.nix similarity index 76% rename from hosts/qemu-nixos-btw/disko.nix rename to hosts/common/disko.nix index 3a347e7..d0b0213 100644 --- a/hosts/qemu-nixos-btw/disko.nix +++ b/hosts/common/disko.nix @@ -24,16 +24,16 @@ content = { type = "luks"; name = "volgroup0"; - # To be provided via nisos-anywhere. + # To be provided via nixos-anywhere. # e.g. via... # # ``` # nix run github:numtide/nixos-anywhere -- \ # --disk-encryption-keys /tmp/disk.key <(echo -n "MyFullDiskPassword123#") \ - # --flake .#qemu-nixos-btw \ - # user@host + # --flake .#HOSTNAME \ + # USER@HOST # ``` - passwordFile = "/tmp/disk.key"; + passwordFile = lib.mkDefault "/tmp/disk.key"; settings = { allowDiscards = true; }; @@ -50,11 +50,16 @@ }; }; lvm_vg = { + # As a sensitive default, partitions for "/" and "/home" will each + # get 33 %, leaving the remaining 33 % for extending when needed. + # + # Nonetheless, it's generally recommended to that each host defines + # its own proper volume size. volgroup0 = { type = "lvm_vg"; lvs = { lv_root = { - size = "33%VG"; + size = lib.mkDefault "33%VG"; content = { type = "filesystem"; format = "ext4"; @@ -66,7 +71,7 @@ }; lv_home = { - size = "33%VG"; + size = lib.mkDefault "33%VG"; content = { type = "filesystem"; format = "ext4"; diff --git a/hosts/default.nix b/hosts/default.nix index e28da2a..2f64940 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -12,6 +12,7 @@ inherit specialArgs; modules = laptop ++ [ + ./common ./qemu-nixos-btw inputs.disko.nixosModules.disko inputs.home-manager.nixosModules.home-manager diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index fa47717..ed79b04 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -6,7 +6,6 @@ { imports = [ ./hardware-configuration.nix - ./disko.nix ]; home-manager = { @@ -18,4 +17,11 @@ networking.hostName = "qemu-nixos-btw"; sops.defaultSopsFile = ../../secrets/hosts/qemu-nixos-btw.yaml; + + disko.devices.lvm_vg.volgroup0.lvs = { + # 50 % of available disk space + lv_root.size = "50%VG"; + # 25 % of available disk space + lv_home.size = "25%VG"; + }; } From 10d705b2a0db4a7ed06ff165afbe2470161de7e9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 00:37:57 +0200 Subject: [PATCH 126/184] Restructure loading modules --- hosts/default.nix | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/hosts/default.nix b/hosts/default.nix index 2f64940..d1536da 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -5,19 +5,28 @@ sys = "${self}/system"; inherit (import sys) laptop; + hmModules = [ + inputs.disko.nixosModules.disko + inputs.home-manager.nixosModules.home-manager + inputs.sops-nix.nixosModules.sops + ]; + + commonCfg = hmModules ++ [ + ./common + ]; + specialArgs = { inherit inputs self; }; in { qemu-nixos-btw = inputs.nixpkgs.lib.nixosSystem { inherit specialArgs; - modules = laptop ++ [ - ./common - ./qemu-nixos-btw - inputs.disko.nixosModules.disko - inputs.home-manager.nixosModules.home-manager - inputs.sops-nix.nixosModules.sops - ]; + modules = + laptop + ++ commonCfg + ++ [ + ./qemu-nixos-btw + ]; }; }; } From 4f0aceebccfca693b6b953f3f38bd06f77a88dd2 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 01:22:22 +0200 Subject: [PATCH 127/184] Refactor host-config --- home/neovim/default.nix | 4 +++- home/sops/default.nix | 6 +++++- hosts/common/default.nix | 1 + hosts/common/home-manager.nix | 8 ++++++++ hosts/qemu-nixos-btw/default.nix | 25 +++++++++++++++---------- hosts/qemu-nixos-btw/home.nix | 26 -------------------------- 6 files changed, 32 insertions(+), 38 deletions(-) create mode 100644 hosts/common/home-manager.nix delete mode 100644 hosts/qemu-nixos-btw/home.nix diff --git a/home/neovim/default.nix b/home/neovim/default.nix index 0398d5c..bbba12a 100644 --- a/home/neovim/default.nix +++ b/home/neovim/default.nix @@ -1,6 +1,8 @@ -{ ... }: +{ inputs, ... }: { imports = [ + inputs.nixvim.homeModules.nixvim + ./keybindings.nix ./lsp ./plugins diff --git a/home/sops/default.nix b/home/sops/default.nix index b82c1e5..a2e50e1 100644 --- a/home/sops/default.nix +++ b/home/sops/default.nix @@ -1,5 +1,9 @@ -{ config, ... }: +{ config, inputs, ... }: { + imports = [ + inputs.sops-nix.homeManagerModules.sops + ]; + sops = { log = [ "keyImport" diff --git a/hosts/common/default.nix b/hosts/common/default.nix index f76cdef..51116dc 100644 --- a/hosts/common/default.nix +++ b/hosts/common/default.nix @@ -2,5 +2,6 @@ { imports = [ ./disko.nix + ./home-manager.nix ]; } diff --git a/hosts/common/home-manager.nix b/hosts/common/home-manager.nix new file mode 100644 index 0000000..eab4585 --- /dev/null +++ b/hosts/common/home-manager.nix @@ -0,0 +1,8 @@ +{ inputs, home-manager, ... }: +{ + home-manager = { + useGlobalPkgs = true; + useUserPackages = true; + extraSpecialArgs = { inherit inputs; }; + }; +} diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index ed79b04..38f8d27 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -1,18 +1,23 @@ -{ - inputs, - home-manager, - ... -}: +{ inputs, home-manager, ... }: { imports = [ ./hardware-configuration.nix ]; - home-manager = { - useGlobalPkgs = true; - useUserPackages = true; - extraSpecialArgs = { inherit inputs; }; - users.rtucek = ./home.nix; + home-manager.users = { + rtucek = { + imports = [ + ../../home + ]; + + home = { + stateVersion = "26.05"; + username = "rtucek"; + homeDirectory = "/home/rtucek"; + }; + + programs.home-manager.enable = true; + }; }; networking.hostName = "qemu-nixos-btw"; diff --git a/hosts/qemu-nixos-btw/home.nix b/hosts/qemu-nixos-btw/home.nix deleted file mode 100644 index 08ffb99..0000000 --- a/hosts/qemu-nixos-btw/home.nix +++ /dev/null @@ -1,26 +0,0 @@ -{ inputs, ... }: -{ - # Home Manager needs a bit of information about you and the - # paths it should manage. - home.username = "rtucek"; - home.homeDirectory = "/home/rtucek"; - - imports = [ - inputs.nixvim.homeModules.nixvim - inputs.sops-nix.homeManagerModules.sops - ../../home - ]; - - # This value determines the Home Manager release that your - # configuration is compatible with. This helps avoid breakage - # when a new Home Manager release introduces backwards - # incompatible changes. - # - # You can update Home Manager without changing this value. See - # the Home Manager release notes for a list of state version - # changes in each release. - home.stateVersion = "26.05"; - - # Let Home Manager install and manage itself. - programs.home-manager.enable = true; -} From deb89f6b8a3d2e7be55c82ae09b38e07d7362ee1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 01:30:29 +0200 Subject: [PATCH 128/184] Move home-manager config --- home/default.nix | 2 ++ hosts/qemu-nixos-btw/default.nix | 2 -- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/home/default.nix b/home/default.nix index 25d7d83..f77c886 100644 --- a/home/default.nix +++ b/home/default.nix @@ -11,4 +11,6 @@ ./udiskie ./xdg ]; + + programs.home-manager.enable = true; } diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index 38f8d27..20d6fdd 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -15,8 +15,6 @@ username = "rtucek"; homeDirectory = "/home/rtucek"; }; - - programs.home-manager.enable = true; }; }; From 5bc33dbe694d862fe53f1c521d07adb9b807641f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 01:52:13 +0200 Subject: [PATCH 129/184] Extract git-config --- home/git/default.nix | 24 +++++++++++++----------- hosts/qemu-nixos-btw/default.nix | 17 +++++++++++++++++ 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/home/git/default.nix b/home/git/default.nix index d87762a..065c0c1 100644 --- a/home/git/default.nix +++ b/home/git/default.nix @@ -30,11 +30,12 @@ maintenance.enable = true; - signing = { - format = "openpgp"; - key = "0x49593BD010DE4723"; - signByDefault = true; - }; + # # To be set by the importer + # signing = { + # format = "openpgp"; + # key = "0x49593BD010DE4723"; + # signByDefault = true; + # }; settings = [ { @@ -44,12 +45,13 @@ pager = delta; }; } - { - user = { - name = "Rudolf Tucek"; - email = "tucek.rudolf@gmail.com"; - }; - } + # # To be set by the importer + # { + # user = { + # name = "Rudolf Tucek"; + # email = "tucek.rudolf@gmail.com"; + # }; + # } { alias = { fork-point = "!${bash} -c '${diff} -u <(${git} rev-list --first-parent \"\${1:-master}\") <(${git} rev-list --first-parent \"\${2:-HEAD}\") | ${sed} -ne \"s/^ //p\" | ${head} -1' -"; diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index 20d6fdd..8e0af27 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -15,6 +15,23 @@ username = "rtucek"; homeDirectory = "/home/rtucek"; }; + + programs.git = { + settings = [ + { + user = { + name = "Rudolf Tucek"; + email = "tucek.rudolf@gmail.com"; + }; + } + ]; + + signing = { + format = "openpgp"; + key = "0x49593BD010DE4723"; + signByDefault = true; + }; + }; }; }; From 8849c882e4340585e589d5fb5efeef3b4c4a0d6f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 02:01:35 +0200 Subject: [PATCH 130/184] Extract SOPS config --- home/sops/default.nix | 1 - hosts/qemu-nixos-btw/default.nix | 32 +++++++++++++++++++------------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/home/sops/default.nix b/home/sops/default.nix index a2e50e1..5a4a3f0 100644 --- a/home/sops/default.nix +++ b/home/sops/default.nix @@ -10,7 +10,6 @@ "secretChanges" ]; defaultSopsFormat = "yaml"; - defaultSopsFile = ../../secrets/users/rtucek.yaml; age = { keyFile = "${config.xdg.configHome}/sops/age/keys.txt"; generateKey = false; diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index 8e0af27..3352aeb 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -16,20 +16,26 @@ homeDirectory = "/home/rtucek"; }; - programs.git = { - settings = [ - { - user = { - name = "Rudolf Tucek"; - email = "tucek.rudolf@gmail.com"; - }; - } - ]; + programs = { + sops = { + defaultSopsFile = ../../secrets/users/rtucek.yaml; + }; + + git = { + settings = [ + { + user = { + name = "Rudolf Tucek"; + email = "tucek.rudolf@gmail.com"; + }; + } + ]; - signing = { - format = "openpgp"; - key = "0x49593BD010DE4723"; - signByDefault = true; + signing = { + format = "openpgp"; + key = "0x49593BD010DE4723"; + signByDefault = true; + }; }; }; }; From d3cd2a849bbe92f8d52d51f24fa129f72222670a Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 02:17:17 +0200 Subject: [PATCH 131/184] Refactor all rtucek config to 1 place --- hosts/qemu-nixos-btw/default.nix | 41 ++++++++++++++++++++++++++++---- system/core/default.nix | 1 - system/core/security/audit.nix | 4 ---- system/core/users.nix | 22 ----------------- 4 files changed, 36 insertions(+), 32 deletions(-) delete mode 100644 system/core/users.nix diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index 3352aeb..ca3dd4f 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -1,9 +1,40 @@ -{ inputs, home-manager, ... }: +{ + inputs, + config, + pkgs, + home-manager, + ... +}: { imports = [ ./hardware-configuration.nix ]; + security.audit.rules = [ + # User sops dir + "-a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" + "-a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" + ]; + + sops.secrets.initial_hashed_password = { + sopsFile = ../../secrets/users/rtucek.yaml; + neededForUsers = true; + }; + users.users.rtucek = { + isNormalUser = true; + hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; + openssh.authorizedKeys.keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" + ]; + shell = pkgs.fish; + extraGroups = [ + "wheel" # sudo make me a sandwich + "docker" # run docker commands without sudo + ]; + }; + + programs.fish.enable = true; + home-manager.users = { rtucek = { imports = [ @@ -16,11 +47,11 @@ homeDirectory = "/home/rtucek"; }; - programs = { - sops = { - defaultSopsFile = ../../secrets/users/rtucek.yaml; - }; + sops = { + defaultSopsFile = ../../secrets/users/rtucek.yaml; + }; + programs = { git = { settings = [ { diff --git a/system/core/default.nix b/system/core/default.nix index 1f82093..ff9b9d6 100644 --- a/system/core/default.nix +++ b/system/core/default.nix @@ -6,7 +6,6 @@ ./ram.nix ./security ./time.nix - ./users.nix ../nix ]; diff --git a/system/core/security/audit.nix b/system/core/security/audit.nix index 2a315ce..5feded8 100644 --- a/system/core/security/audit.nix +++ b/system/core/security/audit.nix @@ -8,10 +8,6 @@ # Host key "-a always,exit -F arch=b32 -F path=/secrets -F key=secrets_dir_host" "-a always,exit -F arch=b64 -F path=/secrets -F key=secrets_dir_host" - - # User sops dir - "-a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" - "-a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" ]; }; diff --git a/system/core/users.nix b/system/core/users.nix deleted file mode 100644 index 622dd06..0000000 --- a/system/core/users.nix +++ /dev/null @@ -1,22 +0,0 @@ -{ config, pkgs, ... }: -{ - sops.secrets.initial_hashed_password = { - sopsFile = ../../secrets/users/rtucek.yaml; - neededForUsers = true; - }; - - users.users.rtucek = { - isNormalUser = true; - hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; - openssh.authorizedKeys.keys = [ - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" - ]; - shell = pkgs.fish; - extraGroups = [ - "wheel" # sudo make me a sandwich - "docker" # run docker commands without sudo - ]; - }; - - programs.fish.enable = true; -} From 5af13a0ad9378345b19f146917e73dd09b33c9cf Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 02:35:28 +0200 Subject: [PATCH 132/184] Extract user config --- hosts/common/users/rtucek.nix | 73 ++++++++++++++++++++++++++++++++ hosts/qemu-nixos-btw/default.nix | 71 +------------------------------ 2 files changed, 75 insertions(+), 69 deletions(-) create mode 100644 hosts/common/users/rtucek.nix diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix new file mode 100644 index 0000000..c951c22 --- /dev/null +++ b/hosts/common/users/rtucek.nix @@ -0,0 +1,73 @@ +{ + config, + pkgs, + home-manager, + ... +}: +{ + # User config + users.users.rtucek = { + isNormalUser = true; + hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; + openssh.authorizedKeys.keys = [ + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" + ]; + shell = pkgs.fish; + extraGroups = [ + "wheel" # sudo make me a sandwich + "docker" # run docker commands without sudo + ]; + }; + + # Decrypt hashed password + sops.secrets.initial_hashed_password = { + sopsFile = ../../../secrets/users/rtucek.yaml; + neededForUsers = true; + }; + security.audit.rules = [ + # User sops dir + "-a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" + "-a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" + ]; + + # Make sure default shell is installed + programs.fish.enable = true; + + # home manager config + home-manager.users = { + rtucek = { + imports = [ + ../../../home + ]; + + home = { + stateVersion = "26.05"; + username = "rtucek"; + homeDirectory = "/home/rtucek"; + }; + + sops = { + defaultSopsFile = ../../../secrets/users/rtucek.yaml; + }; + + programs = { + git = { + settings = [ + { + user = { + name = "Rudolf Tucek"; + email = "tucek.rudolf@gmail.com"; + }; + } + ]; + + signing = { + format = "openpgp"; + key = "0x49593BD010DE4723"; + signByDefault = true; + }; + }; + }; + }; + }; +} diff --git a/hosts/qemu-nixos-btw/default.nix b/hosts/qemu-nixos-btw/default.nix index ca3dd4f..a8302ed 100644 --- a/hosts/qemu-nixos-btw/default.nix +++ b/hosts/qemu-nixos-btw/default.nix @@ -1,77 +1,10 @@ -{ - inputs, - config, - pkgs, - home-manager, - ... -}: +{ ... }: { imports = [ ./hardware-configuration.nix + ../common/users/rtucek.nix ]; - security.audit.rules = [ - # User sops dir - "-a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" - "-a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" - ]; - - sops.secrets.initial_hashed_password = { - sopsFile = ../../secrets/users/rtucek.yaml; - neededForUsers = true; - }; - users.users.rtucek = { - isNormalUser = true; - hashedPasswordFile = config.sops.secrets.initial_hashed_password.path; - openssh.authorizedKeys.keys = [ - "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQC8X/6YtTiciDgv4SBbr+sHRfqbyD/xTulOgJuifcTlDDPwA8mJc19EI/HyDgGHQm/+GHK6YLxCQvxa5QzhgDxr9FILH4724NM2HSRADpA2NF5SqRNqK0uwnXof4U3H0zRr1mFUzoUJUvV7T2ammAC9SdPa+gFgwM7erpTd4MYpsawmzfHDGtNxdYBVZZXQQ0G587zUEG5VZcogvGehANNTC2s4se4wher56Jh5j/nwVhO11LZ7NMXJaxl9fWyBEWj58ybX8eLOHfWT43dyZFXgTNXMTzvmUSnCZGVR7Kqk8porKZBT8hvksbEYAq45aNDYl2J1ArSLVjJEHT4zUv7G8iUHtDkKStcS9ZaxhIIOluHuQAIa+R9am/LPD62WjnEJ5F72JK3BRoaVP/JGe5IClWSQqkqG4pgn3MHuYW7zwk4QZcagLM0Ecv8aXcgIO3kJ8vwjJzH+vsdfBGaXOdPKBbKNLaEG6w0phvyt7N3P3N6yyN28gk812ALKScsiSmYEAmnJFzj3ot/yUs+9EduXsNCHLJch+a1xcHuaPMEJHUzbOLbi/DFikq85wsa+U2h89D085voepp1uzRLS5BHzvCFk8t7d5boOZxX39Pat5wHs2QbdC2z2bB0NpQphTWnnc2TiWjJBpx9MVbZGB3Svzy50VZA2hJBhuaM6yG7yYw== cardno:13_364_058" - ]; - shell = pkgs.fish; - extraGroups = [ - "wheel" # sudo make me a sandwich - "docker" # run docker commands without sudo - ]; - }; - - programs.fish.enable = true; - - home-manager.users = { - rtucek = { - imports = [ - ../../home - ]; - - home = { - stateVersion = "26.05"; - username = "rtucek"; - homeDirectory = "/home/rtucek"; - }; - - sops = { - defaultSopsFile = ../../secrets/users/rtucek.yaml; - }; - - programs = { - git = { - settings = [ - { - user = { - name = "Rudolf Tucek"; - email = "tucek.rudolf@gmail.com"; - }; - } - ]; - - signing = { - format = "openpgp"; - key = "0x49593BD010DE4723"; - signByDefault = true; - }; - }; - }; - }; - }; - networking.hostName = "qemu-nixos-btw"; sops.defaultSopsFile = ../../secrets/hosts/qemu-nixos-btw.yaml; From 7c5112dcc15e6726388fc6dbcba07b3938a59606 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 22:19:32 +0200 Subject: [PATCH 133/184] Update nixos-anywhere script --- nixos-anywhere.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/nixos-anywhere.sh b/nixos-anywhere.sh index 6ccb29c..80e2398 100755 --- a/nixos-anywhere.sh +++ b/nixos-anywhere.sh @@ -29,7 +29,13 @@ SSHPASS=nixos nix run github:nix-community/nixos-anywhere -- \ --env-password \ --extra-files "$temp" \ --chown "/home/rtucek" "1000:100" \ - --disk-encryption-keys /tmp/disk.key <(sops decrypt --extract '["luks_key"]' secrets/hosts/qemu-nixos-btw.yaml) \ + --disk-encryption-keys \ + /tmp/disk.key \ + <( \ + sops decrypt \ + --extract '["luks_key"]' \ + secrets/hosts/qemu-nixos-btw.yaml \ + ) \ --generate-hardware-config nixos-generate-config ./hosts/qemu-nixos-btw/hardware-configuration.nix \ --flake .#qemu-nixos-btw \ --target-host nixos@qemu From 46539ea8abdbb1a83e52acd7671ab44364e5e039 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 27 Jul 2026 23:49:21 +0200 Subject: [PATCH 134/184] Add support for Dell's XPS9360 laptop --- .sops.yaml | 3 + hosts/common/users/rtucek.nix | 7 +- hosts/default.nix | 11 + hosts/dell-xps9360-nixos-btw/default.nix | 17 ++ .../hardware-configuration.nix | 30 +++ secrets/hosts/dell-xps9360-nixos-btw.yaml | 149 ++++++++++++ secrets/hosts/qemu-nixos-btw.yaml | 214 +++++++++++------- secrets/users/rtucek.yaml | 214 +++++++++++------- 8 files changed, 469 insertions(+), 176 deletions(-) create mode 100644 hosts/dell-xps9360-nixos-btw/default.nix create mode 100644 hosts/dell-xps9360-nixos-btw/hardware-configuration.nix create mode 100644 secrets/hosts/dell-xps9360-nixos-btw.yaml diff --git a/.sops.yaml b/.sops.yaml index 623f4bd..b4ed51a 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -2,6 +2,8 @@ keys: hosts: qemu-nixos-btw: &host_qemu-nixos-btw_age | age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + dell-xps9360-nixos-btw: &host_dell-xps9360-nixos-btw_age | + age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa users: rtucek: @@ -16,6 +18,7 @@ creation_rules: age: - *user_rtucek_age_identity - *host_qemu-nixos-btw_age + - *host_dell-xps9360-nixos-btw_age stores: yaml: diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix index c951c22..2c6adf0 100644 --- a/hosts/common/users/rtucek.nix +++ b/hosts/common/users/rtucek.nix @@ -4,6 +4,9 @@ home-manager, ... }: +let + rtucekSopsFile = ../../../secrets/users/rtucek.yaml; +in { # User config users.users.rtucek = { @@ -21,7 +24,7 @@ # Decrypt hashed password sops.secrets.initial_hashed_password = { - sopsFile = ../../../secrets/users/rtucek.yaml; + sopsFile = rtucekSopsFile; neededForUsers = true; }; security.audit.rules = [ @@ -47,7 +50,7 @@ }; sops = { - defaultSopsFile = ../../../secrets/users/rtucek.yaml; + defaultSopsFile = rtucekSopsFile; }; programs = { diff --git a/hosts/default.nix b/hosts/default.nix index d1536da..fc5def3 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -28,5 +28,16 @@ ./qemu-nixos-btw ]; }; + + dell-xps9360-nixos-btw = inputs.nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = + laptop + ++ commonCfg + ++ [ + ./dell-xps9360-nixos-btw + ]; + }; }; } diff --git a/hosts/dell-xps9360-nixos-btw/default.nix b/hosts/dell-xps9360-nixos-btw/default.nix new file mode 100644 index 0000000..38f7029 --- /dev/null +++ b/hosts/dell-xps9360-nixos-btw/default.nix @@ -0,0 +1,17 @@ +{ ... }: +{ + imports = [ + ./hardware-configuration.nix + ../common/users/rtucek.nix + ]; + + networking.hostName = "dell-xps9360-nixos-btw"; + sops.defaultSopsFile = ../../secrets/hosts/dell-xps9360-nixos-btw.yaml; + + disko.devices.lvm_vg.volgroup0.lvs = { + # 100 GB of available disk space + lv_root.size = "100G"; + # 100 GB of available disk space + lv_home.size = "100G"; + }; +} diff --git a/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix b/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix new file mode 100644 index 0000000..bbfaca5 --- /dev/null +++ b/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix @@ -0,0 +1,30 @@ +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ + config, + lib, + pkgs, + modulesPath, + ... +}: + +{ + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ + "xhci_pci" + "nvme" + "uas" + "sd_mod" + "rtsx_pci_sdmmc" + ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; + + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/secrets/hosts/dell-xps9360-nixos-btw.yaml b/secrets/hosts/dell-xps9360-nixos-btw.yaml new file mode 100644 index 0000000..6a74949 --- /dev/null +++ b/secrets/hosts/dell-xps9360-nixos-btw.yaml @@ -0,0 +1,149 @@ +luks_key: ENC[AES256_GCM,data:I8oAwXxG01kfz5MwyX6m6KcrTolMh9ud5qImPw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:EL++PD1BauC5RWOJRr48NA==,type:str] +host_key: ENC[AES256_GCM,data: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,iv:RYx5EpBBo+7lg2ZZkUd2FFFl0GS99TMBNKmOuiwXt/o=,tag:2OCWKQqitlXnC2UBANXpig==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IEdBL0c4UTE2 + Tnk1cEpUa3Rpd1ZlTy9BbXRiKzk0cThMa0crUDE2cEh2UjQvb0FsZjh3L25tUkE2 + TDZkQnNuMElPNTBjWGl3M1lRdXFSeHVKMFRDSW0xY09mYlc3K1NiNnc0M1ZHa0NE + SVVMRTBLdFc0Z0p0dlJZSER6dTBSWnZ5VFIxWWk0bXBtaVJVWWN0ZTREWjllZzFX + dXNiNThOd3VOZFVUM0syd29kakxNK2g0cnYvMXhsRk9WbmtFUEk3bXh3dGplcnBG + OEZFaUQ4TW5uWE9lVHdESEhrTTVYekl2bjJIa1duUWRmM1BYc05LaS9rdjdWb0VP + UlJQcG5hWWdaWFBSZUVHQkdLT0JOSll3Yk9JVDJPV1BIQi9Zbi9zTHZIbUptY2Qy + blE4S08xcHVQbTFHM3RBeXpuR0pUeHZZazBpQ1FmQWRjeFFoT2hlZXp1SkJtQXhr + MkZRaTNFNVdyRU1GWmxDbXp5L2FIa3dCOFY1a2hPNGZjTmhmcXZ6MWV4WEFJWE1a + Qm5kazhjTzNJZ1BVWGo4NWtBa09GRUVBWE1rWFZQNVlmRzl4a1JRUERGdlo1am1z + NDlNUGR6d200Unp0ZXpScCtoOHZvR0dVdUNwN0VEelRYdEl2Y0sxbHdzMFc0NWlO + dGdXMkE1Q1ROVElrQVU4WWFjU0pxRE1vRmo5aWlzM1I0QVVOajJpalNBeDZZWWtz + Wmw3clhVT05jR2hJV3g0d2JVYmoyZllaSzB4Y3RHRW53cm9MeHlZU25iK0FnTFFh + cGUxV25NQTR4Q0YzdXJXSjRDUDc5cTA5REpuSEpIczg2NjQ3eWVpV01KMkRYVHho + UGNuZFBRYUtSbFpYN3h6WEp4S09MVkMzM3BYR1RMRSs4RXExeGs4OXo3Ukh5eWo0 + dWp6ejVJRnErc0VucEExZ05wWWNRd3ZjWWFDc091eEFSUVNaRmlld1dsYkU1NEVV + RnQzaWtNVjBWUW5iUFlReldOcFZxVC9OOGg5MUZXZFZOTGhYaW9Qd1JJVGkraHBP + MVFuMDZncFkzZGFIcStIdzg3c3U4RkQrUmFnSm03U0w5Q2Jnbk4yUG84REVZTnhy + ZDBCNVNXME9uakRVRlJlUlhtUFp3dk9senNxTy96VnhqSGZZWHJSVS80VXdFRERy + TEhoWkZkek1GbHpvZEZtL01iOVBsNE5xTGNQdld3c3NkQ3hORk9yeHdBVkQ0QUVB + VnFzWWtoWnJSSTZOcUxyVTExcmJOeThEWmRONFU2TjZnSHJ3eGdKOWQ4K3JTb1hM + V2NJSm91dUczYXRtNVNaa0M4dUF1U2xjTVBWckFOdGxlaGNTdGpHQW9jMEhzV29N + bldqanBsUDdtY2RCc21VZXZSR1VPa2NvQmNTWnJka043QVVKWE84L3M2WXdUS3R1 + K2VpbXZTVmROeHJvSjFscGs4bGFYd0R1Uk9iWStobkluT1NZK1E2UVJ5a1JwQVNQ + aUMwL21MS2VoZm1yZVpNR24xQm5XdTlnWmpDUzc0QlpqK2N6cHF6S041blNJeC9y + T1FVWnRyYU5NdE1Uayt0YTlhL1JESFBqblcrazkzQ2dEaXZPTUg1RUVidGRMTEVI + cURZTjBIQ1ppMUhham96OWMyVEx4SWNMcE9HMnZYVXA4R0dUdVhDSDVtOFBJa2w4 + dnAvOGxJWHkvR2FhK1pVUFlpQlk4eUFwMEhIVXJMVEJzMVh1Zm1BTTBscllqYUZq + emhES2U1eVNOMjdIYzdWbW5UM01kZnNhRmxUcVJOc2tWaTNKbEt0Rlo0cXBENit2 + WFdLbkxXcG5RKzF1empDa1FNeFlJQitRZWtabXVPWWlCYWh0dVNUZmhGMWRuV2pm + ZFZFcDk3WFA2eE55bi8vYzVDWEF2am8wZ1lBWSt6YkVXYUNHVytscitEWDJWdzAr + OURvWmJCdEN5YlBSWXdHT3JPYmtLbzZ2NVZvRjd4a2ZwK0JUVmQ5amp1c1VLUQor + OHpNSk5ZTUFLNlJJdnhsYlF3TzlCbGpqeXcwRVhrQ0xhZ2QvZVgxVTdFCi0tLSBw + Z1lVY3daQXFtdHRBVEdkdFJvQlFBQURIQUllUHVGVUN3MnhLZFUyWWRBCnf6mauZ + P2+Issu8HnQ9rURnLVnno2gNvpZuEPliIezzyPcgJWEP+1l86s8tjhBaDpwo/VkY + NBErETIKs9EH6VE= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGgwLzUxbnNt + WlVVdWRDVkpmd1AwNDNOSDVxempwemo4U3k3ZERxRzB2cU1WUGxoVmkzdjlRL3Vv + OUppdjZkUCt5TkpoZXFTRXVrcEdkcWgyMnY4WnlTR2FMUzdIUnRVNmNpakdyN1B2 + MDZrbzBEbG5wc1dveFVYNDdwbkovQlNGZWJhRjk3cDB6YXlwTU0rc2Z2bUFHTFBT + d2pVcGF3cktCbnRCOHRXb0NXQjFOVlYxamNGdmZzYVVHSGtYblpnbEc2REoralN0 + MDBZRW4vakpKTXR4U2FoeFg5S2pMWmxHVHdYQ0t1TlFSaXNMdlNOdlEyaUJKbHZC + dDVNc0xaWXVBZU5sdEQ2T013MWpTMjBPZ2xaR1VHWHlXTUVydWFMY3psOGZ5MHNI + RSt3d0pQWXNGa1JyT2RvS0hlYVN3UEZzdmZLNm1raWtNdjQ1OGdhcnBGZWZFdFo3 + cHZWN2pDSEF0RnhQaHZHMHl5c3VJdEhVOHFEcXhLYWZLSExJcHc5TEVQY2dGQ2Y1 + ai9jNnM1d1BYeFV5a2JwaDB4Z2YwRldkYUFVZDhnUXhrQ3JOUWprcnhDazJUMTRY + aFlyaWtYM2xOdjhCZ1UvTitwczJseUlCNmRLTHRzcDNaNUU4Y01sb3BCS201SVR2 + MUFtOS9Ndms1QnlCaTI3VXltVTQydHJJUis4ekZwR21vSC9BOWt3VVFWdVRCMTVJ + cWNTc3QwNmVVVnI3VzZod2VwazVpTGx6dHdBSDR5SUxlRjgzd01rZnloWGp5S1F2 + L1plVUhpT0dVdE5pVnRSTjd6Tm5OSTdpaUxHL1lSZ2lFWXpEaWgycDRYaWN4MTZj + bEdHM0dWQXlDekJTMWNZdjNTdGpzTVZSR1l2V0E3YVJtN3l4c0N1UmplUE1vZFNh + VllXTzZxcWRlbGFvRTBod1RMd1VXaVo5K1BpK3BkcjVFZmJrSnFQVm5LdnRPTjBI + RDREdXhzQ1hEQ2tTTHNwYTc3WmEwNCtJbTkzWTRIZHdsUWNEODRVYWlLcFJyMWZE + Mmo2cEJxeGxjNWpwcVR0R0VxMzlwNGp6T1daOWxmeU9GekhyaEg4ei9yYk5YOW1x + UWVWZTF0dGk3di9EaHBnUjB5SXNBTDJ4UUFSQU5NcXo1QlpodDBOS0U1YnQ4U0kx + d1NFOVNSNWRGcFlac0h2VmZoUzM0dUJTeHIwMVh1VmZFSUxTZXhWUWltanNncnFS + ZXdIeW81eW5rc0RHR2VZb0pJRkdvWmhyRXJsYkV5bjdMbXh0U1RhSFkxbElIcUZj + V0FycXNteDhhM1UrWlhTSEpJSFpHckFiSW4zR0M1YzQ4QklmQkVKcFdWNHBVbmRW + dmkyMlIyVURQNUxiMmJJMzJUTDlvYTBJM0kxa2V3RjdOd3pBMm1HRURDcHFNamw1 + QUlJajJlbXROUDhNWHlwaWlWdlVwZjdaeGRLMGpXQXhDaGhFM0xHTCtWM2EzT1hu + b1pQQ3BPRDJNY2xrSG1qbW5Cb0duSDZRWlZaQVFGWlg2OGFLK1FWbzBwWmFSa3Bv + L3F1QTVWa2hLRGlvWFdPTi94SmdNREpWdHlYSGJEb3lhQ043UmJmY0xMakowYWxD + VWNjbmgzbDNZVmlpRWxDbkNhMkl6Yk9UQU5GZVdvS21XUStLaE9BWFA1VjVXOElO + N3pnM3JTUXh2ODUra0l0WkVFWGtadi9kY0pVV0xKbkNnN0p2WDhhakZ0dURZL2tX + eHZQMVk1L3U2K0lWSlhjdWlNdE5PSlBXeURZZm5mbVgrQjJwN1RFMy9xa1JmeDJN + TWYySGpERkxaME1BUlUxTmJJRVdXeldzZTUrQytJaFYyem9TaXlWa0pLa2JyK1I0 + RlB0WWMybG56RWtlaTN1L2xYRkFaeXJXaDloeHZQWEp0SExweUNFeUtTYy9HdEx4 + aVpIcmo1cnRjOFh3QjdKOUgrTUpFYnJTRmNJVW12MUdoeFlBQVhKSjN4WTRNQQps + L1cwVzFyWVgxd29SMjlLSm5FdExIaTdBNkxhU2xiZkQyVjJNYzd3bTRvCi0tLSBh + NE5GUkljS25IWjRpWURTeDFlVkg4MzlUS3pUNXFjRW5jZ3lGbndDRnhNCgyTYMmb + ffhQRS6P12r4m0pX9KWIPvkiTdpfPWAppj0i/SmsRxJduxfKqL/snREMJfV5V2IO + 1gAs44on+45Dp0I= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDJiOTV2U2J1 + Uk1aeHhtYWI1dFIzUEVDMFJmbGpyNFBPaUcxOFFTTzhEZUFWWVZkdm1UcmFaQkoy + ZWptNUE5QjlLd3lwMUsvQzY0bHc2YjVFWjRIQXc4ZnhQSmhlZnBOZzkyWmFHZFBR + SnpuQ2prODNBK2x2UFBlUXlrckpvd01HdEMrM3JTVk90S29yMDhISHdpemZsUFZw + aTNpd1NUY3g5aVRaZkVmc054d0pnOGg0QlhML3dsMEVpd2lrVnMxR05tLzZBQ2Vr + TXNVakxsTGMxZ2RjNDBaNkZiSjNiRGlJdjZ1SHh1VU9qMWNwY0VRWkltQ3U2WjZP + SXRHOE5YeUtZYVdiaXY1VGVETXlNUlJKVUorcUJrNnpmZjdyazVSYVY0SmpCUE1n + dVJMSnZJSUNKZ2J1bk1MVUJybVZITFpDckdTVDdpa3VYcFl1N1JCcDRpUFVjdnpI + ZHB4R1lTOW9pWFY5SnpWM3p0eExTYnFqcVlVM2twZ3JaMlZJQU1zOTVzWnU0YmRL + TGNQWHVzRTZtck5EL1NiSnNWZ3JkVVdJNHVSVkVxQVlzQXRoZ1RacnlTUTB6OEVN + R3JVclgwVWo3MHNwR0pFRWNYSENrbXZ5cEZIOGtsbVBKZ0R6dHZ5N1N2UW5TWXht + T0J3OEM4ZkFqRnAwVHVORktjdWRveTR3bHJOa1pDU1lwYVJzRHJwOWphenZkRlpK + R0FlU09jWFhvd29saHVXckQ0WDUwZWxtOHJpNzJGcGVQUlhSUUE3c290WEp2M01x + YjFJMFptWndaSzkrcDdqUkNQNUhESFlXeDJuSk84VVFXVVlNTDN2S1d4NmVwQjMv + b1F2T2wzamF3OEIrRnp0S2FZbGVQTHpIMDBFKzkzbmdmUVRnOG1mbytYeno2NDVC + VlFxanRkU1ZlQ2greUxOc3JnaGNETTg4RENWaS9YcDlRM0JMZGJscHdDdnRlSEFT + L1RKUmJlS1RJK0ZjZ25aQy9KblBXdGtmSDI3SUNIZTltMUFvQ3NUNW9YNUs2Rkw0 + MzBwN1Q1cDlpcUEwdFM1U2dsRFVFY3VvaVVLR003SlF0T3pRK2prcUJnS2lLUUVp + dm1aQytRYWhXeFYwQlRrWGZDNGcwSml0MFFKLzdwZVVYbC93OWVMb3g1S0lvNkov + ZHpNNFhrZHRBT2ZrSU03M2U4ZkxraWh3eUNhVnJMdkh1aDMyejZ2M2lJell5WHVD + TmNTd2FHRFZGUElSaElleGJRemdxUXp1Tm9oWjB0RXNZeWlzc1dVSlJoemJtdWhk + bHRidWY1QmszSWhBMXMrV05BLzdNNmhWbFgwU2ZIMG5sNFVYOW84b2tWTkFjanBU + by90enJkMTBSMmlVVVB6MURmOVUwMmg5dTVJK21MZ1RGZGgwbGJlVzgvbkVJbGps + UWxRTzA0NTNobGJuV0lJV1NBOFkyRmxWVXkwdTROM2JIZ1d0blhRZ3hVSDd4RHd6 + Qk5xRjBXclhjTE9Jb1lpK1UvUzgxWHFzNE5nQktqeGpuVTQ5Y25oVVR0aWRkOXpq + aTdvZ3FLS0hqdnc5bi9SZ3dLa2dhM0Q0OXMxT0p2VHJTVExjWE1PamZMWWxSVFU3 + bm8zYkhBUHZSOWlWcmZJTTBYREd6MTBpclk5MXNmNFdBUDVyZjZ0VUEzZHFiTUxK + VVNBNHdoWTlycWtKR2R4VzV4WlpQT2JLdldFSnorUnI1NXFFSFlMN0VtN0UyS2dC + dUJ5dUlWaXMyMTBNYTlhM1R0R09lcWVaeURlUWk2WlM5L2FqOHhBM3dQbExGVU9u + aFkwNW1LMkd4TWo5MDhWNFNRb2NZdkh4dmt5N2ovNGROQXplT0RxendvN0lWNTJJ + RGYxUGs1WVIxZnZadnJZTFZheHRYem9mTkE5QkYwaUQ4NEhLb0VqN2FVd1NlQkNU + MUZhSEt6TStoT052NFhFVDVLSU5zYytNRUxCaldNUTVoYWlNeUhnRVhWNzVLZwo1 + d2hlWVZsVk1mSUxpdGgrblhvaENiNmFTWndEcGQzYnhjMVhIeURSWVVZCi0tLSBt + WXRaRGEyODdRZFdnS2NZZiszZXk2ZzJtcVhrT1A1bmVkVDZDcTBabW04CpQgjEPq + DM4ESZwPuj9E8J3kHRLr+i9+Xe9rEwhXcdBcoNu494k1BOpIVXrCn50gA5uyhcYI + JRBR5gnwTWDH/mQ= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + lastmodified: "2026-07-27T20:24:11Z" + mac: ENC[AES256_GCM,data:XPFKVwLkfYzGW/zk023StUEZgIc0BYSg4BkAYZxyYa5Q7HzFcYavdTsXrnMxSX0S3Kdo+aE9qEJJg29rQ00iOfAwhRP/E82yDB6a902/dhc1HghMzuJCZYh1608/XnLbOtCgZE+/mcGjLizhmuf5MxL8K42K6RK6g15V1bc/I4M=,iv:wSwjniyauHq0Ts+zNWFEZdJoxMFJLkVwStY86DZontw=,tag:Pem6orAzNqZbwVzJDA2HIw==,type:str] + pgp: + - created_at: "2026-07-27T21:00:45Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ/9HUMtBKAOnqRGN0iFi6k13R1aa0uHiL5AP6ymBRWN+8bb + ToI06b888Pe73KEBBn9QctPWdPwRT1dzP0a62I1an2tSECNryZjs2vZoooFAZCcG + jp8tJUnHJnsbJbFgSX/iU+vLFj7O/VUCgIxMqupshB8dYVtbLBQaGqV6d31wx5Im + YhjsgrN3n/vto35u0kDEGXxqkue5wr3T5rwEy5LUgEYibM1Z5y9nJcIXSIzepiXR + 6fVsvIjwl7gDusJl76BEXZOmlqC3WXK+whx25CATRgnQ4GPxJM/fbMFxQz8oKQep + Aejkjmgm1A2SxyqY+j+n9gKSirAGl9lGbbjCTOgR03MPn3EW5zBo+P0hvRBLcihS + u3Lycptf6LCQKu7EIyJ0TPq62cbm9+H/ehBWOVnXN7dOoomfbTG7uEtXvvKeXaQN + Zyr9Wqrotag7cD2y0dY3s+s3cIdnRuwQoYzGd+OuPQWcgHt7jgZ0iV3lRvoVtMWk + yvkoyGaibtB+EemoAZ+M9CvLn4wycvluhOO2H75shXgr6b1nX21LE7qIDt1wzqN7 + S34NCQ5ZO4ix9Ki6F5aaHgbEo2ilDwpKOLZFtHt4lYTs8iBKIvih38x23OSYMspV + DJR2Lihqvd0vhypq9wIyLFysvhbuVv+uH9FvQ82h0eSPwbv1gVULqfn7KBwG2jbS + XgEaoBzusP2AMznwqPllA4tme5MhvU6JlB2GgAXWyNj6AC+pe1DZaJx0PMsAzUKi + GSWj8N87Ck8wNuXnVCXyIJY17iNUOcOCkYzXXCMS5VrXCeXD9MxehA7WIRxMlLE= + =2r9L + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.3 diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml index efc7c02..3e25655 100644 --- a/secrets/hosts/qemu-nixos-btw.yaml +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -4,105 +4,145 @@ sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFRQRi8xcktF - MndyWjZIUDJxazB5d2c1UlB6aitXeFZBaXpkTG9UZ0QwZWZBbUlRTTRCRjNMaW1w - d3JJVG1WWjFBOGxJemtKSktPUjBDeGRSdzFEblJrZGxQNkJKbTlseUZmbWtzY3lH - TjY3ZEtRTm9IVEg1cU1pelREMDdjeWFIVS9ncjdOa2hEREhLVHhkc3owNUFYck9D - cDVRV1MzZ1NCWDA0b1ZVLzZsM2ZKQTRXTWdVMTdCRHg3OTFTYmVvU0JDWE8zQXFB - Z0VtTnhTWUFhb0pGSzJJaVZRcGdWbUZydkZITGhGMzk2ZWdQdHdnaEtFVDhoZVQx - RjBtR3UrSWxxR0wwSElzY2VmTkdVUEp5ZENqRXcxcnhtYlpUaG9DbXNCK3ErM0hI - MUZhb3FzemczUzZVKzRadVZIQnV6VU5vL2M4Y0UzUDMwRklMWUJxL1B5SWF0R3Ez - d2xsOWZQVzU4TzRtbzhLeEV4VXV1SFhHSmlTZXF1bW5EbVdGN2RiU2ZxanpnVlcz - N0lKblVuUmFPbURGVFN1OU1wL1VJejFDb1RyTVdjczBYU21UcTUvcU5wa0Zxa3RN - OFBoVXRIczZtUG5odTJHVWJSeFJlbWlDUGVzMVlZaVdnbmZ5V2dpbVFDdWdIUzJC - UTJpcGxrd2ljT3Y5WWNvUmJUaFh6N2U1VnpFWmZwMVpPYzlBZ0FkS1dqaUg0c2NS - ZGdLWGRhbEZxOFdyOGRmcDlPM3AwL1IzUkI2UXQ2TEhGd05IODN1aW5OeXRoMmx4 - ZW1vRHVxVll5Zk1iT2hJc1pDS1I2OXhHeHV1Wkp4MlJ5Z21lU0NuVEx0c255RFEx - VEV0Y01ycDVFR2t2UmFPbTR0cElXVk56MVErd0RKeVRWb3hSZHdlUkFhdTJVVHpo - eHFqY0kyYUM4cWUyYWdIYzZnTGpPQ2hia3psakhEYXdENGM0aXRFVjhmMTFVVWxl - MUcxSlZCekh5aldxTWhzVFgrSVlnaG5tQmpHU2dkdzdTc3J4THJ6NjdUUzdmWVNG - QjB5Qml5d3hkbUVrbEh2enp3clkzY0RBRGRqNEVhdG9aREJDRGQ0NTNjWk9rSms5 - endTdk5iUjBIaTlVMnA4UmFmbEFGOFM0TE9xY1FQemNNM05DMEE2RE9mY0tpUTJn - dWR1M2hEcjJ5UVNDTWY1QklEbEluaFlEV09HNlVyNEdvQ2lCVVlScFlTMHNXczFt - MFJQaTBXTDVnS3VUc1Z2UzN6MTh0bWlxK05iMVRBeTcxZExITVQ1THJhZUp6RnQ0 - aFQ4VHNXcjlOR0ExL0FmclNMcEZvTlo0aVhQRllLZ2FNSUdiRzErL002cGE1R2dU - UklCWitTV1NKTTVPUGs2aDJTaFFWck4wVGJoUXczYXNFK1hyRVZPeUJwTC8vOVd6 - OVQyZGtTMTYyN2dhQktsSU4vQ21zQjJkRnkyVlFuUTdGUk9SbnlZRExRK3VXRGFU - U2xtci9MajdXWW9CM3cvTEZudHFtM2lxREdubmYxVWRtNmVreHZBQ29oOUZTZVhs - M3lWWTkzZUxscG9uaGhIN003NUx3eXhlYlZaOEJNUzA0Wi9QZmpUdGlKSUpsVWt1 - TGxRd1VBYjI2YUY5WXR1KzFJZ0NFVEtYUXFpdFhPNnkwUXRLbnA1Yzh3QS9pcHBv - ZGFMS0E1d20vVnE1ZmJCczBGTU1OWGxvbk9sYTFTRHF6aG1sWW1hYjkyR0RUQzVD - YmtxU204NW95eDRVN2pDU3N0U1FScjMreUhicGRzZ0g2SWYzNU5iR1ZYdGROcFd0 - UnFtVDBkemdOOE9rbUNNRHNSTjRab2hLZFJHbHdBaWQxVElRU3Vod0lQQXEvTjl2 - ajdEVXh5VSt3Z3FINWRoaEQwL2h1L3plWU5SWTVGb3BNbEFFN3hHd2RjaG9YbUZY - YmF2clNra0JCaHNSYkZYYXVyZW8wZERtSHRBU0hMQ3BzRWY3M2Vqb1B3U2piZwps - aUsrNEZtRUVYUFNrN2hFazN0bFZNZUhqeUhibUlIdnFMd0krcUtBN244Ci0tLSA0 - MUUvbEJwOXM5UHpMaU1sSVRRTDlTbXZka1JnbUNaUE93VHVpNGllUjVvCuMkYpVt - bm4hDs++uqIBnJUdNILHKbiC9oJJs2BL60a9XmItIHDrguXbLDALjIwa5grKdi7V - smlFo7Mz4gW0pe4= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHRYb3RMZFpm + cHVpc2FKQVRsRHRZVWp2SHZjWGJRd2FBMjBHMHE0TXZmUUxRVW9yM2g1WnFMS1Jo + RW5LZzBOaFNUUHg1SjNhYjJCZW14UG1wMjhMd0t6V0pzaGdmTHhrVmw0aWJ2Znpz + aTFURUh6Ym8wZWQ1UlhiNDMrOVFmR01YdS9ZUWhITEs3RlB4ck1HWWwzK2c3TCtk + d2lWVzEzczhPTWFwTkVrSldrUnAzWnVPb2N5dFlXYjR0U2R4UXNaUGFWR3JyaEVH + UDd2cnhvaWM4WFNwS25FK056YUlKK1VMblJVbWZQTmZhblRUbGovOU9SM1YrWC8x + VDg1Z3dJdXpUY2xmQXJJYlZ2KzhUVUQzZHJIRHFEMmhKdkpXa0psbldOMStYZXQx + WnFJVldGZFVmY01meHE1V00vUW1pQ1I4OEMrdG80U0hxVm1hRDJHVG5SUWtMNVBm + YmZmRU4rdUJqN1dtNzhuZEVGMEhXNEsyc3hKQk14Nlh2RUJiYm1yaEJCdmdBZlRw + cGlKVkRBUTVPVUdzdXZ6ckRxdWwvNEdyTHFRZVNqQTlyNVBnbHp1aG5sL3h4UVBl + OFVFNlB3K3VrSnE3ekN5a3FGY0k3SFdpNE1uaGt1Y2lQNGtwOHBBejNOZUVEWnJr + STZyVFJxY3pQRER3dzlyVk9Ea3YyK3lsRWlwTlM3S2crVFZZbk9Ya1V2OFJsUHVC + OW5FaGdlQWRXaG1QKzk3TnE5MktDZEFFcmYzaWs1bEExV05lUDZ2RWg4S3dZYTQ5 + NTdmTkVuZ0sxWHhSQ05QOUZMRnNOWUFhV3J0c0hha0FGUThtSHZJRWIxb0FsVU5B + T0U5NUtPWlRtRWdEQTJjcUlJS0UxazFkUDVZMnhSZ1BuRnpGQVFXU3VFS3lnd0hB + ejVyaVdMOWYwNWdNVkV3Q0dHWDNVbUljL2VJaGNnalNaaGVXZVRRSDBoL0Z6YjBX + WDJZSzZveVh4VFhoWjNJMzB5elZLblJzMEFPQXFSYzhWcUlsdkJhbFVIZTMydVQv + azFvbTJxSnhXVXhsb0RpYzlKTEl2TjRoaHMrVTM0elVoZGNhekxpZHFJYTR4VFcy + Nk1YL21mVHNvcTNMMXJTU1lzd1J6WkFPWHdiZVUvbE0yTlg1WkMzZERwTG5rcS8r + UFlBdURtODN2aVBnaXoyc3VBTnZTK3JzMlBTWWFLbFJLYnFqaHh3Wkk0NzNVWFR1 + L2tXalJhdXdES0IrQUNPVjZ4dDBxNXRDcVBVME5GQ1JqMlhnVk4zVTdjeGt1WVFO + QjhvMFphSmhadjA2OHQvWjNzZVlZaXJneXh6cEl5dHpjZHEwNzVtUzZDK291UVRQ + UERHY0FEanB6TWN5WEpGbUlXNVk0clhCVDQ4Wmw5d09UdmtjZ0V5bWQra2dKY05K + V1FaejZLdEZQZG9jSkc3bk1oRHVoOHV0cElGazh1dXplNHpLQTZpeFVTN0d2dXFq + MDhhWHllTy9JZWpxbnJ0eThlWFFxT0c2ZURBbjB3cHg4YllqMDZSbm5WODVYb3lO + MVBSVWJuMmhORmozNHp3QmxPc3dIM0dxbjV5T3cvVGluYkFPV0l6TnBjY0JDUDJI + dXJiQXVuVmZuMXhaSE8wajdTRWRTSXEzdEpDZWtCUG94clN5bHpxQ2QyRmpmL3Z2 + SHo1eVB5MGhXRXAwMU5rWTYwWkJ4NUtOUm9YbGRGNFZuQVpHWDUvOGpxNVVhbzdH + VWhSbmVHMG5zZ3J2ZlZRNnZBRklVT2txc21waEJPK05BbVg0LzN0eGNYN003TUN6 + QnQ1YlJpbHNlMzV4dDdhWmxCQ28rMGEwWUFXWHd0NG1wQ3N2TDY3djZHV3pkVWRC + bzZ0SnhXUzNCTGpPc1djekZTWTIrdW1kbzdLYmk0ZjcydHcrYlk3UWVLRnJhT2F1 + Z2lKNnB4QzI4QUVWTFZVdmZ0R1JlakZPS2lCN1dZTVhPYzlPWnpiUXlHYVNHdwpD + RDF2SzVkbkRJcFdHT2k0bCtmQmQrMlYrV0VrQlJUaXA2cUlNM05VOVBRCi0tLSBD + YWUrTTQxeVZxTERGdy8yZ2tuUDlVSFlSWktMWjJCcFE2S0dHUUlsUENvCvD/76Cq + WcsqCyPio5cbyQRUISwjqWjSkC6WrLHe1gaxldtlsvrAxkfSP+MrmgEDsVHFtEG0 + bWzowgesvq3vSo4= -----END AGE ENCRYPTED FILE----- recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFRXcy84QXBN - cHgzNnoyYTJpMWtLS2xXc0Q1MnUvOEZxYkFJV3FyNDJIRFFMQmN6L2ZrbVlYVy9h - bzVNSlZoeHFwK2RUV0pyNnIrS2p4NW9iTnFRQ3Vqb25zU0t4ZGUrQVQ5U0RtSVFZ - b2hNdnAyWDZUZFdzM0JtU2daNEpYV0UwRHU4bklEdUpJTm91YTJNOGdpYmJ1clNx - Q0VsMUlQT3hzM1REekVOZ2UwWk5VRnNTMTRrMHJVQ1lWMUVEVjNsTzdKZDh4cmFz - WVN0RmpGUFBjRDZQRFd6ZXJCc09zTXJQeVM4MDU0bU50QUFPUFdzWTQ0c1liWDBx - ZDJROEwxb1ZHeEg0K0Z6d3JvUWxxdjBVY2VMbVFGWHl6NXdkY0VEUXN6aytWYVgy - RFdFZWZKaHBrcy95akNqM2FmcWZkWnR3WlhIWVV5OFJWWkZnUDZhcFhrb29UUURN - M05TbWNlRjl4TjFpc1g4Zkp3SEVSc1d0V3VuK1hoa2NqSUpQRHBHOEZmYnk1dVJj - VzkzN1BvZVZZa3FFVGFwRVoxUk1jbS80OWlRY2tMSVdJZ2xKQWtXZHBiVjBYQ0Vs - eUJHaVlFY0o0UFZDUWFhNUxuc3JxdGp2UDdiYzlDOGQyVk40WFR4am0vS09uakta - cndUazUyTVBpM2Zqam4vOHoxSVNjemY5dTVXVGVLSHlOMWU3YXBidGNPZUdrUHVM - NklUd0tLT2l2MWtxblN4R0o2dlgvY3FMWENlZU4yZHl5UUZGV3BaVFZjT1E2Q2FX - WlpZVHFGTUtBY1Rxa01RR2xjamZVVFNNZXBYTllKSS9sK1YwWncrdHhVSjQwcXNt - TmVYcDJzUnE3aG1FMUlIbS80NTBKSEpySzV6UnExK3RIU3hmWFJzdDZZTG9zOC9I - UUJnSGFGSTJLaVB0djJwYm05Ry9hb2kvbDJQRGpUbENsMlMxam90aG5iSUlNWWZ6 - Y3ltKy9DWGV5MFhja2lHSC9Oc0dwUDRKNDhLNERqa1pZWlhPSjJZek54SUQ1cHlm - cStqVjY3a00wczJOcEc3VlFXbGQ2MGJHOWVTMHdNL0p0NmNxLzRDR3Y3YmdXK2lQ - eGFhR2JLU3BQVVZkS0xYZzl6Ym81YWlTbkNWT1crM0tnQXREK0gyVWFTSkhSWHJQ - NFV6cTVLMGZQQjBaMDhlTXhYaCtlOEthOGJHakdDNzE0VnRtc0Q5dkx4R3FCVDdL - aVpGRHFRWktGQ0hVWW1DZmpHQXh2d0xmNkVRaUlmZ2Q2UkFvUVoyTERhVkkzUEFT - VEFHYkFvM1VlZHQvdHJHVFdVaWFCaFo1bENHSno2OUdnRE9JaENGNlNDejFsVmM1 - L3k2SGQ4dVBBMVFTaVh0blRTeUxLL0wxRkN3THBoZ1BoY0dlRzRrNnJxUkRSOWZa - TzhRYlVYOHBIQnh3MjNOZDhXbFhMMG9WQmtQZUJzMG41MlZSbm9mdGhzV1dmTUFI - a0JQN2lPWXgxb2RVaUd1S1hpL2EwZmJCV04vdWR0dVJTNitlVUtHejJlWldLaThZ - UzZTdEpualZFZHRneGFKeVZTck0vejNDL3M1bjJUdlB2anNrTVg4S0lkUUR4dEl0 - K2N1dm5yRGwxU0JuaFNNdTVQVEE3WWtGeGF2ZlcrRU9wZnl2Mm5mekwrOWR4OWwz - a1JYS1lBOWg2M3UwUzF5Z0VCSHR5UUhZQzhBcm9hU25ZaVBzRkR2dGNZckYwMDZB - ZXJyQnFHaUhWdVU2ekJkQ285SFlRU0Q5NDBCNmdoMTFZUmY3R1VjUGEzZ0t6dmQ1 - U09xVmd6bVZaaFZhQURtRjBoTmZzTDlPVEV5clNhUFd6Zm1tN09yd3BTYTl6cU9y - ZmM1KzF3RDFXMS8xdXpmZ3A1MjJQZldWNm9xSkJJVFpCak90MldwVDNlWkZmMU1u - R0JkR3lZQXFiNkF4S1JueVBDR1A0SENTTGFWZkF2OXZkeENhaENQelY4bnVFdwpw - VnZ5ejExWGpkbmRBSHJZRWRxN0srNURIbXF0Qkl1N0NLL0xkQjlIYW8wCi0tLSBT - QWZndEd6MkNvYWhhR0FnQVA5dHh4dld3YllVN1Q1bEZUY1ZsY3JhUkhnCnVzRC8I - 1+3qjqtysWdyWV9/dfDxMfWSo6m1hrQF7iltgXkjPzT1ELYVesJwqoRmOyRp9mVD - zcyHTywxxm/7wPg= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGQvYkp2Rnc1 + Mk8yZDZTcDRxaUxxTlZUTlNEMzgwQk41dXUvOGM5bEI4V0RpOTY0YTBJOTk3K1lT + SnY0bVVOSm5Za3h4eFhFYkU0N0RwWjg2MjJvK05VdWpkZG5KSnhOMkR4MmI4VUJM + N1RWNldTUTYyWTBwclhvdWxGRWhQYXUyNGorZWdkVkJkWDFPOUR2cTA2c0c3NTF2 + NGFnb0QrSWQrMlVCNmQ5QmVPSTNkQmVOcUtIZk9ubmUxOHR3a245L2dhdmp1bjg0 + TGlVV2RIdlRSelNLcVcvS2V6eWRlWll6QlJZUmkwdDI3S3d0bVJkcTUvY0h1OFhu + RjY3bUtVS3VnbGd0MXNWdit5Z3lSS3BkNFkxRVZuMy9HQkhBVFQxQVo5bjVOb0Ro + cFZ2eFJsY0tJcFM2YWc0Uys4c3VPMGZzU0ZMQkMrREZuZ20xK2REZDFBbWVWckFt + T3pHMzNPL2hsTS94Z1krM0tmbkI5ZS90R2ZMcTZTTklRdGplQ1llNkpvMVk3WjQr + RWl4NkhoZmNnQ1VmU1liK29wNy9yMjJXb2RPUXVTRlhwV1hCVmNkRk1IMXFnbDZX + aHhMUlJpSEplNEdER3dGWnBPTzN3OHh2YWxpU0Z1MnF2eVh0aWtWMlJ4bENmK2p2 + c2lTakpNeFJBSEJ5dHBKM05qR2hqNHZCWWpWWkVBN0w0RWNmNFZlNExhelU3OTlD + bUZDRUlibHBiaGk4eFhlRGpxYW1GbllTMWlUY2o5MU44R203WUxzUGJzL2FaT08x + bjl3M3ExNlM5N0EyQk5TdDdjc2RtL3JPYXd6QzN3c3NHUWZhcUNycGRNSFg2VFhU + dXdQSU84T0hTNmJEQXRicFJxWUtxUTJCU2lsNHdHTVZaeWNEb0gyb1l4REU4YWRY + VUZDWjVEUk5uSjRRVnloWkpJYnpqbHdaWHplZ2xFSHgxRE10Zk5md2R4dm5VVzcy + dTJ5UmpVRHQ2SkFIWnpGcEw1N1p2MUJmeCttMWViQUJROGxWdWtpTkd1bW5lQ3FF + cWdkamhjdlk2M2hKQ1Q4ckdtTys1TTlLc0R3b0QydjYycDZuOUhEWHViTlhCRDJt + NkRWZFJsNVBUY2dxV0xUcUR2RlhKY2o3Y3NqMTAzb2tvdTJlTnpmYXF6bDI3a1k1 + MU9uckFzYWtLa05PcHlxVFNYL0pqem81RkN0Q3dPT3MrOHZSR0xkVDA5UDFSUUV3 + ZVRkNVpzQmtib20zWGxSQjBXWklvbHV4ckhtQzlFeWtycXMzRTg2T0htNENuSG9l + VVAxcmxrZ1ZuMzBhMUhsYnU4YXhmd3FGK0pLOFdwNWJzRDFadUNZeVY0amc5dCt5 + eHNoa2I5dlBuWlAyRmFiMWRicnZXeFU5ZkF6TnVoT1lLc0tySFRWeTFiYytxR3lF + WUpSVzcyVTdJV0FhWGVmb0hPNS8wQi9XU0hxQ1pENHo4MXR1K3JuTVd6TldnSEIx + Nk1tbUtEMEU4c3FkQ1dZV3dCbjlLa0lrelAydjVqTWhTSFMwTkNWOTNpd3FnaWpr + ZjJSTElMODAwcFM3QWNXeHhseW5QZk5UcWY5ZmxveVZCalZtaEpvTXBrV2d1MGx4 + Ky92bEp4WnlTWi9nMGk0S2hjTmtmSXlkRGU1OFIxNGYwMnowRDRSaHY3dzNWN2lX + K0VBM3ByamhQV2Q4d1V1K1c2VXArY3FsTXliZEVpc2RRT3JxQ0tMUHZpYnFJUXBm + cDFXVFhVblNjaEhiNnkyOE9pRm5rSUNLRHRZOVA4czlFci9WOTFsbFVMbW1GbklY + blU5Nk9taXhxMURNWDMrUWR4UWVsQkdaWStnTGl2ZWNlREFHbEZBc2loYUd0c00z + cENHd09haVZidTQrNFpTdlpzTjBHRzRFbzdaUzBzNERyRnJLTDBwSERKNFgrTmFH + NG5vMERzTzFzMUVTaFFUcHJEOWM4bVNiNldsVHVOd04zZUNBbFFtM3hVMURKdwpr + MG54OFVWR2ZsaU9lL3JISkswUW12eXdsK05ONjV1RU1VYnpzOGpwd3l3Ci0tLSBh + NUwyWHN2alB5NWIyWGRQczBOak5QcEpCSmRYaHc0N0w5eEhrNFlQaWpNCoVdrGew + 8jBtrBpi6ANZpQ3qSZnJQpWO7w6CJjWlcagLIQWWghuWUZXHtXWjDBx+sulnhPAT + T8AwJV5RPJteQY8= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHFRVlpCcjhl + WU10SnBPZWZ6K01KcTZIdjl3TGpkaVcxVUpWV3l6U1pVYVpDWXFQTVJNZnNkREZS + Qy9LSDY1RUlNcGVYSnUyZkZVNll3K3E0UUM2SnNOR1M2ckZhQy82czJvOWZoQWlS + S2I1Y1ZUSlJsNzNqZERsamltd3RndWMyZ0gxSXhJRHcyUkdPdzZmTWIrcGxteDB4 + RThhRlJoSm5zUEJKVytwa1pneHZoT3FwajU0Qy9kYmh1NzY5a2lIdTJPV1pTcnp0 + M1JjakdEYXhyZGE5UkNZU2MxU0doQW9DU3hYd25NM2U3RHRLRE00Nk9uU3ZQc1o5 + ZklXVlBEM01UdDdWMXVINXEwL2VtSUtKOHZMWmdGcGdGb09vaGlxZk05Zk9wMitr + eVZTMnlmYzh2ZzduT1dNMmtqeHpmd0VSL3phRm5uOHVBZjVUNzlhVGtjYnIxaktW + ZWh2SkVOVmNZNUZiY0NuRXJQSTliYXp6VEc3V29HMUpKV2JGUCt5dXVIZFJDYXkr + aGhTT3RlTjg1YW95RG1wdDFHTk41OFBJQlRsdy9hVEVkVGRhVU1HZGxBTzlPbG1M + Q0FaWDhONDhVWkN0RkpwbThOQzNHWnNlejdrSUsyQzRYeE11eGN6WXR2bmxqMzNM + YlYySkxBL0FEQTM0dTlSRXRiQk1ROWY1OGZqWW96aVFnVW5uL2dDTW5VcW90bGJu + aFJ5ck43VE9pQUVvY3JhRytGaXpIZEpCMUovRXV5ZlB3ODdpV2RDYWVhdGMvQmdI + NUhjOVVSaEtUZjlzak1sUm15OGhCNEI4WFFyL3dXR241c1F4Z3ZNUkFjeU54K0ZU + NkFTUlQ4Uk1zcnRreWlrOUtZMG85UXFQaE5xdnR6NkhEaTJaNDdEdFV0WTNLSk4z + S0N4Z2pPR2tyK0NBQkRVV1NtRTMzVW5lVXQraWJTVmpEU2VndC9uM1BqeWV4SXJ0 + ZkwwUzEySW03d2lhUEhHWnlIV2VvL3NrOTArVDI2MVR1N3hQNmdGdmVKNFplR2FW + bWN4bFFtU3NzOFcvVFBQM2VIajM1RlBXMlZFVVpHeXFHNmJDdm5WUVUrTmxIblBw + WWNlZEtNbGtOOXZHaWNUTk9sUWt6SG4yZU4yT0M4QXJFMmJGenVjRERMWXBKWjJz + YWtaN284QmFyczI4QlVFQ3VYZXZOQUd1Sk9SRXFneGNIMGd2SU1oMjBtd0d3aEgv + Q2VLbXhMSExXV2M2aU82SXJxdGFDb3Fha25sOVhhNWNOcEduMVlLNW03Wm5IcmlP + SWI4WXFwTjVYaTZYZjVhQnljOWk5cE5GTFFLdmFuc2h6TDkremoxZ2F1STY0WVpj + cXdHSUlXOGRWbkZQY0hCcU44aVRSaXFsQ2VsSmIwZnVtbmo0b3FCSVRVazY4cnVN + NXRQSmUxUlhWV2xKc2ppbEJtVEtkYU96WnNCM0FDUll2VUpmejNNZWxCOUt1eWxT + OWNlQXg3aWpuMkpkampZYXNDeXE2M01SdzFJMjVoOEdHS3hLSXZJWVZWTDJETlox + aUk0N1JidlJkcVY2Zk1QYWgzdEI4QTB0ZnRib0NRRkx6Q2Q4MzMvOGFZQ1dvOXhh + dTBvN2RKNjFvL1IzTUNWZjRLSnY5TWVETXVCQUdSNWRSeURKSExqcCtoUHZaRkRk + VWdad3Q0N0d1YWdhdG1VRXI5eTVtMWowWkZjTVA5UkZPclV1NUxGdkliTjE5WU4x + ekxsRUpaOFVqOHRuZFVzQnVPV2o4d1BpeWM4dHJ0UGJRSU1UQUdVaUh2TCswdFlW + Njltc1hXOFR3SmFWQWxjeGk2Y1QzK2QzanhXN01rMm4wb25OMGVnL1BveS9xVHZw + TjE3Mm8zVmZDK1FKVi9JTjNDZlRocm5LbStXZ0lmRHVIVWJsTnAwK01rVmRQc09u + Vy9TUEJlZDJhejJSRG9wNmppdnBqOWcxMjlsTGU0K0U0QnI3YzRNU3FxaUZQQQpK + dzlpN1VXdjdaWHNSNExlUmNFb2JSYVR5clBGaUhkNElNenlTOEExbVE4Ci0tLSBV + NWFMbDV1cUo3L3VYay9VTmt3NGRJc1RyUXZCbkd3YnNjSEtpeTY4MXIwCoEWfbH2 + ReZnNIHoCaDD5aDLSlhWujIj9Ba1IQvBSApQNc14nluM6Tkz5k4xqkLFK+rZGmkT + r3Y35STwhNry02g= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa lastmodified: "2026-07-22T21:12:14Z" mac: ENC[AES256_GCM,data:Ki4Z8/h8mqYdiT/CC5AHoFfB4GON2y9D1BGEjcTRCiURZhmZff7RjlM7mHUe0IQX+R8o0WQy7qqCQXDfEGO6mUd4CwD2KNZP9mN3wA5OjZsd5biNlfQSBECvOgs3uuxFyQTE4B9Vb827Fxo2ndFKkhU5PnuElkktuB/HyFquByM=,iv:i53tiSU/+FGe+sGnBCbUdWHz4TBChBQkJB5j4g3eG+k=,tag:Nm5/ZJyLvgURWLVpPJcTFA==,type:str] pgp: - - created_at: "2026-07-22T21:10:16Z" + - created_at: "2026-07-27T21:01:04Z" enc: |- -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ/9HW3t9MVEBXQHvZW6M1EUX34uf4zYnUssxZDIwkJTwPNi - aVVph8lJBiF0H6TIELbl7pTwdHzUDxFl2epoPr+IIYOgrbO+vmVpo/kGjBDzaAiM - 7HJPk3u9+NHhzf8A1dXtyW5iIiC124KFkhPn0hKW5LQQNjsSTm/Q692ADK16Vmlq - CM3L/usYhD0wgFETncGrT0SY23aFSWFgyOq29XMVOhV7eDmmhJg3pl07Bs3LyZOY - RWuKCgIS5Xnu53dSMEHXQyKXaKAN4bcI47ZyDIGfeta1zmuLGHBtvW1lRrFG25MB - V/SiHwUYtd6V6MgPD3XrD+IudUpU41zDM/XDQU63AWvLk4ojz4sHXQy/hrNh4VVg - gvl/8DQjWzKRlYVf6u5PkCYZfSqvYk7//5RRRW20PvyOc4aEps4ThyajrHYSp+70 - qe8fyeN/WC/3OF7rFRDNfcfuy/FJ3EhsBmAJOiZbrP/gpjaPCv0gtiUjBkP1p9Qi - PGne/Qa6Yx58gju2AEkowypTJUX2A1/0oGA014JJwS44clPHkEq3aWAaOE0Y9bRv - mOFd3SAyQ9BxXxMkN2y8ZxWIDVfX1Fj34QTuoUlbTO6X2gg4tsODH2K35BavFGL0 - Ye2wPxS2/a4o8T+1lUAqKhe6Znft8d5N+POORzO045/IfTJKhfU0Z4XGSTtyCUfS - XgHiTy9ZZ9lO5gmKbi7mWYkC69LkZN7khw46bTUwpg6wrI9kpNQS6q9t9+GLNFzx - 5basrf6aGtTFiM0apdzCobhcO9NJAyVt/EAAUB+YZJOdq+UfkaHKT8zZ1cYjgXU= - =kvD/ + hQIMA9/PFHehMxwxAQ//T26Y9AmryFz0ENPpudzv31q27lMViqb0NjuCzu13rnXj + P3aWvmkiZm9fQegDya2ApYNHTIYjUhAuiAuf1u7AmI9pXlN4OPtixnjDhJBvzX95 + MELJP843cVGYNtPUNBbb8K+17QGL7MFnFrTkFQ1fmKehFDfCmWAKSfhpENwCVxH1 + dP8SvYOa6qyDKbpJH/PnEEKKxVoS0gL9TuFY+8F9NbZQVmkfVvXgJ5fqhZC4AIwG + T+PTP67jRiPp/8SDn8/qeQRa7HTQ85VYN8B41J2QotgkU2GirjiSkkPhy+sl4PAS + GH62R4kKvW0BN0phVQLiVP+nEPjxzzs11KsXGp6XFvrkOkyie+cKgfgl2Dp/Dehh + YpZ0JJAiUSQL1IYtZO5+GpaNiSe+0qUPHSxJg5k4RqJZdhtBJ9p71pzqx4My1dIv + NKfkL+WkAtFY6L3+hjZfnLB4uEN1R//zg22S3OUoJd2sIVAL6M9o1GaztNoSfOIY + ecigzk9bmlMbk7x01XJFn/AbbHyuMsCiHzrw/XUR9Rtyv6KYaJ0QQnBnunoNozfo + 4YsiZrKdetyIYCcruMda5CGaFhESTYkWmu2FI5rhN85RdrlP+wkL8cjfBuITrf5o + MiqhrIxvxo3WCQWwOoufbf6ASqhV1YJC/+/+xqius/OuYAQs2Ejh/7N67do4pE/S + XgHVXOih9egz7kAsEmSQXZ7IbYenMlelaH/J/bzD6jupeyI/63OwExJbB4va8Uxd + wFnpg4OuucRx6Fhw6diGGTkSRvoLcAUgdW0o/hWXEkUkQC3ZpO8AmTSrwiYJtHk= + =5gSo -----END PGP MESSAGE----- fp: "0x416CF1EF9AAF90BC" unencrypted_suffix: _unencrypted diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index ad7a47b..8bb37da 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -5,105 +5,145 @@ sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGY1bmJrUU1N - Nlp3V2lQMU55R0VUVHdCZWpjK0pPTXkwQStpazJ6bjBxUWZ2WmJnZHJ0ZWc3THYy - alZ2QTRLUk1ZVk5oc2ZtcjRaUzBwQmV4d3gxZVV3ZmpYUlBGaFYwN0orSkcxR3dw - bHZaRHhzWXhyNkpmOWNZaWZzamJWQmxZZzN2M0lwSURxcFFhTTAvTHBuaGhmVEVj - QUF5TXFwN0Vtend6eUZTaVE3N2lIR016UTViV2wvcWVJL1BnVmp3ZjhqRWN6VGFn - WHdwb2ZrNUtkUmpmU1NnSk9hdkdNL3pvVnpwOGxvaEZMNzR0Q05qdUxyM3dGMEpn - OGRlUU5oZ3kxUjFkaTJrZkNtZFd3Ry9IdDB1NUhzT3hhVTFuOGNVSGI2alQzQ1A5 - YWRTMUgycXBmMFo4a3hTMGJ1MTRVYnIrVGxrOHluWXZuaFY3UGFzRVk0dW9pS2dI - bmx0SWZFdUEvWVlxbHZQcCtDbTUwbGEyLzZOUGVtcC9IRVRrNE1WaVZFdy9YMCtU - Q1ZuZGlYWEpuQ2NzYmRoOTBxTnhEeW9uSHA5TmczajMxK241aUJMdEExOE5pU00w - eWRDbFcySU9SOWRWNldpUjFvZDhCVnM2SkNQK25QZmZVLzFVcXZNbG5yQTRUdUYz - WlhaMUlBRjgzaE9pTEdhemZqZ3lPbEl2TjI3aWpFYUZ0N0lkUm5ldWxRTXpreWZF - djYvc1YzTHhjZ0p2blcrZ29WdHpYbUVrbnR0Vzczd09JVVhDbkZJcExLUks3MWV5 - YjU4UTUvRTV5UDVSay9QandFT2Jja1pDNUdNSnc5QW1kV3h1cndxbU5vNGN6blNZ - R2grRmg1MXhpdzdxRi9ncHdabTZtSFprN0hSTXNTMGNGQm5WYldUeEVRWEx6cG15 - T0dOZ3ZCNVdQQTF3aTE4ZkN5aUpvOFJ4WFN0Wk5sY2JiYWlUeU00ZnVjOGgrc0Nz - c3hqY2pRRWFVS1dSeU1XTkxaL1ByRHpxbmo4c0tIeHB5R3YyQklnMjBFcTVDd3JP - VzlaNG5TMXhNdW9WejVST1o5YTVBU3JMNFhESWFTR0laVk1OS3AySGl1N2J3aGFZ - RDV6ZVRVTGRoRVhUeUJ6WUZ1c3ZGZndRTThUQ3p5SGRNdTlNUHNUOWVYWnZMQnRH - TDhmenhkbmgySk5IZWl6dzhMYlpFVHhQdUE2M3Y5YUVabGFQVlV6ZjRGaVRvWnlw - MWhhUlJvZk9QZHovSS9qOWtGNGRiNmNzdGkvdTRuTFh5NlZBbEgwWmJlSFhLYmdz - S2o0SGNndDBQK0ZFWUw5bjllNjJnQVg3Uk1Mc3Fla3dZMTRDUm52RGZZNUh5OTFr - WWZNdC9hRm5iOHpPUVkzWFVMdDUzMVR4dmVYa01oRnBUMk51ZFpNem44RTVtVUJo - dml0eVZXRUgvdUh5dG1Cc3hLem81UVJ5MVZ4ZGVRMExSZnAyRlpVU0h4cmQvNENL - L3AyNkhOV2dhbVNUNU5uOGxodkpXY0lxSFkvbUwvNHVuNTg1RXl6TUlpcHEzUXRp - VHNpZ3pCZkc0WGhIR0FLT3V3WUtya3R6OFR0dHdHZ1pSTTkyTC9lTFF6Sk91aTgr - Tkh1VVVxb0JxNVFIS2VKdjJCeFkyeW1XR1ZLUkV0dlRObWh4T25RRFlBekxLSDdq - YThYa1JmZ0lBOSswU1phZ2c5Sk1rRkF6QVhiMFVhR01KczNndmUwUWEzTHFBVFlt - VHFxR1pwdnJySEtsSkpDTCt3UnNMSzIxSFJtTWNJRm9BVElJeDNyc1VMNHRZaFFq - Szk1dW5OQm1WZWFiQVhvVTgrc3Fqa241Y3JkcXQ5UG9JdHpRWDRhRDlZQWpmdWtW - RjlkWk8wSkVoOW93VTJyUHpNT3BVNkJkVGMyZHdTV0x2Wk5OSktnUXBnUnRDQ21t - eFhPQ2xPUGNsaHhibVpnTHlUeEE4QzZLd1JlNGR0S3FiMHdKblVRRW1uR1hjdwpW - NEZiTWdCdmVITk51Vkh3djVPZlpvN0hqc05RdnZiZVcrbEJ1NEhjKzFzCi0tLSA0 - SjMzZEVZOGF3enVKTC9KWUFsdE5BbWJFd3NuSitRSU5CaWJQcnVMbCt3CqOeP5Zf - Jx71Bw1LFgP1++G4CljkwTKlz7mk8iGHDNPFgdW1AQXZBhuRfwXpo5y0Y9gIsi70 - 1y4LIhTJ1h3IIZ4= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFkzTXNQVDF5 + eVZaMjJhVWVGNkJpbkNOZFp1OXNXNFZSSkwrcGlHay9PdG93LzdLaUs2NmNaUDNy + SlVUS0JqWmh0SnpTYkJWVk1LdHU3ZE9mZEVYa2MyNnN5Vlg3clFpeHpsLzQ0Q0xP + Y3lJMzdYVG5QS0lvaldZeFRIcThrUmxMaTV1TkpManhzY05EZmlnWngyb2VsSlhQ + TU5rNnBWK08wVlYzcWE2UWZST0xDTVJiZmpBN1pPMVYwVHJWaFREbDBCVHpDbDNs + OUFYcENtaFF5WGFSWFVMUU5ub3FYYVBJdFE2clljZWVpYm1uOHV0MHVTbjRVT2FB + eWZ2NnB3Zm1YcE4yQWt3YTE0UW8yeUUwTE9MSEI1OVhOY2tSU0V5b2JPQmhIYUxK + WHh6cTB1NnRKYk45MExuN3R3amU5YWptZ2s2T1ZuWG1TMUUvdEZTVkJoczljcno2 + Slg5TXE4MkM4RTc1L3pXQlVsbmtKMWxQVXRPS1hFbVZVV0svcXlYMXhCMUZVMU5u + eSt4QWxQenozU2dBb2lMcGJCSlBFMElvam9uVDR3dzZ4NWdtWWErd21NMlVERkRV + WS9aK3RCbDZZYlg1bmt3bStDL3Zxbk5iVVBJZ3o3cHNoaU1ucGluUjc0UHUxUnFk + VTh2eEg1ZGgvV2hCVC9yQnN2UittWVJjWi9yazlmVHNDUFlNWnRoOE0zcjBkUHdz + WjV3cEx3TDdhRjlQbEIzS3V0K2pQSVdRa0NUc3R4OCs5WmlaNHhoNG9RREY5cHAy + QktFb3lFL3I5bG1YTmwwaW5CL0lLaHJhejYrb2xhWmQ1MjFDYUtNcDc4aXBjSnIw + SkZhbWN4UlBvRkV6Wk9GQTYvUm5HR0ZQdDNjVEJmTTJNeHZQQ0Q2eFFMV0txUW5p + Z25BblVjTzJuMGpvWnJiTytrYi9FVm9PK1JsdWpab1k2ZDIraHpsb3N6VXVoeTk2 + Nk5pMmtGYjZCd250RjJaUVVCa0pZTlJkVDhUZEV4QU9MVkw3N2dEQ3BFMDJyc0tu + ZGh1amhud090Y3JCbmN6Vjh6aHlWMUk0RHUyR3VZWUJJc0RkY2hnYUpuaDF0Wktt + SWdmYVM2Vi9WY0lMU0s1Q0gwUGgvZDl1eEJqZWxaMFExUkVadHBlbGFxdzgwU3Nm + bHkvKzAvMVpZcjQwRlBUZ0R1cWxuTTJUSUd5dStidTNRNXQ5ejlQYm5XY2UzQUVh + Yks5aVBsZ0dxWWFsK3JFRTY3TGdRcUhXb2JEemxua3lMRnpQYS9LZDVvQUlsV1h1 + ZndvT2xFeFUwZkhEVG9jSEJZZy9Gb2gxVDJIc2ZpdDBXNmZuWjN2blRrRi9maG85 + ZG9yc0VzSGdSR2U0MmRlb0d2U1lpOG9NZ2pzbEg5QWJYRHpwY2w1M0w0UGZtNEdJ + bDM2SU9tQ05PZ1JpMnBsOWsxYlV3YmZkc3grcGVvU0pORkNJU3g2dm5LV3ZXRVNZ + S2gzLzB0VzdDMVRrYmpqZjRwTHpFYTNnaDR6OU5tUDlIdDlDYVd4cysvMGtoSXhx + cHhheHk5b2paV2N4ZkxkUVJ6MXE0eTJNWlJLQzFFMFJpZW9wcGRvcVByZ0VZdUVK + c1FES3pPcHZZRHppbnZrZ21rbVBkb1FiWXk2UnI5cnJPNU1Dc0JvU0F4ZW5Ybjk3 + V3M1KzFTd2RndHVKYk1kQ3V0Tm9jbXcydkVNVjF6UVJlTmdycmxnQWdHWkluOFBX + RnRWcXhzdXN5QVkyQ3pIQkdVNGlwMWMrMXNiREFXNkJNQllrQUFlanFIUDh4Q1Y0 + ZlA0N2lMRy9yVjdBbnphVDR5OEppMkdWM2F1UE1PcVFLeE9aVUJiN0R0NDBNY25L + WnVvcEpNKyt4czRkUW9YWHYzTE5QQm9sS0ZmdWlkL3B4WlJFQ1JJcnVaYkpXZVJx + enlTTStpWjBtY0hyUXV6ZXRybmpWRlZBMWlpUU8wZDY4bGdMRXZIN3F3UkhJdwpl + QnQzU1NFRUFLaktNOXNHa0E3VjNiQ2s0S0E5Vy80am5ncG0rODhVUlpFCi0tLSBs + dWhweHRKL3ZSbnFkVFlRRjdNYi8wQTBNZy9vNjhUYzc0TUR3Qm5pWGtJCgrVmRFq + l7q96wfm5Hs05imwlYsOODk0OGxa4u9q8LPEGynvcwwLekNY8FZR2HP3kSZxM+K3 + fbGTG8j/kFYzmUo= -----END AGE ENCRYPTED FILE----- recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IENFMyt3Rjdi - QWpHNkY2WEJUbC9xKzJ2QVJhNjRpbnFub2F3V3hXekFSUlNqL0lVNHhHN1ovK2d4 - MUhwbHNqaTdVb3U3QjlRNTlOMzQ3ZFpKZ1QrQXFId0I4OVdHa21iREFyd04wSzM1 - UEVuaUphU1BGQW9aYzE2N3A3SVlxcUtnWVUrYUxRYnczRHdWUWtCZ3E4WkRKOVRz - dXVqcEhSMHpqM2p2SXQ4dTZIdDNhdnQvbTlYMDREV0tHYlBnOG1ZZEZpL0FaS1ZZ - SzI1d0ZlaWI4QWc3TUZTcWZEdDBFSEZsTEVSdVhZMHVaMC9mYTBMQjY0RHZVbmZk - bW1TSUMvZDVXb3FPaUxWQ1RLeFNaMjllWkprMEJmVkp1RW1QR25aampqUEtLUmZo - L1pEK3d0d2FoUTBBcWxHWitudWtMWTIyRnVWeWp4UFlDWkIvT2lrVW5sSDVLV05w - K3VrSXBBM0t3c3dJMEh4OW54c21iTE11c3RYUlJZZkxCYWY5V0JHSUZDQXgyUUs5 - MzZ3eHVhY3VUb081UDhqM1pBM3JENkoxaFk0a0ROa3hNbWMrTWxqNFRXTSswdFVG - K3ZiNWJhWEg0VVRwQUNXb211R2hjMWs5VG9LelpuZG5RcGNTZVhNNnRBMThHZkk5 - VFRnM1Qva1NUUVI5WmpVQ25GVU5Dc0pCVDIzZ1ZnMEpxTFYrYnhtRnBlZ1prSWJB - NklnUHlnWUVlakdFK2hqazRvdTN4dFFYNFhpQUk0RjRjZ1BtT2FSZFhTWFVnellF - azBWL2ZNbzk3aXN2MnFNa1lMMFNCK1EvbVhOSXVmSVpTai93RmZsS1IwbTF5TjQ0 - WmUrWFFmRUZpVTlTOFgwOVVSMEt0TmJGWE1iNHBBKzFzcks4OVRKZjZVUVlvcUxY - Y3FSZVZMVkgwd3VITWxnTWZITDZjSU14TjJyZTkyQU9DeHpodEo1UStqY2ZIVnVS - WFdXYTVIZzJKWlJJdklNUnBiTFpLL1BmeTNXSjJReUF6YnkzdnYvTEdNWmluSjFl - dk5vNVB5NGM3SHkzMnQ5cnNTcjV5WWhzN3pDTDVoVklXeDZ5UVlNcDNCRzg0bXgr - UUpPQjRic2k4bnM0M2dza3hDa1hOT0gyWVRYcE1IVVFyNDVGRk5hTWRFM0JxMklD - OXl0VlRoQVNqQ1c1Y0RxcEpqUVppdXFUTHFhVFpqZXBZbVZ2amdyNzEwVklIczJQ - V2RyTVNKdGV1aDAyZmhXQlZqajdkZnNOOE5oKzBDZUU1cm03RTJETjFIYUU4YVFR - cGZkVmVOV2NlNTlZSi9JSGdIUFpNL0hZK3BVeFdpSkV3QVRFV1RXcmtuejJnNVF0 - Z3JBK2J1bnZ2RG5UbHQvTnR0c3g3VUt5TldxZGN3dmNTVnZ0OXJqUmZuUDZjQWVD - Y1JzdDBBcFJwNmZ1ektORjZpbFNoejNkYkl2c3NVSkIzbmIvTVQwOTFWNlh6NkZQ - OC9rWFRDT01HZllZUWVPYVNjaFh2Z1dUK056QlRoanZyMDFNMFVudlV3bzRFRE1E - VGxXWUZ4V2tuNjNSMzRDYXhaejlxZm5IV01LZGhxeHUyczJBaHg3Nm1iQ08xOEtk - WDVlYkNtZlF4Y1JBQnhBT1JEcDBvbXhvcS91OWMxT1VZRS9iRmdlZEdLNnd6aDZT - LzRnQjFMUXM2TE55R1o1RVFKSEw5RXk0VU8vSnVBekdPbDdhQnBpSEdPN3JrZ3Ix - TGVMbnN3Rk9aNGdFSHhLZGxrVXEyNlZSQTFJeUtTOHB6Q0Q0aW5Qc3hwR0I4UVNB - OGR1UkZjb0tsbXBqMWNJNkpndWhtMGgxbmJZWE4vSE1xVlhZdGY4UXFhTkdtblE1 - M3ZsbGp4eUFIMmNWQVFiKzFvbnVRbzV4WEk4UGF0Qm0vQUczN3NFUFQwYTRYVzU1 - RlRHVSt1TUhwMnJaUkVEa2FYU1ZVd0RqRmRCVTIwK0VrMVlxSUF3SGVqSGRPdwpo - am11ekJGN0IwQ09PVzFJeWw4Z3U3bmhKbXdSN1I1elFaYVh4S1lUOE9JCi0tLSBF - R1AyRlFlUkF2ZnhkVWJYWDZZdEFMdEhhOE80R3hmREpKUGgzc2hFV0RZCt6RhjwU - LmR9y4xtwfoW+f9R84+ACCcWwqzGQwOIRXc0zaUqaXjqNXZDDUjgNOnQP/iXQgDB - aVxhFakbIzH+POY= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IElTVXQ3ODBP + WmQxVHpXSHlpWHNoU1RpWGppNml3dzBJYWphaG5jQ05oRUhHMmViOE5Da0paQ05y + eWdVRENQU2pxVlFFZWFPc2RvdUlXVXVpVHhRRXZWbzNQOUlnNlVDZmF3SVo0Q2dq + dnhySWJMa3liNkxONm5NNEw5ZEtQYmcyckFocWRVSzJZMThuSTFCL0NmTFlQeXJQ + VnI3ZndFdFFFZlhKSGpQSEkyVE81ei9yQkxUQUtxMFZsL1BjQUJVQ1I0YllDclha + a0VtaHN0eWtDUTRsU2FMUE1jU3luZERub1lHK3ViQU15V1RicjM0dFRqVzVHY0lY + YkxycStxVXJIeGl6NGFZbWxlUTI0SVBUdzcxVlVpS3dvQStPcHRNc09qNTdMWG1E + YkRxQlpSQ2NrdDI2aHZ1RzFXMC9MdURMS0pPVm0xWFErVW8rTldQeHZRYVVIQzdC + cktzckpqYkRyZXRTQjVrMEVmTkRCV2VTaXhEWkF4d2Z0SDV4YUEzYTZRVzA1Uk5l + QlVuNk5pS21rVjVWanV6eGw0ZkRRMmp1QkV5dzNHYmd2aWRiYU03bFNtZWhvMzdL + eFJyYm04UnY0NjZzNGJvbk5IekhHZlhNaVI0VFljbTJndzhwdTdVNHo4emQ0TXFk + M3VHK2JsbjM3SU9wTjlIb1N0Wm5RYW9SYUtnL3ZZdklXdFlmWXVjTWVxa1c1bWYv + dmRDMm5nR3ZGRXNhYTJDbldZbzY4ZnFzbmxka0Ivc3crNGFlNzNhUUYvYVpnUHBS + MDRvVEdrSTlFd3lNYTFSN1VBb3dZYkk2b1B1cTVoNGZDa01wbTVKYlVrOXZLTndw + MWp3L2pGU003ME5ieXR0WmJXd05WMCtCQlN0RElhR3RaSElHbjBwbVFGL0QzRmFI + UHRWbk1xUkc2emlaOWQ4MDk3bThuYTZMNzBGck1QaFQweHpTQVBlU0N1ajNWalZu + QWtJQWl0bVNnc2hEOVNLT1hPb1NqQnozN0xiZHhVSVI5bDVkQUJUSDkvUkh4d2c3 + Sy9WU05SRFNNUXlaQ2NkWmYwVFVhT2d5bGpBVUNOMmtLNXNBdjNwa0o5aXY0UEtX + N1RFUjJQVVQ4aitXRTVnVzdxMkI5WjE2SkRWVVJ1bkcxRlJ2c1A5R0lvVUNxREp0 + bnlxVWJMWndFZjNTYk45Ri9oMnJPemJXM2h1d2swa3R4QkVPeWJvZHFjTGVTcTdX + YjRQRTg3bGltKzVuTnUvdEZ1QzZRWFd2S3BLMS9SdVZrUEhZWWkzbXBMditTYUcw + WmE1ZVgwOE96ZEx6cCt2ZzBjdGozUUhob01PVjltcXNhRG1EcnNha3FHbHpCcWN0 + UG9BYXk0cmpGTmdJN3hlakhOeWNsWXh6eXpTdU43WTdhbWFlbDRKbm9JSnZXb3VI + eS9tSmx4cklIYllYUWx1anJCd1hjUmxmQ2wwdC96SmZnZ1BOVDhFSnFOYWNIZmxm + UC9uQTQ3ejVLT0lmREk1Qzk2UTczTTZyL1NYdTRIMWtJSjIrVTlXbE9VTWpjTjlG + TXM4T3J0RkJqdEF4elUzSGFBRWhsb0VacXRMVkxqeHpMTU9kbGsybS9WbGVGRFRF + aHM4aWU5VVE2WnFlZ0Jxc05oVHQ2MHYxNndVWGwyODVISkpLSzhmRVNvQjRUQ0gx + TTZEMUpUT0poV1JORG1vUnhRNXNvS2xabzFKckJMWnN2d1NjcWtrWHJtRlN6dStq + R2ZJVy9jYks1YXVKSFArZXR3RkNSRnpLbFJHTktMaFF4dTNmc2tGcTNKUFZNQTVy + dDAwdm96TGtGYW53MEJHSllldzEwR0ozbHVJbHJqVEVHZW50Z2c3NlFjYWovYUxi + M3FRSDJZZURYWlZUSTlidDcyRzhwWFFIN0VkSWt4NUFQZ0M5UDdUY0w4U1poNHZD + bHJaQm40YUhMZndMd3I5SUwvZ0ZZYzlFenIweXlyNmpnanFFZDZHU0p3MVJXZwpH + Q3VrZWh5SVNqNHFEY1VQL2IzbEdEQWVwa2lMc0J5QXlvalVaN0pIRmU4Ci0tLSBE + OVdUWmVsNmJIbDg1VVQ5YlJxL3RrQWpQcStsK3MxMjRNZStodFZONjJJCkl8cErH + RleZiYKXsYozA9R0mdy7mMVYLAsHBtLnh+pAfbmi9B30eMvCu8YpRd1ZMgoVEK6F + G8+gRR0Pv6XvRmE= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGd2TS9LbzNq + RUREUEpDNTdRYnBlMWhSWmREWUxiTDdmV0c3V2RLSk9SZExFUERycXZFYm9FVFFP + a3ZjZmNxUjRMUmQxalBiZWNIT3VPWWN1QllkSjZFMmpoQnFDenFsaXlVcUxHa3lL + V2tranN0WHZFSzVGTEhmWU1ZSU54NGNiVjZVR0V4dEIyRVFYdUhLQ1lmakMvdzJ6 + dEZSUHhUNzZnQ3NTMkxJS1J1am9KWjZiMXhaNWRRWEJXQ3I3S3BVQU5qN3V3aXJK + SGdyMXdRcDJNbnRJRENhbExZRDFkOFhBazNNakpFUGdaeWwrR0hUZzMrUHJERlBE + amlsUUY0RlRrMUpOdThIYXZBaUV3OTlXMHp6MFJPYjdxblhrZW13Z1hiMHJQQXU5 + aG0wOXMweTFnZ29KV0ZmT24yVFIvcFZGcnQ1VnNIb1p6a1Mza0pJbHVITkNtamZW + Vmx6NUxsK3AvZ2RoRkliaGJaWUE1RjlqZ29wanFmZldiZmt6UzFPRmpSV2JZSFI4 + c0FPUnNoTm9FbDBCZjNnY2VCRXhTeHZxblpNOVhnS3BZNE1CWHdtVHF6QTJIczVt + VzFQWjhmeFhKMHpMMjZTdnRpdnVCcStvWDZnYUdpYVRibTlmbDh6QTNJZnZLTk5v + OTlCdm04VWQ0ZWZUTzhjYnBGZ0F3bGsvR1AxY2w5emNsb0VQNkMxOGJ5RjNQQWpl + WFRwYUgyYkpQYWVGWUFqbmM3Z3dzbS91QlBya0JBMEV4U2lqSjJKWVhwdVhzUGlB + NDFZVm95OVYwcVlXZXltYmMrSFdLcENGVmRUVVZCWitGc05nM3IyRVlxd3ZXUTQx + YVdKSzhOdU01dEhCQ0psdGdhb0lMRGV4Z3dTSTRCeDhVZHR2SFJ3UVViS1VOeTlJ + dGVjMGdkdEJ5ZVFqd0JJdnRxcnlOOFY0clg2NTJEMXlxdDgrZCt2QWxjNU56RzRt + QkNsSzBjV3o1N2R6TStuVTJxZ2hsU0xWYjZBVHcrZmdLeXlPcnZYYVc5NWhFRlZP + Q2IzSjJjTzIzSlBwL1F3V0NjRlJMNFZqNVZ4cXI3czhobXc5K0xwOVlUNFcrWjY1 + SmxIU2Ivck0rSjhlV2ZOZWxzTlh0YXJaVktXUUhRaHczeVNUM2VPemU4dXVRVnZK + TWMxOGIvZU4yRXdaL2NSRFd4SWU3RGhJZGl4Ti9kbXNvR3hUWnBGT1ltcHR0NGlh + MXVNV2FqZHFENmZSS203Vm5VeTkzbEljS1dMelh4SVhvR0w3MmlOM3dkek1CTVRW + ZW1yNFVUZzhwekpKamR1UGMvM1dmUitPbGpMTFpmN3U2OWhwWmV2ZXM1RklZYlVF + OUYyVU9HVHlnK2RrT002TE1JeHN5R0hTeXJrSjJqSkRoMERxUzdsRmsyTWxRNnd2 + YnZPa1VBeGpoWTRUUVFKaXFRZ3h6QnNnaHJOWnJuQkd6N0xnMUh2ZlZMU1FsS1Iz + bFZUYVdXc3FTQVFONXF0S1NHZ3hncG00VWFrVCs3andnNVdWaUNwRUZUTTFmWEdp + bHhiZkVRNDBIWk0zT0YyQ0RHTjl5ek9qVUNjQXlUY0NZeW5PZUdoM0xzVnpxcHB0 + QVBhRlV4aWE4dmhNbHRaeVZDbm9EMUhObjN0MEI1VFdMdFNLUHdwckNyZGNZWGwr + OG9vNTZPcG5RZE4zMGQ2dXRvUTFZd3BFV0RRZW5wYmRXMXFjWU5SY0pEOTlHV2JP + ZCt6ZkdReHNmZDBBV1VLc290UmdrWmIzUkVJUnNsL0xvSjJtOHd1UmRUTmphYTlk + UkY2SGpnRi9oVDdRT1ZubEgyZGRxVTlVUjJFSGFBRUlFQ2NnVFV5ZGg0VzlJZVdZ + MCtNaGlLU1RUdlFvbUdwZHBqN09mTloyZFlSd25SQWY2T0grZk4rdG9VMGplekFl + R2YwZU1SdUpSSHYydk14Y25nRy9DaGZhemJ1MVk4MlNRcXN0SEZFM2ZDV1phZwpx + R2dqSXpkelpHeldUNmt1YjBGUmhCT25Gc3ZrczQ2NW84bDhUaDFuTFgwCi0tLSBE + THVGcTQ5dldvR1lMQXhmZHNZWTlMcnhaNFJNSUJUZUQwVmJ5S1ZHUjM0CudRMYEV + i4sx/18d2HJ1f6Lhf8tGPhw8YUXglZkIbEOBCoW8pSBbKzLBFr8XTg7kZceyCY72 + EClHlujjz7QFetg= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa lastmodified: "2026-07-24T12:45:05Z" mac: ENC[AES256_GCM,data:7SD5/Sq0MA+TnY1LZryMjpyU1Q2RAaxF+/4TCRvTy6L1HYnra4Y2hWU1y9Z7L4aj2TIgOGfTaNzSQJv8Yhb9SdWcaC1rjoDxwMPcyem095UpoVXUXO4IRIc84YtrzauivUUIKf1imSootGZ/DW6aZZ0Cx17nzozYdcVERvAKFHE=,iv:u2M9ODvaQM5AJdWuKTm8CltN+yW/14k51F0P29f+/IM=,tag:2Bj5sPwY9/fN/4gAs9rNJQ==,type:str] pgp: - - created_at: "2026-07-22T21:10:52Z" + - created_at: "2026-07-27T21:01:06Z" enc: |- -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ/8C0xLmEN648feRJJgzfHAPZsIf/Zc9lDlQM340JwLchPL - tl/X4mHMzxWLjlROILvhPSjbRyl4YZEq87WETqfQ8qdF7AHK0pL3+9o9ovb3ZlQg - 3z/Oj5Es8AQ7xrSMDN3/tFTiqJmdCi3qZDiswHPre71GPiwMuZPUiJ6dctTYRlDx - CcC68ZQmYK7jENp4HuGhMy3Q/m4A0H5ogPpwI+AcAS5qGy+8P+6gerd/bN+H16tQ - svHaV/5UDCySGduRqeQEeEhAI7QNFLEtNynqJiWcAfE5ziugB/zVF9rTnd4GBhlk - GtA68KYGmR9OAKwBj2JaSFZkUO26kxMSyNlSu3X5gnd3HXRu2WW8T8tyn4u4a+LG - RuqpI/hhIvul/kv9EBXHHMlZCfF8SLGVzoyYS/EFjQnyCpGD8apcaCApghab0KAh - nBA9NzvsJdS174WtzI+UDpW1JDIETyzSfZIkgWDJPhBzj+SzbPStiCLEJ/hzIUMH - pLrKkcYNjW28rQdZSeB6H4lGYIw5o1R8BkXyu2KTLN3gsewO2Mj8WK0XAYXJ/1cF - Ji1SfwozuMYK6d1bBa9m3PEwXGqwjO0n6GIbjo5o0mnj0KP9duMKeVDAnLfjXr8t - FB42U6okun75qulVurCIqT0PPQHGSAcJsEglt/FJJ3Di63cNIF2A8oXH7uAgKUzS - XAGp+2lYr4CebAKg2X2u6xzM7eOrFo7dYc+VwGe/ykG3kVYN99qVdRCoAKvEGstR - Tv96JvpgYtZ7OA9Jo9vQb4O+AJtbcXZ9pIEu7xWr7W1OGiUslhyJOsuXyYIN - =SJgm + hQIMA9/PFHehMxwxARAAtk7qngzvzTsUXQAbKXrJ2b7Xf8fmoBqQR4YJqyRAdFAe + 1rWgwpiJWvRgS5o3/rlb863wIIjnB9CgU8NOOHjoehV3IZSKRtk6262GLO+GFrxn + Erl5HEG1OkOIgYHfu/PVy8fEblCLBVHdXK9rTFBqnjIUgtzDdszawsakH6cRgZLO + YMZMcfGZZqcwnk6H1Rq9tGkLOQSHXqScIjMGgg/6fK2Th98oozDK5r/qWK7HNXJp + kguI5y4ZoT84aTDHodO+qkLxtenoN282XsypGpwY/t66AiCALAJvI/GbvYlBOWCz + 5EjpTAqv5uw8SgCV0RRX/sPf5Gq0KAaLMQb4YjpqLnxxSZtMjSHnG1FffIrbsIC0 + 8FhxxtGUhHzi3c8Dt0i2L3Gj/nYeSRt6ybVfmKy8feR02VVio/PBGDX8j0ZjfsOa + 75jA9AXCTomQ4INrcM+bA6ZbJ0v42StuIN4l2Qjl0nae4zkl8JllenAc2GeRBnw8 + OW4JM2OYHpl8clP9dmuAb8+0nzCg57CJ7lAkbpguHMTkguVBY53C5XSx+z9g74Rc + RKaji59Zwl2lY/qLCcnpeJhoccXqDcuAftuvjifoLZRCXRq93EmR7IEBvAtf0o46 + xADUmSdY7RDN/EZ0+fnn4qVbv6SarKYue8IpUQZwdXk2NHfTQuVeKtEDzoNgWB3S + XAEZ8La73b8jhbKvVGIklAx20s0zPm8B2X85Ju2DqComvJ/H/x6Xl622v52S1JMr + czQ97EInwWNFs3tvTHwTqf941amNEC5p+lRNw2ta3p4GuTiN8VOAavQT0XK2 + =efxl -----END PGP MESSAGE----- fp: "0x416CF1EF9AAF90BC" shamir_threshold: 1 From 278cf8edc19b9406f3a3502418185e929480f5e5 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 28 Jul 2026 00:56:18 +0200 Subject: [PATCH 135/184] Upgrade software --- flake.lock | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/flake.lock b/flake.lock index 1bce779..eed7e15 100644 --- a/flake.lock +++ b/flake.lock @@ -67,11 +67,11 @@ ] }, "locked": { - "lastModified": 1783740085, - "narHash": "sha256-qajyHfZY29G2oEQk+uHxmsJcRoBUBXP9maTpFlwP/dI=", + "lastModified": 1785119570, + "narHash": "sha256-Rgs2xKnGLFWQscxUaXX07oyZeuMDOHEbqDOsgliLFGM=", "owner": "nix-community", "repo": "home-manager", - "rev": "3cd22efe6471dc7365c822bd9ad73a21e55f38fb", + "rev": "d4fd24667c8cbef124bb70a20380cab75ec8474d", "type": "github" }, "original": { @@ -83,11 +83,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1784280462, - "narHash": "sha256-DtoqIqM7VkR6NxAkcLpMwmi02USwWb3JdmNGLyhthc0=", + "lastModified": 1785104993, + "narHash": "sha256-eKbrvPoAOFutbYMdbB3r5EQVmFxKv24iKqHPPUXA0gM=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "293d6abedf0478e681a4dfcfcb35b30fc796a32f", + "rev": "8623c4c20aa4ca2f5fb81510d2944066c3fb0d96", "type": "github" }, "original": { From b8d72469dafa1b71df16560bba242c06a3bb6d9f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 28 Jul 2026 02:28:40 +0200 Subject: [PATCH 136/184] Fix auditing age keys in home directory --- hosts/common/users/rtucek.nix | 38 ++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix index 2c6adf0..5a7c6f3 100644 --- a/hosts/common/users/rtucek.nix +++ b/hosts/common/users/rtucek.nix @@ -27,11 +27,39 @@ in sopsFile = rtucekSopsFile; neededForUsers = true; }; - security.audit.rules = [ - # User sops dir - "-a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" - "-a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user" - ]; + + # Audit access to age key + # + # Note: we can't use `security.audit.rules`, as these rules will be merged + # into systemd's `audit-rules-nixos.service` unit, which runs immediately + # after sysinit.target. + # + # However, this is too early, as at this time, LVM hasn't yet mounted the + # /home directory and therefore, fails to load the unit. + # + # The workaround is to load rules, referencing paths in /home in a separate in + # a separate systemd unit, depending on the `home.mount` target. + systemd.services.audit-rules-nixos-home-age = + let + auditrules = pkgs.writeTextFile { + name = "audit-home.rules"; + text = '' + -D -k secrets_dir_user + -a always,exit -F arch=b64 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user + -a always,exit -F arch=b32 -F path=/home/rtucek/.config/sops/age/keys.txt -F perm=rwa -F key=secrets_dir_user + ''; + }; + in + { + description = "Load Audit Rules after LVM mount"; + wantedBy = [ "home.mount" ]; + after = [ "home.mount" ]; + serviceConfig = { + Type = "oneshot"; + RemainAfterExit = true; + ExecStart = "${pkgs.audit}/bin/auditctl -R ${auditrules}"; + }; + }; # Make sure default shell is installed programs.fish.enable = true; From cf5deef79120b9b71e0f6dc61530e4a94aa79d04 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 28 Jul 2026 04:28:43 +0200 Subject: [PATCH 137/184] Add interactive install script --- nix-install.sh | 84 +++++++++++++++++++++++++++++++++++++++++++++++ nixos-anywhere.sh | 41 ----------------------- 2 files changed, 84 insertions(+), 41 deletions(-) create mode 100755 nix-install.sh delete mode 100755 nixos-anywhere.sh diff --git a/nix-install.sh b/nix-install.sh new file mode 100755 index 0000000..b787fe5 --- /dev/null +++ b/nix-install.sh @@ -0,0 +1,84 @@ +#/bin/bash + +set -Eeuo pipefail + +# Delete tmp dir +cleanup() { + [[ -n "${TEMP_DIR:-}" ]] && rm -rf "$TEMP_DIR" +} +trap cleanup EXIT + +# Check dependencies +require() { + command -v "$1" > /dev/null 2>&1 || { + echo "Missing dependency $1" + exit 1 + } +} +for CMD in sops nix mktemp install; do + require "$CMD" +done + +echo "=== NixOS Anywhere Installer ===" +echo + +# Interactive user prompt +read -rp "SSH destination host: " SSH_HOST +read -rp "SSH destination port [22]: " SSH_PORT +SSH_PORT=${SSH_PORT:-22} +read -rp "SSH user (requires sudo privileges): " SSH_USER +read -srp "SSH password: " SSH_PW +echo "" +read -rp "Nix flake: " FLAKE + +HOST_SECRET="secrets/hosts/${FLAKE}.yaml" +HW_CONFIG="hosts/${FLAKE}/hardware-configuration.nix" +echo "throw \"hardware-configuration.nix not yet auto-generated during setup\"" > $HW_CONFIG + +# Minimalistic validation +if [[ ! -f "$HOST_SECRET" ]]; then + echo "No host secret found:" + echo -e "\t$HOST_SECRET" + exit 1 +fi + +# Setup of secrets +temp=$(mktemp -d) +# Host secrets +install -d -m700 "$temp/secrets" +sops decrypt \ + --extract '["host_key"]' \ + --output "$temp/secrets/keys.txt" \ + "$HOST_SECRET" +chmod 600 "$temp/secrets/keys.txt" +# Setup user key +install -d -m700 "$temp/home/rtucek/.config/sops/age" +sops decrypt \ + --extract '["age_key"]' \ + --output "$temp/home/rtucek/.config/sops/age/keys.txt" \ + secrets/users/rtucek.yaml +chmod 600 "$temp/home/rtucek/.config/sops/age/keys.txt" + +echo +echo "Installing ${FLAKE}..." +echo + +SSHPASS="$SSH_PW" nix run github:nix-community/nixos-anywhere -- \ + --env-password \ + --extra-files "$temp" \ + --chown "/home/rtucek" "1000:100" \ + --disk-encryption-keys \ + /tmp/disk.key \ + <( \ + sops decrypt \ + --extract '["luks_key"]' \ + "$HOST_SECRET" + ) \ + --generate-hardware-config nixos-generate-config "$HW_CONFIG" \ + --flake ".#${FLAKE}" \ + --target-host "${SSH_USER}@${SSH_HOST}" \ + --ssh-port "$SSH_PORT" + +echo +echo "Installation finished." +echo "hardware-configuration.nix generated in $HW_CONFIG" diff --git a/nixos-anywhere.sh b/nixos-anywhere.sh deleted file mode 100755 index 80e2398..0000000 --- a/nixos-anywhere.sh +++ /dev/null @@ -1,41 +0,0 @@ -#!/usr/bin/env bash - -set -e - -temp=$(mktemp -d) - -cleanup() { - rm -rf "$temp" -} -trap cleanup EXIT - -# Setup machine key -install -d -m700 "$temp/secrets" -sops decrypt \ - --extract '["host_key"]' \ - --output "$temp/secrets/keys.txt" \ - secrets/hosts/qemu-nixos-btw.yaml -chmod 600 "$temp/secrets/keys.txt" - -# Setup user key -install -d -m700 "$temp/home/rtucek/.config/sops/age" -sops decrypt \ - --extract '["age_key"]' \ - --output "$temp/home/rtucek/.config/sops/age/keys.txt" \ - secrets/users/rtucek.yaml -chmod 600 "$temp/home/rtucek/.config/sops/age/keys.txt" - -SSHPASS=nixos nix run github:nix-community/nixos-anywhere -- \ - --env-password \ - --extra-files "$temp" \ - --chown "/home/rtucek" "1000:100" \ - --disk-encryption-keys \ - /tmp/disk.key \ - <( \ - sops decrypt \ - --extract '["luks_key"]' \ - secrets/hosts/qemu-nixos-btw.yaml \ - ) \ - --generate-hardware-config nixos-generate-config ./hosts/qemu-nixos-btw/hardware-configuration.nix \ - --flake .#qemu-nixos-btw \ - --target-host nixos@qemu From 1baf6cca94d4e8a6329293958c97144f7536eb97 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Tue, 28 Jul 2026 22:32:01 +0200 Subject: [PATCH 138/184] Exclude /.idea directories --- home/git/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/home/git/default.nix b/home/git/default.nix index 065c0c1..161eb9e 100644 --- a/home/git/default.nix +++ b/home/git/default.nix @@ -16,6 +16,7 @@ package = pkgs.gitFull; ignores = [ + "/.idea/" "*.sublime-project" "*.sublime-workspace" "*.swp" From 0b2dae0bd1da1594473b8b8aa49ca6dfd4142cef Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 29 Jul 2026 00:31:19 +0200 Subject: [PATCH 139/184] Add encrypted GPG key Installation of this key will not be handled via sops as this would require... - a) exposing the key on the disk - b) have it being decrypted there Instead, it will be a manual chore of importing the key via... ```bash sops decrypt --extract '["gpg_key"]' -- secrets/users/rtucek.yaml | gpg --import ``` ... and provide the password interactively. --- secrets/users/rtucek.yaml | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index 8bb37da..d898b83 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -1,6 +1,7 @@ #ENC[AES256_GCM,data:sBkNjW4ZPpmYDx3h0dQmhCphrkbNh9QwJt3G+czU2a+zOzDRllK1QxWs8Clv7WTm70yJ6Y/z0+54w7KYaqNOu8QFYqRrcF2zOdlWePU=,iv:dNGmOsAC2blrs9zj1byuV99sAsR8LRU/oJygCw+NVA8=,tag:t08DkXr3F+nRunZq4hCdhQ==,type:comment] initial_hashed_password: ENC[AES256_GCM,data:TfTHh0ylGMpFEmPxkC3Fqj6UjeZjgdlRb/K6Cu/0OM5Px7rfivWTzv3EehP8Qtki82DveAx5ffbA2KJVfKJMVsxQw6oqgaxalQ==,iv:Pm+W9FyT+mMYAXwfY2xduLFqgzM+RCw0EfOW4RZ+3Y4=,tag:zxileTYtCPvng5xJq/bMnQ==,type:str] age_key: ENC[AES256_GCM,data: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,iv:STuVuYAx3YBDFeknKYIEHAZVJZS6mak8pCVxJmhj2BA=,tag:sKjq2ILGpwRHYrUovhRNzQ==,type:str] +gpg_key: ENC[AES256_GCM,data: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,iv:HE15ts56IjfuQQt9h6+nNdli7GmWLtxiv0XLpYHBLVA=,tag:QxyqRZQhFBtQ2VxjCK06UA==,type:str] sops: age: - enc: | @@ -123,8 +124,8 @@ sops: EClHlujjz7QFetg= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa - lastmodified: "2026-07-24T12:45:05Z" - mac: ENC[AES256_GCM,data:7SD5/Sq0MA+TnY1LZryMjpyU1Q2RAaxF+/4TCRvTy6L1HYnra4Y2hWU1y9Z7L4aj2TIgOGfTaNzSQJv8Yhb9SdWcaC1rjoDxwMPcyem095UpoVXUXO4IRIc84YtrzauivUUIKf1imSootGZ/DW6aZZ0Cx17nzozYdcVERvAKFHE=,iv:u2M9ODvaQM5AJdWuKTm8CltN+yW/14k51F0P29f+/IM=,tag:2Bj5sPwY9/fN/4gAs9rNJQ==,type:str] + lastmodified: "2026-07-28T22:30:57Z" + mac: ENC[AES256_GCM,data:/vtQqVdSTwbwnUwi8LqhhHjxi3DiC/V/5id0HJ177GB8woL1qict4h1KlrJYGEKkZx3KBJxAsYjtipVGSaB1dXar7s7r7Wd1dEX9yfdHYWbHwshFH2L110UObiisrYEksWp2UYbh1cxEZP8K9sYXURcpKIrODTF9yk+dh3IEaNk=,iv:50qJdS3xxIcP0pUyBr67FteGR42KwOWliLQnXRvNLmo=,tag:nZ/P9l5b2Y9bWPycjU7GjA==,type:str] pgp: - created_at: "2026-07-27T21:01:06Z" enc: |- @@ -148,4 +149,4 @@ sops: fp: "0x416CF1EF9AAF90BC" shamir_threshold: 1 unencrypted_suffix: _unencrypted - version: 3.13.2 + version: 3.13.3 From 991244bcd65bb621d342dd474b919f5b3ae6b3c6 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 29 Jul 2026 01:48:47 +0200 Subject: [PATCH 140/184] hyprland: avoid update notification --- home/hyprland/hyprland.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index c0bf654..803dc81 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -115,7 +115,7 @@ # See https://wiki.hypr.land/Configuring/Basics/Variables/#ecosystem config.ecosystem = { - no_update_news = false; + no_update_news = true; no_donation_nag = true; # enforce_permissions = true; }; From e36c03c253dd8810a8ee5ea9c74363eeaa9976fe Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 29 Jul 2026 01:54:29 +0200 Subject: [PATCH 141/184] Install osquery --- system/services/default.nix | 1 + system/services/monitoring.nix | 10 ++++++++++ 2 files changed, 11 insertions(+) create mode 100644 system/services/monitoring.nix diff --git a/system/services/default.nix b/system/services/default.nix index c94676f..2969f46 100644 --- a/system/services/default.nix +++ b/system/services/default.nix @@ -3,5 +3,6 @@ ./dbus.nix ./disks.nix ./greetd.nix + ./monitoring.nix ]; } diff --git a/system/services/monitoring.nix b/system/services/monitoring.nix new file mode 100644 index 0000000..3b2ed51 --- /dev/null +++ b/system/services/monitoring.nix @@ -0,0 +1,10 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.osquery + ]; + + services.osquery = { + enable = true; + }; +} From e4d315561294d93156deebc76b5af941ed02ddbd Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 29 Jul 2026 19:36:14 +0200 Subject: [PATCH 142/184] Add database clients --- system/programs/database/default.nix | 7 +++++++ system/programs/database/mysql.nix | 8 ++++++++ system/programs/database/postgres.nix | 7 +++++++ system/programs/database/sqlite.nix | 7 +++++++ system/programs/default.nix | 1 + 5 files changed, 30 insertions(+) create mode 100644 system/programs/database/default.nix create mode 100644 system/programs/database/mysql.nix create mode 100644 system/programs/database/postgres.nix create mode 100644 system/programs/database/sqlite.nix diff --git a/system/programs/database/default.nix b/system/programs/database/default.nix new file mode 100644 index 0000000..ca12663 --- /dev/null +++ b/system/programs/database/default.nix @@ -0,0 +1,7 @@ +{ + imports = [ + ./mysql.nix + ./postgres.nix + ./sqlite.nix + ]; +} diff --git a/system/programs/database/mysql.nix b/system/programs/database/mysql.nix new file mode 100644 index 0000000..68a9b12 --- /dev/null +++ b/system/programs/database/mysql.nix @@ -0,0 +1,8 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + # We use the MariaDB fork instead of MySQL. + pkgs.mariadb + pkgs.mycli + ]; +} diff --git a/system/programs/database/postgres.nix b/system/programs/database/postgres.nix new file mode 100644 index 0000000..a2b7de7 --- /dev/null +++ b/system/programs/database/postgres.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.postgresql + pkgs.pgcli + ]; +} diff --git a/system/programs/database/sqlite.nix b/system/programs/database/sqlite.nix new file mode 100644 index 0000000..942eaec --- /dev/null +++ b/system/programs/database/sqlite.nix @@ -0,0 +1,7 @@ +{ pkgs, ... }: +{ + environment.systemPackages = [ + pkgs.sqlite + pkgs.litecli + ]; +} diff --git a/system/programs/default.nix b/system/programs/default.nix index 3fbd598..8b24c55 100644 --- a/system/programs/default.nix +++ b/system/programs/default.nix @@ -1,5 +1,6 @@ { imports = [ + ./database ./hyprland ]; } From b47cc2105842f6c658a2be9d5e8d4dd6e3171a70 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 29 Jul 2026 22:54:34 +0200 Subject: [PATCH 143/184] Set LUKS password interactively instead of encrypting via LUKS --- nix-install.sh | 24 ++++++++++++----------- secrets/hosts/dell-xps9360-nixos-btw.yaml | 5 ++--- secrets/hosts/qemu-nixos-btw.yaml | 5 ++--- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/nix-install.sh b/nix-install.sh index b787fe5..9549af6 100755 --- a/nix-install.sh +++ b/nix-install.sh @@ -28,14 +28,21 @@ read -rp "SSH destination port [22]: " SSH_PORT SSH_PORT=${SSH_PORT:-22} read -rp "SSH user (requires sudo privileges): " SSH_USER read -srp "SSH password: " SSH_PW -echo "" +echo read -rp "Nix flake: " FLAKE +read -srp "Full disk encryption password: " LUKS_PASSWORD +echo +read -srp "Full disk encryption password (repeat): " LUKS_PASSWORD_REPEAT +echo + +# Minimalistic validation +if [[ "$LUKS_PASSWORD" != "$LUKS_PASSWORD_REPEAT" ]]; then + echo "Full disk encryption passwords do not match" + exit 1 +fi HOST_SECRET="secrets/hosts/${FLAKE}.yaml" HW_CONFIG="hosts/${FLAKE}/hardware-configuration.nix" -echo "throw \"hardware-configuration.nix not yet auto-generated during setup\"" > $HW_CONFIG - -# Minimalistic validation if [[ ! -f "$HOST_SECRET" ]]; then echo "No host secret found:" echo -e "\t$HOST_SECRET" @@ -63,17 +70,12 @@ echo echo "Installing ${FLAKE}..." echo +echo "throw \"hardware-configuration.nix not yet auto-generated during setup\"" > $HW_CONFIG SSHPASS="$SSH_PW" nix run github:nix-community/nixos-anywhere -- \ --env-password \ --extra-files "$temp" \ --chown "/home/rtucek" "1000:100" \ - --disk-encryption-keys \ - /tmp/disk.key \ - <( \ - sops decrypt \ - --extract '["luks_key"]' \ - "$HOST_SECRET" - ) \ + --disk-encryption-keys /tmp/disk.key <( echo "$LUKS_PASSWORD" ) \ --generate-hardware-config nixos-generate-config "$HW_CONFIG" \ --flake ".#${FLAKE}" \ --target-host "${SSH_USER}@${SSH_HOST}" \ diff --git a/secrets/hosts/dell-xps9360-nixos-btw.yaml b/secrets/hosts/dell-xps9360-nixos-btw.yaml index 6a74949..8fd8b41 100644 --- a/secrets/hosts/dell-xps9360-nixos-btw.yaml +++ b/secrets/hosts/dell-xps9360-nixos-btw.yaml @@ -1,4 +1,3 @@ -luks_key: ENC[AES256_GCM,data:I8oAwXxG01kfz5MwyX6m6KcrTolMh9ud5qImPw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:EL++PD1BauC5RWOJRr48NA==,type:str] host_key: ENC[AES256_GCM,data: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,iv:RYx5EpBBo+7lg2ZZkUd2FFFl0GS99TMBNKmOuiwXt/o=,tag:2OCWKQqitlXnC2UBANXpig==,type:str] sops: age: @@ -122,8 +121,8 @@ sops: JRBR5gnwTWDH/mQ= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa - lastmodified: "2026-07-27T20:24:11Z" - mac: ENC[AES256_GCM,data:XPFKVwLkfYzGW/zk023StUEZgIc0BYSg4BkAYZxyYa5Q7HzFcYavdTsXrnMxSX0S3Kdo+aE9qEJJg29rQ00iOfAwhRP/E82yDB6a902/dhc1HghMzuJCZYh1608/XnLbOtCgZE+/mcGjLizhmuf5MxL8K42K6RK6g15V1bc/I4M=,iv:wSwjniyauHq0Ts+zNWFEZdJoxMFJLkVwStY86DZontw=,tag:Pem6orAzNqZbwVzJDA2HIw==,type:str] + lastmodified: "2026-07-29T20:24:34Z" + mac: ENC[AES256_GCM,data:9Gxz+YmSpRYWljVIK8/QXGHBrHItsirBh/AVgQ1uTbDZMe/l08rHfmFQC8wfcyq2FY9vWREItqH05VBtBQ5KdMUrOmkGi3Kthm59EtINvWVQkQzDB03rllaO9HMuxLSi2X2zsIo5Ad8drgRQdbh2qZMlvWhFeGzOOEKLBHs8olo=,iv:v+p05e2gwL3yE+iE8Ep00jf9VfTXwjhV754SxQ+stZg=,tag:MWX2ljnrqQB5FnkoLTX9Xw==,type:str] pgp: - created_at: "2026-07-27T21:00:45Z" enc: |- diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml index 3e25655..89977bc 100644 --- a/secrets/hosts/qemu-nixos-btw.yaml +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -1,4 +1,3 @@ -luks_key: ENC[AES256_GCM,data:I8oAwXxG01kfz5MwyX6m6KcrTolMh9ud5qImPw==,iv:wA6fnqhEZh4rdiVLbf3LixPbjiL7rjQwgWzUemdfHq0=,tag:EL++PD1BauC5RWOJRr48NA==,type:str] host_key: ENC[AES256_GCM,data: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,iv:C2FoWnEUgam2oS6+eQwaNSMJXtf1v6gxYVVus6NhEIM=,tag:dJZ+LPF8Yro7Acilu2ScVQ==,type:str] sops: age: @@ -122,8 +121,8 @@ sops: r3Y35STwhNry02g= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa - lastmodified: "2026-07-22T21:12:14Z" - mac: ENC[AES256_GCM,data:Ki4Z8/h8mqYdiT/CC5AHoFfB4GON2y9D1BGEjcTRCiURZhmZff7RjlM7mHUe0IQX+R8o0WQy7qqCQXDfEGO6mUd4CwD2KNZP9mN3wA5OjZsd5biNlfQSBECvOgs3uuxFyQTE4B9Vb827Fxo2ndFKkhU5PnuElkktuB/HyFquByM=,iv:i53tiSU/+FGe+sGnBCbUdWHz4TBChBQkJB5j4g3eG+k=,tag:Nm5/ZJyLvgURWLVpPJcTFA==,type:str] + lastmodified: "2026-07-29T20:24:41Z" + mac: ENC[AES256_GCM,data:U8Glg/9RWTmmb595u8BY9inni7NNdn1TXGAO7i7B+y8G9miFEclOyJ+gLNHoWPJQ7k//AXRIu0L8krlH68Ba8xhmCGP2JVP2DnQtVmYeuQaV7T5IY0YNlRjvL4sjxGFr8e176TES2hF6v9i0ee1QSFIpjKIsV2Y383XB3MANYrU=,iv:ulEPR39LRcs8M1ec4V+zmcWIpq/iiD34ssdMN2sJYNs=,tag:OFyV+i70E+02zCZXg/Z2/w==,type:str] pgp: - created_at: "2026-07-27T21:01:04Z" enc: |- From 78dce0ae2ce09ac73cc01c4c8280164ad033ba69 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 30 Jul 2026 00:48:03 +0200 Subject: [PATCH 144/184] Harden towards immutable users --- system/core/default.nix | 1 + system/core/users.nix | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 system/core/users.nix diff --git a/system/core/default.nix b/system/core/default.nix index ff9b9d6..1f82093 100644 --- a/system/core/default.nix +++ b/system/core/default.nix @@ -6,6 +6,7 @@ ./ram.nix ./security ./time.nix + ./users.nix ../nix ]; diff --git a/system/core/users.nix b/system/core/users.nix new file mode 100644 index 0000000..92a6c12 --- /dev/null +++ b/system/core/users.nix @@ -0,0 +1,12 @@ +{ lib, pkgs, ... }: +{ + services.userborn = { + enable = true; + }; + + # By default, we'd want to harden towards immutable users. + # If needed, this may be overridden. + users = { + mutableUsers = lib.mkDefault false; + }; +} From 86b31c512e6b16b3ac9f82920697237b004ca45b Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 31 Jul 2026 22:55:53 +0200 Subject: [PATCH 145/184] Add proper support for yubikey --- home/gpg/default.nix | 9 +++++++++ hosts/common/users/rtucek.nix | 1 - system/services/default.nix | 1 + system/services/smartcard.nix | 32 ++++++++++++++++++++++++++++++++ 4 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 system/services/smartcard.nix diff --git a/home/gpg/default.nix b/home/gpg/default.nix index 6c7d7ea..ed29fa1 100644 --- a/home/gpg/default.nix +++ b/home/gpg/default.nix @@ -51,6 +51,15 @@ "Uncompressed" ]; }; + + scdaemonSettings = { + # Tweak GPG's own smart card daemon in order to play nice with pcscd. + # Essentially, scdaemon shall not try to acquirer an exclusive lock and + # this will conflict with pcscd, which tries to do the same. + # Luckily, scdaemon support sharing access with pcscd. + disable-ccid = true; + pcsc-shared = true; + }; }; services.gpg-agent = { diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix index 5a7c6f3..6995cf4 100644 --- a/hosts/common/users/rtucek.nix +++ b/hosts/common/users/rtucek.nix @@ -1,7 +1,6 @@ { config, pkgs, - home-manager, ... }: let diff --git a/system/services/default.nix b/system/services/default.nix index 2969f46..bb1ecfc 100644 --- a/system/services/default.nix +++ b/system/services/default.nix @@ -4,5 +4,6 @@ ./disks.nix ./greetd.nix ./monitoring.nix + ./smartcard.nix ]; } diff --git a/system/services/smartcard.nix b/system/services/smartcard.nix new file mode 100644 index 0000000..6a41d5f --- /dev/null +++ b/system/services/smartcard.nix @@ -0,0 +1,32 @@ +{ lib, pkgs, ... }: +{ + # pcscd will be used as the authoritative daemon, interacting with smartcards + # like Yubikeys. + # + # However, pcscd does try to acquirer an exclusive lock on a detected + # smartcard and so do other daemons (e.g. scdaemon from GPG). + # As such, we have to make sure that other daemons work with pcscd together. + # + # see https://github.com/OpenSC/OpenSC/wiki/GnuPG-and-OpenSC + services.pcscd = { + enable = true; + }; + # Add udev rules for smart cards + hardware.gpgSmartcards.enable = true; + + # With regards to SSH authentication, it's preferred to use GPG over the + # "traditional" SSH agent. + # As such, we're explicitly disabling openssh's ssh agent. + programs.ssh.startAgent = false; + # Set SSH_AUTH_SOCK ENV globally for all shells. + # This allows ssh clients to find the proper socket to get authentication + # credentials from. + environment.shellInit = + let + gpgconf = "${lib.getBin pkgs.gnupg}/bin/gpgconf"; + in + '' + gpg-connect-agent /bye + export SSH_AUTH_SOCK=$(${gpgconf} --list-dirs agent-ssh-socket) + ''; +} From 5ac6f526af37d8cbbeb0d85c3ef97e74aa9914f7 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Fri, 31 Jul 2026 22:58:13 +0200 Subject: [PATCH 146/184] Add ykman util --- system/services/smartcard.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/system/services/smartcard.nix b/system/services/smartcard.nix index 6a41d5f..2933241 100644 --- a/system/services/smartcard.nix +++ b/system/services/smartcard.nix @@ -1,5 +1,7 @@ { lib, pkgs, ... }: { + programs.yubikey-manager.enable = true; + # pcscd will be used as the authoritative daemon, interacting with smartcards # like Yubikeys. # @@ -8,9 +10,7 @@ # As such, we have to make sure that other daemons work with pcscd together. # # see https://github.com/OpenSC/OpenSC/wiki/GnuPG-and-OpenSC - services.pcscd = { - enable = true; - }; + services.pcscd.enable = true; # Add udev rules for smart cards hardware.gpgSmartcards.enable = true; From 85553fe42f51e68cca0d17a37e58a509d60cfcf5 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 00:44:48 +0200 Subject: [PATCH 147/184] gpg-agent: change pinentry program pinentry-gnome3 doesn't work as it expects XDG, keyring and friends to be installed. As such, we'll be using the simpler `pinentry` program. --- home/gpg/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/gpg/default.nix b/home/gpg/default.nix index ed29fa1..4dd1556 100644 --- a/home/gpg/default.nix +++ b/home/gpg/default.nix @@ -66,7 +66,7 @@ enable = true; pinentry = { package = pkgs.pinentry-all; - program = "pinentry-gnome3"; + program = "pinentry"; }; enableBashIntegration = true; From d1cdb8521b668732ff4cc541460639033e24bdde Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 01:10:01 +0200 Subject: [PATCH 148/184] hyprland: tweak smart-gaps Improve styling for smart-gaps in order to better discriminate between fullscreen vs no-fullscreen mode. --- home/hyprland/hyprland.nix | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/home/hyprland/hyprland.nix b/home/hyprland/hyprland.nix index 803dc81..72b5983 100644 --- a/home/hyprland/hyprland.nix +++ b/home/hyprland/hyprland.nix @@ -35,7 +35,7 @@ workspace-rule = [ { workspace = "w[tv1]"; - gaps_out = 0; + gaps_out = 9; gaps_in = 0; } { @@ -50,8 +50,8 @@ float = false; workspace = "w[tv1]"; }; - border_size = 0; - rounding = 0; + border_size = 2; + rounding = 10; } { match = { From e7ab1fa81623f9fe51cc70d62b6515476b306bb9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 01:41:56 +0200 Subject: [PATCH 149/184] Add networkmanager-applet NetworkManager applet provides proper config editor. --- system/network/default.nix | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/system/network/default.nix b/system/network/default.nix index be23672..6a9ce26 100644 --- a/system/network/default.nix +++ b/system/network/default.nix @@ -31,4 +31,9 @@ ]; }; }; + + programs.nm-applet = { + enable = true; + indicator = false; + }; } From d3380e95c169246bcedcb0293273cb3467ddb3f9 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 17:49:42 +0200 Subject: [PATCH 150/184] Revert "Add networkmanager-applet" This reverts commit e7ab1fa81623f9fe51cc70d62b6515476b306bb9. --- system/network/default.nix | 5 ----- 1 file changed, 5 deletions(-) diff --git a/system/network/default.nix b/system/network/default.nix index 6a9ce26..be23672 100644 --- a/system/network/default.nix +++ b/system/network/default.nix @@ -31,9 +31,4 @@ ]; }; }; - - programs.nm-applet = { - enable = true; - indicator = false; - }; } From 34fe5335c217e0dc6a567189c14bbaa91b2615a0 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 18:10:24 +0200 Subject: [PATCH 151/184] Add networkmanager group --- hosts/common/users/rtucek.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/common/users/rtucek.nix b/hosts/common/users/rtucek.nix index 6995cf4..1268ead 100644 --- a/hosts/common/users/rtucek.nix +++ b/hosts/common/users/rtucek.nix @@ -18,6 +18,7 @@ in extraGroups = [ "wheel" # sudo make me a sandwich "docker" # run docker commands without sudo + "networkmanager" # allow managing connections without sudo ]; }; From ae5f3d5f79e61c6cd2122364022fdf40f67420e3 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 20:23:03 +0200 Subject: [PATCH 152/184] Add commonly shared network manager profiles --- networks/private.nix | 63 +++++++++++++++ secrets/network/private.yaml | 148 +++++++++++++++++++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 networks/private.nix create mode 100644 secrets/network/private.yaml diff --git a/networks/private.nix b/networks/private.nix new file mode 100644 index 0000000..f7d24b8 --- /dev/null +++ b/networks/private.nix @@ -0,0 +1,63 @@ +{ config, ... }: +{ + sops = { + secrets.private_networks = { + sopsFile = ../secrets/network/private.yaml; + reloadUnits = [ "NetworkManager.service" ]; + }; + }; + + networking.networkmanager.ensureProfiles = { + environmentFiles = [ + config.sops.secrets.private_networks.path + ]; + + profiles = { + home = { + connection = { + id = "Home"; + type = "wifi"; + }; + wifi = { + mode = "infrastructure"; + ssid = "$HOME_SSID"; + }; + wifi-security = { + auth-alg = "open"; + key-mgmt = "wpa-psk"; + psk = "$HOME_PSK"; + }; + ipv4 = { + method = "auto"; + }; + ipv6 = { + addr-gen-mode = "default"; + method = "auto"; + }; + }; + + mobile_hotspot = { + connection = { + id = "Pixel6 Mobile Hotspot"; + type = "wifi"; + }; + wifi = { + mode = "infrastructure"; + ssid = "$MOBILE_HOTSPOT_SSID"; + }; + wifi-security = { + auth-alg = "open"; + key-mgmt = "wpa-psk"; + psk = "$MOBILE_HOTSPOT_PSK"; + }; + ipv4 = { + method = "auto"; + }; + ipv6 = { + addr-gen-mode = "default"; + method = "auto"; + }; + }; + }; + }; +} diff --git a/secrets/network/private.yaml b/secrets/network/private.yaml new file mode 100644 index 0000000..5c80445 --- /dev/null +++ b/secrets/network/private.yaml @@ -0,0 +1,148 @@ +private_networks: ENC[AES256_GCM,data:OsMQDZ1V92V5g2qm9l0ykoDyFkL08jE9lkBZ9UQueL2nO6pz0CwrybwR9fkkEsRSqlzjDPlfg0AtahP1YVfM8kEDrqaH8WyQJPpO8RTprlJoILtRAr6f2tLmAzlGHN+aDqTSIc/CG10HKg==,iv:V0jgZjm4KrF1UpMEEgOkuj0w1tJgxa35OTKUcFq5RRo=,tag:Pwx7sdGIqujrZhnb0T1sdw==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHdPSExqaEc2 + OVByL284OC9xMEF5T1QxYUxpdHlaNm00ZmRaTERjallOWUdXejlqNXRvVnlicWIr + Y0kwRG9ZeWxYVXh2Z1orbDB0T1FuMUtwR0UveGdzSUVoZ01yZkFSQVhITy9BcGVy + angyK2JJcWYwbzd2Z29TV2xmTG5Kb1BtTS9sTHdGMFhyUThvVWxENHFxb1Z1RlJw + QSsxSzAxSEZ5djVUM2l2Njk4NWoybDdkbVpxejhBSndSUExoN2hVSkNCSjMza3lB + ZTdGZzgvTEFkMGFRVTY4aWdSNnlzR05aajFIZ3YwNWR5MHVTMmZYOVFXS1FMVWVN + OTQwQ1NtTmdZazIwcm1NbnRPaUE4ZE9kbEZFY20va0I1WFFKTEF5YzFrK2FZUGZR + RGtKNUU2Qm9oVFhKRlVUSUNqZ2lQYlh0TmZCWllFWE5MNmhtSnNOaWRxOHhvamIz + enpubU43clJSS2EwTmJkdUEzSCtNZnBRakpSOEIydTVQbVc0VnpqbEFDVG9rdTVw + NjlCSVFUU0kvZVMrZTBHWTRFQ2NzWi9lU2lNUE0xbEJQVnFrUnFSdW9nbTNVbnRV + eGNzRHhxWW1wVzVIZWptVWUyVVhOMS9vZVNxM3FuWUlOa2Z4S2NTbU9HaHVLSXJT + OVdwVGU0M0IvUFpvbGFla0kzM2dtazJ5ZXJXVnVaYm1mRWtpcFFtSkVTQ3pVcUMw + Um9IRm02YUdmMGkvbUk2akcvVTFRbFNSVHVJZGJGalBQd2N6Wlg4S2VQV0RVNFJK + L2xHbEJuUisyWGdJTzh3azBLNnlyTUJvTnBZRWxheG84aCsyQzNyb1B6UDNab0ZB + RUU0ZEZlVTNGMjNWblh1Q0NhbG1aK0JWM0I1clVqQVhNaXI1cXZNdmxTR0ZZN0NK + Y0l4YmNxbnV0VDVJTHp6SUNDTThnRndjTFJmc2Fmd1lCZHVNaTBmZkowWmxCYUxu + N2thYS9CL01taGVrTmNGdzBaMVFkNXJ0dzdac21Fa2VDTTN1YmVLdFRPUjF0akVn + UXI1L0dNMVU3QjQxMlNiK1lrOUhXYjY4cXdUZDd0SVZ2VkxOUmJGVThTN0tlazhY + LzQwekM3NG16Um1uZytuVE5ONmg1aEkwdHc3dXBIY3hNMmVhaDFyU3k5a1dKM0ww + eENxUXZQZEQxSUR1ZjdKT3dtK2xaemtxcGxqR253M3dCbUNabEpoUlFVbFhZY1Mr + bG1CbVg0YVpSMmJaUFZoT1UvblVjdjhuaGsxZ3VvaXJ4WXBsQzU5T2pBd3BJbUkv + bjBubUNud2lodCttbkxxejh4Sm51QkUxYUVheEhXTkhxY2tod1BybkQyZ0I0TE5F + ZXYyZ25LSDlpMXNQbGdTTjQrUXlVUkoreHF0TkJFVTU4dXMxajdqRUVaV1FIWmZt + UEVZRUUzMmRrUnNkcnNGaXNvRWFTcjNjRmRJSnVzR1lOQWRJRmpHWE8zbTB2UXFU + cUp4SmJZYW53RmdOQk1Fb1Y4Rzg1MzBoOFJHQ1FxS29qM2pMN3F0SDM1dkVIUEN6 + K1cxR0QvdmFWa0Zzc1pUQll4VUhRMVBvdVVQTk81a1J6YkZOWkEzS1RieCtvYTl1 + UGp0YU5oMFZZZXVYMFVUbVZIMFdoZGdxZzk4Q3c4aGNzTkJNeVY4Z3duaDFmZUhU + K3BOemN4Zmx5UzRMRWpJblUrRHgxK3lSNzZxSFJ2ZzJSenR4SmxiLzdGc1VEVE9k + NytMWnpVRFFzMFBZbnh0Szl3MlBQalE2M05Kb1VEa0NJVXdvYVZtcEc1M0gvUFhC + WW5VaFowNEFrdXR5N3BXclFycGVJMHFldFF3aGJPeGc4cmlZcm5DeDljaHZBSkVx + Ui82N0NJZWZ3QkIwdFhmeC9Ta3d4T2REZk0wb3g1NngzSXBSWDdsTGlRVUVMekhw + dWsyc2JkTUxoQjNSdTRBdDAwaXROZlJ4THJoTk81Tm9lMjBGZGxvRHc0WWlDUQp4 + ZFc5alE1ODR2cEZ2Wmd4S2RPekphUURkeTBhZ1BwcVdVNkNneXpZRFVRCi0tLSBa + Yk43YmJ4a2N3WC90UjJxalNmU2txMnZ2dThEb1BlVFRrVTdkSThOQytBCiJzqlsd + tz6knOuOFhe8CDg/ks0qJ+hndpxfFiuS8zF5Qxo/wr1WquS3C2Bf1hwyTdn6ln7T + 84NyjLuQmau+Z9k= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDQ5Ryt5YytW + WDA0UkZsQ3hWMHFaSE9ZalFmSlFUcFNjV2luWW5LQTRaY0hRWmRCYWc2aElPSWVH + ZFByR1RoMktjbFFhK0JOeEppdUFWUW1oOWhHcndnTld1ejNTNXVhK2l0aWtXcnI0 + cnlvNWg3aVYramkzaHdTTmxGMDdQYW9vSE1uYzZTOGRpd0M0MVpvdW1VYWtCMjNy + MDNqWVpmbnVvRjRDVndHTFNGVjVUcUNkOExnenlndXM3blhhbXRwbzVhZXVoTjNM + N0RyZmJHM1VMbzJubFZ1dFVKRGd3YVcxVHc1ZkF6bW9lZ24xWlQ3SENJMmNGWEZC + RzNPRThXbmtndXhEQ2tkdVYxU1JUVHpKRkVmSTBVaENTT0NlbE1ZL2M2QmpqbUpV + SzArcFN2TUdjdVFESVJBZzRJbTA4ZXpUUm5jYVgxZzY1a1pmUHR6NkJobVRUelNO + WUtaUFRLN2l0ZzhBNmtEbUNjdkE1OUhnaldEYlFtbHlrdkJKNldVMjdxbnVva21j + V09hSHM1ZXlOV0V3ZzlpZWk1L01sdjIrZHNMbnROTHVFT0RYV0dxWDh6bHcwWTcr + OFFFekFsdFh4SFFwUGNicjVJZGJLYlZSaGZGeStNMlRqZThpdW5KNElsTExvSlkz + aThnT0ZOZklWQmZXdjI0am44R2ViRTNNeDg1bWVuY1VCU1cxK3ZEYTcrNFVVNjBL + cUp4OVRhWjdNb0pPZzJySWw3ZDlMSS9OY0lYdkt2Nis4VXRMYUNpVmVRYnViQTc3 + Y1FTQnpmbGFaTU5YOUdZZW52dUhFWkNhQitwNk1ZOC9JQXdkUjlTWjVjbCthSW94 + MGR6ekZ4R05BMlJxK1psN04rdHJtWUtFcVEwNEJJOFFCUGlCSmtMUlVXUE9sVGk0 + YUpST1hPYzU3RUlZblk3eHBaeG5pU3F3Q21BY21nSEE4cEpCQnl0cXkwTFhaR0RS + WHBJSjNtYnNGR2wyZG90TElZenJWMVJwVGhBYUg1V0pvdTBBbithYW1EWGg4N2d2 + SUlQbGJueE0zSVBNWVJrVU1CcHd5YmpTZnkxYWw2dmxFVWRQOVhMYUhNdDcvem5r + TFhYTkI2aTJiaDRUN1lFeVNjbVB3OUQ5S3JCYWZWQUN6M0pjVU1FU0dQVExkdDRQ + YloydTAvK29sempxMXk0Z21ZY3dmeERqdi9VSzJXa2M3TEI1TVJzUldoQUx4bDJJ + OE1RaVZsWkt3NmFyY1lQV05xbWRmVVMzclQzUktIVkhveC9EZFA5dENRTXV1dWFq + TmVsU2EzNFJmdkpWV25MejFkMWJJbEZBQjVnMEh6V0I5OHJCWGw2aFU1aFpPT0Yy + U3d0QWlWZERudEs2UG5LM1ptM3QwTmhaSUw5eXN0dUV5SVBvNEFaVks4MDdNc0hX + Qi9FZS9BMGtkVFlvY0JHcGxselRidmFyZWNVcW95dzhtVm5TdlFyS20rTkN4MTdO + K1hqQ3FvaE11M0RmWXZmaWFpdWhNZHViWVF2ZkRNYU1XVXJDRTlBWDJwait3NVVZ + bGhQMmJ5OXlOOWJ6Y3h0a0Jac25UQ3R3SnhDOWMreEpDd3luc2pTUW1CZU15L0JV + MEdMdDRDRjRhdnpENnB4aFlpMmE5emsrb0NhVUg0REp3NGdzOGJVT2NwV01YWFZh + UGVBdnI1bGd4akovTDBkYlNBNG0xUW5nWW5rdXV5a3dYSmcyYjJhL0V0MUVaWWtP + R3BUeWdJQXJIdXNGM2wyUmw0MTQwR1ROeUVKcjhTV0h4VnN5Vk15cmhRV3N5RWNQ + NENuYjg0aHo5MjllREZuaDE2dVp3UGtaTFMwelpxbmgyQXNQWGlBQlRycmRVeTIx + QWRlQm1JMDl3Kytsbi9Hb1N3diswd0ZRMTRlUUgzNUh3RC9lMDhISTB6NzBwSEIv + RW90c1JTQ3hUVENRZkJCb24xWUZRZUg1aklNdnpzK1ZJYXdmMUZaWHNSNk5Xdwp1 + V2p1S2NPdnFQUVZDS05TK2E0QnVjWlByKyt1dWNwOHNEY3lieVRVK2YwCi0tLSA1 + OWJaaHJaTWg3NlhBZmJUR0kzVkNiSTEyK0RXL21zd3JXcmNuZHRCUEtNCgNTqeH9 + +AB+XvVDEaS39gmwkPlfWxDF3Od69RUDt9QdPdojFPrPiS8t0BDuISTJSwR+em8P + lH3wXzZoJhY9vVk= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFlNMGlvaVBt + REJWVk1OcWRDWTlGWDE4N05peW50ZWE0c1JzRnhLVjQ4Z24rTWR3bm1IakVmdC9l + NVlMVVJKdXpkYW96NUMvNEZRQURpYUJHbTVFbWhQUFNtTzFFdXFjRStQT1BPNDRD + aXhzTklXUllKdFNteDZyZFlnUWthcE96SjlXWVJLYzIzdlFTbEQybXlhWThqUXpU + TGxDbkRjanhDOS9EMEhBcElxQTRJdWR5RG1yUU1oaC9mSU5nSUV3djY4UTdXTjJG + ejJjVHJyUTczNSt6UGc1NXoxL0FLUkMvN1lKcVJBODJEdmR0QVJwanE5cG4xZEVz + Qm52eXAweElnUHkwR3orYktYNFdnczJWUjNGaWV6RGQxdk93WFVnRTdKWHVjTGpR + R3UvT05IdlpqN3Y3WFluTyt2VTNOYkZjQnZ2TTBQY3hnL05VdzF6NkJJbXp3YTl1 + S2dabGFMb0lTdzl0UTdnck92QmdYS0VYb0trN0poRHhsWEVpZlpFM0lNVVp6T2xZ + eWNrNFQ1WVRSZ2lTQUFwbk0rUUFtMlJjOWNMVTBqMmY1YXM2c2Y5eTE0a1BuTFRX + L0U5TjN5UGVpTWFubDludk1Fb3E3eE85aTNOUU5KMVcyWGsxeFJCaXBIWkZJbjEr + ZldhNGd2cnBkN1RHZDJvcVUwSytGOFBnKzZjMWZXakRsR05PSDdwZWdEMGNYdXNT + NzduSXV5UnFIWVVHS0pGdzBFNm40ZFZzcHhVNHRSWGp1L29FSm52RFZISnN4U3VW + RkhkVmNTZ1lNM0RRRU5BVUc3eXRZcWFQTGg3b1d5ZkhrVHJjOUVTUFdGN0xGS1Zs + d3ZyamRnYlFDWnFrTnhzTzFDRkRPY3IzOFJzZzd5UkpZR3RBS050REhldE1zN2l6 + MzBvLzdOUzhrWXgzdS9EUnpXTWo0M3dpanJjNkdUTUFteWpucUdnQ2VhTmhTN3BT + alhmcWtvTnlvZEFBU21LQTNZZDJCbnRqNkdRSGZXS1h1NHIxcmZEYndaQWRGa0NH + Z3FOZW9rUTI2MGNBbFRlekpBTUExM1JNSmhjNkZHdkJXSTdkYW93cXBVQm5xbUxC + RmZLU3ZyY0l1MWtzMTd6UGhyK1BFV0lTaFptS1o0T3p0YW9rY3AyNjFSamloME50 + Njk5a2N6ellxZDVCbXJ3Ymt3dElrS0lFS3dDZkt2RFpmRWFSQkEyQUtlTlJVMHdt + QzZkUjRveWZsMWlKa3I0akZ1WGJoSHRhc1ZPWWJ0ODgwa0hCUmx3aXZUUU1YbmhR + S3FpaDVlNTUwUDhhdEJoczJxQjNHa2dXcWljQUwwdnBkR0pmVG14RUwxU3gxT21a + Vnlsc1FINVNVdStJODA0UEZ1bzlieU9aQnhBczUwQ3J5UDZWT0xIRmRoaDVuVjRh + NTZoeTFtQnpsZm1aaCtNR0dIbzQwVC9LaXp6VGlmTXR2RjYrby80b3hhYjZ2MXgr + R2oyRzA5aTZBSnlRRTNuOFczckovQjdCRjRqU1NFenVta0hSbTZ4Q1YwdW1QS3dq + Y1B4UVVWcjFnZXozMGl4UXAzdWhvL3RDZEI2OWUvZ3RkNnd3ZTF5QkRmUllpc2Nx + WHlYWXZSTTRzRDZIZEJzYWhJZDBtaThUbzY1VUx4UFFURG9Ccm44aU5PaERReFRY + eGI3cXZFeUdOYzhiOXNLMVFhWU1vV1B0TUtZaDZoMlhRS01HSHFMZFBrd3ZmOGRO + aHFiSWoyWXkwT2syZDRCZEd4M1lNTUJRSUNxcXRtbzU5WFRVS3I0RDZ1WjhZNUxR + OEhybU5JNG1DbDFXMXhGYXYxL3VHbXdERG5yczZ0MlZBOUc3dzNOTWRNYkJWV3ky + cFZwdkpIYWx6STFOSmVCbElRZDlyZUtEejJ5cmVYRUhmeU53NkFwRW53NEZZR05P + QjBYbUE0QVBKTXR2VDZvQmFyRHNLZUQrODVyaHlmZUx6VkNkc3R0QVpwc09Vdwo4 + emoyeVAyZTR4SERPVVY5b0o1anM1VWVwaERoYkVJMDlONjJTcTZvS1ZFCi0tLSBF + RGFsWkZCcVBFeU5pemtqL1JlTkk5aGJQQkt4UXROWVRDNzdUU0Q2ZFlnCjRenXFF + 9TJ09wGA0itDALc/RqQ/OKMi/JB637LPIupVJ/2y0QLg8WIKiZPQWXifQfrjoPOJ + wIIZ7MYMkmfAlTE= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + lastmodified: "2026-08-01T16:26:01Z" + mac: ENC[AES256_GCM,data:Tm7egPDqjEG0Sre8h7U88O+4T8UT1y+QXPGtpUACkanVgwcn0KwWPZyXFINZBmlkYh9262x8+WgSwu4XuC7vPcM+36Q4ouJma8/SZKt1EuLrYxGBUdZKuc0P8687nmvKccnVcN9GD29aTa8MxwSOrQx7j3TpqGpT/c8JxQp2n48=,iv:zVo540/GpTpntjn/S21vRVhXIRmZ2jru02IAzw327zQ=,tag:+c2BqM4RwfYERsJiYeCs7w==,type:str] + pgp: + - created_at: "2026-08-01T09:05:12Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ/9F+sgo+TZb10Lz98FICxYHt6K766bgccpnF2dKr0M7fWV + z7x0Q2aQRRf97nJiXvlXxBgxYLWUy0qQd7r7/otTvnjuSg05H0RrIY+j0uLNJWv8 + mIku2cpGEXbgSdNFtNvBd41J6aLhTJXaV0dW1YV59UX8nCaVuNS5bU6jrKqMJ7uH + 70TikpVzZtuduz+LlhDqg0MknD/Rsc5RnHdRu+QM/AEL8o3J7rQCM/bJReDRxHx9 + k7c7SZsQzflpi/qsQmJG4HyeTxcBBK2IOWNf8CKsjf5DPOzbDdzbC7tV5SLKBM82 + +y8GpLcoMGj3FTpaj2rhT63ECrpXVYS3AWH01YwaqFKJE0PrZXLopqxfD9Zf4K1q + RE4l0H6ukUXFsT1xu0aolL3K5agONtAfviKc+oQZog6TJ5Mi2HiSf6rqM0dy7KTD + Y6zHwWL78E/DPbD2HNPEX3cRtPRZH0QuZoPJsgxoaLCTV1+U5IqiYgW0ijC5u0LI + ZoMQ9/vzXwWud2Hj7LM+tDpSd+mUB24mGc8QXr1tZ2GUMnk8WkNdReOXXVWJq6fW + jXFFIdeuaeZcesHrLBf8OyEqwVM3yICbN9OnBhZOiwtlPOrs45boznCIPadeYmxn + qcTX4pDeq6E9NYK+M2NQpdLtT8eoUySsEB7Yql6CPLCYs4kLwqZUi2VWEPJnf6LS + XgFaiyi8AljK5xeFMpIPUVNA7Pkzg58fzGXFEmGsGAMN2+G5r8H5sqeBStu9Luj5 + vll/0aYHetRBR4Z/V0PQy8V07JmkTpPjiyD45J2hCJyRilhfxgjCQ2egerHFgPA= + =wmRX + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.3 From 4f9d2675394ca519daac2938f7927494e1589bbe Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 20:34:29 +0200 Subject: [PATCH 153/184] Remove tzupdate systemd service tzupdate can prevent nixos system rebuilds as it typically fires upon activation. In case internet is not accessible, the service fails, causing nixos refusing to apply the switch. On the other hand, `systemd-timesyncd.service` already takes care of keeping the local time in sync via NTP. --- system/core/time.nix | 6 ------ 1 file changed, 6 deletions(-) diff --git a/system/core/time.nix b/system/core/time.nix index 840e3f7..a178414 100644 --- a/system/core/time.nix +++ b/system/core/time.nix @@ -1,14 +1,8 @@ { lib, ... }: { - # Set a sensitive default, which shall be overridden via - # `services.automatic-timezoned.enable`, based on the current geolocation. - # - # see https://search.nixos.org/options?channel=unstable&query=services.automatic-timezoned.enable - # for details. time.timeZone = lib.mkDefault "Europe/Vienna"; services = { automatic-timezoned.enable = true; - tzupdate.enable = true; }; } From 427aaa74e1dc9f15ac4531d7e7ddb202ea3d7c03 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 20:53:05 +0200 Subject: [PATCH 154/184] Update flake dependencies --- flake.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/flake.lock b/flake.lock index eed7e15..197aaaa 100644 --- a/flake.lock +++ b/flake.lock @@ -83,11 +83,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1785104993, - "narHash": "sha256-eKbrvPoAOFutbYMdbB3r5EQVmFxKv24iKqHPPUXA0gM=", + "lastModified": 1785491804, + "narHash": "sha256-p00vplVOyfKGlhju0+eGGPAxyYYKaY0lpyuoHLFIx2Y=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "8623c4c20aa4ca2f5fb81510d2944066c3fb0d96", + "rev": "5b4f72e1705a63aace42900610c4db82cb4af0ec", "type": "github" }, "original": { From b135d053f984ec3913ed7ea8547d3b345d64167a Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 21:17:35 +0200 Subject: [PATCH 155/184] Add github workflow for flake checking --- .github/workflows/check.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 .github/workflows/check.yml diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml new file mode 100644 index 0000000..765d325 --- /dev/null +++ b/.github/workflows/check.yml @@ -0,0 +1,18 @@ +name: Flake Tests + +on: [push, pull_request, workflow_dispatch] + +jobs: + checks: + name: Flake Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + experimental-features = nix-command flakes + - run: nix flake check --all-systems . From e1fd906a2302a77778f351c822ab1081b01c54ab Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 21:32:54 +0200 Subject: [PATCH 156/184] Load private network config --- hosts/common/default.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/hosts/common/default.nix b/hosts/common/default.nix index 51116dc..cf2e200 100644 --- a/hosts/common/default.nix +++ b/hosts/common/default.nix @@ -1,6 +1,7 @@ { ... }: { imports = [ + ../../networks/private.nix ./disko.nix ./home-manager.nix ]; From 01d133c8c90ca40c7db1bac2af096cd91c642e4c Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 22:49:39 +0200 Subject: [PATCH 157/184] Add nix lint check via nil LSP --- .github/workflows/check.yml | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 765d325..da6f1ae 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -3,7 +3,7 @@ name: Flake Tests on: [push, pull_request, workflow_dispatch] jobs: - checks: + flake-check: name: Flake Check runs-on: ubuntu-latest steps: @@ -16,3 +16,21 @@ jobs: access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} experimental-features = nix-command flakes - run: nix flake check --all-systems . + lint: + name: Nix lint + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + experimental-features = nix-command flakes + - run: nix-shell -p nil + - run: find . -name '*.nix' -print0 | xargs -0 nil diagnostics | tee /tmp/findings.txt + - run: | + if [ -s "/tmp/findings.txt" ]; + then exit 1 + fi From db481bb9c6f3ee6b7852a7a6b6e5bbca9b231064 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 23:01:19 +0200 Subject: [PATCH 158/184] Try with `workflow/nix-shell-action@v4` --- .github/workflows/check.yml | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index da6f1ae..510aa25 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -27,10 +27,11 @@ jobs: extra_nix_config: | auto-optimise-store = true access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - experimental-features = nix-command flakes - - run: nix-shell -p nil - - run: find . -name '*.nix' -print0 | xargs -0 nil diagnostics | tee /tmp/findings.txt - - run: | - if [ -s "/tmp/findings.txt" ]; - then exit 1 - fi + - uses: workflow/nix-shell-action@v4 + with: + packages: nil + script: | + find . -name '*.nix' -print0 | xargs -0 nil diagnostics | tee /tmp/findings.txt + if [ -s "/tmp/findings.txt" ]; + then exit 1 + fi From bf3da0bc4ff2581861f55d2a1f34ae4af768c6a4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 23:02:14 +0200 Subject: [PATCH 159/184] Try with `workflow/nix-shell-action@v3` --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 510aa25..36d0f30 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -27,7 +27,7 @@ jobs: extra_nix_config: | auto-optimise-store = true access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - - uses: workflow/nix-shell-action@v4 + - uses: workflow/nix-shell-action@v3 with: packages: nil script: | From 0b52ab459b6af759105b38749fe08f86da4ddcb0 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 23:04:22 +0200 Subject: [PATCH 160/184] Adjust error text --- .github/workflows/check.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 36d0f30..f1e2e81 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -32,6 +32,7 @@ jobs: packages: nil script: | find . -name '*.nix' -print0 | xargs -0 nil diagnostics | tee /tmp/findings.txt - if [ -s "/tmp/findings.txt" ]; - then exit 1 + if [ -s "/tmp/findings.txt" ]; then + echo "Nil detected warnings/errors" + exit 1 fi From db796ba89a54c6115a400aac5120b9b7c3c835c1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Sat, 1 Aug 2026 23:04:41 +0200 Subject: [PATCH 161/184] Fix all nil findings --- home/hyprland/hyprpaper/default.nix | 2 +- home/scripts/clone-dotfiles.nix | 1 - hosts/common/home-manager.nix | 2 +- .../dell-xps9360-nixos-btw/hardware-configuration.nix | 1 - hosts/qemu-nixos-btw/hardware-configuration.nix | 2 -- system/core/users.nix | 2 +- system/programs/hyprland/default.nix | 10 +--------- system/services/greetd.nix | 7 +------ 8 files changed, 5 insertions(+), 22 deletions(-) diff --git a/home/hyprland/hyprpaper/default.nix b/home/hyprland/hyprpaper/default.nix index d4404d8..d1e6d73 100644 --- a/home/hyprland/hyprpaper/default.nix +++ b/home/hyprland/hyprpaper/default.nix @@ -1,4 +1,4 @@ -{ pkgs, ... }: +{ ... }: { services.hyprpaper = { enable = true; diff --git a/home/scripts/clone-dotfiles.nix b/home/scripts/clone-dotfiles.nix index c01562d..f8c2df7 100644 --- a/home/scripts/clone-dotfiles.nix +++ b/home/scripts/clone-dotfiles.nix @@ -2,7 +2,6 @@ pkgs, lib, config, - targetDir, ... }: let diff --git a/hosts/common/home-manager.nix b/hosts/common/home-manager.nix index eab4585..8e4633e 100644 --- a/hosts/common/home-manager.nix +++ b/hosts/common/home-manager.nix @@ -1,4 +1,4 @@ -{ inputs, home-manager, ... }: +{ inputs, ... }: { home-manager = { useGlobalPkgs = true; diff --git a/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix b/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix index bbfaca5..b68d713 100644 --- a/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix +++ b/hosts/dell-xps9360-nixos-btw/hardware-configuration.nix @@ -4,7 +4,6 @@ { config, lib, - pkgs, modulesPath, ... }: diff --git a/hosts/qemu-nixos-btw/hardware-configuration.nix b/hosts/qemu-nixos-btw/hardware-configuration.nix index 92d7b83..0ade172 100644 --- a/hosts/qemu-nixos-btw/hardware-configuration.nix +++ b/hosts/qemu-nixos-btw/hardware-configuration.nix @@ -2,9 +2,7 @@ # and may be overwritten by future invocations. Please make changes # to /etc/nixos/configuration.nix instead. { - config, lib, - pkgs, modulesPath, ... }: diff --git a/system/core/users.nix b/system/core/users.nix index 92a6c12..6892236 100644 --- a/system/core/users.nix +++ b/system/core/users.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, ... }: +{ lib, ... }: { services.userborn = { enable = true; diff --git a/system/programs/hyprland/default.nix b/system/programs/hyprland/default.nix index 6c948b1..96fdc02 100644 --- a/system/programs/hyprland/default.nix +++ b/system/programs/hyprland/default.nix @@ -1,12 +1,4 @@ -{ - inputs, - pkgs, - lib, - ... -}: -let - inherit (pkgs.stdenv.hostPlatform) system; -in +{ pkgs, ... }: { environment.systemPackages = [ pkgs.hyprland diff --git a/system/services/greetd.nix b/system/services/greetd.nix index 91389c2..83aa43f 100644 --- a/system/services/greetd.nix +++ b/system/services/greetd.nix @@ -1,9 +1,4 @@ -{ - lib, - pkgs, - config, - ... -}: +{ lib, pkgs, ... }: { environment.systemPackages = [ pkgs.hyprland From 2c32f97b135a96c42b7a02a6dbe15dcc6f52ea24 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 3 Aug 2026 01:45:05 +0200 Subject: [PATCH 162/184] git: fix invalid `commit.cleanup` config --- home/git/default.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/git/default.nix b/home/git/default.nix index 161eb9e..06c731b 100644 --- a/home/git/default.nix +++ b/home/git/default.nix @@ -66,7 +66,7 @@ { commit = { verbose = true; - cleanup = true; + cleanup = "scissors"; }; } { From 29b94cf55d872c0bb0fd44456991cd158b747998 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Mon, 3 Aug 2026 01:57:17 +0200 Subject: [PATCH 163/184] dell xps9360: adjust screen resolution and scale --- hosts/dell-xps9360-nixos-btw/default.nix | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/hosts/dell-xps9360-nixos-btw/default.nix b/hosts/dell-xps9360-nixos-btw/default.nix index 38f7029..bb0a5f2 100644 --- a/hosts/dell-xps9360-nixos-btw/default.nix +++ b/hosts/dell-xps9360-nixos-btw/default.nix @@ -8,6 +8,19 @@ networking.hostName = "dell-xps9360-nixos-btw"; sops.defaultSopsFile = ../../secrets/hosts/dell-xps9360-nixos-btw.yaml; + home-manager.users.rtucek = { + wayland.windowManager.hyprland.settings = { + monitor = [ + { + output = "eDP-1"; + mode = "3200x1800@59.98200"; + position = "0x0"; + scale = 1.6; + } + ]; + }; + }; + disko.devices.lvm_vg.volgroup0.lvs = { # 100 GB of available disk space lv_root.size = "100G"; From 03dd05234448b6ba6363422087068328ea62c5ca Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 02:58:03 +0200 Subject: [PATCH 164/184] Update flake --- flake.lock | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/flake.lock b/flake.lock index 197aaaa..b978a1f 100644 --- a/flake.lock +++ b/flake.lock @@ -26,11 +26,11 @@ "nixpkgs-lib": "nixpkgs-lib" }, "locked": { - "lastModified": 1782949081, - "narHash": "sha256-vp6Y/Grm98ESt6ceOkWiHWyZRDV3J1RID4w+6NWK9yA=", + "lastModified": 1785627969, + "narHash": "sha256-4dtXQk/NMePegK/nWp5NSeuZKLATItOq61lpEvmXqGw=", "owner": "hercules-ci", "repo": "flake-parts", - "rev": "17c9d6cdfc60c64f4ee8d306f9bc0b4ccb51481e", + "rev": "427bf4bd9435fdf21321c8cc628c24efc14c0f7a", "type": "github" }, "original": { @@ -83,11 +83,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1785491804, - "narHash": "sha256-p00vplVOyfKGlhju0+eGGPAxyYYKaY0lpyuoHLFIx2Y=", + "lastModified": 1785734586, + "narHash": "sha256-ODZkEK9Gy50yg6h98u7KkitZ3oc/uuTFK00bh1CRdNA=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5b4f72e1705a63aace42900610c4db82cb4af0ec", + "rev": "531670d871c0e29724a02f3cbcac170adc65b58c", "type": "github" }, "original": { @@ -99,11 +99,11 @@ }, "nixpkgs-lib": { "locked": { - "lastModified": 1782614948, - "narHash": "sha256-ePjCwr1sNm9NYUqywL7QfK3JnlS015msC+eBu2zKlp8=", + "lastModified": 1785031560, + "narHash": "sha256-OmshNvn2vupOFpYinLUu+1Dnpu4n7Q5N3ggGVNHpkUI=", "owner": "nix-community", "repo": "nixpkgs.lib", - "rev": "db3f255737b94216eb71cce308e2912cf6bc2d7c", + "rev": "0e79af5e3d4dcfcd676ab5ba3f95d2e3352e078c", "type": "github" }, "original": { From 5d02869f181bab23c6875b54a4ca2e5a2ba9915b Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:02:21 +0200 Subject: [PATCH 165/184] Enable fish and bash shell Shells need to be enabled explicitly in home manager, otherwise, GPG agent's SSH_AUTH_SOCK env variable is not set eventually. --- home/default.nix | 1 + home/shell/bash.nix | 6 ++++++ home/shell/default.nix | 6 ++++++ home/shell/fish.nix | 5 +++++ 4 files changed, 18 insertions(+) create mode 100644 home/shell/bash.nix create mode 100644 home/shell/default.nix create mode 100644 home/shell/fish.nix diff --git a/home/default.nix b/home/default.nix index f77c886..011581c 100644 --- a/home/default.nix +++ b/home/default.nix @@ -5,6 +5,7 @@ ./gpg ./hyprland ./neovim + ./shell ./sops ./tmux ./tools diff --git a/home/shell/bash.nix b/home/shell/bash.nix new file mode 100644 index 0000000..da49b06 --- /dev/null +++ b/home/shell/bash.nix @@ -0,0 +1,6 @@ +{ + programs.bash = { + enable = true; + }; +} + diff --git a/home/shell/default.nix b/home/shell/default.nix new file mode 100644 index 0000000..82a59bc --- /dev/null +++ b/home/shell/default.nix @@ -0,0 +1,6 @@ +{ + imports = [ + ./bash.nix + ./fish.nix + ]; +} diff --git a/home/shell/fish.nix b/home/shell/fish.nix new file mode 100644 index 0000000..17ef2bf --- /dev/null +++ b/home/shell/fish.nix @@ -0,0 +1,5 @@ +{ + programs.fish = { + enable = true; + }; +} From 9e4e1956998f0eaeb6926bfb401a5bd87fe29c40 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:04:02 +0200 Subject: [PATCH 166/184] Avoid setting SSH_AUTH_SOCK via environment.shellInit Since GPG and the gpg-agent are home-manager managed, avoid setting the SSH_AUTH_SOCK env via global shell init. This only causes the spawn of another (and conflicting) gpg-agent process. --- system/services/smartcard.nix | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/system/services/smartcard.nix b/system/services/smartcard.nix index 2933241..cca9ca8 100644 --- a/system/services/smartcard.nix +++ b/system/services/smartcard.nix @@ -1,4 +1,4 @@ -{ lib, pkgs, ... }: +{ ... }: { programs.yubikey-manager.enable = true; @@ -18,15 +18,4 @@ # "traditional" SSH agent. # As such, we're explicitly disabling openssh's ssh agent. programs.ssh.startAgent = false; - # Set SSH_AUTH_SOCK ENV globally for all shells. - # This allows ssh clients to find the proper socket to get authentication - # credentials from. - environment.shellInit = - let - gpgconf = "${lib.getBin pkgs.gnupg}/bin/gpgconf"; - in - '' - gpg-connect-agent /bye - export SSH_AUTH_SOCK=$(${gpgconf} --list-dirs agent-ssh-socket) - ''; } From 0f4ca27e7bf4206f451b1571c36ba4439d749be4 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:27:07 +0200 Subject: [PATCH 167/184] Gitlab actions: check for unformatted code --- .github/workflows/check.yml | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index f1e2e81..c2d5880 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -36,3 +36,26 @@ jobs: echo "Nil detected warnings/errors" exit 1 fi + formatter: + name: Nix formatter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: cachix/install-nix-action@v31 + with: + install_url: https://nixos.org/nix/install + extra_nix_config: | + auto-optimise-store = true + access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} + - uses: workflow/nix-shell-action@v3 + with: + packages: nixfmt-tree git + script: | + treefmt + GIT_CHANGES="$(git status --porcelain)" + if [[ -n "$GIT_CHANGES" ]]; then + echo "Code not formatted" + echo "Run nixfmt and commit changes" + echo "Affected files:" + echo "$GIT_CHANGES" + fi From e3fc49281c0bb6dbec85dc8d6032edd7509665d7 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:31:37 +0200 Subject: [PATCH 168/184] Fix package import --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index c2d5880..08fa0b7 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -49,7 +49,7 @@ jobs: access-tokens = github.com=${{ secrets.GITHUB_TOKEN }} - uses: workflow/nix-shell-action@v3 with: - packages: nixfmt-tree git + packages: nixfmt-tree,git script: | treefmt GIT_CHANGES="$(git status --porcelain)" From 70a1e9b1f7df069498cade90ec65e8f120b48e8b Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:32:38 +0200 Subject: [PATCH 169/184] Pin git-porcelain version --- .github/workflows/check.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 08fa0b7..327a40f 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -52,7 +52,7 @@ jobs: packages: nixfmt-tree,git script: | treefmt - GIT_CHANGES="$(git status --porcelain)" + GIT_CHANGES="$(git status --porcelain=v1)" if [[ -n "$GIT_CHANGES" ]]; then echo "Code not formatted" echo "Run nixfmt and commit changes" From 39d993b37cece2cde246954643fe287d0e094631 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:32:51 +0200 Subject: [PATCH 170/184] Github actions: make sure formatter test fails upon diff-encounter --- .github/workflows/check.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/check.yml b/.github/workflows/check.yml index 327a40f..e454bb9 100644 --- a/.github/workflows/check.yml +++ b/.github/workflows/check.yml @@ -58,4 +58,5 @@ jobs: echo "Run nixfmt and commit changes" echo "Affected files:" echo "$GIT_CHANGES" + exit 1 fi From 605ed3b589c12583c14c55833d49ebadaf850c23 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 03:33:44 +0200 Subject: [PATCH 171/184] Apply treefmt changes --- home/shell/bash.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/home/shell/bash.nix b/home/shell/bash.nix index da49b06..d515e49 100644 --- a/home/shell/bash.nix +++ b/home/shell/bash.nix @@ -3,4 +3,3 @@ enable = true; }; } - From 5d5dba92ad77f3d8328442c0212a46bb79f72235 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Wed, 5 Aug 2026 23:45:36 +0200 Subject: [PATCH 172/184] GPG: remove pcscd in favor of scdaemon --- home/gpg/default.nix | 9 --------- system/services/smartcard.nix | 14 ++++---------- 2 files changed, 4 insertions(+), 19 deletions(-) diff --git a/home/gpg/default.nix b/home/gpg/default.nix index 4dd1556..071824d 100644 --- a/home/gpg/default.nix +++ b/home/gpg/default.nix @@ -51,15 +51,6 @@ "Uncompressed" ]; }; - - scdaemonSettings = { - # Tweak GPG's own smart card daemon in order to play nice with pcscd. - # Essentially, scdaemon shall not try to acquirer an exclusive lock and - # this will conflict with pcscd, which tries to do the same. - # Luckily, scdaemon support sharing access with pcscd. - disable-ccid = true; - pcsc-shared = true; - }; }; services.gpg-agent = { diff --git a/system/services/smartcard.nix b/system/services/smartcard.nix index cca9ca8..8b58540 100644 --- a/system/services/smartcard.nix +++ b/system/services/smartcard.nix @@ -1,16 +1,10 @@ -{ ... }: +{ lib, ... }: { programs.yubikey-manager.enable = true; - # pcscd will be used as the authoritative daemon, interacting with smartcards - # like Yubikeys. - # - # However, pcscd does try to acquirer an exclusive lock on a detected - # smartcard and so do other daemons (e.g. scdaemon from GPG). - # As such, we have to make sure that other daemons work with pcscd together. - # - # see https://github.com/OpenSC/OpenSC/wiki/GnuPG-and-OpenSC - services.pcscd.enable = true; + # We will use GPG's scdaemon instead. + services.pcscd.enable = lib.mkForce false; + # Add udev rules for smart cards hardware.gpgSmartcards.enable = true; From 4f841ab0f9fad3d4217029544797ffa8cd896326 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 00:09:18 +0200 Subject: [PATCH 173/184] neovim: add ruler for max_line_length --- home/neovim/settings.nix | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/home/neovim/settings.nix b/home/neovim/settings.nix index ae33311..3eb3e55 100644 --- a/home/neovim/settings.nix +++ b/home/neovim/settings.nix @@ -71,6 +71,10 @@ ignorecase = true; smartcase = true; + # Show ruler at at `textwidth`'s n+1 position. + # `textwidth` in return is typically controlled by editorconfig's `max_line_length` setting. + colorcolumn = "+1"; + # -----VISUAL----- # Syntax highlighting From 0c4c2417c2c33a2edf96d18898fb492257585e08 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 00:21:48 +0200 Subject: [PATCH 174/184] btop: add btop tool --- home/tools/sys.nix | 1 + 1 file changed, 1 insertion(+) diff --git a/home/tools/sys.nix b/home/tools/sys.nix index ba12ae3..5a19ef4 100644 --- a/home/tools/sys.nix +++ b/home/tools/sys.nix @@ -10,6 +10,7 @@ pkgs.openssh # System monitoring + pkgs.btop pkgs.htop pkgs.inxi pkgs.lshw From 512f20396144e4eecbc7637a887d0849bfcfa070 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 00:39:49 +0200 Subject: [PATCH 175/184] Re-add LICENSE file --- LICENSE | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 LICENSE diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6e3bb3e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Rudolf Tucek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 64db144411aaabdf74cdbd5feefe8202fc85d3ac Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 01:13:03 +0200 Subject: [PATCH 176/184] Revert "GPG: remove pcscd in favor of scdaemon" This reverts commit 5d5dba92ad77f3d8328442c0212a46bb79f72235. --- home/gpg/default.nix | 9 +++++++++ system/services/smartcard.nix | 14 ++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/home/gpg/default.nix b/home/gpg/default.nix index 071824d..4dd1556 100644 --- a/home/gpg/default.nix +++ b/home/gpg/default.nix @@ -51,6 +51,15 @@ "Uncompressed" ]; }; + + scdaemonSettings = { + # Tweak GPG's own smart card daemon in order to play nice with pcscd. + # Essentially, scdaemon shall not try to acquirer an exclusive lock and + # this will conflict with pcscd, which tries to do the same. + # Luckily, scdaemon support sharing access with pcscd. + disable-ccid = true; + pcsc-shared = true; + }; }; services.gpg-agent = { diff --git a/system/services/smartcard.nix b/system/services/smartcard.nix index 8b58540..cca9ca8 100644 --- a/system/services/smartcard.nix +++ b/system/services/smartcard.nix @@ -1,10 +1,16 @@ -{ lib, ... }: +{ ... }: { programs.yubikey-manager.enable = true; - # We will use GPG's scdaemon instead. - services.pcscd.enable = lib.mkForce false; - + # pcscd will be used as the authoritative daemon, interacting with smartcards + # like Yubikeys. + # + # However, pcscd does try to acquirer an exclusive lock on a detected + # smartcard and so do other daemons (e.g. scdaemon from GPG). + # As such, we have to make sure that other daemons work with pcscd together. + # + # see https://github.com/OpenSC/OpenSC/wiki/GnuPG-and-OpenSC + services.pcscd.enable = true; # Add udev rules for smart cards hardware.gpgSmartcards.enable = true; From 73b302d01226b8414c8c2941d446f895bc73809f Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 01:44:56 +0200 Subject: [PATCH 177/184] helm: fix installing incorrect helm package --- home/tools/k8s.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/home/tools/k8s.nix b/home/tools/k8s.nix index 90e5e6a..1579bfd 100644 --- a/home/tools/k8s.nix +++ b/home/tools/k8s.nix @@ -5,7 +5,7 @@ pkgs.kubectl # Deployment - pkgs.helm + pkgs.kubernetes-helm # Monitoring pkgs.k9s From 5814588d6d889811b258d9edbb40f87cfbee2bbf Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 02:06:20 +0200 Subject: [PATCH 178/184] installer: fix bash shebang --- nix-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-install.sh b/nix-install.sh index 9549af6..3fd29fb 100755 --- a/nix-install.sh +++ b/nix-install.sh @@ -1,4 +1,4 @@ -#/bin/bash +#!/usr/bin/env bash set -Eeuo pipefail From 02a58c14baeee8cb585d8f2e0165060f6beef805 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 02:08:21 +0200 Subject: [PATCH 179/184] installer: quote file path Apply shellcheck finding. This prevents potential word splitting and globbing. --- nix-install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/nix-install.sh b/nix-install.sh index 3fd29fb..ac36ea6 100755 --- a/nix-install.sh +++ b/nix-install.sh @@ -70,7 +70,7 @@ echo echo "Installing ${FLAKE}..." echo -echo "throw \"hardware-configuration.nix not yet auto-generated during setup\"" > $HW_CONFIG +echo "throw \"hardware-configuration.nix not yet auto-generated during setup\"" > "$HW_CONFIG" SSHPASS="$SSH_PW" nix run github:nix-community/nixos-anywhere -- \ --env-password \ --extra-files "$temp" \ From c1cc779cda22e715bb9094bc97c5e37dac72683e Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 04:41:20 +0200 Subject: [PATCH 180/184] tux-ibp-amdgen9-nixos-btw: prepare initial onboarding --- .sops.yaml | 3 + hosts/default.nix | 11 + hosts/tux-ibp-amdgen9-nixos-btw/default.nix | 30 ++ .../hardware-configuration.nix | 4 + secrets/hosts/dell-xps9360-nixos-btw.yaml | 286 ++++++++++-------- secrets/hosts/qemu-nixos-btw.yaml | 286 ++++++++++-------- secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml | 188 ++++++++++++ secrets/network/private.yaml | 286 ++++++++++-------- secrets/users/rtucek.yaml | 286 ++++++++++-------- 9 files changed, 888 insertions(+), 492 deletions(-) create mode 100644 hosts/tux-ibp-amdgen9-nixos-btw/default.nix create mode 100644 hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix create mode 100644 secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml diff --git a/.sops.yaml b/.sops.yaml index b4ed51a..c445ff1 100644 --- a/.sops.yaml +++ b/.sops.yaml @@ -4,6 +4,8 @@ keys: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk dell-xps9360-nixos-btw: &host_dell-xps9360-nixos-btw_age | age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + tux-ibp-amdgen9-nixos-btw: &tux-ibp-amdgen9-nixos-btw_age | + age1pq1f7nk5g0hcvy522fpgnp48gxt63cpyh24cua9jc3hwjdu4qvlpr4udymsgqh6498max2w867tect39gl62ru8kws2gshupfeg4gzggz8fw85cqrnqe2llyxt3ke5gtlprfpm44suu9f9mesu2rffhlcfyecvurdylvk6petyc7p549q832u9nknznujthesy0ypdherhz9jpsc4gyngewrx4udlzkrv35re42xwtlqdtzm4yydxynqncjk3lyzu64yevahcsvcvnew4rrgmtnssxnvkry6ydtvwdsws7ch3d9zgc2egcvwjc50snxulcxx6vuq0yskapv84upus9hpdn9kl98j24zvuqazwttw4e8qe3jp2vpsfpu88pl6vjxv3krmzqzkvctevcv7xe4psz7tas8p0588kh58j8zfpqq2u6k92m4y9ugcd6hgsz9ja4zr7eadln94n6n3548jt0s2vshjd94pp6ct7ls3peecgmkh3gltzcdlq9ceytv8se8yhv7vrqsx5fdexn65samrayd5qs5xd9cwsyt7ea2nvsmp4tjx44q6guesu9qam4un6l5dx5y5dr2fy9r9dccp35ry64305ckkkcecz6rw3z6zl468smspl0hcgsykw47ef33euykywkpq68psnkfkwennu3cwjcyupv2fgrvd2d6n35emgn6w0eqk08psd25qr8asuv7sxuyr5w26ajqjmhccv6f0d42dqsr4ecutcuzxxnzcax5hgtwk54xsvnnexx4phtzhshgxxhyx9pvknzjtjm43z4d89mle0pug63j9g44ez3npqc3td0cuygpecqdpncfzfqzrnykt388p9l4nkj5cfazmp9qtd0gfxl07qjnswmk684u77zq2jpxsn6j546gf7ql9q5k37mv0sn25aqngs0mgzpu4jy5c8heqqf55u0kg67907gxu5u4f8cjtztqqh5evlqh99t0jlvtccj54kc0vxu32adpfzesp3zjy8kzg7var3ku03e08kk8r7zeeptp2p83cwhsmxvvfzmg9jppg5ae9xhukfens0pl6sr450q3pg4rpj74f088wsj9eegv2umv858329ypgjdr54v50lyne0t8xddqrczg3n9vgzkw6tzn9s2tmvsxha8legfpk79lcf9yepf8ln5h54lcn2qg6jmqhkff6un930suw5zgx67l7670ljkg4pxrgfxnpum8xmmc7wk4eegpytqvkp0jh8enhs9hap9nker8efshsr4txe4tttrh5paz9y3h89rjxwl8k5tysal7n0yzau33w2fvr4u8cr05vtrct09thgj2hn6qjqeh5ek80y49cmqyca6pryjnqdxj43njctqsgpk0ndahqd5qc3t3jxssj7g2rdul3jvk5tgsmfpe8dz0pjualv5kgwgwl7pfvfu9pvcx2wkt6e7xe4eu025jksj5tdafcewcqhz7w6sy55fhx4a4ec7hz9yh3x230vaz0fvuxdzvvvm5ze349gsv2qkrj534pqk6ffy6wtwjawrztjnxl84sf2l5k73ptgjmefwgmzmyxxdteeqeyesl38ykm3pnsey6xd2c0pzsngcx2283vtzttj79jht5gl43qxrlh2s3efdd4wqjwkq5dv9n83ptzvefsvlyp5nvkyzndvu8ywcg5jp6cyhl9ygtjz42layjyzylkuxefwfcmqmejvmxqm4keklrnvx8nd6k7yp8mxxprljcde2s5xz79duyte3kckvgp0fuqlsnx8ty7vnk5pz4m9mk33rtz3ujryxkvsur72egqexvse22nlgukklaus67kcm4n0uty0dj3pxtyl7fuz2x7yr3zw6vp6pvy6r0fwjlqzdkxc0rug39uw2fyr0gx8a964ef5dplp49mqlpqq4e0appfzrumnuawfy5mdlqd users: rtucek: @@ -19,6 +21,7 @@ creation_rules: - *user_rtucek_age_identity - *host_qemu-nixos-btw_age - *host_dell-xps9360-nixos-btw_age + - *tux-ibp-amdgen9-nixos-btw_age stores: yaml: diff --git a/hosts/default.nix b/hosts/default.nix index fc5def3..8763599 100644 --- a/hosts/default.nix +++ b/hosts/default.nix @@ -39,5 +39,16 @@ ./dell-xps9360-nixos-btw ]; }; + + tux-ibp-amdgen9-nixos-btw = inputs.nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = + laptop + ++ commonCfg + ++ [ + ./tux-ibp-amdgen9-nixos-btw + ]; + }; }; } diff --git a/hosts/tux-ibp-amdgen9-nixos-btw/default.nix b/hosts/tux-ibp-amdgen9-nixos-btw/default.nix new file mode 100644 index 0000000..be35ed9 --- /dev/null +++ b/hosts/tux-ibp-amdgen9-nixos-btw/default.nix @@ -0,0 +1,30 @@ +{ ... }: +{ + imports = [ + ./hardware-configuration.nix + ../common/users/rtucek.nix + ]; + + networking.hostName = "tux-ibp-amdgen9-nixos-btw"; + sops.defaultSopsFile = ../../secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml; + + home-manager.users.rtucek = { + wayland.windowManager.hyprland.settings = { + monitor = [ + { + output = "eDP-1"; + mode = "2880x1800@120.0000"; + position = "0x0"; + scale = 1.5; + } + ]; + }; + }; + + disko.devices.lvm_vg.volgroup0.lvs = { + # 250 GB of available disk space + lv_root.size = "250G"; + # 250 GB of available disk space + lv_home.size = "250G"; + }; +} diff --git a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix new file mode 100644 index 0000000..5589c62 --- /dev/null +++ b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix @@ -0,0 +1,4 @@ +{ lib, ... }: +{ + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/secrets/hosts/dell-xps9360-nixos-btw.yaml b/secrets/hosts/dell-xps9360-nixos-btw.yaml index 8fd8b41..84012cb 100644 --- a/secrets/hosts/dell-xps9360-nixos-btw.yaml +++ b/secrets/hosts/dell-xps9360-nixos-btw.yaml @@ -3,145 +3,185 @@ sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IEdBL0c4UTE2 - Tnk1cEpUa3Rpd1ZlTy9BbXRiKzk0cThMa0crUDE2cEh2UjQvb0FsZjh3L25tUkE2 - TDZkQnNuMElPNTBjWGl3M1lRdXFSeHVKMFRDSW0xY09mYlc3K1NiNnc0M1ZHa0NE - SVVMRTBLdFc0Z0p0dlJZSER6dTBSWnZ5VFIxWWk0bXBtaVJVWWN0ZTREWjllZzFX - dXNiNThOd3VOZFVUM0syd29kakxNK2g0cnYvMXhsRk9WbmtFUEk3bXh3dGplcnBG - OEZFaUQ4TW5uWE9lVHdESEhrTTVYekl2bjJIa1duUWRmM1BYc05LaS9rdjdWb0VP - UlJQcG5hWWdaWFBSZUVHQkdLT0JOSll3Yk9JVDJPV1BIQi9Zbi9zTHZIbUptY2Qy - blE4S08xcHVQbTFHM3RBeXpuR0pUeHZZazBpQ1FmQWRjeFFoT2hlZXp1SkJtQXhr - MkZRaTNFNVdyRU1GWmxDbXp5L2FIa3dCOFY1a2hPNGZjTmhmcXZ6MWV4WEFJWE1a - Qm5kazhjTzNJZ1BVWGo4NWtBa09GRUVBWE1rWFZQNVlmRzl4a1JRUERGdlo1am1z - NDlNUGR6d200Unp0ZXpScCtoOHZvR0dVdUNwN0VEelRYdEl2Y0sxbHdzMFc0NWlO - dGdXMkE1Q1ROVElrQVU4WWFjU0pxRE1vRmo5aWlzM1I0QVVOajJpalNBeDZZWWtz - Wmw3clhVT05jR2hJV3g0d2JVYmoyZllaSzB4Y3RHRW53cm9MeHlZU25iK0FnTFFh - cGUxV25NQTR4Q0YzdXJXSjRDUDc5cTA5REpuSEpIczg2NjQ3eWVpV01KMkRYVHho - UGNuZFBRYUtSbFpYN3h6WEp4S09MVkMzM3BYR1RMRSs4RXExeGs4OXo3Ukh5eWo0 - dWp6ejVJRnErc0VucEExZ05wWWNRd3ZjWWFDc091eEFSUVNaRmlld1dsYkU1NEVV - RnQzaWtNVjBWUW5iUFlReldOcFZxVC9OOGg5MUZXZFZOTGhYaW9Qd1JJVGkraHBP - MVFuMDZncFkzZGFIcStIdzg3c3U4RkQrUmFnSm03U0w5Q2Jnbk4yUG84REVZTnhy - ZDBCNVNXME9uakRVRlJlUlhtUFp3dk9senNxTy96VnhqSGZZWHJSVS80VXdFRERy - TEhoWkZkek1GbHpvZEZtL01iOVBsNE5xTGNQdld3c3NkQ3hORk9yeHdBVkQ0QUVB - VnFzWWtoWnJSSTZOcUxyVTExcmJOeThEWmRONFU2TjZnSHJ3eGdKOWQ4K3JTb1hM - V2NJSm91dUczYXRtNVNaa0M4dUF1U2xjTVBWckFOdGxlaGNTdGpHQW9jMEhzV29N - bldqanBsUDdtY2RCc21VZXZSR1VPa2NvQmNTWnJka043QVVKWE84L3M2WXdUS3R1 - K2VpbXZTVmROeHJvSjFscGs4bGFYd0R1Uk9iWStobkluT1NZK1E2UVJ5a1JwQVNQ - aUMwL21MS2VoZm1yZVpNR24xQm5XdTlnWmpDUzc0QlpqK2N6cHF6S041blNJeC9y - T1FVWnRyYU5NdE1Uayt0YTlhL1JESFBqblcrazkzQ2dEaXZPTUg1RUVidGRMTEVI - cURZTjBIQ1ppMUhham96OWMyVEx4SWNMcE9HMnZYVXA4R0dUdVhDSDVtOFBJa2w4 - dnAvOGxJWHkvR2FhK1pVUFlpQlk4eUFwMEhIVXJMVEJzMVh1Zm1BTTBscllqYUZq - emhES2U1eVNOMjdIYzdWbW5UM01kZnNhRmxUcVJOc2tWaTNKbEt0Rlo0cXBENit2 - WFdLbkxXcG5RKzF1empDa1FNeFlJQitRZWtabXVPWWlCYWh0dVNUZmhGMWRuV2pm - ZFZFcDk3WFA2eE55bi8vYzVDWEF2am8wZ1lBWSt6YkVXYUNHVytscitEWDJWdzAr - OURvWmJCdEN5YlBSWXdHT3JPYmtLbzZ2NVZvRjd4a2ZwK0JUVmQ5amp1c1VLUQor - OHpNSk5ZTUFLNlJJdnhsYlF3TzlCbGpqeXcwRVhrQ0xhZ2QvZVgxVTdFCi0tLSBw - Z1lVY3daQXFtdHRBVEdkdFJvQlFBQURIQUllUHVGVUN3MnhLZFUyWWRBCnf6mauZ - P2+Issu8HnQ9rURnLVnno2gNvpZuEPliIezzyPcgJWEP+1l86s8tjhBaDpwo/VkY - NBErETIKs9EH6VE= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFh6R1czU1U5 + UWtZYXp1Q2FlVitYaFUxUEJJcXhNLzVnb01HZFhZTENSTm9hTlJIUDZGZjlMWTBz + YUk4eWhNdjBCNzlkWUpPVmd3ZXQ2K3RUZXE5SjFFbThhT3pHdThWTTZSZTdIQlly + TG5vOWEvRXJiRTNQZ2FFRUJ6dFhIOHdZYzdWYU9kaEljakhlaC9yVm1kamJNUGVo + RmN6dUE0b1c5eHJPSjVkV2J5NlgxWDBWSng2OG9OL09JWDhlVG9Udk1aNWl0Szhw + MklVNmdOc1VJNHNyaU03cjc0c0hWMnZkVEJoREFDcXUxYXRDaWFFYUNNNG14ejgr + SSswOGpvdHNLTCs3SjNGVjgwaEVqbnBJYXVrMmxIc0pxNDkxdnN2czVQTXIrb2Q1 + NFVicjhiZ0VVNkFYR21POWlOZWxiRGVGajlqS3NVT3FIcSsvNEJmTHE5dDBrTmdW + YXFNd3Q5c0QyZ28vWkdaSDV2anZBZXNnOWI1SzV0MmVweDBKUWlnZmVXTE5tTFFy + WU1mdXJ5TU1MdE1pbmluclVGaWZFYWxJdjVra2hnYVhMQ0JSTWFuSGRjNFhMdVQ0 + dTVPTkI0U0JhSjZtak0yLzNOMFo5TXRIczhiOUpuekpWRjRrK1ZiQzVnSWNMU0h1 + ci9yL0pjZndVb0U0UWNBcm9jRVAwUWI2RkQwVjZHSEZyWTB0cTM1MHM5WmRqelJU + ejd5WExXZzNUaUFJcnFkZy9Pb004elh6Qm1BTGx6eHlJb1p1M1BPckRJUTRFMDJZ + c2pKb09KbnNPVVg2V1hhVlZJZVl3T2pVMFVOQ1RCWE5aYXIxR2xJeXdyUzM3QjlP + UFZJUGUrMnBzblhFWEZyQnEwbm12TFRKS2FvZ0FEcFV0dmk2bmhvcG1SQ0ZyeWwr + YThhc2t4VWNnMng0bW9tN3VMLytJMkRIR2wzRVhyaEFJTlZZVFoyWGxpR2V3ZXk0 + ejBHd2FndzF4b3hvUkRyNHptaFh6NnlQYXIvR2NaR2RoOVZEdG4yWmc0LzliZEpQ + SmQ1SDRabURVeFVaT2JTM0VQVzdIV3BrbWRnc0VIWWxpVWd0UTRyeS9RVTFLYUM4 + TU1oOUhSck10VzN0aWFMN3dvL3NoOG5EVW5NaGNSelFBUlZMamo5UkxDMktwaE85 + WDFpMjlESEZaSDFJajZOZHRSaTlVTVlYV1k5MTYyVlFpSWJpZFd1K05VbGg3VE9r + WGhFQXY2THJscFp6Tk1xaElWL0lMeFBucmhWOXZRR2JiZS81QUl5YmhDcUlrRXlw + SW9xaXh4eWNFV2VPcGJ0RFVteXlJSmplNm14eXkwaEdMWUc2aVZCVlBIMFdOeWdt + QnNpZG94MFlBU1NIbTh4Sk1rQ2YwVUFSbGRyVXk2Tm5KMmVJRG1wa1RqZktGeEs4 + bTRnSFFLV2VCYk1lRExtVDl1dUZ5ZFZOTlNZbW5kb2krM2Y0UlpvYXJORDJ5c3lp + Rm5tSFRpSU1WN3ZoV212Z0JkTThZQXE0dlorc3Y1N01qZVJiYkwxejA1RERKNEtp + SzdmSkxNaytPRk9RSGt1YjlMYkg0VDBNNjZqRzl1ZWU5VUkrREUzTitVZ1lrQTIy + OXFTc2RvTU4vV3Bhdk0yd0JyNWs0dXBxem9GZUJkalNsb1hVT2RicTU0R2RQM21F + bm9ybXVvWUFrOTQzejMxZUVRbEtEN1VUcDJhK2tldFRqeWtqRHpUMUVjbXhSUFdh + UHVvUlFFUVBPVmlHcStQeERFRXUyc1RGNzZPcFZxRUljVCtmWnJvWXVPSUJQQkVR + YzNVNnNuL0JzREVBSEM1THFxckR0Nkg1TnFnSzB0UlZ2d2p6OUFTN3FBMXRjWGZ3 + dGtXbUFLRXpjdWl5bnhyUGlqNjNneCtxNnMzUUdWVVI3MEhxajU3N1BvMzMyV1Z1 + TlJTVkVORFpxS3Y2c0I0TEdmdVVLQXdZV3VXdGpCenNHdmVTRkV3cTF0dm1LQQow + VWIzUHlaMFhiYUhTSjNQT2dBQmp2cUU0WXRBQnZtT05yMmNLQWx0RnVjCi0tLSBL + Ykg3QS9NYSt2WktWWGh6QkhpMDZvZUlIRDBSbjFjNTF5WVdtckhNcnRjCp1b4Avp + 3MSpzVd4gstDP17Nakx4p3U3YQx/8GEgkjprcjao9cE7iWRuzpf3w9bnu60as959 + w6rmCmVnRbEkuWs= -----END AGE ENCRYPTED FILE----- recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGgwLzUxbnNt - WlVVdWRDVkpmd1AwNDNOSDVxempwemo4U3k3ZERxRzB2cU1WUGxoVmkzdjlRL3Vv - OUppdjZkUCt5TkpoZXFTRXVrcEdkcWgyMnY4WnlTR2FMUzdIUnRVNmNpakdyN1B2 - MDZrbzBEbG5wc1dveFVYNDdwbkovQlNGZWJhRjk3cDB6YXlwTU0rc2Z2bUFHTFBT - d2pVcGF3cktCbnRCOHRXb0NXQjFOVlYxamNGdmZzYVVHSGtYblpnbEc2REoralN0 - MDBZRW4vakpKTXR4U2FoeFg5S2pMWmxHVHdYQ0t1TlFSaXNMdlNOdlEyaUJKbHZC - dDVNc0xaWXVBZU5sdEQ2T013MWpTMjBPZ2xaR1VHWHlXTUVydWFMY3psOGZ5MHNI - RSt3d0pQWXNGa1JyT2RvS0hlYVN3UEZzdmZLNm1raWtNdjQ1OGdhcnBGZWZFdFo3 - cHZWN2pDSEF0RnhQaHZHMHl5c3VJdEhVOHFEcXhLYWZLSExJcHc5TEVQY2dGQ2Y1 - ai9jNnM1d1BYeFV5a2JwaDB4Z2YwRldkYUFVZDhnUXhrQ3JOUWprcnhDazJUMTRY - aFlyaWtYM2xOdjhCZ1UvTitwczJseUlCNmRLTHRzcDNaNUU4Y01sb3BCS201SVR2 - MUFtOS9Ndms1QnlCaTI3VXltVTQydHJJUis4ekZwR21vSC9BOWt3VVFWdVRCMTVJ - cWNTc3QwNmVVVnI3VzZod2VwazVpTGx6dHdBSDR5SUxlRjgzd01rZnloWGp5S1F2 - L1plVUhpT0dVdE5pVnRSTjd6Tm5OSTdpaUxHL1lSZ2lFWXpEaWgycDRYaWN4MTZj - bEdHM0dWQXlDekJTMWNZdjNTdGpzTVZSR1l2V0E3YVJtN3l4c0N1UmplUE1vZFNh - VllXTzZxcWRlbGFvRTBod1RMd1VXaVo5K1BpK3BkcjVFZmJrSnFQVm5LdnRPTjBI - RDREdXhzQ1hEQ2tTTHNwYTc3WmEwNCtJbTkzWTRIZHdsUWNEODRVYWlLcFJyMWZE - Mmo2cEJxeGxjNWpwcVR0R0VxMzlwNGp6T1daOWxmeU9GekhyaEg4ei9yYk5YOW1x - UWVWZTF0dGk3di9EaHBnUjB5SXNBTDJ4UUFSQU5NcXo1QlpodDBOS0U1YnQ4U0kx - d1NFOVNSNWRGcFlac0h2VmZoUzM0dUJTeHIwMVh1VmZFSUxTZXhWUWltanNncnFS - ZXdIeW81eW5rc0RHR2VZb0pJRkdvWmhyRXJsYkV5bjdMbXh0U1RhSFkxbElIcUZj - V0FycXNteDhhM1UrWlhTSEpJSFpHckFiSW4zR0M1YzQ4QklmQkVKcFdWNHBVbmRW - dmkyMlIyVURQNUxiMmJJMzJUTDlvYTBJM0kxa2V3RjdOd3pBMm1HRURDcHFNamw1 - QUlJajJlbXROUDhNWHlwaWlWdlVwZjdaeGRLMGpXQXhDaGhFM0xHTCtWM2EzT1hu - b1pQQ3BPRDJNY2xrSG1qbW5Cb0duSDZRWlZaQVFGWlg2OGFLK1FWbzBwWmFSa3Bv - L3F1QTVWa2hLRGlvWFdPTi94SmdNREpWdHlYSGJEb3lhQ043UmJmY0xMakowYWxD - VWNjbmgzbDNZVmlpRWxDbkNhMkl6Yk9UQU5GZVdvS21XUStLaE9BWFA1VjVXOElO - N3pnM3JTUXh2ODUra0l0WkVFWGtadi9kY0pVV0xKbkNnN0p2WDhhakZ0dURZL2tX - eHZQMVk1L3U2K0lWSlhjdWlNdE5PSlBXeURZZm5mbVgrQjJwN1RFMy9xa1JmeDJN - TWYySGpERkxaME1BUlUxTmJJRVdXeldzZTUrQytJaFYyem9TaXlWa0pLa2JyK1I0 - RlB0WWMybG56RWtlaTN1L2xYRkFaeXJXaDloeHZQWEp0SExweUNFeUtTYy9HdEx4 - aVpIcmo1cnRjOFh3QjdKOUgrTUpFYnJTRmNJVW12MUdoeFlBQVhKSjN4WTRNQQps - L1cwVzFyWVgxd29SMjlLSm5FdExIaTdBNkxhU2xiZkQyVjJNYzd3bTRvCi0tLSBh - NE5GUkljS25IWjRpWURTeDFlVkg4MzlUS3pUNXFjRW5jZ3lGbndDRnhNCgyTYMmb - ffhQRS6P12r4m0pX9KWIPvkiTdpfPWAppj0i/SmsRxJduxfKqL/snREMJfV5V2IO - 1gAs44on+45Dp0I= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDB1V2JjdnEy + WXE4a3FzMFNXQ1Y0RE15cjdKaW1YaGZRWWFlU2JONlRkMHZQblhCQWNWcG9lVVpj + M1pINmpRb0lZYURjSHp5UGV4OThKcEE0RzRMN3FRcmh3RmFhMGNqeXp1UkhRTXFo + SlNMRnVKM1RrWmxUQnFyajRFemkxN2l2RnpLbDVMMDhVSzM4dTJVY0ltYU5uUzhY + b0JNL01QNytqWVJ6NkhNRmszdjBDVGxoQ3VRT2xjb1VEZ3UycWpwb2ZIRzdSMU5G + dXRXZHlmSlpzY2ZEZVpyY0pzZzNFM0RJWjVLem9SNTVlSTlIOE1seDBjalRjVHZK + RlZqRzRkVWt3OXJOcWtzL2hHc0lmMzhiRE9MYkx5RW8yQXV0NEpPRE1CaGJYNmJJ + dDMvRUZIQ3dwTjZuNjdFaW12UUpVcmRCVkphT2dneGJkMTBsVk9MT2k4NmVJU1Vr + UWFqQlJuWjFnSXhaUlpHeExHNFZ0OG1rS1hCZEVzcHRlWWRGekdteWdKUVVUanph + ZkNZOGI0Q1dObTh4a1NyTU1RTmQ3d0MyWEhaVTI2UERUa1QwQy9pc3d4NHJqQS85 + WlRtNEhqWC9TdndUOXo2Zk9qRFk1UzFNMlhsMXNxWXNtWjVSQWVZZUlPZHlTVHNK + ZWtKN1ViWHlGZ1ZGcGVWd2FxbXZSdFVVTTJXdzcvc2lDcERBTTJJaTR0Z002VXQz + cHNmT2JrTlVGdTJOa1llb2Y4UWpycGpveDFXVXRmdnF6K2JEV3pOWEY2T3BMNGtz + eWRwQUZDMDhtRjh5ZG5Nd3FCWU15dXRWR1RZckV0bk0wb21zS3RjMWUwdkZuNXRJ + M25DOXRxdlZ5QkI5alhFdzlYWnNQT1czb0tSQmpQK3NXNDN2em9KUlBNNHJDRzgz + NXV2S0w0dFhYelkzRlh4N1AwOFk4ZktjUjdSbDBucFRmQURhMFIxaS9RS2w3YWtS + OG42aUN0b2dPRjdDWnVjdDc4T2pkeGQ2M0t3dkJrTVdBc0tmNG5ram5OK3pITXFo + WEdxMmZla3JOS3oxc1hzdG1vNlNScHJFWWRTRFlFa0F0c0t4dlA2N2FCcldpR0VY + bGlJNHdDY1VsUEVwTGN2Vy9mci9KTU9xNzBGZTNsWjdjQzJFWlM3b2xsakhTdHZu + MnFta00ycjlxcDM1K3I4VWh2bVBLZFBpdGRxNmV2anc3TVpxTTdEWFZjclJJNXhR + ek5lUmNmYkZFWkJLcGh2eHRjaEJiMjFVNEJGdUxqYTgyb09ZekZBYjMxdzlILzVI + bTdQeXMraE1IQ2VBQ2c0TW5ydHVOdCtWZ1FzbjdUak1vcnRyRVVXbGdxYkE2TGhL + K29yNjl5ZzVCNFMwaFhyMkdwcjIrLzZvSXM2d3VjcWs2Z3hlVU5VcS82NWtveW13 + VDZOOVBWcDBHKzJQR0xWNUhtdE0zVTFrRmxieDVSTE9ITldOdkpyNzJkcVEybFQy + dnYwQ3ZwRExxUmZqL29hREZBU2FFSEU3SmRNRDN3cjF3RytyTDF3YjA4MjlZSkVH + UGhKSUpYVW9NSEdxSHFETmNXTTc1SVBmUEpWSU9wMmx6WWMwVnZWejlqd2p1NHRj + RmRLREV3YlFNYkFmbDBMSWtNRUd6NXZJdmdIVnNZL0U5bEtIakIvN3lqTVFsR2N6 + MERObmRha1N3am9rY2tlWnNmZ214K091QUdWR1FLYXEzM3Z1N1VpemlPN2t6N0Jr + R0toYll1eEtyM24rbmlYUWFjc2g0a1dDNStDdGtWUHBDZEl5cHg0WnZ3bVFsZEhm + S1pYaC8wUGZodGJoa3RJNnpNMUppd3JZTSsxRVNwMGZSNFdGZW44U0JQQ1RCMGor + OHdtT1NYU2Z6OW5VMDlCbkZqNTQ1bXI0ajh6cUZFdGlTTy9tREdpd3k5L0dtblcv + eGhKNlM5OEY0d1oyZWNtYVNyZ3VQSjFTdTNzN2lUZmY5RDI3cHZST2l2TjZGZwp0 + MmlMM3k2SWxHNW55eExrcDNrczQ4Nmc4Y1NWdVhya3hFZWhPdCtwU2QwCi0tLSAz + c2RQYnFka1BRREVDK2E2L01kQlgzempKc2o2UFRVcWVNdFZYTzhBN0FRCt4+t+3f + 7xNmsVCIsP1rUwn21UFnGovlr5eXLYi0VI5Q4BJiJHI1kuFnRg0pvzcNMZtuXioH + ORPIYLdO+YHC+J4= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDJiOTV2U2J1 - Uk1aeHhtYWI1dFIzUEVDMFJmbGpyNFBPaUcxOFFTTzhEZUFWWVZkdm1UcmFaQkoy - ZWptNUE5QjlLd3lwMUsvQzY0bHc2YjVFWjRIQXc4ZnhQSmhlZnBOZzkyWmFHZFBR - SnpuQ2prODNBK2x2UFBlUXlrckpvd01HdEMrM3JTVk90S29yMDhISHdpemZsUFZw - aTNpd1NUY3g5aVRaZkVmc054d0pnOGg0QlhML3dsMEVpd2lrVnMxR05tLzZBQ2Vr - TXNVakxsTGMxZ2RjNDBaNkZiSjNiRGlJdjZ1SHh1VU9qMWNwY0VRWkltQ3U2WjZP - SXRHOE5YeUtZYVdiaXY1VGVETXlNUlJKVUorcUJrNnpmZjdyazVSYVY0SmpCUE1n - dVJMSnZJSUNKZ2J1bk1MVUJybVZITFpDckdTVDdpa3VYcFl1N1JCcDRpUFVjdnpI - ZHB4R1lTOW9pWFY5SnpWM3p0eExTYnFqcVlVM2twZ3JaMlZJQU1zOTVzWnU0YmRL - TGNQWHVzRTZtck5EL1NiSnNWZ3JkVVdJNHVSVkVxQVlzQXRoZ1RacnlTUTB6OEVN - R3JVclgwVWo3MHNwR0pFRWNYSENrbXZ5cEZIOGtsbVBKZ0R6dHZ5N1N2UW5TWXht - T0J3OEM4ZkFqRnAwVHVORktjdWRveTR3bHJOa1pDU1lwYVJzRHJwOWphenZkRlpK - R0FlU09jWFhvd29saHVXckQ0WDUwZWxtOHJpNzJGcGVQUlhSUUE3c290WEp2M01x - YjFJMFptWndaSzkrcDdqUkNQNUhESFlXeDJuSk84VVFXVVlNTDN2S1d4NmVwQjMv - b1F2T2wzamF3OEIrRnp0S2FZbGVQTHpIMDBFKzkzbmdmUVRnOG1mbytYeno2NDVC - VlFxanRkU1ZlQ2greUxOc3JnaGNETTg4RENWaS9YcDlRM0JMZGJscHdDdnRlSEFT - L1RKUmJlS1RJK0ZjZ25aQy9KblBXdGtmSDI3SUNIZTltMUFvQ3NUNW9YNUs2Rkw0 - MzBwN1Q1cDlpcUEwdFM1U2dsRFVFY3VvaVVLR003SlF0T3pRK2prcUJnS2lLUUVp - dm1aQytRYWhXeFYwQlRrWGZDNGcwSml0MFFKLzdwZVVYbC93OWVMb3g1S0lvNkov - ZHpNNFhrZHRBT2ZrSU03M2U4ZkxraWh3eUNhVnJMdkh1aDMyejZ2M2lJell5WHVD - TmNTd2FHRFZGUElSaElleGJRemdxUXp1Tm9oWjB0RXNZeWlzc1dVSlJoemJtdWhk - bHRidWY1QmszSWhBMXMrV05BLzdNNmhWbFgwU2ZIMG5sNFVYOW84b2tWTkFjanBU - by90enJkMTBSMmlVVVB6MURmOVUwMmg5dTVJK21MZ1RGZGgwbGJlVzgvbkVJbGps - UWxRTzA0NTNobGJuV0lJV1NBOFkyRmxWVXkwdTROM2JIZ1d0blhRZ3hVSDd4RHd6 - Qk5xRjBXclhjTE9Jb1lpK1UvUzgxWHFzNE5nQktqeGpuVTQ5Y25oVVR0aWRkOXpq - aTdvZ3FLS0hqdnc5bi9SZ3dLa2dhM0Q0OXMxT0p2VHJTVExjWE1PamZMWWxSVFU3 - bm8zYkhBUHZSOWlWcmZJTTBYREd6MTBpclk5MXNmNFdBUDVyZjZ0VUEzZHFiTUxK - VVNBNHdoWTlycWtKR2R4VzV4WlpQT2JLdldFSnorUnI1NXFFSFlMN0VtN0UyS2dC - dUJ5dUlWaXMyMTBNYTlhM1R0R09lcWVaeURlUWk2WlM5L2FqOHhBM3dQbExGVU9u - aFkwNW1LMkd4TWo5MDhWNFNRb2NZdkh4dmt5N2ovNGROQXplT0RxendvN0lWNTJJ - RGYxUGs1WVIxZnZadnJZTFZheHRYem9mTkE5QkYwaUQ4NEhLb0VqN2FVd1NlQkNU - MUZhSEt6TStoT052NFhFVDVLSU5zYytNRUxCaldNUTVoYWlNeUhnRVhWNzVLZwo1 - d2hlWVZsVk1mSUxpdGgrblhvaENiNmFTWndEcGQzYnhjMVhIeURSWVVZCi0tLSBt - WXRaRGEyODdRZFdnS2NZZiszZXk2ZzJtcVhrT1A1bmVkVDZDcTBabW04CpQgjEPq - DM4ESZwPuj9E8J3kHRLr+i9+Xe9rEwhXcdBcoNu494k1BOpIVXrCn50gA5uyhcYI - JRBR5gnwTWDH/mQ= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHAxb1dTRis5 + S0RmbHM3R242aUdNd1FmNi9GS2luVGZVUmxHOGk0Y2pWK3lVdSt5eTYwOVVwRHRR + RjZ2NUswaWM0b3BqcmhFUmlLV3dDWnpGMGhnL2c5MFJyZ1BUdHNnblNHYlVFb2JV + eEV6QlA3bEM1cDFvc0JiaFpvWDA2cWtXbzhjYVBiU3VobWRtVkRNbTg2Tk56VDN2 + N3FYakNraDN6QTNhYUc3bm53TUxLS2hKQkUvdkVxdXUzWElLaDliTUhVbnRCR09Y + WjRKNEllM2RkR05qcUcvQ3J1aDlaSUJNd1RlamVjZis5Q3FNbUxBNFdJZFQySmdK + Y1VQajZVQlI3SEdXbkN1aElzM3RRYm5jMUFBZ2REN2RrMGttUGJKK3pEQTljTXBF + QVNDa3hwcGR2V1NXclh1VDZkdEEwSzZ1bW5nSTJHcW9tYW1mbVJ0L25qdkRVUGp4 + eU9kYXE4WG4yUkJxamxMM2V3ZTJKcDBLSitHdTJpbWd5V3YwUkVubkJ4eE12NE0v + aUR4T29TQWFBN2RHSDFpWC85T3dYcm9RT2FQdi9NV2NOWHNJNzVsdTgwRFgxWHYx + UEc2RkV1cDc3TzI5TWpoaENHZHpHVHZZVU9CNk9oR2VDTlFTclUwN3FlWmpxajhq + bWtKT1NNSW5QM2ZYZWh1T0owUDhJSGVaN05UeEwwSTI3L0UxYWJwdFdmQ3VRVVRU + VThGNDM4VnozZkw4UXdMTXBIU1NJc3ZlcVlzV1RmYktIV3ludEY5VHNkS1c0K0VG + YVUwcllUNEt2UHZKcW9la1VXV3kzZ1J4OVV0bmtQOGg2S3VGQVh3cmN5TUtlakJl + WDlsTGRBRmFMTVBZV2NSajl1ZE1mZ3dsRkFydG13OXdzU29ieFptbzQrRjRCSlZJ + YUk4NTM3MVBmUUdXbWdXSVgwb1p3eFZPV0tYK05LOG15S0NQYXZwelM1RHlRTExn + Q09WTk0xYjNDdkt5LzN5S3c3YjZtMitDKzMxbk1QVzd3cWxSWlJOV1JDZEVGTmxO + UmZPb2VySmovTmhhOTFBOHRjNVR6dGcrVFhadzB4bTJmdklObnQ4aDBqQUMzOS9M + TzBpaTR4di8wZkY0UXU2eVUrck8relQrWGlNQ043MVI3L2xzNjZsdU9xeHZJUTFw + RWQ1a005NWdJUlplSkZkMmJlL0NDcXBOMUV2YW82R3AzZ2lUQ28rRHY1dlV2RWlt + U2NHTjE0QU1IOXFOclNaRGNvdnM1L081ZDZhSVFlVWZuQXRDVWNYNHlidGZTa29O + bFRKejVKc0U5MDNtTzBLbTRoUXpDUEhCQVJ3MUpZbWgvZC9URzF2UUFMaDNxakYv + dTB2aGFrdmZWTEs3N2tpcUJtdmlKdkpuZS81U2MxbWtENXNIdUMrUFJ5S0twQWtT + aW9ZRlFpcER5YngyUGFROUlrL01VVlI3V3lpTncvZEZZT1dqNVJwcGNucVhOVllm + WDB5QW5ZNFk4M0NYSG1WWndqemNaUkp5N1NuME93TjV2Y1BIRXZkditudWpibW9j + YkpnWUlqZE5EQ1YyampWQnVZdWFXbldwVEFSL3NZcFpPdzlQVTc1b0J4N29zRUY4 + K2gyOXcwakpOZmVSVzB3NS9BOTgzM1lIV2krRXNzT2x6S2hrUHNOcnFSL1RvU2pK + ckx1eFhVVGhyRm0vWjk2Zm54b09BSzlzbzZQWVlRN0U2dVM3aEptNjVUZUxMYkxL + R1JxdVFxUi9FTWZCcTBhUHFTS1VqUDNXeEg1eTFhWXhBMi8vRFRuS0FTU3hjOWVo + bkdOUXNjMzBsbGYzakFqVkxhOFdRZloyWUN5dzVxUXNXVVl3MlQ4ZC9yemVmWWcz + SnZaNks5Q0dnQ1JhZVE0TTFOditQNUxPTUN5Q3BkQWVSa01qY2ZXVXpYQWRjQ1VN + VStVTHZWSGViQTFxNTBna2t4bk94bGNyV1haYlhCbGlKbmlyZGxnbGQzWnpLUQpU + bHB2UFNrbkRadzA5THFWencvNmE5bUxuY3lCQ0xOSFN2NUZMOVAxWHprCi0tLSBV + NDU4NnRBanlPRDhkT2ZLSmtCYWJ4VTZ5VnJidCtyUW5YaVRlZ1JybFg0CsH2RBDO + laidGAIcsEHk8P0FBU5gx5dcUtqWM6dkNEu3E4N2V5ty9+jpR3Vz5qKLIaR+lKXl + ymQAbs/oJYLVPDk= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IE03cUF2ZFNN + eFFCb0p1OXRUcHJlK2RtdW44cGN2MEJ1Q2cxZHVCZ3hJYnhqREhUb2M4d1ZrQ01Q + aUkrMDJVeC8zakUrQ0JLeTVtaHRlazl6K21qU2s2KzBOUXI2WFV3SklBaUM5Zm54 + eWhWSWFEVTIrZ25SVnRoWitzZ1BQeVVma3puRkdXSDRoa3F0UkZRcWl2VXZZeHlB + OWZwbTdGcTU2MDRvbmpRVUxhVC91TTFUZUNSRFlSR0lwU094U1VDRmszbEZaS3p5 + ZXdYcnlXaWdYRjNCYW1pMEg3cXBGVDFYZVd4WW1pN1BCV21oT0J3S0hkRERhR2ZC + bWtxU0hzTHZUWDdFNm5XMFRxZTg5SjhFWG8yaFp4dXdENmVFbzlMSWJ5SmhocUhY + Q2d1aG9jRFNZRHNnaFFJMmVZclFWOXU0UDZsQkJNa3JVdWdBK1hKTGVBODhRRjlu + dml3Z055K3NuVUgzL2ZmV1FPWmdMek9uRStPZFhqaTNZdW9vZHRTYzdmdG4vL0hN + Qi90MXpCcjN3b1ZrSldhMnQzR1RZcStqM1J4OVQvSUI3aXNvbXlRczhZOGhwK0x0 + VFlsWXIxaDdmYXpzSHVUVXdRYXBvT2JBYmpkWUtGR0FzMm9DR3dnRFNma3paRW1I + WHpVQWxSeGxiRi9WMENiL2NCWXo0K1BvaDBaWjljM0Zzby9iTjVUQ3hDV2JRNW5R + eStUUllBN3NISjRhbkEzTEtnU21Dc0ttblJYZnRuM0c5VWVLQ2I0cmlBdk14MEFa + VXNVbHpoWjBIdG9ZTjJkL1RCWFM3NVkxcW93ZWtnRGwzbkZyZVY5TXV0RWVNbWh6 + WHlZaW9mOXF0dk8yQWNoSXpYMlowL09WYlpZTWhUV3dpeVFPRHl3Um0zK1g1WUtU + dmxUWHhrRVB0Z0hhck5hVkpSdGpKZFVwb1NWZE9XYVFkZ3J5Rk8vRStSUlVCOTdo + WFVQVTJ6ek5lL2lOVGp3UmI2WFlTQmtNNlNZWndMTm9XaHJXSVd1R2NBRlo0WnJE + ZDI1YXJFazVxcElkUHNFU25ncWk1c1JQNElsZ2pidkpKOGVRUWZSeGI4RGhUaVJG + QWNLYjlLbkJrZGZuUEpNWGJIQjdkNS9IMEpESWVwYkNIU0o3NWlzb1NiQmtzaUk0 + c3FURWJRNmdsT0FJS2k5bkhIcEtiV2YvRmc0eHNkV1lSblNZZkt1UEVYL1gwTk1z + M1RVdExwZ3NzUDNCQ3RDWVd2cWU2Sk14cjNlc3hpb2pkWWlLaUtJQjhkWUJaUmJi + RW1wTSszbzlDMTlqdm9waGV4cjhJT0JZd2VUeEMxTCtJUWtVcnJuTFJnVldPUHA4 + MEh2b000SVBBWjUvRy95VW5PZkU1dXZhYVlDcUF4dmQ1MVNBNjVVZEQxc2o0bWVZ + cWxjdFBLcXIrSW9NeW83ZENxNENIMjFHckxQT2RWMEhVMGh2NnhoK1NDNG5aZ2Rm + UmMxeGRYbEE2MWMyZkpUQklJQjJ4YktEVkJJTkQvZ2NGMHg0V0o4VldLOVovK1pX + eGxnb1ZQQzhZUGpZd2NQdzk0UENqWTU2cXd2RlIwS3VtajRyM2tJOVlFZzA1a0ty + RkI0OEZHdmtycVFBMEhMaEhVQlBLN0N6Z1pPRGE4ekx4MEJIRWM2Vjk5d3ZkN2Q4 + VmszcmVXa3AwaDVJMkFiR2lHQUR4WXNwNDB3YXN5Yjd3ZzdIWDFGanpCTkZ0VE9Q + TlF4d2grZHV4SzhPcEdBMnhtRnMwRGxxWmZ3eXJ4RkhkRlRSK1cvcXRCVW9DbHha + dmFwdFBFbjg3ZUFKVHJFNFhDZ1YrR2ZocVVtZHAyM09RQmdVeHpFMHZPdjJveFhC + bGsreTJyYWZHb2svcXVWTnk1aXAzTFVUUDlWSkZzaktXVVNTUkhYTllNUlFYUjVp + K2VoQWlucmxBVzZoUGpOZjcwMzNZaUswT1lXWk4ySitVckxGUzhkZ3l0UjJiQQox + aDc1UU4vQ0o0WUJJSjFhY2FrMXJSWE9KYTdXUTJvanZaK0xBTTFtODRJCi0tLSBq + ZHpCVGx4ZHkxS0FQMWJlSy9lOGJGNDRMb1RPblFIWCtHLzBCWGhSb2ZZCt0oY4WE + 0hvS9vfqF8fv6txrZpvlLUacEklgD9D8oU78q1iUL6AHEr4xW1uJUaISv52tPHXy + qveNW5xy7YDx1lk= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1f7nk5g0hcvy522fpgnp48gxt63cpyh24cua9jc3hwjdu4qvlpr4udymsgqh6498max2w867tect39gl62ru8kws2gshupfeg4gzggz8fw85cqrnqe2llyxt3ke5gtlprfpm44suu9f9mesu2rffhlcfyecvurdylvk6petyc7p549q832u9nknznujthesy0ypdherhz9jpsc4gyngewrx4udlzkrv35re42xwtlqdtzm4yydxynqncjk3lyzu64yevahcsvcvnew4rrgmtnssxnvkry6ydtvwdsws7ch3d9zgc2egcvwjc50snxulcxx6vuq0yskapv84upus9hpdn9kl98j24zvuqazwttw4e8qe3jp2vpsfpu88pl6vjxv3krmzqzkvctevcv7xe4psz7tas8p0588kh58j8zfpqq2u6k92m4y9ugcd6hgsz9ja4zr7eadln94n6n3548jt0s2vshjd94pp6ct7ls3peecgmkh3gltzcdlq9ceytv8se8yhv7vrqsx5fdexn65samrayd5qs5xd9cwsyt7ea2nvsmp4tjx44q6guesu9qam4un6l5dx5y5dr2fy9r9dccp35ry64305ckkkcecz6rw3z6zl468smspl0hcgsykw47ef33euykywkpq68psnkfkwennu3cwjcyupv2fgrvd2d6n35emgn6w0eqk08psd25qr8asuv7sxuyr5w26ajqjmhccv6f0d42dqsr4ecutcuzxxnzcax5hgtwk54xsvnnexx4phtzhshgxxhyx9pvknzjtjm43z4d89mle0pug63j9g44ez3npqc3td0cuygpecqdpncfzfqzrnykt388p9l4nkj5cfazmp9qtd0gfxl07qjnswmk684u77zq2jpxsn6j546gf7ql9q5k37mv0sn25aqngs0mgzpu4jy5c8heqqf55u0kg67907gxu5u4f8cjtztqqh5evlqh99t0jlvtccj54kc0vxu32adpfzesp3zjy8kzg7var3ku03e08kk8r7zeeptp2p83cwhsmxvvfzmg9jppg5ae9xhukfens0pl6sr450q3pg4rpj74f088wsj9eegv2umv858329ypgjdr54v50lyne0t8xddqrczg3n9vgzkw6tzn9s2tmvsxha8legfpk79lcf9yepf8ln5h54lcn2qg6jmqhkff6un930suw5zgx67l7670ljkg4pxrgfxnpum8xmmc7wk4eegpytqvkp0jh8enhs9hap9nker8efshsr4txe4tttrh5paz9y3h89rjxwl8k5tysal7n0yzau33w2fvr4u8cr05vtrct09thgj2hn6qjqeh5ek80y49cmqyca6pryjnqdxj43njctqsgpk0ndahqd5qc3t3jxssj7g2rdul3jvk5tgsmfpe8dz0pjualv5kgwgwl7pfvfu9pvcx2wkt6e7xe4eu025jksj5tdafcewcqhz7w6sy55fhx4a4ec7hz9yh3x230vaz0fvuxdzvvvm5ze349gsv2qkrj534pqk6ffy6wtwjawrztjnxl84sf2l5k73ptgjmefwgmzmyxxdteeqeyesl38ykm3pnsey6xd2c0pzsngcx2283vtzttj79jht5gl43qxrlh2s3efdd4wqjwkq5dv9n83ptzvefsvlyp5nvkyzndvu8ywcg5jp6cyhl9ygtjz42layjyzylkuxefwfcmqmejvmxqm4keklrnvx8nd6k7yp8mxxprljcde2s5xz79duyte3kckvgp0fuqlsnx8ty7vnk5pz4m9mk33rtz3ujryxkvsur72egqexvse22nlgukklaus67kcm4n0uty0dj3pxtyl7fuz2x7yr3zw6vp6pvy6r0fwjlqzdkxc0rug39uw2fyr0gx8a964ef5dplp49mqlpqq4e0appfzrumnuawfy5mdlqd lastmodified: "2026-07-29T20:24:34Z" mac: ENC[AES256_GCM,data:9Gxz+YmSpRYWljVIK8/QXGHBrHItsirBh/AVgQ1uTbDZMe/l08rHfmFQC8wfcyq2FY9vWREItqH05VBtBQ5KdMUrOmkGi3Kthm59EtINvWVQkQzDB03rllaO9HMuxLSi2X2zsIo5Ad8drgRQdbh2qZMlvWhFeGzOOEKLBHs8olo=,iv:v+p05e2gwL3yE+iE8Ep00jf9VfTXwjhV754SxQ+stZg=,tag:MWX2ljnrqQB5FnkoLTX9Xw==,type:str] pgp: - - created_at: "2026-07-27T21:00:45Z" + - created_at: "2026-08-06T01:47:10Z" enc: |- -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ/9HUMtBKAOnqRGN0iFi6k13R1aa0uHiL5AP6ymBRWN+8bb - ToI06b888Pe73KEBBn9QctPWdPwRT1dzP0a62I1an2tSECNryZjs2vZoooFAZCcG - jp8tJUnHJnsbJbFgSX/iU+vLFj7O/VUCgIxMqupshB8dYVtbLBQaGqV6d31wx5Im - YhjsgrN3n/vto35u0kDEGXxqkue5wr3T5rwEy5LUgEYibM1Z5y9nJcIXSIzepiXR - 6fVsvIjwl7gDusJl76BEXZOmlqC3WXK+whx25CATRgnQ4GPxJM/fbMFxQz8oKQep - Aejkjmgm1A2SxyqY+j+n9gKSirAGl9lGbbjCTOgR03MPn3EW5zBo+P0hvRBLcihS - u3Lycptf6LCQKu7EIyJ0TPq62cbm9+H/ehBWOVnXN7dOoomfbTG7uEtXvvKeXaQN - Zyr9Wqrotag7cD2y0dY3s+s3cIdnRuwQoYzGd+OuPQWcgHt7jgZ0iV3lRvoVtMWk - yvkoyGaibtB+EemoAZ+M9CvLn4wycvluhOO2H75shXgr6b1nX21LE7qIDt1wzqN7 - S34NCQ5ZO4ix9Ki6F5aaHgbEo2ilDwpKOLZFtHt4lYTs8iBKIvih38x23OSYMspV - DJR2Lihqvd0vhypq9wIyLFysvhbuVv+uH9FvQ82h0eSPwbv1gVULqfn7KBwG2jbS - XgEaoBzusP2AMznwqPllA4tme5MhvU6JlB2GgAXWyNj6AC+pe1DZaJx0PMsAzUKi - GSWj8N87Ck8wNuXnVCXyIJY17iNUOcOCkYzXXCMS5VrXCeXD9MxehA7WIRxMlLE= - =2r9L + hQIMA9/PFHehMxwxAQ/9FIcKAVMJdx1CpPVkb2wfHA4GjWnhh267dD6ApFnJVVAd + W/Xs4a10ADnpWMRiguE7GlAsXS6Q2Y26tjbZfyz2VsPEwNmMtB735NN6DiM2uoeQ + 45RP2Fi4H9r1WpHEpL+BRi3dmJSufZgLSc4alTORqWgpMnfOqiKfrxp9C8c75njK + /yrMZOV8XtbU0wN+zk1l+BIXduBsuUYeRmKnsdHKj0gt8is80zHa339xnStOLjOs + I3ahDAxz/ieDMJU+3ho9A3ZoOCuXnYpB6Xqm/tpEC62RUTEFJbGo5pS5jgUDdiBw + fIVTQbjUzx07qyTtPSECrE82id5Ilht+xsFCWqa4FFtHSy2RS0AQSJwAA8q5T6md + 6QJ4mjn5fY5gEI7pSQjmyliGx7cwgnChQIH419Iv/XxN+l03cbKyASaIgjcTNqQb + IajmNn4dVxaU/fzTWAF9BiWEgwtM4plxEC7MSEcidTz0+kfCv57Rg33YYlqR5SLN + c6CcbVWIo3+djEfVw/T1aN+sjg27Q38XXQ/HJRTqiQkObyR6ABHx1jIkfj7HQvQc + gDeffpUXO08UO1rFD8zxPI0HntZ07xenFAhKnS856cbok5sJF02OLsi3v2iMTmtT + b5QsnvHSpl6XPhhaQ1qQ9Boev1EsdIq8a0K6+CHSd2f+fkvkLPnmoq0fqjspvKnS + XgF2YCH+nCbFRkzsW/2Te7x4N7uy7KmqsDGGCap5SWS9Mz1VAnDWUzI3Js7M0k4o + VoSHmi/bdKY5DgxV/MuTEsDisIVHwqY2hyxhqDvj/j/DUVuk9eMRNszQh0z0NmM= + =WV+P -----END PGP MESSAGE----- fp: "0x416CF1EF9AAF90BC" unencrypted_suffix: _unencrypted diff --git a/secrets/hosts/qemu-nixos-btw.yaml b/secrets/hosts/qemu-nixos-btw.yaml index 89977bc..47796a5 100644 --- a/secrets/hosts/qemu-nixos-btw.yaml +++ b/secrets/hosts/qemu-nixos-btw.yaml @@ -3,145 +3,185 @@ sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHRYb3RMZFpm - cHVpc2FKQVRsRHRZVWp2SHZjWGJRd2FBMjBHMHE0TXZmUUxRVW9yM2g1WnFMS1Jo - RW5LZzBOaFNUUHg1SjNhYjJCZW14UG1wMjhMd0t6V0pzaGdmTHhrVmw0aWJ2Znpz - aTFURUh6Ym8wZWQ1UlhiNDMrOVFmR01YdS9ZUWhITEs3RlB4ck1HWWwzK2c3TCtk - d2lWVzEzczhPTWFwTkVrSldrUnAzWnVPb2N5dFlXYjR0U2R4UXNaUGFWR3JyaEVH - UDd2cnhvaWM4WFNwS25FK056YUlKK1VMblJVbWZQTmZhblRUbGovOU9SM1YrWC8x - VDg1Z3dJdXpUY2xmQXJJYlZ2KzhUVUQzZHJIRHFEMmhKdkpXa0psbldOMStYZXQx - WnFJVldGZFVmY01meHE1V00vUW1pQ1I4OEMrdG80U0hxVm1hRDJHVG5SUWtMNVBm - YmZmRU4rdUJqN1dtNzhuZEVGMEhXNEsyc3hKQk14Nlh2RUJiYm1yaEJCdmdBZlRw - cGlKVkRBUTVPVUdzdXZ6ckRxdWwvNEdyTHFRZVNqQTlyNVBnbHp1aG5sL3h4UVBl - OFVFNlB3K3VrSnE3ekN5a3FGY0k3SFdpNE1uaGt1Y2lQNGtwOHBBejNOZUVEWnJr - STZyVFJxY3pQRER3dzlyVk9Ea3YyK3lsRWlwTlM3S2crVFZZbk9Ya1V2OFJsUHVC - OW5FaGdlQWRXaG1QKzk3TnE5MktDZEFFcmYzaWs1bEExV05lUDZ2RWg4S3dZYTQ5 - NTdmTkVuZ0sxWHhSQ05QOUZMRnNOWUFhV3J0c0hha0FGUThtSHZJRWIxb0FsVU5B - T0U5NUtPWlRtRWdEQTJjcUlJS0UxazFkUDVZMnhSZ1BuRnpGQVFXU3VFS3lnd0hB - ejVyaVdMOWYwNWdNVkV3Q0dHWDNVbUljL2VJaGNnalNaaGVXZVRRSDBoL0Z6YjBX - WDJZSzZveVh4VFhoWjNJMzB5elZLblJzMEFPQXFSYzhWcUlsdkJhbFVIZTMydVQv - azFvbTJxSnhXVXhsb0RpYzlKTEl2TjRoaHMrVTM0elVoZGNhekxpZHFJYTR4VFcy - Nk1YL21mVHNvcTNMMXJTU1lzd1J6WkFPWHdiZVUvbE0yTlg1WkMzZERwTG5rcS8r - UFlBdURtODN2aVBnaXoyc3VBTnZTK3JzMlBTWWFLbFJLYnFqaHh3Wkk0NzNVWFR1 - L2tXalJhdXdES0IrQUNPVjZ4dDBxNXRDcVBVME5GQ1JqMlhnVk4zVTdjeGt1WVFO - QjhvMFphSmhadjA2OHQvWjNzZVlZaXJneXh6cEl5dHpjZHEwNzVtUzZDK291UVRQ - UERHY0FEanB6TWN5WEpGbUlXNVk0clhCVDQ4Wmw5d09UdmtjZ0V5bWQra2dKY05K - V1FaejZLdEZQZG9jSkc3bk1oRHVoOHV0cElGazh1dXplNHpLQTZpeFVTN0d2dXFq - MDhhWHllTy9JZWpxbnJ0eThlWFFxT0c2ZURBbjB3cHg4YllqMDZSbm5WODVYb3lO - MVBSVWJuMmhORmozNHp3QmxPc3dIM0dxbjV5T3cvVGluYkFPV0l6TnBjY0JDUDJI - dXJiQXVuVmZuMXhaSE8wajdTRWRTSXEzdEpDZWtCUG94clN5bHpxQ2QyRmpmL3Z2 - SHo1eVB5MGhXRXAwMU5rWTYwWkJ4NUtOUm9YbGRGNFZuQVpHWDUvOGpxNVVhbzdH - VWhSbmVHMG5zZ3J2ZlZRNnZBRklVT2txc21waEJPK05BbVg0LzN0eGNYN003TUN6 - QnQ1YlJpbHNlMzV4dDdhWmxCQ28rMGEwWUFXWHd0NG1wQ3N2TDY3djZHV3pkVWRC - bzZ0SnhXUzNCTGpPc1djekZTWTIrdW1kbzdLYmk0ZjcydHcrYlk3UWVLRnJhT2F1 - Z2lKNnB4QzI4QUVWTFZVdmZ0R1JlakZPS2lCN1dZTVhPYzlPWnpiUXlHYVNHdwpD - RDF2SzVkbkRJcFdHT2k0bCtmQmQrMlYrV0VrQlJUaXA2cUlNM05VOVBRCi0tLSBD - YWUrTTQxeVZxTERGdy8yZ2tuUDlVSFlSWktMWjJCcFE2S0dHUUlsUENvCvD/76Cq - WcsqCyPio5cbyQRUISwjqWjSkC6WrLHe1gaxldtlsvrAxkfSP+MrmgEDsVHFtEG0 - bWzowgesvq3vSo4= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDRoSkJXemd3 + MHZhd09LNXNIUWZNNnY5cmNxZFhoYkdRVWpFcjNTQjlLVFMydHBheEo2T3hMMEtT + SnJMQlJlU25BYXZmNDJCd1dsK2YreklOZEczOUZxS1B5L1VlOTN2ZUVZekxZYUY0 + VHlVOU9VMGxheDVJYkdnQXFlUFM2OThid2MySHBydjBDd2VLeStHSzhLaDhoVVQ4 + bFduZldWazhoa2c5eTRsZGNoRFF2bzd1MmdPZm5JSzJkVm9vcHgwdUcrRmRIMzAr + RGQwcGRxdWlhTUFIVmJpSTNLWk9QeGorMGx4V0FRZnVaanNIakNYMllaKzZWbzdF + WGp0SkovdUk5RDZnSGs3ZXZmUy9GRFExNzBFNDN3dXFzelBDWXBwNXNOR3lXcmIw + WDkySi9LWHBBamF5OGFkUVRDYnpWU25la2w5RmRpU0FiVzBzanRiUGJEZlBESG0y + UEVzUW5qRWlWdGZOZVVYOE43K05oT3NUQjhJUm5GdFRtaU5McGdTak5aTTJiZGV6 + eEhQcEF0czNmUlYrYkU4V2FmRHZPbncyRjFKZ3J2Vkhzc2V1a1VjV1ZiM0wvUW90 + WGwyc3g2TGxMdW84V3MyNWkrWkZqcVlRNjgzZVkzTlN6MEF6NkU3SXJkeDlkV1BM + RHNFRkRxQzdML2lJSnBZaGNGaHlxdkViMW1xK2JFbnEraStTNUNJT3JvSXlla1BL + Wkd2UlUwZzN0aHBDKzJQUVJ1UE5QbGk2eGRtTHhVdG1FeHMyQmFUc2FUME9ZZDNa + eW12K25PMTNGNmxyY3kwL21DUytYTG9MKzY3bUk0R3M0MEZFMkZab1RyQzlTeW1V + YVZsYmF0WlByNWxza0cxUjNBdmgyYUgwbUc2eU9yME5ZaVhIQ0tyN0JNYWtGVlVT + QVkzbXlYK0xuaG92Nnk5cmxwMW1CMGJ0ZTFVY1lUNFhBcmVtSGVrbTc2cXNFNVBJ + YmNIaDJtcFg1VStWY1JTYmhiTmFDNEdYVm5hRlhGNGU1bkJKYVVLWWpWMTdKakR2 + MXRCSUE1azNMWEpCVWtFRGdxSEV2WldSQncwTTliQXUrM2FuRjgvcUh4ZHRWcy9T + UkV6d1U2aHIrTUI3WnhDUkg3OXBia1RGTmR2VXEySW1pZ1EzRUFuOTRxYkUvZm9M + ZEdnS2trajhrc2tNdEEwL3BPdFd4ZzFoeEdKNVZxL2JTTk9ZZk5Wd3VSNXdxNXBv + SWlqcUxsOThubGtleU1UZDJmTVJDQ0krTGpYZ2locVNheHpONi95TU9vU1ROKzBP + RHk0V1VjU3NodG9nTFlCV0VLbkdSSUdwU1laall3QTdEK2Ezc3NjN0MrVzV2TTBK + VURjQ3Ric3kvZ093aVlsOEY5OFQrSTA2WUVSeVZYdVB6eW0zNVN0Mk8yZ1pUYnNW + V0lzM2xoMWdVVDUwSlVzaTZDV2IxVkkvVE5xVjk2UXNXZ2oxU1lNWWo0ZXV0dnZU + dG82Y1NyK1pTYTRlZkt3UGs0Z3hna3BMeWJ2VmRoeVhJM3ozblZaZGh0bjR1Wk9X + czlKZVRtMmVGUnpLV2VwUTU4b1VrelF3N05UdmZndlRYZjZKOHFNYWg0SFJreWln + dEtndFpOVXhJZjlIZmpvK3R4SVZMSS95OWtXczFzSVRnQzJIU04vNVg0TnpsSnNz + Mmp2M2NDSmJkcFY5SFVuRnpFWDJFZ3psODJQNUtoOGdETXlPTGt3VHB6N0NIK0Jl + c0dpTE85b2lVRzFDcisxdFQ0aEVTRnAvUnBYQU43TnB3L0lSd0tnZjlEc2xROVBN + eGMvM0Q2MmprVjdYTHdudlYvMEJGWUExWmVRWFdFZWdpbVc3enF3eVIxWXhwUDFV + bitiMS8xbHNnZFR0STFEc0U2NzAraCs5ZGJteFpEM1ZpK1kxVWdPUk5HUE41VU1W + UjdBbVVHNXlROTNHcmIwRkFqUlU3NVdFM1JrZG1WeVAzQWRoVlg1K0pPZ3hSUQpD + V2N6WVJRUXYwY1lKaTNzdDhhd3JqUmVkbHFzcGJaRnRlQjh1QXRLVFRjCi0tLSA1 + YlF2aVozRm5Sc2kxWERRK3lkanhpOURTMHQ1bzNlcU5oZjdHYlVzejc0CqXEWljQ + wgqEqKNm7ikqR3ziMQZXJwIy3uYrHOnsbnUO8dfkvFHaGF4hWntJ366arnx/vvZg + icname89Rg3I5oI= -----END AGE ENCRYPTED FILE----- recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGQvYkp2Rnc1 - Mk8yZDZTcDRxaUxxTlZUTlNEMzgwQk41dXUvOGM5bEI4V0RpOTY0YTBJOTk3K1lT - SnY0bVVOSm5Za3h4eFhFYkU0N0RwWjg2MjJvK05VdWpkZG5KSnhOMkR4MmI4VUJM - N1RWNldTUTYyWTBwclhvdWxGRWhQYXUyNGorZWdkVkJkWDFPOUR2cTA2c0c3NTF2 - NGFnb0QrSWQrMlVCNmQ5QmVPSTNkQmVOcUtIZk9ubmUxOHR3a245L2dhdmp1bjg0 - TGlVV2RIdlRSelNLcVcvS2V6eWRlWll6QlJZUmkwdDI3S3d0bVJkcTUvY0h1OFhu - RjY3bUtVS3VnbGd0MXNWdit5Z3lSS3BkNFkxRVZuMy9HQkhBVFQxQVo5bjVOb0Ro - cFZ2eFJsY0tJcFM2YWc0Uys4c3VPMGZzU0ZMQkMrREZuZ20xK2REZDFBbWVWckFt - T3pHMzNPL2hsTS94Z1krM0tmbkI5ZS90R2ZMcTZTTklRdGplQ1llNkpvMVk3WjQr - RWl4NkhoZmNnQ1VmU1liK29wNy9yMjJXb2RPUXVTRlhwV1hCVmNkRk1IMXFnbDZX - aHhMUlJpSEplNEdER3dGWnBPTzN3OHh2YWxpU0Z1MnF2eVh0aWtWMlJ4bENmK2p2 - c2lTakpNeFJBSEJ5dHBKM05qR2hqNHZCWWpWWkVBN0w0RWNmNFZlNExhelU3OTlD - bUZDRUlibHBiaGk4eFhlRGpxYW1GbllTMWlUY2o5MU44R203WUxzUGJzL2FaT08x - bjl3M3ExNlM5N0EyQk5TdDdjc2RtL3JPYXd6QzN3c3NHUWZhcUNycGRNSFg2VFhU - dXdQSU84T0hTNmJEQXRicFJxWUtxUTJCU2lsNHdHTVZaeWNEb0gyb1l4REU4YWRY - VUZDWjVEUk5uSjRRVnloWkpJYnpqbHdaWHplZ2xFSHgxRE10Zk5md2R4dm5VVzcy - dTJ5UmpVRHQ2SkFIWnpGcEw1N1p2MUJmeCttMWViQUJROGxWdWtpTkd1bW5lQ3FF - cWdkamhjdlk2M2hKQ1Q4ckdtTys1TTlLc0R3b0QydjYycDZuOUhEWHViTlhCRDJt - NkRWZFJsNVBUY2dxV0xUcUR2RlhKY2o3Y3NqMTAzb2tvdTJlTnpmYXF6bDI3a1k1 - MU9uckFzYWtLa05PcHlxVFNYL0pqem81RkN0Q3dPT3MrOHZSR0xkVDA5UDFSUUV3 - ZVRkNVpzQmtib20zWGxSQjBXWklvbHV4ckhtQzlFeWtycXMzRTg2T0htNENuSG9l - VVAxcmxrZ1ZuMzBhMUhsYnU4YXhmd3FGK0pLOFdwNWJzRDFadUNZeVY0amc5dCt5 - eHNoa2I5dlBuWlAyRmFiMWRicnZXeFU5ZkF6TnVoT1lLc0tySFRWeTFiYytxR3lF - WUpSVzcyVTdJV0FhWGVmb0hPNS8wQi9XU0hxQ1pENHo4MXR1K3JuTVd6TldnSEIx - Nk1tbUtEMEU4c3FkQ1dZV3dCbjlLa0lrelAydjVqTWhTSFMwTkNWOTNpd3FnaWpr - ZjJSTElMODAwcFM3QWNXeHhseW5QZk5UcWY5ZmxveVZCalZtaEpvTXBrV2d1MGx4 - Ky92bEp4WnlTWi9nMGk0S2hjTmtmSXlkRGU1OFIxNGYwMnowRDRSaHY3dzNWN2lX - K0VBM3ByamhQV2Q4d1V1K1c2VXArY3FsTXliZEVpc2RRT3JxQ0tMUHZpYnFJUXBm - cDFXVFhVblNjaEhiNnkyOE9pRm5rSUNLRHRZOVA4czlFci9WOTFsbFVMbW1GbklY - blU5Nk9taXhxMURNWDMrUWR4UWVsQkdaWStnTGl2ZWNlREFHbEZBc2loYUd0c00z - cENHd09haVZidTQrNFpTdlpzTjBHRzRFbzdaUzBzNERyRnJLTDBwSERKNFgrTmFH - NG5vMERzTzFzMUVTaFFUcHJEOWM4bVNiNldsVHVOd04zZUNBbFFtM3hVMURKdwpr - MG54OFVWR2ZsaU9lL3JISkswUW12eXdsK05ONjV1RU1VYnpzOGpwd3l3Ci0tLSBh - NUwyWHN2alB5NWIyWGRQczBOak5QcEpCSmRYaHc0N0w5eEhrNFlQaWpNCoVdrGew - 8jBtrBpi6ANZpQ3qSZnJQpWO7w6CJjWlcagLIQWWghuWUZXHtXWjDBx+sulnhPAT - T8AwJV5RPJteQY8= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGlvcFNWQTJl + Sk13Vk9ZbEFYNDB1NjNaZjZodTZFQUlFU2ZhZDhkRWZWUEczazhNZ1ZydHFaTEJw + RlVlSkNKVmVTRkhlOXlXZkZnZXhmTERlN0NPaEJzN3FqZVQ5c1pWNHhqTWdJNXVQ + cHdVTFZXYkllV25ZQVI1WVp5aVhWRnNYSTlTakM3UHJUcjBmVWplamx6UC9WclQ1 + QklFYVdBRzNsYTZUU3pQN0J1cWlNdkhKVGtTUUZVeFY4ZmNLTEJ2aTBXZWlZeGRS + T2RaQ0NSZ2VHVk9lMXcyNWpDR1F1d0xLNHhTS3dKWVRJb2dBMWx3Mjdma0dYYnJP + NTBndTBUY1BGTVFjamt4U0pZcWxSYXBqc0h1SGpGOTlFaWZ6dHVUZW4zMWRmR0Zw + MjBGbXNJUzRqM3hibE5RMnlHOEFGdGh1Q3BaV3JqK1VZeG40MnA5aCtvS2lWaGdI + bktmOWVRK2lvZVZ4VTF6TGFXaXlrREhJNFViVTJSbEQ2VEc1bE9mMHZnUzM5Q1Mz + bzdqS2pSYXFSbmh6VnJpZlRtYkQycTl1WFI1bC9oZmZrQzZGYmhhK3BsUStaeXF5 + UUptRlVseGJNTVlrRDhqdWc4TE5xaUJHbS85NnkwVkhrMTVjN1FSeGFHNmJGR2xM + c1NnWTNRSGp3UlZ6T2R5VSt2MEU0VmtLRjEwcHliUUlLeUovRlprdDdkZFhtelVt + WEJNRmwxNmF3UTdvTDlrVHFwdTQ1ZWFtOVhGWmF6VDRFcCsyRU5DN3BPa2VMdGs1 + emJWTXVFbDgyRzhXcG1INlBhYjJyaGRpZE44UkRtUmMzVUNCaUNEVzdwZ0YvbmVB + VXgxVHBESVI2cWNtV3UrQTRldFNhMVNYRklTZmRKVUZpSzdCclFUTWVzYkw2WFBv + SlVkUnBSS1BuVHFwRlFDeW9uS29HTExPZXU0TEl4Vk9EUVZxa2YvVGpQOUR2ZkdH + VkovMVROOFc1SHpxblZFa0dWY3NiZnZDcXZURVdSVnBlQ1ZoQ3FSQ2dCVGVBTzZ3 + ZWRNNTE1YlJNc0VPSmZoMHpZRmtCZWpkZnJzM3ZSU2FCWkt2STYrdVFoTnRzZEFM + U0pjM2pLSHlSWEwyQk8ydGNWcXVNWXQxUW9IRTNsUjM5VFZoRE4vcnZFVVNNdTVG + cFhJcUZueGk1amg5blhxbHF3WGxrYVc0d1d6elVYc3hSTkc3RE5WZkF2bjFJei9F + UTRJR2tSTFFkaUE3QWJTQjZZRDl4dmxyVFRvYzM1NHJNdDdmbE5NUytFM29BOTQz + UEFwTTk4VmVMdE91Y0lBVmlzd2V1VHFuREJ6QTBJUzZERjUwMlVvTEQ5YjAyUHEz + V2lMWmQ3ejZmVUNPZHFWVEk5QUZ4Y2FheWkrZStHT0tLeDVOcEVtSkNLdGxZMWNZ + N2FweEJFRDVzSllldWk4Nlp1enMwdW9BM3o0amxTb0UwZGRiMFpkN0tZYlkxamV4 + SmFJVnVLc1k1QnNNRFJ2aGtBSzhPV2Y2bGJoZnc4KzFEUUpyQW1LTC8wNXZDckFB + aTFIZmVLUmpFNXZTUFdaODJ2NjBOUDh1eEt0ZzVQVDRnSDdNazF2RmpqdVFJSWFD + NEVnN2dOQXJyamZmMkhWZnF5cUtlNU9JaDNLWmxNMW5Zd056TXR5U0xYbC9lK016 + RXJETEdJTXd3RkVLejlYaGcvbEpnZ253VU9wOVFzNHdqTFhDM0p5eVgvMklZcGhF + Y1NVaC92ZU0xTXBCSlB4SEhjUXY2dVluVWdCVEs3cXNEeWUvV0FuaTdLU0RWSDFD + VncrQ3F1MFNHTWUzVXAreXVTSlNJclJQQlNFT05Eck9CUHBNaThXWlVyY0tHbHJE + OCtEamR5ZGtaWUN4ZkVGOXZvaXZ0WEJ2SnF0dHBnZGx3TE9RKzJXVHViTndjZnQ4 + UG1Jajc4L0piT0NSSStGUHo2UU5FUlpoR3VLQmNJdGxvcllVZjBNZ045a2NLdwpp + STJKUGRiZ0xldkxYRFNsMG1VYXlsV1cydjhJOWhNQU9EK3lJQ2djVzljCi0tLSBp + MFQ5anc0aHNUZEptU0s0QkZ4SmZZRURGZVlrRnUzajhaUExZWGppNXZVCih8qEd1 + rCTkZ5TUOoVGny3ILIEg2Exh00NWQQoFLR1KRQA2WmJLBnxR//MTcxjqn6AnHC5O + +3g/xPCnND5zVMc= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHFRVlpCcjhl - WU10SnBPZWZ6K01KcTZIdjl3TGpkaVcxVUpWV3l6U1pVYVpDWXFQTVJNZnNkREZS - Qy9LSDY1RUlNcGVYSnUyZkZVNll3K3E0UUM2SnNOR1M2ckZhQy82czJvOWZoQWlS - S2I1Y1ZUSlJsNzNqZERsamltd3RndWMyZ0gxSXhJRHcyUkdPdzZmTWIrcGxteDB4 - RThhRlJoSm5zUEJKVytwa1pneHZoT3FwajU0Qy9kYmh1NzY5a2lIdTJPV1pTcnp0 - M1JjakdEYXhyZGE5UkNZU2MxU0doQW9DU3hYd25NM2U3RHRLRE00Nk9uU3ZQc1o5 - ZklXVlBEM01UdDdWMXVINXEwL2VtSUtKOHZMWmdGcGdGb09vaGlxZk05Zk9wMitr - eVZTMnlmYzh2ZzduT1dNMmtqeHpmd0VSL3phRm5uOHVBZjVUNzlhVGtjYnIxaktW - ZWh2SkVOVmNZNUZiY0NuRXJQSTliYXp6VEc3V29HMUpKV2JGUCt5dXVIZFJDYXkr - aGhTT3RlTjg1YW95RG1wdDFHTk41OFBJQlRsdy9hVEVkVGRhVU1HZGxBTzlPbG1M - Q0FaWDhONDhVWkN0RkpwbThOQzNHWnNlejdrSUsyQzRYeE11eGN6WXR2bmxqMzNM - YlYySkxBL0FEQTM0dTlSRXRiQk1ROWY1OGZqWW96aVFnVW5uL2dDTW5VcW90bGJu - aFJ5ck43VE9pQUVvY3JhRytGaXpIZEpCMUovRXV5ZlB3ODdpV2RDYWVhdGMvQmdI - NUhjOVVSaEtUZjlzak1sUm15OGhCNEI4WFFyL3dXR241c1F4Z3ZNUkFjeU54K0ZU - NkFTUlQ4Uk1zcnRreWlrOUtZMG85UXFQaE5xdnR6NkhEaTJaNDdEdFV0WTNLSk4z - S0N4Z2pPR2tyK0NBQkRVV1NtRTMzVW5lVXQraWJTVmpEU2VndC9uM1BqeWV4SXJ0 - ZkwwUzEySW03d2lhUEhHWnlIV2VvL3NrOTArVDI2MVR1N3hQNmdGdmVKNFplR2FW - bWN4bFFtU3NzOFcvVFBQM2VIajM1RlBXMlZFVVpHeXFHNmJDdm5WUVUrTmxIblBw - WWNlZEtNbGtOOXZHaWNUTk9sUWt6SG4yZU4yT0M4QXJFMmJGenVjRERMWXBKWjJz - YWtaN284QmFyczI4QlVFQ3VYZXZOQUd1Sk9SRXFneGNIMGd2SU1oMjBtd0d3aEgv - Q2VLbXhMSExXV2M2aU82SXJxdGFDb3Fha25sOVhhNWNOcEduMVlLNW03Wm5IcmlP - SWI4WXFwTjVYaTZYZjVhQnljOWk5cE5GTFFLdmFuc2h6TDkremoxZ2F1STY0WVpj - cXdHSUlXOGRWbkZQY0hCcU44aVRSaXFsQ2VsSmIwZnVtbmo0b3FCSVRVazY4cnVN - NXRQSmUxUlhWV2xKc2ppbEJtVEtkYU96WnNCM0FDUll2VUpmejNNZWxCOUt1eWxT - OWNlQXg3aWpuMkpkampZYXNDeXE2M01SdzFJMjVoOEdHS3hLSXZJWVZWTDJETlox - aUk0N1JidlJkcVY2Zk1QYWgzdEI4QTB0ZnRib0NRRkx6Q2Q4MzMvOGFZQ1dvOXhh - dTBvN2RKNjFvL1IzTUNWZjRLSnY5TWVETXVCQUdSNWRSeURKSExqcCtoUHZaRkRk - VWdad3Q0N0d1YWdhdG1VRXI5eTVtMWowWkZjTVA5UkZPclV1NUxGdkliTjE5WU4x - ekxsRUpaOFVqOHRuZFVzQnVPV2o4d1BpeWM4dHJ0UGJRSU1UQUdVaUh2TCswdFlW - Njltc1hXOFR3SmFWQWxjeGk2Y1QzK2QzanhXN01rMm4wb25OMGVnL1BveS9xVHZw - TjE3Mm8zVmZDK1FKVi9JTjNDZlRocm5LbStXZ0lmRHVIVWJsTnAwK01rVmRQc09u - Vy9TUEJlZDJhejJSRG9wNmppdnBqOWcxMjlsTGU0K0U0QnI3YzRNU3FxaUZQQQpK - dzlpN1VXdjdaWHNSNExlUmNFb2JSYVR5clBGaUhkNElNenlTOEExbVE4Ci0tLSBV - NWFMbDV1cUo3L3VYay9VTmt3NGRJc1RyUXZCbkd3YnNjSEtpeTY4MXIwCoEWfbH2 - ReZnNIHoCaDD5aDLSlhWujIj9Ba1IQvBSApQNc14nluM6Tkz5k4xqkLFK+rZGmkT - r3Y35STwhNry02g= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHFVdlI5R0Jl + WEpzQ24rblBGWEhLOUVJeHM2KzlOSE9ZZlh4NFE2V2Z1TVloS0Y1Z2ZPNDBYT0VH + eFM1N1FHUWl0blNPVHlZZ2ZQaVhDamdLSzFYNWUwVm5VbVdoL2lhNVQ0b2pSK0tt + cS8yZ29BNGhhZit1Y1dDM2h2cHJFdHlIWHM3WWFjMUNLZVM4bDNvT0xMSExVL25v + cFcyVmRQeTJGVTY2NkFPdVNmcGYyT0hJTENFVzEvRXRxVy8vaDI5ZlUwTThjYTFQ + dTlOODRZS1lIbXFhYm1JQ0tvWWRIblVIdFBFRmhpL2UwaDE5U3lycHhVRzQyZkNN + MWhyRTJmUXhYQS9CRmpab3NBazZicXBlNG1FeHcvTjNnYitMQ0gzNXdUUTZKTUJt + OUNiZW5vYlh3bGFNeVNGS3FHbXBhOTNzdHV2dzh2bVQ2UUFNdnJHdjNNTVN2bHc3 + K1FwOWRiZlNNUlluL0ZkUmQ0T2VBUE5vRGVrWXBCaWE2ZHRtUkw0aEczRmk1Um4x + ekZ2OFZ2K3F4NTRWRVZVd3VuN3kzbWNWbWZQclBqZnBtRTJlQWFWRUxuWkUrUGVa + ZjJhOE1zc2lrcTNOdzdWTXdTT3RibEJ4aGtwdlN5cXJPYWMwRWpmSERlRVl2Mjh5 + azUyaE9yQXlPaHJZS3VYcWtEOE04ZUtTWnlraGc1dkE3ckdlSjhsY0phUFEvaDdk + SWx1YVVHcEZvZS9UdmFlbnA1cWNHWElkRmM4NDRoR1Z4cFZQUng2Wk9Id2xVWFdR + TFZhQjJFN0dXcDVpYVdKYUlHSVhnWDd0MDhsZnZpMFZ2bEF5Q3lsQ01ObFlMcXh2 + V1VKTGNldXA5TnhmVlptVDV1STg4M1RUeE1mSlZxN2kvb3NPamtZZ2l6L1Q1bWRC + aDlvUHpqWWpJbHgrMkViOUVpa3J2U2lycW1aSFVKYWtJakJ4b1ZnV2F5Z1NtMzVF + aXRMSEhCR2hFckJ0L2lPVHNtR2ZnTFFmNFowSjJSRUxTQkxBY0w3QjlMRy9YcWlS + RzFKY0xWeGZLYXdweGJWMFhWenFsYURnT2NqQjJ0VSs5KzNFS0xxelJ6ZWVIZ3Fj + MjdGWUl6RTlGdVZnRUkveUtCbEp4YldVUG9lOEF3cDVtSmVWOWdOUEkwaDRiWTM1 + U2x1V2d5NkhiT2UwRXl5WlFKRTJMWjBLSUp2L3lYdWZuNFFZQkhtVWRoUU9GTEU4 + RGl0TFlBRHVKVkY3TmJMM2NaN1dFWTJmOWhnd0VkYmhENFFtaU1OMFoyRmFEdGFM + RllDMnd3MnBZemg0SmZvTmgvTTAvWkRWNTh1V2JJVHhRYlFuTE9ERHQwSmoxWWly + OEhtdTVHM0pZVGV3RllVbFdrWGdSQUVZaW9LTThoV2Ixbnh1TFpuWlRrRnBEdEty + WWsva0J0OTNSOE4xSlJydlZHL3JhT0R1Vm9RUkZ0bzBnNG5xZlhscGZlM3FmV1lG + SWpTa3M4TGxKek1YeDg1UUN6c0xRVytOUFNpSnk3MGR6dnpSYkh2NnM1RHVzdTJY + R2h6dEhYd0dlOEg3emhqYnhkeFcxT2krMllDTzlNNG1pa0JHQUp3WU1mR1F4L3BK + WDU0SmtQc3FUU2pFM2h4NXB5RFRidldkUWg4MkxNbm4vaXJqc29ZYVp6ZjBuTnNE + YnBET09vQnBBaTNEeVFQUGwxYVVqekNjYkpaRnE5cjE3VVdhREhUcEYwVElYU3Ev + VGVBZ3V4QUJDck9ZSkc1b1VhRGdub0VUemt4dVpnQTFRSFRvRHE1K1VaN0dvaWFY + N1RmanRjeTJVWTArK1I2M0JOOGJxeWJuRzNtUTE5d0tXb2dXbGdaMWhCaDlCZWJn + cHJ6Y1cvZlhFaW1yQUljdXNIVW44cFA4N2FmZVBENDRCaG9uYlg4VW9LVGZnMGxs + V3licHVYSXJFb0tOcHdNeFRkM1BiT09qZFY0RjRQTmttY1hZdDlHVkFEWVpCdwpo + UmJsck5yNVdXd0RQODViQWZuSUJPWFR5THpJTXpLTVRFTHhVRVdLYy9jCi0tLSBX + N1UzTDZQQmlGV00zVkppUzk1K2hQbW1XcDhEc0R6Wjc2N2RxYWRCb1A0CmMXEss2 + Qf8vmLBBdBhIpT8OLHMgshOEiGAQG/GgS+1EBxKGt6L0/hU+TyNyZ7yyb2lU5B+3 + 4zRXtTKqJ5WLGNE= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGtYai9mSDNE + RnY3TUpmdGk5Q2hsdWFSU2ZaNTh4MWFVbVNOWnVIQW1KNThuTEV1aEhiYytMOWVE + bzR5RVpjYk9tQ0lNMGhtT3E2SlpKV2FXS1dMQzVsbElWckhVUytDSEZ5cDR2MFdU + bHJad1ZqbnhhZ0ZwWG0wbE1OMkJrOWpHUGYreGpWSUQvZ3dhYzlIQ3JodzU5R0ZI + emwvVzBxbXRQQ2JuQ3hxSTM3U2VZRi9SWGV0dEZVbGU0Q2JtRFZmcVljeU9QTGZt + ZmNjN01nK25mWVBoSUJJWUY1WkVkVG84RzF4RUk3ZjFNM3lhK2JNV0c3Qm1iTkF1 + YTZwTnd3VzlraTFZTEswOFI2STVLSlR6cG1SMjVDVUtqaHJ3dlFqWmpnU0tVbWpq + Tkx3cGNNQkRudTluZm5qaGRVSUt1Q3Q4SXVjNG9vczhHZlU3a1JId1NwbFIxWFZY + OEVuQUMvQnpJRWkyQVRhNnIvNlZZenpJSW1wWU1RSkNQNXZzY0RZSjhmSDk2SC9r + WnRSUmh2azR4UFA0WndLdDMwekRnQWF4bHg0RXV0K21wN2NubEtCaDB3YkE1MzdF + Q2wzQy9pTFR5Y0tzeXBxR3RES1Z6RFhxK3RrRWQ4TG11TS91aTBja1pNdE9uZlBQ + b2pLOWxnWDlXNnU3WVRJUGhxZC8vcDkwUDlMQkZFczBtb084WGJFeXJNVVFiTDE3 + THFhNDdVc2o5UWc2d1QzV2lRdklSeXpaS3lkemF5VjJ1WE9RWFpPL1Q2Y2R4Y2Nv + SGVrV01vR0xMTDRJYjlNM0dreTc4SkEzV2gyemtIaHZXaFVVeFdjYWJZdjVGVHB5 + WG1aaXZSaXZWbzArZnlwNFgvdHU2Um81Tmd1VWgraW94dlMzVnN0Z1dra0lLRGtI + aWVUcnZ6UjRoc2lJME1kSHF6dkV6REc2TW8weXBTdTFMZlFYTlN6bGxoSTFRTjJU + Vjc1cVBYbE5qeURzN2tVRUdPQklTZnNnbmtuM1lycG1yNWxCT1d4dnNTak9UWThN + eVJDcUFYU0FEVjBqSmpMbjA3T2N3cmd6YlR5M0p3aDhzV1d5QVd6M1Y3NkovVXQw + b2hJZnJsVlgwSGNrRCtKR2REWjByS1d4TkJ1aUZKNFp6MDhPVFk0c0FkYlU1YVg0 + UVZhNDY0S1hUb2hhdWsxc1JMb3FkQXRnUEE4OTVCUVM2ZS9GQXBJUGhWZVg3RThL + Q1NES1J3K0xPdVI0RDhvT3JyV0ZPYXF1L0tLeXpTVVFod3NUSEZjZElGSzQ4MzJG + TTlpM01rK3hXWUZoRStraDNJVUg0NWJhS1BZYVp4bHIwd3JOTFRQbldVR2NNK200 + dHpEYkJLSlZNbmZtdWtVOXdwZE5peEM5bXg3RnQ4bE1aMWtuanp5THZ2YlExenkz + VmgxcmtiWkUydk01Ym02aUYwS0pscEdVVENVaURtUUdLY0ZneXJzUCsxWkRYZ0Zv + MW5VN2JuSGdpSGh6cHI2Ymdtbi9FcWxQT09EYnFLb3ZBOWNqSVBiSmVhWmovZmVD + Y0ZTVmk0RVRPUVJwYVZqYWQ3eXBDYUdsbkpSR2lDWCtZRmNoWEJkajA5YmpKRkVy + eXBvRG44RnZINEFSSWVlQ1FSSUF1b1lWYk4xSzg3NnNQNG05Z01BMzFlQ3FiU0g3 + d0JyaGpxZzZpa0dwTVBxQStiem9BUDgvSnp5UWtWazVVRTRrWWk2aVVOV0hXVFVO + RjRhTGd5KzNSQUd2aWkreEFIRVB4bkFZdU0xMHhydk9VR0JlNjgyMFl5U3FXb2xS + RTlOTGdUY3ZHVnhhTG4yZmU2TE1HTFFDdXhHZU95S2VlalpDZGtZYlVEdGNPTSt2 + QzRTUlpjU2RnZ2hpL1BUWVJZOHYxRlBFMGN0eEpLTldvNjB1VFlWaVhPMUFVRk9D + WlhycWFhRmthb2ZIcjFXeko1MTZYczY2SU9CY1dSdTRvWndINDVUSUpMLzZCQQpL + ZEFmUnJlZkJOeEFUYktUMi9SZmorS0JpTm5hS0pCazhyVUVyT3NmSHNNCi0tLSBw + bWFRd2RWeDhUTTRpcnpLUmpwa2hkYUNzOHh2SUdJRGh5aGR6OXJmb3hjCiSeYUhI + sHWjTncErhmEvJNj35yiBrQdXfA7qbCTXhcnQXszDBA4BkhfY/mc68G2kCVNSrZ8 + KrIclhchx8YPFKY= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1f7nk5g0hcvy522fpgnp48gxt63cpyh24cua9jc3hwjdu4qvlpr4udymsgqh6498max2w867tect39gl62ru8kws2gshupfeg4gzggz8fw85cqrnqe2llyxt3ke5gtlprfpm44suu9f9mesu2rffhlcfyecvurdylvk6petyc7p549q832u9nknznujthesy0ypdherhz9jpsc4gyngewrx4udlzkrv35re42xwtlqdtzm4yydxynqncjk3lyzu64yevahcsvcvnew4rrgmtnssxnvkry6ydtvwdsws7ch3d9zgc2egcvwjc50snxulcxx6vuq0yskapv84upus9hpdn9kl98j24zvuqazwttw4e8qe3jp2vpsfpu88pl6vjxv3krmzqzkvctevcv7xe4psz7tas8p0588kh58j8zfpqq2u6k92m4y9ugcd6hgsz9ja4zr7eadln94n6n3548jt0s2vshjd94pp6ct7ls3peecgmkh3gltzcdlq9ceytv8se8yhv7vrqsx5fdexn65samrayd5qs5xd9cwsyt7ea2nvsmp4tjx44q6guesu9qam4un6l5dx5y5dr2fy9r9dccp35ry64305ckkkcecz6rw3z6zl468smspl0hcgsykw47ef33euykywkpq68psnkfkwennu3cwjcyupv2fgrvd2d6n35emgn6w0eqk08psd25qr8asuv7sxuyr5w26ajqjmhccv6f0d42dqsr4ecutcuzxxnzcax5hgtwk54xsvnnexx4phtzhshgxxhyx9pvknzjtjm43z4d89mle0pug63j9g44ez3npqc3td0cuygpecqdpncfzfqzrnykt388p9l4nkj5cfazmp9qtd0gfxl07qjnswmk684u77zq2jpxsn6j546gf7ql9q5k37mv0sn25aqngs0mgzpu4jy5c8heqqf55u0kg67907gxu5u4f8cjtztqqh5evlqh99t0jlvtccj54kc0vxu32adpfzesp3zjy8kzg7var3ku03e08kk8r7zeeptp2p83cwhsmxvvfzmg9jppg5ae9xhukfens0pl6sr450q3pg4rpj74f088wsj9eegv2umv858329ypgjdr54v50lyne0t8xddqrczg3n9vgzkw6tzn9s2tmvsxha8legfpk79lcf9yepf8ln5h54lcn2qg6jmqhkff6un930suw5zgx67l7670ljkg4pxrgfxnpum8xmmc7wk4eegpytqvkp0jh8enhs9hap9nker8efshsr4txe4tttrh5paz9y3h89rjxwl8k5tysal7n0yzau33w2fvr4u8cr05vtrct09thgj2hn6qjqeh5ek80y49cmqyca6pryjnqdxj43njctqsgpk0ndahqd5qc3t3jxssj7g2rdul3jvk5tgsmfpe8dz0pjualv5kgwgwl7pfvfu9pvcx2wkt6e7xe4eu025jksj5tdafcewcqhz7w6sy55fhx4a4ec7hz9yh3x230vaz0fvuxdzvvvm5ze349gsv2qkrj534pqk6ffy6wtwjawrztjnxl84sf2l5k73ptgjmefwgmzmyxxdteeqeyesl38ykm3pnsey6xd2c0pzsngcx2283vtzttj79jht5gl43qxrlh2s3efdd4wqjwkq5dv9n83ptzvefsvlyp5nvkyzndvu8ywcg5jp6cyhl9ygtjz42layjyzylkuxefwfcmqmejvmxqm4keklrnvx8nd6k7yp8mxxprljcde2s5xz79duyte3kckvgp0fuqlsnx8ty7vnk5pz4m9mk33rtz3ujryxkvsur72egqexvse22nlgukklaus67kcm4n0uty0dj3pxtyl7fuz2x7yr3zw6vp6pvy6r0fwjlqzdkxc0rug39uw2fyr0gx8a964ef5dplp49mqlpqq4e0appfzrumnuawfy5mdlqd lastmodified: "2026-07-29T20:24:41Z" mac: ENC[AES256_GCM,data:U8Glg/9RWTmmb595u8BY9inni7NNdn1TXGAO7i7B+y8G9miFEclOyJ+gLNHoWPJQ7k//AXRIu0L8krlH68Ba8xhmCGP2JVP2DnQtVmYeuQaV7T5IY0YNlRjvL4sjxGFr8e176TES2hF6v9i0ee1QSFIpjKIsV2Y383XB3MANYrU=,iv:ulEPR39LRcs8M1ec4V+zmcWIpq/iiD34ssdMN2sJYNs=,tag:OFyV+i70E+02zCZXg/Z2/w==,type:str] pgp: - - created_at: "2026-07-27T21:01:04Z" + - created_at: "2026-08-06T01:47:20Z" enc: |- -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ//T26Y9AmryFz0ENPpudzv31q27lMViqb0NjuCzu13rnXj - P3aWvmkiZm9fQegDya2ApYNHTIYjUhAuiAuf1u7AmI9pXlN4OPtixnjDhJBvzX95 - MELJP843cVGYNtPUNBbb8K+17QGL7MFnFrTkFQ1fmKehFDfCmWAKSfhpENwCVxH1 - dP8SvYOa6qyDKbpJH/PnEEKKxVoS0gL9TuFY+8F9NbZQVmkfVvXgJ5fqhZC4AIwG - T+PTP67jRiPp/8SDn8/qeQRa7HTQ85VYN8B41J2QotgkU2GirjiSkkPhy+sl4PAS - GH62R4kKvW0BN0phVQLiVP+nEPjxzzs11KsXGp6XFvrkOkyie+cKgfgl2Dp/Dehh - YpZ0JJAiUSQL1IYtZO5+GpaNiSe+0qUPHSxJg5k4RqJZdhtBJ9p71pzqx4My1dIv - NKfkL+WkAtFY6L3+hjZfnLB4uEN1R//zg22S3OUoJd2sIVAL6M9o1GaztNoSfOIY - ecigzk9bmlMbk7x01XJFn/AbbHyuMsCiHzrw/XUR9Rtyv6KYaJ0QQnBnunoNozfo - 4YsiZrKdetyIYCcruMda5CGaFhESTYkWmu2FI5rhN85RdrlP+wkL8cjfBuITrf5o - MiqhrIxvxo3WCQWwOoufbf6ASqhV1YJC/+/+xqius/OuYAQs2Ejh/7N67do4pE/S - XgHVXOih9egz7kAsEmSQXZ7IbYenMlelaH/J/bzD6jupeyI/63OwExJbB4va8Uxd - wFnpg4OuucRx6Fhw6diGGTkSRvoLcAUgdW0o/hWXEkUkQC3ZpO8AmTSrwiYJtHk= - =5gSo + hQIMA9/PFHehMxwxAQ//ZePEFpQFbgrs4lktYSqjaCN3lydL9kQ4kkTvd/MPe0JX + 1PwNPEBYwZh3MuMTuZJiNdJ+57FfGHmnM3UtQd7Y/2O+kcKyz+GCeOrxq6qm7DWJ + FpmxVAx+nivUO8LwHrczh2th9Z1pkk/CQi6xNNgsCjj4vUMdCkNDRqvBUg5GuN9k + 7xdxxDc4+R70ZUuc5ARoggHy+DIr2atkrFSj9241lyk79EAIKqG8iFpeUEus0+fh + nXkaqPGR2hhb4ini2At+/JLb9k9SjdasaRORMCoCzTxTbMLevgjcW0RApZz3D0Sx + /ZitCj9x0jvK8EwM6PB7r3l4yGIKGF0qoF5Q6o1h22E36/vFF/stkflYey95MXlA + s5wdzIUKjsOmTiNJi2+xvhNDgr7J/4IBvEYn8il9vEvXOZwkUf2KqNDfOSUC+WBc + 9w8Y/P9SzWW7K/xNQBvluzwyBIXPSWIuegH/gGmisFMi0Je+sg2F3bd5VZz09t2I + 8BaP58CvuwXanWL57BLH9cj+zgJ7Q6e6PyAMyvAff57RZsDb5Sf4rkJ714VdinlU + wY7Apl5b0pOCMudsS1NWi5gRadmAxjVPy3AA9nz9b9fvf/H3zB8H01SCKUu8H8VA + /mB2JrpEh35ZGdjrTw6LdyS73C6c9maEaEJqSJt8F9XhvKkdmw6ZNNJmNfX3fOjS + XgHgybgJzCd/Mg++i4LE9RoDwSblQ5vDjZk+MUy1u/HDJs9Nn5YRtGCx+COeNREU + l1cg9/J4hKdSe4RW6qvqxMsVEratbDMZjYyAb+S/gB890EUvbq98JboCTKRbTdU= + =7660 -----END PGP MESSAGE----- fp: "0x416CF1EF9AAF90BC" unencrypted_suffix: _unencrypted diff --git a/secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml b/secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml new file mode 100644 index 0000000..60ad550 --- /dev/null +++ b/secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml @@ -0,0 +1,188 @@ +host_key: ENC[AES256_GCM,data:Rzqda5ZR45e0Eec5xV/WOWCy+3hVaCR+OCFP0OyCL851bh1nJQLcaDW/ajrvu2fjw040+I4g8RlJoo/1iETOkRYejP9nvQr4/OfghuiOwlr9q1T8jUSNVu1ZtHGRuKFuYmk3PEK35Dd1u6ytS8DXL1qavPTNC0oZKhW3KdHlFPdckRfNmh76XJLeJ6aZiaMlDwkIq2u6xt36KmxV5+WYa9UZ0uNNIPayhQ9KukMtiDUZlb3lBp2IDbeYS+irDlvwtt9j8QAp5iQO8rZrCc6vN53DHwCSr6y9/+F30n22VjBwLhwS0DbE+tC7KW93dsVH7EAY/9wscAc+1xDwxReSe2Rrn5k06T5FQFbA2SlNN+caKEgWIOc+XJwnpKODG2FxP+xgN+SV3oG8xsfoh0EPELK+kozxhaLGFQwWWSldH/VUuQVJ4nolLaFJnZ3vWxeW5eiZWxmg0aTZMhyJgqtgl1CtEtBfmEayibAZHRhjtIEtCHc1150/HYua0hs0GKLfVp6T+tqFhljyphipTQQfOPdoyMjgWc0Gqhr4pUMRjLNWzyF8ZZExbv5B39JEtIg4ciQm480/kli/79fZ7lX9H/DCsYtznUbpVx9jlHm3/2rOgVwO3CH8cgWv3qaTog8/nQIJuDOmKrdx8TJV2Uh6sZvJRDatS+7fPn+cFzNjgGCLvAo8PSLofiTTeu7SmKQn+qGzcmubDWLBIipLJPgwNcglaYEDip2yHK+m5QDkB7d8GOCOvyJluVCS7Ohq6xaBbg19vdVfwr5QuR6Ejn4P3DfBY/SkQLnLQo9K4M6VZfmwX9+dCnY0wDV7+gJ1uCu4eOkbCvNQG9VdBFH1BlVMM5OrzUiHQ4V3N7zZgCW/WsfwzpEVtXRxecyJ035ENkcTbUxSpW7X4nfBw1tLkRhZxjEoym/cWTA3SSEURJOy35dV9afvI/eqvltFt/+zPPBD7+D50LqrC4EvQAZx4SmXtEEMaHczZB2VBwadYBhE3ifXhR/6Lwj40L1b/6kEVJd+cNdJE8cYpRa2FjGbewhHcnibQ8uE0Cs4AhH+VOvSedy6mpNqaDpQdIcO3saGTdztnjOsLjwm8A2TEWmX7+LB5INSWwyNeD+iOkvt0ZEgwS7+7mvyhjKHEY4Xw4PRJ8j49K1nmSipwl7/AT8oNOsHDbE9GrucL+oB98pUp9ljbAqHfBnRvyTxCuoTkb51oCpM/YQZuFodkb1VCUl+olfIY9roSGaGGLpz3e3jY347Et/7yDQkK8EkhlwqYXKaPAtDX4jLjHnjHpwdh1SpDkMG2Uy5owePxIXkRl/SLdBtwjgvogJqpF8sAwPqmd18bKqVUMuaDqVMhBBF1wu44TtqkDns8Kq/wfdSM+HsRW9dkDqwgRkiEIk0nb1yQh4hdEbwGV3jP6JppewCZtB/FDR0YuqGYZI2lruXNBoL4Iwha5NYM5cZBJAzMBreSd4EclHNvgDLHnTdwUwQDTwiRIt6HypyeAak87/O4FzHoecS+x6o+IM4XXw0W9HJAumziREAefaUOfp/F2WX3uNuXbGqOjpdHFLHDMefM72aUNIDBs2JfjapyawyyBxtM2U+JHp9ar3mqv/OsCfxjy8UVOM0XFkLxE0bCC+5P+kThejhGOfB7qtPCPCF5p32YUfxUgQ7xb06+EGseL2qEfN3DSsi+GldReqNV93HBcE3kpuHu46cJ8qMk44WsEYoQAYMRZJkmFVOpABCUIM9HrAl8lIX1FRAMZ/ndW5D7j1tcAB99dmgIjiKgNgvlTYsOghA2vQt++c7J8uo1DA9FpbLzQvmzOfG+WsrsMW7zhp2GPHmYkTGXaXOs8lT25O3JNVKoY5r/dny7BGRgV0FNEKCX6bLgHAdOZG3F1jLwQuFe7nttdRI8AXkVDovepJDqnJOZt/VKvp8mikZWtJww/aNfu9fDS7FWrcchaA8b005KjSIlJ/wn+IRuY2mBKeauOUW/sCkjD3Y289QXNO5+xYp11p8OHiu0le19OR0bj47nDvxy7vpng023ZNIH624oPUovQW4tqUrcFfJlp11uZtH7G3MQu+2q9KTxNfJ1iW8r591JNJxsNd5Q2vm/x9+T45R0xXrd0oxSQ3oSRB9QTV4UerD2Upefv0SW15UqNaITJ4NVtZZ2qNDISYo/nsRDj2hE0hM4cqQvgXbLMY4IUcNI+1L5StJ+rTAI7VEfazAAYSjD9reh69Tg39hWbHej+bbK3E15ztvEv1iqISOHIYwRBd7qnluXZLcUrUT6rCRjPQSSZokjfY+XOfM0U/k2PZGw8RV/TpiUOeW04NtfTbWetJA+QxgB9V7vkRit6GZ3lS7VJhuaVTfmL7kk+zap/ZrtUUbe0cGl9mmFyZfCp7Xp1fkcebeJWEk3cOqdBfkuJUyMjR+LYBCnFPMf1m4UG8vdKB22mCOxcXBycS/OC0ULPF7UtJaOc9b4FhkIqnnqb99WnfFxu3RVqcDFFEtY/zVNufUbTnAtC2D7t7claUI5Qtu0pPJRGhAKNaMrHxwGN1Em7uWo34VPQdpQwoJGyGla8eExgqQeFMh9Q74lnNIl4JuGP8fA7+B9x/sTxMUm/bp3qTpaMLX2A3BMIRqS6bsYd8X4Tm4d6oZRIDPNTGfFkkAlep2aGz8dVacUTYiiqNgqRvF3TMMMDBJs1MxbemnBEG6BrB6DxJZjpBNjaDplOcsEACXooXhKwQ1VB2v/WVXxZg0D5gpFY+sFhQx70NqHN6Ra8Nq9cgFt5Q1i8WZYhZxoEHBoMRgn5PyHA==,iv:OFz0VBf2K+/mmnJee2GXdRrDmNOxBnFT60ZOWI61/5c=,tag:FORY8eETo5jb1ZBcXz8bHg==,type:str] +sops: + age: + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IG5ReW42czho + K0pReExCb3ZPR1hydk9ZMWRTSktjbENUYTBEbXhtYzJZY0hSbUEyT21GZmhpNlhv + NTVWa2RVdGJZekZocENpT3hhcjJ3SXBTSkxrNzR4Q0J1SFY2cUpXZ2Z4bjVPeVNI + eXZqcnFDTEp3TnNxM0pTeWVOdE1kTEJtQURxbUdxRGUyU2g5VTQrZC9vSlg1U2d5 + dVJIV1Bzdnd4V0NVS2UxOGVFN3BTQnVkbXVMc2h2RXZlajhScUNyUmlncXNQb1F1 + UEtreGRlM0Jvd3J0TEhFaXhmcXJGcEIvVlV3UTMyRm5SNGJ5MlZReUhQRVhqVExD + UnhWWXVBd3FiVklPZmt3TS8reFhWTGlOeXE2SGNvZk05ZHdUeVpLNEtwbHB0VnF6 + UURDODFQZm1DMFpLUDdndFBtYXNHODJmZXY4UUNsTE1VbFI4anhGbDFhNnJ5MUtL + TG1Bd2FlYkYvck94UWNhbGhIUzlVSTVraEpXMkFsbWhLeFdkZXNmRnI4SkZUak0x + ZXRhVUUya3U1aWlKcElVQjg4Y3FGUkNJdHorOTY0Tis4RmI3alhpMmtBRFg3dHR2 + UWNIM2tmTFhjK1FHY1U2Qkc4Y3ZKWnZNa2NWM2R4UElYZzVoSVk0TFpLQy9vZWZY + MnRCNU1iVWtwMW9BeUtqR3ZnWFkvNjNaM1hYODBDWURwSTZQaTRvYlJBa0Juc2ds + L0RUa2VnUURkVGRyK3NoQ2xaUUtWY0h3dnB1SzJyWlRvV25qWnNBaXhVYVM3TVBE + WkhBTFBwaTJrY1Q3cTlzR0NORnhUbDR4RGo1ZVRQYm9XSjF0b3NyY0RiSldpVzZ6 + VU9zTEZjWHAvQTdSNE1oUDM3VXZhQ1NJam5GWitSaFM2a0wyekRNRnZBSVQ1dWhG + U2dITkV6cXZkUFhzVDVuLzFHVVNSN3hjZVU1TXRNQzhCSk9DVDByMU05aDRFZjQ1 + YUlPNzFTbm9ocFpkVG1GRjZwNUNqS0lCajNVeG8yS25YRnQyTFBQc0w3V0dnVlB0 + Q0MzS0JDLytLYXYxeFBQanBISFR1THZ2UUtrKzhtS1ZaLzNxeGZuR2Nxbmg3Q1E5 + UVVINnFEd1RBU3lnUWQrNmVqMVg5TlJrby9ZeldqenliOWx6WnpEaENuTEk1M0xE + MldndGxxYTYrVlh4SkNCZGFOaExTa096eU5yNjg4eVk3bE5JUVlqV2Z3SURXTHRW + NXlLaXpvMlB0OUJXeUlRWXJGcGNxQ0plL3FzUFRYcjBaRUJSWVNhRElsTzFXclJx + YWhOTy9PdmlrL3BKRzdXYjA5Y2tQdm93bldWeTgvZTJSYzlmQm8xSldjN3dQZHNF + SXF0bFBvb3R1TElKOWFBejBuQTE1Kys5ckFyRVZkOXdRTlE2R0h0dzQyajM3YUNB + amp1aW9VOTBrVWZ2eFVGSnZ6dVJEeXVzSGxBRDJEY1Z2SWExbnB0dmhQdSs3L3cv + dmUwTm5jaHNWNGQzZmF5NkVmQkpTOW9WOGNnK0Q5WEMrdExGeHhVMTNnalREVXNo + NjVGeXBpZE93MlBQMmlBRzVaVE9vNmdMK1NaMUcwNWx2MmhLNmgwNHkyNGF2cmJT + NjFLclk2VHBmZ2xjc2dTMzlFSGNNbE5kMkxndUNkWlVMU2xKNSsrQThBZi9WRHR2 + M3dXdXpUaWk0bUlEb0hEdnNtKytYNlZ2WjM4bHNDaktXMUJMZnpPY1BJa2NHdlM2 + aGZrY2R3STBQQjRqeWVMNWRRalp0NHhYQ0VCNmwvZTc1cjdZYTBsQ3hwUDJ5VU5m + TWswOGc2NzFDQnAxV3pZMFZQa0c1Uk16SlZTNVF2ZzUycWFPSXhuWW1jZ0t1Nktt + SHRUOEpOM3pWNFN1bVFvM09WSVpwM2t5ZzM5VVB2clVwelo3bERPb29JdjcyY1BE + QzhQUk1Kc0VXSlQ5M1JFNThBbzlXOU44TnpERlpGL2F4V2VucTkwWW1TaHBZQQpu + b0QzSExHRmNrdFBDZTRQbHFQWFRCOU5WUmxJa1JyMFVoRFFSajJYRXFvCi0tLSBh + VktVZElkZndoOGQ0NnVVWXVLM3ZkZVdOTVZwMlhVbFkxSVVkdzY0ZmlZCp9V3kP3 + 54Z81eR3wzo5EMxWEYP3nvcMUtb45p+qbrjMp2PicAcHjiInVJPznFVtojQif/6B + kpHqAcYpGK0QJQQ= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IEJub2ZjZmtG + YXRGYlZ0Wng0d1NPZC9JSThxMGUyVzZsNHVNd0d4Q2Z0eHBnK3hrSXUvYmFEZThE + b0hEamNrdmtQNEtWT2pQVERFSElYdVFmSGxnK2Y0YU82QjBYelRySEZZNDBaeSs2 + SVc1UTNVRHFwRkZzbUx1U21WWjRBWVZqdjZLbkNtMG53NWlUemlHNDZvRnhxeUJi + aTdESjROV2dqNVo1cUxkdnVGbWJtWmdnR1FJNXJuUlZsaW1rT1NVRUtwZzdrQkJz + UzE0U3pIMlQvdmVsMTBGVjZ1NUdRa3lOdG5rV2xCQm9YWmhaUnVTZittZWJUZHM5 + QkUwZlVIRDhIWHNEbm5EZnZZZHhuK1FDMzVRTGdocUlDeEcySFA1R2tzc0hJNS9a + RHZYT043M1FicG1FMjlvOVJmbjBqRVUvMWRHeUk5ZkcrSDZzbit6QlNCb3ZhaUV3 + MjlBa2paclBQWjlGMlgrWHhuN1lpNnQ4YnZsTEtUdm1IcnN5aFlwN2FVblBxeC9U + WkRQTTVvK1B5dW1lcU5lNHk3V0JNZWhsemxFcU1xWGhQMVpmQXBQTzZuRDRVYm4z + VVAzZWxwWkZiSDI2b21ydkNCQmRwNDVzaE1yNElvMC9KWlI5NWlCTzFGa2NMTi85 + WFIvV3Evc0p3ZDFpMkh0bk03ck5UMGtzeEpOYTcvaUNTWEpJSTlETlg2U1NTS2xk + dElmaWNHejZCUmdIL3cxWXg3MzFSVnF4bWFTUWJjZWZFYWFiNnUzODB3ejVuODRr + a285blB3dGtscXlsTGszMUwyc2ZyNVZwckNsa1d2S1pmaUtiUEhHRm1qVHpOQU1M + dk9qZlpLNDlXUCt0eGFiM25EdFZ2YUg4MEoxVUJzNTJ5bnRyVWt6QzAwNUF4Z1hE + MTBPSTFPeXIwdEVaMTJidnZqVHVybTlUZHJ6MHVOSGl2eWxWOHRjVy9WanBJM1VH + T1RVbERWLzgzbW94aGp0M2wvalBrZG91ZGhlMFNoMHd4ZGRoaDdGYWZrQXZwQm9r + Y1BVYm16T0ZzY1VRRk03cUhhS0xJSzA0cmFVNW9wQVBJUFJzMGJqa1dSTTlYMGNo + eDRSekZOWk5mUTBIczU4TWZPSGEwcGhCVFlRQmxjTFpQamtwcmtQNEVSNmxXMHRh + MnlIelpIODRySEdaRFAzZVZ4T1huMmp3YTAxVVdrRjhXandHNU0wZy93S1ZFd29Z + MHFtQ0svOXpxZEQ3Zk9UY08wNjBRVnZZNmZPZWZhOVRaRjR4aHpVRHVuY0xuWTRu + QXJXaTB2L1RzRXFZcmxyRGdjeGY3dTFFWlpKSjdySlVMZzdZRFVIRkdVMGJpem1Q + Mkp2QW5WQTJ6ckxzMkYrekh4VGVmZkFqcU1HYnBsZWloVUxNR2puMzlPaE9PcWJh + bnQ5c0V0b1JkUGJnVmxiVjdIdlNqYVhKcUpIbjNnbkVvK0I4Z1VXOU1ackhQeVRB + QkNrd1p6VWdQMThKYUtYSElSaFNKWkNPbUtUZFJ1dVBpMXV6b2p5ZFh4NkhqaHBH + MjZ5NmF3eGtrNVJFcjlyS1hwb2NqaEkwSWhxV0VKY3ZaSXFqam9Vb1E4Si9zS2Fw + TTFycHJoUHRVV2FWV3h5RldsV1lUMTJOWm1xQ1NWaThvdkE2bkgxdjd6bXVYOEll + ZDZ3RTN2YmpUL0hPd3FuRkJXSUF2c0cxMTVYS2dSZXY5UDZJeWtmN1FVWFVjb00r + L3V5MHdMY1RlWmJhaUxucHFBcVlNNjRVdU9zdjJMT1VaaGVaZDFvR0F4aG5VSmg1 + QTdqTkk2RjZveE9xeThIRFBKclRlb2tUQ0UxVGVuaG96MFRsdW1SQTJLWndhQzda + YUVqYlpKZEdCTXBkdXpMblV1WjRWQXZZMmI4SkQwSmhibHVrR1ZTUnFuOS82bEZS + ZDZNckhXenZsUTdmV1BTU3NUalVtUUdjV3pCUm9hYW8yVGhlRjVWUE91cldZdwo1 + dnhsZGoxMTRZN1pLcWNUNXlGZ0x2OStqc3hUMkZYQmtzTXNCbnl1cS93Ci0tLSBw + QXhuRE5tOVRsUGFRdkV1bGtFVkh3TklMakJmTkg1QUFHK1FXeVJtNFl3Cj7QtQs2 + zhulJGJGiWCas/JrQagY+Rq+kV1dushwPk2pT2MNXGD8wflQpkBThraOtTLam0l3 + 7BqWfTEnmb1glR8= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDdWQk43aE1n + ZHozRFlqV0NDTGRyT3VnSnFSMjgrcUpjVDBEU3d3bC9kZEtuT2c1T0lhVTBLUWVH + SU1HR05rUkhTakxMOXlVaElxZ1J1R3RWOU1ZNWhmMHNlU0FsekI4RFlCbWtIbW5Z + UTIxcUIyMEhTeW1GQXRqUWdGSk1KU0RxWUZnMnBobjJPaXk2cXB1UkZPRURQNUZy + a3B2VmwwZWtNeGtoL05wSWxqSkxGR04xS1dYVlY4d3E2bTZ2QnFPOS9LU3VaVzJu + UlYvOHhicnZUclVYQXYrcmY2dDAwSDJ0Z3BUN2tEZ01ySDhQV2plVDMyQVFSdjlt + U1VWM2RKdlFZMXh0WmdOd2xSWVFJQUxraDVFRUN6ZHRmb0VFMjMxRG9PTExid1do + bXRXUXJ3U2dJbStyVWNmaDFNY080SERhUWgyWTZlbDByenBzamRrZUtEVko1Mng3 + L0Qybnp2THBURDl0eW5SYUM4azdzN0NHaU0zbWNsU2JWZjEwTWxXQ05CaEsxQ1Rn + SytDOWZvamx5cGUwR2tEd1N1aElUQjJ6czJuZ0NQNTdEcmZiVXBrU2RmTFhMQTNp + K1MvaE81alovb2J3VlF2WlA3S0dwQW9WRUhyUmZBUEtrV09vb3J0OHJNQnNoMjdu + UVczeUdtWTFCTG1ZWUIzbk1wc1ROZ042RXdJVHUrRHZUN0ZITXVBZkY0a3hKSVRB + MUVGaDFSaTgxQ05OeDJLQlJVOFVnM2NPV0MzZytpbGJpbDlEM2pYQVY0ODhsM3kx + eUsxbDFvemI3R3dDTHFKb1I5S0dlNHpKL2dpRjdYSEZHT01DaUZEbmwrZVVxNjlH + emY2NTh6ZCtncmtEcEJnc0lYV3kybEViVzNNKzVXL0dZaFYxNjAvNjZDZmtJMjl4 + NWcvOVhtNDY5QlE4UFlOQ3UraW40MXJseHVSeE56bCtNUGUvajhxQmJvVlZtKzhs + clp0VGZQRm5QYXAwa3BtSTZJWEgyeGtpYUwySW5mai9lUnFURmpYTWZKQXZZbHE5 + b3hRMTNZSno1VENnc2x2U0NXMnd3aDJINjdheGJDcVFHdzZtdnBKNGo1elZubWha + RGJiWFg4YkFsd2NidURUSktVdlp3dFU1ajZnY2NLNVZZY01kRWlFSDRwZkJwTGVW + NXdQVUI0NkNneEt2cG5VKzE5Zmo5Q0o4bExzckRLbk9TOXd1NWpWMm8yNDJ5NVlm + Z0hHcEwxRXBwZTdZcDZNcU1QRG5UcUhua2lJSUVhZlQ5a1p5dXpKRkdCWTA3aHlY + TVZFRlNXa25VZ05yUzlVeE5VZ1ZKSWpMamJoNTlNMjdjQXBGWHY1ZnVWRkhxR04y + VWdvYnQvdW0vTlVKaWtyZDE2cm1mL0tiTW1oWDE3c3JWVG5JelNNQWRiTWdNRktR + N09xZHpQa2tmZ2Y3YnV5aUpVMGZqYmFlQ0IvTGx0dVNNc3Y5MWNxQUpibFFiVnU3 + N0h0WlVMMkt6UDJBUVg3a1lDQlB1TWlZdzN2aktaSGJuajllajg0WFVSbzRYajJm + eWNqcURPMExackNuNDc1RmtKSHB6V2ZxbGJuV0JoWGlITW1QV2lCMkxYNlhTclJz + RlhzK1k3TTRwVGc1ZDNtN1NUcHUxODB2cFNQNVVKNHZjNFZiK3BjaSs1TG5lb3Rk + Ymtsc1Y1TTFpbkErb1RBYWJVTjc2SHA3WGV0VmU5SDhTUkxESE9DWHo4amIzSTZx + Slh0cXR1Ym1IcEVTMXJpdGYrQlJwblVVSmFhb2NmNjVlQ0N2RGZmQTdhVkE0Q1Z4 + aE9OSWN6R2g5T2pIazFFbTdOckM1YVUyVGV1Mzk3SmF6dXVjM0YyUGxZcEpjZEYy + NVVrT3pzS0FYNkkxQ0pFbWk2aHdHODV3S3ovdmY4dXFLOHJOR01PbFlyK0xkd25M + OFAyV0YzL2c0eVJSMkNaUldoT0JjdmcyaG1FY0dDTWRGZTU2R00vOHNDcEVFQQpr + S2xaaUxQdGljZFlBRld0K3d5am1FM2VFMU1yTnBuSmRrL1QzaS9XZ0VJCi0tLSAz + bkMyc21mckdzMENlNmJVenFyeDMvMDBDcXV5YloxejlJTE9ySTF6amdjCquITtzp + LNw2OdUPsISL8NP9ykpVYOmYWYbrVEI4YY0/FZfIs05nk+MvGB3fZ3zFmIoVm+Ei + W5B/OH4mfpOnQ8Y= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGRKbkg0bTVT + ekZ1ajVDaTRZbDFvTVlmdkdlMFUreElyRjlwN3Bpa1dLTnEzU3Z2N2VHN2VuS1Zz + ZGtGeDM1UTNDV2xTZytJc2ZtTmRlYWJmOFUxYW1XZTFNdml6N2Zrc3BhU09uMGZl + aXdNRkRUdE5uZ2lzcktISEJxYXE5MjNHZDNrUjhjNEt4NXBSRUhsTWcvYUttTnlp + T0dZSDR6NmZNZE1KMjIwUVNvLzdjV1hsQVBoYnpzZFNabWtMc2dqeVZpdUJOU1Q2 + MUhXYVVENFFiaGpWRGFMZ1Y5YTZzc1l1UVpyR3lQQkd3bzVXZk5hNVNnandsaGtr + ZHM0ZXF0TGxjbmIvV2xMb1pLWGVyZnQxSU9VMEluL1FpbnI5VTNtcXlQNEN0b3lD + MGczVDdBeU00bHFwN1hRaEVkUWdhRzRuYmhnQ0xZS2w2QTBhVi85RHNPQmx4Kzg4 + UG1Fbk1FUEhJOGZ0YkxoamtqTUs0ZGRTZC9mRDIwM05QTGx5dEUvaTdIM0lpU25X + VW54dVJVTXV2NUFadnZqVCt0NENhZytnUXNvNEpwWGJ4anFNNVRKMEpvVHptb2FN + amZ4MW1xL1FyR3JKOHJjNGpOWVFoclVkNVYvYm1QU3NYWm4yeU9vUm9Xa3RqeEFh + NUZheEVCbnR2VXlwL3A5dk1QK3BRampaLzNLcE9HTmcwbldRVFFtYkNsS0RRbTRw + ZFpoY0NBbFRLdm11ME94VVJ0UFdpckEwMDFXOHF0bVpJQnQxOEVIMERGc25vNlBu + ZkdYc0RIa2JWRTNsdXd3TEgrZC9xejZRSXBIeHE4cXJGRDQ4VWhDcUxvbHhDUnBr + NU5JSWs5VEFwV2x5NnlJTEEyRjNwL01mUDEvWllFWXBwUUZYNjhHdnFDYXVPaXN2 + R1c4a2FTdzhZZkR4VnQvelI4TE1qMGpxVW5ld0ZTQi9CVUtsaGlpN29uTkp4NlUy + UDdjMUdIZGowNXh5RWVVRkdBZm9NT1QzMFhKeGFBVkJUVm15cWpPMkpGbDNpaDYx + Wkg5S3Urcm5zY1pScU1keUg0ZE1hWHhNM3V3MUVJU3dpYWZyT1BlUFBzNElZS0pw + bkpua0drZFhrTTdiQUdqZDUxSFBvTlhSZGZ1UXFEaGtQSTd0SzFUUXNHdWRyWTBp + ZmUyTkxVZXBMUXRjVkY3SDJEZE9Zcm9OcExFYld0ajduUFIvQmlJZEtPZFNJeHBr + VlBRTkVxQm54RUdrT0ZkY1VoRVptSFFTNjY1R1FGU3dpaGVvUU1mTE92NlVtSEFn + V1lreVZQclYxZHBpZXEzVC9TYUk4WFFIeUZXTm5Uak10bGh1YURrbGdsWmZONk5p + YTZ2alJIOGRFM25hdGRqMUE0WVRCVUxoRlFVTTN6dlppSXNQeGFlRGNQNU8vWEVi + bkhiRndyN21xdlZRMmNWUUxYYlJsUW03UEZBc0Urc2tTOVRiRkRKWVpyZnZpUEc4 + T0ticis2NFN4WS9mOHZqUmMyVTI3WEhrc2l2QzAxVUVxQ2NPREFzZ1I2MUVoQVdZ + TklYRU4zRXc5NUhDU3FQcTFjaUVWa2d1ZS84NHA4QXJXUmpQbFRZajdjRlRZR21u + OHo4Qk00M2JHMUVtK1AwQzY1QXpjV1pIdUh0SUQ2T2w1YWttdDQ4aDhsRm9WVmJ1 + WGQ2RkREaDBnZzdhNHJxQ0JESEVCV3BKU1g0Q3JFVUVHTDA4RjBmN1NiRElJMG9G + azRBM0V0a2xndjBLRzJ6eUpaSXlQckxFaW1FdHJTdDNnamlHeVBjOWZGcUlPVGlo + YSt6Ny9tOGsvdmFrNFU0Qi9LQXg3dDRUMk5NeEdnNVpwSTU0NUR5NWJoRW13cmpo + N3kwT3VRcFlVd2Y1TXVqakRQSWxIbGViazM0a01WZmQ2eFJoTHhqdzdHRjNON0x4 + QSt4VndVTVJDbVhuUDN6dVhzSGVPTWFSMTVpSjk2aTBGOGc1d29sUmMrRjJMUQpN + UHB3aFN4WDIzT2xiTnNsalY1cFUxRjlBWGkxdGorWjRqNWdRMVNJNlRvCi0tLSAw + MzR6bk9lYkhxWlJHcEU3N0RQN2t6bDF6b0hNQmZIMW1jTm9HM0hJNWxZCgxseGlq + YzpELf/NgG2AJRXkzA7XnDTReV61tKDmy/8cjCVuDwo+we67m8Mjfhkkopw84Sxz + KMnj5NsrDK4r6Pg= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1f7nk5g0hcvy522fpgnp48gxt63cpyh24cua9jc3hwjdu4qvlpr4udymsgqh6498max2w867tect39gl62ru8kws2gshupfeg4gzggz8fw85cqrnqe2llyxt3ke5gtlprfpm44suu9f9mesu2rffhlcfyecvurdylvk6petyc7p549q832u9nknznujthesy0ypdherhz9jpsc4gyngewrx4udlzkrv35re42xwtlqdtzm4yydxynqncjk3lyzu64yevahcsvcvnew4rrgmtnssxnvkry6ydtvwdsws7ch3d9zgc2egcvwjc50snxulcxx6vuq0yskapv84upus9hpdn9kl98j24zvuqazwttw4e8qe3jp2vpsfpu88pl6vjxv3krmzqzkvctevcv7xe4psz7tas8p0588kh58j8zfpqq2u6k92m4y9ugcd6hgsz9ja4zr7eadln94n6n3548jt0s2vshjd94pp6ct7ls3peecgmkh3gltzcdlq9ceytv8se8yhv7vrqsx5fdexn65samrayd5qs5xd9cwsyt7ea2nvsmp4tjx44q6guesu9qam4un6l5dx5y5dr2fy9r9dccp35ry64305ckkkcecz6rw3z6zl468smspl0hcgsykw47ef33euykywkpq68psnkfkwennu3cwjcyupv2fgrvd2d6n35emgn6w0eqk08psd25qr8asuv7sxuyr5w26ajqjmhccv6f0d42dqsr4ecutcuzxxnzcax5hgtwk54xsvnnexx4phtzhshgxxhyx9pvknzjtjm43z4d89mle0pug63j9g44ez3npqc3td0cuygpecqdpncfzfqzrnykt388p9l4nkj5cfazmp9qtd0gfxl07qjnswmk684u77zq2jpxsn6j546gf7ql9q5k37mv0sn25aqngs0mgzpu4jy5c8heqqf55u0kg67907gxu5u4f8cjtztqqh5evlqh99t0jlvtccj54kc0vxu32adpfzesp3zjy8kzg7var3ku03e08kk8r7zeeptp2p83cwhsmxvvfzmg9jppg5ae9xhukfens0pl6sr450q3pg4rpj74f088wsj9eegv2umv858329ypgjdr54v50lyne0t8xddqrczg3n9vgzkw6tzn9s2tmvsxha8legfpk79lcf9yepf8ln5h54lcn2qg6jmqhkff6un930suw5zgx67l7670ljkg4pxrgfxnpum8xmmc7wk4eegpytqvkp0jh8enhs9hap9nker8efshsr4txe4tttrh5paz9y3h89rjxwl8k5tysal7n0yzau33w2fvr4u8cr05vtrct09thgj2hn6qjqeh5ek80y49cmqyca6pryjnqdxj43njctqsgpk0ndahqd5qc3t3jxssj7g2rdul3jvk5tgsmfpe8dz0pjualv5kgwgwl7pfvfu9pvcx2wkt6e7xe4eu025jksj5tdafcewcqhz7w6sy55fhx4a4ec7hz9yh3x230vaz0fvuxdzvvvm5ze349gsv2qkrj534pqk6ffy6wtwjawrztjnxl84sf2l5k73ptgjmefwgmzmyxxdteeqeyesl38ykm3pnsey6xd2c0pzsngcx2283vtzttj79jht5gl43qxrlh2s3efdd4wqjwkq5dv9n83ptzvefsvlyp5nvkyzndvu8ywcg5jp6cyhl9ygtjz42layjyzylkuxefwfcmqmejvmxqm4keklrnvx8nd6k7yp8mxxprljcde2s5xz79duyte3kckvgp0fuqlsnx8ty7vnk5pz4m9mk33rtz3ujryxkvsur72egqexvse22nlgukklaus67kcm4n0uty0dj3pxtyl7fuz2x7yr3zw6vp6pvy6r0fwjlqzdkxc0rug39uw2fyr0gx8a964ef5dplp49mqlpqq4e0appfzrumnuawfy5mdlqd + lastmodified: "2026-08-06T00:05:20Z" + mac: ENC[AES256_GCM,data:x5nZGNMFgRKzekHm47jxotO6WWbHb9KmfaYCI/jn+fy6GwQ2aXKQo2SitnJFPRlxUE2yucz/NCd1+3t9bt/XtGTciIlToTBFT1WrO8NYI0lhokOIHuEP3tCmRCeq8MPsECVjdBR7xndgIG6nPIkOlBeHnaqWiO/IjbaIB+7QNJY=,iv:dRfwYJZ+8dK2cSt7ZKgRQY9XCJ28xvFysDJ6BSqQql8=,tag:UjCuS0AYMaUoj8zpsEEB/A==,type:str] + pgp: + - created_at: "2026-08-06T01:47:27Z" + enc: |- + -----BEGIN PGP MESSAGE----- + + hQIMA9/PFHehMxwxAQ//dTH1QozfI2X0j6NXc0WISCzIKcLGw8OWBY1xS5tCCF/Z + 1w5zC8XfZYxvk8HjCSDwBtwSNvcbputBz3zBKLgfkJWE0cRrnNpJ4LsLPip6XqjC + H2ogrpwSeCT7X80ylIVZMWJFk6NWRkFoPkHzXZpgdERzqss5CAiLrgCy8O9XPVrl + +k9NL7snODzoq26Eeo/T0HF0OwjnSFERnWi65aQgY1gGASasjIoPkXEQPcJaGgQH + GGfR1EKP8ouqdYvpwqVYBN/CbffL4BNjiLROwdUzYYv25eUWIud8n6MzxBFVqEfR + 5AS7RL5i3l8TLnLNbdlsiQZ4loST1hUVpvKWLxh0uu+9gBU3/+nbH2NQMK3tAMHg + RSEbIXLPbywifr1OSqKrfROG/HQYu0yiDO7YJxbM0gSLxQK2acK4R6ByIZr+VOzp + E7KFh3LDA03sLJoc2kiPcPF+SufUJe97HyWNPDY6MA88dnIiKaQOceHaXmZk0CNh + 96LbKJj+UA2CTXvFfd8ANM6V4a219uAY1ylMhM955s2+UCTJ7i1KO94dYjB7e+O1 + P9uEE4vaCWr314Y6mIm737/1ofL+za+OWXyAJhKd3k/K4U8bfUjA0UtiqVTuSNOa + mNeD85VstQYQnZs0uz/2jOziucU5wLPA13DLH4rTp/gxu4nQkwhzpkYmjR/RMpvS + XAGNyhGZxni1Br+QeofvS0Vl25O44PrOoZ5H5YqXQtbKvM+uloZ1IZzJbsIbN4PZ + L2JnAsSf8dsRSdKL0nJtniuSaBJB/iVSsxkbXYBVjJoY+b1JGvBv1mww0C6V + =VtXG + -----END PGP MESSAGE----- + fp: "0x416CF1EF9AAF90BC" + unencrypted_suffix: _unencrypted + version: 3.13.3 diff --git a/secrets/network/private.yaml b/secrets/network/private.yaml index 5c80445..b80579c 100644 --- a/secrets/network/private.yaml +++ b/secrets/network/private.yaml @@ -3,145 +3,185 @@ sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHdPSExqaEc2 - OVByL284OC9xMEF5T1QxYUxpdHlaNm00ZmRaTERjallOWUdXejlqNXRvVnlicWIr - Y0kwRG9ZeWxYVXh2Z1orbDB0T1FuMUtwR0UveGdzSUVoZ01yZkFSQVhITy9BcGVy - angyK2JJcWYwbzd2Z29TV2xmTG5Kb1BtTS9sTHdGMFhyUThvVWxENHFxb1Z1RlJw - QSsxSzAxSEZ5djVUM2l2Njk4NWoybDdkbVpxejhBSndSUExoN2hVSkNCSjMza3lB - ZTdGZzgvTEFkMGFRVTY4aWdSNnlzR05aajFIZ3YwNWR5MHVTMmZYOVFXS1FMVWVN - OTQwQ1NtTmdZazIwcm1NbnRPaUE4ZE9kbEZFY20va0I1WFFKTEF5YzFrK2FZUGZR - RGtKNUU2Qm9oVFhKRlVUSUNqZ2lQYlh0TmZCWllFWE5MNmhtSnNOaWRxOHhvamIz - enpubU43clJSS2EwTmJkdUEzSCtNZnBRakpSOEIydTVQbVc0VnpqbEFDVG9rdTVw - NjlCSVFUU0kvZVMrZTBHWTRFQ2NzWi9lU2lNUE0xbEJQVnFrUnFSdW9nbTNVbnRV - eGNzRHhxWW1wVzVIZWptVWUyVVhOMS9vZVNxM3FuWUlOa2Z4S2NTbU9HaHVLSXJT - OVdwVGU0M0IvUFpvbGFla0kzM2dtazJ5ZXJXVnVaYm1mRWtpcFFtSkVTQ3pVcUMw - Um9IRm02YUdmMGkvbUk2akcvVTFRbFNSVHVJZGJGalBQd2N6Wlg4S2VQV0RVNFJK - L2xHbEJuUisyWGdJTzh3azBLNnlyTUJvTnBZRWxheG84aCsyQzNyb1B6UDNab0ZB - RUU0ZEZlVTNGMjNWblh1Q0NhbG1aK0JWM0I1clVqQVhNaXI1cXZNdmxTR0ZZN0NK - Y0l4YmNxbnV0VDVJTHp6SUNDTThnRndjTFJmc2Fmd1lCZHVNaTBmZkowWmxCYUxu - N2thYS9CL01taGVrTmNGdzBaMVFkNXJ0dzdac21Fa2VDTTN1YmVLdFRPUjF0akVn - UXI1L0dNMVU3QjQxMlNiK1lrOUhXYjY4cXdUZDd0SVZ2VkxOUmJGVThTN0tlazhY - LzQwekM3NG16Um1uZytuVE5ONmg1aEkwdHc3dXBIY3hNMmVhaDFyU3k5a1dKM0ww - eENxUXZQZEQxSUR1ZjdKT3dtK2xaemtxcGxqR253M3dCbUNabEpoUlFVbFhZY1Mr - bG1CbVg0YVpSMmJaUFZoT1UvblVjdjhuaGsxZ3VvaXJ4WXBsQzU5T2pBd3BJbUkv - bjBubUNud2lodCttbkxxejh4Sm51QkUxYUVheEhXTkhxY2tod1BybkQyZ0I0TE5F - ZXYyZ25LSDlpMXNQbGdTTjQrUXlVUkoreHF0TkJFVTU4dXMxajdqRUVaV1FIWmZt - UEVZRUUzMmRrUnNkcnNGaXNvRWFTcjNjRmRJSnVzR1lOQWRJRmpHWE8zbTB2UXFU - cUp4SmJZYW53RmdOQk1Fb1Y4Rzg1MzBoOFJHQ1FxS29qM2pMN3F0SDM1dkVIUEN6 - K1cxR0QvdmFWa0Zzc1pUQll4VUhRMVBvdVVQTk81a1J6YkZOWkEzS1RieCtvYTl1 - UGp0YU5oMFZZZXVYMFVUbVZIMFdoZGdxZzk4Q3c4aGNzTkJNeVY4Z3duaDFmZUhU - K3BOemN4Zmx5UzRMRWpJblUrRHgxK3lSNzZxSFJ2ZzJSenR4SmxiLzdGc1VEVE9k - NytMWnpVRFFzMFBZbnh0Szl3MlBQalE2M05Kb1VEa0NJVXdvYVZtcEc1M0gvUFhC - WW5VaFowNEFrdXR5N3BXclFycGVJMHFldFF3aGJPeGc4cmlZcm5DeDljaHZBSkVx - Ui82N0NJZWZ3QkIwdFhmeC9Ta3d4T2REZk0wb3g1NngzSXBSWDdsTGlRVUVMekhw - dWsyc2JkTUxoQjNSdTRBdDAwaXROZlJ4THJoTk81Tm9lMjBGZGxvRHc0WWlDUQp4 - ZFc5alE1ODR2cEZ2Wmd4S2RPekphUURkeTBhZ1BwcVdVNkNneXpZRFVRCi0tLSBa - Yk43YmJ4a2N3WC90UjJxalNmU2txMnZ2dThEb1BlVFRrVTdkSThOQytBCiJzqlsd - tz6knOuOFhe8CDg/ks0qJ+hndpxfFiuS8zF5Qxo/wr1WquS3C2Bf1hwyTdn6ln7T - 84NyjLuQmau+Z9k= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDNCM1lwZTFT + eVh1eUI5OTE5dzZrSkN6MzZGZ3JwVW1SeXBkMkZLNXk4dDhqMkI1b3pFclRhNnBz + M3RaRTUwVCt4Z3dmZ1ZtOU5zUmRyUERKYkVicEprUmd0Z2QzRGJnUkN6bXYzQlhP + OFh0eU02VkgvWDFVOXR5SUtYcE9iS0dkL05ubHR0TXh0cHowL21qaW9RK3lpK0J4 + SW12ZlV4blN5TmdrQ2h5ZzVJd1lLU3RpN1NpbVNxd3g4NjIwcjViZ3JqVktVU1Fa + dktXcEk4bHlHM0J2WEJ4YVYxQ1Yrb0VBcEc5WVlyazR4enNvaXMrTXBoZGJ4UVd2 + UnhyeDZEdFpnU0JubFc0MjNxU3VrTmdHYVBTYUpMME9IU203eVRrOExiZVV1NUNM + ekIwUDhQRkZKNW1kbmd1VDcrYjRVWVlWVmZyTWpqcEFjZVUxeGE5MGpPN1NweEN6 + UkYrZGM1ZHVkVE9uamRPOXVMNTkrYVI2eEV0Rkl3WVhwWW8vaysyQUJsWnJrZjRG + UmUxWE8xOTcycFB6WFJ0YVRiMllQTmhTM25EZEJyNURVRzNzZ2J1V1hSUkkyMUhO + Q3FHb0pnZ0Y1Y0w1cmxQek1JZDdjMWFyai9sWGQzZkR0bEVPaXRseXlpbnFBSFdI + Q1JTU0Y4KzhWTWl4MEU2U2daRlZ3bjFQSzhzVm1kczFvUU5RUlFWRUlHN05GYjM5 + Unh3RGdLTnlyY2FRQlU2Z0hTRmQ1OW9HaHhwOEk2NEwxMUpEaXFXVlBUOVhNaUpE + dWU5YXNFUW9maFlENzg3VkhCc0IzNWdIZUwrRDhldjRuZ0R0TWVBdGE3ZGFVTjBj + RWM1WU5xVklvWm9IQUl4eS94M0NUYUl6dCtvb2QyVlVGNlBoMzhQMGltamdCR2dW + Zk9ibXBwQlp4RE1JMVQ3aldEcVd2aGVabytGeGZ3ZWRicHNoNU43UUpwNHRuOWtR + WGUzL2NXTEgydERadjhPY29WWUFsaEMwclg1aUxpckRvMFpLU1BpdVdkcTFjRGZP + QXFCSUk0aEVKS2lvUVlGSUV1Ukh4NUIrSi9ORFEzMUgzTWJacHVBSUF5K3U3KzQz + dkdBUDRRZEh4bm14VnNvZTBzY3VDN2d2aGR6TzMyK2FaeDk2dGhibU54UjFtMHN4 + VFJyb0ZWOW9qRHRkYmhtMzd4dlA0dnQyUFBJSlk1aXdNMjYvQjlRdi81UXlsNTJX + azFKeGpKMUpjNDhOTlA3RG0wcnhJelhsTWxONkFvV0ZsQ24zSUE3Ty9VbEJZdjJm + QjFsN1FCMmlCbUQ5aDNnRVRZb0JTOGdiU3J2S2hDUFA2ZHdoU3dxZXVrVGNyQThl + U05wMnVHTFZSK05VT2NZR1k4T0k1MVlsMmVLRUdJN0Nock05WWVWWDRPT1pHY3dY + OHNZTUJZVUlnak9lL3JMUG9OQkNITzlRY2hOY2RkYmNiTTFzQTdkYlpGUUJqYmZk + UlJEbGVXZ0x2N29iV3AwbWhMbzZpTWhXZXNoSlZWNmxpalZUUWdzT0pEcWs4dlZo + SkM4US9rYmpZWWs1K0NsOEZsU1FmdGo1RmpvQzNWYzJTNCtkeUc1UDVIMm84cVpK + anlHWkgyZ0xPMTEwelorZHpxQUdIaUFWOHI2SFlRZTBYV09lVER5d21WQmxkaXow + bXBBVk5VUDdwUjJpMlBpNldMNHNNTitZdnBYZ01Mb2NjSlpyYllpQVhSbU1HNno1 + bndaWGVSL1R0amltb3Zxbm9IQjMvOG5LMW15ZVMxY0szWklVS0ZLMHkxTE14VlpS + NXM5Sy9ReWc1YUlGb3NZV0VzZUtaV2h3QVBMRURCV08rdE14TzVBWTlMQXdFWmFN + M1FGRDB4bkdHdlAwVFQ4YTY4a0dZMVpVWHY3bWdvcTllYm1iN2doaHZDZnZSRDNx + TGFyOThwNVJBYmNKNlJsVS96aWd3cVpmSE5UMWVnRmp5dFdDdG9DS1FrWmxiQQpJ + OFZSUEhGT2NNMzlxRDNQRWwzWmJwM2VYMEtHVkdpczJlL05Dd2pVMWprCi0tLSBY + RlNEM2ZFTzJYVzJjaC9HdE9TYnVUVXJhZTRydFdNUVRZa0dweXNhNVUwCvXs2X0M + xADXVp4m5QckLou1KvzyJksMGf9N93G2QI8zMsZlTg9/r4mO07NYRWbfAmoQZOBV + vRi1smjEqi7+eVw= -----END AGE ENCRYPTED FILE----- recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDQ5Ryt5YytW - WDA0UkZsQ3hWMHFaSE9ZalFmSlFUcFNjV2luWW5LQTRaY0hRWmRCYWc2aElPSWVH - ZFByR1RoMktjbFFhK0JOeEppdUFWUW1oOWhHcndnTld1ejNTNXVhK2l0aWtXcnI0 - cnlvNWg3aVYramkzaHdTTmxGMDdQYW9vSE1uYzZTOGRpd0M0MVpvdW1VYWtCMjNy - MDNqWVpmbnVvRjRDVndHTFNGVjVUcUNkOExnenlndXM3blhhbXRwbzVhZXVoTjNM - N0RyZmJHM1VMbzJubFZ1dFVKRGd3YVcxVHc1ZkF6bW9lZ24xWlQ3SENJMmNGWEZC - RzNPRThXbmtndXhEQ2tkdVYxU1JUVHpKRkVmSTBVaENTT0NlbE1ZL2M2QmpqbUpV - SzArcFN2TUdjdVFESVJBZzRJbTA4ZXpUUm5jYVgxZzY1a1pmUHR6NkJobVRUelNO - WUtaUFRLN2l0ZzhBNmtEbUNjdkE1OUhnaldEYlFtbHlrdkJKNldVMjdxbnVva21j - V09hSHM1ZXlOV0V3ZzlpZWk1L01sdjIrZHNMbnROTHVFT0RYV0dxWDh6bHcwWTcr - OFFFekFsdFh4SFFwUGNicjVJZGJLYlZSaGZGeStNMlRqZThpdW5KNElsTExvSlkz - aThnT0ZOZklWQmZXdjI0am44R2ViRTNNeDg1bWVuY1VCU1cxK3ZEYTcrNFVVNjBL - cUp4OVRhWjdNb0pPZzJySWw3ZDlMSS9OY0lYdkt2Nis4VXRMYUNpVmVRYnViQTc3 - Y1FTQnpmbGFaTU5YOUdZZW52dUhFWkNhQitwNk1ZOC9JQXdkUjlTWjVjbCthSW94 - MGR6ekZ4R05BMlJxK1psN04rdHJtWUtFcVEwNEJJOFFCUGlCSmtMUlVXUE9sVGk0 - YUpST1hPYzU3RUlZblk3eHBaeG5pU3F3Q21BY21nSEE4cEpCQnl0cXkwTFhaR0RS - WHBJSjNtYnNGR2wyZG90TElZenJWMVJwVGhBYUg1V0pvdTBBbithYW1EWGg4N2d2 - SUlQbGJueE0zSVBNWVJrVU1CcHd5YmpTZnkxYWw2dmxFVWRQOVhMYUhNdDcvem5r - TFhYTkI2aTJiaDRUN1lFeVNjbVB3OUQ5S3JCYWZWQUN6M0pjVU1FU0dQVExkdDRQ - YloydTAvK29sempxMXk0Z21ZY3dmeERqdi9VSzJXa2M3TEI1TVJzUldoQUx4bDJJ - OE1RaVZsWkt3NmFyY1lQV05xbWRmVVMzclQzUktIVkhveC9EZFA5dENRTXV1dWFq - TmVsU2EzNFJmdkpWV25MejFkMWJJbEZBQjVnMEh6V0I5OHJCWGw2aFU1aFpPT0Yy - U3d0QWlWZERudEs2UG5LM1ptM3QwTmhaSUw5eXN0dUV5SVBvNEFaVks4MDdNc0hX - Qi9FZS9BMGtkVFlvY0JHcGxselRidmFyZWNVcW95dzhtVm5TdlFyS20rTkN4MTdO - K1hqQ3FvaE11M0RmWXZmaWFpdWhNZHViWVF2ZkRNYU1XVXJDRTlBWDJwait3NVVZ - bGhQMmJ5OXlOOWJ6Y3h0a0Jac25UQ3R3SnhDOWMreEpDd3luc2pTUW1CZU15L0JV - MEdMdDRDRjRhdnpENnB4aFlpMmE5emsrb0NhVUg0REp3NGdzOGJVT2NwV01YWFZh - UGVBdnI1bGd4akovTDBkYlNBNG0xUW5nWW5rdXV5a3dYSmcyYjJhL0V0MUVaWWtP - R3BUeWdJQXJIdXNGM2wyUmw0MTQwR1ROeUVKcjhTV0h4VnN5Vk15cmhRV3N5RWNQ - NENuYjg0aHo5MjllREZuaDE2dVp3UGtaTFMwelpxbmgyQXNQWGlBQlRycmRVeTIx - QWRlQm1JMDl3Kytsbi9Hb1N3diswd0ZRMTRlUUgzNUh3RC9lMDhISTB6NzBwSEIv - RW90c1JTQ3hUVENRZkJCb24xWUZRZUg1aklNdnpzK1ZJYXdmMUZaWHNSNk5Xdwp1 - V2p1S2NPdnFQUVZDS05TK2E0QnVjWlByKyt1dWNwOHNEY3lieVRVK2YwCi0tLSA1 - OWJaaHJaTWg3NlhBZmJUR0kzVkNiSTEyK0RXL21zd3JXcmNuZHRCUEtNCgNTqeH9 - +AB+XvVDEaS39gmwkPlfWxDF3Od69RUDt9QdPdojFPrPiS8t0BDuISTJSwR+em8P - lH3wXzZoJhY9vVk= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IHo2Y05GaHlx + emdWNDBMQVdIb0lOUkREY1RzaDR5bWE5UEpGUTFWcnRjVUZBbmVzSWkzakZQSWJu + b0MxZlB2WCtiYVZJOEhxb2VGeFJOK21sTW8raitncW1pZHhRNC8xeGRuWkRyVFJn + V3J3YllUMnJncko2bVdnNU5veHhXQ1cxVEhtSXVMZVZDRFE4bXp3N3ZiQTRQc2Ux + ZXcyWEQvTWhqSW90OGtTdUw0Wlp2d1NFZWZBTHNmZzA2YVBGRGhhbTZaUmMrU2Yy + eVBFM2xJaWxSSmpXdWpxdTlOQ2crdmRaMFI5SGkvNTJJRjJMM1o4bllqMnNLRnRQ + aXMra1M4SzRodzRBaUVwSkRBNHhNd3FRcW5BRFdTVFlJcisvYkFFbEdoaHpLUEJv + Vlo0TGN2VTUyOWpDeUY5TGorZVJWN2d1MG0vNkozaGNXcGJjRnlFNDQ0UHk3cUpJ + VVRKSEJsUUJTcFZqZ0R4MWVKU3lQK1hXcTBETElMaVFLUUdTeFF5WWxMVll0aVRQ + LzZsSkEyY3l2MHdJa2V5R0Y0end3RDFONkhvNGExakVWRk9lVTNaTVZHN1ZrUjNW + eCtZQUdrMnpSaXdtaUVLc1hPMkMzZ2hKZGltcE1QRjVKcHk0RmVmMDJVYmxNbkpy + aTBtQ2htc0dSLzBTbVZGN2g0K055TE9kbXAycTg3SFQrdEVDd1p5dTZ2dFY4QzZp + MW9sZmRhTHQ4Y2VvN2lFdGZTemg2bnJ3L21YYWxTQWs1YUg1a0ZVNGVPTjV5L3Rk + NTZtdUtKRXpSd2huZ0k1RkJGb2VTL1hzS2ZkY1djR2JkTjVnNk9MeVdiblc2WUVq + SVVGSlFUMkpLQTg5RGN5emZRMTk0WmZUbDhWYlJ4TlJXdXg4UW5BblVlZ1NtelZi + TjgyRUdYNXFyaTEyWjVucEgwSnZmMERIbFVYamIwd1lObWRFWTUzbmFsN3VsZy9W + R2ozNWhjWWdKRUU3R3RtUUFFai9PNjViT2hBOU9iWE9VK0F6dkpzQzBWY2o5dzF0 + S0Y0QXU2bis0ZTRYR2tSVm93WTljTWJkMXBvUnFvWTVsUTBsSzVEV2ZtZG12ZUxi + ZUNQcjdwWlhNQzdNekdNNlVVZTNLazNnS2EvNFVPeEZmY2w1MFJsQm1SWWo1ZE5p + TWRMaG4zZkVzMGJ0RW40ekxYUnZET3QxWjZGdjhZMTJkdGlxaVdUZU5PYytUTUw4 + bWxmaGtLVmJ0YW9mZXJCZG9tOWRYZW1tTjJOdEZobzhTT2Q1UEF4dXRVNFg0YU41 + QUpEZ0RYbk95dlAzT3dCZnVqK3BKaU1UMnd4YTcxL1BPTFh1ek9oUFgxalFrbWNF + NFBFVS90OGRsTCtwT04rekZtMDhjaDZmeFdhZW1wWXdreGVoUGF1WjR4WmowZHBw + WFJpcnF2L0VKM3h0cWlYS3pCdWZqLzZNdm9WcWtYdW80N0RObFduUkhwdmkvdXFP + OTdSNDhyQjhnNXhOSXJjbnRwYk9ERUg4OFZsSzh6bjJaeGJxVjRtUnU1VVhtK1dN + NUUrWDhla1I0SnJjcXkrVXVFOFZDTHJ5Y1pwYXZOd0ltYjVCKy9lSkx5eHVDMXRl + MEU2cDhtRUJTVUl6ajhCR0JyQWtrVmcvTnlZdXp1VWcyUldKWjJGOXJsRGdRcm9i + aWt6ZHBOOXFVeHFObUEzSkxIV1owU1Zic0cvSmFQWHlXMGRFM2dHUEtoT3Q0eWtz + Ujd1WCtXc05nRmN3V2h6cVVLdEt3MWtIN0V2aXpZVWpxQmE5bGRqOUtCdC9vS3c3 + OTVkN2FRSFRRLzN6VjlaMVpwRmJRTnU2SHp0bGZRRVlralZJS0hsRGszaEl2V2hw + ZnZ6R3J1RDNFNklRWjhvOE1PZitEb1dCcUpxb3hObUR5anU3VkJTbE1pZ1Z5eGRt + am1QTG9rSFFCTzErM2xYVGlzWmlORkVrdXJEWmxBVjkrRGJyU1ZDODZPd2NDZwpX + SVFNNElsMFozc3lTZGgwa2tMUGZnak53K0lCNWpaRFFDOVFJR2FiWkVRCi0tLSBZ + d29PV3YyTndZVm1rakE3S1gxZHVQYStVS0MxWHdSVHVCdkFWUVU4UFVzCqOhF0nO + sUhWlyt1qZHadZPMFywWU6fl4WDIhzYi6UAf65yC/cAMKr9R0qU168h9cFJZrTeB + +gyabLHJQuaTNOc= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFlNMGlvaVBt - REJWVk1OcWRDWTlGWDE4N05peW50ZWE0c1JzRnhLVjQ4Z24rTWR3bm1IakVmdC9l - NVlMVVJKdXpkYW96NUMvNEZRQURpYUJHbTVFbWhQUFNtTzFFdXFjRStQT1BPNDRD - aXhzTklXUllKdFNteDZyZFlnUWthcE96SjlXWVJLYzIzdlFTbEQybXlhWThqUXpU - TGxDbkRjanhDOS9EMEhBcElxQTRJdWR5RG1yUU1oaC9mSU5nSUV3djY4UTdXTjJG - ejJjVHJyUTczNSt6UGc1NXoxL0FLUkMvN1lKcVJBODJEdmR0QVJwanE5cG4xZEVz - Qm52eXAweElnUHkwR3orYktYNFdnczJWUjNGaWV6RGQxdk93WFVnRTdKWHVjTGpR - R3UvT05IdlpqN3Y3WFluTyt2VTNOYkZjQnZ2TTBQY3hnL05VdzF6NkJJbXp3YTl1 - S2dabGFMb0lTdzl0UTdnck92QmdYS0VYb0trN0poRHhsWEVpZlpFM0lNVVp6T2xZ - eWNrNFQ1WVRSZ2lTQUFwbk0rUUFtMlJjOWNMVTBqMmY1YXM2c2Y5eTE0a1BuTFRX - L0U5TjN5UGVpTWFubDludk1Fb3E3eE85aTNOUU5KMVcyWGsxeFJCaXBIWkZJbjEr - ZldhNGd2cnBkN1RHZDJvcVUwSytGOFBnKzZjMWZXakRsR05PSDdwZWdEMGNYdXNT - NzduSXV5UnFIWVVHS0pGdzBFNm40ZFZzcHhVNHRSWGp1L29FSm52RFZISnN4U3VW - RkhkVmNTZ1lNM0RRRU5BVUc3eXRZcWFQTGg3b1d5ZkhrVHJjOUVTUFdGN0xGS1Zs - d3ZyamRnYlFDWnFrTnhzTzFDRkRPY3IzOFJzZzd5UkpZR3RBS050REhldE1zN2l6 - MzBvLzdOUzhrWXgzdS9EUnpXTWo0M3dpanJjNkdUTUFteWpucUdnQ2VhTmhTN3BT - alhmcWtvTnlvZEFBU21LQTNZZDJCbnRqNkdRSGZXS1h1NHIxcmZEYndaQWRGa0NH - Z3FOZW9rUTI2MGNBbFRlekpBTUExM1JNSmhjNkZHdkJXSTdkYW93cXBVQm5xbUxC - RmZLU3ZyY0l1MWtzMTd6UGhyK1BFV0lTaFptS1o0T3p0YW9rY3AyNjFSamloME50 - Njk5a2N6ellxZDVCbXJ3Ymt3dElrS0lFS3dDZkt2RFpmRWFSQkEyQUtlTlJVMHdt - QzZkUjRveWZsMWlKa3I0akZ1WGJoSHRhc1ZPWWJ0ODgwa0hCUmx3aXZUUU1YbmhR - S3FpaDVlNTUwUDhhdEJoczJxQjNHa2dXcWljQUwwdnBkR0pmVG14RUwxU3gxT21a - Vnlsc1FINVNVdStJODA0UEZ1bzlieU9aQnhBczUwQ3J5UDZWT0xIRmRoaDVuVjRh - NTZoeTFtQnpsZm1aaCtNR0dIbzQwVC9LaXp6VGlmTXR2RjYrby80b3hhYjZ2MXgr - R2oyRzA5aTZBSnlRRTNuOFczckovQjdCRjRqU1NFenVta0hSbTZ4Q1YwdW1QS3dq - Y1B4UVVWcjFnZXozMGl4UXAzdWhvL3RDZEI2OWUvZ3RkNnd3ZTF5QkRmUllpc2Nx - WHlYWXZSTTRzRDZIZEJzYWhJZDBtaThUbzY1VUx4UFFURG9Ccm44aU5PaERReFRY - eGI3cXZFeUdOYzhiOXNLMVFhWU1vV1B0TUtZaDZoMlhRS01HSHFMZFBrd3ZmOGRO - aHFiSWoyWXkwT2syZDRCZEd4M1lNTUJRSUNxcXRtbzU5WFRVS3I0RDZ1WjhZNUxR - OEhybU5JNG1DbDFXMXhGYXYxL3VHbXdERG5yczZ0MlZBOUc3dzNOTWRNYkJWV3ky - cFZwdkpIYWx6STFOSmVCbElRZDlyZUtEejJ5cmVYRUhmeU53NkFwRW53NEZZR05P - QjBYbUE0QVBKTXR2VDZvQmFyRHNLZUQrODVyaHlmZUx6VkNkc3R0QVpwc09Vdwo4 - emoyeVAyZTR4SERPVVY5b0o1anM1VWVwaERoYkVJMDlONjJTcTZvS1ZFCi0tLSBF - RGFsWkZCcVBFeU5pemtqL1JlTkk5aGJQQkt4UXROWVRDNzdUU0Q2ZFlnCjRenXFF - 9TJ09wGA0itDALc/RqQ/OKMi/JB637LPIupVJ/2y0QLg8WIKiZPQWXifQfrjoPOJ - wIIZ7MYMkmfAlTE= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGlnRlhUZE9s + blprNU03QldwRitRRUNyeHRvek5BRlhRdU0xTm81elhxOXVJVEhSMWE1QktteXl0 + RkR4NUJKbkFuZk5SRlNVWW91WGRsWkk0TDhPNVBCeWx4T2VpN3h2Si9PWXVsUmV1 + c3dMOXVQRml3WkRDWm1vSDJSVEsyZmFqNHhHSEdDMmpPYVBob2VJVDFhUFo1WWt3 + bjJpcVVEeUZaZ2tLcDVqT0k0SjZhODRKMWt3bmhod0lGU1pBSEp5ZC9zYjNXdE1C + a1JVYjhHanczUUh0MFBvWFRtUmh3MEpvTVR3TEhKUHllWDhSOTZkdG9EMUVqYTd0 + cE8ydUhwZG5MMFlKaTdvT0VKWXFoMG9JOUJUWW5jTk9ueDdWZ1BxZ3ltRHl3RGVo + Y0pTUkVKLzFyRDU5T3RGK3dHSTBjSmRnQlM5WDVneDh0cEVxandraHlJZHhBTTFz + aGZXSkF1aEZTTWhSeHI4Vkd3Y0pCWXE5QUFtaE5zaUQycUxpV0ZHcW5jK25LVCs2 + TllMeXFqcXNGcHhyMDZnSGRHdXM0bGxPTnF0NXpVODZEMkJUVHZMS0hmREVCL3FD + LzVIN3ZvckxKWFpGQk9lYlR0OTNJL0VBMDRJa0VJTTNmY1lFTzhEa2d6S1RlL05u + UjhNcXI2ZHNNNHoxelFTZjJyazNxbThqOFNVN2RZL0h6TFBnSzVuazA2bTc1eDVT + U3hFV0ZZOGdqaDBWZkd5b21XWGdqUHVBRzBmTk9tREo5OVB1NHhTR0tZUWFxYU5V + c2N3UGF5REZFRG9BZWZyRFFiNDQ3TDJQbHQzN1E5WWNRbERyYThFYWVWeFptWUZ1 + Y2Q0dGVTbElyM2lxT1JsTjNXSVJyS3FoMnptdlpoZ2Jnb04wMmRJdFVMUHQ0cUhm + Y1JSMy9VYmsvTWxodi9ZZGhTZHpnd0V3SG1kYlVaUjYzY05TL3N2NUFuZHNhOG9L + Z0xyWXRUbnM5Mlg3YVFacTV3YzdhejVSZEFkVGNNSGVvaXlvcWRja3prMXhTWEIz + bEtuMEEyT21YWlBLY3piZ0NubTgvd0dXMk1YWDF2L09sVy9Yb3ZpeHFiMmJtNHRw + dU9KYmZNeTZtdytickR4RmN3OVJpdHpObXEwanVhMEt0VWVnMDZCbi9DV0tENFFR + YUpJMFpyRW1GL2xNSzVyTkVGVUIwc3BLV1c1T3BBanp4K2ZDekJuMFBXZFFUMUps + TFQ4RXJRWVNvNWFHOXVyaW5aVGdVdWJGd0w5ZEFWWU9PemY3VFNTT1E0eUlWUVk4 + b3lWL21VTFppUVM5ak9iYjBVVWxJOFJITTBSLzBWNDR3WkwxUWxwRzRNZnVocmZa + d1RZU0dIQzBsUS8yL2JrcW9OeTAxcFhtZUFwdU0xOVRwemZDcmlsbUNGakkvdXBM + NlA1a3c5bnBiMXV5TGZQSCtnd09MWUVZM0V1THdaU2NyK0x6MVMvekpZQTdTSjJG + TFhzU25sSnBlRWRLcjFJamR6MmRMeE5pWEk3MmlaaDNxbStFMzFWNkpxcXZuZjlu + bU0zbHhrOE81SktYNVVnTmt0dzNZL3dmNXVXUXNROVRXUVBaTjNrN1c4SUEraUFn + TCtSNFVQV0VwRHAxTFpnb3psNERNekpmVWdIWXJFRktINmV6OGJReHg0bGJ6eUhk + ekFxdUhPL2lzUHpsV0gxM0E4RmZpU2dWQVlSdTRpWVpyOEtwZFFUNytrbkVpZCsy + U1g1MmdqTWxDU291SWk5ZDB2bm0vcVdJZm5mM3VCY09xT2ErKzc2eTJpSmY0MGxa + UUNrWEp3SUVUb1M3cEhRaEErcG4xbVp0WVVTY1Jta3YxZ2lVQnRQRENHUzJPQnRO + MFhFSUFjSERrTndNSlhtVHRaKzRGOHJZU2o0SWtpSVJVYk5hOFBmcnQzVGc0eXI1 + Sm5UM2NKNk11b2lVTExXM0xXYm5EY1hHc0hyY0FzRmJEWFBIVVYvNE9LOWFEdwpB + dEx5NVlwVEhDTVluRzkwS1JWUzA4UzdRSXhrOTlkYlYrTHdOWjBTUFljCi0tLSBJ + UzBLbUVnQUhLNndvbC9ZM0JpV21tclc2V2ZzdjFiTzM5VTNYSU1TWUtVCiaP3Vy1 + TT7Qot3ENFxuBS2bQwTToyZyhHiDS9nO6BSpcJKV13y7nuGRGtw+MjJl1lrmJA2f + 6UibLfXRO8aaBdU= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFo0Y2pETGl5 + MjhjNXhTK0xXNXdCaFQ2VkhheU9TMEZmMW9aVk9YenhpWWY1N1FGcjRtOWtidGs1 + by9VM2dhN1B3eWV1VHdEUDJoUURlR0hQRzN6TVFOSWc1Rk1xeUxkVFVPdTU1YUV0 + QzNCTSs1VGlUUmM4ZUtmUDlXZ0pYT244L2VhTEUrUWpFNVR4V241S09zTGpPdkFD + UWlQOHArLzNxa05YeXNMcXJFYVVpRTBKQU8xcnBDeXZCcVBMOE53TWl5MllyaGw4 + ejhHTm1KN0pQZWlxM0VZTEtEc1A3ak9FR3Njd05KUWd3OG5Ga05UNVo0eU4yWmhY + SldqMXlvQWxIRDVxakgvK0pyM2V5cXJsazJHSmh5R1VabTZjcDJ2VzZSKzVHVFhV + NER2eFFUZUN2U1ZQclZtZis5Ym9meWdSZTFiRFN0eWFQMzA5bnVOM1VscFUzUnpQ + MENJa3dLZVVCTFFXanlBM2l4TVFDdzFrMHZuZjZFdjlHbkxRTnhNbDkrajhSZlNQ + VXhPSlJRa25IczQ1ZnAzTmxlbU16bFRrQzE0a3pKbmhBZ2g1Z3JIc2g0QmFCL21J + NmlDNTZDbjdCV2h6a2hmMVk4bFFyK1dUVXJQRkpYd0RmczZYYmgvaDc4TWI5Z3dE + T1Z4eEk4ZURnVDdLT0dZdzIxMUhwTzJtNUZvUHd0eEk4eUxXNzVlWmlFQkpNeVB6 + TFRkM0VwLzZLOVFQR3pVU2hock9tOHNlcXcrckxXaVUxTENXRVpWaWNzTDFOTkpk + SUxzWVJodm5MWTJxakxsNU9odGhuSzJvMmZTSThuOXNTclBWVjkrdGdkWDllK2xE + d2trSHV4TitZd1FmM1U0QkxVMDZ6Z3RZSk9rM3ZxdlAxeHl6bG0zN2kvRFppRysv + UXZwMmVBd1d1QWRRRE1Ia2VLYXp5WncyN1NMNUdjWnhpd3FFSnRBOHUwS25oRUNm + S1FMY0xmWEJPMkZ4YzhvSTVaejJhRkErZG9YY0ExZGw5aWFWcHU4K0plNCtGMXls + dUZMd1JaTDVkMWtCdUNsTEJoVjVoZ1dRZXhTbE82N1JvLzRaRmY0YksxOVIxZDZC + ZG5kNEowMG9oODMzVUdFbTRoTkpjVjNJMGxMRG5GSEJGck56bmIvZUIzQktpa2ha + ODkrM0owZW9KWnIwUFltY1RzdVJ0b2RsdDFVRVdneFVMbzJHdnZOdjkxTFBTN0p1 + OEU4b0NFMUJ1YzNjc1VoS2ZheUhIeTZZVjNQRjFBVXA0L2JSRWgxSS9vTHVBSGIw + NmUvYWhTc3ROUFhKdjFIeUxSV0k3Mk5SZXZaZjg4ZjJ6ZFJySGNReC9uRUp4R01H + RUd2M0NQTGsvOXM1L1lvMUlQWnJMU1lqdkhHWUNTTFIzeFNCM0YwaVNDWndsRjh5 + RnZUbnRvZ09BUEw0dVRKMloxb2NsaEptVHFOL1JmZ3FaOWRWRnRyQS9WL2JGMHVC + UkJLUjBLdUF2cENQVVhGbnM1WjVSbWdhWm54T01uekdCQi9oTWlmRFk2TmNvZUZl + WDl0WTRQQitoZHpRWVRFRHkwdm9pNEhwNHRpdzh4bkp2N2YyM3JwanpmZ1ZxS0pT + V0FIRVFvcVhHaU55TWN5bkt1S2VGNElJRldnV2xFQnFsK1lYSExVTHltQkRZT3Av + Zk9qek1tMmYrT3pFMnBxTjcxOGlXUGdET09NcnA5T0hjODV0SmtrMXhNYzFmV1Ez + RjI1U2ozZzJpLzdGZlBFL1Jlb2l0d0R3Y3ltNThkOXgyNzMrUVFKUTBYMlpsaUE3 + Syt1R1J4NjBCYmRvWlUyK1B0T3ljUjBUbkZZb1FEZUN4ZlJRbmF6bmNLWFR0a1Zy + NDlQMUZTbWJ1WUtMdytzU1hJblc0ckJDcG5SOTRkTjloMGNUNlRlM202ZllDdmlt + aURnZzBudFBjbzVJVkZvanphQmdPUVpNcCt3RUpWVzdqZjJKcXk0bHdFdmhBQQp6 + V2NERTJjQkpUWEU4TG9aWHZFNHFPak5uYTJhZmIza2RqOWNuaU9JdFkwCi0tLSA0 + U0VTMXNuaEVSUEJLQWEvRE1Gc29CWFpCY2IyWGtoMjlNNjJaOG9TbGdrCsdn0asP + PwGtAHR2CSovRlV1DnFCfupdyFtemCI3AbPOrjD0Q+MG5+1q5SNPkJkZfJfDKBWc + JeKYDCJSct6MLq8= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1f7nk5g0hcvy522fpgnp48gxt63cpyh24cua9jc3hwjdu4qvlpr4udymsgqh6498max2w867tect39gl62ru8kws2gshupfeg4gzggz8fw85cqrnqe2llyxt3ke5gtlprfpm44suu9f9mesu2rffhlcfyecvurdylvk6petyc7p549q832u9nknznujthesy0ypdherhz9jpsc4gyngewrx4udlzkrv35re42xwtlqdtzm4yydxynqncjk3lyzu64yevahcsvcvnew4rrgmtnssxnvkry6ydtvwdsws7ch3d9zgc2egcvwjc50snxulcxx6vuq0yskapv84upus9hpdn9kl98j24zvuqazwttw4e8qe3jp2vpsfpu88pl6vjxv3krmzqzkvctevcv7xe4psz7tas8p0588kh58j8zfpqq2u6k92m4y9ugcd6hgsz9ja4zr7eadln94n6n3548jt0s2vshjd94pp6ct7ls3peecgmkh3gltzcdlq9ceytv8se8yhv7vrqsx5fdexn65samrayd5qs5xd9cwsyt7ea2nvsmp4tjx44q6guesu9qam4un6l5dx5y5dr2fy9r9dccp35ry64305ckkkcecz6rw3z6zl468smspl0hcgsykw47ef33euykywkpq68psnkfkwennu3cwjcyupv2fgrvd2d6n35emgn6w0eqk08psd25qr8asuv7sxuyr5w26ajqjmhccv6f0d42dqsr4ecutcuzxxnzcax5hgtwk54xsvnnexx4phtzhshgxxhyx9pvknzjtjm43z4d89mle0pug63j9g44ez3npqc3td0cuygpecqdpncfzfqzrnykt388p9l4nkj5cfazmp9qtd0gfxl07qjnswmk684u77zq2jpxsn6j546gf7ql9q5k37mv0sn25aqngs0mgzpu4jy5c8heqqf55u0kg67907gxu5u4f8cjtztqqh5evlqh99t0jlvtccj54kc0vxu32adpfzesp3zjy8kzg7var3ku03e08kk8r7zeeptp2p83cwhsmxvvfzmg9jppg5ae9xhukfens0pl6sr450q3pg4rpj74f088wsj9eegv2umv858329ypgjdr54v50lyne0t8xddqrczg3n9vgzkw6tzn9s2tmvsxha8legfpk79lcf9yepf8ln5h54lcn2qg6jmqhkff6un930suw5zgx67l7670ljkg4pxrgfxnpum8xmmc7wk4eegpytqvkp0jh8enhs9hap9nker8efshsr4txe4tttrh5paz9y3h89rjxwl8k5tysal7n0yzau33w2fvr4u8cr05vtrct09thgj2hn6qjqeh5ek80y49cmqyca6pryjnqdxj43njctqsgpk0ndahqd5qc3t3jxssj7g2rdul3jvk5tgsmfpe8dz0pjualv5kgwgwl7pfvfu9pvcx2wkt6e7xe4eu025jksj5tdafcewcqhz7w6sy55fhx4a4ec7hz9yh3x230vaz0fvuxdzvvvm5ze349gsv2qkrj534pqk6ffy6wtwjawrztjnxl84sf2l5k73ptgjmefwgmzmyxxdteeqeyesl38ykm3pnsey6xd2c0pzsngcx2283vtzttj79jht5gl43qxrlh2s3efdd4wqjwkq5dv9n83ptzvefsvlyp5nvkyzndvu8ywcg5jp6cyhl9ygtjz42layjyzylkuxefwfcmqmejvmxqm4keklrnvx8nd6k7yp8mxxprljcde2s5xz79duyte3kckvgp0fuqlsnx8ty7vnk5pz4m9mk33rtz3ujryxkvsur72egqexvse22nlgukklaus67kcm4n0uty0dj3pxtyl7fuz2x7yr3zw6vp6pvy6r0fwjlqzdkxc0rug39uw2fyr0gx8a964ef5dplp49mqlpqq4e0appfzrumnuawfy5mdlqd lastmodified: "2026-08-01T16:26:01Z" mac: ENC[AES256_GCM,data:Tm7egPDqjEG0Sre8h7U88O+4T8UT1y+QXPGtpUACkanVgwcn0KwWPZyXFINZBmlkYh9262x8+WgSwu4XuC7vPcM+36Q4ouJma8/SZKt1EuLrYxGBUdZKuc0P8687nmvKccnVcN9GD29aTa8MxwSOrQx7j3TpqGpT/c8JxQp2n48=,iv:zVo540/GpTpntjn/S21vRVhXIRmZ2jru02IAzw327zQ=,tag:+c2BqM4RwfYERsJiYeCs7w==,type:str] pgp: - - created_at: "2026-08-01T09:05:12Z" + - created_at: "2026-08-06T01:47:47Z" enc: |- -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxAQ/9F+sgo+TZb10Lz98FICxYHt6K766bgccpnF2dKr0M7fWV - z7x0Q2aQRRf97nJiXvlXxBgxYLWUy0qQd7r7/otTvnjuSg05H0RrIY+j0uLNJWv8 - mIku2cpGEXbgSdNFtNvBd41J6aLhTJXaV0dW1YV59UX8nCaVuNS5bU6jrKqMJ7uH - 70TikpVzZtuduz+LlhDqg0MknD/Rsc5RnHdRu+QM/AEL8o3J7rQCM/bJReDRxHx9 - k7c7SZsQzflpi/qsQmJG4HyeTxcBBK2IOWNf8CKsjf5DPOzbDdzbC7tV5SLKBM82 - +y8GpLcoMGj3FTpaj2rhT63ECrpXVYS3AWH01YwaqFKJE0PrZXLopqxfD9Zf4K1q - RE4l0H6ukUXFsT1xu0aolL3K5agONtAfviKc+oQZog6TJ5Mi2HiSf6rqM0dy7KTD - Y6zHwWL78E/DPbD2HNPEX3cRtPRZH0QuZoPJsgxoaLCTV1+U5IqiYgW0ijC5u0LI - ZoMQ9/vzXwWud2Hj7LM+tDpSd+mUB24mGc8QXr1tZ2GUMnk8WkNdReOXXVWJq6fW - jXFFIdeuaeZcesHrLBf8OyEqwVM3yICbN9OnBhZOiwtlPOrs45boznCIPadeYmxn - qcTX4pDeq6E9NYK+M2NQpdLtT8eoUySsEB7Yql6CPLCYs4kLwqZUi2VWEPJnf6LS - XgFaiyi8AljK5xeFMpIPUVNA7Pkzg58fzGXFEmGsGAMN2+G5r8H5sqeBStu9Luj5 - vll/0aYHetRBR4Z/V0PQy8V07JmkTpPjiyD45J2hCJyRilhfxgjCQ2egerHFgPA= - =wmRX + hQIMA9/PFHehMxwxAQ/+NrVVWX0pI29jZmR7B6Fs9++jqpNxfFJsltMxrX+9fUUL + PyaPJow8PwJxIrT0trY0FvrLQDjapnZguWPT/AG6qwJnCNGppIjepfz817QjWlPc + 8TByw6Ly/gBT55Bo+H4Y71KewXtzXDsv67H7TfFaqFwtBVN9541S6Rwcw6E1f062 + 9zD2RvwV2xmjWYBtGSHlJWAlayFuC/KdqCyO4TE7KL3g2uNW0Ac1E8BKtOiC5jbm + zfIKeMfWTxnLQpg2XLY5srOVns028KHFDG4BxFXOMo4IUflh64RaLB4ftUE4bNYP + HVdQ4fkKEXutLaSkGZwNiVUwDxklHqXo0YkOdDstPK5JBxUBTiH9Tgbw0t4OnUDI + DXHCl6sW9BElVsy5Vjx9PyO9ShFfVntJSmyHnvX6hbCB1hs+2j2PGMlQXztKdYRl + BFrnIP5SsQ6D7vbyK4u1M0bcp7vCcyHpSVqKepV/iL0GlAPwuzY4ToImA3mpWFw2 + 8fqvjo0SDQX3Uj5aJrwo2sWdCxnfEQu35rgZM9Jw+/3pEObRpljOJB2Oqw3HQO+1 + T0Sh2TK/0+9iH3UN68Z1kxJUaWgGZYV1VCUoKmPiVyyJ9jmZEz5+XyXYJHUQ5SEm + 8LuLKWFbR7yb2rbHF0DitLbBTf/21vMPtKmApKi/Qrxk67jyfAqXsdZ4ARsGx7XS + XgGye+hz5sIKyvH1hNkW9wxGM4iFEyLeEmiI2bLUCjfTTM7qxTy2W3Ll2BDiDrE/ + SQYyGB+TFctUvHn0hkSPysyes9ny262X3wnYpjksPLiHeokbfFhwkrpkhxPpkEY= + =Xts3 -----END PGP MESSAGE----- fp: "0x416CF1EF9AAF90BC" unencrypted_suffix: _unencrypted diff --git a/secrets/users/rtucek.yaml b/secrets/users/rtucek.yaml index d898b83..d033e8d 100644 --- a/secrets/users/rtucek.yaml +++ b/secrets/users/rtucek.yaml @@ -6,145 +6,185 @@ sops: age: - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFkzTXNQVDF5 - eVZaMjJhVWVGNkJpbkNOZFp1OXNXNFZSSkwrcGlHay9PdG93LzdLaUs2NmNaUDNy - SlVUS0JqWmh0SnpTYkJWVk1LdHU3ZE9mZEVYa2MyNnN5Vlg3clFpeHpsLzQ0Q0xP - Y3lJMzdYVG5QS0lvaldZeFRIcThrUmxMaTV1TkpManhzY05EZmlnWngyb2VsSlhQ - TU5rNnBWK08wVlYzcWE2UWZST0xDTVJiZmpBN1pPMVYwVHJWaFREbDBCVHpDbDNs - OUFYcENtaFF5WGFSWFVMUU5ub3FYYVBJdFE2clljZWVpYm1uOHV0MHVTbjRVT2FB - eWZ2NnB3Zm1YcE4yQWt3YTE0UW8yeUUwTE9MSEI1OVhOY2tSU0V5b2JPQmhIYUxK - WHh6cTB1NnRKYk45MExuN3R3amU5YWptZ2s2T1ZuWG1TMUUvdEZTVkJoczljcno2 - Slg5TXE4MkM4RTc1L3pXQlVsbmtKMWxQVXRPS1hFbVZVV0svcXlYMXhCMUZVMU5u - eSt4QWxQenozU2dBb2lMcGJCSlBFMElvam9uVDR3dzZ4NWdtWWErd21NMlVERkRV - WS9aK3RCbDZZYlg1bmt3bStDL3Zxbk5iVVBJZ3o3cHNoaU1ucGluUjc0UHUxUnFk - VTh2eEg1ZGgvV2hCVC9yQnN2UittWVJjWi9yazlmVHNDUFlNWnRoOE0zcjBkUHdz - WjV3cEx3TDdhRjlQbEIzS3V0K2pQSVdRa0NUc3R4OCs5WmlaNHhoNG9RREY5cHAy - QktFb3lFL3I5bG1YTmwwaW5CL0lLaHJhejYrb2xhWmQ1MjFDYUtNcDc4aXBjSnIw - SkZhbWN4UlBvRkV6Wk9GQTYvUm5HR0ZQdDNjVEJmTTJNeHZQQ0Q2eFFMV0txUW5p - Z25BblVjTzJuMGpvWnJiTytrYi9FVm9PK1JsdWpab1k2ZDIraHpsb3N6VXVoeTk2 - Nk5pMmtGYjZCd250RjJaUVVCa0pZTlJkVDhUZEV4QU9MVkw3N2dEQ3BFMDJyc0tu - ZGh1amhud090Y3JCbmN6Vjh6aHlWMUk0RHUyR3VZWUJJc0RkY2hnYUpuaDF0Wktt - SWdmYVM2Vi9WY0lMU0s1Q0gwUGgvZDl1eEJqZWxaMFExUkVadHBlbGFxdzgwU3Nm - bHkvKzAvMVpZcjQwRlBUZ0R1cWxuTTJUSUd5dStidTNRNXQ5ejlQYm5XY2UzQUVh - Yks5aVBsZ0dxWWFsK3JFRTY3TGdRcUhXb2JEemxua3lMRnpQYS9LZDVvQUlsV1h1 - ZndvT2xFeFUwZkhEVG9jSEJZZy9Gb2gxVDJIc2ZpdDBXNmZuWjN2blRrRi9maG85 - ZG9yc0VzSGdSR2U0MmRlb0d2U1lpOG9NZ2pzbEg5QWJYRHpwY2w1M0w0UGZtNEdJ - bDM2SU9tQ05PZ1JpMnBsOWsxYlV3YmZkc3grcGVvU0pORkNJU3g2dm5LV3ZXRVNZ - S2gzLzB0VzdDMVRrYmpqZjRwTHpFYTNnaDR6OU5tUDlIdDlDYVd4cysvMGtoSXhx - cHhheHk5b2paV2N4ZkxkUVJ6MXE0eTJNWlJLQzFFMFJpZW9wcGRvcVByZ0VZdUVK - c1FES3pPcHZZRHppbnZrZ21rbVBkb1FiWXk2UnI5cnJPNU1Dc0JvU0F4ZW5Ybjk3 - V3M1KzFTd2RndHVKYk1kQ3V0Tm9jbXcydkVNVjF6UVJlTmdycmxnQWdHWkluOFBX - RnRWcXhzdXN5QVkyQ3pIQkdVNGlwMWMrMXNiREFXNkJNQllrQUFlanFIUDh4Q1Y0 - ZlA0N2lMRy9yVjdBbnphVDR5OEppMkdWM2F1UE1PcVFLeE9aVUJiN0R0NDBNY25L - WnVvcEpNKyt4czRkUW9YWHYzTE5QQm9sS0ZmdWlkL3B4WlJFQ1JJcnVaYkpXZVJx - enlTTStpWjBtY0hyUXV6ZXRybmpWRlZBMWlpUU8wZDY4bGdMRXZIN3F3UkhJdwpl - QnQzU1NFRUFLaktNOXNHa0E3VjNiQ2s0S0E5Vy80am5ncG0rODhVUlpFCi0tLSBs - dWhweHRKL3ZSbnFkVFlRRjdNYi8wQTBNZy9vNjhUYzc0TUR3Qm5pWGtJCgrVmRFq - l7q96wfm5Hs05imwlYsOODk0OGxa4u9q8LPEGynvcwwLekNY8FZR2HP3kSZxM+K3 - fbGTG8j/kFYzmUo= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IDFmMksyVUsz + Ujl2YWZ2aW4vd0h6MjdZR1JrckVUMjY4VWFSRjdYZ2FxMEF3OU1HSndWS1YrVlM3 + VW9USjhmcWx0cVQxTExMMnN6Z3lDVk0yMWtsOTFVVTFlZWk5LzZCbExYREpQYXRH + Q0JoYllDMnNEcVNYb21TY1o4cms3L3NCNE9NYjF2MHR3bGsrWTM0VExuWTVBTzhW + blBodzE2VTlQOXhXVXpGU294SnFtS1lYZTFabStvZE1tWTFFNSs5M0lEcVUzQ2lr + bnVhRG5mNkU1YlhDeXRKRmIwTVc1MnZDNFRsVWMzRXdMMGMwSEVYMzNqK01LTlls + dFk5bmhKZG9yWitTK1ZoUjdlbk5nZGUwY1VDOGxnT2p5Z2VuTXgzRitHWWlVNXFZ + Zk9XenFTRVVQcllPaFFEdnpvVTVjSlRKTkY0S0tCdGdtcjRPY3M1N3gzc2t0MGF6 + VkN4eEx3Q2gxamNyWHpabk5uYWVvUUpONHhLTW0yN3JoSGFzai9CbmFpd3Vqb2ZS + eXNOK1hDNmVBL0JzZ0E3K2R6VU1uYnBWVEJtYWtPTVFRVjhmWVk5UzV3cDJ0SzBv + bi93ZXpob1BkNzA2c0Uyb29TcnRlalBmVU85a1hUSnowV2d1RHlSZ2xmanNha3cw + N0xBNXlZMlE5Mlg5ZE5VNWkxZU1LZks4a21XNFp1aWlwMHZWYWZoZnVudkFUY2Zx + dnI0d0sybWRyYzRtWm5lY0ZoMnRtSktZdzN4bEdPVTdGMmhvNm10ZnRWVVNuZ1lB + MmVTZGFnLzhhZzl4bCtIYjJiWVVwVFBYUHRudEx4a2dXMnZoR1ZjeG0wTjF0U0Rl + VzNVSkhySmU4eG9wSmlNOFhRdFB0aGFEcFBwSzB3eE5JZndIdW5Zd3VkMEUzaVND + TUVMT3Q0aFBEOGhreEhDb0FydHAyL2JVODhncmxKcXFuUHUrQVM2REpmY0FtZnZZ + RXNZQTNSaGorN2o3djVWVVk1ZHNvQ1d1ZUVDejVwcVpzMUZrQmw1V2J0RTh6dGpN + RTFjcEdmKzJkSWN4a2ZkVk9zeitEaWZUMEVBSFp0N1Z2QzM4c1FxSlQrN2JCOTk3 + T2ZmbFFQa04xbzk1RzkvMWVYaUIyelBTMW1vZUo3OFJCaTJWT0lxVkZSKzFFN0hq + RW1ZcXNpdHRFdTVzcTZKakxvYzhVSlYxVytpb3N2YmgzZHpTOFFLOTRZUXhRMTJ2 + UUozNmN2SXZVb3hRbXRQdHY2YlBFVWFiK0labEF1YzlOblc0c0Z5N3RHQXpGUVZx + K3E2Rk8zbklZZlZpQ0dGUU9Ddm14NmVSejB1WUtzbmNkQzBwdjRkL0UwSnVXN3dX + Wkd6QkhOMDgwTFV2UDBaVVpNVDV2SnNZNnE3VTZOc1RLWDNtcjJqbU1rT0FuTCtW + T3FwM0VEV0U5YkZISUJ0UndBRnpmQ0ZNSUF0Ri92NDdRQ09ieEgwYy9MYW4raDQw + czkybldqemM0UWo2bGNtKytOVUJoVnNxMDlWKzhKK1RDcExZaFNpcXluaGl6Y0JH + L1RkWnQ5TERTLzhUb0R6ZUN5VTMzcExlZkhqNDk0MWU3Ujg3R29odTJGazh0UWtx + bUd4dVdjOG9MTTNRQjhGQ3N1bVIvSkhGN2VhSFgxK3AvK21GUE1vTExPY3B0UUlB + c0p1T2Z2VXkzcUFQbWg1UUN1L3VkajMvT2lwZmsvY0E5Q0t3V1FxQ3RtVXI3b3Yy + bG56TlpvM1pMNFRWbkZ5alVtZkVLUTM3YjBSMUU4MzdLQW4xQ2FkbFNUWk9scDVC + YUdEVFFxYzVHQ1dIRTI1TytkWFFZaHhGYzBETkdERlFJR254T2EyZnBvUVl1S2E1 + eVZHNHdhTW1qa3ZLc0d6cFkyV1pFYkxRSkdQcUFyanVZY015dW9QRmEwYVc1clhF + a0pjTy9ocWpPSnN5ZXdLb2tEMGN6bEpRK2FUdHd1Y2tNb0QyZExMQ3lFWUFQQQpE + S2k4eDJ2bytDd1YyUjRCK2dpSDh6UklldGJRbFlFcm8xWnNLczVyckVBCi0tLSBY + UlFSSmRSNGJaSFhKdEdWcDUrVkIvek5mNnllajNKdzBkR1BiS0NaeEdZCuK+hkLe + aVXixZSpDlkNDxrDeCHUeS+ssz6496DhpDYPOIub00ggdeQufxslD6OEqxpZkcuX + G+lMYCSmwK+MTcM= -----END AGE ENCRYPTED FILE----- recipient: age1pq10dd9wceuvcn50w9nqec5fws670qz7eqhfw7teyptqfp02c6k05pjhrp6kgtfwyx4rv6gry4uwpanqvknsvn2x26zf8p9d2ccelq24uncr0hqev9yjm8wdeypgfspdn9vt0ulvx6jcsy293j2y7chsmse3wfd8qeg99fwnup9psuqewrzpwfdv0kcfjlu2skxx8nxcykxwaz2dny825e3wxphmn5c0vtxp4tjetzw8f98sxgfmv720sk94ezpg5fzw2a5k2eszvnpjqrcpw2ck5zxwuyprd598gaqezkj5jy0ry7eqx4su5rtxdemkphhwjppe0fsp3t7p3vezf3pzuhq3n3etxkcggsy62u94ufeclrchdswkl6gwp5ce65aevnu04aqxrsm0deuf8pgfaqxk3ys43ex2wz625a06s7kfcc8tagp8zk6c9cpqu7jg7sxtjf6faq4e8extucyxjjq42a92ancn8ae5gdgr2ea4wuqg2eurs662ufux35nhkutjqm7kxlglafwu92vefqn8lvn9gwm6jvcvtpvs6nngj7zf43fd0k3pqs8dzvvf0fc7ea3v3ct5q6zt0ptdkdpjnv2t9jcnh2vhxv3t9uk6rzjw5zqtraxp52w3345edj0fzugwdfqcd8jge75yufv6u47wz22qhqzucch2wkgj8lk266ep7e6mwvfv6efcgf4jy35kpmhm6fzwcdsxxlup5q2zxzdpg67xjslp9f6t96khpxepp50jgss4d2edermg68xkff8wahg72ayaats9dz5rukqphkahguf5hyq0dwtz6s90jlh0l3ajql7pfy64zkz6ftuu6u2578wnpmpkwta0es47d3sve9neqa89w708j4afc2raxdf2gaucl70jn7e039axgmzk069ha4p923rf3lwugys0v56tgfu79x5pcuw2zespxely7tyyhg9z4upquxynwpzcj7atq57yazfu74tv6cun0c265am8zahls5x6y5t4f4zpdgmggtst5cefyatmqehted0gw5sawprpdf6gg9nf4c84xmk575auu0mn35j2rgy8wdkhykkrdxtjah88gr2cmrr9ra8edw9fs6v3pzkh49rtk24qhh2505c4d2zrw8ashyedtapnmeyndpy8f8szlz5tc7w0jyxm69s9ysaq5cgkfst4ude8z3phshy5yk5f3yakuxkgv7gyp2hwgl3kl223wzhv40ukmpajyass46zrgtfxr8sr3gax24d3edekg3sf52vklktkgkx3wgctvu6l9xzr098zc5gvsf50xqw8dp3y96rx5nkswt6uw7glxpyyj9hzxkqhylnry7h79hlrualwsr6qh0nx8mc5q2mmv8sc3nx9ggnek8jc0x9qaq426ssf9y35qr6jf4fk40xex45hvx72zpr3g92j2yczrd4qnwvf9flp9ekg0nsp7ru5z7c0fzqz2uwsvjlly6zmqaq5awgt9lclp0rply9jy9tcgfsqchncxuarqfc4zzf3jrpg9dvxgvhyqsl034lv732d0rc44032w7gt3c8kpnypaj6f2gpf5qzyrjy9d26h326gzv8gy6glqrrhunfxk54gjw6ktrhy4fp8ez3jz8wv89z798dz6q2upgkuyf3hgpf42wgs427ufmvetpqc9v6p032yllpcnrrkxc5qrfj9spttawd5hf4gxg2xk67hwcy6g3u5rlqslth3yu8x25ah966nq7v339ytf33avuuxaer6yrhfdpft42cj5a8apcrw0z5ksgmn0qcgeq3p3wmqecnucswe7rga66rde9ax7wtldwzqa85m3mqj8vwspehqfdy8gn4nke4knf2zr9cjpx37jawu2p5gzzejqe26mgzjh90nv9mf2h3x6g8h6tzumyktdscdu5azuzmf9mvxv2n9aky - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IElTVXQ3ODBP - WmQxVHpXSHlpWHNoU1RpWGppNml3dzBJYWphaG5jQ05oRUhHMmViOE5Da0paQ05y - eWdVRENQU2pxVlFFZWFPc2RvdUlXVXVpVHhRRXZWbzNQOUlnNlVDZmF3SVo0Q2dq - dnhySWJMa3liNkxONm5NNEw5ZEtQYmcyckFocWRVSzJZMThuSTFCL0NmTFlQeXJQ - VnI3ZndFdFFFZlhKSGpQSEkyVE81ei9yQkxUQUtxMFZsL1BjQUJVQ1I0YllDclha - a0VtaHN0eWtDUTRsU2FMUE1jU3luZERub1lHK3ViQU15V1RicjM0dFRqVzVHY0lY - YkxycStxVXJIeGl6NGFZbWxlUTI0SVBUdzcxVlVpS3dvQStPcHRNc09qNTdMWG1E - YkRxQlpSQ2NrdDI2aHZ1RzFXMC9MdURMS0pPVm0xWFErVW8rTldQeHZRYVVIQzdC - cktzckpqYkRyZXRTQjVrMEVmTkRCV2VTaXhEWkF4d2Z0SDV4YUEzYTZRVzA1Uk5l - QlVuNk5pS21rVjVWanV6eGw0ZkRRMmp1QkV5dzNHYmd2aWRiYU03bFNtZWhvMzdL - eFJyYm04UnY0NjZzNGJvbk5IekhHZlhNaVI0VFljbTJndzhwdTdVNHo4emQ0TXFk - M3VHK2JsbjM3SU9wTjlIb1N0Wm5RYW9SYUtnL3ZZdklXdFlmWXVjTWVxa1c1bWYv - dmRDMm5nR3ZGRXNhYTJDbldZbzY4ZnFzbmxka0Ivc3crNGFlNzNhUUYvYVpnUHBS - MDRvVEdrSTlFd3lNYTFSN1VBb3dZYkk2b1B1cTVoNGZDa01wbTVKYlVrOXZLTndw - MWp3L2pGU003ME5ieXR0WmJXd05WMCtCQlN0RElhR3RaSElHbjBwbVFGL0QzRmFI - UHRWbk1xUkc2emlaOWQ4MDk3bThuYTZMNzBGck1QaFQweHpTQVBlU0N1ajNWalZu - QWtJQWl0bVNnc2hEOVNLT1hPb1NqQnozN0xiZHhVSVI5bDVkQUJUSDkvUkh4d2c3 - Sy9WU05SRFNNUXlaQ2NkWmYwVFVhT2d5bGpBVUNOMmtLNXNBdjNwa0o5aXY0UEtX - N1RFUjJQVVQ4aitXRTVnVzdxMkI5WjE2SkRWVVJ1bkcxRlJ2c1A5R0lvVUNxREp0 - bnlxVWJMWndFZjNTYk45Ri9oMnJPemJXM2h1d2swa3R4QkVPeWJvZHFjTGVTcTdX - YjRQRTg3bGltKzVuTnUvdEZ1QzZRWFd2S3BLMS9SdVZrUEhZWWkzbXBMditTYUcw - WmE1ZVgwOE96ZEx6cCt2ZzBjdGozUUhob01PVjltcXNhRG1EcnNha3FHbHpCcWN0 - UG9BYXk0cmpGTmdJN3hlakhOeWNsWXh6eXpTdU43WTdhbWFlbDRKbm9JSnZXb3VI - eS9tSmx4cklIYllYUWx1anJCd1hjUmxmQ2wwdC96SmZnZ1BOVDhFSnFOYWNIZmxm - UC9uQTQ3ejVLT0lmREk1Qzk2UTczTTZyL1NYdTRIMWtJSjIrVTlXbE9VTWpjTjlG - TXM4T3J0RkJqdEF4elUzSGFBRWhsb0VacXRMVkxqeHpMTU9kbGsybS9WbGVGRFRF - aHM4aWU5VVE2WnFlZ0Jxc05oVHQ2MHYxNndVWGwyODVISkpLSzhmRVNvQjRUQ0gx - TTZEMUpUT0poV1JORG1vUnhRNXNvS2xabzFKckJMWnN2d1NjcWtrWHJtRlN6dStq - R2ZJVy9jYks1YXVKSFArZXR3RkNSRnpLbFJHTktMaFF4dTNmc2tGcTNKUFZNQTVy - dDAwdm96TGtGYW53MEJHSllldzEwR0ozbHVJbHJqVEVHZW50Z2c3NlFjYWovYUxi - M3FRSDJZZURYWlZUSTlidDcyRzhwWFFIN0VkSWt4NUFQZ0M5UDdUY0w4U1poNHZD - bHJaQm40YUhMZndMd3I5SUwvZ0ZZYzlFenIweXlyNmpnanFFZDZHU0p3MVJXZwpH - Q3VrZWh5SVNqNHFEY1VQL2IzbEdEQWVwa2lMc0J5QXlvalVaN0pIRmU4Ci0tLSBE - OVdUWmVsNmJIbDg1VVQ5YlJxL3RrQWpQcStsK3MxMjRNZStodFZONjJJCkl8cErH - RleZiYKXsYozA9R0mdy7mMVYLAsHBtLnh+pAfbmi9B30eMvCu8YpRd1ZMgoVEK6F - G8+gRR0Pv6XvRmE= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5ICtlU2V3TjJW + RjJVemZFdmlsbG1EaVdBMzJRQkFRTTY0NWo0MExjWDZ3U1ljZlpVRkRrM0NGbmQy + dktRd25RenpQSmRlQ2ZrbkdOb29qWmVEbEkyRHVyYmFEdHdyUEw4WVgyT2xIT2I4 + cGZJZnJleXZiNjVEWjJkUlVYVUZCMEs0bi9JS1JwUm1ZSjdyS080WXEvems3YnVP + aE9oUmRCR0pXYlo0aXdzT3IrK05jYlJZSGxRaGk5OVNoUFN6T1VZWjdsaFF5TlBy + Sk9tOFBwRWpjTiszWUw5K0V1VmgzYVBhQzdyQmhFaWNhNTdkWUFycnJ3VFlvd0hm + ekpsL3E2TUNHR2Z4TXZUSmtqV25pWUVvRU81Y2VoY1hXQ0ttczUyU1EwWlhYREt6 + YzNsN2wvT0pEQkgzSzdyWEdPeVErd3FZTHh0U0RaMXBaZFowMWpwVXBXK1V0WXRZ + LzhzeG92M2dQbERUd3loK2tzYVFXeXB3K1kzNE9xZ2Faa3FBSU9vZUNuT1YyOVl3 + Mi9BeFpaUWFNL0d6Y21TRUpWanhJSHd3Z08xRldseXd1QXYwaHI0MXJlRitIMjBk + MnpyM01XMEltMm50a0Z1c3Vvdko0SitjUmQ3WEhaMERvYXpYWG9iWUhveXZhenVJ + ZGgxY0FEYi9ZcXgraXprWEJ3OG9SNW5SUGJzSTc3UWtqQm93dU8rOHJSUE90WllR + UVE2aUFoSkF5SzE3MXozNndzVU5UUDFoSmNncW5IcTFGczB6U251ajNQQlBoM0tN + QTM3Q0dFMzU1MktSeVZjc052QnhIM2NraDc0dVlib09zZHVZK3ZGc1k3UVZRZVNV + UXNGQlJFY1RWSkZuNXQzUTZVVTVReWxVZkNWNGhQeDMvT2J2S2g4TmVJbTI2SXlJ + OFIvdmlTazFGeXdoUFlGTE1xd2JpVmp2TUxVVnlhUmZ5NlgwemtMSFpTOFRNOURD + NHY1UlZMbzA2VHVkOExrRDROdzZBUmRSWkJ1dTVNK3ltOGVuR1Q5ZGVJTWdWcC95 + dlZwUWpLeTVhZ2U0U0pTOTg2ZW5FSDkyaGJMdTFnaHJHNEp0S2RhWWJIenpscEVG + L1NpclQxNmRCVG94U1dXL3pqV1dWcG9wVitLaTRkZnVyUDFyb28wRXVCNnZEY2JO + eUpVYWZudEJVYlBJWWV0cGJMbHU0UFBSM0V5c0tuSlgxcmZzVVdFOEl0V2t4U1lB + TTF1NEpERml2SmlETVRXWFRwRUpzOURWVG5qclRSMlExRFhINWtVTW45MUllajlh + Nlorc3lVamVmYk5lYTZ0QkpETEliV1ZXRmdoc2NOb3I3cVJPdFhLNm02WlJEbGlp + OStPTHQyTmZRcFRYMVRHdWNheTgyTlJ1QU9BNjY1QkIxUHpnOTBmay9TMURQNHFK + V1VrRDhSSUpXQXRyWG1xc3pobHFlTlA2MnY1eWd5N0tFbVVmamxTMUVHTUp3MTdu + UkhwbVMxb1hnTysrM3NjdklCc1ZuSm5xa1UycG51VkhTbnFRa2d3U1d0Rlp4U0hV + Q0ROc0hJcmI4aVk3TzRTU2YvUk83dHlGWXdPK2JEZzNaQnpabklTT0NPWS9zemRh + cjRpZ2Nyc3kxV0lhQ1lXeHp3MzFKbmhZeDdlTm82dE4zaFRqZ3Q4Z0FHUktLZVlp + aWVndWU0RFdKNTQ2SUd5ZXpaMDIwQ0tjRUhaMWZyZ0FhNW5VTVR1alpxRFNOMXlS + Q3V5a1BoRjI3TVhaY0k4b1V2TmlDY2FXZE9TdXdFSHZQRWhGUmhvVGx2ZFRibkRT + WTNUZWU0eFQ0V3dnME9ySDNEZSs0NUxDNjJ0NTJTRnBJejlORlUyZ2tNN1ZTcGh2 + M1VnWm5OSWlUM1YvbHJvbzBadkduZjVUT0IxNGRBNG1KYms1N2g5VEtQSXNBaWxk + RGdudjBGVCs0dXVLYnRtK2RFZmVJZ0wzU3dUb2NYL2JWRm81eUZpZW1tSHlCdwpB + SGc2NHkzMktFQU92MG4xdUwrdVlVOU9kMnFxTTJnUVFmR3JFdE9sbkRvCi0tLSAv + bktTdGdqL1hORjRLa0NMcXlCbXVMcnFqY3Z1akpGeWRFWFAwczNBSmF3CvBPdifc + z5mH6IWeRGXxTOrNOiqZSNW5JgHSwi6OyuUy+NDs/jxEAy+ocS0ld9mRtTBvT5Qm + dJL+PWAgAFNxros= -----END AGE ENCRYPTED FILE----- recipient: age1pq1jce6zr3zyl5y5jlp2w438cg5vyer9gvnq30dznskqj235v5l8lkr4lfprf5pjcvr4gvlumz7nmgk3qsmz5z2000k65858v9k692kvr5cypkxcj0ufzyfa8yee9cqzedketlh5sxv6g04xqdtqdjcsrls4u2hqnfekvpsu4cu5mtvmkpx86rfkc2527sfe5v37rmnt4ckjgpxg4xzcu9tqsc556dn8lt9e0ctgh82c509g2a2q0f2szmvsymnfv0kmghczsndm52esjffn94hz309jf7mu9fwueav2gg3p7yennkdmwx0xpmppj7v9ddz9gsxzug4k277l2uy2yqxa6ymdejy2cdl5cdjudrstt2tv8l8ptgayzm6hwhw4amx5wj4nhfvzn6uzrv7udqcu6m3s8dkgy2z8mjts0wl6zkyq5srvyqr6a39x2e3s7jnn38r3ed9u4r2pj89pa9hkhflxqsejfzptag2g0mesvgjj8n82aeeq258wajt6rvtdh02gx0mjyz747rs65f9y733n75ppzce5vcz4x4g2jsg0znxjk8szerdfj6rjspjcsg5yktz4ll529pevj4yej2esz4qs8n6tuv4hqpj6p75s7c3cpd3n45c5vhr9drnpypqwh9c3mz58uh3prfhsavyax0zvzkqatf4a3tmvpq43va39v5prypzf5gcjr7pdadqg6m47y0fd4q7xn5s9s768tmcc743qg6w3aflynn8zfmygwsgjd7kz9mrhun2cukf2js8f90f29fcqws56mq5zspjtdee2ymdvtc29znard6cw3w9rfr5c8r5xl58gva79kfae0ykh3z5pvmkefswrdaqgk6k4j2usn5v9zn2kxf2xuz22sessueq0hjkdqn7w3pxmqkqsq4v30vynnushjr55hg95rzzzjq3pxt699e2w3ej3s4qm25vx62ezwckrrghshwj4xxzzf68afaw56tqhnq6rvhrcpq0qcdvvft4j0u934tsksyzzckkkpv9dv347xk2c02mqtycht3l5wewvjw9k7tv8qpx2z57g38s0pvtrgjck3qntah5q08vq2vn3wfk4q5edg445kmkezuw3fplp9ptdv989dn803fpdv7xpd92mdtynjaf9zf4vc6sv30qfyh6vgekyckphf2usctew9wtv8qhysn5ywscps4mq73cgk4tgpywljnkrvyud7u5vskjcl7fg809gzz2y6arhz3p4ywkd5y5d8223fkucqdhxyu29uqy022lwz4rnz5tqupjz4cf8a03htuawscan8p7avrsvn6r0h06kz6usuw0xe3t5cf32e7xgn4ety64txxrp2w0lg2lzg65t3nfzmfydnq0efuhkcas8dwrhrs29pdjd9dg644uhdtfpkvyejyqrvfzjfmefswnfws3dcm6325fcfzeyd7mvezg4ppun6czfuqxnhyavtjdy6azuxj5dvd806mgt5uwxwyhjph8x5w2k3ztzk05f00vgw0lcd3z72gdhhgccfag8c9yskf4tftnnqdx62393vfvk40mzha6rsqxygsel23sgj9zyz75j6shqarc009eyfq4mfxm3twnyuwqvg5ls7qsa4jtm4tx8fhg2ugnq20dva9dzznkaeat826akqcdcpx7ldvj2ngmwykqtrm2gtp8k267q343jgu6w7e3cc70jj9cwf8aa7nagkc6v7v2w3mc9dslwaxy0frysrzkklsvw88azl7j3d5pwzee5fp934cqkkrjnwmaw6zd5fz2kemq7tgtzuvzrnsa5ea0ugmq30m8amzvfv902x4r32wm6e6cpek4wvc6082m4v0pz56qmfzqf6qcsp9scc3khnk602ftd6qg073jcf2wtstznepssrggll92p2dzzev0mcw8tdxxx6lp5y079useywlk - enc: | -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGd2TS9LbzNq - RUREUEpDNTdRYnBlMWhSWmREWUxiTDdmV0c3V2RLSk9SZExFUERycXZFYm9FVFFP - a3ZjZmNxUjRMUmQxalBiZWNIT3VPWWN1QllkSjZFMmpoQnFDenFsaXlVcUxHa3lL - V2tranN0WHZFSzVGTEhmWU1ZSU54NGNiVjZVR0V4dEIyRVFYdUhLQ1lmakMvdzJ6 - dEZSUHhUNzZnQ3NTMkxJS1J1am9KWjZiMXhaNWRRWEJXQ3I3S3BVQU5qN3V3aXJK - SGdyMXdRcDJNbnRJRENhbExZRDFkOFhBazNNakpFUGdaeWwrR0hUZzMrUHJERlBE - amlsUUY0RlRrMUpOdThIYXZBaUV3OTlXMHp6MFJPYjdxblhrZW13Z1hiMHJQQXU5 - aG0wOXMweTFnZ29KV0ZmT24yVFIvcFZGcnQ1VnNIb1p6a1Mza0pJbHVITkNtamZW - Vmx6NUxsK3AvZ2RoRkliaGJaWUE1RjlqZ29wanFmZldiZmt6UzFPRmpSV2JZSFI4 - c0FPUnNoTm9FbDBCZjNnY2VCRXhTeHZxblpNOVhnS3BZNE1CWHdtVHF6QTJIczVt - VzFQWjhmeFhKMHpMMjZTdnRpdnVCcStvWDZnYUdpYVRibTlmbDh6QTNJZnZLTk5v - OTlCdm04VWQ0ZWZUTzhjYnBGZ0F3bGsvR1AxY2w5emNsb0VQNkMxOGJ5RjNQQWpl - WFRwYUgyYkpQYWVGWUFqbmM3Z3dzbS91QlBya0JBMEV4U2lqSjJKWVhwdVhzUGlB - NDFZVm95OVYwcVlXZXltYmMrSFdLcENGVmRUVVZCWitGc05nM3IyRVlxd3ZXUTQx - YVdKSzhOdU01dEhCQ0psdGdhb0lMRGV4Z3dTSTRCeDhVZHR2SFJ3UVViS1VOeTlJ - dGVjMGdkdEJ5ZVFqd0JJdnRxcnlOOFY0clg2NTJEMXlxdDgrZCt2QWxjNU56RzRt - QkNsSzBjV3o1N2R6TStuVTJxZ2hsU0xWYjZBVHcrZmdLeXlPcnZYYVc5NWhFRlZP - Q2IzSjJjTzIzSlBwL1F3V0NjRlJMNFZqNVZ4cXI3czhobXc5K0xwOVlUNFcrWjY1 - SmxIU2Ivck0rSjhlV2ZOZWxzTlh0YXJaVktXUUhRaHczeVNUM2VPemU4dXVRVnZK - TWMxOGIvZU4yRXdaL2NSRFd4SWU3RGhJZGl4Ti9kbXNvR3hUWnBGT1ltcHR0NGlh - MXVNV2FqZHFENmZSS203Vm5VeTkzbEljS1dMelh4SVhvR0w3MmlOM3dkek1CTVRW - ZW1yNFVUZzhwekpKamR1UGMvM1dmUitPbGpMTFpmN3U2OWhwWmV2ZXM1RklZYlVF - OUYyVU9HVHlnK2RrT002TE1JeHN5R0hTeXJrSjJqSkRoMERxUzdsRmsyTWxRNnd2 - YnZPa1VBeGpoWTRUUVFKaXFRZ3h6QnNnaHJOWnJuQkd6N0xnMUh2ZlZMU1FsS1Iz - bFZUYVdXc3FTQVFONXF0S1NHZ3hncG00VWFrVCs3andnNVdWaUNwRUZUTTFmWEdp - bHhiZkVRNDBIWk0zT0YyQ0RHTjl5ek9qVUNjQXlUY0NZeW5PZUdoM0xzVnpxcHB0 - QVBhRlV4aWE4dmhNbHRaeVZDbm9EMUhObjN0MEI1VFdMdFNLUHdwckNyZGNZWGwr - OG9vNTZPcG5RZE4zMGQ2dXRvUTFZd3BFV0RRZW5wYmRXMXFjWU5SY0pEOTlHV2JP - ZCt6ZkdReHNmZDBBV1VLc290UmdrWmIzUkVJUnNsL0xvSjJtOHd1UmRUTmphYTlk - UkY2SGpnRi9oVDdRT1ZubEgyZGRxVTlVUjJFSGFBRUlFQ2NnVFV5ZGg0VzlJZVdZ - MCtNaGlLU1RUdlFvbUdwZHBqN09mTloyZFlSd25SQWY2T0grZk4rdG9VMGplekFl - R2YwZU1SdUpSSHYydk14Y25nRy9DaGZhemJ1MVk4MlNRcXN0SEZFM2ZDV1phZwpx - R2dqSXpkelpHeldUNmt1YjBGUmhCT25Gc3ZrczQ2NW84bDhUaDFuTFgwCi0tLSBE - THVGcTQ5dldvR1lMQXhmZHNZWTlMcnhaNFJNSUJUZUQwVmJ5S1ZHUjM0CudRMYEV - i4sx/18d2HJ1f6Lhf8tGPhw8YUXglZkIbEOBCoW8pSBbKzLBFr8XTg7kZceyCY72 - EClHlujjz7QFetg= + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IFZ5c3ZqUUx4 + QjNnclVyczRhYnhiYUpqWFdBdnNnL2RrY0d6RFJKS2V2RTBaK1dyOFpYK3lBczUz + cnYyUzBxekhWS3N4d3dXYnEyVE9NNVFsd1dWRkxlSXFCbFdUcHQxUlFiWDE4ZG1u + aktrVkU5bUxXam93VDlwTnhpNE1Ga1FUcVR4N25GaHF0bkJRdis5Y0EzbUdCV1BX + a1dvOFVmU2ZXUkhWaXlWMDdsdzByY2wwQm10cXZqNmtMNUU1ZmNyYnY2SXNJM1Rl + eEtKVjNTQ0NKb1UvY3lmK0hyeExLOFA5bXpTN0hCbzFiQXlhaHNIcGdZcmdLK3g2 + QS9lRFMxRy9TTHU1RE5HajdWdTJmOHZTMVQ2TW80bEZ6b1haYWlXZHM4cTcveity + NHlRVGQ0OC9xL2ZMaXMrS2dsNE1DYVRRKzJjaFpEdENwMncwbXpjdS9jNWxWK0FI + TWM0VGc3Z3pFNUlXRHUvNFFidmVMdXppRGhQQ3dHTytVTk1Rc1dFeFpwWUJ5SkE1 + MzVyTXFxdGlVUS9yL0FNMGkra004QUVjN05Fdmw3cDZsbWt2NW1ONlM5Y01lNkRB + bWpraFlWUG43Ym1wc1hYdCtqSW5scENsTzUvT29pWThaZVEzR0NXMFBrelc4aGlH + bDY4b0J1MzRHQXVydTJEMXRoUWxXeEpQeHJoS1dMQjE3cnJ3SUdFVklrcnBMeUtD + ODBiZkg2dDE3WlNKUlpnWHZlSFVnendWdHVFcFpBSktqTE1rbnZETmpIMVI4ODJL + OWxFODBycDdBQjhDU3dCdGZsTVNTc2ZqMHlmLyt2c0dJTnFJM3U3azd4SkpCdko3 + WFRFZVBlNFM4VVE1b1BZRHk2RVhBOGxNOG5RN0lkaVV5VnFmTVU0cTBjV1h3Ym1Q + WGxaeXN1eHNhb0dnVzM0WGRjTmhKK09SdVJKRWpqTTRrQnRkY01DeHBrcGZnMm1r + c0phcU1rL1orUzFRdlNvS3ZDSEdCa3FrTmN4Ymc1dXJGa0dJWWpxYXhjZUFQblJY + NXYvWjVlZ2h6Vm9sOUxxSzZoWUNHWSt3cjBSMGpDZkx2VUQxMDB5aElrRWpiazFJ + WmFMVkdxSGV4azFJRjJ6TVRFYWNDa2VadWU4OE1wWldyQzE2K3laT2t1NzEzVmtE + cEZsdStGcVBFR2l3NGtOTFpDQm1UQStwU0FUVm9Pbjd6SHIvQlREL3pIWE5FRTJL + bGh0SUdGL0crZS9DQVVvR0VGQVhqNzJ6T2piclMrWEZQNW1ITnowN1Z3QUFoUXFF + Nlp2WjNPNFBST3RrS0UwOFlTZktndFVOMURXUnYxdEhYTmJ4UWF5eVFGTGdRVWxY + SWgrbnlIbjJpL2NyaWkzUzJqTDExOTZGbU8yZzEvVHdKNnppRXdVTSs3VFJPc1Jq + T2VhT2ZwNUJlVVNGV2IveldGYkZteTFwZVNrbldjZFNFVm1aN2ljS3JtZllOY1ds + RHBWUmZwckY4NUMwanRxbklCWVBGV3hERzJrS0h0aXViczBGQWNiREdUMlJua0Zi + Um1WQ3B6QmI3ZlNpcVdsbVh3a21yWHo4NDFsY1lyako2NDE0Vm5CWTZqcXQ0V1lU + SVJLV2dwTDdvVzR4aVpRL3R0YmtEWCtwR0NsWDlMM2ZieE9OeW1EVzZiM3NXY1pZ + d1k5ZTZheVYxOVlyWXJyL29vNEFYNVoxMmlXTXhTbUFBOFliblVZK1NtVmtKWWt4 + Tm8zem5pYjFXeWMvMWQ1MHVaaUluQWZwcmxia3E5MHRrZ2g4dW51T3l4N2FMdzZy + N3I2TzAwajBYL1g1a3Z1Y2F1eVpDVlRLejZ5S052TzA5bFJ4RjQ4UTg4d1FSYU9V + dHpzNndOTmhZNEtybVJUSkZpaHgwTTNmelY0S29sblA1dmVSYm44Z2o3aThqSlA5 + dmdsYkhaQkd3aEVRMXp3dTR3WjBDQ3dqMXVoSmtVUG5VeVF2a0M4VWlxK1ZWQQpE + RDBDeVVORjJ5bUNObnNnWkJrVVhLQlBBb2l0U3luYXkyczhKck54ZmVJCi0tLSBS + cGVqcDlNWUJtb0RtTGRUZVpDNi9WU29zd3piSm5WQkl1QzBTT2s0bnVJCnXwLD/D + b15W6iZAhvk/6rPaYMNZp3fjuuxW7gI+kAINvpdyUV6FZ8vLIfXU8XBk/+zz5Epw + JMs65AzOBdw6Q0U= -----END AGE ENCRYPTED FILE----- recipient: age1pq1u84h9snf0ajqjnlt2gnjwnqh8f66kzp2w5apc5g9cv8xr7vdg3qrn08mwqngwdddxahy8sss8ad2f53jca98kynak5kmwppwulwphhzjhfg4dyuaexje0dfqanuh28ep5w864xv476ukg0yg4fp8anysh6s259554wlrzs4dguf4jvgr95845t2a5yf24k5vhxvj93v4pjencd83jgxgkce6umpn7srvdljl5a0zdg8cj99p32e2ml399xrzktyv0faesjvxdhf5tmsgfg7lyg4d895n02q6vkn500cydqane9wc4srhpcz3anmkd9msycfzyztwgzap7p3079pgz7hx8yw8clxunjnm6jujzufjkyac98wxkf49z5pnxd3zl7krd9ftjerftd956j9yj3xw449jsgpyjk7pt2nj8yaunscl4kn5thl9ht30vsyznvgv2qk05c26zhzs42tg2g4d2n9707t8kz5creczwyffgkayy9q9yp2w92tkkqw4n2kyw6at2krapnr7vuq9nsxc0k2ajt68y4xqmfax5p2kl6u8rggpxwy2xk6l3tqjv7dsx7qtk22p2wgnvghclxd4aucpcr95plge0xemy7v4cznpq5sxgjvevmney2jzx8zpwwjjcwmgu5sufs0rq70ssfndqgftufuremlfwg7ww8ngug7aawzm6nfrn7jtn2074n5ay4gtusndfw7qpjk4g5s25d05s9qdvhqgka2tv0ts3wymsph6cnypxd47gkjxlgycys4atre67wr64suw2egjmqgfjt06zzw8h9km2crr75qjfxar30utkr6yqyej5g3rmn9pekd4rvzrvek5sae54stmh9nmmhmr86qsf23ynv06mf6z0q336yq5vhtmfn6x7edqx4a7nxty45gu8xzuhx0w4vmxntzd8edgv5ykfa54zpywzyufsgfqtwptjgpmvdar804ywckx7ajkd2zua6gv0xklexknnq29ska48mdeaaajh30zjvnw9y5s78qclv64dlcve0v6cj8myp5t46puttasmwq8cxnfdnmfwpjxacf8r32rs3rmfgql99mx5605xfdph02vqux8rkday0v73j8zfuqcz4d44x7r3un9zs8jj4phw9zz2ezewfs5zmlqk5ypz7wtvveapc2z90zm2n8t4ng0ss3m9pc4pzaqfr0ckeg520d8wfkrh27q8cjettdv8qsq38z7wjz0zq3hg268859htj9usz00qvqe2wd22ldshx35ph7lvjsy33lws7ylr2ppv53cdtc2vsyj7zqzrxuy6dsj8lc84qvghr78t9j0yxfqygettxkzh2qn2praq6gt0zcrl8qspvsm2c70rv3awfh2h2dmmcxxc0vv0sl75hltxs6gw6xrj0d84lxr4qx08g4rufcguztlya42278h0ddfwfjc0n99mwze5992cg8ffvt85s9w2prj83n96edzf2wnx7kk0gsmu4uw0znu82tjr8xht907cmz0mz46pjtud7pqtr8u2563yw92j4emmwn3y05y9s4s4mmpp295hdcymkqq6aygz9a3jxawhf0t5jan9yagfnnfyl8rt288gxs76eezafnsr2d3627vgpej5at9pw0udqmuc2ezpg8s0xnvkgw23wrdxemu9ks4n6cms38sj5y9aj3u6empgjthmvqzxju9sz3w3xrxsvefdkv8sdgptf7ahxuh0qp7tdz0rgafdz6ewttcz0secsfxzpu6agyqav6shlaydg7hljhh43mtd3xf8dwfkk63y9jkt3q3794arq6uzz569k2uh3fnqfcc28g2nyswyfus9fsfr6q3tkfewepj05acdg3u42qvnpl88cs6t3cd53n2hqtn4cd0d32ntwvzn97wde33cx6lsq0k0kyk23x834upfq44rsxa + - enc: | + -----BEGIN AGE ENCRYPTED FILE----- + YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IG1sa2VtNzY4eDI1NTE5IGhsQm9RU1RZ + RU12K2lzZndLT1pRVTVBUDBCckFGNi9abVNLZTdhaTNzOTJNTW9jb0gvRHkzWEFT + RUxZZURTdGdTVUFvNXMxMTBHUmdEWnlWWldXMlNUaS9CVEJZYUw4M1grYkQ3NUww + aTdCeFBTb2hhdUJOd294ajMvcWViSjlVUFZ0cU1IVUlIaVVobWFaSzZFQmptTXhB + WG9RRHliTXpjNFVLbWxnZWw3a0NtTFVqc3c2UnZsc1JNUW0xUkdQTnBwL2lsc0RO + VjQ0ckhRWk1DT1I3MEw5U0Z5aDBUZ2E0enRUVFlUUm9zTHpPQlJidTdSK3FIVHFL + WnhGakl1VnVUQmtScUhtb1IxMVl0akhNMzUvcTcrR3ZKcGc5eWt1UlZjWGxPUGRK + K1VFcEEwc1dUYUEwRk1KZUhwVzk1bXV4SzhEcHBEcUdCYTJEaEZQcGJjUklyYmVI + YTlGWE5FNis3NEJmanJXK3U5cCtOcFhJN3RJSWIva3FyTDdiTEgwMHZ0RXJUUTVE + TUEzVUw4WGU3U3RJSWRyWFRwTjBBT2RGYnNKUzFWNG9sL3J5QzAzRGNOS2hRWnUw + VEtKSmcxbWdRV2J0KzduOWpUZVZIZGpSNkttNmlLZE5MK1ExQjFKTTNlQmNkMUEy + R3FJdE5zSENhVmhublJ2SDF2dXZMRXJBQXd2Y3VPWVprbXBSQm1DN1pBd2NoV3Js + OHV1YnloVkdHYkxFNUlEc0huNVNGcDZjLzBmMnNlak1LOVlwV2RMajQreXpTdmh6 + YlNoY21qNm5CYnBEbnpGcSt4cERJRXRwdHhiN1RaM1lCK2FTbnlPeGVvZlpFNlpl + VmFqd0gvTzRhcWFtQlhFMXJCTnpiY0NCaTRtOGhMc0ltOGpGWWFhNWpRVUQ1SmVJ + NnpzMUtaSjd3L2phWTVIS3grYVI3RFRBOGhVc09tSEwxS08xNTllVkFIeHpEaDg1 + SFRZQTJNWWdzWGZCSUt0R3JWclUxY1Mrd2dxOXBGT09pZk43MzFPRFlPZEQzdFc2 + VDFqSnZwQ2tiQ2hma0xlYm01dDZ5d2ZZV2tMSmVzQjBrZ1hHdGhaWjMvR2p4RHp1 + WXBvZnRPV2k0cjUvYTlxQzNlTVlldFhTQWFjNXN0OGlvRWxkZ2NSekYzQXBRMlU4 + bmFMWC9oNnN0L0pYRXJEMVlxdm50eCtEN3ZLT1JlUUV4aWFmY0wwVWNRMTZlemxk + dWF6NEVidXVPVlNSZG5hanJVY1ZYcXkweThleEdoNTMyMEk2WlhVMHhyT3ljVFBs + OXJMRGxWK3ZucWxmeEwzVDRjd0xobzExNnRuT1VSMGRtQjljYU9ZbERYZ2dkcEM0 + SlNEb1hqcUhzUWFNNXMvSkM4aCs1dE1KR0pBQXMwVmxZSUhBOTl2M25zMXBiTzJZ + SUx6TGoycGF3cyt2VkU4ai9VR0lZZDRTbmJXelF2Tmc1dzJiL1Q1cCtmWkl4cjZv + b3I4eEFla2M2bGNyeFNlNEhXK1BFQ05BSkZOYitLL1NrN1RIaTQvSDRzaVhTUzk4 + dkUxc0Y1YVljdVBLc0RrOHFMOUdqdnpZbG9yOTcvSWpiUks5ZWZmeW9JUnZ4RXp3 + elFPbitjRGoxUVhUVWpCdWdWTFBxQVVuUDh1VEpDYkpzZC9qaklHUVlHRU1oU2VN + MklPMlFZOVBwMDBZcEo4YnFESGhqcCtaejVGczIrWTMwTlh5T3FqV1N1WFZZbnF5 + VXZ1eUVUU2NockZxdE5kOExrUXB2N0xzS2JMSi9mVWdUQVg4Rk1TdFdwYi9EWG45 + NEVXMzUrWFgvUXdCa3krb3E4aUxzNDd1bmkySFdvbiszMmFyY0RCQnBmanMyRnk5 + cWorQ0FhbTQ4cFpiTzR4d0tQcFlqQklraU9LVkp6L0NoZzdBbFhPV0lEUFlEWU1w + cTZHSTFQL2ZhdHNVaW9TSTM1MWVVOUFSNTUvZTBLL3JJTmRWT0tRRDczSXFWZwpE + UzlPdmFHd2krSm54NEFlN2hOWXJsZ3lMUTUrMlVRdzdwUjNaQ3Z3WEpjCi0tLSBF + QVVYSTQ4Q2hXODNSdTFJVjFHazA0L01qWjY4L0d2Vlp3WEJFcllNR24wCouB12io + wAgJJabQB8F+RsAUe91tY5ndUOWbhUPr/bmc9dqIeozQOm/f/QpEKUqsoMUjNjbs + NtMolTp+DwERNbo= + -----END AGE ENCRYPTED FILE----- + recipient: age1pq1f7nk5g0hcvy522fpgnp48gxt63cpyh24cua9jc3hwjdu4qvlpr4udymsgqh6498max2w867tect39gl62ru8kws2gshupfeg4gzggz8fw85cqrnqe2llyxt3ke5gtlprfpm44suu9f9mesu2rffhlcfyecvurdylvk6petyc7p549q832u9nknznujthesy0ypdherhz9jpsc4gyngewrx4udlzkrv35re42xwtlqdtzm4yydxynqncjk3lyzu64yevahcsvcvnew4rrgmtnssxnvkry6ydtvwdsws7ch3d9zgc2egcvwjc50snxulcxx6vuq0yskapv84upus9hpdn9kl98j24zvuqazwttw4e8qe3jp2vpsfpu88pl6vjxv3krmzqzkvctevcv7xe4psz7tas8p0588kh58j8zfpqq2u6k92m4y9ugcd6hgsz9ja4zr7eadln94n6n3548jt0s2vshjd94pp6ct7ls3peecgmkh3gltzcdlq9ceytv8se8yhv7vrqsx5fdexn65samrayd5qs5xd9cwsyt7ea2nvsmp4tjx44q6guesu9qam4un6l5dx5y5dr2fy9r9dccp35ry64305ckkkcecz6rw3z6zl468smspl0hcgsykw47ef33euykywkpq68psnkfkwennu3cwjcyupv2fgrvd2d6n35emgn6w0eqk08psd25qr8asuv7sxuyr5w26ajqjmhccv6f0d42dqsr4ecutcuzxxnzcax5hgtwk54xsvnnexx4phtzhshgxxhyx9pvknzjtjm43z4d89mle0pug63j9g44ez3npqc3td0cuygpecqdpncfzfqzrnykt388p9l4nkj5cfazmp9qtd0gfxl07qjnswmk684u77zq2jpxsn6j546gf7ql9q5k37mv0sn25aqngs0mgzpu4jy5c8heqqf55u0kg67907gxu5u4f8cjtztqqh5evlqh99t0jlvtccj54kc0vxu32adpfzesp3zjy8kzg7var3ku03e08kk8r7zeeptp2p83cwhsmxvvfzmg9jppg5ae9xhukfens0pl6sr450q3pg4rpj74f088wsj9eegv2umv858329ypgjdr54v50lyne0t8xddqrczg3n9vgzkw6tzn9s2tmvsxha8legfpk79lcf9yepf8ln5h54lcn2qg6jmqhkff6un930suw5zgx67l7670ljkg4pxrgfxnpum8xmmc7wk4eegpytqvkp0jh8enhs9hap9nker8efshsr4txe4tttrh5paz9y3h89rjxwl8k5tysal7n0yzau33w2fvr4u8cr05vtrct09thgj2hn6qjqeh5ek80y49cmqyca6pryjnqdxj43njctqsgpk0ndahqd5qc3t3jxssj7g2rdul3jvk5tgsmfpe8dz0pjualv5kgwgwl7pfvfu9pvcx2wkt6e7xe4eu025jksj5tdafcewcqhz7w6sy55fhx4a4ec7hz9yh3x230vaz0fvuxdzvvvm5ze349gsv2qkrj534pqk6ffy6wtwjawrztjnxl84sf2l5k73ptgjmefwgmzmyxxdteeqeyesl38ykm3pnsey6xd2c0pzsngcx2283vtzttj79jht5gl43qxrlh2s3efdd4wqjwkq5dv9n83ptzvefsvlyp5nvkyzndvu8ywcg5jp6cyhl9ygtjz42layjyzylkuxefwfcmqmejvmxqm4keklrnvx8nd6k7yp8mxxprljcde2s5xz79duyte3kckvgp0fuqlsnx8ty7vnk5pz4m9mk33rtz3ujryxkvsur72egqexvse22nlgukklaus67kcm4n0uty0dj3pxtyl7fuz2x7yr3zw6vp6pvy6r0fwjlqzdkxc0rug39uw2fyr0gx8a964ef5dplp49mqlpqq4e0appfzrumnuawfy5mdlqd lastmodified: "2026-07-28T22:30:57Z" mac: ENC[AES256_GCM,data:/vtQqVdSTwbwnUwi8LqhhHjxi3DiC/V/5id0HJ177GB8woL1qict4h1KlrJYGEKkZx3KBJxAsYjtipVGSaB1dXar7s7r7Wd1dEX9yfdHYWbHwshFH2L110UObiisrYEksWp2UYbh1cxEZP8K9sYXURcpKIrODTF9yk+dh3IEaNk=,iv:50qJdS3xxIcP0pUyBr67FteGR42KwOWliLQnXRvNLmo=,tag:nZ/P9l5b2Y9bWPycjU7GjA==,type:str] pgp: - - created_at: "2026-07-27T21:01:06Z" + - created_at: "2026-08-06T01:47:55Z" enc: |- -----BEGIN PGP MESSAGE----- - hQIMA9/PFHehMxwxARAAtk7qngzvzTsUXQAbKXrJ2b7Xf8fmoBqQR4YJqyRAdFAe - 1rWgwpiJWvRgS5o3/rlb863wIIjnB9CgU8NOOHjoehV3IZSKRtk6262GLO+GFrxn - Erl5HEG1OkOIgYHfu/PVy8fEblCLBVHdXK9rTFBqnjIUgtzDdszawsakH6cRgZLO - YMZMcfGZZqcwnk6H1Rq9tGkLOQSHXqScIjMGgg/6fK2Th98oozDK5r/qWK7HNXJp - kguI5y4ZoT84aTDHodO+qkLxtenoN282XsypGpwY/t66AiCALAJvI/GbvYlBOWCz - 5EjpTAqv5uw8SgCV0RRX/sPf5Gq0KAaLMQb4YjpqLnxxSZtMjSHnG1FffIrbsIC0 - 8FhxxtGUhHzi3c8Dt0i2L3Gj/nYeSRt6ybVfmKy8feR02VVio/PBGDX8j0ZjfsOa - 75jA9AXCTomQ4INrcM+bA6ZbJ0v42StuIN4l2Qjl0nae4zkl8JllenAc2GeRBnw8 - OW4JM2OYHpl8clP9dmuAb8+0nzCg57CJ7lAkbpguHMTkguVBY53C5XSx+z9g74Rc - RKaji59Zwl2lY/qLCcnpeJhoccXqDcuAftuvjifoLZRCXRq93EmR7IEBvAtf0o46 - xADUmSdY7RDN/EZ0+fnn4qVbv6SarKYue8IpUQZwdXk2NHfTQuVeKtEDzoNgWB3S - XAEZ8La73b8jhbKvVGIklAx20s0zPm8B2X85Ju2DqComvJ/H/x6Xl622v52S1JMr - czQ97EInwWNFs3tvTHwTqf941amNEC5p+lRNw2ta3p4GuTiN8VOAavQT0XK2 - =efxl + hQIMA9/PFHehMxwxAQ/+Ia/R7pW68bQ+vEoGry8q9LLYyCV8Pd86O5eA61iGgyab + rPKcA4n3JxgqX3QdW6vtUzZXyVmpHBN5vGNAwxlYcmg5MuDInQkELccLZLWUcytl + aRYcNEalaf++Qmbq+1G0499EeJPO1sWQDug9JMSqMeWJu34Kba+g3zWT+iLC4dhW + B3OOJNXKFPNQWPx/DlxsA6Q7t3FlB8Kklx12lJUfCr0Ds66oVYpY3HGceVpm/jd0 + UKqKYhXWDfSUKOBgqxbp9TOXZe6pmrNI84deKV7Y/Z3R7yT6DvWWMzTxqa+2pnzz + Uxu5Ofw9/inzDy4yd+EvXg6GEAoJYtSqkSYscABIfxmrRpxyWLD8pCULd0L32XTy + f1F2mVlu8IQPkQMj2gY1hRm0j8TZLAHvw/Bp8P+K0v9m+nZfQQAOVlEGJssj08pf + Y3aIVghrzpGrlS/0xW9NL8iaSOJv4AeoeKAj2cQpuK5ZkbaY46Xx1wuUSnA2JMFv + OMPF+N98nrrlYJF+J+I9rM3G1g0SzzZU0xERCD/xO+q0Vve1L3sgatDQGrmHYIfW + 06Yv9nYcJTI67LUxXCOt1vDLCgWrZ5P7FHtI0hk/tePhNC7wKDj4fef77BH2P50u + zIsKsW3B5SID597C3OsQZfFG8ZPjl6VzGeHJiEwTvu74Xcvd1MSllfgGu8NjEJnS + XgG8txygihuS9QpT8WIVqFijmWB9EWHS9Vnc7U18lieqTfAvAUcyEsnFVHfTSdOo + VeK/STWrDQEGJ4h9y3PnqJHqOWoS+GSFSERWq0dLkMRQI9QUB77YsehxVoKz0Mw= + =DmTQ -----END PGP MESSAGE----- fp: "0x416CF1EF9AAF90BC" shamir_threshold: 1 From d6cac0f5092da0ff903ee4e228b34972a5072907 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 05:23:54 +0200 Subject: [PATCH 181/184] (Re-)Add README.md --- README.md | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 229 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..53b2db0 --- /dev/null +++ b/README.md @@ -0,0 +1,229 @@ +# Dotfiles + +My dotfiles (and now, system configuration) - use them as a reference for your personal use and +contribute suggestions and improvements. + +As of 2026, I've switched from an [Arch-based](https://archlinux.org/) setup, where dotfiles were +managed with [Chezmoi](https://www.chezmoi.io/), to [NixOS](https://nixos.org/) via a flake-based +approach. + +Dotfiles in the home directory - including most tools whenever possible - are managed via [Home +Manager](https://nix-community.github.io/home-manager/). + +Historical Arch configuration may be inspected by looking at the +[arch-dotfiles](https://github.com/rtucek/dotfiles/releases/tag/arch-dotfiles) tag. + + +## Installation + +While this is technically "just" a glorified Nix flake, the initial installation on a host requires +some bootstrapping. + +This is due to the following requirements: +- disk partition is declaratively managed via disko.[^disko docs] +- secret management is achieved via sops-nix.[^sops-nix docs] +- installation via nixos-anywhere.[^nixos-anywhere docs] + + +### Onboarding a new machine + +Assuming you want to add a new machine from scratch, perform the following steps in order: + + +#### Settle on the hostname + +The computer's hostname is a key parameter in NixOS as it maps (by default) to the configuration +target. + +The example below adds a new laptop of type TUXEDO InfinityBook Pro AMD Gen9. As such, it uses +`tux-ibp-amdgen9-nixos-btw` as the hostname. + + +#### Create a host key + +The host key is required for decrypting secrets at boot time. +For security reasons, each host is expected to have its own dedicated key, located at +`/secrets/keys.txt`. + +In order to generate a new key, run: + +```sh +age-keygen -pq +``` + +This will dump an age key - both the public and private keys - to stdout.[^age docs] +Store the output in a temporary file. + + +#### Create the host sops file + +Create a dedicated sops file for encrypting the host key. The general convention is to locate the +host key in `./secrets/hosts/${HOSTNAME}.yaml`. + +``` +# Create the file via +sops edit ./secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml +``` + +Then, add the previously generated age key in the `host_key` mapping: + +```yaml +host_key: | + # created: 2026-08-05T20:01:32+02:00 + # public key:age1pq1f7nk5g0hcvy52[...]appfzrumnuawfy5mdlqd + AGE-SECRET-KEY-PQ-[...] +``` + + +#### Update secrets with the new key + +With the new key, the host won't be able to decrypt existing secrets. Existing secrets can only be +decrypted once they have been re-encrypted with the new public key. + +Before being able to re-encrypt secrets, the new public key must be configured in `.sops.yaml`. Add +the new public key as a YAML anchor to `keys.hosts.${HOSTNAME}` and alias the value as +`${HOSTNAME}_age`. + +```yaml +keys: + hosts: + # [...] + tux-ibp-amdgen9-nixos-btw: &tux-ibp-amdgen9-nixos-btw_age | + age1pq1f7nk5g0hcvy52[...]appfzrumnuawfy5mdlqd +``` + +Then, reference the new key in the default creation rule in `creation_rules.key_groups.age`: + +```yaml +creation_rules: + - key_groups: + age: + # [...] + - *tux-ibp-amdgen9-nixos-btw_age +``` + +Finally, re-encrypt all secrets with the new key by running: + +```sh +sops updatekeys ./secrets/**.yaml +``` + +You should see all relevant secret files updated in the secrets folder. A notable exception may be +secrets, for which other exclusive creation rules take precedence. + + +#### Extend the flake + +First, make sure you add the baseline configuration by creating +`hosts/tux-ibp-amdgen9-nixos-btw/default.nix` (the convention is `hosts/${HOSTNAME}/default.nix`). + +Paste the following template into it. + +```nix +{ ... }: +{ + imports = [ + ./hardware-configuration.nix + ../common/users/rtucek.nix + ]; + + networking.hostName = "tux-ibp-amdgen9-nixos-btw"; + sops.defaultSopsFile = ../../secrets/hosts/tux-ibp-amdgen9-nixos-btw.yaml; + + # If applicable, configure the default screens resolution below. + # home-manager.users.rtucek = { + # wayland.windowManager.hyprland.settings = { + # monitor = [ + # { + # output = "eDP-1"; + # mode = "2880x1800@120.0000"; + # position = "0x0"; + # scale = 1.5; + # } + # ]; + # }; + # }; + + # If applicable, change the default LV size. + # disko.devices.lvm_vg.volgroup0.lvs = { + # # 250 GB of available disk space + # lv_root.size = "250G"; + # # 250 GB of available disk space + # lv_home.size = "250G"; + # }; +} +``` + +The referenced `hardware-configuration.nix` file needs to be present. The actual content will be +generated during the installation by `nixos-anywhere`. It is sufficient to write the following +content to `hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix` (the convention is +`hosts/${HOSTNAME}/hardware-configuration.nix`): + +```nix +{ lib, ... }: +{ + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} +``` + +Finally, make sure the host configuration is imported in `hosts/default.nix`. Use the following +template: + +```nix +{ self, inputs, ... }: +{ + flake.nixosConfigurations = + let + sys = "${self}/system"; + + # [...] + + specialArgs = { inherit inputs self; }; + in + { + # [...] + + tux-ibp-amdgen9-nixos-btw = inputs.nixpkgs.lib.nixosSystem { + inherit specialArgs; + + modules = + laptop + ++ commonCfg + ++ [ + ./tux-ibp-amdgen9-nixos-btw + ]; + }; + }; +} +``` + +Once done, run `nix flake check .` to verify that the configuration changes are still valid. + + +#### Prepare the destination host + +SSH into our installation target via `ssh user@IP` and verify that you have sudo privileges by +running `sudo whoami`. + +As a general reminder, it is also advisable to verify the available disk size (e.g. `sudo fdisk -l +/dev/[...]`). If necessary, adjust `disko.devices.lvm_vg.volgroup0.lvs.lv_root.size` and +`disko.devices.lvm_vg.volgroup0.lvs.lv_home.size` accordingly. + + +#### Do the installation + +Once everything is ready, simply run `./nix-install.sh` and follow the interactive installer. + +The full-disk-encryption password will be asked during the installation. + +> WARNING: `./nix-install.sh` will format the destination host's disk via disko. Make sure you have +> backed up your machine in case something breaks during the installation. + +During the installation, `hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix` will be +rewritten, based on the detected hardware. Don't forget to commit the updated file! + + +[^disko docs]: https://github.com/nix-community/disko +[^sops-nix docs]: https://github.com/mic92/sops-nix +[^nixos-anywhere docs]: https://nix-community.github.io/nixos-anywhere +[^age docs]: https://age-encryption.org/ From 947cda8afd33c4280a024c62dbd67fe740d7f0f1 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 05:24:31 +0200 Subject: [PATCH 182/184] Update `tux-ibp-amdgen9-nixos-btw`'s hardware-configuration.nix --- .../hardware-configuration.nix | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix index 5589c62..dca8dcd 100644 --- a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix +++ b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix @@ -1,4 +1,18 @@ -{ lib, ... }: +# Do not modify this file! It was generated by ‘nixos-generate-config’ +# and may be overwritten by future invocations. Please make changes +# to /etc/nixos/configuration.nix instead. +{ config, lib, pkgs, modulesPath, ... }: + { + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; + + boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "uas" "sd_mod" "sdhci_pci" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-amd" ]; + boot.extraModulePackages = [ ]; + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; + hardware.cpu.amd.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; } From 41d75747dc48552d895e60304f68e5715925deb7 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 05:28:13 +0200 Subject: [PATCH 183/184] tux-ibp-amdgen9-nixos-btw: fix formatting of hardware-configuration.nix --- .../hardware-configuration.nix | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix index dca8dcd..e32a4b8 100644 --- a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix +++ b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix @@ -1,14 +1,27 @@ # Do not modify this file! It was generated by ‘nixos-generate-config’ # and may be overwritten by future invocations. Please make changes # to /etc/nixos/configuration.nix instead. -{ config, lib, pkgs, modulesPath, ... }: +{ + config, + lib, + pkgs, + modulesPath, + ... +}: { - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; + imports = [ + (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "thunderbolt" "uas" "sd_mod" "sdhci_pci" ]; + boot.initrd.availableKernelModules = [ + "nvme" + "xhci_pci" + "thunderbolt" + "uas" + "sd_mod" + "sdhci_pci" + ]; boot.initrd.kernelModules = [ ]; boot.kernelModules = [ "kvm-amd" ]; boot.extraModulePackages = [ ]; From 3ac46e978e1ba389e3338f7e22f1020a2e45d7f2 Mon Sep 17 00:00:00 2001 From: Rudolf Tucek Date: Thu, 6 Aug 2026 05:30:22 +0200 Subject: [PATCH 184/184] tux-ibp-amdgen9-nixos-btw: fix lint errors of hardware-configuration.nix --- hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix | 1 - 1 file changed, 1 deletion(-) diff --git a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix index e32a4b8..3c014fa 100644 --- a/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix +++ b/hosts/tux-ibp-amdgen9-nixos-btw/hardware-configuration.nix @@ -4,7 +4,6 @@ { config, lib, - pkgs, modulesPath, ... }: