From a11ee7ee026a619228eabfd172c4cad09bdfe70f Mon Sep 17 00:00:00 2001 From: Sascha Koenig Date: Mon, 26 May 2025 11:36:25 +0200 Subject: [PATCH] +m3-daedalus --- flake.nix | 11 +- home/features/cli/nushell.nix | 2 + home/features/coding/default.nix | 1 - home/features/desktop/coding.nix | 188 +++++++++--------- home/m3tam3re/m3-aether.nix | 2 +- home/m3tam3re/m3-atlas.nix | 2 +- home/m3tam3re/m3-daedalus.nix | 102 ++++++++++ home/m3tam3re/m3-helios.nix | 2 +- hosts/m3-aether/services/cloud-init.nix | 7 + hosts/m3-atlas/secrets.nix | 7 + .../m3-atlas/services/containers/default.nix | 1 + hosts/m3-atlas/services/containers/kestra.nix | 34 ++++ hosts/m3-atlas/services/postgres.nix | 3 +- hosts/m3-atlas/services/tailscale.nix | 2 +- hosts/m3-hermes/default.nix | 6 - secrets.nix | 2 + secrets/kestra-config.age | Bin 0 -> 1601 bytes secrets/kestra-env.age | Bin 0 -> 1479 bytes 18 files changed, 265 insertions(+), 107 deletions(-) create mode 100644 home/m3tam3re/m3-daedalus.nix create mode 100644 hosts/m3-atlas/services/containers/kestra.nix create mode 100644 secrets/kestra-config.age create mode 100644 secrets/kestra-env.age diff --git a/flake.nix b/flake.nix index 78f1aac..fa1b62a 100644 --- a/flake.nix +++ b/flake.nix @@ -124,7 +124,16 @@ ]; }; }; - + homeConfigurations = { + "m3tam3re@m3-daedalus" = home-manager.lib.homeManagerConfiguration { + pkgs = nixpkgs.legacyPackages."x86_64-linux"; + extraSpecialArgs = { + inherit inputs outputs; + hostname = "m3-daedalus"; + }; + modules = [./home/m3tam3re/m3-daedalus.nix]; + }; + }; devShells.x86_64-linux.infraShell = let pkgs = nixpkgs.legacyPackages.x86_64-linux; in diff --git a/home/features/cli/nushell.nix b/home/features/cli/nushell.nix index 7fd8829..381d946 100644 --- a/home/features/cli/nushell.nix +++ b/home/features/cli/nushell.nix @@ -20,6 +20,8 @@ in { $env.TERMINAL = "kitty" $env.EDITOR = "nvim" $env.VISUAL = "zed" + $env.FZF_DEFAULT_COMMAND = "fd --type f --exclude .git --follow --hidden" + $env.FZF_DEFAULT_OPTS = "--preview='bat --color=always -n {}' --bind 'ctrl-/:toggle-preview' --header 'Press CTRL-Y to copy command into clipboard' --bind 'ctrl-/:toggle-preview' --bind 'ctrl-y:execute-silent(echo -n {2..} | wl-copy)+abort' --color bg:#282a36,bg+:#44475a,fg:#f8f8f2,fg+:#f8f8f2,header:#6272a4,hl:#bd93f9,hl+:#bd93f9,info:#ffb86c,marker:#ff79c6,pointer:#ff79c6,prompt:#50fa7b,spinner:#ffb86c" $env.XDG_DATA_HOME = $"($env.HOME)/.local/share" $env.FZF_DEFAULT_COMMAND = "fd --type f --exclude .git --follow --hidden" $env.SSH_AUTH_SOCK = "/run/user/1000/gnupg/S.gpg-agent.ssh" diff --git a/home/features/coding/default.nix b/home/features/coding/default.nix index 467fcf8..3a87f1d 100644 --- a/home/features/coding/default.nix +++ b/home/features/coding/default.nix @@ -9,7 +9,6 @@ # Scientific packages numba numpy - openai-whisper torch srt ])) diff --git a/home/features/desktop/coding.nix b/home/features/desktop/coding.nix index d3c12d5..e3d25ab 100644 --- a/home/features/desktop/coding.nix +++ b/home/features/desktop/coding.nix @@ -5,7 +5,7 @@ ... }: with lib; let - cfg = config.features.desktop.office; + cfg = config.features.desktop.coding; in { options.features.desktop.coding.enable = mkEnableOption "install coding related stuff"; @@ -18,98 +18,98 @@ in { programs.zed-editor = { enable = true; - # userSettings = { - # features = { - # inline_prediction_provider = "zed"; - # edit_prediction_provider = "zed"; - # copilot = false; - # }; - # telemetry = { - # metrics = false; - # }; - # lsp = { - # rust_analyzer = { - # binary = {path_lookup = true;}; - # }; - # }; - # languages = { - # Nix = { - # language_servers = ["nixd"]; - # formatter = { - # external = { - # command = "alejandra"; - # arguments = ["-q" "-"]; - # }; - # }; - # }; - # Python = { - # language_servers = ["pyright"]; - # formatter = { - # external = { - # command = "black"; - # arguments = ["-"]; - # }; - # }; - # }; - # }; - # context_servers = { - # "some-context-server" = { - # command = { - # path = "some-command"; - # args = ["arg-1" "arg-2"]; - # env = {}; - # }; - # settings = {}; - # }; - # }; - # assistant = { - # version = "2"; - # default_model = { - # provider = "anthropic"; - # model = "Claude 3.7 Sonnet"; - # }; - # }; - # language_models = { - # anthropic = { - # version = "1"; - # api_url = "https://api.anthropic.com"; - # }; - # openai = { - # version = "1"; - # api_url = "https://api.openai.com/v1"; - # }; - # ollama = { - # api_url = "http://localhost:11434"; - # }; - # }; - # ssh_connections = [ - # { - # host = "152.53.85.162"; - # nickname = "m3-atlas"; - # args = ["-i" "~/.ssh/m3tam3re"]; - # } - # { - # host = "95.217.189.186"; - # port = 2222; - # nickname = "self-host-playbook"; - # args = ["-i" "~/.ssh/self-host-playbook"]; - # "projects" = [ - # { - # paths = ["/etc/nixos/current-systemconfig"]; - # } - # ]; - # } - # ]; - # auto_update = false; - # format_on_save = "on"; - # vim_mode = true; - # load_direnv = "shell_hook"; - # theme = "Dracula"; - # buffer_font_family = "FiraCode Nerd Font"; - # ui_font_size = 16; - # buffer_font_size = 16; - # show_edit_predictions = true; - # }; + userSettings = { + features = { + inline_prediction_provider = "zed"; + edit_prediction_provider = "zed"; + copilot = false; + }; + telemetry = { + metrics = false; + }; + lsp = { + rust_analyzer = { + binary = {path_lookup = true;}; + }; + }; + languages = { + Nix = { + language_servers = ["nixd"]; + formatter = { + external = { + command = "alejandra"; + arguments = ["-q" "-"]; + }; + }; + }; + Python = { + language_servers = ["pyright"]; + formatter = { + external = { + command = "black"; + arguments = ["-"]; + }; + }; + }; + }; + context_servers = { + "some-context-server" = { + command = { + path = "some-command"; + args = ["arg-1" "arg-2"]; + env = {}; + }; + settings = {}; + }; + }; + assistant = { + version = "2"; + default_model = { + provider = "anthropic"; + model = "Claude 3.7 Sonnet"; + }; + }; + language_models = { + anthropic = { + version = "1"; + api_url = "https://api.anthropic.com"; + }; + openai = { + version = "1"; + api_url = "https://api.openai.com/v1"; + }; + ollama = { + api_url = "http://localhost:11434"; + }; + }; + ssh_connections = [ + { + host = "152.53.85.162"; + nickname = "m3-atlas"; + args = ["-i" "~/.ssh/m3tam3re"]; + } + { + host = "95.217.189.186"; + port = 2222; + nickname = "self-host-playbook"; + args = ["-i" "~/.ssh/self-host-playbook"]; + "projects" = [ + { + paths = ["/etc/nixos/current-systemconfig"]; + } + ]; + } + ]; + auto_update = false; + format_on_save = "on"; + vim_mode = true; + load_direnv = "shell_hook"; + theme = "Dracula"; + buffer_font_family = "FiraCode Nerd Font"; + ui_font_size = 16; + buffer_font_size = 16; + show_edit_predictions = true; + }; + }; }; - }; } diff --git a/home/m3tam3re/m3-aether.nix b/home/m3tam3re/m3-aether.nix index 153bbe7..0f6c41d 100644 --- a/home/m3tam3re/m3-aether.nix +++ b/home/m3tam3re/m3-aether.nix @@ -8,7 +8,7 @@ features = { cli = { fish.enable = true; - skim.enable = true; + fzf.enable = true; nitch.enable = true; secrets.enable = false; starship.enable = true; diff --git a/home/m3tam3re/m3-atlas.nix b/home/m3tam3re/m3-atlas.nix index cfb6428..0961992 100644 --- a/home/m3tam3re/m3-atlas.nix +++ b/home/m3tam3re/m3-atlas.nix @@ -8,7 +8,7 @@ features = { cli = { nushell.enable = true; - skim.enable = true; + fzf.enable = true; nitch.enable = true; secrets.enable = false; starship.enable = true; diff --git a/home/m3tam3re/m3-daedalus.nix b/home/m3tam3re/m3-daedalus.nix new file mode 100644 index 0000000..b5ab2c5 --- /dev/null +++ b/home/m3tam3re/m3-daedalus.nix @@ -0,0 +1,102 @@ +{ + config, + lib, + ... +}: +with lib; let + cfg = config.features.desktop.hyprland; +in { + imports = [ + ../common + ./dotfiles + ./home.nix + ../features/cli + ../features/coding + ../features/desktop + #./services/librechat.nix + ]; + + options.features.desktop.hyprland.enable = + mkEnableOption "enable Hyprland"; + + config = mkMerge [ + # Base configuration + { + xdg = { + # TODO: better structure + enable = true; + configFile."mimeapps.list".force = true; + mimeApps = { + enable = true; + associations.added = { + "application/zip" = ["org.gnome.FileRoller.desktop"]; + "application/csv" = ["calc.desktop"]; + "application/pdf" = ["vivaldi-stable.desktop"]; + "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; + "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + }; + defaultApplications = { + "application/zip" = ["org.gnome.FileRoller.desktop"]; + "application/csv" = ["calc.desktop"]; + "application/pdf" = ["vivaldi-stable.desktop"]; + "application/md" = ["dev.zed.Zed.desktop"]; + "application/text" = ["dev.zed.Zed.desktop"]; + "x-scheme-handler/http" = ["vivaldi-stable.desktop"]; + "x-scheme-handler/https" = ["vivaldi-stable.desktop"]; + }; + }; + }; + features = { + cli = { + fish.enable = true; + nushell.enable = true; + fzf.enable = true; + nitch.enable = true; + secrets.enable = true; + starship.enable = true; + }; + desktop = { + coding.enable = true; + crypto.enable = false; + gaming.enable = false; + hyprland.enable = false; + media.enable = true; + office.enable = false; + rofi.enable = true; + fonts.enable = true; + wayland.enable = false; + }; + }; + } + + (mkIf cfg.enable { + wayland.windowManager.hyprland = { + enable = true; + settings = { + monitor = [ + "eDP-1,preferred,0x0,1.25" + "HDMI-A-1,preferred,2560x0,1" + ]; + workspace = [ + "1, monitor:eDP-1, default:true" + "2, monitor:eDP-1" + "3, monitor:eDP-1" + "4, monitor:HDMI-A-1" + "5, monitor:HDMI-A-1,border:false,rounding:false" + "6, monitor:HDMI-A-1" + ]; + windowrule = [ + "workspace 1,class:dev.zed.Zed" + "workspace 1,class:Msty" + "workspace 2,class:(com.obsproject.Studio)" + "workspace 4,opacity 1.0, class:(brave-browser)" + "workspace 4,opacity 1.0, class:(vivaldi-stable)" + "fullscreen,class:^steam_app_\\d+$" + "workspace 5,class:^steam_app_\\d+$" + "idleinhibit focus, class:^steam_app_\\d+$" + ]; + }; + }; + }) + ]; +} diff --git a/home/m3tam3re/m3-helios.nix b/home/m3tam3re/m3-helios.nix index 153bbe7..0f6c41d 100644 --- a/home/m3tam3re/m3-helios.nix +++ b/home/m3tam3re/m3-helios.nix @@ -8,7 +8,7 @@ features = { cli = { fish.enable = true; - skim.enable = true; + fzf.enable = true; nitch.enable = true; secrets.enable = false; starship.enable = true; diff --git a/hosts/m3-aether/services/cloud-init.nix b/hosts/m3-aether/services/cloud-init.nix index e69de29..5bf395e 100644 --- a/hosts/m3-aether/services/cloud-init.nix +++ b/hosts/m3-aether/services/cloud-init.nix @@ -0,0 +1,7 @@ +{ + services.cloud-init = { + enable = true; + ext4.enable = true; + network.enable = true; + }; +} diff --git a/hosts/m3-atlas/secrets.nix b/hosts/m3-atlas/secrets.nix index 97412ca..379d61e 100644 --- a/hosts/m3-atlas/secrets.nix +++ b/hosts/m3-atlas/secrets.nix @@ -7,6 +7,13 @@ ghost-env = { file = ../../secrets/ghost-env.age; }; + kestra-config = { + file = ../../secrets/kestra-config.age; + mode = "644"; + }; + kestra-env = { + file = ../../secrets/kestra-env.age; + }; littlelink-m3tam3re = { file = ../../secrets/littlelink-m3tam3re.age; }; diff --git a/hosts/m3-atlas/services/containers/default.nix b/hosts/m3-atlas/services/containers/default.nix index 915bb41..6b38c84 100644 --- a/hosts/m3-atlas/services/containers/default.nix +++ b/hosts/m3-atlas/services/containers/default.nix @@ -2,6 +2,7 @@ imports = [ ./baserow.nix ./ghost.nix + ./kestra.nix ./littlelink.nix ./matomo.nix # ./n8n.nix diff --git a/hosts/m3-atlas/services/containers/kestra.nix b/hosts/m3-atlas/services/containers/kestra.nix new file mode 100644 index 0000000..87ceb79 --- /dev/null +++ b/hosts/m3-atlas/services/containers/kestra.nix @@ -0,0 +1,34 @@ +{ config, ... }: { + virtualisation.oci-containers.containers."kestra" = { + image = "docker.io/kestra/kestra:latest"; + environmentFiles = [ config.age.secrets.kestra-env.path ]; + cmd = [ "server" "standalone" "--config" "/etc/config/application.yaml"]; + ports = [ "127.0.0.1:3018:8080" ]; + user = "root"; + volumes = [ + "/var/run/docker.sock:/var/run/docker.sock" + "${config.age.secrets.kestra-config.path}:/etc/config/application.yaml" + "kestra_data:/app/storage" + "/tmp/kestra-wd:/tmp/kestra-wd" + ]; + extraOptions = + [ "--add-host=postgres:10.89.0.1" "--ip=10.89.0.18" "--network=web" ]; + }; + + systemd.tmpfiles.rules = [ + "d /tmp/kestra-wd 0750 1000 1000 - -" + ]; + + # Traefik configuration specific to littlelink + services.traefik.dynamicConfigOptions.http = { + services.kestra.loadBalancer.servers = + [{ url = "http://localhost:3018/"; }]; + + routers.kestra = { + rule = "Host(`k.m3ta.dev`)"; + tls = { certResolver = "godaddy"; }; + service = "kestra"; + entrypoints = "websecure"; + }; + }; +} diff --git a/hosts/m3-atlas/services/postgres.nix b/hosts/m3-atlas/services/postgres.nix index c61805a..3c82f01 100644 --- a/hosts/m3-atlas/services/postgres.nix +++ b/hosts/m3-atlas/services/postgres.nix @@ -19,6 +19,7 @@ # Podman network connections for Baserow host baserow baserow 10.89.0.0/24 scram-sha-256 + host kestra kestra 10.89.0.0/24 scram-sha-256 # Deny all other connections local all all reject @@ -29,7 +30,7 @@ services.postgresqlBackup = { enable = true; startAt = "03:10:00"; - databases = ["baserow" "paperless"]; + databases = ["baserow" "paperless" "kestra"]; }; networking.firewall = { extraCommands = '' diff --git a/hosts/m3-atlas/services/tailscale.nix b/hosts/m3-atlas/services/tailscale.nix index ae948e9..7fc3a64 100644 --- a/hosts/m3-atlas/services/tailscale.nix +++ b/hosts/m3-atlas/services/tailscale.nix @@ -20,7 +20,7 @@ onState = ["routable"]; script = '' NETDEV=$(ip -o route get 8.8.8.8 | cut -f 5 -d " ") - ${pkgs.ethtool}/bin/ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list off + ${pkgs.ethtool}/bin/ethtool -K "$NETDEV" rx-udp-gro-forwarding on rx-gro-list off ''; }; }; diff --git a/hosts/m3-hermes/default.nix b/hosts/m3-hermes/default.nix index 03dddc4..e723cb4 100644 --- a/hosts/m3-hermes/default.nix +++ b/hosts/m3-hermes/default.nix @@ -5,8 +5,6 @@ system.stateVersion = "24.11"; - networking.hostName = "m3-hermes"; - services.cloud-init = { enable = true; }; @@ -25,8 +23,4 @@ systemd.network.enable = true; console.keyMap = "us"; - - # Bootloader - boot.loader.grub.enable = true; - boot.loader.grub.device = "/dev/sda"; } diff --git a/secrets.nix b/secrets.nix index c3546cf..6dd6ba5 100644 --- a/secrets.nix +++ b/secrets.nix @@ -22,6 +22,8 @@ in { "secrets/ghost-env.age".publicKeys = systems ++ users; "secrets/littlelink-m3tam3re.age".publicKeys = systems ++ users; "secrets/m3tam3re-secrets.age".publicKeys = systems ++ users; + "secrets/kestra-config.age".publicKeys = systems ++ users; + "secrets/kestra-env.age".publicKeys = systems ++ users; "secrets/minio-root-cred.age".publicKeys = systems ++ users; "secrets/n8n-env.age".publicKeys = systems ++ users; "secrets/paperless-key.age".publicKeys = systems ++ users; diff --git a/secrets/kestra-config.age b/secrets/kestra-config.age new file mode 100644 index 0000000000000000000000000000000000000000..d35b9257cb800fca8139becab6297902eb67cfcb GIT binary patch literal 1601 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCSP@$>O6Dpx4ek8pHK zGD%5EHt;ktaCHjSch2$fh%_({*EcK6wD5OK4bJkaDh~{CFXzflGAd6g2=g*x*ij)Xz|GXLEIHl4z%ner zB{$oz!o)O7+s!nnq&Q#O*SW&X-LgD6x6mUs&y&mFEycvY$}GvnqAWbjx5T+1IKLz# z-#f!Uz%etaINzkutHQ%E%`eg1z!BXx%M_DH&p?H;g6#6(fWVTZB1i3rWN)_;qtvvp zLNo2cqMWD**Afe7=lqO_^3b4c4@a&jlcH?D{Icwb4DUc^%T%MJkkY7rEtUz?zjGdB;49gX?eM^g6@{B88U6Vo`EuB(~d`$vF^?l8yGKMs1X`q* z2N+cal^dt{CwUo#r=>Utgd3Msc$WBw6&mIiW~XT9hNY$zMpT(q=9oLCaHU!p7`eE5 z6l;6Bx(0Q0WTYo$yP5{NSB8d|6(l*EMEX@mxmFhBWH}joW_biu=DJwA zR2e&__!zmQnS@)K`lbbyTN-h>d0LvMWu&?I6;+uOy9VWZlo}-In-+K$cw`zz1m;zS zW(QX3yE&G6m^hghm!+q8S|&zSWgA8nXL**I6_vYig?qZCMU_SvloS~Gr0147=KF>g znx&eWIGSWvy5|LHXC>$4n3(uGg`|i2r)KyUmPJ-36?p`e=ad@xcx9&Ka%DLBXBU@+ zB>AO!gjM*Z7DsuR`W6&hI%c^zXJ=%2lx2FCrWFVk#82E?#M4A`7Mwmy1`x+#tYrFdT=x6&_I2RT8 zW@aQBI2jj}c^8BSdS|6`{Sv9D@)vP-(?A@ z*Q;Df&rAHc;l`xb?Y6n6-21OhEVTDm`?vg|=Pvf*i?7bTkdLU)t~B!I)hOdwa578l z(9^2U8?Qb@PTQbk-umY4hlBe=y9?uZm+rDEO!@D6ljFtijT!+OKPDBwDT=mO?6|aT z!qJr-#VH(F**j}~PkG!l>qfKcdr@;Pwf?zpuQ}@Y7_I629+y;JYs_r5CsZoqTR>*t ztIJ%a9a<-^)=jv%&iZ=yPBZi1Yu_c#M&|$d6j9H)^Tp4tN5m$|8>EQ6(wiWuDO&d6 zV6VpR{59{-9QETrd{$5_+?2Vf^h}Qb7U^oyRvD%T!IHXfZh75qIc+Wbuxzb_mfPid zUjO!125*$`y83C&`N(*OiZ||d%jYr{zrGSJoh)v5dUt2^?1%*-69U$;-d|I$@nNTI z+ai}z16hs-bFUrA+i*P~QNiqE<;}U_-^#AOdG%07GW`#eTF))!E%8%sK8p)Fv;0{@ z@76u9gD#u@ek8JtslIVWOwF^0ten@kIhi*mE!Tb*{`$1=p$qN74Hxc6OsSr1yY0+1 zZ>POm{Niq(?O}WJ$X>mBMo`OK!-mAWlJ*Z;gp7VGU2sls`Vm<-+wy3h)#;@H#@YX$ ePvEb*^WhMG#P^lO?myoDt6qMphk07W?~eds`fXGI literal 0 HcmV?d00001 diff --git a/secrets/kestra-env.age b/secrets/kestra-env.age new file mode 100644 index 0000000000000000000000000000000000000000..1249c73d0c1fc83868e3d7e04cee6db17442bfd8 GIT binary patch literal 1479 zcmYdHPt{G$OD?J`D9Oyv)5|YP*Do{V(zR14F3!+RO))YxHMCSP@$>O6DpyF#4Dl*- zP4+RY2q-lV39kqYsdNs{tIEl8^(k@*GAK`sGA#5DPD;;l4(0O8F$@m(O-%AkbuA6f za;nJj_KGm5aP~{fO*RP#N(qa~%ub2Otw_m9_C&YMG`l>x*ij*~EJ-^f%s3<{yudB7 zs8T<~)7-+K#NXH>qSVJC%-O}O#Iz#RI4CGND4)wQJ21;TJjb;%Ffb&-G9u3++}|VF z+}SZVvob#*F*H3tFW=qC)H^skKN;ON%M_DH&p-wJ^5BAO-@=@fjGQv30;j@alO(r* zP+!LsBmY2i?~=j*|77ztZ@)sbpmZ+7LMM+ZpD^>};@7qe7HpG?<$OM_s; z5JNY|!t{*LkYpzl%VKofjGdB;49gWfQX)beJqtY}LNW_7v@;7le5yRm15(P(-F%YF zLrRQ7vI5J)$_;};vI4mZi-RMzgOkIwU5i};EGqrOjDwR(^1}_ww6&d_%1e_n^Ycwy zD+|gEoU&oI6%{8cxCG|7nwN9s7Wsy|8|7)|Bt`ma2N;!QCFg}X=Nd#Bga>4%mnR2? zd3%?ndz(~-mxiQymFAQc_cv(1lxi|(!c$HU1xOBrr+E1pRQaY?q=sZ#RyrBwln427nVWe#7G#^cWtkX7=_e)|xrVu! zm}OT~Xh*oF<)vlkhondO8f9fgh8ji{nrG&lxF=OqBo*jqc|@i<6$B+3b441MxP@1` zo23Qiq@+5!8)Sw%8)s;nnB*851X!8}m^p`-C5O0}dF2)v=V~VhN18?^>stgR`4178iu&rsZ&P>FVk#+ehpk{f`62b;uVdCn+~Qfvp8B1dv-s8F!*0vhHQ!Qw zq#0Ph?%dmBfm2)!^}ehq4xFJIFBUpY_%_#qy~-`^Ne5j{b39B-lSmXTy3?P3iTz*D$M!D_Gq{6&TzdaapSkj#)`mcxb3Co9rcIs3d1K|K za|u_4(-qZHoi@+%x}jQRuIcXkdiBMXer(5=9^?_{6kYDSZR*Y+7dA`@y02bmb3^cz zSM1|59)5Rig~taUNPjC?`RdR?LEB&!!R{lR|=~rUa z_DVKfdxFBYDbs?UhTHilYT0@v-q_b;`M- z+=_M+;afbB7rNpus)$E#$~buBW5DHgsx#v@o&PC3|7C}DqtoY4|Cebz_2~H&H@7&k HP$doklYTHM literal 0 HcmV?d00001