From 58c31da9ca36453e6986a346510494978a703f7d Mon Sep 17 00:00:00 2001 From: Kopatz <7265381+Kropatz@users.noreply.github.com> Date: Fri, 17 Nov 2023 17:07:47 +0000 Subject: [PATCH 1/3] add wsl default user --- flake.nix | 2 +- systems/wsl/configuration.nix | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/flake.nix b/flake.nix index dd362be..53877eb 100644 --- a/flake.nix +++ b/flake.nix @@ -115,7 +115,7 @@ ./users/anon.nix ({ config, pkgs, ... }: { nixpkgs.overlays = [ overlay-unstable ]; }) ./systems/wsl/configuration.nix - nixos-wsl.nixosModules.default + nixos-wsl.nixosModules.wsl home-manager.nixosModules.home-manager ]; }; diff --git a/systems/wsl/configuration.nix b/systems/wsl/configuration.nix index 67fe07f..2ee5e08 100644 --- a/systems/wsl/configuration.nix +++ b/systems/wsl/configuration.nix @@ -15,9 +15,11 @@ wsl = { enable = true; + nativeSystemd = true; startMenuLaunchers = true; wslConf = { automount.root = "/mnt"; + user.default = lib.mkForce "anon"; interop = { enabled = false; appendWindowsPath = false;}; }; }; From 22e2663a6b76d30eff896e6897c250475a5361ac Mon Sep 17 00:00:00 2001 From: Kopatz <7265381+Kropatz@users.noreply.github.com> Date: Fri, 17 Nov 2023 17:57:30 +0000 Subject: [PATCH 2/3] configure nvim and add wireguard --- .config/nvim/init.lua | 566 ++++++++++++++++++ .config/nvim/lua/custom/plugins/copilot.lua | 25 + .config/nvim/lua/custom/plugins/init.lua | 5 + .config/nvim/lua/custom/plugins/llm.lua | 28 + .config/nvim/lua/custom/plugins/nvim-tree.lua | 90 +++ .config/nvim/lua/custom/plugins/nvterm.lua | 17 + .../lua/custom/plugins/treesitter-context.lua | 21 + .config/nvim/lua/custom/plugins/undotree.lua | 1 + .../nvim/lua/kickstart/plugins/autoformat.lua | 74 +++ .config/nvim/lua/kickstart/plugins/debug.lua | 87 +++ flake.nix | 2 + modules/firewall.nix | 7 + modules/wireshark.nix | 5 + systems/server/userdata.nix | 6 + users/anon.nix | 2 +- users/home-manager/nvim/config.lua | 29 - users/home-manager/nvim/nvim.nix | 76 +-- 17 files changed, 949 insertions(+), 92 deletions(-) create mode 100644 .config/nvim/init.lua create mode 100644 .config/nvim/lua/custom/plugins/copilot.lua create mode 100644 .config/nvim/lua/custom/plugins/init.lua create mode 100644 .config/nvim/lua/custom/plugins/llm.lua create mode 100644 .config/nvim/lua/custom/plugins/nvim-tree.lua create mode 100644 .config/nvim/lua/custom/plugins/nvterm.lua create mode 100644 .config/nvim/lua/custom/plugins/treesitter-context.lua create mode 100644 .config/nvim/lua/custom/plugins/undotree.lua create mode 100644 .config/nvim/lua/kickstart/plugins/autoformat.lua create mode 100644 .config/nvim/lua/kickstart/plugins/debug.lua create mode 100644 modules/firewall.nix create mode 100644 modules/wireshark.nix delete mode 100644 users/home-manager/nvim/config.lua diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 0000000..4b4fff6 --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,566 @@ +--[[ + +===================================================================== +==================== READ THIS BEFORE CONTINUING ==================== +===================================================================== + +Kickstart.nvim is *not* a distribution. + +Kickstart.nvim is a template for your own configuration. + The goal is that you can read every line of code, top-to-bottom, understand + what your configuration is doing, and modify it to suit your needs. + + Once you've done that, you should start exploring, configuring and tinkering to + explore Neovim! + + If you don't know anything about Lua, I recommend taking some time to read through + a guide. One possible example: + - https://learnxinyminutes.com/docs/lua/ + + And then you can explore or search through `:help lua-guide` + + +Kickstart Guide: + +I have left several `:help X` comments throughout the init.lua +You should run that command and read that help section for more information. + +In addition, I have some `NOTE:` items throughout the file. +These are for you, the reader to help understand what is happening. Feel free to delete +them once you know what you're doing, but they should serve as a guide for when you +are first encountering a few different constructs in your nvim config. + +--]] +-- Set as the leader key +-- See `:help mapleader` +-- NOTE: Must happen before plugins are required (otherwise wrong leader will be used) +vim.g.mapleader = ' ' +vim.g.maplocalleader = ' ' + +-- Install package manager +-- https://github.com/folke/lazy.nvim +-- `:help lazy.nvim.txt` for more info +local lazypath = vim.fn.stdpath 'data' .. '/lazy/lazy.nvim' +if not vim.loop.fs_stat(lazypath) then + vim.fn.system { + 'git', + 'clone', + '--filter=blob:none', + 'https://github.com/folke/lazy.nvim.git', + '--branch=stable', -- latest stable release + lazypath, + } +end +vim.opt.rtp:prepend(lazypath) + +-- NOTE: Here is where you install your plugins. +-- You can configure plugins using the `config` key. +-- +-- You can also configure plugins after the setup call, +-- as they will be available in your neovim runtime. +require('lazy').setup({ + -- NOTE: First, some plugins that don't require any configuration + + -- Git related plugins + 'tpope/vim-fugitive', + 'tpope/vim-rhubarb', + + -- Detect tabstop and shiftwidth automatically + 'tpope/vim-sleuth', + + -- NOTE: This is where your plugins related to LSP can be installed. + -- The configuration is done below. Search for lspconfig to find it below. + { + -- LSP Configuration & Plugins + 'neovim/nvim-lspconfig', + dependencies = { + -- Automatically install LSPs to stdpath for neovim + { 'williamboman/mason.nvim', config = true }, + 'williamboman/mason-lspconfig.nvim', + + -- Useful status updates for LSP + -- NOTE: `opts = {}` is the same as calling `require('fidget').setup({})` + { 'j-hui/fidget.nvim', tag = 'legacy', opts = {} }, + + -- Additional lua configuration, makes nvim stuff amazing! + 'folke/neodev.nvim', + }, + }, + + { + -- Autocompletion + 'hrsh7th/nvim-cmp', + dependencies = { + -- Snippet Engine & its associated nvim-cmp source + 'L3MON4D3/LuaSnip', + 'saadparwaiz1/cmp_luasnip', + + -- Adds LSP completion capabilities + 'hrsh7th/cmp-nvim-lsp', + + -- Adds a number of user-friendly snippets + 'rafamadriz/friendly-snippets', + }, + }, + + -- Useful plugin to show you pending keybinds. + { 'folke/which-key.nvim', opts = {} }, + { + -- Adds git releated signs to the gutter, as well as utilities for managing changes + 'lewis6991/gitsigns.nvim', + opts = { + -- See `:help gitsigns.txt` + signs = { + add = { text = '+' }, + change = { text = '~' }, + delete = { text = '_' }, + topdelete = { text = '‾' }, + changedelete = { text = '~' }, + }, + on_attach = function(bufnr) + vim.keymap.set('n', 'gp', require('gitsigns').prev_hunk, + { buffer = bufnr, desc = '[G]o to [P]revious Hunk' }) + vim.keymap.set('n', 'gn', require('gitsigns').next_hunk, { buffer = bufnr, desc = '[G]o to [N]ext Hunk' }) + vim.keymap.set('n', 'ph', require('gitsigns').preview_hunk, { buffer = bufnr, desc = '[P]review [H]unk' }) + end, + }, + }, + + { + -- Theme inspired by Atom + 'navarasu/onedark.nvim', + priority = 1000, + config = function() + vim.cmd.colorscheme 'onedark' + end, + }, + + { + -- Set lualine as statusline + 'nvim-lualine/lualine.nvim', + -- See `:help lualine.txt` + opts = { + options = { + icons_enabled = false, + theme = 'onedark', + component_separators = '|', + section_separators = '', + }, + }, + }, + + { + -- Add indentation guides even on blank lines + 'lukas-reineke/indent-blankline.nvim', + version = "2.20.8", + -- Enable `lukas-reineke/indent-blankline.nvim` + -- See `:help indent_blankline.txt` + opts = { + char = '┊', + show_trailing_blankline_indent = false, + }, + }, + + -- "gc" to comment visual regions/lines + { 'numToStr/Comment.nvim', opts = {} }, + + -- Fuzzy Finder (files, lsp, etc) + { + 'nvim-telescope/telescope.nvim', + branch = '0.1.x', + dependencies = { + 'nvim-lua/plenary.nvim' } + }, + + -- Fuzzy Finder Algorithm which requires local dependencies to be built. + -- Only load if `make` is available. Make sure you have the system + -- requirements installed. + { + 'nvim-telescope/telescope-fzf-native.nvim', + build = + 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' + }, + { + -- Highlight, edit, and navigate code + 'nvim-treesitter/nvim-treesitter', + dependencies = { + 'nvim-treesitter/nvim-treesitter-textobjects', + }, + build = ':TSUpdate', + }, + {'romgrk/barbar.nvim', + dependencies = { + 'lewis6991/gitsigns.nvim', -- OPTIONAL: for git status + 'nvim-tree/nvim-web-devicons', -- OPTIONAL: for file icons + }, + init = function() vim.g.barbar_auto_setup = false end, + opts = { + -- lazy.nvim will automatically call setup for you. put your options here, anything missing will use the default: + -- animation = true, + -- insert_at_start = true, + -- …etc. + }, + version = '^1.0.0', -- optional: only update when a new 1.x version is released + }, + + -- NOTE: Next Step on Your Neovim Journey: Add/Configure additional "plugins" for kickstart + -- These are some example plugins that I've included in the kickstart repository. + -- Uncomment any of the lines below to enable them. + require 'kickstart.plugins.autoformat', + require 'kickstart.plugins.debug', + + -- NOTE: The import below can automatically add your own plugins, configuration, etc from `lua/custom/plugins/*.lua` + -- You can use this folder to prevent any conflicts with this init.lua if you're interested in keeping + -- up-to-date with whatever is in the kickstart repo. + -- Uncomment the following line and add your plugins to `lua/custom/plugins/*.lua` to get going. + -- + -- For additional information see: https://github.com/folke/lazy.nvim#-structuring-your-plugins + { import = 'custom.plugins' }, +}, {}) + +-- [[ Setting options ]] +-- See `:help vim.o` +-- NOTE: You can change these options as you wish! +vim.cmd [[highlight Normal ctermbg=none guibg=none]] +vim.cmd [[highlight EndOfBuffer ctermbg=none guibg=none]] +vim.cmd [[highlight NvimTreeEndOfBuffer ctermbg=none guibg=none]] +vim.cmd [[highlight NvimTreeNormal ctermbg=none guibg=none]] + + +-- Set highlight on search +vim.o.hlsearch = false + +-- Make line numbers default +vim.wo.number = true +vim.wo.relativenumber = true + +-- Enable mouse mode +vim.o.mouse = 'a' + +-- Sync clipboard between OS and Neovim. +-- Remove this option if you want your OS clipboard to remain independent. +-- See `:help 'clipboard'` +vim.o.clipboard = 'unnamedplus' + +-- Enable break indent +vim.o.breakindent = true + +-- Save undo history +vim.o.undofile = true + +-- Case-insensitive searching UNLESS \C or capital in search +vim.o.ignorecase = true +vim.o.smartcase = true + +-- Keep signcolumn on by default +vim.wo.signcolumn = 'yes' + +-- Decrease update time +vim.o.updatetime = 250 +vim.o.timeoutlen = 300 + +-- Set completeopt to have a better completion experience +vim.o.completeopt = 'menuone,noselect' + +-- NOTE: You should make sure your terminal supports this +vim.o.termguicolors = true +vim.o.smartindent = true +vim.o.scrolloff = 8 +vim.o.list = false +vim.opt.listchars = { + tab = "→ ", + space = "·", + nbsp = "␣", + trail = "•", + precedes = "«", + extends = "»", +} + +-- [[ Basic Keymaps ]] + +-- Keymaps for better default experience +-- See `:help vim.keymap.set()` +vim.keymap.set({ 'n', 'v' }, '', '', { silent = true }) + +-- Remap for dealing with word wrap +vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) +vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) + +vim.keymap.set("n", "ss", [[:%s/\<\>//gI]]) +vim.keymap.set("x", "p", [["_dP]]) +vim.keymap.set("n", "J", "mzJ`z") +vim.keymap.set("v", "J", ":m '>+1gv=gv") +vim.keymap.set("v", "K", ":m '<-2gv=gv") +vim.keymap.set("n", "Y", "yy"); +-- nvim-tree +vim.keymap.set("n", "f", ":NvimTreeToggle"); + +-- [[ Highlight on yank ]] +-- See `:help vim.highlight.on_yank()` +local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) +vim.api.nvim_create_autocmd('TextYankPost', { + callback = function() + vim.highlight.on_yank() + end, + group = highlight_group, + pattern = '*', +}) + +-- [[ Configure Telescope ]] +-- See `:help telescope` and `:help telescope.setup()` +require('telescope').setup { + defaults = { + mappings = { + n = { + [''] = require('telescope.actions').delete_buffer + }, + i = { + [''] = false, + [''] = false, + }, + }, + }, +} + +-- Enable telescope fzf native, if installed +pcall(require('telescope').load_extension, 'fzf') + +-- See `:help telescope.builtin` +vim.keymap.set('n', '?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) +vim.keymap.set('n', '', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) +vim.keymap.set('n', '/', function() + -- You can pass additional configuration to telescope to change theme, layout, etc. + require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { + winblend = 10, + previewer = false, + }) +end, { desc = '[/] Fuzzily search in current buffer' }) + +vim.keymap.set('n', 'gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' }) +vim.keymap.set('n', 'sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) +vim.keymap.set('n', 'sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) +vim.keymap.set('n', 'sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) +vim.keymap.set('n', 'sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) +vim.keymap.set('n', 'sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) +vim.keymap.set('n', 'sr', require('telescope.builtin').lsp_references, { desc = '[S]earch [R]eferences' }) + +-- [[ Configure Treesitter ]] +-- See `:help nvim-treesitter` +require('nvim-treesitter.configs').setup { + -- Add languages to be installed here that you want installed for treesitter + ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'tsx', 'typescript', 'vimdoc', 'vim' }, + + -- Autoinstall languages that are not installed. Defaults to false (but you can change for yourself!) + auto_install = true, + + highlight = { enable = true }, + indent = { enable = true }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = '', + node_incremental = '', + scope_incremental = '', + node_decremental = '', + }, + }, + textobjects = { + select = { + enable = true, + lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim + keymaps = { + -- You can use the capture groups defined in textobjects.scm + ['aa'] = '@parameter.outer', + ['ia'] = '@parameter.inner', + ['af'] = '@function.outer', + ['if'] = '@function.inner', + ['ac'] = '@class.outer', + ['ic'] = '@class.inner', + }, + }, + move = { + enable = true, + set_jumps = true, -- whether to set jumps in the jumplist + goto_next_start = { + [']m'] = '@function.outer', + [']]'] = '@class.outer', + }, + goto_next_end = { + [']M'] = '@function.outer', + [']['] = '@class.outer', + }, + goto_previous_start = { + ['[m'] = '@function.outer', + ['[['] = '@class.outer', + }, + goto_previous_end = { + ['[M'] = '@function.outer', + ['[]'] = '@class.outer', + }, + }, + swap = { + enable = true, + swap_next = { + ['a'] = '@parameter.inner', + }, + swap_previous = { + ['A'] = '@parameter.inner', + }, + }, + }, +} + +-- Diagnostic keymaps +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' }) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' }) +vim.keymap.set('n', 'e', vim.diagnostic.open_float, { desc = 'Open floating diagnostic message' }) +vim.keymap.set('n', 'q', vim.diagnostic.setloclist, { desc = 'Open diagnostics list' }) + +-- [[ Configure LSP ]] +-- This function gets run when an LSP connects to a particular buffer. +local on_attach = function(_, bufnr) + -- NOTE: Remember that lua is a real programming language, and as such it is possible + -- to define small helper and utility functions so you don't have to repeat yourself + -- many times. + -- + -- In this case, we create a function that lets us more easily define mappings specific + -- for LSP related items. It sets the mode, buffer and description for us each time. + local nmap = function(keys, func, desc) + if desc then + desc = 'LSP: ' .. desc + end + + vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) + end + + nmap('rn', vim.lsp.buf.rename, '[R]e[n]ame') + nmap('ca', vim.lsp.buf.code_action, '[C]ode [A]ction') + + nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') + nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') + nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') + nmap('D', vim.lsp.buf.type_definition, 'Type [D]efinition') + nmap('ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') + nmap('ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') + + -- See `:help K` for why this keymap + nmap('K', vim.lsp.buf.hover, 'Hover Documentation') + nmap('', vim.lsp.buf.signature_help, 'Signature Documentation') + + -- Lesser used LSP functionality + nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') + nmap('wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') + nmap('wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') + nmap('wl', function() + print(vim.inspect(vim.lsp.buf.list_workspace_folders())) + end, '[W]orkspace [L]ist Folders') + + -- Create a command `:Format` local to the LSP buffer + vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) + vim.lsp.buf.format() + end, { desc = 'Format current buffer with LSP' }) +end + +-- Enable the following language servers +-- Feel free to add/remove any LSPs that you want here. They will automatically be installed. +-- +-- Add any additional override configuration in the following tables. They will be passed to +-- the `settings` field of the server config. You must look up that documentation yourself. +local servers = { + -- clangd = {}, + -- gopls = {}, + -- pyright = {}, + rust_analyzer = {}, + jdtls = {}, + -- tsserver = {}, + + lua_ls = { + Lua = { + workspace = { checkThirdParty = false }, + telemetry = { enable = false }, + }, + }, +} + +-- Setup neovim lua configuration +require('neodev').setup() + +-- nvim-cmp supports additional completion capabilities, so broadcast that to servers +local capabilities = vim.lsp.protocol.make_client_capabilities() +capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) + +-- Ensure the servers above are installed +local mason_lspconfig = require 'mason-lspconfig' + +mason_lspconfig.setup { + ensure_installed = vim.tbl_keys(servers), +} + +mason_lspconfig.setup_handlers { + function(server_name) + require('lspconfig')[server_name].setup { + capabilities = capabilities, + on_attach = on_attach, + settings = servers[server_name], + } + end, +} + +-- [[ Configure nvim-cmp ]] +-- See `:help cmp` +local cmp = require 'cmp' +local luasnip = require 'luasnip' +require('luasnip.loaders.from_vscode').lazy_load() +luasnip.config.setup {} + +cmp.setup { + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = cmp.mapping.preset.insert { + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.scroll_docs(-4), + [''] = cmp.mapping.scroll_docs(4), + [''] = cmp.mapping.complete {}, + [''] = cmp.mapping.confirm { + behavior = cmp.ConfirmBehavior.Replace, + select = true, + }, + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + else + fallback() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_prev_item() + elseif luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + else + fallback() + end + end, { 'i', 's' }), + }, + sources = { + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + }, +} + +-- disable netrw at the very start of your init.lua +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 + +-- set termguicolors to enable highlight groups +vim.opt.termguicolors = true + +-- The line beneath this is called `modeline`. See `:help modeline` +-- vim: ts=2 sts=2 sw=2 et + diff --git a/.config/nvim/lua/custom/plugins/copilot.lua b/.config/nvim/lua/custom/plugins/copilot.lua new file mode 100644 index 0000000..4bd9e84 --- /dev/null +++ b/.config/nvim/lua/custom/plugins/copilot.lua @@ -0,0 +1,25 @@ +return { + { + "zbirenbaum/copilot.lua", + enabled = false, + cmd = "Copilot", + event = "InsertEnter", + config = function() + require("copilot").setup({ + suggestion = { + enabled = true, + auto_trigger = true, + debounce = 75, + keymap = { + accept = "", + next = "", + prev = "" + } + }, + filetypes = { + ["."] = true + } + }) + end, + } +} diff --git a/.config/nvim/lua/custom/plugins/init.lua b/.config/nvim/lua/custom/plugins/init.lua new file mode 100644 index 0000000..be0eb9d --- /dev/null +++ b/.config/nvim/lua/custom/plugins/init.lua @@ -0,0 +1,5 @@ +-- You can add your own plugins here or in other files in this directory! +-- I promise not to create any merge conflicts in this directory :) +-- +-- See the kickstart.nvim README for more information +return {} diff --git a/.config/nvim/lua/custom/plugins/llm.lua b/.config/nvim/lua/custom/plugins/llm.lua new file mode 100644 index 0000000..84abb2d --- /dev/null +++ b/.config/nvim/lua/custom/plugins/llm.lua @@ -0,0 +1,28 @@ +return { + cond = false, + 'huggingface/llm.nvim', + opts = { + api_token = "monkey", + -- cf Setup + model = "http://localhost:8080/generate", + query_params = { + max_new_tokens = 60, + temperature = 0.2, + top_p = 0.95, + stop_token = "", + }, + fim = { + enabled = true, + prefix = "
",
+      middle = "",
+      suffix = "",
+    },
+    debounce_ms = 150,
+    accept_keymap = "",
+    dismiss_keymap = "",
+    max_context_after = 5000,
+    max_context_before = 5000,
+    tls_skip_verify_insecure = false,
+    context_window = 8192, -- max number of tokens for the context window
+  }
+};
diff --git a/.config/nvim/lua/custom/plugins/nvim-tree.lua b/.config/nvim/lua/custom/plugins/nvim-tree.lua
new file mode 100644
index 0000000..347f3c1
--- /dev/null
+++ b/.config/nvim/lua/custom/plugins/nvim-tree.lua
@@ -0,0 +1,90 @@
+local function my_on_attach(bufnr)
+  local api = require('nvim-tree.api')
+
+  local function opts(desc)
+    return { desc = 'nvim-tree: ' .. desc, buffer = bufnr, noremap = true, silent = true, nowait = true }
+  end
+
+  -- copy default mappings here from defaults in next section
+  vim.keymap.set('n', 'tc', api.tree.change_root_to_node, opts('CD'))
+  vim.keymap.set('n', 'te', api.node.open.replace_tree_buffer, opts('Open: In Place'))
+  vim.keymap.set('n', 'tk', api.node.show_info_popup, opts('Info'))
+  vim.keymap.set('n', 'tr', api.fs.rename_sub, opts('Rename: Omit Filename'))
+  vim.keymap.set('n', 'tt', api.node.open.tab, opts('Open: New Tab'))
+  vim.keymap.set('n', 'tv', api.node.open.vertical, opts('Open: Vertical Split'))
+  vim.keymap.set('n', 'th', api.node.open.horizontal, opts('Open: Horizontal Split'))
+  vim.keymap.set('n', '', api.node.navigate.parent_close, opts('Close Directory'))
+  vim.keymap.set('n', '', api.node.open.edit, opts('Open'))
+  vim.keymap.set('n', '', api.node.open.preview, opts('Open Preview'))
+  vim.keymap.set('n', '>', api.node.navigate.sibling.next, opts('Next Sibling'))
+  vim.keymap.set('n', '<', api.node.navigate.sibling.prev, opts('Previous Sibling'))
+  vim.keymap.set('n', '.', api.node.run.cmd, opts('Run Command'))
+  vim.keymap.set('n', '-', api.tree.change_root_to_parent, opts('Up'))
+  vim.keymap.set('n', 'a', api.fs.create, opts('Create'))
+  vim.keymap.set('n', 'bd', api.marks.bulk.delete, opts('Delete Bookmarked'))
+  vim.keymap.set('n', 'bmv', api.marks.bulk.move, opts('Move Bookmarked'))
+  vim.keymap.set('n', 'B', api.tree.toggle_no_buffer_filter, opts('Toggle Filter: No Buffer'))
+  vim.keymap.set('n', 'c', api.fs.copy.node, opts('Copy'))
+  vim.keymap.set('n', 'C', api.tree.toggle_git_clean_filter, opts('Toggle Filter: Git Clean'))
+  vim.keymap.set('n', '[c', api.node.navigate.git.prev, opts('Prev Git'))
+  vim.keymap.set('n', ']c', api.node.navigate.git.next, opts('Next Git'))
+  vim.keymap.set('n', 'd', api.fs.remove, opts('Delete'))
+  vim.keymap.set('n', 'D', api.fs.trash, opts('Trash'))
+  vim.keymap.set('n', 'E', api.tree.expand_all, opts('Expand All'))
+  vim.keymap.set('n', 'e', api.fs.rename_basename, opts('Rename: Basename'))
+  vim.keymap.set('n', ']e', api.node.navigate.diagnostics.next, opts('Next Diagnostic'))
+  vim.keymap.set('n', '[e', api.node.navigate.diagnostics.prev, opts('Prev Diagnostic'))
+  vim.keymap.set('n', 'F', api.live_filter.clear, opts('Clean Filter'))
+  vim.keymap.set('n', 'f', api.live_filter.start, opts('Filter'))
+  vim.keymap.set('n', 'g?', api.tree.toggle_help, opts('Help'))
+  vim.keymap.set('n', 'gy', api.fs.copy.absolute_path, opts('Copy Absolute Path'))
+  vim.keymap.set('n', 't.', api.tree.toggle_hidden_filter, opts('Toggle Filter: Dotfiles'))
+  vim.keymap.set('n', 'ti', api.tree.toggle_gitignore_filter, opts('Toggle Filter: Git Ignore'))
+  vim.keymap.set('n', 'J', api.node.navigate.sibling.last, opts('Last Sibling'))
+  vim.keymap.set('n', 'K', api.node.navigate.sibling.first, opts('First Sibling'))
+  vim.keymap.set('n', 'm', api.marks.toggle, opts('Toggle Bookmark'))
+  vim.keymap.set('n', 'o', api.node.open.edit, opts('Open'))
+  vim.keymap.set('n', 'O', api.node.open.no_window_picker, opts('Open: No Window Picker'))
+  vim.keymap.set('n', 'p', api.fs.paste, opts('Paste'))
+  vim.keymap.set('n', 'P', api.node.navigate.parent, opts('Parent Directory'))
+  vim.keymap.set('n', 'q', api.tree.close, opts('Close'))
+  vim.keymap.set('n', 'r', api.fs.rename, opts('Rename'))
+  vim.keymap.set('n', 'R', api.tree.reload, opts('Refresh'))
+  vim.keymap.set('n', 's', api.node.run.system, opts('Run System'))
+  vim.keymap.set('n', 'S', api.tree.search_node, opts('Search'))
+  vim.keymap.set('n', 'U', api.tree.toggle_custom_filter, opts('Toggle Filter: Hidden'))
+  vim.keymap.set('n', 'W', api.tree.collapse_all, opts('Collapse'))
+  vim.keymap.set('n', 'x', api.fs.cut, opts('Cut'))
+  vim.keymap.set('n', 'y', api.fs.copy.filename, opts('Copy Name'))
+  vim.keymap.set('n', 'Y', api.fs.copy.relative_path, opts('Copy Relative Path'))
+  vim.keymap.set('n', '<2-LeftMouse>', api.node.open.edit, opts('Open'))
+end
+
+
+
+return {
+  "nvim-tree/nvim-tree.lua",
+  version = "*",
+  lazy = false,
+  dependencies = {
+    "nvim-tree/nvim-web-devicons",
+  },
+  config = function()
+    require("nvim-tree").setup({
+      sort_by = "case_sensitive",
+      on_attach = my_on_attach,
+      view = {
+        width = 30,
+      },
+      renderer = {
+        group_empty = true,
+      },
+      filters = {
+        dotfiles = true,
+      },
+      update_focused_file = {
+        enable = true,
+      },
+    })
+  end,
+}
diff --git a/.config/nvim/lua/custom/plugins/nvterm.lua b/.config/nvim/lua/custom/plugins/nvterm.lua
new file mode 100644
index 0000000..53be1e9
--- /dev/null
+++ b/.config/nvim/lua/custom/plugins/nvterm.lua
@@ -0,0 +1,17 @@
+local toggle_modes = { 'n', 't' }
+local mappings = {
+  { toggle_modes, '', function() require("nvterm.terminal").toggle('horizontal') end },
+  { toggle_modes, '', function() require("nvterm.terminal").toggle('vertical') end },
+  { toggle_modes, '', function() require("nvterm.terminal").toggle('float') end },
+}
+local opts = { noremap = true, silent = true }
+for _, mapping in ipairs(mappings) do
+  vim.keymap.set(mapping[1], mapping[2], mapping[3], opts)
+end
+
+return {
+  "NvChad/nvterm",
+  config = function()
+    require("nvterm").setup()
+  end,
+}
diff --git a/.config/nvim/lua/custom/plugins/treesitter-context.lua b/.config/nvim/lua/custom/plugins/treesitter-context.lua
new file mode 100644
index 0000000..934eaef
--- /dev/null
+++ b/.config/nvim/lua/custom/plugins/treesitter-context.lua
@@ -0,0 +1,21 @@
+return {
+  "nvim-treesitter/nvim-treesitter-context",
+  version = "*",
+  lazy = false,
+  config = function()
+  require('treesitter-context').setup{
+    enable = true, -- Enable this plugin (Can be enabled/disabled later via commands)
+    max_lines = 0, -- How many lines the window should span. Values <= 0 mean no limit.
+    min_window_height = 0, -- Minimum editor window height to enable context. Values <= 0 mean no limit.
+    line_numbers = true,
+    multiline_threshold = 20, -- Maximum number of lines to collapse for a single context line
+    trim_scope = 'outer', -- Which context lines to discard if `max_lines` is exceeded. Choices: 'inner', 'outer'
+    mode = 'cursor',  -- Line used to calculate context. Choices: 'cursor', 'topline'
+    -- Separator between context and content. Should be a single character string, like '-'.
+    -- When separator is set, the context will only show up when there are at least 2 lines above cursorline.
+    separator = nil,
+    zindex = 20, -- The Z-index of the context window
+    on_attach = nil, -- (fun(buf: integer): boolean) return false to disable attaching
+  }
+  end,
+}
\ No newline at end of file
diff --git a/.config/nvim/lua/custom/plugins/undotree.lua b/.config/nvim/lua/custom/plugins/undotree.lua
new file mode 100644
index 0000000..d9076e8
--- /dev/null
+++ b/.config/nvim/lua/custom/plugins/undotree.lua
@@ -0,0 +1 @@
+return {}
diff --git a/.config/nvim/lua/kickstart/plugins/autoformat.lua b/.config/nvim/lua/kickstart/plugins/autoformat.lua
new file mode 100644
index 0000000..bc56b15
--- /dev/null
+++ b/.config/nvim/lua/kickstart/plugins/autoformat.lua
@@ -0,0 +1,74 @@
+-- autoformat.lua
+--
+-- Use your language server to automatically format your code on save.
+-- Adds additional commands as well to manage the behavior
+
+return {
+  'neovim/nvim-lspconfig',
+  config = function()
+    -- Switch for controlling whether you want autoformatting.
+    --  Use :KickstartFormatToggle to toggle autoformatting on or off
+    local format_is_enabled = true
+    vim.api.nvim_create_user_command('KickstartFormatToggle', function()
+      format_is_enabled = not format_is_enabled
+      print('Setting autoformatting to: ' .. tostring(format_is_enabled))
+    end, {})
+
+    -- Create an augroup that is used for managing our formatting autocmds.
+    --      We need one augroup per client to make sure that multiple clients
+    --      can attach to the same buffer without interfering with each other.
+    local _augroups = {}
+    local get_augroup = function(client)
+      if not _augroups[client.id] then
+        local group_name = 'kickstart-lsp-format-' .. client.name
+        local id = vim.api.nvim_create_augroup(group_name, { clear = true })
+        _augroups[client.id] = id
+      end
+
+      return _augroups[client.id]
+    end
+
+    -- Whenever an LSP attaches to a buffer, we will run this function.
+    --
+    -- See `:help LspAttach` for more information about this autocmd event.
+    vim.api.nvim_create_autocmd('LspAttach', {
+      group = vim.api.nvim_create_augroup('kickstart-lsp-attach-format', { clear = true }),
+      -- This is where we attach the autoformatting for reasonable clients
+      callback = function(args)
+        local client_id = args.data.client_id
+        local client = vim.lsp.get_client_by_id(client_id)
+        local bufnr = args.buf
+
+        -- Only attach to clients that support document formatting
+        if not client.server_capabilities.documentFormattingProvider then
+          return
+        end
+
+        -- Tsserver usually works poorly. Sorry you work with bad languages
+        -- You can remove this line if you know what you're doing :)
+        if client.name == 'tsserver' then
+          return
+        end
+
+        -- Create an autocmd that will run *before* we save the buffer.
+        --  Run the formatting command for the LSP that has just attached.
+        vim.api.nvim_create_autocmd('BufWritePre', {
+          group = get_augroup(client),
+          buffer = bufnr,
+          callback = function()
+            if not format_is_enabled then
+              return
+            end
+
+            vim.lsp.buf.format {
+              async = false,
+              filter = function(c)
+                return c.id == client.id
+              end,
+            }
+          end,
+        })
+      end,
+    })
+  end,
+}
diff --git a/.config/nvim/lua/kickstart/plugins/debug.lua b/.config/nvim/lua/kickstart/plugins/debug.lua
new file mode 100644
index 0000000..7fc783f
--- /dev/null
+++ b/.config/nvim/lua/kickstart/plugins/debug.lua
@@ -0,0 +1,87 @@
+-- debug.lua
+--
+-- Shows how to use the DAP plugin to debug your code.
+--
+-- Primarily focused on configuring the debugger for Go, but can
+-- be extended to other languages as well. That's why it's called
+-- kickstart.nvim and not kitchen-sink.nvim ;)
+
+return {
+  -- NOTE: Yes, you can install new plugins here!
+  'mfussenegger/nvim-dap',
+  -- NOTE: And you can specify dependencies as well
+  dependencies = {
+    -- Creates a beautiful debugger UI
+    'rcarriga/nvim-dap-ui',
+
+    -- Installs the debug adapters for you
+    'williamboman/mason.nvim',
+    'jay-babu/mason-nvim-dap.nvim',
+
+    -- Add your own debuggers here
+    'leoluz/nvim-dap-go',
+  },
+  config = function()
+    local dap = require 'dap'
+    local dapui = require 'dapui'
+
+    require('mason-nvim-dap').setup {
+      -- Makes a best effort to setup the various debuggers with
+      -- reasonable debug configurations
+      automatic_setup = true,
+
+      -- You can provide additional configuration to the handlers,
+      -- see mason-nvim-dap README for more information
+      handlers = {},
+
+      -- You'll need to check that you have the required things installed
+      -- online, please don't ask me how to install them :)
+      ensure_installed = {
+        -- Update this to ensure that you have the debuggers for the langs you want
+        'delve',
+      },
+    }
+
+    -- Basic debugging keymaps, feel free to change to your liking!
+    vim.keymap.set('n', '', dap.continue, { desc = 'Debug: Start/Continue' })
+    vim.keymap.set('n', '', dap.step_into, { desc = 'Debug: Step Into' })
+    vim.keymap.set('n', '', dap.step_over, { desc = 'Debug: Step Over' })
+    vim.keymap.set('n', '', dap.step_out, { desc = 'Debug: Step Out' })
+    vim.keymap.set('n', 'b', dap.toggle_breakpoint, { desc = 'Debug: Toggle Breakpoint' })
+    vim.keymap.set('n', 'B', function()
+      dap.set_breakpoint(vim.fn.input 'Breakpoint condition: ')
+    end, { desc = 'Debug: Set Breakpoint' })
+
+    -- Dap UI setup
+    -- For more information, see |:help nvim-dap-ui|
+    dapui.setup {
+      -- Set icons to characters that are more likely to work in every terminal.
+      --    Feel free to remove or use ones that you like more! :)
+      --    Don't feel like these are good choices.
+      icons = { expanded = '▾', collapsed = '▸', current_frame = '*' },
+      controls = {
+        icons = {
+          pause = '⏸',
+          play = '▶',
+          step_into = '⏎',
+          step_over = '⏭',
+          step_out = '⏮',
+          step_back = 'b',
+          run_last = '▶▶',
+          terminate = '⏹',
+          disconnect = '⏏',
+        },
+      },
+    }
+
+    -- Toggle to see last session result. Without this, you can't see session output in case of unhandled exception.
+    vim.keymap.set('n', '', dapui.toggle, { desc = 'Debug: See last session result.' })
+
+    dap.listeners.after.event_initialized['dapui_config'] = dapui.open
+    dap.listeners.before.event_terminated['dapui_config'] = dapui.close
+    dap.listeners.before.event_exited['dapui_config'] = dapui.close
+
+    -- Install golang specific config
+    require('dap-go').setup()
+  end,
+}
diff --git a/flake.nix b/flake.nix
index 53877eb..53c2384 100644
--- a/flake.nix
+++ b/flake.nix
@@ -39,6 +39,8 @@
         ./systems/server/configuration.nix
         ### Modules ###
         ./modules/hdd-spindown.nix
