mirror of
https://github.com/kittywitch/nixfiles.git
synced 2026-02-09 04:19:19 -08:00
feat: hyprland improvements, terraform email
This commit is contained in:
parent
4759970fe8
commit
c7c485f955
20 changed files with 205 additions and 100 deletions
21
flake.lock
generated
21
flake.lock
generated
|
|
@ -1803,6 +1803,26 @@
|
|||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-unfree": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1755249704,
|
||||
"narHash": "sha256-J1mqsd/gqZ32G3YOzWk9sppLbXXLEpu37hrZfRcTtdg=",
|
||||
"owner": "numtide",
|
||||
"repo": "nixpkgs-unfree",
|
||||
"rev": "12d82a604d21a65df008bdb1515eecb96f9e55dc",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "nixpkgs-unfree",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs-xr": {
|
||||
"inputs": {
|
||||
"flake-compat": [
|
||||
|
|
@ -2233,6 +2253,7 @@
|
|||
"nixos-hardware": "nixos-hardware",
|
||||
"nixpkgs": "nixpkgs_4",
|
||||
"nixpkgs-lib": "nixpkgs-lib_2",
|
||||
"nixpkgs-unfree": "nixpkgs-unfree",
|
||||
"nixpkgs-xr": "nixpkgs-xr",
|
||||
"nixvim": "nixvim",
|
||||
"noctalia": "noctalia",
|
||||
|
|
|
|||
|
|
@ -117,6 +117,10 @@
|
|||
url = "github:nixos/nixpkgs/nixos-unstable";
|
||||
#inputs.nixpkgs.follows = "chaotic/nixpkgs";
|
||||
};
|
||||
nixpkgs-unfree = {
|
||||
url = "github:numtide/nixpkgs-unfree";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
qml-niri = {
|
||||
url = "github:juuyokka/qml-niri/feat-nix-flake";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
|
|
|
|||
|
|
@ -125,8 +125,9 @@
|
|||
in [
|
||||
"$mod, ${ws}, workspace, ${toString (x + 1)}"
|
||||
"$mod SHIFT, ${ws}, hy3:movetoworkspace, ${toString (x + 1)}"
|
||||
"$mod, F${ws}, workspace, ${toString (x + 11)}"
|
||||
"$mod SHIFT, F${ws}, hy3:movetoworkspace, ${toString (x + 11)}"
|
||||
# using F keys was confusing, as was using mod+alt, so now we use Alt instead of Super
|
||||
"ALT, ${ws}, workspace, ${toString (x + 11)}"
|
||||
"ALT SHIFT, F${ws}, hy3:movetoworkspace, ${toString (x + 11)}"
|
||||
]
|
||||
)
|
||||
10)
|
||||
|
|
|
|||
|
|
@ -44,8 +44,11 @@ in {
|
|||
"CLUTTER_BACKEND,wayland"
|
||||
];
|
||||
render = {
|
||||
direct_scanout = true;
|
||||
new_render_scheduling = true;
|
||||
#direct_scanout = true;
|
||||
#new_render_scheduling = true;
|
||||
};
|
||||
misc = {
|
||||
vfr = true;
|
||||
};
|
||||
#debug.disable_logs = false;
|
||||
exec-once = [
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@
|
|||
inherit (std) list;
|
||||
in {
|
||||
wayland.windowManager.hyprland.settings.workspace = let
|
||||
commonOptions = "gapsin:0,gapsout:0,rounding:false";
|
||||
commonOptions = "gapsin:5,gapsout:5,rounding:true,persistent:true";
|
||||
in
|
||||
["1,monitor:DP-1,default:true,${commonOptions}"]
|
||||
["1,default:true,${commonOptions}"]
|
||||
++ (list.map (
|
||||
workspace: "${toString workspace},monitor:DP-1${commonOptions}"
|
||||
workspace: "${toString workspace},${commonOptions}"
|
||||
) (list.range 2 10))
|
||||
++ ["11,monitor:HDMI-A-1,default:true"]
|
||||
++ ["11,${commonOptions}"]
|
||||
++ (list.map (
|
||||
workspace: "${toString workspace},monitor:HDMI-A-1${commonOptions}"
|
||||
workspace: "${toString workspace},${commonOptions}"
|
||||
) (list.range 12 20));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -29,6 +29,8 @@ in {
|
|||
{
|
||||
id = "Workspace";
|
||||
labelMode = "label";
|
||||
hideUnoccupied = false;
|
||||
showLabelsOnlyWhenOccupied = false;
|
||||
#characterCount = 10;
|
||||
}
|
||||
{
|
||||
|
|
@ -37,15 +39,10 @@ in {
|
|||
}
|
||||
];
|
||||
center = [
|
||||
];
|
||||
right = [
|
||||
{
|
||||
id = "Tray";
|
||||
}
|
||||
{
|
||||
id = "MediaMini";
|
||||
showAlbumArt = true;
|
||||
showVisualizer = true;
|
||||
showVisualizer = false;
|
||||
scrollingMode = "always";
|
||||
autoHide = true;
|
||||
# check if this works,
|
||||
|
|
@ -53,16 +50,8 @@ in {
|
|||
widgetWidth = 300;
|
||||
}
|
||||
{
|
||||
id = "NotificationHistory";
|
||||
}
|
||||
{
|
||||
id = "Battery";
|
||||
}
|
||||
{
|
||||
id = "Volume";
|
||||
}
|
||||
{
|
||||
id = "Brightness";
|
||||
id = "Clock";
|
||||
formatHorizontal = "yyyy-MM-dd HH:mm t";
|
||||
}
|
||||
{
|
||||
id = "NightLight";
|
||||
|
|
@ -76,9 +65,22 @@ in {
|
|||
{
|
||||
id = "ScreenRecorder";
|
||||
}
|
||||
];
|
||||
right = [
|
||||
{
|
||||
id = "Clock";
|
||||
formatHorizontal = "yyyy-MM-dd HH:mm t";
|
||||
id = "Tray";
|
||||
}
|
||||
{
|
||||
id = "NotificationHistory";
|
||||
}
|
||||
{
|
||||
id = "Battery";
|
||||
}
|
||||
{
|
||||
id = "Volume";
|
||||
}
|
||||
{
|
||||
id = "Brightness";
|
||||
}
|
||||
{
|
||||
id = "ControlCenter";
|
||||
|
|
|
|||
|
|
@ -10,13 +10,6 @@
|
|||
#portalPackage = inputs.hyprland.packages."${pkgs.system}".xdg-desktop-portal-hyprland;
|
||||
};
|
||||
|
||||
# auto launch hyprland on tty1
|
||||
environment.loginShellInit = ''
|
||||
if [ -z "$DISPLAY" ] && [ "$XDG_VTNR" = 1 ] && uwsm check may-start; then
|
||||
exec uwsm start hyprland-uwsm.desktop
|
||||
fi
|
||||
'';
|
||||
|
||||
services = {
|
||||
noctalia-shell.enable = true;
|
||||
clipboard-sync.enable = true;
|
||||
|
|
|
|||
|
|
@ -1,16 +0,0 @@
|
|||
{
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}: let
|
||||
inherit (lib.modules) mkForce;
|
||||
in {
|
||||
programs.regreet = {
|
||||
enable = true;
|
||||
theme = mkForce config.home-manager.users.kat.gtk.theme;
|
||||
};
|
||||
stylix.targets.regreet.enable = true;
|
||||
services.greetd = {
|
||||
enable = true;
|
||||
};
|
||||
}
|
||||
|
|
@ -10,5 +10,4 @@
|
|||
enable = true;
|
||||
package = pkgs.niri-unstable;
|
||||
};
|
||||
services.noctalia-shell.enable = true;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,6 +1,7 @@
|
|||
{
|
||||
pkgs,
|
||||
lib,
|
||||
inputs,
|
||||
...
|
||||
}: let
|
||||
inherit (lib.lists) singleton;
|
||||
|
|
@ -33,8 +34,8 @@ in {
|
|||
U_PACING_APP_IMMEDIATE_WAIT_FRAME_RETURN="1";
|
||||
XRT_COMPOSITOR_FORCE_WAYLAND_DIRECT = "1";
|
||||
};
|
||||
package = pkgs.wivrn.override { cudaSupport = true; };
|
||||
highPriority = true;
|
||||
package = pkgs.wivrn;
|
||||
defaultRuntime = true;
|
||||
config = {
|
||||
enable = true;
|
||||
|
|
@ -59,7 +60,6 @@ in {
|
|||
};
|
||||
};
|
||||
};
|
||||
services.lact.enable = true;
|
||||
|
||||
# SlimeVR ports
|
||||
networking.firewall = let
|
||||
|
|
@ -83,7 +83,6 @@ in {
|
|||
monado-vulkan-layers
|
||||
bs-manager
|
||||
vrcx
|
||||
lact
|
||||
appimage-run
|
||||
(unityhub.override {
|
||||
extraLibs = unityhubPkgs: [
|
||||
|
|
|
|||
|
|
@ -5,6 +5,7 @@
|
|||
}: let
|
||||
inherit (lib.modules) mkForce;
|
||||
in {
|
||||
services.noctalia-shell.enable = true;
|
||||
programs.regreet = {
|
||||
enable = true;
|
||||
theme = mkForce config.home-manager.users.kat.gtk.theme;
|
||||
|
|
@ -6,7 +6,7 @@
|
|||
enable = true;
|
||||
stateVersion = 3;
|
||||
fqdn = "rinnosuke.inskip.me";
|
||||
domains = ["dork.dev"];
|
||||
domains = ["dork.dev" "kittywit.ch" "inskip.me"];
|
||||
|
||||
fullTextSearch.enable = true;
|
||||
|
||||
|
|
@ -17,9 +17,13 @@
|
|||
hashedPasswordFile = config.sops.secrets.kat-password.path;
|
||||
aliases = [
|
||||
"@dork.dev"
|
||||
"@inskip.me"
|
||||
"@kittywit.ch"
|
||||
];
|
||||
catchAll = [
|
||||
"dork.dev"
|
||||
"inskip.me"
|
||||
"kittywit.ch"
|
||||
];
|
||||
};
|
||||
};
|
||||
|
|
|
|||
|
|
@ -32,9 +32,6 @@
|
|||
hash = "sha256-8UWf1RKsRNWJ8CC6ceDeIOv4eY3ybxZ9tv5MCHx80NY=";
|
||||
};
|
||||
};
|
||||
wivrn = prev.wivrn.overrideAttrs (old: {
|
||||
cudaSupport = true;
|
||||
});
|
||||
})
|
||||
inputs.rbw-bitw.overlays.default
|
||||
#inputs.arcexprs.overlays.default
|
||||
|
|
@ -45,4 +42,9 @@
|
|||
inputs.niri.overlays.niri
|
||||
inputs.proton-cachyos.overlays.default
|
||||
(import tree.packages.default {inherit inputs tree;})
|
||||
(_final: prev: {
|
||||
wivrn = prev.wivrn.overrideAttrs (old: {
|
||||
cudaSupport = true;
|
||||
});
|
||||
})
|
||||
]
|
||||
|
|
|
|||
|
|
@ -1,3 +1,3 @@
|
|||
#!/usr/bin/env bash
|
||||
adb reverse tcp:9757 tcp:9757
|
||||
adb shell am start -a android.intent.action.VIEW -d "wivrn+tcp://localhost" org.meumeu.wivrn.github.nightly
|
||||
adb shell am start -a android.intent.action.VIEW -d "wivrn+tcp://localhost" org.meumeu.wivrn.github
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ _: let
|
|||
lib,
|
||||
pkgs,
|
||||
tree,
|
||||
std,
|
||||
inputs,
|
||||
...
|
||||
}: let
|
||||
|
|
@ -52,10 +53,11 @@ _: let
|
|||
gaming
|
||||
performance
|
||||
dev
|
||||
tiling
|
||||
])
|
||||
++ (with tree.nixos.environments; [
|
||||
hyprland
|
||||
#niri
|
||||
niri
|
||||
])
|
||||
++ (with tree.nixos.servers; [
|
||||
forgejo-runner
|
||||
|
|
@ -129,44 +131,56 @@ _: let
|
|||
# return-type = "";
|
||||
# };
|
||||
# };
|
||||
# niri.settings = {
|
||||
# outputs = {
|
||||
# "LG Electronics LG Ultra HD 0x0001AC91" = {
|
||||
# scale = 1.0;
|
||||
# position = {
|
||||
# x = 1920;
|
||||
# y = 0;
|
||||
# };
|
||||
# mode = {
|
||||
# width = 2560;
|
||||
# height = 1440;
|
||||
# refresh = 59.951;
|
||||
# };
|
||||
# };
|
||||
# "Samsung Electric Company SAMSUNG Unknown" = {
|
||||
# position = {
|
||||
# x = 0;
|
||||
# y = 0;
|
||||
# };
|
||||
# };
|
||||
# "PNP(XXX) Beyond TV 0x00010000" = {
|
||||
# mode = {
|
||||
# width = 2560;
|
||||
# height = 1440;
|
||||
# refresh = 119.998;
|
||||
# };
|
||||
# };
|
||||
# };
|
||||
# environment = {
|
||||
# NVD_BACKEND = "direct";
|
||||
# ELECTRON_OZONE_PLATFORM_HINT = "auto";
|
||||
# LIBVA_DRIVER_NAME = "nvidia";
|
||||
# NIXOS_OZONE_WL = "1";
|
||||
# QT_QTA_PLATFORM = "wayland;xcb";
|
||||
# };
|
||||
# };
|
||||
niri.settings = {
|
||||
outputs = {
|
||||
"LG Electronics LG Ultra HD 0x0001AC91" = {
|
||||
scale = 1.0;
|
||||
position = {
|
||||
x = 1920;
|
||||
y = 0;
|
||||
};
|
||||
mode = {
|
||||
width = 2560;
|
||||
height = 1440;
|
||||
refresh = 59.951;
|
||||
};
|
||||
};
|
||||
"Samsung Electric Company SAMSUNG Unknown" = {
|
||||
position = {
|
||||
x = 0;
|
||||
y = 0;
|
||||
};
|
||||
};
|
||||
"PNP(XXX) Beyond TV 0x00010000" = {
|
||||
mode = {
|
||||
width = 2560;
|
||||
height = 1440;
|
||||
refresh = 119.998;
|
||||
};
|
||||
};
|
||||
};
|
||||
environment = {
|
||||
NVD_BACKEND = "direct";
|
||||
ELECTRON_OZONE_PLATFORM_HINT = "auto";
|
||||
LIBVA_DRIVER_NAME = "nvidia";
|
||||
NIXOS_OZONE_WL = "1";
|
||||
QT_QTA_PLATFORM = "wayland;xcb";
|
||||
};
|
||||
};
|
||||
};
|
||||
wayland.windowManager.hyprland.settings = {
|
||||
wayland.windowManager.hyprland.settings.workspace = let
|
||||
inherit (std) list;
|
||||
commonOptions = "gapsin:5,gapsout:5,rounding:true,persistent:true";
|
||||
in lib.mkForce (
|
||||
["1,monitor:DP-2,default:true,${commonOptions}"]
|
||||
++ (list.map (
|
||||
workspace: "${toString workspace},monitor:DP-2,${commonOptions}"
|
||||
) (list.range 2 10))
|
||||
++ ["11,monitor:HDMI-A-1,default:true,${commonOptions}"]
|
||||
++ (list.map (
|
||||
workspace: "${toString workspace},monitor:HDMI-A-1,${commonOptions}"
|
||||
) (list.range 12 20)));
|
||||
monitor = [
|
||||
"HDMI-A-1, 1920x1080, 0x0, 1"
|
||||
"DP-2, 2560x1440, auto-right, 1"
|
||||
|
|
@ -177,7 +191,6 @@ _: let
|
|||
"LIBVA_DRIVER_NAME,nvidia"
|
||||
"__GLX_VENDOR_LIBRARY_NAME,nvidia"
|
||||
"NIXOS_OZONE_WL,1"
|
||||
"__NV_DISABLE_EXPLICIT_SYNC,1"
|
||||
"QT_QPA_PLATFORM,wayland;xcb"
|
||||
];
|
||||
};
|
||||
|
|
@ -188,7 +201,7 @@ _: let
|
|||
])
|
||||
++ (with tree.home.environments; [
|
||||
hyprland
|
||||
#niri
|
||||
niri
|
||||
]);
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -58,6 +58,7 @@ _: let
|
|||
laptop
|
||||
performance
|
||||
secureboot
|
||||
tiling
|
||||
])
|
||||
++ (with tree.nixos.environments; [
|
||||
#niri
|
||||
|
|
|
|||
|
|
@ -7,6 +7,7 @@ locals {
|
|||
}
|
||||
|
||||
module "inskip-gmail" {
|
||||
enable = false
|
||||
source = "./gmail_dns"
|
||||
cloudflare_api_key = var.cloudflare_api_key
|
||||
zone_id = local.zone_ids.inskip
|
||||
|
|
@ -22,6 +23,7 @@ module "dork-gmail" {
|
|||
dkim = local.dkims.dork
|
||||
}
|
||||
module "kittywitch-gmail" {
|
||||
enable = false
|
||||
source = "./gmail_dns"
|
||||
cloudflare_api_key = var.cloudflare_api_key
|
||||
zone_id = local.zone_ids.kittywitch
|
||||
|
|
|
|||
|
|
@ -107,6 +107,26 @@ resource "cloudflare_record" "dork_mail_mx" {
|
|||
zone_id = local.zone_ids.dork
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "inskip_mail_mx" {
|
||||
name = "@"
|
||||
proxied = false
|
||||
ttl = 3600
|
||||
type = "MX"
|
||||
priority = 10
|
||||
value = "rinnosuke.inskip.me"
|
||||
zone_id = local.zone_ids.inskip
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "kittywitch_mail_mx" {
|
||||
name = "@"
|
||||
proxied = false
|
||||
ttl = 3600
|
||||
type = "MX"
|
||||
priority = 10
|
||||
value = "rinnosuke.inskip.me"
|
||||
zone_id = local.zone_ids.kittywitch
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "dork_mail_spf" {
|
||||
name = "@"
|
||||
proxied = false
|
||||
|
|
@ -116,6 +136,24 @@ resource "cloudflare_record" "dork_mail_spf" {
|
|||
zone_id = local.zone_ids.dork
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "inskip_mail_spf" {
|
||||
name = "@"
|
||||
proxied = false
|
||||
ttl = 10800
|
||||
type = "TXT"
|
||||
value = "v=spf1 a:rinnosuke.inskip.me -all"
|
||||
zone_id = local.zone_ids.inskip
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "kittywitch_mail_spf" {
|
||||
name = "@"
|
||||
proxied = false
|
||||
ttl = 10800
|
||||
type = "TXT"
|
||||
value = "v=spf1 a:rinnosuke.inskip.me -all"
|
||||
zone_id = local.zone_ids.kittywitch
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "dork_mail_dkim" {
|
||||
name = "mail._domainkey"
|
||||
proxied = false
|
||||
|
|
@ -125,6 +163,25 @@ resource "cloudflare_record" "dork_mail_dkim" {
|
|||
zone_id = local.zone_ids.dork
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "inskip_mail_dkim" {
|
||||
name = "mail._domainkey"
|
||||
proxied = false
|
||||
ttl = 10800
|
||||
type = "TXT"
|
||||
value = "v=DKIM1; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAn266Z2suvJyv+vISWfjajWwIdImqHjZPOJCIZ/uJ8gStp8e8X8LMnRbzG4XVmTpx5IxnACcIZz2XVzxZspub6VZsbpDbcpApSk700UpPE1zag5QCA1zKs/smOFAtN3EIcwvbQ48HrKKlQSZdV7qHsS1BPrlK1hjwi1D6JlILCg9COQR8Sscxkjvg7pNP6Q1RVK7dtbzlQnqHikHjdXUTlaf5+EVPvdP4c4Of4YI1KaJMZDcs7LpQuvGNsZmEfybA066TWIaHq+F5WSmSsUhPlTnAygGBRFic0efWn9Ij/GVwI6yDq96IWjeT9L2C7+tkfj/NAmgFoITgpAiq/2l/OwIDAQAB"
|
||||
zone_id = local.zone_ids.dork
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "kittywitch_mail_dkim" {
|
||||
name = "mail._domainkey"
|
||||
proxied = false
|
||||
ttl = 10800
|
||||
type = "TXT"
|
||||
value = "v=DKIM1; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApzVUOBiZic/cB3WYOADAgEu//H9dG6VNz8kzgopoKhAZ6AhM8o4nW5kAoFxjJP1c21ugghoYtlJJHaHqQg93nuaW8f48jsjQErMa12hMo8xeFviSBkv7G9gasviborHZIxJVHIIwSga+YZfjNmdCQHH4ABud95utZJc8AmCSJj/kE0NozmXL8HLaMLg9cFMMYB8Pv+GDsDaXCD4H0qJANqCQos/NCynmRkQHYEW7C4lm9FNJUB3wpPuTY4/i6QZcd5Ex4bPYcc9FO4km/rqSbmsZDfN2P+iofpXGIxtCm4iOJlBMjPDIhV/8jAK5t1wIWRq1+3F2DkppGL2F4DkwfQIDAQAB"
|
||||
zone_id = local.zone_ids.dork
|
||||
}
|
||||
|
||||
|
||||
resource "cloudflare_record" "dork_mail_dmarc" {
|
||||
name = "_dmarc"
|
||||
proxied = false
|
||||
|
|
@ -134,6 +191,25 @@ resource "cloudflare_record" "dork_mail_dmarc" {
|
|||
zone_id = local.zone_ids.dork
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "inskip_mail_dmarc" {
|
||||
name = "_dmarc"
|
||||
proxied = false
|
||||
ttl = 10800
|
||||
type = "TXT"
|
||||
value = "v=DMARC1; p=none"
|
||||
zone_id = local.zone_ids.inskip
|
||||
}
|
||||
|
||||
resource "cloudflare_record" "kittywitch_mail_dmarc" {
|
||||
name = "_dmarc"
|
||||
proxied = false
|
||||
ttl = 10800
|
||||
type = "TXT"
|
||||
value = "v=DMARC1; p=none"
|
||||
zone_id = local.zone_ids.kittywitch
|
||||
}
|
||||
|
||||
|
||||
resource "cloudflare_record" "dork_mail_submission_autodiscover" {
|
||||
name = "_submission._tcp"
|
||||
proxied = false
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
2
tree.nix
2
tree.nix
|
|
@ -91,7 +91,7 @@
|
|||
infrastructure.nixosModules.default
|
||||
lanzaboote.nixosModules.lanzaboote
|
||||
solaar.nixosModules.default
|
||||
nixpkgs-xr.nixosModules.nixpkgs-xr
|
||||
#nixpkgs-xr.nixosModules.nixpkgs-xr
|
||||
spicetify-nix.nixosModules.spicetify
|
||||
clipboard-sync.nixosModules.default
|
||||
nixos-cli.nixosModules.nixos-cli
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue