From 69db03c1405e3e91dc9a80b3141fbdfb47eb6499 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Mon, 3 Feb 2025 13:40:08 +0100 Subject: [PATCH] improvements --- flake.lock | 129 +--- flake.nix | 18 +- hosts/MONSTER/default.nix | 43 +- modules/home-manager/default-apps.nix | 677 ------------------ modules/home-manager/default.nix | 3 +- .../home-manager/desktops/hyprland/anyrun.css | 40 -- .../home-manager/desktops/hyprland/anyrun.nix | 15 - .../desktops/hyprland/default.nix | 192 ++--- .../hyprland/fonts/Torus-Bold.c233ce17.otf | Bin 66632 -> 0 bytes .../hyprland/fonts/Torus-Regular.734ed3ae.otf | Bin 63952 -> 0 bytes .../fonts/Torus-SemiBold.d263d500.otf | Bin 65960 -> 0 bytes .../hyprland/hypr/shaders/bluefilter.frag | 20 - .../desktops/hyprland/hypr/shaders/blur.frag | 39 - .../hypr/shaders/chromatic_abberation.frag | 24 - .../desktops/hyprland/hypr/shaders/crt.frag | 511 ------------- .../desktops/hyprland/hypr/shaders/drugs.frag | 42 -- .../hyprland/hypr/shaders/extradark.frag | 21 - .../hyprland/hypr/shaders/gaussian.frag | 31 - .../hyprland/hypr/shaders/motion-blur.frag | 28 - .../hyprland/hypr/shaders/nothing.frag | 14 - .../hyprland/hypr/shaders/solarized.frag | 41 -- .../hyprland/hypr/shaders/vibrance.frag | 39 - .../desktops/hyprland/keybinds.nix | 49 -- .../home-manager/desktops/hyprland/kitty.nix | 14 - .../desktops/hyprland/mousebinds.nix | 1 - modules/home-manager/programs/neovide.nix | 4 + modules/home-manager/theme/md3-evo.nix | 441 +++++++----- modules/nixos/boot/quiet.nix | 36 +- modules/nixos/default.nix | 9 +- modules/nixos/desktops/gamescope.nix | 70 -- modules/nixos/desktops/hyprland.nix | 168 ++++- modules/nixos/hardware/amdgpu.nix | 17 +- modules/nixos/hardware/fv43u.icc | Bin 0 -> 8724 bytes modules/nixos/hardware/fv43u.nix | 51 +- modules/nixos/hardware/fv43u_edid.bin | Bin 0 -> 384 bytes modules/nixos/shell/dunst.nix | 1 - modules/nixos/shell/firefox-pip.nix | 41 ++ modules/nixos/shell/flameshot.nix | 56 ++ modules/nixos/shell/gnome-keyring.nix | 62 ++ modules/nixos/shell/hyprpicker.nix | 28 + modules/nixos/shell/kitty.nix | 36 + modules/nixos/shell/walker.nix | 54 ++ modules/nixos/shell/waybar.nix | 4 +- overlays/plymouth/drm-close-fb.patch | 16 + 44 files changed, 905 insertions(+), 2180 deletions(-) delete mode 100644 modules/home-manager/default-apps.nix delete mode 100644 modules/home-manager/desktops/hyprland/anyrun.css delete mode 100644 modules/home-manager/desktops/hyprland/anyrun.nix delete mode 100644 modules/home-manager/desktops/hyprland/fonts/Torus-Bold.c233ce17.otf delete mode 100644 modules/home-manager/desktops/hyprland/fonts/Torus-Regular.734ed3ae.otf delete mode 100644 modules/home-manager/desktops/hyprland/fonts/Torus-SemiBold.d263d500.otf delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/bluefilter.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/blur.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/chromatic_abberation.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/crt.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/drugs.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/extradark.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/gaussian.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/motion-blur.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/nothing.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/solarized.frag delete mode 100755 modules/home-manager/desktops/hyprland/hypr/shaders/vibrance.frag delete mode 100644 modules/home-manager/desktops/hyprland/keybinds.nix delete mode 100644 modules/home-manager/desktops/hyprland/kitty.nix delete mode 100644 modules/home-manager/desktops/hyprland/mousebinds.nix delete mode 100644 modules/nixos/desktops/gamescope.nix create mode 100644 modules/nixos/hardware/fv43u.icc create mode 100644 modules/nixos/hardware/fv43u_edid.bin create mode 100644 modules/nixos/shell/firefox-pip.nix create mode 100644 modules/nixos/shell/flameshot.nix create mode 100644 modules/nixos/shell/gnome-keyring.nix create mode 100644 modules/nixos/shell/hyprpicker.nix create mode 100644 modules/nixos/shell/kitty.nix create mode 100644 modules/nixos/shell/walker.nix create mode 100644 overlays/plymouth/drm-close-fb.patch diff --git a/flake.lock b/flake.lock index c4fd86f..72bf0bc 100644 --- a/flake.lock +++ b/flake.lock @@ -1,27 +1,5 @@ { "nodes": { - "anyrun": { - "inputs": { - "flake-parts": "flake-parts", - "nixpkgs": [ - "nixpkgs" - ], - "systems": "systems" - }, - "locked": { - "lastModified": 1735301051, - "narHash": "sha256-jU88Q9tP4vuvWYGQcmOdFwI9e2uMPVYJHbXdiklIH9o=", - "owner": "Kirottu", - "repo": "anyrun", - "rev": "06017e753c8886d5296768dca80745ee09402a2d", - "type": "github" - }, - "original": { - "owner": "Kirottu", - "repo": "anyrun", - "type": "github" - } - }, "devshell": { "inputs": { "nixpkgs": [ @@ -58,27 +36,6 @@ } }, "flake-parts": { - "inputs": { - "nixpkgs-lib": [ - "anyrun", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1727826117, - "narHash": "sha256-K5ZLCyfO/Zj9mPFldf3iwS6oZStJcU4tSpiXTMYaaL0=", - "owner": "hercules-ci", - "repo": "flake-parts", - "rev": "3d04084d54bedc3d6b8b736c70ef449225c361b1", - "type": "github" - }, - "original": { - "owner": "hercules-ci", - "repo": "flake-parts", - "type": "github" - } - }, - "flake-parts_2": { "inputs": { "nixpkgs-lib": [ "nixvim", @@ -101,7 +58,7 @@ }, "flake-utils": { "inputs": { - "systems": "systems_3" + "systems": "systems_2" }, "locked": { "lastModified": 1731533236, @@ -172,11 +129,11 @@ ] }, "locked": { - "lastModified": 1737630279, - "narHash": "sha256-wJQCxyMRc4P26zDrHmZiRD5bbfcJpqPG3e2djdGG3pk=", + "lastModified": 1738448366, + "narHash": "sha256-4ATtQqBlgsGqkHTemta0ydY6f7JBRXz4Hf574NHQpkg=", "owner": "nix-community", "repo": "home-manager", - "rev": "0db5c8bfcce78583ebbde0b2abbc95ad93445f7c", + "rev": "18fa9f323d8adbb0b7b8b98a8488db308210ed93", "type": "github" }, "original": { @@ -193,11 +150,11 @@ ] }, "locked": { - "lastModified": 1737480538, - "narHash": "sha256-rk/cmrvq3In0TegW9qaAxw+5YpJhRWt2p74/6JStrw0=", + "lastModified": 1738407251, + "narHash": "sha256-IDrc1qvFolaEDST/dWKgDcmJsemlfP4Yw6kh5O9TMVs=", "owner": "nix-community", "repo": "home-manager", - "rev": "4481a16d1ac5bff4a77c608cefe08c9b9efe840d", + "rev": "055c67056d87577a39af4144ad5eadb093cfb97d", "type": "github" }, "original": { @@ -236,8 +193,10 @@ }, "matugen": { "inputs": { - "nixpkgs": "nixpkgs", - "systems": "systems_2" + "nixpkgs": [ + "nixpkgs" + ], + "systems": "systems" }, "locked": { "lastModified": 1716548249, @@ -262,11 +221,11 @@ ] }, "locked": { - "lastModified": 1737504076, - "narHash": "sha256-/B4XJnzYU/6K1ZZOBIgsa3K4pqDJrnC2579c44c+4rI=", + "lastModified": 1738277753, + "narHash": "sha256-iyFcCOk0mmDiv4ut9mBEuMxMZIym3++0qN1rQBg8FW0=", "owner": "lnl7", "repo": "nix-darwin", - "rev": "65cc1fa8e36ceff067daf6cfb142331f02f524d3", + "rev": "49b807fa7c37568d7fbe2aeaafb9255c185412f9", "type": "github" }, "original": { @@ -293,11 +252,11 @@ }, "nixpkgs": { "locked": { - "lastModified": 1716330097, - "narHash": "sha256-8BO3B7e3BiyIDsaKA0tY8O88rClYRTjvAp66y+VBUeU=", + "lastModified": 1738410390, + "narHash": "sha256-xvTo0Aw0+veek7hvEVLzErmJyQkEcRk6PSR4zsRQFEc=", "owner": "nixos", "repo": "nixpkgs", - "rev": "5710852ba686cc1fd0d3b8e22b3117d43ba374c2", + "rev": "3a228057f5b619feb3186e986dbe76278d707b6e", "type": "github" }, "original": { @@ -307,27 +266,11 @@ "type": "github" } }, - "nixpkgs_2": { - "locked": { - "lastModified": 1737181194, - "narHash": "sha256-eoGbMQQTjobtGaPyXInuciinBUWOHG68Ft9zcJer6LE=", - "owner": "NixOS", - "repo": "nixpkgs", - "rev": "947eb2af89cbad3d4ffb8bdd2557c48045b7f497", - "type": "github" - }, - "original": { - "owner": "NixOS", - "ref": "nixos-unstable", - "repo": "nixpkgs", - "type": "github" - } - }, "nixvim": { "inputs": { "devshell": "devshell", "flake-compat": "flake-compat", - "flake-parts": "flake-parts_2", + "flake-parts": "flake-parts", "git-hooks": "git-hooks", "home-manager": "home-manager_2", "nix-darwin": "nix-darwin", @@ -338,11 +281,11 @@ "treefmt-nix": "treefmt-nix" }, "locked": { - "lastModified": 1737645531, - "narHash": "sha256-2cLk8KXpFZhMUFg61Fb8ykTp0VWqJSwcg/1o30nDYVo=", + "lastModified": 1738468832, + "narHash": "sha256-+YOdIULLio6C6mlZvW3cg1oHLLbuNh0Hx82zFTaP9SM=", "owner": "nix-community", "repo": "nixvim", - "rev": "e22bb46c8863c30a791a4183aa9013d542cc5be5", + "rev": "8104356af6536df366eea4b8bcc409320323b959", "type": "github" }, "original": { @@ -361,11 +304,11 @@ ] }, "locked": { - "lastModified": 1737372689, - "narHash": "sha256-nH3zK2ki0fd5o5qvbGHxukE4qnOLJa1uCzoDObG5vrE=", + "lastModified": 1737924095, + "narHash": "sha256-9RO/IlxiE7bpY7GYsdDMNB533PnDOBo9UvYyXXqlN4c=", "owner": "NuschtOS", "repo": "search", - "rev": "570cc17bbc25650eb7d69e4fcda8cfd2f1656922", + "rev": "5efc9c966bb9bdad07a3c28667eac38b758c6f18", "type": "github" }, "original": { @@ -376,11 +319,10 @@ }, "root": { "inputs": { - "anyrun": "anyrun", "home-manager": "home-manager", "matugen": "matugen", "nix-flatpak": "nix-flatpak", - "nixpkgs": "nixpkgs_2", + "nixpkgs": "nixpkgs", "nixvim": "nixvim" } }, @@ -400,21 +342,6 @@ } }, "systems_2": { - "locked": { - "lastModified": 1689347949, - "narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=", - "owner": "nix-systems", - "repo": "default-linux", - "rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68", - "type": "github" - }, - "original": { - "owner": "nix-systems", - "repo": "default-linux", - "type": "github" - } - }, - "systems_3": { "locked": { "lastModified": 1681028828, "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", @@ -437,11 +364,11 @@ ] }, "locked": { - "lastModified": 1737483750, - "narHash": "sha256-5An1wq5U8sNycOBBg3nsDDgpwBmR9liOpDGlhliA6Xo=", + "lastModified": 1738070913, + "narHash": "sha256-j6jC12vCFsTGDmY2u1H12lMr62fnclNjuCtAdF1a4Nk=", "owner": "numtide", "repo": "treefmt-nix", - "rev": "f2cc121df15418d028a59c9737d38e3a90fbaf8f", + "rev": "bebf27d00f7d10ba75332a0541ac43676985dea3", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 6a11d89..857537d 100644 --- a/flake.nix +++ b/flake.nix @@ -1,17 +1,16 @@ { inputs = { - nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; + nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; home-manager = { url = "github:nix-community/home-manager"; inputs.nixpkgs.follows = "nixpkgs"; }; - matugen.url = "github:Theaninova/matugen/add-home-manager-module"; - nixvim = { - url = "github:nix-community/nixvim"; + matugen = { + url = "github:Theaninova/matugen/add-home-manager-module"; inputs.nixpkgs.follows = "nixpkgs"; }; - anyrun = { - url = "github:Kirottu/anyrun"; + nixvim = { + url = "github:nix-community/nixvim"; inputs.nixpkgs.follows = "nixpkgs"; }; nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest"; @@ -22,7 +21,6 @@ nixpkgs, home-manager, nixvim, - anyrun, matugen, nix-flatpak, ... @@ -42,13 +40,17 @@ }; overlays = [ (final: prev: { - anyrunPlugins = anyrun.packages.${prev.system}; matugen = matugen.packages.${prev.system}.default; gccdiag = prev.callPackage ./overlays/gccdiag { }; gbmonctl = prev.callPackage ./overlays/gbmonctl { }; lpc21isp = prev.callPackage ./overlays/lpc21isp { }; rquickshare = prev.callPackage ./overlays/rquickshare { }; rastertokpsl-re = prev.callPackage ./overlays/rastertokpsl-re { }; + plymouth = prev.plymouth.overrideAttrs ( + final: prev: { + patches = prev.patches ++ [ ]; + } + ); }) ]; } diff --git a/hosts/MONSTER/default.nix b/hosts/MONSTER/default.nix index 5d6b8d6..3ceac82 100644 --- a/hosts/MONSTER/default.nix +++ b/hosts/MONSTER/default.nix @@ -45,28 +45,41 @@ }; shell.components = { - waybar.enable = true; dunst.enable = true; + firefox-pip.enable = true; + flameshot.enable = true; + gnome-keyring.enable = true; + hyprpicker.enable = true; + kitty.enable = true; + walker.enable = true; + waybar.enable = true; }; desktops = { hyprland.enable = true; }; locale.preset.theaninova.enable = true; - services.ollama = { - enable = true; - acceleration = "rocm"; + services = { + ollama = { + enable = false; + acceleration = "rocm"; + }; + + printing = { + enable = true; + drivers = with pkgs; [ + # rastertokpsl-re + ]; + }; + + xserver.xkb.variant = "altgr-intl"; + xserver.xkb.layout = "us"; + + airprint.enable = true; + + udev.packages = with pkgs; [ android-udev-rules ]; }; - services.printing = { - enable = true; - drivers = with pkgs; [ - # rastertokpsl-re - ]; - }; - - services.xserver.xkb.variant = "altgr-intl"; - services.xserver.xkb.layout = "us"; hardware = { amdgpu.preset.default.enable = true; audio.preset.pipewire.enable = true; @@ -95,10 +108,6 @@ nerd-fonts.enable = true; }; - services.airprint.enable = true; - - services.udev.packages = with pkgs; [ android-udev-rules ]; - programs.zsh.enable = true; security.sudo.configFile = '' Defaults env_reset,pwfeedback,passprompt="󰟵 " diff --git a/modules/home-manager/default-apps.nix b/modules/home-manager/default-apps.nix deleted file mode 100644 index f40d1dc..0000000 --- a/modules/home-manager/default-apps.nix +++ /dev/null @@ -1,677 +0,0 @@ -{ config, ... }: { - xdg.mimeApps = { - enable = true; - defaultApplications = { -.3dm x-world/x-3dmf -.3dmf x-world/x-3dmf -.7z application/x-7z-compressed -.a application/octet-stream -.aab application/x-authorware-bin -.aam application/x-authorware-map -.aas application/x-authorware-seg -.abc text/vnd.abc -.acgi text/html -.afl video/animaflex -.ai application/postscript -.aif audio/aiff -.aif audio/x-aiff -.aifc audio/aiff -.aifc audio/x-aiff -.aiff audio/aiff -.aiff audio/x-aiff -.aim application/x-aim -.aip text/x-audiosoft-intra -.ani application/x-navi-animation -.aos application/x-nokia-9000-communicator-add-on-software -.aps application/mime -.arc application/octet-stream -.arj application/arj -.arj application/octet-stream -.art image/x-jg -.asf video/x-ms-asf -.asm text/x-asm -.asp text/asp -.asx application/x-mplayer2 -.asx video/x-ms-asf -.asx video/x-ms-asf-plugin -.au audio/basic -.au audio/x-au -.avi application/x-troff-msvideo -.avi video/avi -.avi video/msvideo -.avi video/x-msvideo -.avs video/avs-video -.bcpio application/x-bcpio -.bin application/mac-binary -.bin application/macbinary -.bin application/octet-stream -.bin application/x-binary -.bin application/x-macbinary -.bm image/bmp -.bmp image/bmp -.bmp image/x-windows-bmp -.boo application/book -.book application/book -.boz application/x-bzip2 -.bsh application/x-bsh -.bz application/x-bzip -.bz2 application/x-bzip2 -.c text/plain -.c text/x-c -.c++ text/plain -.cat application/vnd.ms-pki.seccat -.cc text/plain -.cc text/x-c -.ccad application/clariscad -.cco application/x-cocoa -.cdf application/cdf -.cdf application/x-cdf -.cdf application/x-netcdf -.cer application/pkix-cert -.cer application/x-x509-ca-cert -.cha application/x-chat -.chat application/x-chat -.class application/java -.class application/java-byte-code -.class application/x-java-class -.com application/octet-stream -.com text/plain -.conf text/plain -.cpio application/x-cpio -.cpp text/x-c -.cpt application/mac-compactpro -.cpt application/x-compactpro -.cpt application/x-cpt -.crl application/pkcs-crl -.crl application/pkix-crl -.crt application/pkix-cert -.crt application/x-x509-ca-cert -.crt application/x-x509-user-cert -.csh application/x-csh -.csh text/x-script.csh -.css application/x-pointplus -.css text/css -.csv text/csv -.cxx text/plain -.dcr application/x-director -.deepv application/x-deepv -.def text/plain -.der application/x-x509-ca-cert -.dif video/x-dv -.dir application/x-director -.dl video/dl -.dl video/x-dl -.doc application/msword -.docx application/vnd.openxmlformats-officedocument.wordprocessingml.document -.dot application/msword -.dp application/commonground -.drw application/drafting -.dump application/octet-stream -.dv video/x-dv -.dvi application/x-dvi -.dwf drawing/x-dwf (old) -.dwf model/vnd.dwf -.dwg application/acad -.dwg image/vnd.dwg -.dwg image/x-dwg -.dxf application/dxf -.dxf image/vnd.dwg -.dxf image/x-dwg -.dxr application/x-director -.el text/x-script.elisp -.elc application/x-bytecode.elisp (compiled elisp) -.elc application/x-elc -.env application/x-envoy -.eot application/vnd.ms-fontobject -.eps application/postscript -.es application/x-esrehber -.etx text/x-setext -.evy application/envoy -.evy application/x-envoy -.exe application/octet-stream -.f text/plain -.f text/x-fortran -.f77 text/x-fortran -.f90 text/plain -.f90 text/x-fortran -.fdf application/vnd.fdf -.fif application/fractals -.fif image/fif -.flac audio/flac -.fli video/fli -.fli video/x-fli -.flo image/florian -.flx text/vnd.fmi.flexstor -.fmf video/x-atomic3d-feature -.for text/plain -.for text/x-fortran -.fpx image/vnd.fpx -.fpx image/vnd.net-fpx -.frl application/freeloader -.funk audio/make -.g text/plain -.g3 image/g3fax -.gif image/gif -.gl video/gl -.gl video/x-gl -.gsd audio/x-gsm -.gsm audio/x-gsm -.gsp application/x-gsp -.gss application/x-gss -.gtar application/x-gtar -.gz application/x-compressed -.gz application/x-gzip -.gzip application/x-gzip -.gzip multipart/x-gzip -.h text/plain -.h text/x-h -.hdf application/x-hdf -.help application/x-helpfile -.hgl application/vnd.hp-hpgl -.hh text/plain -.hh text/x-h -.hlb text/x-script -.hlp application/hlp -.hlp application/x-helpfile -.hlp application/x-winhelp -.hpg application/vnd.hp-hpgl -.hpgl application/vnd.hp-hpgl -.hqx application/binhex -.hqx application/binhex4 -.hqx application/mac-binhex -.hqx application/mac-binhex40 -.hqx application/x-binhex40 -.hqx application/x-mac-binhex40 -.hta application/hta -.htc text/x-component -.htm text/html -.html text/html -.htmls text/html -.htt text/webviewhtml -.htx text/html -.ice x-conference/x-cooltalk -.ico image/x-icon -.ics text/calendar -.idc text/plain -.ief image/ief -.iefs image/ief -.iges application/iges -.iges model/iges -.igs application/iges -.igs model/iges -.ima application/x-ima -.imap application/x-httpd-imap -.inf application/inf -.ins application/x-internett-signup -.ip application/x-ip2 -.isu video/x-isvideo -.it audio/it -.iv application/x-inventor -.ivr i-world/i-vrml -.ivy application/x-livescreen -.jam audio/x-jam -.jav text/plain -.jav text/x-java-source -.java text/plain -.java text/x-java-source -.jcm application/x-java-commerce -.jfif image/jpeg -.jfif image/pjpeg -.jfif-tbnl image/jpeg -.jpe image/jpeg -.jpe image/pjpeg -.jpeg image/jpeg -.jpeg image/pjpeg -.jpg image/jpeg -.jpg image/pjpeg -.jps image/x-jps -.js application/x-javascript -.js application/javascript -.js application/ecmascript -.js text/javascript -.js text/ecmascript -.json application/json -.jut image/jutvision -.kar audio/midi -.kar music/x-karaoke -.ksh application/x-ksh -.ksh text/x-script.ksh -.la audio/nspaudio -.la audio/x-nspaudio -.lam audio/x-liveaudio -.latex application/x-latex -.lha application/lha -.lha application/octet-stream -.lha application/x-lha -.lhx application/octet-stream -.list text/plain -.lma audio/nspaudio -.lma audio/x-nspaudio -.log text/plain -.lsp application/x-lisp -.lsp text/x-script.lisp -.lst text/plain -.lsx text/x-la-asf -.ltx application/x-latex -.lzh application/octet-stream -.lzh application/x-lzh -.lzx application/lzx -.lzx application/octet-stream -.lzx application/x-lzx -.m text/plain -.m text/x-m -.m1v video/mpeg -.m2a audio/mpeg -.m2v video/mpeg -.m3u audio/x-mpequrl -.man application/x-troff-man -.map application/x-navimap -.mar text/plain -.mbd application/mbedlet -.mc$ application/x-magic-cap-package-1.0 -.mcd application/mcad -.mcd application/x-mathcad -.mcf image/vasa -.mcf text/mcf -.mcp application/netmc -.me application/x-troff-me -.mht message/rfc822 -.mhtml message/rfc822 -.mid application/x-midi -.mid audio/midi -.mid audio/x-mid -.mid audio/x-midi -.mid music/crescendo -.mid x-music/x-midi -.midi application/x-midi -.midi audio/midi -.midi audio/x-mid -.midi audio/x-midi -.midi music/crescendo -.midi x-music/x-midi -.mif application/x-frame -.mif application/x-mif -.mime message/rfc822 -.mime www/mime -.mjf audio/x-vnd.audioexplosion.mjuicemediafile -.mjpg video/x-motion-jpeg -.mka audio/x-matroska -.mkv video/x-matroska -.mm application/base64 -.mm application/x-meme -.mme application/base64 -.mod audio/mod -.mod audio/x-mod -.moov video/quicktime -.mov video/quicktime -.movie video/x-sgi-movie -.mp2 audio/mpeg -.mp2 audio/x-mpeg -.mp2 video/mpeg -.mp2 video/x-mpeg -.mp2 video/x-mpeq2a -.mp3 audio/mpeg3 -.mp3 audio/x-mpeg-3 -.mp3 video/mpeg -.mp3 video/x-mpeg -.mp4 video/mp4 -.mpa audio/mpeg -.mpa video/mpeg -.mpc application/x-project -.mpe video/mpeg -.mpeg video/mpeg -.mpg audio/mpeg -.mpg video/mpeg -.mpga audio/mpeg -.mpp application/vnd.ms-project -.mpt application/x-project -.mpv application/x-project -.mpx application/x-project -.mrc application/marc -.ms application/x-troff-ms -.mv video/x-sgi-movie -.my audio/make -.mzz application/x-vnd.audioexplosion.mzz -.nap image/naplps -.naplps image/naplps -.nc application/x-netcdf -.ncm application/vnd.nokia.configuration-message -.nif image/x-niff -.niff image/x-niff -.nix application/x-mix-transfer -.nsc application/x-conference -.nvd application/x-navidoc -.o application/octet-stream -.oda application/oda -.ogg audio/ogg -.ogg video/ogg -.omc application/x-omc -.omcd application/x-omcdatamaker -.omcr application/x-omcregerator -.otf font/otf -.p text/x-pascal -.p10 application/pkcs10 -.p10 application/x-pkcs10 -.p12 application/pkcs-12 -.p12 application/x-pkcs12 -.p7a application/x-pkcs7-signature -.p7c application/pkcs7-mime -.p7c application/x-pkcs7-mime -.p7m application/pkcs7-mime -.p7m application/x-pkcs7-mime -.p7r application/x-pkcs7-certreqresp -.p7s application/pkcs7-signature -.part application/pro_eng -.pas text/pascal -.pbm image/x-portable-bitmap -.pcl application/vnd.hp-pcl -.pcl application/x-pcl -.pct image/x-pict -.pcx image/x-pcx -.pdb chemical/x-pdb -.pdf application/pdf -.pfunk audio/make -.pfunk audio/make.my.funk -.pgm image/x-portable-graymap -.pgm image/x-portable-greymap -.pic image/pict -.pict image/pict -.pkg application/x-newton-compatible-pkg -.pko application/vnd.ms-pki.pko -.pl text/plain -.pl text/x-script.perl -.plx application/x-pixclscript -.pm image/x-xpixmap -.pm text/x-script.perl-module -.pm4 application/x-pagemaker -.pm5 application/x-pagemaker -.png image/png -.pnm application/x-portable-anymap -.pnm image/x-portable-anymap -.pot application/mspowerpoint -.pot application/vnd.ms-powerpoint -.pov model/x-pov -.ppa application/vnd.ms-powerpoint -.ppm image/x-portable-pixmap -.pps application/mspowerpoint -.pps application/vnd.ms-powerpoint -.ppt application/mspowerpoint -.ppt application/powerpoint -.ppt application/vnd.ms-powerpoint -.ppt application/x-mspowerpoint -.pptx application/vnd.openxmlformats-officedocument.presentationml.presentation -.ppz application/mspowerpoint -.pre application/x-freelance -.prt application/pro_eng -.ps application/postscript -.psd application/octet-stream -.pvu paleovu/x-pv -.pwz application/vnd.ms-powerpoint -.py text/x-script.phyton -.pyc application/x-bytecode.python -.qcp audio/vnd.qcelp -.qd3 x-world/x-3dmf -.qd3d x-world/x-3dmf -.qif image/x-quicktime -.qt video/quicktime -.qtc video/x-qtc -.qti image/x-quicktime -.qtif image/x-quicktime -.ra audio/x-pn-realaudio -.ra audio/x-pn-realaudio-plugin -.ra audio/x-realaudio -.ram audio/x-pn-realaudio -.ras application/x-cmu-raster -.ras image/cmu-raster -.ras image/x-cmu-raster -.rast image/cmu-raster -.rar application/vnd.rar -.rexx text/x-script.rexx -.rf image/vnd.rn-realflash -.rgb image/x-rgb -.rm application/vnd.rn-realmedia -.rm audio/x-pn-realaudio -.rmi audio/mid -.rmm audio/x-pn-realaudio -.rmp audio/x-pn-realaudio -.rmp audio/x-pn-realaudio-plugin -.rng application/ringing-tones -.rng application/vnd.nokia.ringing-tone -.rnx application/vnd.rn-realplayer -.roff application/x-troff -.rp image/vnd.rn-realpix -.rpm audio/x-pn-realaudio-plugin -.rt text/richtext -.rt text/vnd.rn-realtext -.rtf application/rtf -.rtf application/x-rtf -.rtf text/richtext -.rtx application/rtf -.rtx text/richtext -.rv video/vnd.rn-realvideo -.s text/x-asm -.s3m audio/s3m -.saveme application/octet-stream -.sbk application/x-tbook -.scm application/x-lotusscreencam -.scm text/x-script.guile -.scm text/x-script.scheme -.scm video/x-scm -.sdml text/plain -.sdp application/sdp -.sdp application/x-sdp -.sdr application/sounder -.sea application/sea -.sea application/x-sea -.set application/set -.sgm text/sgml -.sgm text/x-sgml -.sgml text/sgml -.sgml text/x-sgml -.sh application/x-bsh -.sh application/x-sh -.sh application/x-shar -.sh text/x-script.sh -.shar application/x-bsh -.shar application/x-shar -.shtml text/html -.shtml text/x-server-parsed-html -.sid audio/x-psid -.sit application/x-sit -.sit application/x-stuffit -.skd application/x-koan -.skm application/x-koan -.skp application/x-koan -.skt application/x-koan -.sl application/x-seelogo -.smi application/smil -.smil application/smil -.snd audio/basic -.snd audio/x-adpcm -.sol application/solids -.spc application/x-pkcs7-certificates -.spc text/x-speech -.spl application/futuresplash -.spr application/x-sprite -.sprite application/x-sprite -.src application/x-wais-source -.ssi text/x-server-parsed-html -.ssm application/streamingmedia -.sst application/vnd.ms-pki.certstore -.step application/step -.stl application/sla -.stl application/vnd.ms-pki.stl -.stl application/x-navistyle -.stp application/step -.sv4cpio application/x-sv4cpio -.sv4crc application/x-sv4crc -.svf image/vnd.dwg -.svf image/x-dwg -.svg image/svg+xml -.svr application/x-world -.svr x-world/x-svr -.swf application/x-shockwave-flash -.t application/x-troff -.talk text/x-speech -.tar application/x-tar -.tbk application/toolbook -.tbk application/x-tbook -.tcl application/x-tcl -.tcl text/x-script.tcl -.tcsh text/x-script.tcsh -.tex application/x-tex -.texi application/x-texinfo -.texinfo application/x-texinfo -.text application/plain -.text text/plain -.tgz application/gnutar -.tgz application/x-compressed -.tif image/tiff -.tif image/x-tiff -.tiff image/tiff -.tiff image/x-tiff -.tr application/x-troff -.ts video/mp2t -.tsi audio/tsp-audio -.tsp application/dsptype -.tsp audio/tsplayer -.tsv text/tab-separated-values -.turbot image/florian -.txt text/plain -.uil text/x-uil -.uni text/uri-list -.unis text/uri-list -.unv application/i-deas -.uri text/uri-list -.uris text/uri-list -.ustar application/x-ustar -.ustar multipart/x-ustar -.uu application/octet-stream -.uu text/x-uuencode -.uue text/x-uuencode -.vcd application/x-cdlink -.vcs text/x-vcalendar -.vda application/vda -.vdo video/vdo -.vew application/groupwise -.viv video/vivo -.viv video/vnd.vivo -.vivo video/vivo -.vivo video/vnd.vivo -.vmd application/vocaltec-media-desc -.vmf application/vocaltec-media-file -.voc audio/voc -.voc audio/x-voc -.vos video/vosaic -.vox audio/voxware -.vqe audio/x-twinvq-plugin -.vqf audio/x-twinvq -.vql audio/x-twinvq-plugin -.vrml application/x-vrml -.vrml model/vrml -.vrml x-world/x-vrml -.vrt x-world/x-vrt -.vsd application/x-visio -.vst application/x-visio -.vsw application/x-visio -.w60 application/wordperfect6.0 -.w61 application/wordperfect6.1 -.w6w application/msword -.wav audio/wav -.wav audio/x-wav -.wb1 application/x-qpro -.wbmp image/vnd.wap.wbmp -.web application/vnd.xara -.webm video/webm -.webp image/webp -.wiz application/msword -.wk1 application/x-123 -.wmf windows/metafile -.wml text/vnd.wap.wml -.wmlc application/vnd.wap.wmlc -.wmls text/vnd.wap.wmlscript -.wmlsc application/vnd.wap.wmlscriptc -.word application/msword -.woff font/woff -.woff2 font/woff2 -.wp application/wordperfect -.wp5 application/wordperfect -.wp5 application/wordperfect6.0 -.wp6 application/wordperfect -.wpd application/wordperfect -.wpd application/x-wpwin -.wq1 application/x-lotus -.wri application/mswrite -.wri application/x-wri -.wrl application/x-world -.wrl model/vrml -.wrl x-world/x-vrml -.wrz model/vrml -.wrz x-world/x-vrml -.wsc text/scriplet -.wsrc application/x-wais-source -.wtk application/x-wintalk -.xbm image/x-xbitmap -.xbm image/x-xbm -.xbm image/xbm -.xdr video/x-amt-demorun -.xgz xgl/drawing -.xif image/vnd.xiff -.xl application/excel -.xla application/excel -.xla application/x-excel -.xla application/x-msexcel -.xlb application/excel -.xlb application/vnd.ms-excel -.xlb application/x-excel -.xlc application/excel -.xlc application/vnd.ms-excel -.xlc application/x-excel -.xld application/excel -.xld application/x-excel -.xlk application/excel -.xlk application/x-excel -.xll application/excel -.xll application/vnd.ms-excel -.xll application/x-excel -.xlm application/excel -.xlm application/vnd.ms-excel -.xlm application/x-excel -.xls application/excel -.xls application/vnd.ms-excel -.xls application/x-excel -.xls application/x-msexcel -.xlt application/excel -.xlt application/x-excel -.xlv application/excel -.xlv application/x-excel -.xlw application/excel -.xlw application/vnd.ms-excel -.xlw application/x-excel -.xlw application/x-msexcel -.xm audio/xm -.xml application/xml -.xml text/xml -.xmz xgl/movie -.xpix application/x-vnd.ls-xpix -.xpm image/x-xpixmap -.xpm image/xpm -.x-png image/png -.xlsx application/vnd.openxmlformats-officedocument.spreadsheetml.sheet -.xsr video/x-amt-showrun -.xwd image/x-xwd -.xwd image/x-xwindowdump -.xyz chemical/x-pdb -.yaml application/x-yaml -.yml application/x-yaml -.z application/x-compress -.z application/x-compressed -.zip application/x-compressed -.zip application/x-zip-compressed -.zip application/zip -.zip multipart/x-zip -.zoo application/octet-stream -.zsh text/x-script.zsh - }; - }; -} diff --git a/modules/home-manager/default.nix b/modules/home-manager/default.nix index f858d04..efa3ad2 100644 --- a/modules/home-manager/default.nix +++ b/modules/home-manager/default.nix @@ -6,13 +6,12 @@ }: { home = { - stateVersion = osConfig.system.stateVersion; + inherit (osConfig.system) stateVersion; inherit username; homeDirectory = "/home/${username}"; }; imports = [ inputs.nixvim.homeManagerModules.nixvim - inputs.anyrun.homeManagerModules.default ./programs/nixvim/presets ./programs/neovide.nix ./packages diff --git a/modules/home-manager/desktops/hyprland/anyrun.css b/modules/home-manager/desktops/hyprland/anyrun.css deleted file mode 100644 index fe9c0a6..0000000 --- a/modules/home-manager/desktops/hyprland/anyrun.css +++ /dev/null @@ -1,40 +0,0 @@ -@import "./theme.css"; - -* { - font-family: "NotoSans NF"; -} - -window#window { - background: transparent; -} - -box#main { - box-shadow: 0 0 15px rgba(0, 0, 0, 0.29); - border-radius: 24px; -} - -entry#entry { - border: none; - box-shadow: none; - padding: 8px 24px; -} - -entry#entry, -list#main { - border-radius: 24px; - background: transparent; -} - -row#match { - border-radius: 8px; - padding: 0 4px; -} - -row#plugin { - border-radius: 16px; - padding: 16px; -} - -list#plugin { - background: transparent; -} diff --git a/modules/home-manager/desktops/hyprland/anyrun.nix b/modules/home-manager/desktops/hyprland/anyrun.nix deleted file mode 100644 index 242ed99..0000000 --- a/modules/home-manager/desktops/hyprland/anyrun.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ pkgs }: { - enable = true; - config = { - plugins = with pkgs.anyrunPlugins; [ - applications - symbols - rink - dictionary - shell - ]; - y.fraction = 0.2; - closeOnClick = true; - }; - extraCss = builtins.readFile ./anyrun.css; -} diff --git a/modules/home-manager/desktops/hyprland/default.nix b/modules/home-manager/desktops/hyprland/default.nix index ef9bcc7..f10f82a 100644 --- a/modules/home-manager/desktops/hyprland/default.nix +++ b/modules/home-manager/desktops/hyprland/default.nix @@ -1,5 +1,4 @@ { - config, pkgs, lib, osConfig, @@ -9,131 +8,75 @@ config = lib.mkIf osConfig.desktops.hyprland.enable { wayland.windowManager.hyprland = { enable = true; - systemd = { - enable = true; - variables = [ "--all" ]; - }; settings = { - env = [ - "XDG_SESSION_TYPE,wayland" - "NIXOS_OZONE_WL,1" - # Gnome file manager fix - "GIO_EXTRA_MODULES,${pkgs.gnome.gvfs}/lib/gio/modules" - ]; - exec-once = [ - "gnome-keyring-daemon --start --components=secrets" - "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1" - ]; input = { accel_profile = "flat"; kb_layout = osConfig.services.xserver.xkb.layout; kb_variant = osConfig.services.xserver.xkb.variant; }; - bind = import ./keybinds.nix; - bindm = import ./mousebinds.nix; - bindr = [ "SUPER,SUPER_L,exec,pkill anyrun || anyrun" ]; - workspace = [ - "special:calc,border:false,gapsout:200,on-created-empty:[noanim;silent] kitty -e qalc" - ]; - windowrulev2 = - let - firefoxPip = "class:^(firefox)$,title:^(Picture-in-Picture)$"; - firefoxPipInitial = "class:^(firefox)$,title:^(Firefox)$"; - pipPadding = toString (config.theme.md3-evo.padding * 2); - in - [ - "keepaspectratio,${firefoxPip}" - "noborder,${firefoxPip}" - "float,${firefoxPip}" - "float,${firefoxPipInitial}" - "pin,${firefoxPip}" - "pin,${firefoxPipInitial}" - "fullscreenstate 2 0,${firefoxPip}" - "fullscreenstate 2 0,${firefoxPipInitial}" - "move ${pipPadding} ${pipPadding},${firefoxPip}" - "move ${pipPadding} ${pipPadding},${firefoxPipInitial}" - # For some reason it really wants to be maximized - "suppressevent maximize,class:^(neovide)$" - # pinentry - "dimaround,class:^(gcr-prompter)$" - "noborder,class:^(gcr-prompter)$" - "rounding 10,class:^(gcr-prompter)$" - "animation slide,class:^(gcr-prompter)$" - # Flameshot fixes - "float,class:^(flameshot)$" - "animation fade,class:^(flameshot)$" + bind = [ + "SUPER,Q,killactive" + "SUPER,P,togglefloating," + "SUPER,P,pin," + "SUPER,D,fullscreen,1" + "SUPER,V,fullscreen,0" - "float,class:^(zenity)$" - ]; + "SUPER_SHIFT,up,movewindow,u" + "SUPER_SHIFT,down,movewindow,d" + "SUPER_SHIFT,left,movewindow,l" + "SUPER_SHIFT,right,movewindow,r" + + "SUPER,up,movefocus,u" + "SUPER,down,movefocus,d" + "SUPER,left,movefocus,l" + "SUPER,right,movefocus,r" + + "SUPER,f,workspace,r-1" + "SUPER,h,workspace,r+1" + "SUPER_SHIFT,f,movetoworkspace,r-1" + "SUPER_SHIFT,h,movetoworkspace,r+1" + "SUPER,mouse_up,workspace,r+1" + "SUPER,mouse_down,workspace,r-1" + + "SUPER,1,workspace,1" + "SUPER,2,workspace,2" + "SUPER,3,workspace,3" + "SUPER,4,workspace,4" + "SUPER,5,workspace,5" + "SUPER,6,workspace,6" + "SUPER,7,workspace,7" + "SUPER,8,workspace,8" + "SUPER,9,workspace,9" + + "SUPER_SHIFT,1,movetoworkspace,1" + "SUPER_SHIFT,2,movetoworkspace,2" + "SUPER_SHIFT,3,movetoworkspace,3" + "SUPER_SHIFT,4,movetoworkspace,4" + "SUPER_SHIFT,5,movetoworkspace,5" + "SUPER_SHIFT,6,movetoworkspace,6" + "SUPER_SHIFT,7,movetoworkspace,7" + "SUPER_SHIFT,8,movetoworkspace,8" + "SUPER_SHIFT,9,movetoworkspace,9" + ]; + bindm = [ + "SUPER,mouse:272,movewindow" + "SUPER,mouse:273,resizewindow" + ]; misc = { layers_hog_keyboard_focus = false; - disable_splash_rendering = true; - disable_hyprland_logo = true; - background_color = "rgb(000000)"; - force_default_wallpaper = 0; - }; - layerrule = [ - "blur, anyrun" - "ignorealpha 0.3, anyrun" - ]; - decoration.shadow = { - enabled = true; - range = 16; - color = "rgba(00000044)"; - }; - animations = { - enabled = "yes"; - bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; - animation = [ - "windows, 1, 5, myBezier" - "windowsOut, 1, 7, default, popin 80%" - "border, 1, 10, default" - "fade, 1, 7, default" - "workspaces, 1, 6, default" - ]; }; }; }; - services.kdeconnect = { + services.udiskie = { enable = true; - indicator = true; + tray = "never"; }; - services.flameshot = { - enable = true; - package = pkgs.flameshot.overrideAttrs ( - final: prev: { - cmakeFlags = [ - "-DUSE_WAYLAND_CLIPBOARD=1" - "-DUSE_WAYLAND_GRIM=true" - ]; - nativeBuildInputs = prev.nativeBuildInputs ++ [ pkgs.libsForQt5.kguiaddons ]; - } - ); - settings = { - General = { - uiColor = "#99d1db"; - showDesktopNotification = false; - disabledTrayIcon = true; - }; - }; - }; - - programs.kitty = import ./kitty.nix { inherit pkgs; }; - programs.anyrun = import ./anyrun.nix { inherit pkgs; }; - services.udiskie.enable = true; - services.udiskie.tray = "never"; fonts.fontconfig.enable = true; home.packages = with pkgs; [ # fonts noto-fonts - # essentials - hyprpicker - grim - slurp - wl-clipboard - polkit_gnome # qt/kde packages qt6.qtwayland qt5.qtwayland @@ -142,47 +85,22 @@ evince baobab gnome.gvfs - gnome-keyring nautilus - gnome-calendar - gnome-characters - gnome-contacts - gnome-clocks - gnome-calculator simple-scan eog - geary ghex - gnome-weather - gnome-keyring gnome-disk-utility # fixes xorg.xrandr ]; - gtk = { - enable = true; - iconTheme = { - name = "Tela"; - package = pkgs.tela-icon-theme; - }; - }; - qt = { - enable = true; - platformTheme.name = "qtct"; - }; + gtk.enable = true; + qt.enable = true; - home = { - pointerCursor = { - gtk.enable = true; - package = pkgs.capitaine-cursors; - name = "capitaine-cursors"; - }; - - file.".config/hypr/shaders" = { - source = ./hypr/shaders; - recursive = true; - }; + home.pointerCursor = { + gtk.enable = true; + package = pkgs.capitaine-cursors; + name = "capitaine-cursors"; }; }; } diff --git a/modules/home-manager/desktops/hyprland/fonts/Torus-Bold.c233ce17.otf b/modules/home-manager/desktops/hyprland/fonts/Torus-Bold.c233ce17.otf deleted file mode 100644 index 4b5e08c0e5b080c39a6ccd8a995762a2b0cfb10d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 66632 zcmc$`2V7Lg_c%KDE?c-47Gzzecy|H8E&?L9V8`CO0@9_k^d>5b#$K=jBA_&-H)+-+ z8WR&^PmCH9Q;ji+Nz_@qYxbRc?@~1RzTfxvKL7U~I`__dyGKn>=cC1-f8paEmChdk__Ls5gJ)I zZPAiR`O$d;5qgn;ko@MnMZ;XfS~kPC@pFLp3ykuQS>pUo6GEl{FM1vt>>p(M#oP^$ z2j9p&6cQxq;%I=s4&M%;Q3)w$y+$}8M3^8XyBOu45<|Mohb;6d1WB}iRIu;-`y@it zV!*dHMiZZ)Z$Yj=??;eti_m;TxOFOWzC?Lp}C-kXCv-hXe^yBHaZ zO5t0C03-J&YDTlk4M_3-M-ZhWBhh=vh@6Lklk`u-zqhrE0Ut*94y6~f!! zJs__Sge)lg|6!b9k#k2NPea|uA^fLzJjhy2 zgkK^21tAYYHiY32MnM?;|81PO1Y_YnG>BXR^?F12Pwz?4rT`>GT4ax&q5%*r&{O># z2tNs-BMpfGrYEHRN+A7pq!R)ug7Tvv7~belGzfx{*v7vH5%p*gF$IyLA!wk;9^hU= z@c3Vbjz0e{-l7)huS?KgKd6K2uVsd}p^u0vH1Lh^9nkt#AjhEr1n5N~4`4gqpTG5O zNC){GNKQrr{*S+{K=(XH3Z7^G!<*2-cvnNPhcF-L;lfD6`+pH9enIN)LF9;f8JR$k zf!?Tsa1wa19oZ4@g09<#`Vw1^8951bl@*NBDX0gjg8Ka-{a0j4PK7@32Yh{y6|o38 z665*MgR}wNm4X~$UUDQiL7Es1B}_pFJ0cHa5b7N%hYO%9h665hLIi1fkhTN$ zCo7@;6G%>!ArY|v(iT8{w^2U`HpE)^27N?4g0izf4qTB1nFeXrh#@T@^b!IAaW0VW zLchI>MiFt)-*NDMgq+YT2rm#KCx8yzhK7SI*po}4Exlk)?T?H>Z>d419Qj~wc*8fy zkOKrul7O^m;13705Afedjz&(%QM4EMv{TS$#BZp-$PK;+0nA9R1lq%e zEl7>f-h=c~l878d zo&mieBe#>wA#0ZKCRQO=VkieH>w=edMG;yuYuQ{h0ok&o$QJ7O2<)nlY!TYe!4NND z{z1qV>?wpSiGH2+g8gWS6Hw;}L!3lLXpA8)LP|8w5H~^;T4ace(L2b;5SKuDjv+2X zG%7O0jl0EZz*B8VH{s(VL;wd63P&FRU0j?1`(UUcPJ%p6G{i-q@8%ieM%`e}4Wu$FD zs_lIL#7K?pG>s-G*vWQcWTY(*5N{h793LE)6ddHVSQD2RKS>iA^zq1kFk8( zP%e>=*>bU^!Ey0nnrK@AZ2lr!XJ;WAs!0gcL?>|>PNPPRjq;BO)+DTUiVO>IbsFL1 z?lyAdh%S8H$O%nIh#50%SPVyC2v1+2CJIeP8We+4Q5*_GAt)3jK=+@7;EJ4)3mOTr z0LZlkyWAfoqDX+YMbqG^K|v@Ogw+;Jgw#lQcVUR_IJn$N z5RZh^g^(A*=-l*{>5~1F9ho7;2lRzR5zR*TmfkZH3)$lhdnuo;TW6x#&bN;`Xd3zpRD0WZh0G3XeoCMZHh^dsDf(Zoz*72vZ3d>@i`MMxwOQGlFK|<2z@I-=+S3F(xa1)Za->x zl=*1kqv_xL{PjPJi(>B{YN|_t`olzUl4zhB2q&9PTV8z6Q2`W;#1-q;uGR7ah3Rt_#5hYP22?i zK!7%PKm$R<=7G4b1Z@@zBAkrY0{1teEOZbZMg^z@)u1+X27QP=LN|$r#Fxa^WDnvy zm}fqRISnHnAtLOcp9T{!#}Z?S@q{Pz*J8q-2qr>^2qKnPLu3*Ah&-Zzs3snero>ky zB5n|W5HE>82~5gK899J7CYp&SBtcT-5YmLu6Bmg~q#a3;QsOq*kNALSA$}n~CO#sr z5Vw#yXlDv$8&d=}0_u;Zf)IOv?1Uj-7zV*;Fv>*R(Yt6X+Ksjmuh1^kh-y(iYCu=e zej*0_fWAauqi5(_^eg%cy&^0L31LQ95N^aUkTzHJH?fddNh~FngN&>oSi*5szAlJ*WvJw~knkT8Lff6xagIVEbGk4xvwp67(6mMbw}>L>;{7&#nAa@&}C@i zUB1h;(7|GYCX}FF?1=u*>0^iq#8hGdu?)I8l!zx%iA}^FB9|zH#+-(M^Cj^e@dt@O zRIPv^E?}TcCg+h$$pA8xj3yJvG;%Wx(?jHOvW{#fPm}MFpOQDpugG6X42q?v$W}C1 zCL>EMtMW2aoiyn%;7yT}J zA!3aPBbkxHNNwb3G{nfwXspphBTu8bMvIMnjaD1Q8m%?jWVGEV%P8Nd#Hhlk)~Lzo zjM4i>H;ukBdTjKEkzOnon~Qsi`-q2#M~Wwj=ZF`H{ly{TSaGs=t$3?=zc@!+EUpos z7he(ciBss&RAk>Vr*e-Wo&Caz}U&y&3KgYc;lJIi;Pzo2OCEk zrx>p@-e$bVIM=w`xW)L2@g3uDjejRN z9le>}N$;m~=_0zEuA^J%^Yn-GHTp~XsfnY>u!&Cb@y;&%({*A%TyRqGME}6VgkT}L zGwM1qFf1-GF=};WaEg${!@d=L8_IQJP*^Y+Vqx(d;G17A6GP(slMMAl`3J^nq6KV1 zyerprVpp!~M6jfygChiVhB(-1hUAHHVbLK1mX4U~#DuU&Fb(-uc1B$%2??J3i~n$) z9HdF`4-5>BPM93%57bQN8$X4I@JtBh-&6RUZqX?~w||206d=2vuAW`&>x#N~@|+W% z0&o}7u2fe~K2>;fV36=;54`p5>e-#wE}osOc_SU5I$9|p?fL{ZdUkb*XBX35y2V`$ z@h(VL&#o?UF~qwixlZNV$Uj}D@lBt`rwDOAniw7C?BeP=t&N1f-2`^ZGx$xNCT|0AK++COO z%~~R~WJ&kdEfE;JglG8@Zb&cV30le*UnV@?>f~iz-vY1z)zQPtIwC?c-@VJaI(Y@3 zyqtfo=)xp?ck!`X){1V0`RIx_YFNn^TG=Ui{v0Y-{^{c1h0vepfsn^XyYgJS@?8Ai zB+2!yZx{bAV*KAA0+gV9 z19_^_lGZG8FRBfD@7AIVS5E|E}OB+ubUzLNyN$x$4nEB|y6^iwpSEj+u> zxVcC3g@q@d9vmIQBXJYd5`6N>(Om+l;S)4`J2c&Oh(>5cjF2zLQ7r$F(5WZm`1<0y zh#kSV)752kyg}#1^LYtEIbax1jr;I~PC0T(=um<}8VBI&BA6M5xSBatUGk;f_| zbW0YZZ_1@hVt09SN$lQ40lrhP-pouC+HZIXphEX{k0*AH^TaNm@`=KCau=mSG?_1* z+(A@w7q#7@Z^H0jg7ui(MXV4_qF;BqlK3%yj-0}x(Q#yJrmRRezF|yJelu?PFNQM5MS4DR{_?Qm(t;`qXa4R zk4!LV6o_^0I{HRwqBTH5RM+mQ_kcj}f&a@LRDO>X{lYD4?a>U_DvW`hm|WPsxC%RB z9#IziP?t<+WO zDJ+@H=$^DYERXzQc@zdqqeFBdEQ{*tUrdmRv&j^b#U>#pu_hTN`%H383QTHD?wI^w z^2Fr1NxP}7shjC&(+Q?iOsAX9H4QQiGmSM(G|e#GY`Wd_sOfRjQqwBaM$;D4tEOL= z{$%>p^tq{4ZXvgmJIhDNN6RP3XUXTwSII-`S6(Ksk+;e($S=xo%fFC6 zl>ccaF|#)7XXa$)ZuXAZJhMe+%gubvLd`U0NoHHk_L~)$RhZS7oj1E?_O;n#v){~K zn*D7qF*h~uVcyHUkGY-sFmn%cPxHCv%gk4q2bzbOYs}-#Gt4)eZ#T~}KWKi;yvn@Q z{H*yU^DE}p%ADF(Vp^z z(u9)8U77?Lt*j|7sjiMI2?>ph4Gk@htybgFy{bzfEw&^yL`bVq)1w&dpf$C`jyh8f zL!V=kGS;O;+eED^D9BJJS4SO;Ok2jBplIcRoZb5mSyv_%hHDbmg>F*OPA3JxFIe`vo-?#+y30Ab+=mUz45*dh(16Jdq&HeP&(T`ZO>@i0tbga_k6EQJYn z*j!4DZH?wrw5!jhFLN062+1!@=&{rqHFlGnE39qBHZ1Wy+lTGXD(u*y>_BY9l6b=P zOL@oY)b+>rmnAgN%FXyimZY_+yrns;!bi=zNxZ`&d{dbQLO4Wwg+}@ zJ62Y+M@7%0*jZBF$k3_VRSUKU9sAlEyE-xKWGOow8_oOUeq&u(o+@j*#C=)d=(zY@ z2SZhX2ct691!b&0q-jW(t*bw?=>r?w51W65U5hAXMf|aF6+2TB9-kNyQIuGz#xpSq ze4djP+5=2jBnUm)>Kfj ztJb$tRv9?{gqzJz6uW?(jjh=sc=;dSHncRU8)|noL{^4X2W=0FldVY(44G!bO6Gj~ z`;(8q#j^7i$!m_O@i5k1*%(vmt70uBzA-TY0i`j`YHTTKE-h_T)5?;v!p8S%!!nMj z+M??Al~tXn-hRrvMs^}>V#R11wkJzWVtcdb>Jn@bu6`EXxF*6nHbJv^+KPtUB-P53 ztG7jk$3H-q&q>JB zRBS9cN-Oj84xFg1Pg!4}s!l20TU33#YExPGF=*-!tcC+sl^-ZJ1wK>O*Lh^*ohak6JGv3wk{@nW2?zgm#m-E=`jkW)rSS z2~Jb95xPw&zWKh*sa8#?Eroe4bO@6!_146$T2&U?rp{$6Bv4mdYX#JWE9hiBnr1iM zouLzA_C%J&(`;C|vMwP%SQR7*N=yk3I+jweu9wsu&#za@+178A+a$s9$$^1I$#v>o zlKP^8hKBfpAhmoYwOl$PD0t?K;JQbubF(S0h!AhpTq!#WlY_An9*RZ3;8CiNR&f-^ zN$^Q6b+l+_?fPP?lJ(Jf5jN~&7)jy2KBbYZYV0RrPwJ?(DO+RrCRzm^IG$K8QwC?C@ zMtSPU;rg|$>}c(~mT4`k3jI<8(ozGm1F(lK)AERSb3$95OrA@L+NHylGpRj0_wL-Y ztLbP#b4oMUieL1< zol(Nz8LiUl;-bpRxS~+C5AOMwB!aQ~uxBeAC!?st`16 zh$JAQ?D`YxG^qA)%1g!Sr0n2_Q?N?aB55rvZf(;P1NEUyUQTxDet=(f#5Z}p?^HJ3 zau$vjS7vCAN7#gE62ddov)E`ctz8d;IfPQvderkUm83^YLSJI3HaMA<{zcJeb8BkO z+gzz$5wZ(7GFvxU=^Y;GrJgsDx-2~%UhS=tAEgvpb`jfy9l*~fJzzFj`25F)^DXL{ zrfm&jRlzl@)1nh(37X*OIW{a>^4+h$UU>LIt$1F^D73R?DMv_rBSECgHO=ZrlBRMH z=|~Xi%S>==y#F@!7M2iew&x|4*c9X(%!lU0>@A9EuxYNWXnR7@E#c+fv@&z^=FMBw z2c@O!4kab6%ZO2JknY`_xo@q_ddZzX@`^G~BxGA9X2)+{6Ys#fTfVz-^TxHH&Yxk? z$%;+Q;U!k#MS+`RB4BPBYPo*xyJ_jxX<2E9*Q#(&c1USt-KNUpR#nCOTB9mt^a)98 zc~MJiWRZ_LLc;c&IhO6UUA>(iPPtLE;;uG*62pG8O&OW6F;=5iJWftYO5Pql6#ucwr(NTv=QmSoQ%d21{FOHkYC3p<(f#rBLotJ%hcTt9n9tV9_of(}MWy1}2HT$E~ zyBvhF0)&z_490~NT}Q2_=rc9qs-k0sE!J08oSHChvH!f3z3EwNRRHf`qrd_sa6~I3Vw zwun?J2~3RojWLCxHa7Egrlj-D4-1FfJj!-sn2Off7K!cNN zW3qgcWb}GTO!~Tn_}ulS>I0I3Lm8>58#cxyt>1fKojN&p&F&QV+mV)+B8xAq-Ei9G zQA5L(>NN!kd1_jFS$VFm?%cWHy5-A*f|oC^4?YLOpOto*y4AYDlEuk!!Ko_0q?Di> z{~W)Tl;$I{$CWp3V>4^*hE!^OJ|*pC|#W;ljFu2!01}4dyTYmU(Vh`N35Ges{O*FlcLtERORmUflsOiF_cE>RQd4{3C0)l>7k?RSsyQ^BTsOa# zRhQVBU2qCIs4tGf_Sij{z(&{w>cl#1e+#RHPwb{Zbkik@&S$vQ7QHHab!^%yA68^Z z6Q{8oy%9U;(f1kPd$1=1(aOlYs13=XGP>PyB}FG`CD@jhyysLCh5rollCOjjTC-~-9>asZqD(dHM#L>`gB3; zDK8tk@Dqx*IE|h4`UZ|0zy>>7xtj_r`7r#JjocPB^N3&ptr8AQ;!FW-Mr}%s5Ej=1wH~mKn52Fd_ zwnGQ9_vYFZ?%$lgE_360m~u_n!O&r;*cODnuLYfuvdc&2y{jbgj1BZ5Nn-_1hltjm z#WIFI9?-VAzDP#viC25PlL;D2a8Ep#po=9f<;AVE@-Gl%SLk3)(30tp#MDqaSP~Q) z9~4v)U$3r{(Ci+)e%pPaPp6bz* z-+KN8VsPu#BfZFu@*wDAlE$*4#s*DsfSOJLU7|GDJg}+?r7fzlI~{q#Po*>ohJ044EgzSke#8z-)*-q>rwh_CC-QX0q6C7Epz@ca_xO43z4iX25 z{lp<6hsY)lqZ;tpID%@y)#xbNP85K{Yd%p3F0@6&ad3P&29B!5D3>T9%7{|p1aT4^ ze9MUnR8Le9mEf9GL(~!VL@m*P8i+>X6lx@z!0o6R9J5-%UFI}#o;XLGA zs6RL*T?7~34~a{}W!^FAW8xEV?f#Uw3eK9JfwRpuaK^d;PBu5e;pPr;3!I5t!8PkH zIAlHG9kaefgNd)u5OAsbn)n8skspDV$+yJ!XeapP4I_Tw9cUhd>ynZ@nr<> z^7S_X{%NEUxP}oV37&uNfeYCC;Cgxywh|@aghi3YXe4QZMv*J^C1&hx(x_ z;5;-4eF6?%L&1q?2)GbAgNyH{;7sI(u9B|gaI}|nN0Z4BXbO1Mj6|Qol?G383@RhX zksjnb8aLVA)@$!Xvif1R93&OkTF+2kB@7C9H(({F-L&H{2V zxrkgyE+LnZOVKoNAf8UHB)!NLq%XOO^nptYGe|!)6P(*_k^XSe>keE~_?!$P1Ib`; zG+s@Hz$L42GK>sGbI2$%61;mNz=voq83Wgz=8>^v92rk0l1bq6lR_qwsptzb4b3Ol zpu6C%_a(ZA?vrcDb>MRR039GR&;oKjI! z;A>O}Tf@uA5^x4ABFo4VWGQ))tRySY3bLH6K`Y5>aIgOsJd$e3da{9RLf?^%;8@S~qf}d;{ zxD`$W&+TxO0^X>R;1CuH+uQ!&AuA?70GGW0@R&70rRW4W9IC*nk3o6h!*!Uvh$JWt z+!UqYn7A61gEL|dICA=+Lf90KMdQg!;J$g8{D}ORyh2_jKLNk1&&ccKHSz}dU)@4$ z$=l=|v;iCeH-k%KCfbP7!6z&OZ2|Yj_2lQ^$pu7QMz_#+=r6(qeE*h#k|`n1!T@js zp@{>}%N9WOQq)J}BAO`*6zvdw2o71+;D+UGbl2!-qgUc_;zmhdNsi=*q*8K4IzXB! zEs?fJA4$KH{vaDITO(U5TQA!$D*y+kn=)){W<1E)!+4%?v~i~KA>(@Ei^jK&S!zCY zmii7{jMVg0I-K4>9|h;3i!?TwV{*k*1pDCcnjSJOGHo;c%=C$zkf+MC9 zm@PG12Yc0L&2E@!%^CA|%vYGNGtV>s(ER5f(jI+!EbYbb9HOV8`do=O+xXk~uIe z-etX?T8^~bXnDt~ztvT12kU9pG1g_)*KMRW!8WICuG-)}_I(=q-0t&vpZk4&W89c@ zriHnuvR55Y9apufE~ zy}^A4Cl3B#@Rvi-kO4z9L-r3T9`gRsoT1m9R8DK1PB=9=eeU$zupYxE42v9AG3>^$ zXU^lCBb>K5KX5U2v3D8ovf5?4%L!K_S0C5)uGOyhT>ltuHGItQVmC9lOt&Jpmm{Pj z97hC>C>!y$yPf+4_Xzha_b=REjx-uMc;v*9AtN`9JT~&m$Va0ljS3xga8&WAE2FNB zx;@%>bnnsjqi2l{8XZ4+`{?BKC0#%7GI9sBt^%6FXJS^v&w9wHB0 z4;K$_k93bi9%nu7d$8ji#*H8M?RYeP;{@>puL-#m{+u{+;*N>;Cef2zCM}#)H|fJk z&nDYUE}i_rl!a5GrmUZG)6?G5)6>s0-}9%b)KrJ5?@XODHFIj^)EiTuOtYFcZd&lP zjnkT^eLa1^^pNRWrx#9tG-KS1=ox!vT$=ICOqZE+XKtBUHS@<=cC(hwN}Y9L)@QRN zvo*7y%$YXFcTV)2O>^qzJe*6;9W-~|+?2W5b5G6vcAk9Rn0Y?)!sl(8mp|{+yc_ey z^9RlMoxgSd)di9TD;5+kR4mL}DT6ODA?DiS96ydAKl);i|JFCA`!|vCY+pDj=WP&AZ z-$hf{A!?mW$`1Kp3hw)o!TR>;%BRe=?V+$$_E_q%Gjy8jDI5U3e-jT;Yh_YAWbsYb zLB)QsC5KEs`X3|QX5GHQfEi@$h9+A_HL z^*(z>@tnif9mofO6c|x&LUDCmdC5_PZ?`W8L;F{%`~HEjd+^3)9d6S-<_LgN0_`hb zN&7O`?e$@y1zbAchHmLxEg!=gv5eCHJ!SA_PuN()rR|~0*3)9e^A@k;an-wvO0ABU zZYkFkjr-Jc-Qo1Cb?eq_UT5MkZl)%FOXTqwD}}ZwrgB?xkqkf9X}S72e0o$TEF|qY z4nX6yi`t`XDLhv9x`PF8fDJeB;7u@&y31HjV9!io!-n=Hb_@>H{lHZM$rjiXn=Zg3 z=3%+wRab5Y{tk!$tndQ}^fpZQPBaJfTiYu(P+H0BvE4h-+^|OHI`PIU(w@Sa*Yi7S z=;%Za$Ojhkd?&sE#ntfo#&VwT*qcAUqRdSt~1n)4BLPkmH#-M;m&N- za<1qcsKP`W3d?jL;gdIueu(S-(+Q3@b>ZgCn*b45BIas zI%8)=V|(E-MmOgaqgdSZwHPN!6pg;p$&3m&PGuCcbtNy9u#2=$T*2;>$hF3RV+B?n z@4|ui;#pPvs#j6p{{5$vE(V@#|aIri4{q@ zx$G$AYFN0&!d`dmDRr%+>10V$Q&b5on0LdG2nehK8^aPGHd*jM?8=&gvU;u!#eXRk z+WdmD=5yBAeAH*GrHY-v9SA`)o@2}FKmPfp?>WCRHSEF9z$2As3X@j{CMSoh2V-Ln zK&F!_Ss7sNC8;h<_V-UpSgDp*bJcMpL}sXN9v;d{u@h9cjj!%#!HMSgtg)$3otI>3 zFr_YMw3A`OtNvK>>fqF*2z9E&PZJv)To%^^Tlr@s)yI)d6rqrSbKxh-p$^ zmSD?kJc0gYYWYIu8^hLaBPjMY+TiI_N5WoE!4tVfxkyX!%2}>+>B_xM!NOmUdT~08 zQ(kM^U)xdJbVHPD7{xOU6sLaTyn12+YS$P(hhHM4D4 z(d=)3|NY~yun72cr939-xLW=V>vbFVP15GzA+Y!4c~_);j(wE>p_ou+4a3*=4i>R? zcyzovHK2mB8ba;MeY*EyZPOVmp=O!9qgka`g(>D2c*1=0cl&e~N^uwWV3VhVmX}hn zl`A4*Pr86 zJF?+aI}FOFcyxP(^6pG=_WC26v$J!vvP~R1_p;+lLw6^{t@5(;IUQFNzAZk+YAkG{ z-^L2oS|EVK3Hy^D3pgECwZQJpQ|(xe;jD;_R4Sgcv)>>~4HX(rt5kB1viUn^G0-w+ zk=6}%Ob2pDs&X$#d&X$TeutIBkdn#epV6g|M~vkn8+EDO|$$e&5#-O2y-W z6bKfKD!w=e=c?C#%fadO>Co740I%S|2fU6LM#WH^5IOTggrD*0y>!EbO3u9$C>p>` z!G~YRbR+BBOCZdNOV4{9!%^4tlA|x4OWCe-6UtxLqZ7xbf6Q=f$bY^1ZQ6wF8j8y< zdcB&XptWxtD|4Fb1*f@Q z{l~-Q7^(qIn0C2qbR z_;wW?GAA4kq=QYt$sCBNJ@v)wft@19WsC3=F8LDst5CxkuqgOJ;LaHo+jK9wi5%pC z%)P^9?AE>DM+8Qk&~4z7(%Du(ffdXL!Z^ZG@H5c9>k57b4PYZTSVM0)QEUx21tdyh zV9E(NycvnWZsZUBySDt8V4L|9nhQhUYu~2xNgq_&8 zA3ICUHi5H1rS!Mb=6kB|z=6d;gn-2hj%Ix-qfYZ!PPW34G+=oOY7Sq)P9p6O+CGyh zIX2?;UZOU37z3G{mJzbIaGK_4-Fg8=&^{Zvv~{{c018tLoGW;>zKM>VqTA`fJmRxH z>_W_j>c%@TPYvS#8&=(hIUOnf))M^SNMSE1S!Zw_NLsb3BB@b*BU3VMxzCvX9yhRw zO7R<(efIgYa}9|prK;+LrX8iVMU^}2Ln>ueq3=`;v4OLF2k@}-V*~LJ)&dUQhTwr; z<8kWyQpMjbafN;=u8G39``Iw=bcS(f%0@s-{(#;*j0fSJ)eJ5HrwHw(^9(zhEy1HN zP%HuVOm9PoYH4N&iMt`j|>6S)H;wQl`wN*mCtGtL^bUntu`OM+EnBtc=Z z-riNQ_38(by6TcPHD8$rR^9@`&b3>86WEf^FHnzg$%xw&`+{Wwpk%UCex4%Eb9GsE zuS>p_AztEvBAknd3}o0Zs=)rV6{a6pNW#4M4BNaS3#qMaY!`u0C>h`u3UCWxni>cl z@C?u4An(2oAIO}iZoU+1%jbHTwPusvC=PQKU+Z-)cgbrFSAsh?)azexhlV`1!`#H6 zc+4s|XAA>tpk|muV5!$%SnBoftovgD+FN&r!*va&k&NF#?VaKDxZ?3>uQzaT(?>lv zU5W=T#qvL?-vpp-y0cu__dzoQqrktCQ>>4HUz|zvEYzqw6`W#*7O;H{Kr;oP`?}gr zE_R-_@?2DMnp5$30z2#tN_ajBkPATd3VfU1qvxhfUcXHt!O%c`2Jwd<%KT~iG;ap8sPrFnw z$RI3Wxuw;4py?*gSwpc(_RR+A(O?b$YKN+C;!oC4D_=9vsBPL^cnE=QI1!F$cid@6 z;TSkc5X7~-zANKFm$1s9WOZ|{oew)am)dgZIzSkci{_3@1dty&M2Hm04H z={9N4b?b$b{Hdrf#U`*34$O_a%>SFU;eD?UIxz3R0#3Ud+M^u^2510pfC_121mpHP z#}mHuj__upJ!fq`3jk~LF=s>xu*vtUnXi6^sm{4w8o*S-D$0O~Yf#`nYH(+d2sMML zGy#WJgQ$!bbrG-#%dar$JYoEyJ7~W!AdX#umr1bbr{cmr70D%5$;IJ2V-o|yEWef3 zQEZHK+M?LREfEEARt53p+e-6gtWxS#9onqI#v%%{?H$mDmqLu1gUyEyG# z)$TZglHaZ3d5WxfIYXAboaylQyqv*$ijC!fo-p5M3cUYKP)@&razc#OkF%H+&+oF4 z9MoOrE$plV*Pn0J3UfwdsO4!4x8|55w0#b=34l$xrf>b50)%Ny)5}YY zcCVo4|2E^3z_4$GLiWN6tFKUK8>gaK#p^^K1nlibsw$JJ0(`ic)4-!&`|vq@b-YeQ zb3i9Tby7|tPI&zhpIv`fSSg#ST8@K$dvF0^ckq|UctuVEYj82>mD>iw8ZiRO@;QT( z9q{@9l)l5XGum=xO-*6p&a&hJtK(ZMSvz*c*rF+?7O7W< zBqeRv6eL>}B$w?hEUc}y4Eo?^!aWS>Mp5ts)z%@PU%jr2-^m8sDFj8-6 zcPs#P`1&l+sa?=Qfd@mWn-;rHt*EYCI_v0^PAb{u*d9#56}LV)T6rG! zUShLL(kg8D{hn%F^CqR;l)EoD!d~8Z$Cj&AE!X-2T6eIV0rQwoDYi`#9-G>MIe+p$ zF@Jir@&b>!IIYr#^UhV&=q~;XX6qgI)XN zFDZ6>0>aoE8;`}N>}Yi=`%pOsyl5nMih`CePY4*RmX{Q8NCx0pcpxB&$F3s$Cx;{s zTupTu6DjRD+*^9%n2)z_lFuadI*E5ojJHpzrcGTY!RlYZsyD^P6JbYUv|1iqnDje% zdo00yeu5$H!l5eBeyp6CD>(&To*|TKBm=t{E=Mu*+}Z(_x3lU6G)r+J}Og2HCe~mw~$GrAnPIIaPh4ZM(W{d)UbUn-q!t~{y-%jt!h!!8qs_@nw73DJdQE(UhYxrRXmUV7;Dad`g_B^&wE_|4g zw=QQ*j@8Y^^3QKuW213@u)|gC@{To;#fQ?SGViDYwc^ax!KFc`Giyt%6zMf3``hB` zWV!xxStut8SVA#<&+|QDWz!nfl{3Lp6RTaTLi<75Ehi2XjKbT&!$hq|-@U=SbN@@`J?vuMxlZO?(k*phc;w%{ z!NZ3F56?jxA3z%)eh<#xY>$83hEkmQxBF1(nYgdk8vLhD!_f2Ol!3oC&Y6*Sq_3bL zL$Cjp=dNDIPoMadFw2hAIdp@(E-8TjCH^@;DU z1E;^|+IsAzG~BaM3HNONkKN@_XisQv`#s&57GzmL$zaR$2%KnPMfNxMu-F<1;?}tT z$^mSz`__S3$ZRUyM#&44z_1(4oumMRhPFE{V&t1ZjpqHxfbSXDB=Mm8bfzf`Tp8;b zB?*lKKl@_vvp*^L*`Mt4vyXz^Z^T_hX=)0ugo`MEoV+PSQ%1QRgK$n63*0 z{!!q$pAg1-?w@2Qf#?1t0b^C%@lZAFj?|x`fEtd%LYTr1bgb62?i}+!g3VKoG*~ha zy0H>0hMjEKj;Mgm^Jg3lDnsMAqHtK3%`f!e{Eah^9r{&C2}}50X@y^Ig}68;x3t0<_CAElgw}SV0Y1(LH2AkfWp1UoC?~h1 z!kWJm(ba19p)@>CQ?i!ByA<#?Y&?;kYP~UYQ(9WuzCG(yDOo9*n^HEX>|c8{LzaW;+8z5-*E4Z{ zZSEMR6;u!EC8(6%2HWy$LF%zL8{40%XKucPLIIqKb)8M(61c@OSFXc(_E%vDc=4;? z=U+_bV7Nsvz$9f-$zTgU#oPF0?w{Dy>+QM)W2<*{Pk__mFZt!?bGR5Vj6?I;U5c;i zu3&GKg1zMi_SQn)-g>f_!6(?*NJ^#n^EupKY%|=YVlPVBxmfOm-FB+5`%Y~76P{y@ zFG>|p{-Wgdu;YfHK{1?V_Pzs9!)?Ibr#NbV;?}I+is8;9%uB$gNa{K40d_|_2b(xy zSCv95Y`5i6hmY@9D-y806I24Ga6R)8cL)gha^al^&C=rs+%ce{9s9CIT(br#ZGF2+>6`DJmhQtU zSiPm=JE;WoonUF~3v;N^jjp%RJwf#HORN zRve^kN^L%Nv;~H8o#oNyR6y%{bXDRSUpuzZGS%l`KvODs_+C4j#9?m(pVI|fszvP| zx2p$JSq#^j-+Jmr%a&0JzxM0xw$7BIa2msb>&eTUcY&VpUTA<@Dr- z+_gJB;m>6%Vzl0Tu8d6r1hoQ!_Lbb$4B^HpWw2+z(SFWJBi`b{A!uL0@7r`#u77>8 zXF3lSs=dpD?Htz)({k8(qlP|Mr&bK)%0 zF6P7-pJqqANk5kf^e^ReFR*Sxtvlc+2siF&ci?yy`chB!?zdW`J%yD@xXtPhDsyRR zedd{<604w+6&dk?PV6wtA$VAP!-~T}F;+n_nO>zqxDUJ3l67PKH9`Bm>SL_xV@@9~ zZNM}hV~LH~F(pA~*439<)tBx+t*MvESF6-&Kxdj!1uLlElYUXWvsPMtqh9gFkKm9SrT|=eSK+N$-dKZ4YPl? zjBW5b1eoOepD>*Fei8qlJBLg<&rFlP6Ye!-O8Dt}s%wVvJyQyzZ+)#lmPM#oH`q6J zg9|>TaMcNh_kNgYvS4@f5bQv8V1kJkmeu1xz4$SZ-|lz>G(LWh*K#lM3^sNurT7ub zzwBNfV4fRb+Bp~~&KioJggHj*!E3vh7bpK)VSspUfM~xs*--QeuM~l*px>z=81+wJ zD~a16eDQ}D;P?Ruc+s7JWKM+|pt&0ZNCCgiD3s7<{NV*iUu75w%Ht-z)4b+<$zA6D zH0)r=&mmYrmB6_qQVMgF1m>DyFu>2? zi`r`&7)9IOxqvkdu(pk04joM@f(tNT0g+~%;BX5d9iMLxfo-|8RNXzOuMO%;+fTg@ zhP8zN21YknX>f%6J_nbfdjQ9F0O5%>aoW|!2NwEZlE$j zJ63xW_Q2DC5YH~AH82L?p9El7P5|&@?KlpYwb4xzIQN*R8Maxfsl-fbHQ!}TI8NIJ z^4{tZ2$iP-V_G@J)MEKVN&`TECkcn~AgP0NL!r)A;7uyW8y+SulL`cwr#O;>anTJ^ zD*goaJbgn-1ZzS9TQ`D~q_&%HpcHNQS&Oa)cNddRc)*;FTiZimqdd(;m)+H3UQ7fq z5uoM8PY}pnGVf7!!@%GBM|v??R@PYup=~57X&q& zf%c_y?Ssrt+1D=OA)Ixqg%QBrYH7o^EL{CD!)mA^jI&afftA9w@PYPrEmOO%sJzh{ zZZsP1!^5p>(|+)9!e;$&FO|aki^huLBkH{p#hJb72iIk13RlUpmN!OT+H-8zk-dla z%M=faj~qC*;e<@Fl0AWA{{1@rA&!{a+-;kFa5*QigAk4<+E0c9H}a{&aQaxcuebu} zdF!VVLaAM6H2J~%WdHbC1!+`vd?6UX+P#b%MtmihP1RHmJa=$yM2hnWU(z-l0fuGl zVJCB3&EVLY!SVGZfIX!4^T7O7qxA@%(Kdj!6`7H)ivliJW&oQbGdMmAz=r^MEA;o@ z_&f)gsnaMGUxFn4%}Wx$H}(OibofD!6xDc-_I)K>gly7KDHPm{tmbY;HeK=pLOO>x zoLoJc&XwX7m?8;|fVEeiiKZtnCy4JvVg0n0MmdyQR`1DPZm; zWgWkFgeAWF%Rd4AK!-nBd(}G0;<)%#+tk~H| zq|KB(8qf+!tZ3bV6$KFG8K@5`z*xdkjLDP zqe1L&VDcAK6C5tJkA@$*`1fn>4bR1w8Fs;jbnwzW%j`(TanNke`nd2j>@Bq?YW1Br z?EhvsqD|lU-UCmc2|bj%*vEne4V`(m2;cAANFg??yHD` z+1fsa@!p05N?Ho6UYoG`x{1}-od;H5H``ZVcOF=MkqzP=nlr54q;U<3dxnXz%3v(+ z9xgh=LeY_nn}!LoO3|+Eb|(&;1qXIY3!cx~Iq+Jm&3~o@c+DUaZ__N%!DFD&cvB+y zIb{}P8n4h1B&zLP2dnNdR!Mqpm0B7qc5Az#QU6I641__b}tCzdPmr{ADZLCK917*Qo z$^wjxwwShb#Zt3uVuRyNRQ_g~5JE32-zT~fmJprqF?Pbhy;jo#wY*<;Yjyv*ohu9V zUo3Zw_Cca6W4Zf_9H6w{Z5yc}X2{$xxGMkgQKfE@+&e7N%R46$mb7}w_h;1{fFdn- zP1K70#O}Ss!I(o8q8S;vKc}Etul|b`iFG%&;4~Vs;2Z!|d_T5|y+h7R4XC}hNvl#0 zNK$WO%hIy8ogJ0*U~iMqWk8pD+g`eg9oJUcxwl~zD-9Zu8(|Ggu8SFzk<`0m^k56r z#cl47=tu2%bQCenVhh=RZIK;4DMVV#Vp(&AC~ZkCT|ic2B|8B9E)2tzN(&VzYZw^A zTCjahquU{m3`_Li?6*L>QBklhZ%1bGV;4A(#F>^jkxZ>lG5~Q|NxIUMYLQYutn#=@EL{{6Xm-Hb#AW3{n${hp zMY$YJ4r1xkUfECn2%R0AUA2XU#QSabS*lIho}9j2U%EXtr^JB{w`e=G;pmWrQvcYt z1M^ajjkt&NrQw|B1?_{TFlu*{?9-`4J>(#Nl0MYtKs^~=Mkbn(JGe^lmRuYv@8?FCIueg!UiRk0E+U??WYXUxc6 z!?qF1ZPI={obK1lNuO)VV|C3JzbJ5;bcuXm%g5&Ibuj#c_EhBshLe(R8QqrGZ#MkCnIhR5(lPxjMx*Wp=3+s}24OtcfVDL3JPZ`c8Sr zf*@928jod&$)H2Dyu+YFO50-jHl=vunD!ER-M0J}taXXa1_+g=b@^Q@-k1$DPNCX8 zO1>6K=R|2(uX$Cu2aIuMQdyG>#W)S~*f6yCTQJfQOO^K4GPE0arD$7P6PYgFM&|oH zowq4nhA^z}Fo}c^tGCIpSyWZ7!f=-9(@kW77rRnk zpsI4Sx;&UUX&{}3K~Kt@qBU01g_EdU$H2ylwW3u)72I&1_$oMo(Zg^kl5!)P_U1X} zdNAb%W6G^PZLOMj664p#J0>PMtqTG|KE zVxYfrT$a016`3_psT#-5kKC1_x7c07tV-%1afQFc>GU6R}xp}m7Ld_!#h97r|f)`{Lzlqzwa6bEZ=XaO1i^3aOQ$Xpum z%LT1O?EQO3L3=31vmInC^=c-s=4pv%+q@H6F&)Q&TO#?dXt|F;!8$rScuPn;?q$;* z52^t>9`PN;%!NT=YnNpQ*{4V3tRrWSCG58JUriCMZ!QwLG-I4VMe0| zx={~g^^)Nt`q9++VLpEP$^hp*iyY@T`2|MlS8s$IrD%0XwwL2Ve=lkcY7~TYWQC%- zB&(((FWOBfMvu~xcturldTmus`|nr<5nj3=%CJrGp}o2rlEKH!a0sc4pW(YSSYHu5 zt8|=W@BVWzK#PH(;idSfcz0=ON$g~u==F%-feJFL|NFf`@|CQJue5i_kUNwUKO1If zYC?+VVt>gE6jeHL8RB{>8Vk$zZqZe5F3WCqINQUyEWB#1Ztt2RA6Ey_69~%`L?!Y! zMdjR3|0TMmFKJx-mcfjtyTZA|r>Uv5tXW6g70tfoE;?0>vfaSS1#-=>tpMjB0b2Ei zIXL;IMVm;A<<#RPoVF>GUc}-72kU=GZSW3j1$Cr>uJqLxo5f{_+=9p#5xE9yABKEK zLjHpx-yro2`3?-_d21x1kx+MIm?xw~^a+V9HlBe|cB8xM7 zihQT;o(H8Gb3qHaR?kaXR-Q}9(#<*A7%`<1<9S7 z$@BevgIL?SRN2Xr*bnzDiK%aH(!L$$=M}D78W9_~%X61UO>E0UI7aHUI^WyV*@hw#0TZ&JsOZFeA_8X@Yrz-9fOZH58keI82JTLNJ z!*nLAOLiXl0c8@+y}H3Lib<~^=#s=<7V6Jm5}yQ18^D&&SxuS5WbILI8b(gg*4%TT zoJ?lI6|#bgX$~g!*Q%1SCBFRGS4<3Y@v|@5{V#XPN=wViT9FnJ90{ za_l>zy6vKbhJ8haGAKzI2pTtuKiiw!exdCULRs?CI@!9SJHp$@ekK#XGxpvPDK=C9 z>4AjtoOC3ei6iL|*uFiNtyJScT7CP|_IzS3OvOHw4TjllDLkO9mC}gBjAF>1M8yrX z80m&xhEbZ_-1PK~nJd!lV^Sm6uUKKB_6rO&FL8Z49TxqDF+tJ5$=S22UG-sM(JR(R zrp4H&#_ZXUmTsXg%g;CWZ#oox+z~4#>~6>)y*mA5_+jrxow`i?T6{tCQNy86voqHu zrs*JZc+Na2eQo9*Sb!7-O+?g|?T`zOBBRW=t=JqD;^;;Dm*SvS`T+_Ta-t?F=0aDJi2m`K+ zwhK8=;~302;ffZOI*>dkTKtF&UwcyREUXRGummoREH7Yoyo#X(J+^aZQ*>LVu%fd;sycUg%*DX#$zIoE0 z3>VFQ6LpXYcj6c%W0;By08A-ALlnJ;TtaJ!1+%qoMErIikS*- zVdi`HE6B(J*Tga4VAnzD1_N>LhaJ!)=x zDv98s#CkMW8SYDwxdv{8R>eFQK!!BfXgnd!xAatzUT3;N)=FcplPI=ho|Q27NMmbF zJEp-*nncCd#Jd!gioBnSF!aLq9+b~s@FqhsIJ%I*FyKc`J?kV>&;J`s(rQCa*rCAl zNzscV%sKn6p*$eTMUW9dxugSctQOqEyW|v`6~9l z@pX_cWL7(k40$KhzUnr{XWD`mKc-?Z$#l9xb~mi=t6ZA|Me8mRhV`a(@?EJb8rd2(43`t=I=O|6 z6N9JYbvt$RV*CoxCMHqyi7!HuimTm!N>N&+Wi36#MwB~bj2PTkxdxZvdK$TgFH(^o z4!Q>~#^VsOL5yJ3B0#MnL|ddicYtn1$#k~u8ADf9Rbm8IKP#=l8pl(bRIvp#=R!IRS`kphWoiLGE@ZTpBTvmV zPZSNboRX9afOeBCmKJK)7CwS$(k>t3QkpqZ&6aE}zlqOu&fSANlVY^87&l0*w8;BO ze1>KaT8FI6P0|u?(?JeoqYVSMD%IhCGgED$jy74URyUJPrb_B40thi~?2`zs!&-4T zhQq-i^y5Q>?z9uSO>pCp<^!6FsI?fwB)WPm>N6d>-Dm@ysw(pGNE!&N%+<4`TAy|^i6N6hYc3-vzl5ZIS>r&sY3 z8G&a*fe5xaFFlh%KKM>zih|m4@BI&oD>P9kg zZMrfgkLpI=$~*l9dBOpE6G%p&g}X*c)g$Y)(SWNY>!2$*Qpb+$_r>GhN*7jXG4W^z z`{HRsVCs}8W*lO~p%8aT1H*15uZmqLpE_+{W`bgb;n}|(zV8(&^BPcGwD|UpXo_Xx zA6B@}Ptewj;NN^GVe)@gbf+qk-2=KC`CIE>HZ%Adk~HqnzKnJsBqrJoB#F`Wi_+br z?A@bQxMjQIXyc}xUuwbfQpb{ljFMD6Y)IeCYFyFi4!z4YRP|Bq1x3zNmZ#KJtz!*q zoFD>u8QP1#Xo=4{jC6lt)a@h^Sf}~@*AK`rJz2`0mvHu_@+23>Z>ZQ)GiFRr7`m60pQA4KY>be_fKc*u6hKd;@ zjRRD~*PdV=jac0F*(1^$hxBl66b~)SebC~-us}lRA%ROM%f61X+=7uL2nC1FB&uU5 zf=JF$%+K5QgW@0UB@iEE5bf?@kR|QsBw8HVp6d>x?F^E}1u8FW&+k(-&gFXp{+8dD zjQrh2Pt!K?WcUY0{)2c9BRZZ~!3v-|G%r=9B?*V1wCSC@B+`1#;zg<@4xx+iu z-ZMC1PO&es6jgSjt=QeqcgGy4Y*vL-?x?J}{Da-4Ar(ui6D#tduDSDlU!4EDpcP($ zd1wA^>1y0BW3q{qC%?__~#iOS4?!CP%sYFL7Pm=u$L! zk86r|M7(RfN7l0XIEybrs(ltXEb#Cd8=`ZMi&&QIk?dL-*_d)7qouf}q0X(z|HSg9 z*vhQr#+`MMzb;Sz^$17c?PW5(q3ojzL(iaiV94+13pkG*b)c33-;x#k|6k=tw8K>Xf zkK*>#P1^Ps&>_sTBk6!;GI7{Re<;;kN*8JJylYaJYyEK{ zP0cj3J{(9>F$K;dR8$Y)`uB+mkm{R zZ5L?>RYmot{KB&4mZ2-%hHP*9jD|2()QMCTbv--pb!_W7R!RID@pum!Su5&C)9ICg zF}U$K`x6#MTp;ED<&&~mcN^k znGk>ng=AGXXXZ9Er9>>$Kc(=^3NI8rOWgt-*{2LsOBYl5&tE^0FW^qID3)xQS$>8Hs3pS~J1fB`{FGc(ISq zdgsDG`!c`A^!%)C+mm;0+itOK%eHrt9NO$)Xso4_T5+1Exaw3tO{YrOfSg%k)T+Sk zPuwIoGk6nR+3YL7dDi^gf%lI6>Ogw+z9|kA`}Z0u>b7gbOTL+0Ut-gU$9JT>-ptFAh;xyj*&k=I4LA>&9{K*lP&e1W&{+#YcIEr)mlZDC z=qcvvWj;U;i?S@za`U$3IUcH9I%kHP-yH9Nlx%;!XR+@lA73AzwO-}k7H+j)`+p4? z*6-g!KBjx_yl9P^W=YVK8;`YATqGL6Gq7(n0J0|1sM)?dZEL1uZF$(7w_LraKR55= z--zv{lSE#ve=j|wFtIwR+CR%F$zp80_%0;(TODBY%n~-+UdDxM`PZP|WAtaD*}O&J zzG1qUh&6$`!gq({Y)ad1p&D%1iBhH*`Om&;GBbo5zSmT(^2=M|D4vo#!%!Pe((zK0 zmt1sf>l@{n>{c0JUlZPxnpI2QF|4)Qp8js;TD*0%nr0gpWO4lDh@)fLfS!R3m}gi+ zx@`z0x1bGPRj> zEa*L_N*x5`g`}&dIkm3i)5Wz?)W?%|Wc zzmy0P5B9wV)qxUd)vTr>qoW3yX4Q%nt0Ntq{mYt994z_Z>%DId5POZBE-L->i&if8 z*}i!D;<6Pjn=O9bL6+YpkS~uDc`$H-s1q$;gaU-k#b=4-{`$1?0$pa#=AxMV*sSI2 zmM1~zcGxJJ6wm#N_3sT_mFv^$+Wx#t)<1pT#f?4hq7vUV^!|#B{G6{MT_8@`Zivvl zDG%1>N2LcsCXsE>9fJ6btc8M<`oblg=l+C4*RSEV9zvCDgZm{TSAiv#EqVT%v1in0 zp&n4<3F{@RmFlyfDV?BuACza5{kV%>nHYw5oR5OFeIIXI29Zl89t5_+tH-1I( z%e00k??K8dSAP`@;lu@+37x7mGvd@GBj0F3Bmqci8D<89UE67-bqQ%*{7m^lDzM1b zLt5fQbMnVnLpGkhsSpQf)OW`sb zy%)N?U*GWlLHC9^bKKqL&Z&2MA5~E#_K7e=(fGKkMTQx6Xb?DOE&_pk@O>cb)n^fv z64RTAv3HoHG<2%a1YCz8Z=-AWq-IekU@6%@4aXGM3_PjOT-bWXu7B#6kc}&olbV#_JmUscvbKkz2YQ(H^(o-_(Td%C1Fh!I(h^lX2K;*t3eg9F0 zF1dD9se8IhhR^cl?iNd8U`EiAz4^1QjfBiVR-1UYEFG z_1ZN$^^J9Flh(zrM^C!UDp9KX3^eKqWHf2!kCG-c;z34hzB+O8@>f$&jvhUA%IFtP zO!*2mF$WI;{bu~@%2r(X`ex=$Tk;Gv6XH44>m@^`W^T5*+U;Og(XK5;ak=)fdHy>? zqgEW$@Qd7Nsxlrh!UrSfv3H9vOW z16H**XhaS3CK|a4kL{Ub{iu2tJGY&i7nvEXTUTkkcQ0KL<0a1WDFh~51gBwu!8bsWpqw#Q|Md6g@vEpb4akR(8z$v;Y*9_PC z<@Hf@d$JlVN=_Uk)?}Om89$TQ`kl~4GM|6E8w)O4%5 zy)88pjdz#4rX&wKW_e3+Q9Di^wR(3J-nvu}-NY6sODvXm#LbfDW+W}viz>yq#-PKx z<%*eZUQ_jAFU8{JiJ?$|kV7m0{iM<)O`tp^VP}cnuv$^Fb7!8ekXTX++^QLK#qRpH z?FzB`5f_3dRNzfxA)~|0XeRxGot=wAn(;;pQ5|U_-Svj;3etVXL1<8T$~!^}<#{`? z0%}{W@JmPt(W!dgLDk+fGrT~`HTC|5(Ejk1yZHyYyBFgHLE;M=w1xG0)%rWyd_yTr zvQaEQV6{CVck=^Q39t-L&{x@jMWXL$Gg@=ZTI(cYuDW}w`)I8yc_Sm%ERG;n{82-) znc>_(O;vD?m#)oD?iC#7<&_^=r8n5gtMYTJ(7TU7HSrLUp`~9Q%fX`bsyCFXdF_7u zm+gM!2jYm3Ijt^{e36m=^5tN&219ck6yrt5IO^{nNr{*u7%se_G{q2)Nm01V?NLM` zYQt8>+vU1DrObAmH7_REO&^mQmgBoAEYv9=p?9SF@D%7P!z4ONBq^pD4Rs01OxJ&Z) zlyA|A3dNGNh_nI+>;vyc=jRCaW*LqJ&Y!c{uePMm{WKY!@_4bqFhjQxTklelW! z^L%5%y)A-cB9?nQI(e5KS+4&=endM=zJAAs9UFGyvtx&4-|yh{lKfakd1<3#QFcsF zw!Xk8du3f-L;lXP@Oq1*ey`P!a1=FzpAnz((}%VwQ|0RuHzaLH+>o##F~PELOp7v4 zF6v8u97;5f*S~D~s6?ODm{8%FZK0YY>M%R+CVeoE_Tpi=3i(nP&T7ucn~U)JTmW8y zd;=P_BZp9p+Lsi8afuPS7&=tAxX^(lPfqwxP7+Q}q6x2PDamWu>z50KG5&=7Y)z^|6)NS&#EjCIxGsLb@};jx2?BicF52f_Gg*f}DL@*9@7PzwXeceHp&s~0XIVdD$U5LILmw6QLz&_1xhV?#gyE>g+tu;Gve6nSh246+Xj+~83ZfLn3Aod^&R zu)(7s(7rIJZbMNK0h%4|K+B2(>NXS>*cTM8uL~@)P$lmoLz+p?W-^3_BFPZCW$mSD zC@-&XSXS=lzHFJBd-*ctJWaIdoH;Q~%%)fk^%9o58^uy3Un9MKL!*((W9X-;CxX`9 zgD91CdT~vcI{fl*$1kAXg`B+4$2X09!O-qzq=1xaM0fE?pYX&b*}nGKzBP#zS@4}< zSCEmCp6`$smmZX%gH_KNUfG_BVLtYeKHI#?!Yx217bIXi0MeFH4HkS)mSu0NiY&7a zEA!mp6)xtBGwgzv$3=%Y1gAt7EZ30&aYjW%&5rC+`|Q%h8a(8z8oL1pz@vyIPv#RV zvtLP>=BJ5ruiW6us@(i4-N!#E=)6*i`9?qJoV+SD-^)8R*h@EIkOFg$H=BFNDRGnr z8((QM3aiqSQ<#i$s^}!8SCvClG;lf@h~to6^f+YD7pdwjL#d&MX7Sdju$93UA#ri5 zq8!z36N0`IZ5#*9oIN5@zs5Nypkj61>a?u1VvD?#R6O3M&iXWGII(g3zfb#c zVh~K~bsj4EOW&jLEB} zl0xYkaZebOupA(c(jh4ZTq zVFP`F`_k!JsKURh0O1!ue(UD>qgCg1(8vWEiG)z4w+ON0Nh&aVmN@=EdfAqc5%VEv zupxtRYJCzyL^U*r=fB{VxhyvX8=ql*GhXZG0IOcg;Si7v{o{LLRgzG-B1e}`pR#Lg z2+Z}+_msOY@psm{R)x=YnB(m-Zv5ir!^id&)TBWCQMxlHb$zA9`WDyi)egC7+w-$` zuU(g-Ye*`|*jcrsG``Fy)k1wIImBb9lcQ=a9_`~{WY7Kru{R^>Fn8o37tLOLK{V@k z_LZOG^&*T_76jJR6c*O$T8AqzZY1U}bq2nWZT#NG)r0xH-8&RORVLrzh-AcgQZ-n%kHk6OpSc4lP_&US3(TraYw3 zqSD|FYN+>A=RFqj=vsgrC#{!0qw=<`0D{wFa24=08Md7)wg*!U?l<(bFR^FVw zCn+{nuUbZqm6D;K@4s}Wl&>oP@!P{+|5|QFDqHIy>Fr0Y$@RL`8xME(z4bd<{Zsw! zh<){KZe2v1k(Y7g^u)JcqrKUD`#kJ-J~8qI(MC_qF(AZctjvhtWs#kkl9%sr+`V>+ z?iG1(WMr^jbW#NGiOkQ-+>@`XPFAGuj9OHp-yK!3X3y?DDO(ETvMlf(q9$N}kvwxp zQcQGWLKJ#(&sMV^Y{?V9Y$3wNpVenury3S%0*Ie^!P2r_o9K6{# zFS=-peIcrHZLvk$*JL+HTPgR*(^8W{^;oR=?+Gs|-jiJn3rLEa(~_s_u%(~hBLX;C z@}fPNg@uus0oWldHR!)1PkqN1d{1=Wn~@m?z2=A0XKvh>bY{qqNpB1tdisqY^xt)H z4=S#!Ehwq4FYsIJ5#;Z#SM5{Y+k8>kx>-S=h1B7vSb0%NDy5%oab0}FLw)pOKK$}c zDB?sz)LmkW-Zl6x9!)WPtC@C|SZQDXLn+3}eR9G|O0sjxbR_ne;wqN^6UqB`f4cie z2limiw4aX2uPUeQLma0+l!K;2(Mh}De#HG!yah)7M+2!{u= z>qXB6p^w{2c_n@!WsVHHVD|X~c>_M<_kDcIaB%~x^Fmblw^EIFXEk1i3jd8&c;|ex z3MZ&oRJb^@l~yd*OR89Ms-tF21vm&^liwJ##nUFfoB>rg{xS3q^^c^53hr=@;+rsJ=7h z?TU|&H`ZN0pobi{?!zk%Hx@#%QK$Y*WNl0jSr*TxUwm*4@|YCOhzTQ)-$ zC;LG5rJ2fXftjD#NwcraZgtUgvF|dZ%SgP>xU@@hm+CIpyZqRNn2$CeWA1ETXa14- zIdf62mCuzgk}r`*%2&wCEff}Zc){_M z#pSNgb$z|-tggGdrgc4w7aOlC`zr@2M=D=dy1~Flm@+}R0gs*3DZfhUH9kn`Z^_kT-R^M6OvJzEhDjStX^`vT$ zYK-bN)qGWuDnb>lic=-2(o{LBYSkgtDb)ql*D7MoS$DNoS=(AWTKBf@Z#~p{g!LHf zan>`f=U6YYcDMGoPOx5Wz14cBb((dyb-s0pbsgT4{LuO%>#wYTu>RGCvoW_(+Su9X zYzEkjuo-PL)@G8;RGYVLoNU}|JZ(a4mfNhg*<`cJCetS0ro^Vgrq-qzZ%>}IIcM{Q z%~v+x+T5_YW7F16hPNnfyJ@=(=r*$3E8WI-o6>D=H}`H{nt%Chnsm#&d9Pi^wRA!A z@MAfzX&?2dj-WZLyfE3WFr;*2ZedRTnzFzgJX~yggV=Oqxc$2DKQw`oq5S(B8h5VO zzSpFep3HdM%Nvh-RAsvI@oI6;-+mEF@cn+jM4s1mD8Xsk?KnTq(ypEi?(&cgW#M6i zgpaUu2or>2h$0}s>rLH^^-Bw3&3EEZSV~ohFWr2T$Uoa(S&*jNx?U~}mEJhnf%mGV zTgU(E%5nP*=1$ku1&wp+l9(8mzOY3&f;5|#CHUreIePnsElbc37aIqVw%8`Obe9-= zmzW5Tv_*IeFTrl<&eE_d$J)ZI>fQS5Wb^m1SM9mGFrvn>sx+q}Sx;UvB&4-O)VieE ztNx)KOlAaAFQ5kIE4+MtCa>2`TfZb5g?BcC1QyCh5( zxFRqh%{kSrE~#Oc#nrsCSBQ-R`C+G0TndBaBjpXHMRoPQMQ$*`ahoiDT`N55O&|Jh z(!Y4qN8^&_8XAW;-Nie0&yyze@M;NM3O z^(PHwr8)YoE9Gzd&lD}fLpE*m*LiObcqhg=&OI}kWBGw^W~{o2?dVySuOoStsw8K74AG`byVm3Z^S}bwyaqv_{zn8lV1{htk=WSG+Q@)_ZKDkt}S}VLk zVpcY~WTJt(#zeYgxWb6y_jX=T;VgHA#G))&f11qtNStN9Y-d4uwPSgHMpdd_@KG)j z{GkMdnlQ_cMIktF7lVjeVevlmouHVk6*?>_4J5enign(Z!Umi*G5bl&$~-pu`&fj8`K|DDoZ$AsiQ|nQ zej>DAsS^iDF$9gjR-m`d+V6SMOI~^*U#b4qSE)Wq4St=(Rmg8!!i(2dlv$`h*@GWK zL&hF@SSO&pcGAsF(F%%1Wz)3+%of~yz~I59c7q2uVYc8>ky5~me`E3D-}yZrE(-!Z z$LS;Gi^IYeFU|?7ZOrpqlA{->l%_w7bPmgdj-(k8TIXr#wSRpHV*rc*=nSLVZfSh4 zL^p-!xu@AzrRA6GD9k!wx4S8{&UKe-if3r7Tj*@NWw8m%{T&zk2jPS(u(o#Ba<5c< z$*a5FYD4Oi@vulveM}1)Syk4S{b999DT~i0?ut)ekrunt;={_S!;pp9ym(!F8uyxE z^PFCyK)krS)h z*ZK`yI$E^UtEkD(fn*zfk>v7i%_8ZAl^J+pCAF|Dv#y1{u+kh<=dx?Bc2-ze=nO|^ z@~Zp;EqUd*;#{`x!Yum6N;=+Hso!belw3&PSP{h0ZGKW?^PjCOKB0_&Kor*~3Z!~4 zMBg^Cd`X&p`D0lg7wPTjN9y0ld!3bvrsS~BJa0+PW;_=c7+zYXH9b1=CI&`h1vQTk z(_FTKnc>(tZJSEGp!xRL(cf-QJ2G-46(Am;epUZ{7r*G-=9cuFlG3!WMT?>#IW)-H zVt^<~8YM(X8U?&wBxw4HUHpBwIhTjnmxWbtD=2|R-e9|3ySJvNJEX2jU%6WcRlOlW zrHi-vgxdQAuW~K+wGbA0Dg|-i&*)DBT5|In-qi{BjpD0g|E*d4{r4@qN1H6Wt7Bmp zAFAv^bX?NQQNfcE3}xUU>wy8PVvzVc-{IsX)@O$l&hk06z31*sP< z*9vEo?!TNS?9Zxe){DRI(FnCz#0%}0_fk79(5cgLeeWY&p(|;>zL&AFYI8yMJNxV# z-wDf|?-(bCx`-JB0^;+e>(dZ6j``&W+@=*YrJ>nAI1c8lqsb9Enw-FBaY)f8t}rResN5$4Ui z{cBttLn7m&;`Kt?N`-(6FaqpbNo#I@iDZ9f;3tC2c`Y8~r2BN|oGMc`W_t>6G z9_*{3dtwW8m*lCNRHlVl{sCj}%>Fv+UMo0?1H~=_AQ~TZ3#JhV)KqTUk)f+sa0vn zWO*6vtI_tL7bo9u4;U2dltMN(6+NV>JSWm#SVYyK%E~d{`zs1^n?BiJ897!b&h2z5 z74{nj4LO24{U*zpI6)x35L!M9I~2uake~?BR;;K^Pp&Kc#coUPs*K3(p*zFYtPB${ z;`ZovlfIMGgNy@@CPEFJK0Q53=&%ffk+|W{E5bLBM|6?Y+3D-tqjHJ1lzszT79FW0zV6R#aobu{=y?C@GrE&WG$Xd5n@V_sVJoYRnO-H z%~ZMbG9Nd$a^GhC2`HH2@quM!IQDGO!l=?&;q|31<6rhZbnIwV%c(6oG~>ZypDD07 zMb$2~5H4dSjFoTTN^S5fxs=djDLT0b3ZLw-QYN7l=)(b#LPq+wJvj~^xR$=|v~)#4 zl#bTnKnk7_=&O=(U@9I`*rydH>mJHWLRn5W9(l^~(F@|6c-mReOy9D& z@w9`mBevnSopBbzbJ~0X?|L|h1B8smhz7TGWGa4tFl~-WQPSv-C=?ch@ z1#C}jVf0*P;Xa9{2nGQ;FC$8Ub#=Wk*6G9Z!j+^WO5p{i;Uz&_j74K_!+GeJ3v^{e z&`;_8w?zW#P%o4O)a%)~b&)`?#V)1SVv7W-FVNgf^#ufZKx9;4;GU==INgf;>*|Y& z8+1Y`jC!D;m#8>VP&E0Kxw`oKxafqcyqt=P5S*R9EWrHM2!X>t9v@45#&YqTjI+S+ zh4?sg34lr5JwPKro#Xjgd^O;2{O=qu!#_YP7`}_uaAFic292B_*sB1Q(klG$@#oBeQHlGV%pRRJ-NhL)8FdJZJJGSQfJSa z(vvGNQQ=YQCroY`XT{l>+-4|^y~*8$v*sL3Zgb9tb2Pc-TsQ7XlUu>ra$1wyf>R@> zQZBo4-8sFiRZPp+4*XGj2djKQ-EUSRMW25&HUi$Md0Jjb8~gEkD>`MZbs@;w9B^l2pE^AXB z>h@wc7qtg#y}UX~`tH7jlY@PH-$YIh7V>>7IKE$;6oyvG^B0U;Ia$9D>N8->fOVj( zLQASLUNGJ?-bA~4%s=CWM+X>Nj4d?8m~OoKcMQ;cOsvkBNH-my3lw(t@9Z{i>-Ub{Jt-jr%xR-x5|{)qnwzDck%ZJ+;{Kifz{b* zgn{SATlm1uFmE8ovOe8uE%m?CzYT31eF|}Do1_@DuEA?g*4w~vZa@7Z#=U2lZ?Ul) z{G+Xia^^I+atW}?SjPV$l|8YP+U#BBlHP5Xx%U_?xM%Qv9owxBujy@v9CjrBwb-G11S_qCl+!2afhU zbS`V>@Xqc>P(RTgZal@>E2V#t^}%%GCY0bbKC~U5Gu9c=E*a0RqdeE)+qnlbGVo=5 zZ>Ra-cY8^Ib;I~w`!5NH)dx8DV2uCvmy!IZFgp#D%!>Nd3$xNaE#G+v`r zAIvvPNBQqkLrX8fm`g{t7Vzyf8#zwXG1yqZb%)PE;}vk2j*6_EwAV1J+eeJ^Kb%r+amGO-6Q%afk0Q4*L zLt3IoaI7PFiq-LhIoeY}%+sb)DuHzjpAus-d@td18&q#$w4nVLW8VEZf1`C5G*Fk1 z#CSwm+hhMdPwoB>eq$!Ng!DVjM4jSwryQX8o%|k*{%?Mv1=8{LG5@3yh0lHd+OnNjdpHqV!lK(4y_w#BZsFjIEDF|E~h*97x;ge-#;#P-?oSJI&e{ zUF+OI8&$vcUKWc#)3OFn)15#%H=_y=DA~ar+!b(GcxNVERS@~K5eAE3~P^e|3~Joqpd$O^pT$JHT1~9f9MIm{l~NPza~w21rFWs zt#rL=FvYREKOS~)gYE!3{iFUyv6Dx83&-jdA(VE<2y#D_&iInM^NjHKP}J;k)KiP` zM^Lk7zuC z+QF^_>0r(An19`++Qz=}p}a_Q+Jo`hS4*9J{~q)4?Z-6J{)?8{^bylcw4 zseZuO|KwjsAA4*hJ+@GsUOjvHK~_km zb#&!-3S%Tj$j8e^+9^Ez-QMFK4(aUk_nPY*_GmYH)jzAfj_6pMoyLCH)B-UIJ=D%R zP?-a`S;l;D04ozfDK)wprL)#!VuPQciq8zjs{!pCGx^fr56lt|<^emG9f-Z|!F+V2 zE#(Tm=>9+B9%Ce8`A{D^rWt?0hm{Nc?WVDk`Cq-CCb(8fFESX;;1mX*XE2w+CbVXrAIePyd_gu2a3XcfMsahgoB2Sd47Z-* z^L?mWX2oLl;qM^N^dGM-QXl9jvrOs4$&_yRc$q$a_zp3BqVOGu&nkS@7rcn5cFX_|Np>;Qx9UPcZLznrya&96Y=oPCgl!gsxr&wb7g_D46sJo z1b9Gs81MvxXHD?)PCl35zN)+d_>1xm;GY6#^SK~b!e6kY{(^01f9Ue+gg(MRVVLlo zFh&?BOkzIMn9pqHjoIu^Hn0vjjh508x)V7U+Qkkmd+sT_mPY1&pTKefCF_ziPkXYQMw-Ili* zj)CG(I?4h@?Jo&hb)i01N(!ZxZ)Icixm6FVC*iZ?A@@_v-^XeI!x_qOMltt`%stlX zb*rgX6wdm`P{NE$9)wm0tPU%itWH>+1^nFVl2sXet}>q+%;%T?%RZ*mSt@r}x_{Di zRUGwE$*GUZlKI%G>{L2cAHact!)!iRJ*OH2IF9m1HHpD#5>(B;@1t^p+l}@bmDgk4 zeyR{v6mAWyvbqGgUbRIr^eM*|VlHQuht!KFItZ zKUP4%Pd7K3;H5xgI(%^JM5w&(;^))<$p9jto-_Ol+$+!%S_ z9u4>kgA+{d$sIngSYs5jo@>1b(8GEuV1RWPU^MOH*70<9vtGm88<~4sXE*Kp*74RU z9XOc`XQOJEbspNueQ3+v{{(t5%!9ZIQf1v>z0dlP^)c4!#?e-1%|rWAS zk-=|F@H+Fk33%I@LW2qZMSW~Ac3I!1z0yWW`KGF~!PsTf<8f}ACmGID3eTY-jklH7;AH{-3OL z`LT4JDtjAx7d+0(w^C@0vkGY>@aR)GH&HT@? zoTykR-7)d}W#-eJ`HW*e7nsii=A&Y9yEC|eLF{4?s|ySDWNv@v_G9j)%R#@rD!R5qRMULq)t zY?|a|p^+5IsDzm}J4tgclQSGE=EJxuvtpF{vsC&s_p{9XEOWQ-lxWT)nSUhnAH?7o z<}*g}VJVJba1hJk7zS}C7jbp0wdk3T9gEeQ#d=P1Gn^+F&a({KG0f)}#9j&%_OmuH ziN%`4@F$tkcK#-FKgaxEWtgur_lL~=A#;Dga6V+vf%!Wy|AEXsP;#@-e$1yI^XW%@ zWIb8`8qVK^`w8YAK;68w&m6?u!)5E?Gl0QC3=WrVU_KNMV(t;l|7ivXGkAukWj2J- zJVSS$W+Pb{2eUj3W|W6A_fY2UD?t|5o^fd;3mwV)hcNgg^QmDp`!FB2zeR3Q`+OAk z_&h&Q@@I4gQpjDWvAFBhpS!}`R~XI!Mr{bg?8V%@nE&g{{W`;sVfd^aa%HsbaS<}w zYa(P>fRPL)Fq|Z|yH1ipKETsmHXx(+1ao(1Zl2Zn6BKf64B?i`n&Dn<_7?SF{^^Wb z4)y1gS=?k6H;uW|n0p0tuV8LHgF4C0%A%7XORFb!%N$v+frJ^g@I2$*k2JSD)lA{d zCNl1Q%P5SZkSnMD+y&;oKq+wLEN?fM|1IW!i}`;~Yl^$U((1=JaD?HUVAMDk`XPfy zr2NoOnUdw9C&PJ)`amC$j`L4RJ}mz|S-X0Q!CuU#H-oHq^HvO#O0;->D|4@4p<5~B zj4ThZV2)55hGWCrw#;qI+)ql7;ooKWcc~9|m-)a0`D~H3z{e80gfjf5l&H%Vnt%^V zbi!%bjPAw>h_gusc@N^yS&8GO;WHZ_C)39b-(IE<9l=BJq2pm3KC8fk`H&?o!JiN0 zPeEJ+Bu|NuIBlZRrvH=K)Hv6yCn%&cxPrlf49;ZmMFzvodI4uDb3e~uE`{822BC8X zw=I8?|A;@sf5LyxU*Nyszu~X&SNUuFcl>q!d;SLh1OE&ED|jU1oB3w2a4&xdv3UHx z1MbRb59NYU)=E+P+-fcxe;JUKRX|qO!hOaSbARFQL;iPYk{;m+Pq?EpbD24J zOx9J_l{*e9Pja6_?-T+(egrpwAH|R27V*#XV>oC2HU2ejF+ZLk&n@96@^d*)em=hp zTGYP0FZT}b&--)h`5=A;w}Fr4W4T@YN`57m!YA+v+-^RJPvTPf)%J<N&gJsyd=^*0=kU2)DWA_5aOHdvU(8kVrFHgW{8x|Q-jDoG{7wF6;Pd<~lvL881tYmG(5$`9{|>!cs#QgG za5<)fyO8PN#xosUk?P>`QxPiZ%1ZH}dx|)c4lPu#WWCWcWt=6=59;L%e+KXq{u9m& zb^1AHj(WYoDUi3T$OCE?q1XBANdJ5OdxYNLZ@~Qn{{!5#uH~SmX0@&0Tlf}G*~{+* z^?m$4VC=`trsUt_-vh;i{6WNgpMRh0${#|zkRb;rIRWkIBhG^5Ltr_Ovm98Vb$wyV zfdxxj&Qg`jlrjOS@@QX5cD`&5$tw?OrWta=vHZM@-#SQhd*aWU>jRww8*U{2Y@mz$ z9N-K1vw=?L7{FKYXTy!dpA9z=e>U6{{Mn%AP6M39EdX4F)@p;+x&?42mkgMX*2<%P zKZNGx5$-7Tevfei$jsO~Bb`ks7o}H$ZpZ13sR- z7u>XU+OgJY#|QJloE0C+M+4G6>XS8W+r<&3LOFs^oE zTz!H+$Dae|Y3*7v-r6(X%2*wDXLa0-aoCb^*pk(&IqP{{WoEK2oEhtXHfYImPQ!Yk z4XXu98UEPZLPt*8W@(+6vG&GM**kO7)++zQj}L5|6X^`&g|^& z?7?2(vh2Ynhe4_mRuNF~AS!Z*q_k87EQq?{_QV*Y6iFEq5f$->8a#u>SZF+m8l%P- zq9jFGgy2PtAqJ5$BpS<@H6vp$6Z7dx| z;V7#4u{0S`AD>9u^%;dpVG8|nt!D7a3$T`jeCqK>=kiSHdHCC0_%fezJn~oh_EJ9e zFzhngZUuRH<9xUhTZqF|)b}gG)qL`J=xbRa! z_*H9*Y!TkcSypRHZ3S`dDqD#kyBaTFhnK%O>}R*w_h{e8tcDiNM97Md^(B1lEj|tw zAN$)A_Cy#aR@RG;o#JD;_}DByHrWgILKtcrZDTk<+-w#%E5*%%xLGZ3mWi7=akEMO zw@M5x$p2P}rv=+#JHikm##>=HQDZ0Vw}~CY?HyuAjcll|Y$%Zp`S_?Tq?SYu7FA%8 z5q#SmwqWmn!gIyaO+Nf3{1qL4NQ{k$D*?Hf@npQk=qyHO9kg9%85@eu%B8ccbe5IQ zveH?`MiY~Bipjkclk?JIIr^K#QIl;7XPAoq%J=B+G_*Ja{}`jiGiba1Dx|+k>93OL z4QtV&`^Tk3@`56HL6N+mNM2ARFDQ~16v+#U{k*GtHi&&_*W2% zF?_h^*&Y)U*-0YLoyc=1^4y6$cOuW7$a5$1+=)DQ8qpHjMj}6*$WJFl-z7l|fFuE?0lc)ziFslv9rq^(ZTw$=iam)qBm)8zTGh znQv}eK0mLW*mEdWJUz_ZGgoh_=IV88uHJIZ)w@-5_10^y-iw;6x69}1S*VT3!JUbWuV)v(NoVo(55vha$HStN7ZXvxK~$g!Vk)65)lyON7gX zR|r=MR|{_jM<%xm*9z|!J|uih_>}ND;YQ($!mYw>i_clGIN2`TDcmi5U-);&Od`w+ zYlMx$79m`e@9~%svHU;RsaM-KROJwV;63XZ>Yffco}Zy-$Wv$>>ygy(PL5fjM_#XC zIC@MrytSkIN+b8%S5y_0x`m&oXIQIa_XSmbrF!ap=oxxN)jfUBunF(n6%NI3PQ%yE z;aR_E`IUa3EB;-U+62eDB}6uuF|Vw|Jh$>A{CPxQ&nvFG({=oE zalJL&f6w2$(|*VA2TrPedKI_ubZq>7ylc-ki+6GtV7H&0rJlVk-p;bKWD9+Yw`uD( z?bV=jMe&w+6MK4PI8cX(;tllTHmaiY?E?Pt=Py6{%i{H1o5c?b?-SlFTvJ4%czh?G zBOls8=1$vlj03lj-TzGM$N81SHWb_5%S&0VDE6{Z{YFY`O|PVp_W2x>gHe@SS4-%i zTKoXVw=>pxQ0sAw>LULB0XW^RG1dg)UC2z?z`VuAU$WfZ<*AOy^1F)kbiPtBR zXPiV1a2io~7TLobBKujP8@pOSU4IGIwSxN4HCWebo)o zr>T?tl#2Gx!wcaT)DL%(g}xX5#?MC9Vf}3&b}+;av9XM-jL2)GhqYvzd5`dUWWm@=+B4rC1(Yzw?5WJkA~SuGU2gy1R3vSn{KDj zn=jftdU7FsSk7;+wAFUA-Hv=8Ms_|%$e>N1{ay}Mpo<8PRt?tT2Ru{7a(Iiveqdil z(h+*<1V@tpczwcafnBNsj#m9|EV)lap64~cqsg2i7=0`_kt{AEE1QBAAK|`2#C@!L z)r()j=qPLrFM+SX+6aFC2K;S!1Kb{d5B?$S0Cxqyd-2Dxn{yrO0lz?|`=< zsmSiMyTI?-TJT=#PF}Ag+QmGH8y0aEi_fB!S5}{drR?=0-zVJX@KzL0qx~?y!Q#hZ z%U$g6cMrV!&z7iP)W+KEGr}%M@=C{rj&Ap$pOyQXEJ;|yJ&t+iZNJCQ*{FOyo}P^s z^YPj8D0O_DpS?D-L}8gt(-G~U--}C#aDKn9hT3LtIM|Q8e}8I~!^xr##2QDDOOL@T zA4R5n9NG3%yz_MO^pnYyXTZAIWZ!eijL!~V3iGMcp2KMGN-D2cGs3+tTpw=a-q9W5 zF76uL!>HvkZ1_n$^fQd{p2L=(4;y9Azs90p!=`_SRlgP94)0L!dY1~HB}|@sS_?g_ftr98jEwNI0eI%`UMR|R?wASPE yAH&uR`}lVY+FMQ^+08Qa|G!BJZlKX==xuMUL}4MUaT`8QZ17mVENsS}!#@G|-xPZQ diff --git a/modules/home-manager/desktops/hyprland/fonts/Torus-Regular.734ed3ae.otf b/modules/home-manager/desktops/hyprland/fonts/Torus-Regular.734ed3ae.otf deleted file mode 100644 index d5fc09e17c3613a3ff8052a2034a28fc6655f54f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63952 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 CP53JS diff --git a/modules/home-manager/desktops/hyprland/fonts/Torus-SemiBold.d263d500.otf b/modules/home-manager/desktops/hyprland/fonts/Torus-SemiBold.d263d500.otf deleted file mode 100644 index a3d07121704c52bf1a485e3ed7a61bb78c4e57bd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65960 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

    1hSHn3( zaRE`;JZf}SmpG>ZD z3Q_chXyZl1(lcn4KSrc`4bk>|TIYqt={FK7FT(0tiN2Q-8Gpvz?v|0KT}5y2UNWy= zr-%E1d(b_^*wN$e2}X^cq}S4q4)39b-bWvAKe~Lty(oSD4H|tMo&G&q{igeqdy9P6 zU&(O&gUnXQPY`D@x|nZ;R%~T(I%7qm_eU!HrjrTU5m!gC$q7LzFjLl zyA||=R`JuttLeLafeh3a$vl0DjMG=hG=0_X#S-qbjab8GdUD?+zw|hHr6-Ze)HCE# zBFR(_lgG>ySd~MPp7{ZCT_MSyDc9bVWZzG&Z>C9cxWv-s z^`5jkQu6v>Y4y?O_oHiue*C)z4VTkTP(f1a1XZ<8}D6vIg(V KyWL^*+5HnEtL^&$ diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/bluefilter.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/bluefilter.frag deleted file mode 100755 index 5469af9..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/bluefilter.frag +++ /dev/null @@ -1,20 +0,0 @@ -// vim: set ft=glsl: -// blue light filter shader -// values from https://reshade.me/forum/shader-discussion/3673-blue-light-filter-similar-to-f-lux - -precision mediump float; -varying vec2 v_texcoord; -uniform sampler2D tex; - -void main() { - - vec4 pixColor = texture2D(tex, v_texcoord); - - // green - pixColor[1] *= 0.855; - - // blue - pixColor[2] *= 0.725; - - gl_FragColor = pixColor; -} diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/blur.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/blur.frag deleted file mode 100755 index 700dfb2..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/blur.frag +++ /dev/null @@ -1,39 +0,0 @@ -precision mediump float; -varying vec2 v_texcoord; // is in 0-1 -uniform sampler2D tex; -uniform float alpha; - -uniform vec2 topLeft; -uniform vec2 fullSize; -uniform float radius; - -uniform int discardOpaque; -uniform int discardAlpha; -uniform float discardAlphaValue; - -uniform int applyTint; -uniform vec3 tint; - -uniform int primitiveMultisample; - -void main() { - - vec4 pixColor = texture2D(tex, v_texcoord); - - if (discardOpaque == 1 && pixColor[3] * alpha == 1.0) - discard; - - if (discardAlpha == 1 && pixColor[3] <= discardAlphaValue) - discard; - - if (applyTint == 1) { - pixColor[0] = pixColor[0] * tint[0]; - pixColor[1] = pixColor[1] * tint[1]; - pixColor[2] = pixColor[2] * tint[2]; - } - - )#" + - ROUNDED_SHADER_FUNC("pixColor") + R"#( - - gl_FragColor = pixColor * alpha; -} \ No newline at end of file diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/chromatic_abberation.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/chromatic_abberation.frag deleted file mode 100755 index 5389241..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/chromatic_abberation.frag +++ /dev/null @@ -1,24 +0,0 @@ -// vim: set ft=glsl: - -precision highp float; -varying highp vec2 v_texcoord; -uniform highp sampler2D tex; - -#define STRENGTH 0.0027 - -void main() { - vec2 center = vec2(0.5, 0.5); - vec2 offset = (v_texcoord - center) * STRENGTH; - - float rSquared = dot(offset, offset); - float distortion = 1.0 + 1.0 * rSquared; - vec2 distortedOffset = offset * distortion; - - vec2 redOffset = vec2(distortedOffset.x, distortedOffset.y); - vec2 blueOffset = vec2(distortedOffset.x, distortedOffset.y); - - vec4 redColor = texture2D(tex, v_texcoord + redOffset); - vec4 blueColor = texture2D(tex, v_texcoord + blueOffset); - - gl_FragColor = vec4(redColor.r, texture2D(tex, v_texcoord).g, blueColor.b, 1.0); -} diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/crt.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/crt.frag deleted file mode 100755 index a37ff9f..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/crt.frag +++ /dev/null @@ -1,511 +0,0 @@ -#version 100 -precision highp float; -varying highp vec2 v_texcoord; -varying highp vec3 v_pos; -uniform highp sampler2D tex; -uniform lowp float time; - -#define BORDER_COLOR vec4(vec3(0.0, 0.0, 0.0), 1.0) // black border -#define BORDER_RADIUS 1.0 // larger vignette radius -#define BORDER_SIZE 0.01 // small border size -#define CHROMATIC_ABERRATION_STRENGTH 0.00 -#define DENOISE_INTENSITY 0.0001 // -#define DISTORTION_AMOUNT 0.00 // moderate distortion amount -#define HDR_BLOOM 0.75 // bloom intensity -#define HDR_BRIGHTNESS 0.011 // brightness -#define HDR_CONTRAST 0.011 // contrast -#define HDR_SATURATION 1.0// saturation -#define LENS_DISTORTION_AMOUNT 0.0 -#define NOISE_THRESHOLD 0.0001 -#define PHOSPHOR_BLUR_AMOUNT 0.77 // Amount of blur for phosphor glow -#define PHOSPHOR_GLOW_AMOUNT 0.77 // Amount of phosphor glow -#define SAMPLING_RADIUS 0.0001 -#define SCANLINE_FREQUENCY 540.0 -#define SCANLINE_THICKNESS 0.0507 -#define SCANLINE_TIME time * 471.24 -#define SHARPNESS 0.25 -#define SUPERSAMPLING_SAMPLES 16.0 -#define VIGNETTE_RADIUS 0.0 // larger vignette radius -#define PI 3.14159265359 -#define TWOPI 6.28318530718 - -vec2 applyBarrelDistortion(vec2 coord, float amt) { - vec2 p = coord.xy / vec2(1.0); - vec2 v = p * 2.0 - vec2(1.0); - float r = dot(v, v); - float k = 1.0 + pow(r, 2.0) * pow(amt, 2.0); - vec2 result = v * k; - return vec2(0.5, 0.5) + 0.5 * result.xy; -} - -vec4 applyColorCorrection(vec4 color) { - color.rgb *= vec3(1.0, 0.79, 0.89); - return vec4(color.rgb, 1.0); -} - -vec4 applyBorder(vec2 tc, vec4 color, float borderSize, vec4 borderColor) { - float dist_x = min(tc.x, 1.0 - tc.x); - float dist_y = min(tc.y, 1.0 - tc.y); - float dist = min(dist_x, dist_y) * -1.0; - float border = smoothstep(borderSize, 0.0, dist); - border += smoothstep(borderSize, 0.0, dist); - return mix(color, borderColor, border); -} - -vec4 applyFakeHDR(vec4 color, float brightness, float contrast, float saturation, float bloom) { - color.rgb = (color.rgb - vec3(0.5)) * exp2(brightness) + vec3(0.5); - vec3 crtfactor = vec3(1.05, 0.92, 1.0); - color.rgb = pow(color.rgb, crtfactor); - // // NTSC - // vec3 lumCoeff = vec3(0.2125, 0.7154, 0.0721); - - // // BT.709 - // vec3 lumCoeff = vec3(0.299, 0.587, 0.114); - - // BT.2020 - vec3 lumCoeff = vec3(0.2627, 0.6780, 0.0593); - - // // Warm NTSC - // vec3 lumCoeff = vec3(0.2125, 0.7010, 0.0865); - - float luminance = dot(color.rgb, lumCoeff); - luminance = pow(luminance, 2.2); - color.rgb = mix(vec3(luminance), color.rgb, saturation); - color.rgb = mix(color.rgb, vec3(1.0), pow(max(0.0, luminance - 1.0 + bloom), 4.0)); - return color; -} - -vec4 applyVignette(vec4 color) { - vec2 center = vec2(0.5, 0.5); // center of screen - float radius = VIGNETTE_RADIUS; // radius of vignette effect - float softness = 1.0; // softness of vignette effect - float intensity = 0.7; // intensity of vignette effect - vec2 offset = v_texcoord - center; // offset from center of screen - float distance = length(offset); // distance from center of screen - float alpha = smoothstep(radius, radius - radius * softness, distance) * intensity; // calculate alpha value for vignette effect - return mix(vec4(0.0, 0.0, 0.0, alpha), color, alpha); // mix black with color using calculated alpha value -} - -vec4 applyPhosphorGlow(vec2 tc, vec4 color, sampler2D tex) { - // Calculate average color value of the texture - vec4 texelColor = color; - float averageColor = (texelColor.r + texelColor.g + texelColor.b) / 3.0; - - // Determine brightness-dependent color factor - float factor = mix( - mix(0.09, - mix(0.005, 0.0075, (averageColor - 0.1) / 0.1), - step(0.01, averageColor)), 0.0005, - step(0.02, averageColor)); - // Apply phosphor glow effect - vec4 sum = vec4(0.0); - vec4 pixels[9]; - pixels[0] = texture2D(tex, tc - vec2(0.001, 0.001)); - pixels[1] = texture2D(tex, tc - vec2(0.001, 0.0)); - pixels[2] = texture2D(tex, tc - vec2(0.001, -0.001)); - pixels[3] = texture2D(tex, tc - vec2(0.0, 0.001)); - pixels[4] = texture2D(tex, tc); - pixels[5] = texture2D(tex, tc + vec2(0.001, 0.001)); - pixels[6] = texture2D(tex, tc + vec2(0.001, 0.0)); - pixels[7] = texture2D(tex, tc + vec2(0.001, -0.001)); - pixels[8] = texture2D(tex, tc + vec2(0.0, 0.001)); - -// Perform operations on input pixels in parallel - sum = pixels[0] - + pixels[1] - + pixels[2] - + pixels[3] - + pixels[4] - + pixels[5] - + pixels[6] - + pixels[7] - + pixels[8]; - sum /= 9.0; - sum += texture2D(tex, tc - vec2(0.01, 0.01)) * 0.001; - sum += texture2D(tex, tc - vec2(0.0, 0.01)) * 0.001; - sum += texture2D(tex, tc - vec2(-0.01, 0.01)) * 0.001; - sum += texture2D(tex, tc - vec2(0.01, 0.0)) * 0.001; - sum += color * PHOSPHOR_BLUR_AMOUNT; - sum += texture2D(tex, tc - vec2(-0.01, 0.0)) * 0.001; - sum += texture2D(tex, tc - vec2(0.01, -0.01)) * 0.001; - sum += texture2D(tex, tc - vec2(0.0, -0.01)) * 0.001; - sum += texture2D(tex, tc - vec2(-0.01, -0.01)) * 0.001; - sum *= PHOSPHOR_GLOW_AMOUNT; - - // Initialize sum_sum_factor to zero - vec4 sum_sum_factor = vec4(0.0); - // Compute sum_j for i = -1 - vec4 sum_j = vec4(0.0); - sum_j += texture2D(tex, tc + vec2(-1, -1) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, -1) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, -1) * 0.01); - sum_j += texture2D(tex, tc + vec2(-1, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(-1, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, 1) * 0.01); - sum_sum_factor += sum_j * vec4(0.011); - - // Compute sum_j for i = 0 - sum_j = vec4(0.0); - sum_j += texture2D(tex, tc + vec2(-1, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(-1, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, 1) * 0.01); - sum_sum_factor += sum_j * vec4(0.011); - - // Compute sum_j for i = 1 - sum_j = vec4(0.0); - sum_j += texture2D(tex, tc + vec2(-1, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, 0) * 0.01); - sum_j += texture2D(tex, tc + vec2(-1, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(0, 1) * 0.01); - sum_j += texture2D(tex, tc + vec2(1, 1) * 0.01); - sum_sum_factor += sum_j * vec4(0.011); - color += mix(sum_sum_factor * sum_sum_factor * vec4(factor), sum, 0.5); - return color; -} - -vec4 applyAdaptiveSharpen(vec2 tc, vec4 color, sampler2D tex) { - vec4 color_tl = texture2D(tex, tc + vec2(-1.0, -1.0) * 0.5 / 2160.0); - vec4 color_tr = texture2D(tex, tc + vec2(1.0, -1.0) * 0.5 / 2160.0); - vec4 color_bl = texture2D(tex, tc + vec2(-1.0, 1.0) * 0.5 / 2160.0); - vec4 color_br = texture2D(tex, tc + vec2(1.0, 1.0) * 0.5 / 2160.0); - float sharpness = SHARPNESS; - vec3 color_no_alpha = color.rgb; - vec3 color_tl_no_alpha = color_tl.rgb; - vec3 color_tr_no_alpha = color_tr.rgb; - vec3 color_bl_no_alpha = color_bl.rgb; - vec3 color_br_no_alpha = color_br.rgb; - float delta = (dot(color_no_alpha, vec3(0.333333)) + dot(color_tl_no_alpha, vec3(0.333333)) + dot(color_tr_no_alpha, vec3(0.333333)) + dot(color_bl_no_alpha, vec3(0.333333)) + dot(color_br_no_alpha, vec3(0.333333))) * 0.2 - dot(color_no_alpha, vec3(0.333333)); - vec3 sharp_color_no_alpha = color_no_alpha + min(vec3(0.0), vec3(delta * sharpness)); - vec4 sharp_color = vec4(sharp_color_no_alpha, color.a); - return sharp_color; -} - -vec4 applyScanlines(vec2 tc, vec4 color) { - float scanline = (cos(tc.y * SCANLINE_FREQUENCY + SCANLINE_TIME) * - sin(tc.y * SCANLINE_FREQUENCY + SCANLINE_TIME)) * SCANLINE_THICKNESS; - float alpha = clamp(1.0 - abs(scanline), 0.0, 1.0); - return vec4(color.rgb * alpha, color.a); -} - -vec4 applyChromaticAberration(vec2 uv, vec4 color) { - vec2 center = vec2(0.5, 0.5); // center of the screen - vec2 offset = (uv - center) * CHROMATIC_ABERRATION_STRENGTH; // calculate the offset from the center - - // apply lens distortion - float rSquared = dot(offset, offset); - float distortion = 1.0 + LENS_DISTORTION_AMOUNT * rSquared; - vec2 distortedOffset = offset * distortion; - - // apply chromatic aberration - vec2 redOffset = vec2(distortedOffset.x * 1.00, distortedOffset.y * 1.00); - vec2 blueOffset = vec2(distortedOffset.x * 1.00, distortedOffset.y * 1.00); - - vec4 redColor = texture2D(tex, uv + redOffset); - vec4 blueColor = texture2D(tex, uv + blueOffset); - - vec4 result = vec4(redColor.r, color.g, blueColor.b, color.a); - - return result; -} - -vec4 reduceGlare(vec4 color) { - // Calculate the intensity of the color by taking the average of the RGB components - float intensity = (color.r + color.g + color.b) / 3.0; - // Set the maximum intensity that can be considered for glare - float maxIntensity = 0.98; - // Use smoothstep to create a smooth transition from no glare to full glare - // based on the intensity of the color and the maximum intensity - float glareIntensity = smoothstep(maxIntensity - 0.02, maxIntensity, intensity); - // Set the amount of glare to apply to the color - float glareAmount = 0.02; - // Mix the original color with the reduced color that has glare applied to it - vec3 reducedColor = mix(color.rgb, vec3(glareIntensity), glareAmount); - // Return the reduced color with the original alpha value - return vec4(reducedColor, color.a); -} - -// Apply a fake HDR effect to the input color. -// Parameters: -// - inputColor: the color to apply the effect to. -// - brightness: the brightness of the image. Should be a value between 0 and 1. -// - contrast: the contrast of the image. Should be a value between 0 and 1. -// - saturation: the saturation of the image. Should be a value between 0 and 2. -// - bloom: the intensity of the bloom effect. Should be a value between 0 and 1. -vec4 applyFakeHDREffect(vec4 inputColor, float brightness, float contrast, float saturation, float bloom) { - const float minBrightness = 0.0; - const float maxBrightness = 1.0; - const float minContrast = 0.0; - const float maxContrast = 1.0; - const float minSaturation = 0.0; - const float maxSaturation = 2.0; - const float minBloom = 0.0; - const float maxBloom = 1.0; - - // Check input parameters for validity - if (brightness < minBrightness || brightness > maxBrightness) { - return vec4(0.0, 0.0, 0.0, 1.0); // Return black with alpha of 1.0 to indicate error - } - if (contrast < minContrast || contrast > maxContrast) { - return vec4(0.0, 0.0, 0.0, 1.0); - } - if (saturation < minSaturation || saturation > maxSaturation) { - return vec4(0.0, 0.0, 0.0, 1.0); - } - if (bloom < minBloom || bloom > maxBloom) { - return vec4(0.0, 0.0, 0.0, 1.0); - } - - // Apply brightness and contrast - vec3 color = inputColor.rgb; - color = (color - vec3(0.5)) * exp2(brightness * 10.0) + vec3(0.5); - color = mix(vec3(0.5), color, pow(contrast * 4.0 + 1.0, 2.0)); - - // // NTSC - // vec3 lumCoeff = vec3(0.2125, 0.7154, 0.0721); - - // // BT.709 - // vec3 lumCoeff = vec3(0.299, 0.587, 0.114); - - // // BT.2020 - // vec3 lumCoeff = vec3(0.2627, 0.6780, 0.0593); - - // Warm NTSC - vec3 lumCoeff = vec3(0.2125, 0.7010, 0.0865); - - // Apply saturation - float luminance = dot(color, lumCoeff); - vec3 grey = vec3(luminance); - color = mix(grey, color, saturation); - - // Apply bloom effect - float threshold = 1.0 - bloom; - vec3 bloomColor = max(color - threshold, vec3(0.0)); - bloomColor = pow(bloomColor, vec3(2.0)); - bloomColor = mix(vec3(0.0), bloomColor, pow(min(luminance, threshold), 4.0)); - color += bloomColor; - - return vec4(color, inputColor.a); -} - -vec4 bilateralFilter(sampler2D tex, vec2 uv, vec4 color, float sampleRadius, float noiseThreshold, float intensity) { - vec4 filteredColor = vec4(0.0); - float totalWeight = 0.0; - - // Top-left pixel - vec4 sample = texture2D(tex, uv + vec2(-1.0, -1.0)); - float dist = length(vec2(-1.0, -1.0)); - float colorDist = length(sample - color); - float weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - // Top pixel - sample = texture2D(tex, uv + vec2(0.0, -1.0)); - dist = length(vec2(0.0, -1.0)); - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - // Top-right pixel - sample = texture2D(tex, uv + vec2(1.0, -1.0)); - dist = length(vec2(1.0, -1.0)); - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - // Left pixel - sample = texture2D(tex, uv + vec2(-1.0, 0.0)); - dist = length(vec2(-1.0, 0.0)); - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - // Center pixel - sample = texture2D(tex, uv); - dist = 0.0; - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - // Right pixel - sample = texture2D(tex, uv + vec2(1.0, 0.0)); - dist = length(vec2(1.0, 0.0)); - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - // Bottom-left pixel - sample = texture2D(tex, uv + vec2(-1.0, 1.0)); - dist = length(vec2(-1.0, 1.0)); - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - -// Bottom pixel - sample = texture2D(tex, uv + vec2(0.0, sampleRadius)); - dist = length(vec2(0.0, sampleRadius)); - colorDist = length(sample - color); - weight = exp(-0.5 * (dist * dist + colorDist * colorDist * intensity) / (sampleRadius * sampleRadius)); - filteredColor += sample * weight; - totalWeight += weight; - - filteredColor /= totalWeight; - return mix(color, filteredColor, step(noiseThreshold, length(filteredColor - color))); -} - -vec4 supersample(sampler2D tex, vec2 uv, float sampleRadius, float noiseThreshold, float intensity) { - float radiusSq = sampleRadius * sampleRadius; - vec2 poissonDisk; - vec4 color = vec4(0.0); - - float r1_0 = sqrt(0.0 / 16.0); - float r2_0 = fract(1.0 / 3.0); - float theta_0 = TWOPI * r2_0; - poissonDisk = vec2(r1_0 * cos(theta_0), r1_0 * sin(theta_0)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_1 = sqrt(1.0 / 16.0); - float r2_1 = fract(2.0 / 3.0); - float theta_1 = TWOPI * r2_1; - poissonDisk = vec2(r1_1 * cos(theta_1), r1_1 * sin(theta_1)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_2 = sqrt(2.0 / 16.0); - float r2_2 = fract(3.0 / 3.0); - float theta_2 = TWOPI * r2_2; - poissonDisk = vec2(r1_2 * cos(theta_2), r1_2 * sin(theta_2)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_3 = sqrt(3.0 / 16.0); - float r2_3 = fract(4.0 / 3.0); - float theta_3 = TWOPI * r2_3; - poissonDisk = vec2(r1_3 * cos(theta_3), r1_3 * sin(theta_3)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_4 = sqrt(4.0 / 16.0); - float r2_4 = fract(5.0 / 3.0); - float theta_4 = TWOPI * r2_4; - poissonDisk = vec2(r1_4 * cos(theta_4), r1_4 * sin(theta_4)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_5 = sqrt(5.0 / 16.0); - float r2_5 = fract(6.0 / 3.0); - float theta_5 = TWOPI * r2_5; - poissonDisk = vec2(r1_5 * cos(theta_5), r1_5 * sin(theta_5)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_6 = sqrt(6.0 / 16.0); - float r2_6 = fract(7.0 / 3.0); - float theta_6 = TWOPI * r2_6; - poissonDisk = vec2(r1_6 * cos(theta_6), r1_6 * sin(theta_6)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_7 = sqrt(7.0 / 16.0); - float r2_7 = fract(8.0 / 3.0); - float theta_7 = TWOPI * r2_7; - poissonDisk = vec2(r1_7 * cos(theta_7), r1_7 * sin(theta_7)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_8 = sqrt(8.0 / 16.0); - float r2_8 = fract(9.0 / 3.0); - float theta_8 = TWOPI * r2_8; - poissonDisk = vec2(r1_8 * cos(theta_8), r1_8 * sin(theta_8)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_9 = sqrt(9.0 / 16.0); - float r2_9 = fract(10.0 / 3.0); - float theta_9 = TWOPI * r2_9; - poissonDisk = vec2(r1_9 * cos(theta_9), r1_9 * sin(theta_9)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_10 = sqrt(10.0 / 16.0); - float r2_10 = fract(11.0 / 3.0); - float theta_10 = TWOPI * r2_10; - poissonDisk = vec2(r1_10 * cos(theta_10), r1_10 * sin(theta_10)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_11 = sqrt(11.0 / 16.0); - float r2_11 = fract(12.0 / 3.0); - float theta_11 = TWOPI * r2_11; - poissonDisk = vec2(r1_11 * cos(theta_11), r1_11 * sin(theta_11)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_12 = sqrt(12.0 / 16.0); - float r2_12 = fract(13.0 / 3.0); - float theta_12 = TWOPI * r2_12; - poissonDisk = vec2(r1_12 * cos(theta_12), r1_12 * sin(theta_12)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_13 = sqrt(13.0 / 16.0); - float r2_13 = fract(14.0 / 3.0); - float theta_13 = TWOPI * r2_13; - poissonDisk = vec2(r1_13 * cos(theta_13), r1_13 * sin(theta_13)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_14 = sqrt(14.0 / 16.0); - float r2_14 = fract(15.0 / 3.0); - float theta_14 = TWOPI * r2_14; - poissonDisk = vec2(r1_14 * cos(theta_14), r1_14 * sin(theta_14)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - float r1_15 = sqrt(15.0 / 16.0); - float r2_15 = fract(16.0 / 3.0); - float theta_15 = TWOPI * r2_15; - poissonDisk = vec2(r1_15 * cos(theta_15), r1_15 * sin(theta_15)); - color += texture2D(tex, uv + poissonDisk * sampleRadius); - - return bilateralFilter(tex, uv, color, sampleRadius, noiseThreshold, intensity); -} -void main() { - vec2 tc_no_dist = v_texcoord; - - vec2 tc = applyBarrelDistortion(tc_no_dist, DISTORTION_AMOUNT); - - // [-1, 1] - vec2 tc_no_dist_symmetric = tc_no_dist * 2.0 - 1.0; - - // [0,1] - vec2 tc_no_dist_normalized = (tc_no_dist_symmetric + 1.0) / 2.0; - - // vec4 color = texture2D(tex, tc); - vec4 color = supersample(tex, tc, SAMPLING_RADIUS, NOISE_THRESHOLD, DENOISE_INTENSITY); - - color = applyAdaptiveSharpen(tc, color, tex); - - color = applyPhosphorGlow(tc, color, tex); - - color = reduceGlare(color); - - color = mix(applyFakeHDREffect(color, HDR_BRIGHTNESS, HDR_CONTRAST, HDR_SATURATION, HDR_BLOOM), color, 0.5); - - color = applyColorCorrection(color); - - color /= SUPERSAMPLING_SAMPLES; - - color = mix(applyChromaticAberration(tc, color), color, 0.25); - - color = mix(color, applyVignette(color), 0.37); - - color = applyBorder(tc_no_dist_normalized, color, 1.0 - BORDER_SIZE * BORDER_RADIUS, BORDER_COLOR); - - color = mix(applyBorder(tc, color, BORDER_SIZE, BORDER_COLOR), color, 0.05); - - color = applyScanlines(tc, color); - - gl_FragColor = color; - gl_FragColor.a = 1.0; -} - diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/drugs.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/drugs.frag deleted file mode 100755 index 1190ed0..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/drugs.frag +++ /dev/null @@ -1,42 +0,0 @@ - -precision highp float; -varying vec2 v_texcoord; -uniform sampler2D tex; -uniform float time; - -void warpco(inout vec2 tc) { - tc -= 0.5; - tc *= length(tc) * 2.0; - tc += 0.5; -} - -float rand1d(float seed) { - return sin(seed*1454.0); -} - -float rand2d(vec2 co) -{ - return fract(sin(dot(co.xy, vec2(12.9898,78.233))) * 43758.5453); -} - -vec3 rgb(in vec2 tc, float freq, float amp, inout vec4 centre) { - vec2 off = vec2(1.0/800.0, 0.0) * sin(tc.t * freq + time) * amp; - vec2 off2 = vec2(1.0/800.0, 0.0) * sin(tc.t * freq - time * 1.5) * amp; - centre = texture2D(tex, tc); - return vec3(texture2D(tex, tc-off).r, centre.g, texture2D(tex, tc+off2).b); -} - -void main() { - // vec2 px = 1.0 / textureSize(tex, 0).st; - vec2 tc = v_texcoord; - warpco(tc); - tc = mix(v_texcoord, tc, sin(time * 2.0)*0.07); - tc.x += rand2d(floor(tc * 20.0 + floor(time * 2.5))) * 0.01; - tc.x += rand1d(floor(tc.x * 40.0)) * 0.005 * rand1d(time * 0.001); - tc.y += sin(tc.x + time) * 0.02; - vec4 centre; - vec3 bent = rgb(tc, 100.0, 5.0, centre); - vec3 col = mix(centre.rgb, bent, sin(time)); - gl_FragColor = vec4(col, centre.a); - // gl_FragColor = vec4(texture2D(tex, v_texcoord)); -} \ No newline at end of file diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/extradark.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/extradark.frag deleted file mode 100755 index 089ee81..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/extradark.frag +++ /dev/null @@ -1,21 +0,0 @@ -// vim: set ft=glsl: -// blue light filter shader -// values from https://reshade.me/forum/shader-discussion/3673-blue-light-filter-similar-to-f-lux - -precision mediump float; -varying vec2 v_texcoord; -uniform sampler2D tex; - -void main() { - - vec4 pixColor = texture2D(tex, v_texcoord); - - // red - pixColor[0] *= 0.7; - // green - pixColor[1] *= 0.6; - // blue - pixColor[2] *= 0.5; - - gl_FragColor = pixColor; -} diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/gaussian.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/gaussian.frag deleted file mode 100755 index c4b9e0e..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/gaussian.frag +++ /dev/null @@ -1,31 +0,0 @@ -//--------------------------------------------------------------------------- -// Fragment -//--------------------------------------------------------------------------- -#version 420 core -//--------------------------------------------------------------------------- -precision mediump float; -in vec2 pos; // screen position <-1,+1> -out vec4 gl_FragColor; // fragment output color -uniform sampler2D txr; // texture to blur -uniform float xs,ys; // texture resolution -uniform float r = 6.0; // blur radius - -varying vec2 v_texcoord; -uniform sampler2D tex; -//--------------------------------------------------------------------------- -void main() - { - float x,y,xx,yy,rr=r*r,dx,dy,w,w0; - w0=0.3780/pow(r,1.975); - vec2 p; - vec4 pixColor = texture2D(tex, v_texcoord); - for (dx=1.0/xs,x=-r,p.x=0.5+(pos.x*0.5)+(x*dx);x<=r;x++,p.x+=dx){ xx=x*x; - for (dy=1.0/ys,y=-r,p.y=0.5+(pos.y*0.5)+(y*dy);y<=r;y++,p.y+=dy){ yy=y*y; - if (xx+yy<=rr) - { - w=w0*exp((-xx-yy)/(2.0*rr)); - pixColor+=texture2D(txr,p)*w; - }}} - gl_FragColor = pixColor; - } -//--------------------------------------------------------------------------- diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/motion-blur.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/motion-blur.frag deleted file mode 100755 index f0770de..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/motion-blur.frag +++ /dev/null @@ -1,28 +0,0 @@ -// vim: set ft=glsl: - -precision mediump float; -varying vec2 v_texcoord; -uniform sampler2D tex; -uniform float blurFactor; -uniform vec2 resolution; - -const int numSamples = 120000; - -uniform sampler2D accumulator; - -void main() { - float blurFactor = 120000.0; - - vec4 currentColor = texture2D(tex, v_texcoord); - vec4 prevColor = texture2D(accumulator, v_texcoord); - - vec2 velocity = (v_texcoord - gl_FragCoord.xy / resolution) * 2.0; - - vec4 colorDiff = currentColor - prevColor; - - float motionBlur = length(velocity) * blurFactor; - - vec4 finalColor = prevColor + colorDiff * 2.0; - - gl_FragColor = finalColor; -} \ No newline at end of file diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/nothing.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/nothing.frag deleted file mode 100755 index 163e600..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/nothing.frag +++ /dev/null @@ -1,14 +0,0 @@ -// vim: set ft=glsl: -// blue light filter shader -// values from https://reshade.me/forum/shader-discussion/3673-blue-light-filter-similar-to-f-lux - -precision mediump float; -varying vec2 v_texcoord; -uniform sampler2D tex; - -void main() { - - vec4 pixColor = texture2D(tex, v_texcoord); - - gl_FragColor = pixColor; -} diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/solarized.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/solarized.frag deleted file mode 100755 index 1c37f2c..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/solarized.frag +++ /dev/null @@ -1,41 +0,0 @@ -// -*- mode:c -*- -precision lowp float; -varying vec2 v_texcoord; -uniform sampler2D tex; - -float distanceSquared(vec3 pixColor, vec3 solarizedColor) { - vec3 distanceVector = pixColor - solarizedColor; - return dot(distanceVector, distanceVector); -} - -void main() { - vec3 solarized[16]; - solarized[0] = vec3(0.,0.169,0.212); - solarized[1] = vec3(0.027,0.212,0.259); - solarized[2] = vec3(0.345,0.431,0.459); - solarized[3] = vec3(0.396,0.482,0.514); - solarized[4] = vec3(0.514,0.58,0.588); - solarized[5] = vec3(0.576,0.631,0.631); - solarized[6] = vec3(0.933,0.91,0.835); - solarized[7] = vec3(0.992,0.965,0.89); - solarized[8] = vec3(0.71,0.537,0.); - solarized[9] = vec3(0.796,0.294,0.086); - solarized[10] = vec3(0.863,0.196,0.184); - solarized[11] = vec3(0.827,0.212,0.51); - solarized[12] = vec3(0.424,0.443,0.769); - solarized[13] = vec3(0.149,0.545,0.824); - solarized[14] = vec3(0.165,0.631,0.596); - solarized[15] = vec3(0.522,0.6,0.); - - vec3 pixColor = vec3(texture2D(tex, v_texcoord)); - int closest = 0; - float closestDistanceSquared = distanceSquared(pixColor, solarized[0]); - for (int i = 1; i < 15; i++) { - float newDistanceSquared = distanceSquared(pixColor, solarized[i]); - if (newDistanceSquared < closestDistanceSquared) { - closest = i; - closestDistanceSquared = newDistanceSquared; - } - } - gl_FragColor = vec4(solarized[closest], 1.); -} diff --git a/modules/home-manager/desktops/hyprland/hypr/shaders/vibrance.frag b/modules/home-manager/desktops/hyprland/hypr/shaders/vibrance.frag deleted file mode 100755 index 5d3d488..0000000 --- a/modules/home-manager/desktops/hyprland/hypr/shaders/vibrance.frag +++ /dev/null @@ -1,39 +0,0 @@ -// vibrance for hyprland - -precision mediump float; -varying vec2 v_texcoord; -uniform sampler2D tex; - -// see https://github.com/CeeJayDK/SweetFX/blob/a792aee788c6203385a858ebdea82a77f81c67f0/Shaders/Vibrance.fx#L20-L30 -const vec3 VIB_RGB_BALANCE = vec3(1.0, 1.0, 1.0); -const float VIB_VIBRANCE = 0.15; - - -const vec3 VIB_coeffVibrance = VIB_RGB_BALANCE * -VIB_VIBRANCE; - -void main() { - - vec4 pixColor = texture2D(tex, v_texcoord); - - // RGB - vec3 color = vec3(pixColor[0], pixColor[1], pixColor[2]); - - - // vec3 VIB_coefLuma = vec3(0.333333, 0.333334, 0.333333); // was for `if VIB_LUMA == 1` - vec3 VIB_coefLuma = vec3(0.212656, 0.715158, 0.072186); // try both and see which one looks nicer. - - float luma = dot(VIB_coefLuma, color); - - float max_color = max(color[0], max(color[1], color[2])); - float min_color = min(color[0], min(color[1], color[2])); - - float color_saturation = max_color - min_color; - - vec3 p_col = vec3(vec3(vec3(vec3(sign(VIB_coeffVibrance) * color_saturation) - 1.0) * VIB_coeffVibrance) + 1.0); - - pixColor[0] = mix(luma, color[0], p_col[0]); - pixColor[1] = mix(luma, color[1], p_col[1]); - pixColor[2] = mix(luma, color[2], p_col[2]); - - gl_FragColor = pixColor; -} \ No newline at end of file diff --git a/modules/home-manager/desktops/hyprland/keybinds.nix b/modules/home-manager/desktops/hyprland/keybinds.nix deleted file mode 100644 index 33d5097..0000000 --- a/modules/home-manager/desktops/hyprland/keybinds.nix +++ /dev/null @@ -1,49 +0,0 @@ -[ - "SUPER,Q,killactive" - "SUPER,T,exec,kitty" - "SUPER,TAB,exec,ags -t overview" - "SUPER,C,togglespecialworkspace,calc" - "SUPER_SHIFT,C,exec,hyprpicker | wl-copy" - "SUPER_SHIFT,V,exec,XDG_CURRENT_DESKTOP=sway flameshot gui --clipboard" - "SUPER,P,togglefloating," - "SUPER,P,pin," - "SUPER,D,fullscreen,1" - "SUPER,V,fullscreen,0" - - "SUPER_SHIFT,up,movewindow,u" - "SUPER_SHIFT,down,movewindow,d" - "SUPER_SHIFT,left,movewindow,l" - "SUPER_SHIFT,right,movewindow,r" - - "SUPER,up,movefocus,u" - "SUPER,down,movefocus,d" - "SUPER,left,movefocus,l" - "SUPER,right,movefocus,r" - - "SUPER,f,workspace,r-1" - "SUPER,h,workspace,r+1" - "SUPER_SHIFT,f,movetoworkspace,r-1" - "SUPER_SHIFT,h,movetoworkspace,r+1" - "SUPER,mouse_up,workspace,r+1" - "SUPER,mouse_down,workspace,r-1" - - "SUPER,1,workspace,1" - "SUPER,2,workspace,2" - "SUPER,3,workspace,3" - "SUPER,4,workspace,4" - "SUPER,5,workspace,5" - "SUPER,6,workspace,6" - "SUPER,7,workspace,7" - "SUPER,8,workspace,8" - "SUPER,9,workspace,9" - - "SUPER_SHIFT,1,movetoworkspace,1" - "SUPER_SHIFT,2,movetoworkspace,2" - "SUPER_SHIFT,3,movetoworkspace,3" - "SUPER_SHIFT,4,movetoworkspace,4" - "SUPER_SHIFT,5,movetoworkspace,5" - "SUPER_SHIFT,6,movetoworkspace,6" - "SUPER_SHIFT,7,movetoworkspace,7" - "SUPER_SHIFT,8,movetoworkspace,8" - "SUPER_SHIFT,9,movetoworkspace,9" -] diff --git a/modules/home-manager/desktops/hyprland/kitty.nix b/modules/home-manager/desktops/hyprland/kitty.nix deleted file mode 100644 index e8c472f..0000000 --- a/modules/home-manager/desktops/hyprland/kitty.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ pkgs }: -{ - enable = true; - shellIntegration.enableZshIntegration = true; - extraConfig = '' - symbol_map U+23FB-U+23FE,U+2665,U+26A1,U+2B58,U+E000-U+E00A,U+E0A0-U+E0A3,U+E0B0-U+E0D4,U+E200-U+E2A9,U+E300-U+E3E3,U+E5FA-U+E6AA,U+E700-U+E7C5,U+EA60-U+EBEB,U+F000-U+F2E0,U+F300-U+F32F,U+F400-U+F4A9,U+F500-U+F8FF,U+F0001-U+F1AF0 Symbols Nerd Font Mono - - font_size 12.75 - ''; - settings = { - window_padding_width = 10; - text_composition_strategy = "1.0 0"; - }; -} diff --git a/modules/home-manager/desktops/hyprland/mousebinds.nix b/modules/home-manager/desktops/hyprland/mousebinds.nix deleted file mode 100644 index f4c3f28..0000000 --- a/modules/home-manager/desktops/hyprland/mousebinds.nix +++ /dev/null @@ -1 +0,0 @@ -[ "SUPER,mouse:272,movewindow" "SUPER,mouse:273,resizewindow" ] diff --git a/modules/home-manager/programs/neovide.nix b/modules/home-manager/programs/neovide.nix index 5946b79..db7e803 100644 --- a/modules/home-manager/programs/neovide.nix +++ b/modules/home-manager/programs/neovide.nix @@ -22,6 +22,10 @@ ]; }; }; + wayland.windowManager.hyprland.settings.windowrulev2 = [ + # For some reason it really wants to be maximized + "suppressevent maximize,class:^(neovide)$" + ]; programs.nixvim = { globals = { neovide_text_gamma = 0.0; diff --git a/modules/home-manager/theme/md3-evo.nix b/modules/home-manager/theme/md3-evo.nix index bd187d8..f120e3a 100644 --- a/modules/home-manager/theme/md3-evo.nix +++ b/modules/home-manager/theme/md3-evo.nix @@ -168,217 +168,274 @@ in }; }; - config = lib.mkIf cfg.enable { - home.packages = [ - pkgs.adw-gtk3 - (pkgs.writeShellApplication { - name = "theme"; - runtimeInputs = [ - pkgs.matugen - pkgs.swww - pkgs.zenity - ]; - text = '' - WALLPAPER=${config.xdg.configHome}/matugen/wallpaper + config = + let + theme-script = ( + pkgs.writeShellApplication { + name = "theme"; + runtimeInputs = [ + pkgs.matugen + pkgs.swww + pkgs.zenity + ]; + text = '' + WALLPAPER=${config.xdg.configHome}/matugen/wallpaper - SCHEME=$(dconf read /org/gnome/desktop/interface/color-scheme) - if [ "$SCHEME" = "'prefer-light'" ]; then - MODE="light" - else - MODE="dark" - fi - - if [ $# -eq 0 ]; then - echo -e "\033[1mUsage:\033[0m mode|light|dark|toggle|wallpaper" - exit 1 - elif [ "$1" = "mode" ]; then - echo -e "$MODE" - exit 0 - elif [ "$1" = "wallpaper" ]; then - if [ $# -eq 1 ]; then - PICKED=$(zenity --file-selection --file-filter='Images | *.png *.jpg *.jpeg *.svg *.bmp *.gif') - cp "$PICKED" "$WALLPAPER" - else - cp "$2" "$WALLPAPER" - fi - elif [ "$1" = "toggle" ]; then - if [ "$MODE" = "light" ]; then - MODE="dark" - else + SCHEME=$(dconf read /org/gnome/desktop/interface/color-scheme) + if [ "$SCHEME" = "'prefer-light'" ]; then MODE="light" + else + MODE="dark" fi - elif [ "$1" = "light" ] || [ "$1" = "dark" ]; then - MODE="$1" - elif [ "$1" = "init" ]; then - echo -e "\033[1mSetting up matugen\033[0m" - else - echo -e "\033[31mInvalid argument\033[0m" - exit 1 - fi - if [ ! -f $WALLPAPER ]; then - echo -e "\033[31,1mNo wallpaper set\033[0m" - exit 1 - fi + if [ $# -eq 0 ]; then + echo -e "\033[1mUsage:\033[0m mode|light|dark|toggle|wallpaper" + exit 1 + elif [ "$1" = "mode" ]; then + echo -e "$MODE" + exit 0 + elif [ "$1" = "wallpaper" ]; then + if [ $# -eq 1 ]; then + PICKED=$(zenity --file-selection --file-filter='Images | *.png *.jpg *.jpeg *.svg *.bmp *.gif') + cp "$PICKED" "$WALLPAPER" + else + cp "$2" "$WALLPAPER" + fi + elif [ "$1" = "toggle" ]; then + if [ "$MODE" = "light" ]; then + MODE="dark" + else + MODE="light" + fi + elif [ "$1" = "light" ] || [ "$1" = "dark" ]; then + MODE="$1" + elif [ "$1" = "init" ]; then + echo -e "\033[1mSetting up matugen\033[0m" + else + echo -e "\033[31mInvalid argument\033[0m" + exit 1 + fi - if [ "$MODE" = "light" ]; then - GTK_THEME="adw-gtk3" - else - GTK_THEME="adw-gtk3-dark" - fi + if [ ! -f $WALLPAPER ]; then + echo -e "\033[31,1mNo wallpaper set\033[0m" + exit 1 + fi - matugen image "$WALLPAPER" --type scheme-${cfg.flavour} --contrast ${builtins.toString cfg.contrast} --mode "$MODE" - sed -i "s/set background=dark/set background=$MODE/g" ${config.xdg.configHome}/nvim/colors/md3-evo.vim + if [ "$MODE" = "light" ]; then + GTK_THEME="adw-gtk3" + else + GTK_THEME="adw-gtk3-dark" + fi - dconf write /org/gnome/desktop/interface/gtk-theme "'$GTK_THEME'" - dconf write /org/gnome/desktop/interface/color-scheme "'prefer-$MODE'" + matugen image "$WALLPAPER" --type scheme-${cfg.flavour} --contrast ${builtins.toString cfg.contrast} --mode "$MODE" + sed -i "s/set background=dark/set background=$MODE/g" ${config.xdg.configHome}/nvim/colors/md3-evo.vim - if command -v hyprctl &> /dev/null; then - hyprctl reload - fi + dconf write /org/gnome/desktop/interface/gtk-theme "'$GTK_THEME'" + dconf write /org/gnome/desktop/interface/color-scheme "'prefer-$MODE'" - for i in $(pgrep -u "$USER" -x nvim); do - kill -USR1 "$i" - done - ''; - }) - ]; + if command -v hyprctl &> /dev/null; then + hyprctl reload + fi - programs.kitty = { - extraConfig = '' - include ${config.xdg.configHome}/kitty/theme.conf - ''; - }; - - programs.nixvim = { - opts.termguicolors = true; - colorscheme = "md3-evo"; - autoCmd = [ - { - event = [ "Signal" ]; - pattern = [ "SIGUSR1" ]; - command = # vim - "colorscheme md3-evo"; - nested = true; + for i in $(pgrep -u "$USER" -x nvim); do + kill -USR1 "$i" + done + ''; } + ); + in + lib.mkIf cfg.enable { + home.packages = [ + pkgs.adw-gtk3 + theme-script ]; - plugins.lualine.settings.options.theme.__raw = # lua - "function() return vim.g.lualine_theme end"; - }; - gtk = { - gtk3.extraCss = # css - "@import './theme.css';"; - gtk4.extraCss = # css - "@import './theme.css';"; - }; + gtk = { + gtk3.extraCss = # css + "@import './theme.css';"; + gtk4.extraCss = # css + "@import './theme.css';"; + iconTheme = { + name = "Tela"; + package = pkgs.tela-icon-theme; + }; + }; + qt.platformTheme.name = "qtct"; - wayland.windowManager.hyprland = { - settings.exec-once = [ - "${pkgs.swww}/bin/swww-daemon" - "theme init" - ]; - extraConfig = '' - source=./theme.conf - ''; - }; - - programs.matugen = { - enable = true; - settings = { - config = { - reload_apps = true; - reload_apps_list = { - kitty = config.programs.kitty.enable; - waybar = false; - dunst = config.services.dunst.enable; - }; - - set_wallpaper = true; - wallpaper_tool = "Swww"; - - custom_colors = - let - mkColor = category: color: { - color = cfg.${category}.${color}; - blend = cfg.${category}.blend; - }; - in - { - red = mkColor "ansi" "red"; - green = mkColor "ansi" "green"; - yellow = mkColor "ansi" "yellow"; - orange = mkColor "ansi" "orange"; - blue = mkColor "ansi" "blue"; - magenta = mkColor "ansi" "magenta"; - cyan = mkColor "ansi" "cyan"; - - keywords = mkColor "syntax" "keywords"; - functions = mkColor "syntax" "functions"; - constants = mkColor "syntax" "constants"; - properties = mkColor "syntax" "properties"; - strings = mkColor "syntax" "strings"; - numbers = mkColor "syntax" "numbers"; - structures = mkColor "syntax" "structures"; - types = mkColor "syntax" "types"; - - danger = mkColor "semantic" "danger"; - warning = mkColor "semantic" "warning"; - success = mkColor "semantic" "success"; - info = mkColor "semantic" "info"; + systemd.user.services = { + /* + swww-daemon = { + Unit = { + Description = "Swww Daemon"; + After = [ "graphical-session.target" ]; }; - - custom_keywords = { - padding = builtins.toString cfg.padding; - double_padding = builtins.toString (cfg.padding * 2); - radius = builtins.toString cfg.radius; - transparency = builtins.toString cfg.transparency; - blur = builtins.toString cfg.blur; - flavour = cfg.flavour; - contrast = builtins.toString cfg.contrast; - transparency_hex = - let - zeroPad = hex: if builtins.stringLength hex == 1 then "0${hex}" else hex; - in - zeroPad (lib.trivial.toHexString (builtins.floor (cfg.transparency * 255))); + Install.WantedBy = [ "graphical-session.target" ]; + Service = { + ExecStart = "${pkgs.swww}/bin/swww-daemon"; + Restart = "on-failure"; + }; + }; + */ + theme-init = { + Unit = { + Description = "MD3 Evo Theme Init"; + After = [ + "graphical-session.target" + "swww-daemon.service" + ]; + }; + Install.WantedBy = [ "graphical-session.target" ]; + Service = { + ExecStart = "${lib.getExe theme-script} init"; + Restart = "on-failure"; }; }; + }; - templates = - let - gtk = pkgs.writeText "gtk4.css" (import ./gtk.nix); - in - { - kitty = { - input_path = ./kitty.conf; - output_path = "${config.xdg.configHome}/kitty/theme.conf"; - }; - nvim = { - input_path = ./nvim.vim; - output_path = "${config.xdg.configHome}/nvim/colors/md3-evo.vim"; - }; - hyprland = { - input_path = ./hyprland.conf; - output_path = "${config.xdg.configHome}/hypr/theme.conf"; - }; - anyrun = { - input_path = ./anyrun.css; - output_path = "${config.xdg.configHome}/anyrun/theme.css"; - }; - gtk3 = { - input_path = gtk; - output_path = "${config.xdg.configHome}/gtk-3.0/theme.css"; - }; - gtk4 = { - input_path = gtk; - output_path = "${config.xdg.configHome}/gtk-4.0/theme.css"; - }; - vesktop = { - input_path = ./discord.css; - output_path = "${config.xdg.configHome}/vesktop/themes/matugen.theme.css"; - }; + wayland.windowManager.hyprland = { + settings = { + windowrulev2 = [ "float,class:^(zenity)$" ]; + decoration.shadow = { + enabled = true; + range = 16; + color = "rgba(00000044)"; }; + animations = { + enabled = "yes"; + bezier = "myBezier, 0.05, 0.9, 0.1, 1.05"; + animation = [ + "windows, 1, 5, myBezier" + "windowsOut, 1, 7, default, popin 80%" + "border, 1, 10, default" + "fade, 1, 7, default" + "workspaces, 1, 6, default" + ]; + }; + }; + extraConfig = '' + source=./theme.conf + ''; + }; + + programs = { + kitty = { + extraConfig = '' + include ${config.xdg.configHome}/kitty/theme.conf + ''; + }; + + nixvim = { + opts.termguicolors = true; + colorscheme = "md3-evo"; + autoCmd = [ + { + event = [ "Signal" ]; + pattern = [ "SIGUSR1" ]; + command = # vim + "colorscheme md3-evo"; + nested = true; + } + ]; + plugins.lualine.settings.options.theme.__raw = # lua + "function() return vim.g.lualine_theme end"; + }; + matugen = { + enable = true; + settings = { + config = { + reload_apps = true; + reload_apps_list = { + kitty = config.programs.kitty.enable; + waybar = false; + dunst = config.services.dunst.enable; + }; + + set_wallpaper = true; + wallpaper_tool = "Swww"; + + custom_colors = + let + mkColor = category: color: { + inherit (cfg.${category}) blend; + color = cfg.${category}.${color}; + }; + in + { + red = mkColor "ansi" "red"; + green = mkColor "ansi" "green"; + yellow = mkColor "ansi" "yellow"; + orange = mkColor "ansi" "orange"; + blue = mkColor "ansi" "blue"; + magenta = mkColor "ansi" "magenta"; + cyan = mkColor "ansi" "cyan"; + + keywords = mkColor "syntax" "keywords"; + functions = mkColor "syntax" "functions"; + constants = mkColor "syntax" "constants"; + properties = mkColor "syntax" "properties"; + strings = mkColor "syntax" "strings"; + numbers = mkColor "syntax" "numbers"; + structures = mkColor "syntax" "structures"; + types = mkColor "syntax" "types"; + + danger = mkColor "semantic" "danger"; + warning = mkColor "semantic" "warning"; + success = mkColor "semantic" "success"; + info = mkColor "semantic" "info"; + }; + + custom_keywords = { + inherit (cfg) flavour; + padding = builtins.toString cfg.padding; + double_padding = builtins.toString (cfg.padding * 2); + radius = builtins.toString cfg.radius; + transparency = builtins.toString cfg.transparency; + blur = builtins.toString cfg.blur; + contrast = builtins.toString cfg.contrast; + transparency_hex = + let + zeroPad = hex: if builtins.stringLength hex == 1 then "0${hex}" else hex; + in + zeroPad (lib.trivial.toHexString (builtins.floor (cfg.transparency * 255))); + }; + }; + + templates = + let + gtk = pkgs.writeText "gtk4.css" (import ./gtk.nix); + in + { + kitty = { + input_path = ./kitty.conf; + output_path = "${config.xdg.configHome}/kitty/theme.conf"; + }; + nvim = { + input_path = ./nvim.vim; + output_path = "${config.xdg.configHome}/nvim/colors/md3-evo.vim"; + }; + hyprland = { + input_path = ./hyprland.conf; + output_path = "${config.xdg.configHome}/hypr/theme.conf"; + }; + anyrun = { + input_path = ./anyrun.css; + output_path = "${config.xdg.configHome}/anyrun/theme.css"; + }; + gtk3 = { + input_path = gtk; + output_path = "${config.xdg.configHome}/gtk-3.0/theme.css"; + }; + gtk4 = { + input_path = gtk; + output_path = "${config.xdg.configHome}/gtk-4.0/theme.css"; + }; + vesktop = { + input_path = ./discord.css; + output_path = "${config.xdg.configHome}/vesktop/themes/matugen.theme.css"; + }; + }; + }; + }; }; }; - }; } diff --git a/modules/nixos/boot/quiet.nix b/modules/nixos/boot/quiet.nix index 28f19fc..6bdf86e 100644 --- a/modules/nixos/boot/quiet.nix +++ b/modules/nixos/boot/quiet.nix @@ -1,4 +1,9 @@ -{ config, lib, ... }: +{ + config, + lib, + username, + ... +}: with lib; @@ -11,10 +16,11 @@ in }; config = mkIf cfg.enable { + users.users.${username}.linger = true; boot = { loader.timeout = 0; - # plymouth.enable = true; + plymouth.enable = true; kernelParams = [ "quiet" @@ -25,7 +31,31 @@ in "vt.global_cursor_default=0" # no cursor blinking ]; consoleLogLevel = 0; - initrd.verbose = false; + initrd = { + verbose = false; + systemd = { + enable = true; + services = { + #plymouth-quit.wantedBy = lib.mkForce [ ]; + # plymouth-quit-wait.wantedBy = lib.mkForce [ ]; + }; + }; + }; }; + services.greetd.greeterManagesPlymouth = true; + /* + systemd.services = { + plymouth-quit-wait = { + overrideStrategy = "asDropin"; + after = [ "graphical-session.target" ]; + wantedBy = lib.mkForce [ "graphical-session.target" ]; + }; + plymouth-quit = { + overrideStrategy = "asDropin"; + after = [ "graphical-session.target" ]; + wantedBy = lib.mkForce [ "graphical-session.target" ]; + }; + }; + */ }; } diff --git a/modules/nixos/default.nix b/modules/nixos/default.nix index 2b99b2a..0a37c42 100644 --- a/modules/nixos/default.nix +++ b/modules/nixos/default.nix @@ -4,7 +4,6 @@ ./boot/quiet.nix ./desktops/hyprland.nix - ./desktops/gamescope.nix ./fonts/fira-code.nix ./fonts/noto-sans.nix @@ -30,8 +29,14 @@ ./services/airprint.nix - ./shell/waybar.nix ./shell/dunst.nix + ./shell/firefox-pip.nix + ./shell/flameshot.nix + ./shell/gnome-keyring.nix + ./shell/hyprpicker.nix + ./shell/kitty.nix + ./shell/walker.nix + ./shell/waybar.nix ./xdg/forced-compliance.nix ]; diff --git a/modules/nixos/desktops/gamescope.nix b/modules/nixos/desktops/gamescope.nix deleted file mode 100644 index db619d5..0000000 --- a/modules/nixos/desktops/gamescope.nix +++ /dev/null @@ -1,70 +0,0 @@ -{ - config, - lib, - pkgs, - username, - ... -}: - -with lib; - -let - cfg = config.desktops.gamescope; -in -{ - options.desktops.gamescope.enable = mkEnableOption "Enable the SteamOS Compositor as a desktop environment"; - - config = mkIf cfg.enable { - programs.steam = { - enable = true; - gamescopeSession = { - enable = true; - args = [ - "--hide-cursor-delay" - "3000" - "--fadee-out-duration" - "200" - "--xwayland-count" - "2" - "-W" - (placeholder "SCREEN_WIDTH") - "-H" - (placeholder "SCREEN_HEIGHT") - ]; - }; - }; - - /* - services = { - greetd = { - enable = true; - settings = rec { - initial_session = { - command = "${pkgs.hyprland}/bin/Hyprland &> /dev/null"; - user = username; - }; - default_session = "${pkgs.greetd.tuigreet}/bin/tuigreet"; - }; - }; - - dbus.enable = true; - - pcscd.enable = true; - - # nautilus on non-gnome - gvfs.enable = true; - # fix pinentry on non-gnome - dbus.packages = with pkgs; [ gcr ]; - gnome.gnome-online-accounts.enable = true; - gnome.evolution-data-server.enable = true; - }; - - programs = { - hyprland.enable = true; - kdeconnect.enable = true; - }; - - environment.sessionVariables.NIXOS_OZONE_WL = "1"; - */ - }; -} diff --git a/modules/nixos/desktops/hyprland.nix b/modules/nixos/desktops/hyprland.nix index 697a084..391b873 100644 --- a/modules/nixos/desktops/hyprland.nix +++ b/modules/nixos/desktops/hyprland.nix @@ -8,6 +8,7 @@ let cfg = config.desktops.hyprland; + homeConfig = config.home-manager.users.${username}; in { options.desktops.hyprland = { @@ -15,12 +16,123 @@ in }; config = lib.mkIf cfg.enable { - environment = { - sessionVariables.NIXOS_OZONE_WL = "1"; - systemPackages = with pkgs; [ glib ]; + environment.systemPackages = with pkgs; [ glib ]; + + programs.hyprland = { + enable = true; + withUWSM = true; + }; + home-manager.users.${username} = { + wayland.windowManager.hyprland = { + systemd.enable = false; + }; + home.sessionVariables = { + NIXOS_OZONE_WL = "1"; + GDK_BACKEND = "wayland,x11,*"; + QT_QPA_PLATFORM = "wayland;xcb"; + QT_WAYLAND_DISABLE_WINDOWDECORATION = "1"; + SDL_VIDEODRIVER = "wayland"; + CLUTTER_BACKEND = "wayland"; + }; + xdg.configFile."uwsm/env".source = pkgs.writeText "env" ( + lib.strings.concatLines ( + lib.attrsets.mapAttrsToList ( + k: v: "export ${builtins.toString k}=${builtins.toString v}" + ) config.home-manager.users.${username}.home.sessionVariables + ) + ); + systemd.user.services = { + "flatpak-managed-install".Unit = { + After = [ "network-online.target" ]; + Wants = [ "network-online.target" ]; + }; + }; + /* + programs.zsh.initExtraFirst = # sh + '' + if uwsm check may-start; then + exec uwsm start hyprland-uwsm.desktop > ${homeConfig.xdg.configHome}/uwsm.log 2> ${homeConfig.xdg.configHome}/uwsm.err + fi + ''; + */ + }; + + systemd.services = { + "flatpak-managed-install" = { + after = [ "network-online.target" ]; + wants = [ "network-online.target" ]; + }; + greetd.serviceConfig = { + Type = "idle"; + StandardInput = "tty"; + StandardOutput = "journal"; + StandardError = "journal"; + TTYReset = false; + TTYVHangup = false; + TTYVTDisallocate = false; + }; + /* + "uwsm-display-manager" = { + description = "UWSM Display Manager"; + conflicts = [ "getty@tty1.service" ]; + after = [ + "systemd-user-sessions.service" + "plymouth-quit-wait.service" + "getty@tty1.service" + ]; + serviceConfig = { + Type = "simple"; + IgnoreSIGPIPE = "no"; + SendSIGHUP = "yes"; + TimeoutStopSec = "30s"; + KeyringMode = "shared"; + Restart = "always"; + RestartSec = "5"; + StartLimitBurst = "5"; + StartLimitInterval = "30"; + }; + restartIfChanged = false; + script = '' + ${pkgs.sudo}/bin/sudo -u ${username} --login uwsm start hyprland-uwsm.desktop + ''; + environment = { + DISPLAY = ":0"; + # XDG_RUNTIME_DIR = "/run/user/$(id -u ${username})"; + }; + aliases = [ "display-manager.service" ]; + }; + */ + /* + "getty@tty1" = { + overrideStrategy = "asDropin"; + description = "Start Hyprland"; + after = [ + "sysinit.target" + "initrd-switch-root.service" + "systemd-udev-trigger.service" + "seatd.service" + "systemd-logind.service" + ]; + wants = [ + "systemd-udev-trigger.service" + "seatd.service" + "systemd-logind.service" + ]; + unitConfig.ConditionPathExists = "/home/${username}"; + onFailure = [ "emergency.target" ]; + serviceConfig.Type = "simple"; + preStart = "+${pkgs.coreutils}/bin/rm -f /run/nologin"; + script = '' + -${pkgs.util-linux}/bin/agetty -o '-p -f -- \u' --noclear --autologin ${username} %I $TERM StandardOutput=null StandardError=journal + ''; + wantedBy = [ + "graphical.target" + "initrd-switch-root.service" + ]; + }; + */ }; - programs.hyprland.enable = true; xdg.portal = { enable = true; extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; @@ -35,38 +147,46 @@ in }; # https://github.com/sjcobb2022/nixos-config/blob/70fb548b961c19e9855d2de86ee9569a7a88d976/hosts/common/optional/greetd.nix#L23C1-L33C2 - systemd.services.greetd.serviceConfig = { - Type = "idle"; - StandardInput = "tty"; - StandardOutput = "tty"; - StandardError = "journal"; # Without this errors will spam on screen - # Without these bootlogs will spam on screen - TTYReset = true; - TTYVHangup = true; - TTYVTDisallocate = true; - }; + /* + systemd.services = { + greetd.serviceConfig = { + Type = "idle"; + StandardInput = "tty"; + StandardOutput = "tty"; + StandardError = "journal"; # Without this errors will spam on screen + # Without these bootlogs will spam on screen + TTYReset = true; + TTYVHangup = true; + TTYVTDisallocate = true; + }; + }; + */ services = { greetd = { enable = true; + greeterManagesPlymouth = false; + vt = 2; settings = { - default_session = { - command = "${pkgs.greetd.tuigreet}/bin/tuigreet --asterisks --remember --remember-session --sessions ${pkgs.hyprland}/share/wayland-sessions"; + initial_session = { + command = "uwsm start hyprland-uwsm.desktop"; user = username; }; + default_session = { + command = "${lib.getExe pkgs.greetd.tuigreet} --asterisks --remember --user-menu --cmd 'uwsm start hyprland-uwsm.desktop'"; + user = username; + }; + terminal.switch = false; }; }; - - dbus.enable = true; - + dbus = { + enable = true; + implementation = "broker"; + }; pcscd.enable = true; - # nautilus on non-gnome gvfs.enable = true; - # fix pinentry on non-gnome - dbus.packages = with pkgs; [ gcr ]; - gnome.gnome-online-accounts.enable = true; - gnome.evolution-data-server.enable = true; }; + programs.dconf.enable = true; }; } diff --git a/modules/nixos/hardware/amdgpu.nix b/modules/nixos/hardware/amdgpu.nix index 6cbe556..aa457cd 100644 --- a/modules/nixos/hardware/amdgpu.nix +++ b/modules/nixos/hardware/amdgpu.nix @@ -21,12 +21,26 @@ in extraPackages = with pkgs; [ rocmPackages.clr.icd ]; }; + systemd.tmpfiles.rules = + let + rocmEnv = pkgs.symlinkJoin { + name = "rocm-combined"; + paths = with pkgs.rocmPackages; [ + rocblas + hipblas + clr + ]; + }; + in + [ + "L+ /opt/rocm - - - - ${rocmEnv}" + ]; + boot = { # https://docs.kernel.org/gpu/amdgpu/module-parameters.html kernelParams = [ "amdgpu.seamless=1" "amdgpu.freesync_video=1" - "initcall_blacklist=simpledrm_platform_driver_init" ]; initrd.kernelModules = [ "amdgpu" ]; }; @@ -36,6 +50,7 @@ in glxinfo libva-utils vulkan-tools + clinfo ]; }; } diff --git a/modules/nixos/hardware/fv43u.icc b/modules/nixos/hardware/fv43u.icc new file mode 100644 index 0000000000000000000000000000000000000000..56744d568c4ab674c2b312cd711bada2ae30c314 GIT binary patch literal 8724 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 P&nQapaX^3vydU^qU9Y9> literal 0 HcmV?d00001 diff --git a/modules/nixos/hardware/fv43u.nix b/modules/nixos/hardware/fv43u.nix index ed3a572..9a2fae8 100644 --- a/modules/nixos/hardware/fv43u.nix +++ b/modules/nixos/hardware/fv43u.nix @@ -17,15 +17,42 @@ in config = mkIf cfg.enable { fonts.fontconfig.subpixel.rgba = "bgr"; - hardware.gbmonctl.enable = true; - boot.kernelParams = [ "video=3840x2160@144" ]; + hardware = { + gbmonctl.enable = true; + firmware = [ + (pkgs.runCommandNoCC "fv43u_edid" { } '' + mkdir -p $out/lib/firmware/edid + cp ${./fv43u_edid.bin} $out/lib/firmware/edid/fv43u.bin + '') + ]; + }; + boot = { + kernelParams = [ + "drm.edid_firmware=DP-3:edid/fv43u.bin" + "video=DP-3:3840x2160-30@144" + ]; + initrd.extraFiles."lib/firmware/edid/fv43u.bin".source = + pkgs.runCommandLocal "fv43u_edid" { } + "cp ${./fv43u_edid.bin} $out"; + }; + services.colord.enable = true; + environment.systemPackages = [ + (pkgs.runCommandNoCC "fv43u_icc" { } '' + mkdir -p $out/share/color/icc + cp ${./fv43u.icc} $out/share/color/icc/fv43u.icc + '') + ]; home-manager.users.${username} = { + home.sessionVariables = { + ENABLE_HDR_WSI = "1"; + DXVK_HDR = "1"; + }; wayland.windowManager.hyprland.settings = { general.layout = "master"; master = { orientation = "center"; - always_center_master = true; + slave_count_for_center_master = 0; mfact = 0.4; }; monitor = [ @@ -34,6 +61,13 @@ in ]; xwayland.force_zero_scaling = true; misc.vrr = 2; # VA suffers from VRR flicker + cursor = { + min_refresh_rate = 48; + no_break_fs_vrr = true; + }; + experimental = { + xx_color_management_v4 = true; + }; }; programs.waybar.settings.mainBar."custom/brightness" = @@ -81,16 +115,5 @@ in interval = "once"; }; }; - - programs.steam.gamescopeSession = { - env = { - SCREEN_WIDTH = "3840"; - SCREEN_HEIGHT = "2160"; - }; - args = [ - "--hdr-enabled" - "--hdr-itm-enable" - ]; - }; }; } diff --git a/modules/nixos/hardware/fv43u_edid.bin b/modules/nixos/hardware/fv43u_edid.bin new file mode 100644 index 0000000000000000000000000000000000000000..50a03298215f7e7326cf22750443c9df0bac0060 GIT binary patch literal 384 zcmZSh4+ab}Aq>upKwvD-$a2(8z2f(=r5k-Mwy6mQgs6HkTs+X&FqL6514so3_+DUG z@S(u2!9c;3VP}UT1A`m`1H)e)g9+Bwos3)xU;q^P!{F#26dJ7H7G`1`%B27l`Ojcv zXliKSWME)sXkpI9w3CV1xX_o0Sx`urMN?lvz&Ht2SG1q(t0gcN@8Kt!h1H&hf@C_2a} zSU}YPEyn`13xq0}8JHPu;$JYZ{O2rZkZzD?n9rKVz|p|Yknoa`added_fb) +- drmModeRmFB (backend->device_fd, buffer->id); ++ /* Use CloseFB if possible, to avoid screen flicker when handing ++ * over to the login manager */ ++ if (drmModeCloseFB (backend->device_fd, buffer->id) == -EINVAL) ++ drmModeRmFB (backend->device_fd, buffer->id); + + if (buffer->map_address != MAP_FAILED) { + munmap (buffer->map_address, buffer->map_size);