+        ./modules/firewall.nix
+        ./modules/wireshark.nix
         ./modules/minecraft-server.nix
         ./modules/motd.nix
         ./modules/postgres.nix
diff --git a/modules/firewall.nix b/modules/firewall.nix
new file mode 100644
index 0000000..1f42978
--- /dev/null
+++ b/modules/firewall.nix
@@ -0,0 +1,7 @@
+{ config, pkgs, lib, inputs, vars, ... }:
+let
+  allowedUDPPortRanges = vars.udpRanges;
+in
+{
+  networking.firewall.allowedUDPPortRanges = allowedUDPPortRanges;
+}
diff --git a/modules/wireshark.nix b/modules/wireshark.nix
new file mode 100644
index 0000000..dd208ef
--- /dev/null
+++ b/modules/wireshark.nix
@@ -0,0 +1,5 @@
+{ config, pkgs, ... }:
+{
+    programs.wireshark.enable = true;
+    programs.wireshark.package = pkgs.wireshark;
+}
diff --git a/systems/server/userdata.nix b/systems/server/userdata.nix
index 4d87e6f..7f181e8 100644
--- a/systems/server/userdata.nix
+++ b/systems/server/userdata.nix
@@ -2,4 +2,10 @@
   interface = "enp0s31f6";
   ipv4 = "192.168.0.6";
   wireguardIp = "192.168.2.1";
+  udpRanges = [
+    #{
+    #  from = 52000;
+    #  to = 52100;
+    #}
+  ];
 }
diff --git a/users/anon.nix b/users/anon.nix
index fb9cd97..c53bf35 100644
--- a/users/anon.nix
+++ b/users/anon.nix
@@ -40,7 +40,7 @@ in
     isNormalUser = true;
     description = user;
     shell = pkgs.zsh;
-    extraGroups = [ "networkmanager" "wheel" "docker" ];
+    extraGroups = [ "networkmanager" "wheel" "docker" "wireshark"];
     packages = with pkgs; [
       firefox
     ];
diff --git a/users/home-manager/nvim/config.lua b/users/home-manager/nvim/config.lua
deleted file mode 100644
index 726b756..0000000
--- a/users/home-manager/nvim/config.lua
+++ /dev/null
@@ -1,29 +0,0 @@
--- -------
--- Library
--- -------
-
-function map (mode, shortcut, command)
-vim.api.nvim_set_keymap(mode, shortcut, command, { noremap = true, silent = true })
-end
-function nmap(shortcut, command)
-map('n', shortcut, command)
-end
-function imap(shortcut, command)
-map('i', shortcut, command)
-end
-
--- ------
--- Config
--- ------
-
-vim.cmd([[
-set autoindent expandtab tabstop=4 shiftwidth=4
-set clipboard=unnamed
-syntax on
-set cc=80
-colorscheme habamax
-set list
-set listchars=tab:→\ ,space:·,nbsp:␣,trail:•,precedes:«,extends:»
-map  
-]])
-
diff --git a/users/home-manager/nvim/nvim.nix b/users/home-manager/nvim/nvim.nix
index 3a03a1a..0a865f2 100644
--- a/users/home-manager/nvim/nvim.nix
+++ b/users/home-manager/nvim/nvim.nix
@@ -1,72 +1,24 @@
 { user, pkgs, ... }:
 {
   home-manager.users.${user} = { pkgs, ...}: {
+    home.file.".config/nvim" = {
+      enable = true;
+      recursive = true;
+      source = ../../../.config/nvim;
+      target = ".config/nvim";
+    };
     programs.neovim = {
       enable = true;
-      defaultEditor = true;
-      viAlias = true;
-      vimAlias = true;
-
-      plugins = with pkgs.vimPlugins; [
-        (nvim-treesitter.withAllGrammars)
-        vim-nix
-        # Buffer tabs
-        {
-            plugin = bufferline-nvim;
-            type = "lua";
-            config = ''
-                require("bufferline").setup{ }
-                nmap("b", ":BufferLineCycleNext")
-                nmap("B", ":BufferLineCyclePrev")
-            '';
-        }
-        # File browser
-        {
-            plugin = nvim-tree-lua;
-            type = "lua";
-            config = ''
-                require("nvim-tree").setup()
-            '';
-        }
-      {
-        plugin = vim-which-key;
-        type = "lua";
-        # TODO: How to port this to Lua?
-        config = ''
-          vim.cmd([[
-          map  
-          let g:mapleader = "\"
-          let g:maplocalleader = ','
-          nnoremap        :WhichKey ''
-          nnoremap   :WhichKey  ','
-          ]])
-        '';
-      }
-      ];
       extraPackages = with pkgs; [
-        nodejs
-        nil
+        rnix-lsp
+        gcc
+        ripgrep
+        fd
+        cmake
+        nodePackages.pyright
+        nodePackages.eslint
+        ccls
       ];
-      extraConfig = ''
-      lua << EOF
-      ${builtins.readFile ./config.lua}
-      EOF
-      '';
-      coc.enable = true;
-      coc.settings = ''
-        "suggest.noselect" = true;
-        "suggest.enablePreview" = true;
-        "suggest.enablePreselect" = false;
-        "suggest.disableKind" = true;
-        "coc.preferences.formatOnSave" = true;
-        "languageserver": {
-            "nix": {
-            "command": "${pkgs.nil}/bin/nil",
-            "filetypes": ["nix"],
-            "rootPatterns":  ["flake.nix"],
-            }
-        }
-      '';
     };
   };
 }

From 2a4a2de76a68d9e827084e2bee6f5e7a6b36f427 Mon Sep 17 00:00:00 2001
From: Kopatz <7265381+Kropatz@users.noreply.github.com>
Date: Sat, 18 Nov 2023 13:09:40 +0100
Subject: [PATCH 3/3] rekey secrets

---
 secrets/coturn-secret.age       | Bin 502 -> 538 bytes
 secrets/duckdns.age             |  18 ++++++++++--------
 secrets/github-runner-pw.age    | Bin 527 -> 658 bytes
 secrets/github-runner-token.age | Bin 473 -> 581 bytes
 secrets/kavita.age              | Bin 507 -> 596 bytes
 secrets/matrix-registration.age |  20 +++++++++++---------
 secrets/nextcloud-admin.age     | Bin 450 -> 515 bytes
 secrets/nextcloud-cert.age      | Bin 1683 -> 1812 bytes
 secrets/nextcloud-key.age       | Bin 2131 -> 2271 bytes
 secrets/paperless.age           | Bin 496 -> 538 bytes
 secrets/restic-gdrive.age       | Bin 876 -> 961 bytes
 secrets/restic-pw.age           | Bin 520 -> 639 bytes
 secrets/restic-s3.age           | Bin 566 -> 626 bytes
 secrets/secrets.nix             |  30 ++++++++++++++++--------------
 secrets/wireguard-private.age   |  19 ++++++++++---------
 15 files changed, 47 insertions(+), 40 deletions(-)

diff --git a/secrets/coturn-secret.age b/secrets/coturn-secret.age
index 216ee087d64ed896d1152b6cac52bd49c46e7417..d27aeef08b26e8af77536caa3f232a95cd7dd706 100644
GIT binary patch
delta 504
zcmeyyJd0(5PQ9~Rl~WqGvc9&dpNVC@FPE;JLUD11
zZfc5=si~o*f@heqOLm}wc~qELVQ^}4X?9hrZ&rC&M14e>Z)KXJTS`TKj**vMd
z6N^(7OfnP|^OTDfq7~d~^SIJov;%{k4KhrV{c=3ZxpZ}P75qwk-NLhy3|*3oveUAQ
zU9&BNeDbpWOP$@)vR9l
zt5tLE8c%=vL^04ck9!lBSi~+zaiba+g{i?wy^q(ZG5-tPe`&9!wO~p
zr)Oe8Qm#=lmv?4Bc4m}sd4QWqp=q&^XGx`@i&JJmg-elZfv=xyxLJW^fVqpmQ}6A)
z&vQBR^TpbR!wH7D_QI0k3oozOuym)-qO5Bhem^j+{`>v5&y({jS5DG;
M%I+O23GDR-0Bk_7y8r+H

diff --git a/secrets/duckdns.age b/secrets/duckdns.age
index e549b8b..232f847 100644
--- a/secrets/duckdns.age
+++ b/secrets/duckdns.age
@@ -1,9 +1,11 @@
 age-encryption.org/v1
--> ssh-ed25519 yfCCMw qWHcQHXaRWumJlWydl0VLTNR2y4j5uVb3Sbjb0iO9Hk
-LrQOKE3+nYVEM9cg3gT+nInpdTBocmVXSBSD7EBb1MQ
--> ssh-ed25519 IV3DkQ QR2R+mQSrk0UBV4GSATs0NQkkgbQzFai7ms5xQX3RTc
-sndWMq89BmXeoyE+le7tHJQ6oSjzfhCbas5EpcJIzdc
--> 2/3Ux/5c-grease k;>AI5|g &JI / .{c
-kY1TBMB2l6gMU+1aHPbBTCad537N1aa8d0Wi8bYGMmeC9+8PV18a
---- eKaZ9bddh3SF6hitwAHBldIFpUh3s2R6pI9eDstHdk8
-Egv:!OGyg%ӂĬ
"CYhr1+&-\&rf<ܣIB4v/
\ No newline at end of file
+-> ssh-ed25519 yfCCMw bknEVINSpmzqbs669XXGW10WlRU2eYqM21nCra4Grm0
+UH/rieabfARVLfMojUzRpMV8OgQQegmkERr3OsudizI
+-> ssh-ed25519 IV3DkQ ae0X4te6ZevvoybUP20LgE4ymTiisoBMfrZQBm0LHEo
+f9VxOHjo6W349d/T9DuH0KbQRHj+EXa+yascxnG/oEA
+-> ssh-ed25519 DCzi1A vBpgN1TwpEv+mJNIMoHitLshG0q1RDTz3WrvRbRGnno
+Nc9I8WWXDDzCfOHkcbhqXjk0Fvp23f8QxiW6bdPix3Q
+-> 5-grease ;gX' KVd. S[Du |%f:LC8
+g5R1yuzS9892Jf0N+RsaVg77389vLxeowKKcD/PM962AMYCe4iHdCw
+--- u/d/x8qCopx23d4TiecnfbaL+l+JJu5i+yJqmU6XH/c
+4n~Xv6j80}	_=$H@u{q/^+vԹOyEpK3LZ
\ No newline at end of file
diff --git a/secrets/github-runner-pw.age b/secrets/github-runner-pw.age
index ff4d8ab796fcc9e5d71c5cf81e363e3c6a49b131..793ffa190fd023ed6ae6c180238d6fc1cf3b1b2c 100644
GIT binary patch
delta 625
zcmeBYnZ!Clr{2-WEyc*Fq|`msx!fbwBq-dYEXW|#EXdC}%p=XM($F}#GAgpv%*7zc
zgv+%mB`MV0rP4b;+{GZL!rL%3GTp<=z0xuu(6Z9l*SI{_G|SvIvZS!clS|i5p}06h
zH#Nn`)YQ;Y!86R*B|A{Tz_(IA)VVy-$j{TGyeQZ|s6Nr#H!;mWu`<%rHP9$1&nMK|
z#3KfTf;**wtEwZzEJF)B1D&mh^^G{vhtxGFp?FSOXmr^vvp*gGN}
z-8vWNs!T&ig@Uv|{nP+&Z}(*PN{>`$^Gff;f-n~^H;=&bw9=>??bL{R%TU))?;>}X
zK(3^y;s~QKXUDX3gVZQP%aV*l!|ccapY#G_bGPh>KyQCzGjGo%zr@5qSCDnV0bWKK
zS-R;(sfop@3RU`^Ie7{x@mh6RfjLQBj!wyz0cMHC5&jXSK8Y3{evU3?6@i{9Ayp}1
ziOH7EUM?x+!Bu&chV_}Q`A)7CZsCq*Wnt!iNfsqZX)fLc{#;%LLFVN~mM(sUsp*ya
z=7~<;8U97(#^zDx{@!j$o}OO%<{3WvslKH_IVJvij+vE?-bPNIt`TXLW)UVu9>H9Z
zj$FFBx(ZGiX4yr-KKV%{Icbq0-Ui;uk=`ZYKKe-|MJDEECRr|CNr7dl8O2Tp-kw}v
zxBYcbscBeiyoc3ti^P_vd1n^%GWe?fVy!fP9d|m+{J4dK%POzj4oizA%2QIg)KcZ7
x_8QhlPCqRErNnxl>3QoKZfVzBJATJoWa`EI_d8)<#pjr`{xjG7yBvFN008a*(nbIP

delta 493
zcmbQl+RrjUr@lPUKRCiPJg+RfBG)^|q@pCr#muP8*w83A%ThnxJUHJsEif!4*f7u_
zpDV1)AgMAjEX%NR0&^^f@(kofpJEN-9mrK`9p}06h
zH#Nn`)YQ;Y!86R*B|A_d*)hr^J0&$D+$gj%%QG>zs@}jcN#8FpBRnIgqTH=0%hJ@)
z+cV5FD66uZ%Q4KPC^5q)F)A!IS357z#n-dUEZaBLGb1b1G1*+-&9L0x$RORq(zP-h
zWL>IyLXmEIQEFmws)A`zu%2%?mws`sZ$Oq$QAJ*`L7&I?X|0fpez)1ow;T57emSYwWReE}K3A@v

diff --git a/secrets/github-runner-token.age b/secrets/github-runner-token.age
index 6338b90df2f1dbd28ae160fb6492f90ddca25f60..69edd0d858aabb2db4fef00d7a9524f73e2213f5 100644
GIT binary patch
delta 548
zcmcb~e3WH^PJNJmcy^w-W2H-FL3(&;R7h2*mt#hFmWg|Twu?_;eo=0oXHGz3ac*u#
zIhSdnr)zLQMxa@FNRn@6xVL{sYHC=7OM0ZXN1&r|pnib6S8k!FX;5;d0hg|wLUD11
zZfc5=si~o*f@heqOLm}wsYzjgpLaxXvUzx>Z?M0IYrS@op^JraL_nBXqET6LNvf%(
zZAt4U~5Zn9^fYiU4Gu6u-KU{Q*DVM?yPK|w~TeomUJMU;sJ
zx^*tjRhfp43PvVrCP}8H6;-aT;r=Cs*~V4=1qKmW`R17>`CgS#!6v@-d7hq`fdQ^Y
zj$FwuCP}7F>7^#d`e|NH5$1`(NoK{VC7A_=`Gvui1;HjB{wX<*&S7P4o*?VYbkmDc
z6N^(7%DF0%iY!C5-2(NCw6jyfUDNV{6D{)mBg4xp19EdRUCRs&%`7rP!m|~gPg*hOS285yiJnwTq`X@yq!{m3k#eK
ze2TK1LM$w}baizVD)dYIiVM6<{4z}4%Q7n?y(3-y5-UyhEey&nP5sR?oO}#&1Bx^A
zf*p&w_CKv#Uhde!C-Qcp?&=@2>srs|<+58I@nE>|@SF`}@7~|C&$t_yn2YA}=$8Af
WU3->$h0nWQSDy;Yo92%FH!1*3Zn=H{

delta 439
zcmX@ga+7(2PJL0CXGLD7XQgGBrLSvgahhjvexys3qq9$dN4RH1PC;sji*s>AMp8wf
z371=jX_jYYW^P2OlVL@9T5)8sX-H~_r)gzGK!uy7x4y4=WR6p~rAx4HIhU@TLUD11
zZfc5=si~o*f@heqOLm|_L{&;~T6kHOcW|j$P-bYDX}wc;nSWxjw^^W@lToR^M`cn;
zq-$iJOI~?8ms3VbVW~@UUb<8pVW@a&K(SJQNZqBNh3F!#{P
zBsVY59N+ZPh_a}#93$62E?r$+g^E(6a#J(^3?KK>v?R-1--xI{eTzu_iVznA?^KJ(
zvNVefv#Kyxg97t(t{YxoRQS4&JDX47+H-cP!F#tE&%5uta(QY`;(f0b@MG=7m(yDR
heZSK^f$`I+%tNOPX1)D>d`-XypEvL8Pw4O$0RSMhpAi56

diff --git a/secrets/kavita.age b/secrets/kavita.age
index dd08100dcd680acbcd647b221e6447cf9f13ef92..9056647791f39f41bf74b75ff122247ab68a053a 100644
GIT binary patch
delta 563
zcmey(e1&C#PJNb-wv$PgQJ{NbUUqSSNriS+mO)giW2&inX_|*;VQ5fW8aaCD`x4XYl
zkflM1MTC1XSGrGtd1!HDWu(4GUVv9Ygp*~JWo}8bzJ+^QaDjVNMsS*;Sy{fDcVeO|
zx^*tjRhfp43f{$LB}Lh8{$c5vDb5kvK5p3+&c18NTJN
zCR|zhRha>1CZYZX2H~ES<=LgVhK5c)zM17g#_q}5j&6QI#cmN5q56)Qp&;vOjCIqC
zQWJ|)6;g^E%9OawlJ&zq%#B^VauV|*!@NrJlYM-mOnkG7-NM{Fk`1!bjXb<7Tr(^U
za!raVb0flYa!Zr*BI-j;OG?AC9lcB4xbo7gGE!WNB0ZCWvdx_>ostdmOOi4zypsy6
zT+FkIJVG70baizVax1DrTuUts1B_i$y`%CIE%Yr6&65o?vdoIZ(*2DLA}hl(ohm$%
z+{25xR?h5R^)6*Wdd%CIiRTzM{hRA4vg*A_`akwweF-zS9ow(yRQXGs-mG30Bp&m^
nYwFVsnHObl+T0JN?kJxKf43p+v7t<+%*21zM!8K>dT#&#_94O^

delta 473
zcmcb@@|$^rPJMP@UO|9wR#BmcpSMMJfp$@`eneh+fq|1{u%TnHM`>PRP-T(6w@YYH
zGFN6wgmYkeMoL(4wr6CLx4A)PazMIUakgi0TBJ*Gn0dardtsJuP+>%oFPE;JLUD11
zZfc5=si~o*f@heqOLm|_g|k6qx{r2Rw!XV}MWuF{SG`k2PDp@TTCh*Hxwn&1WkzAK
zV{wtUVMu5om!U_Av!g+FhPRn>xM6ODe_%;gcBzF^pnhsWW|EcBz|2T*bLX6t2(yTQtU%A8fb3jft_z|@x(f{KLVcL7n}^NkJ!jJN
z?3u4vm=(*B3E|1hHumg#_nXc9%gx_kq8aLz&gsgEvE>r(yZ`sl)%5Pfc)wh!PX`vM
O

diff --git a/secrets/matrix-registration.age b/secrets/matrix-registration.age
index ff89fcd..046ca6b 100644
--- a/secrets/matrix-registration.age
+++ b/secrets/matrix-registration.age
@@ -1,10 +1,12 @@
 age-encryption.org/v1
--> ssh-ed25519 yfCCMw cm1Rv6pG2jv5YL2a3jejL3oHyp3w5AdOOkPUuC1RiTQ
-OPfb5CCkGwV1wBjxSM63i7YSWzwZrwh2GbIaIMgbnLo
--> ssh-ed25519 IV3DkQ mqIItqMdUx2rypN38qZc2MluanXzEyW82BoRvJRnmgE
-FiODCU94Dv0MRhhMjcRxtM8vSzcfWbCiQza6P3iRFK0
--> .H0wQ-grease /9 WqdeDrv> )IMX{vvR >^?
-AY2rOa0e0RS1
---- rQj2qpVKjSI/ptv2PUp2kMoAtko06QQw64Fgx46/10s
-f_Ahfخފfg~sv&LIp,Cy-9ϪRi
-D%Y와N3Y!>	4U#Ii(`c.U.T#wNl^x$Ń-_L[6B2&vqX|woBP'RhOD>ŷľIW
\ No newline at end of file
+-> ssh-ed25519 yfCCMw xrDKLBFHoh635bYYw5FlL2WnRPzzEM5EFIipjunDQ3A
+Wfkj09/KylBGszWXViglOfQnzEPy2JhOqyq6/cDXqiI
+-> ssh-ed25519 IV3DkQ +F9cs8sm432eoBD3sshRyo1GIy8/YwdanqRX/c4Y7B8
+LHpRwgpI2Np9iDvJQIb6khmWJqehHFetw2DjthvWN5E
+-> ssh-ed25519 DCzi1A PVEn4M1Q0P6HOWLUHQ0g1oFwWwrfhKkc0ptBSPVvoDk
+VXDdSofM0bMv5Rh8dHkboL/+cq8yQbvK/SZkwOaEQzY
+-> (-grease >Tbe
+9FPVr0dmrUWP7dKYoJ3tlegb7knPZlUTRFrZ3trG7Lwv30NHSYnMLtxSj3aushEM
+Izg
+--- FC8cLZftv1tiIbIr5c0gM/Gllni1PBt06Pl5HaZw520
+NꘜeǠH&C0[`=*:& i/*V"+}:
k^Y&/d~ʬD^M6:)	3X3se##!/ʐH.f~	{22tRX{$[r([Cj{G#Vbl:v˛
\ No newline at end of file
diff --git a/secrets/nextcloud-admin.age b/secrets/nextcloud-admin.age
index 704bd12370a7b1765a9d8f610f7c5db6cf6f834a..3f0a5e0c494e9623723a2639ea578b3788cb8bba 100644
GIT binary patch
delta 481
zcmX@a+{`jTr#_&nGT6`}Fht+P!ZWfw!@DFSJ>NGesodYK$Xwe!FWj-BGSAJOSv
zn=8`C-PJeKv(h5WEW|9^JS(iizr@GPxVS9PH6*eqJ)$hv(>vcMDBZX)olDnFp}06h
zH#Nn`)YQ;Y!86R*B|A{T)yO&0qddaWIVaW0G%MKHz22`f#L}!hDLBZ|z|GA)JJ-|D
zAS%(#D>B2CE4?J!J=r)b+}tuhGB3y1L*Kj1&)m$>G*7$S+}EwrBe=@2G{?s=%E+-8
z-8vWNs!T&ih4kEja5D?HK)=u=-z1a3%u3@x!~Ce=6!-GNi~xVPw506%Y!7!|GuP1c
za<1&qEMs>!XQwikv{G%8vY@oA5;J{m)5z4I$n>B}OAmcR<1CA^($G}Ta*%Z<#oo!9
zy6Hu!iN&c3>6K=V1<726QJw`=U8R-1wno$F0{3n;*Vi8>7G4@AX%cINt|H
z=X@ADSVhey}C+k2Mr*vv?)
Jn_Jv%2LN&6s2czP

delta 416
zcmZo>ImA3cr#?5|qN*r6EhWn*#XLXD$2ls>BErWY%_XqB$Rx_N#G;@uFDW;oGCQIo
zkSnPmAk!(mO26FDq^vNnEZ8ElG{P$+->|@?v@j*f!!@li!Zkg`Bcj+KkW1H2p}06h
zH#Nn`)YQ;Y!86R*B|A{T*t04!SKquO$J4_kBe2-Wx85+VFgrEB$~@P*+%z*K)Faod
z$}}X=Bc!67%gG}zGNdrEBrj7xw5r_6D>yyFJu{*(JhZ$tpui*C#KS2pD=WY-G$P9r
zWSymcp=p|KdQoa(ajJrGmO?_czk*7Tf~J-pmtR0|V0xNIp{JLpN0CKFYLTO}UuKxL
zQ+ZH*nt`#mg}X(NlS`7RzFB@$WiFSluC790NQ!A`SgDy~RB=IWML}tldAYGsdZnjx
za*=nScXohbd3m{6VP00gOF5U|!7tYLR`H#kbjJTNf4~E|vkrT?=G|T
zbKiu!#>&!#ZpRRL1TB6~z
Kev5&~b0+}Z>y}Ue

diff --git a/secrets/nextcloud-cert.age b/secrets/nextcloud-cert.age
index b24c888c5be748034b779650be88e4962a33bcc3..37a12ac86e5b29648c15bda68ebd68c5176cf04d 100644
GIT binary patch
delta 1788
zcmbQtJB4q8PJNoCajH>8W{I1luSrs5mQ!X(P?(8!Vr8+VZ>52kyL*OZs!L!}nU`@+
zF_)2%Wuj+UkxROpmyx?irkRsVmZ!g&V{l2bVS%BWUtzerpSEviX-b4gI+w1ULUD11
zZfc5=si~o*f@heqOLm|_sBx;HTWVy8Wr1a~Yg%4~bA5$rNQFU`PilUNfopnYp=EH6
zg-1krKuUHomycmyg+Zoiigs18bA^S!d4`8!K}1TiXHKf2zHh3fYf7F;LAqO^zIG&r
zbuP|TnTC!Ek*3apK9wm+mT8H`C0V5&DFOaQ+J@O_&VDII`T8oWg?V0S+5r&-VL65c1_f!QIfhBamg$M!P7zgU9*)5QUb+6hL7^3qAm0W1DC?#d
zr6v}qa=Da*q-bYmSyuWx`Iwa!7DNRl=jN37rQx{_*#@i
z`d4~ohGmzAM;Ke^*B3+?8x(M5J96pj>ME4`m!t=oWL0RVnR}FEhZzPNre-JRndj!Y
z=cc5j>3cZ)8#!ku7NumR7;x>o(NsEdp~CB83C?cjn41~qEzi1|ENz#yr%X88`2Xjv
zlj|cZy4P&)ejLB(=AqSlzZ<4R@Yv6s)HI>gS!u@M=A7MfE4NNe`3Bp)&1YCMKW+)U-oGGv!JU$M!cB?`o_PymqpK2YqsvHZ&qiSxBFz&YzfO}h<8%Uj5@OJ
z$NqhDnoqp`Eb;yFj0GLeZt8FUW;ciyuIPBOy!u>pv7AYfmh_~!lUKV_z4aoNgzc}t
z`7iKW=r4YOb>|A#2Iwa*4u41
zoS&~gbSZuF>-egP6YRF_lyKND?iwg*<8;yd+T^th-ZXBpEZ7|^bZsw>WQ^wS_i`7+
zvW#YPt3SU{psRQ}d)=q-<=>U#W-zYLi!L|GN@VTgd_U{*bp4kisjr`{*&gHV*l)kb
z$m5sm+qjlX^>&Uw1V1NF-1&NGn$T3;2Nv@yjl5?*V6lpg$|u8hoA*-ml=zlxN^h8^Zl787ZZv&
zTC!zUZ|u!J>cqc&;cZRY+Xtpjc$q(S)&-@L>ZkbM{5ICO
zKmX$zakE|1%+9sjxGh$Xke^Zi{aTx7fb~Tz88&nUNdLLr6s=2J1%lW
zX03VA;LF(+VXG={{_>t-(;Z93fR4(Cf6T5t@BDXSha3AMVQ;4e_7zW4J~vulJZi{Q
zv$)rBQ^3y+;VMg=`0lf;`*m}5`m7&kJv;nDFBZr@lKY}H^-^9D`vuRSk}aig@GW~-W9n|j@*;fB{4uWUhv*>kt>
znp^J`dvjw_w{r5GeN7D&(=I&wqUZFerK_-Cso}5cEp^YhO0P3(4FB-D=F5C=Z+`de
zeP#B{cM(5=-gmSyut?vT$sy}K=cr^rbx-c``qYiBj}GMgn&vcpPgU-_KX;b3pKEeB
zAJltmorjxi0qeW(>OAYbJ>I`R+wT>!%bN7ze^q<#S{wKWMbnrIU%&l+M
zPt*$x_TZLUT)IR28e`3o*>9fT`6?HC@U$tv=YDprCuWhIPmOQwv|7`A#^|$?$B*C2
zH~b5VJh}VW_pfqUr>y(uueZHt>b?hFj{AkeUE}|rGTZ6BWNKLg^RBz=ZcLXx!ExsM
hy0>h4ZfrjbW!=mKy7sSY{J!pGo~UZ=;mupcya7M@JMI7g

delta 1658
zcmbQjH<@>WPJK#tXoyLUmvOjdzNbN2l6P5ExJ!mhxSM%KT4``)Qo4zAU`9x2VX9?$
zC|5~XroX3Cq<29^xNBspNpfISL{^}&S)M_lONqOOzd=TccT$vBig&VmD3`9CLUD11
zZfc5=si~o*f@heqOLm|_pigqLZ-`fzXKI#{fmg9vYQ1lMrhAZYa%h!_YraotmT{Ir
zXjMt3Yf@D?S7C@{T6w8uly7cwYQC9=e~3XuMRHnRVPUw1Wol?naek_$S8-@wRY_zr
z$hyqXbni$b4c+vj)WqUcE^`xi%iy9g|H$$@mny?7Bl8^Bh(fG5kA15y}|BOQa;_%8u@6-^pLTB%Y
z660W#{A{j%rN1}KzlQ!(`j=#Cv)F3otWL3owv#$mD4uvf_2A|dbw-|RSz+6h7d-ya
z{minc^|o64rPH@ADo%^@oEB|#P#1W9`;S3gUp;61ysqa#?bBi_4HM)T6LxQ@
zpOBH-GRx)n%i{s3vibseuGHx-37mWW8DH+7*UvfS4N_J3Vy{+ehrGCcZuk1w`xjM&
z8GE;KZppA;`@Y`lpXJJz3M%t2=)ZAs+ukpv`|*@*{;idh{{D!$oRLy-QSrXDhhL(?
zPXC*G4hD!j3dv~h(M@~SuX=x8LH;Q>+36mt(_N0N>-*Xj5YFhsw?@2of5HZj*HyYE
zlVfIa9IndOG2hPZ?=e|fn)_lC7gJ$p?4_v7l|_D^)ng}AKR!CWzT05owcEV^4~Zz>
z=(4DPcfzvS^wGDE(n%rY+E`Bm|TgI9UF_n$W^*|YJ(
z^fi+^tXDbjGvD{@STUD}^u)R;D+>|>xqENu3VQji&iT|ZH&koy+Ro1oPA}e{s}t%X+h2F(1zASsT-%JyqjRYpLJWa-{vrjeFBt0zwy0i&S2v+H#IzS66lx&zeuhPU=id>1$%1AH1>T
z_<{v)5M5|D52Oms}pVj%e_g{n`F=MXT|ld3($H1E;Z1&OswY$sAW&0%rO)fNF
z@!LJUAmT~gM;nJ3iF>w&oSnM+uOR#>H=PA`OW&X@xW78tI6@p
z*biqdTRZ=K__yf2>es8D^g08hQ>H%&3`jBguz
zN;3b<`aR32bnRZ=8Ck7!e^yAGdH?wPbgynp!|R8q=NUXV3@KZh_36ifhk3839bWzC
zUsJus{PJGrtw)!=yyEC{+dp{1Tz9F&T|SStp30~QxE8w3>Cd_wF>R{T)BCPgc$r9s
zO#ah-Dai4C{^O;Ix1WiJ&c4(X+*$Ac`RtxMM-`c6=5c?Ycy8u*%Q@V(!hf9(nq5Et
zBH(|+aWDNPmdvIy)4S9P)o)iVJlXYQ`9?cKaR#5+zFiy%HUENht{!=uvse2xpJQw3
zz4}c}SzRW*Z%-{w*V?{ITQ;3V&4Z&eL*4P&uHRbTHoq3uE;@NnEcb}lwfmU?KCQRp
zif8p}gsHq}`1<~m6R)(~dW*cDoymEZ0v4xugqcOHd#A?wRHkL+qvs|J-}jteEa5Vv
zWNKg0iSz>2+;b+ig|99<{1&}`n1AW=Ihm~$>}A0|ihM^H7gpQzeW@?)l9B7WUUQ^K
VKTbV8SV;8M9>agWnnz_U_yGJv51;@5

diff --git a/secrets/nextcloud-key.age b/secrets/nextcloud-key.age
index 86b83aa884f07ec636a26a5d10faa1cf5e1289d9..ca2d4a7ebd0f27ff17da5295525bffb5d1e60a6e 100644
GIT binary patch
delta 2251
zcmcaCa9?nOPQ8blacEM0fN@BbcYeBwS6;Gbwy&wFK}D3SZ)8ZCi&v6=YO0ZGmbqV$
z1y_ihk%6~~MY@SePJy36rLj|RnYOE!d$NmboT)eXi;%Qa->CJW<-^@N8J_vBd9EHIekmDYg&`H*1!aZxNqJ^Q-cA7#
z23#eDL4HAzhCX>gu1S`K0gl?)ff=U$d0rVwPGx0zX}&>0VeZaFmBC4+#USf!^Rjf)
zi&7JdQx$Y&63*4f7
z(^HH+$^yzwj7`iV4TDmHT*8dZEDA%pbaizVQqoc@^+O9yN{b6~@+>Vv4a!n2{lYvw
zBYg9{Leh=P47@zF%{(Gq%{=qDVgj#!$UVZm_rvddGqt?TlHBUmtxuOtUbOp2y_b~7
z+AmTK9J?G?(yUJZJAI*y%ix@v=8flT3|FRzt+Kzd-`_c9Q=VVR;$NE2&3xu~Z+&0*
z;YQolxsThn*zLY!z2vIGSKGCnyqj`*rK~sQ9QH}fyvOUSptS1Llqy#FSvMLcPSkAD
ziViIP-sXFRZO1L~ZPyde?yoP*fA=wK9`D&r(!86e9y*{q!y%k4Bw?-2EZ%ue;p{8d
zd+p=KRZVLG>
zU@0Z(=5=USY4_)F#YY~ui*viJ9~-NdOUd1s=2dUwx%+!>ZP`lyi=kaDS5uBHs5h3^
zo+#J3|53_3{f5(?D(B~Aew<=@Fl@r#{1sd>ZpU_hbIp7k_nBqdqv*F%4MKMsR&AWq
z;fzQ}PGW^3N`vqFy7c&}<#jp(;1*9+l)?qM}_XytP`pd3dzj6)t;-m}J>oX5Kkx|-q+)dk;}G_mh852x^ftp+w1-!bODF)Cd>v3~K1r6zA?^Jz6#h0lLw
zy`{-~(}#cWLTaDBykNPu;DX?@r6q=@6{54QdQGvM5Fu!N`^?%45j%w@yggX;`70Zf
zTSt2E?H6x$^qvp4P@W$7^X@Y9k0lYh6DC@I(=UrOulsUlC43y$-nu7w>U!ZU
zy(4!RxFV(c_kC&IF8}v<>4}V)IU!f-pQgNyPc(n!caG=9w1tiL?u1S9e`I#D{>72#
z{ccNAG*3QZs#B9)C>QcNrCo8xiss`d>Q0_?;QE#$dn(*x`A^Zsx@W>mO4o`{*Sce|
zI^DT<^|!kgO4HhHw(5GRKW5r-=595oi=I}!*|eKi)LoB-?%MW~=S#KkS7DXI=gnR}
zk!*a2Th!)sKbpXv^mh9!GpA=qyApEd1(yf>38|{n
zZc-|^tSY(vpT(_%4(e|U0)`r2OU
zs?Yj8cXx_!_~NxgO6AwOYku_G&lTdZwk@exHdrUUR_v*X(Zjle)+LBFkcb+fho7edH!OM~@k6XQ-99`FS
ze&UjKnX=~{nGU)+9I#&*P<~*mOy(EO4@|r7%oCk`)A-+1@!$Vd9rE5Q&oqrVK35~U
z+9yY}>ZkJifH!g?0(V~if1PH2T9&Wt(9DDl=N7J6ukmE_#D!53?Xmpp?6=*lKjeRd
zC#G%5LDi}&zstmPV`hZ&%RXOo=x+EX*54fFKbLNEw7JK2{o||mx3_(MSh-2yq-EIprM-bk+xz*Bu|1E-cm5tK8FXd)s>2(C(shl#L5!7|f^2ECe<@wRu=Vbi>0E|uw
AN&o-=

delta 2110
zcmcaFcv)bAPQ7nwXp*O)TV`m0OGs`(u&Z%)c7#ijtBHY!d6S-nS2nY(|fOJ!zSXjW#qp>af%
zXIX)ffp3;4S7oldS$eX5Zb(&ze{Ptkw_jp_VSY(ihDCT(sbhXoN`QA{R#~A_P`RHk
z$hs)Ih(g`;qSVCVR0TCJ|Eze0aK!>Eh4N5e*K8LqQ_qm3$^!F>9B((TN;4ya9LJ=f
z(iE5afbgQqG!t#(Fw@HHN;A{cg5;vC2us&w6JLKr$I5Jff3u2QXCD(w11{HaGfVeC
zE?r$+1q*`;|4QGifV50=FUKPDf>6_J!!SSRbnl=j*C2i8%v3Y|#6)eMz$CwHE}^bj
zQysUi-kqrNhbPfLsq&54s*uZ~?K|$sYpmh3tk?bH7xC!sS|?$ro55=pSI6xWoKp~N
z@aBi%#RGx{;+$?b6xAnHFZ<7Ua<$upMz4=Ec=>zg?6Qgu4X#hvd*1n1calQgeElCK
zMZZFl4KChsaed7^p`5|mf+IJ&Y?*BkPx(pSy0YyT8EZ|AR~8CgEbo4^s8sS9eD&nf>cW`d9w&ORhx&HOIYKrhw5!#uSCDtzHRWBo
z`r4Qth1IJ6E^@J7oAj64$ZE>LWAbjT5pQ&Dx^EhvWqvTnD=~|waZ;%to0?pe>f4zD
z2Q`k~y1n1pS#G-E57pM$_1Oy+yFBe=YdgKM%solHN4)9t(|7PyQe(aP{q~3eRJi9`nc^=UgpSN3CP~QS>=4f|NEIqT~C>fdv(In
zeI7a9+;yh!`J?kD556mUS}LWp{N2Q18p@Lv$Tu&oJZ0L_@r{(^{K!3k;xu#uN9z|DQwL8UpdGn92rS;Q|8}FLdx_QLg
zOzEh1x-u|7$Lk1#eg~k@J&a%id&-g>p^KMat4i$L>#1S}EkJ6(jU%fyu+lUll2hXM;O)
z^DcI#YcZvq2%Y@Twm$uN5sSO5N{-6p125(%-FIKjbXm8uNATbGdy2l1iN_M391v3K#I`wml#=d9Vx`_1?F*Vj7ip1LkN#~*olOy)T}&HBOodf|*v&!^E1
zlBdJP!X*?dt(k={)t9|eofnW)@oDYWOW%&^*KqK3cCh=sV`qAuv71Fgr}_IS=WCVb
zyQe(bZFqa@v>r#1*;UUEN3@7+b>e=PpmH^*Hb*nTdy3u4m(JQZPUi9b)m-m%D1Pl}
zk;n54o}8Gz_paR!@5jBLi}Ez9SSHp_6L%@R$#ra=iom?TN-a5JdEuUSJ^vjDUuLps
zR-bz0t3@Bz>^b~{JGkX~Uu)}Di~V8OjQ^EaADEgx<-z|9%QrTgX3ACEV?P*q^YZJt
zvls1mpJ=5~^>)eU&nJA(Wvs1cWaL}*(v^v8OQD)eh4c5^>)|3S)7n!4?===>#qV*+
zI$Zy8Yf^B|*LCg<8)DWpFfK6I@I`}TndAE3{01{FIv41zS8=fY&RM8@Aa0B5G2a83
z_vg-STI#ji@tcv)YoWVagB7O@%^u|FsX(c251}5~O}?wZg*EY}u*L>n~S-`us7w^|>bF(XR)mIc^i!
zvF=)H!o$?#-A~SCc;?h>Qp`BM^WLqU3UAg58mkvdecCql)y+$PH)WbkxwUk5&a2+A{FlA5$Bg_VUjZvWKR3W8=HcBY%yw>5ojxt%aobiR1a%#W*HPFQtR
z?(qEM>>d{|}u>U9)#|i;0Cz
YKXT1O#K!)%L1yFh11BCvT5}x+0IgWkf&c&j

diff --git a/secrets/paperless.age b/secrets/paperless.age
index 3cfd675db52cd3df97b56eeda5c528f0bf0b6d0c..1b9364ccd339173e5a91441223dccd850ecc0c13 100644
GIT binary patch
delta 504
zcmeysJd0(5PQ5{zM^c`*nU7m}rg5-ug^{*fSg}u#L2+71ioR=(cSw|Do`IiJg`rV!
zHdl^oX+daSp-XWfrSMkdZhIc}*T9@!ZI?h(O>5k<+q26>kC5m^C_sg6Nm
z>0BX}uB9cWrcowIX^|Cff##NF{yxU39;tzbrCv#%$&R_ch53=WF5c$aks#|FymI{u
zlN@!^i&7JdQx)87^xP^HY7~^Msv@|IGSYl2w8L}5vyAd8e6-!1le0^>baizV3{p*9
za|#_ZEpq&F&GRGNO$+lpGYgXa^V}RWlPWU2D)LK;+|9Goi-N*Jx%xKSa58+pe*4)3
zkx$az6Ka!}c%R^yo+7TeeNu+H;aB~<6W6{@mA>J;`Cs}(MGp6(XR&)Lw*4!g&5)2C
haBQ~7WcMFCW{9*KhaC*KJ2Or2%`KjTQ3Z!T0RT^bu=4-_

delta 462
zcmbQm@_~7RPJLOCc3PEZQLe9>e}GqdPNi>^Pf1o_VrHtPV_{iYL2_wWRfJ=Buv=7R
zHdk>(VRELSrAJhhL79bPnTMyDMR8EDcX?iBQih|2fuomcvcHExwn0d+Czr0BLUD11
zZfc5=si~o*f@heqOLm}wVML{Igh7=>Re5SwnukS7V102#id%?#Rbg^vk*7goVP;lJ
zKvj8xMX9j~SB6Eldw5WCg`-5nOi}5es-dzpIJbpb4q$P
z$hx>v-Snc=#Nt$iS_R)+F9mb!B8B|INMFNha~m%INYC_eeV@t-L+{E$NBx{&GyR-m
zkDSE%($v%d-w@y29RG6n02A$~$O2!Ng2F%x(>&8+rxc5nRAYnS;*u19E<+dpz#y;G
z;;cfSK(8<-|A?qSBZG7F^b;CpWd?f>L`0PZ*DEEH_q*7Ui=II
Dw@;+3

diff --git a/secrets/restic-gdrive.age b/secrets/restic-gdrive.age
index 0bef43bf685064f161b96b248402e0335b1cbff1..660992f42852bae0b25499afc4348c3d0463bfef 100644
GIT binary patch
delta 931
zcmaFEc94C7PJLO0rAJ<7l8bX$QixHNSCn~WmO*%hSzwiGqQ9A$shL|zV7R_>Sb%Yr
zFISkeTcCD&esWH-rCUm>ML}9(aB^aLrMs82QAk8VlzCX7hh=hJm8(~X374*&LUD11
zZfc5=si~o*f@heqOLm|_P+@4gf3|yeNuaM$RB>*KcfGz#T26$kXF;l`k6}($a7c!?
zr$vCizIjC;S5%InflEPEvT;#>g=0p9X<}4WN|{T#TWPL$q=$d7zH7cgxPPWofMd7?
zx^*tjRhfp43P}bo&imd?p0LB^%oCMDWlWyT&^PX2lIz7|>fWufkQ
z$y{YYA!f$eo_U^?xlZ9_;dw=Q2IcN1xn&iJ7vElcvtLW(PWeYyVB$Q^pxG(Vzo#YV^1xhaRkIzz0z
zJ&*V^$E^LTGI?(JPw73fx8}$1KQ3VzcvB`NH77~_<@#zTpM&y$?QFxczM1U&b6M%P
zeA2aL6}g8Ot<99!C$TZ#?C~lUZ-&_-AuMvQe$UDhdFS1??T^_Efg;ZO3C|~28ZXz{
z_p*Lw*0dk)KEAv*C%goo&Y3$?g>z2$)ys>^rX0UoHgS=_)R@HjYcn62W}aE;T08T^
zp1<;|G}_b|r`>q$v~kaj8Owh!Ym}4_x-qk-jqB0vt#{|lYmZ$Y>ArnjLOpwl(>)Md9B7o3J-~
zrWI{JEmz`ws?zU6LdO!v@)wtHA7xuEf9C1xvu`u254?~qh?!7wsMtH=*5f1nyBqu`
z%O2vfTBUpSq7L)Cb5CWTnz~08%y0P5bLGfP=H)tS#eSa>-=vFwdw#BS@4ohlOcHai
zT$im6&WKufSug7OmXFRK)fT$wemhz0*C4lX!qLRV;ZdKtC(c&(7M*!sQMhDY*QeN7
zty{YsWmo(B*?YWiB99hxOIrZfoV<5Z`I0}GPc(jbns;@{CGK>OYpb5mEz3On?4E0X
z(YtnbFPE!*`xMt{6j-ox?%KC;)72mODUa@2Cca``nIMz%`qeRq|0;Ic+Aptv{q@zt
Q(dUBIE%)Tlx&Q6t0nTxY9smFU

delta 845
zcmX@e{)TOWPJNDRl0~skxly5+BfwOUTXn0vpWPL=YnZ8?bvSV0Psdhn?t7nvX
zu}?r|WqxQmSCn}~V3xLfx@)AFo3?&vMsQ|OnP;eBSc;EjRZxgWsEeHLynN#v%X0I4vos^aJo88om!R~>puD2=}EDYcICvt_y^wRIEB#-?HiCPs{YOK+`Z~2n?*;b+}pB(X+
z9bMEt)81@)mgUoE(UsoI^?Mam56bl^UUS?bW4EUM^yzh9<$l~0?z{YI>PaItYa71p
zlOCAtcHz~1u;Oez!{#8SFEX|gGSe((oL;bX*|)az3a(qT7yjB+IDH@6k>gcdTih5f
ziUc(;*}COyc%Q2YOT3x?#@NYmep9>y8oEvh*8~_XRXX{{!BICn3!p(kk8oDUGMUQA$6<41oP8t
z1fRMWa^y|9Q#QTE;mO)Re|2Lf7KP{8u^gS#v^YdsdCdaZMzPKkTN_`st?!EEehFT@
z8Wwl@fntzYOx&x9>d*Y%KRvr?GpGEv)l$#Q*QzPc-Ev>jPjH`9ugR&*m>ag=*DdDF
za+YUzv0bEeTIG2y)3@8Qo2D_jotpEP%dvs6gM*q98mcB40ns#3jAJEJ{BtG_y3y($mL4+aSv&Gr~1B(z`er
z-8vWNs!T&ig(`zIBI7KBiqfbo%vvfC`r?N04=ab-L+A
zsfop@3dNoZ+7X_fstPsbUJ8{STp>kS5vh6E5di@ik%jJ_&gG$Hf%#_I+5YaK9@;qu
z-c^C#MTQZcE)^byj`eQ(+6Gnbg{9$6?m0Oj;XZ{Pz5!gtp1uW{ZjL5piAK3T0aY#)
z1`(-l8O9L-fo?|rsRdz`9@++x#({>GmKjc7q3$8cm5FXf#ct_FmBk?$=_Xvdy1ELX
zzTstIhJ}&lRaK#ug{g*R#U5dfS*gWtj@o6~rFo`qKE^rPCgJ8LDdovrda)KZ3hWOr
ztpD(sq3X5k)%7Ybde$)>;CjemaoBWMpvRX-9)Is_XOe%n&iG$J>(=InH>C^iIVM{K
e>{$4w%bmG+!qfR?^XF>%cvV!D?{W4?{RIF@7SK2V

delta 486
zcmey*(!nx8r#`L7GASe_)6}KV*H}B7DKptE(;_>t!Y9^ppd!STD?Oqtv^d|TDA&od#5<_c%`-yZF~r|FHOnHyv#i`BxU@9S($O+dJ5$>N
zWL;iqWRAJ9ZhBE_VsWZMUZ}F4j&qWQLRLzUZL&dvLaKLiaVD3$c2!hpL27DnW}>S_
zd3II3w`ED0g+WG^d3jP)aB_ril7E;-VsK9a~wpW^AfT@>HRAydSYKV_hU{IcupLS4Dl&g^em#(g^Lb;ET
zfk~!muy$CaTY$E+xmS5qad3EWM3A#~qKR94YF1!=g`2x;UYMz8K39ntpV-^FuhXvz
zcO16Q`(l>1GLp@Kv1zV~%U<@+PRp*ePdhaCouB)ShjFZ}LXTo{Z-dovAhNVv&5$s

diff --git a/secrets/restic-s3.age b/secrets/restic-s3.age
index 090fd1025d8abb60f1051c28fe6758ea6b8857af..e8687bbb83d4c34b24e4ec506ccedc1fc53f6c01 100644
GIT binary patch
delta 593
zcmdnS@`+`FPJLonrf+d@a!NsfVPRQtkiSWhe@01|afVk;iicl?VOYL#q^V1QfpI~Q
zFPCLuxo1dzMN+9>h=F^qzH?NHMR87Kg?^BScUWR&d3ttuN}5r=qoZemCzr0BLUD11
zZfc5=si~o*f@heqOLm}wcTQ+daIRBmNpVDOiDz(5UcIrOzMsFBPgG8ZlZ!!8nPa+R
zP;jzIZlQ+-S5kpdcBxmXQDU*NYj9#-Vp(=}m8-jNnukfcNw7}O?`@8gB*jB
zT}qq+%q)zm+|vqOOf5o^90N>(e9OY~0-e(Bc{h
zsFpYSaraZj+MPUXb({J()diQy@Cd9d4xIK@;MnojhYwwA+$_}UXZrrX?qpzeQtmYS
TqQ1SdniKA8$x46aow^DDq6N|K

delta 533
zcmeywvW;bePJOngV`gTUdr?K8Pl!c{U$SRvMs{$yV~#S|US(Q;xZdGEbaix2JxqErKt9fEYXs}0Om2Z@jg}HNRX<3wKK9{bYLUD11
zZfc5=si~o*f@heqOLm}wPiDHdQL*xBWtK;JX|Y$h
zNv5G!rjMI1ms>zqa&CS`utlytK7X0`X}?=X-YwaA_Q{KvPnmsO_N@1;PW?ACW(s@w4&8Tb
zmuDut4BmCdda2RQy ssh-ed25519 yfCCMw 8R//RguE7Om0PFjixliXpwEchVwPcm9COYTz7TIZxTE
-81yMA9B/T6tbZfw6mU4TlYfCd6BEUC3UlBz1hNUXZ30
--> ssh-ed25519 IV3DkQ 0kS9JOiAPfLi8Zoj6BM0pVwSmDr+BnWvIh7rGwZ21G0
-jbMIkFk8DEQ2tWgOWho1JrZkwKWW93GW9dzS3fTKMF4
--> $ByN}E,-grease O$8`|NT 17d} %u)^D-
-x6SEG984W9vUAb0FCiZP0R4kQkYFOr3BGLpHP8HF8fj9LHWwxNb3PrntcOPJuvf7
-oep4FMyBFHchh6RhyrdRlOf6hCLnmybNKzs
---- fCozYj+thQdIGXzdVLgLpLup9CI0QIEdgoMxfFVHGgs
-WVoEil3z`	,oe-ZAtoOk@1b.UNrBzrZY
\ No newline at end of file
+-> ssh-ed25519 yfCCMw HoX1AI2rIYDJbfKRDRXr1ZRsNM1OVRVrr0XRnBD29FQ
+aM3HP0kxq9ACb2TFcb7f9rxKXFoT2Y9nEjL+XD3nHIM
+-> ssh-ed25519 IV3DkQ EKn/xr5EWEev3stYXDGrzfLtwt2thJ+34e5eP1v4l0g
+raaOM6zpmokVCBKNWx9xHpsQJSpTbHHQeRbz2+wC3+0
+-> ssh-ed25519 DCzi1A mVLJ1c2e1UOsTuDCKIwLliBz3OVBH8vGp/gICb8cyQY
+dXok0Tr56SdW5sf74IYk7rDnim/s7vZI/PZIGKvNuaM
+-> ;mHckk.i-grease [&? MW78 %Ee4m
+LebJ6ZshTkkY+fM5zI/sbQzGpcKN5oGiEu5tWSPnmeQQxJrjT7Utqf3KAfI
+--- 6HedZR4VvouzHmjeV9DY6BsybKcainxK9fro9MSjpxg
+hq<3:7{,9'w(FVGuLAA0̽a|Kw?!\Z-\$6y֧x
\ No newline at end of file