diff --git a/.git-crypt/.gitattributes b/.git-crypt/.gitattributes new file mode 100644 index 0000000..665b10e --- /dev/null +++ b/.git-crypt/.gitattributes @@ -0,0 +1,4 @@ +# Do not edit this file. To specify the files to encrypt, create your own +# .gitattributes file in the directory where your files are. +* !filter !diff +*.gpg binary diff --git a/.git-crypt/keys/default/0/EBD15FF520C7C7204D431FB096CC5C98FEB6588D.gpg b/.git-crypt/keys/default/0/EBD15FF520C7C7204D431FB096CC5C98FEB6588D.gpg new file mode 100644 index 0000000..6c29a14 Binary files /dev/null and b/.git-crypt/keys/default/0/EBD15FF520C7C7204D431FB096CC5C98FEB6588D.gpg differ diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..a9fc17b --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +nixos/secrets/** filter=git-crypt diff=git-crypt diff --git a/.gitignore b/.gitignore index 10ea189..b2be92b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ result - -.idea diff --git a/README.md b/README.md index 66bae0b..3247fae 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,18 @@ # sisyphus -Welcome to my dotfiles repository, named Sisyphus. This repository houses the configurations for my Linux machines, spanning various distributions. Please note that not all configurations may be up-to-date or fully functional. If you decide to use these configurations for your own machines, be prepared for potential issues. Nevertheless, feel free to borrow or draw inspiration from this collection. - -## Organisation - -To maintain clarity and versatility, I've organized my configuration files into distinct subdirectories. The "bare" configuration files, those you typically find in your `~/.config` directory, are located in [stow](./stow). This separation allows for a streamlined approach to managing configurations, while other subdirectories house OS-specific settings. +This repository serves as my dotfiles. It contains the configuration for my Linux machine(s), for multiple distributions. Not everything might be up to date and/or working, so don't expect a working machine if you try to use this configuration for your own machines. However, feel free to steal some parts or be inspired. - [Arch Linux](./arch) (+ [stow](./stow)) -- [NixOS](./nixos) (+ [stow](./stow)) +- [Nixos](./nixos) -## The Sisyphus Analogy +## Analogy -The Sisyphus analogy is a straightforward one. +The analogy is quite simple. -Throughout my journey with Linux, especially during my time as a student, I found myself reinstalling my operating system countless times. Whether it was due to a botched installation, unsatisfactory performance, or simply the desire for a fresh start, I've been there. Things escalated when I began tinkering extensively with machine configurations, often resulting in disk management mishaps. It was clear that I needed to find a way to put an end to these frequent reinstallations, contain my configurations, and maintain system stability. This repository represents my solution to these challenges. +Over the course of getting to know Linux and during my career as a student, I had to reinstall my OS SO so so many times, either because I bricked my previous install, or because things weren't working the way I wanted them to or even because I found the current install to be cluttered. On a particular day, I had installed Arch (that's what I started with back then) over ten times, which is my personal record of most-installed-computers-in-one-day so far. I also managed to speedrun the installation process to 8min30sec for the kernel with an additional 4min30sec for installing Sway (fun fact/did you know?). -I hope that by maintaining this repository, I can minimize the challenges of breaking my laptop and make configurations easily accessible. They are designed to be relatively static and require as little user input as reasonably possible during installation. +Later, this worsened even more when I had way too much fun playing around with the machine configuration. (Managing disks is prone to errors!) I hope my addaction to breaking my laptop will ease with this repo: keeping everything easily accessible, often statically configured, so that it can be installed with as little input as (reasonably) possible. -TL;DR: My journey with Linux was a challenging one, marked by frequent restarts, which is why I chose the name Sisyphus as an analogy from [Greek mythology](https://en.wikipedia.org/wiki/Sisyphus). +TL;DR: Discovering Linux was a tedious process and I had to start over several times, hence the analogy with [Sisyphus, greek mythology](https://en.wikipedia.org/wiki/Sisyphus). -P.S. While the name "Sisyphus" has a deep mythological significance, it also sounds cool and conveniently contains "sys" from "system" in its name. But, let's keep that our little secret, shall we? +*But also because it sounds cool and it has the sys from sytem in the name, don't tell anyone this though.* diff --git a/arch/stow/_scripts/.scripts/cleandependencies.sh b/arch/stow/_scripts/.scripts/cleandependencies.sh new file mode 100755 index 0000000..7fac670 --- /dev/null +++ b/arch/stow/_scripts/.scripts/cleandependencies.sh @@ -0,0 +1,26 @@ +#!/usr/bin/env bash +# Remove unused dependencies that are not explicitly installed +# Usage: [sudo] cleandependencies + +# Retrieve a list of all packages that are not explicitly installed and are not needed by anything else. +# Note that optional dependencies also do not get removed. +# function getList () { +# grep "Name\|Required By\|Optional For\|Install Reason" <<< $(pacman -Qi) | +# tr '\n' ';' | sed "s/$/\n/" | +# sed "s/ */ /g" | +# sed "s/Name/\nName/g" | +# sed "s/\(Name\|Required By\|Optional For\|Install Reason\) : //g" | +# grep "Installed as a dependency for another package" | +# grep "^[^;]*;None;None" | +# cut -f 1 -d ';' +# } ; export -f getList + +current_amount=$(pacman -Qdtq | wc -l) +# Keep looping while there are unusded dependencies. +# Stop when the next amount is the same, probably because the action was canceled. +while [[ ${current_amount} -ne 0 && ${current_amount} -ne ${previous_amount:=0} ]] ; do + previous_amount=${current_amount} + pacman -R $(pacman -Qdtq) + current_amount=$(pacman -Qdtq | wc -l) +done + diff --git a/arch/stow/_scripts/.scripts/dnd.sh b/arch/stow/_scripts/.scripts/dnd.sh new file mode 100755 index 0000000..5037511 --- /dev/null +++ b/arch/stow/_scripts/.scripts/dnd.sh @@ -0,0 +1,22 @@ +#!/usr/bin/env bash +# Script to toggle Do not disturb mode for mako and dunst + +# Permanent memory +saved_state=0 + +# Toggle +if [[ ${saved_state} -eq 0 ]] ; then + ~/.scripts/notify.sh 'Hiding notifications' + sleep 5 + makoctl set-mode do-not-disturb + dunstctl set-paused true +else + makoctl set-mode default + dunstctl set-paused false + ~/.scripts/notify.sh 'Showing notifications' +fi + +# Update status in file +new_state=$(( (${saved_state} + 1) % 2 )) +sed -i "s/^saved_state=.*$/saved_state=${new_state}/" "${0}" + diff --git a/arch/stow/_scripts/.scripts/focus.sh b/arch/stow/_scripts/.scripts/focus.sh new file mode 100755 index 0000000..37f9bcd --- /dev/null +++ b/arch/stow/_scripts/.scripts/focus.sh @@ -0,0 +1,16 @@ +#!/usr/bin/env bash +# Script to toggle black background to focus on sway + +# Get instances of swaybg, except for the 'standard' one. +list=$( pgrep swaybg | head -n -1 ) + +if [ -z "${list}" ] ; then + swaybg --mode=solid_color --color=#000000 & + # Give the previous command some time to execute + sleep .1 + swaymsg reload +else + # Clean up if already running + kill $( tr ' ' '\n' <<< ${list} ) +fi + diff --git a/arch/stow/_scripts/.scripts/idle.sh b/arch/stow/_scripts/.scripts/idle.sh new file mode 100755 index 0000000..46ff18a --- /dev/null +++ b/arch/stow/_scripts/.scripts/idle.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +# Configuration of swayidle +# Just run the script + +# Kill previous instances to avoid clashing +pkill swayidle + +swayidle -w \ + timeout 600 \ + 'swaymsg "output * dpms off"' \ + resume 'swaymsg "output * dpms on"' \ + timeout 1200 \ + 'systemctl suspend' \ + before-sleep 'swaymsg "output * dpms on"; swaylock' + # Screen needs to be turned back on or you will get a black screen after waking up again. + +# timeout 300 \ +# "~/.scripts/wander.sh" \ +# resume 'brightnessctl -r' \ diff --git a/scripts/notify.sh b/arch/stow/_scripts/.scripts/notify.sh similarity index 86% rename from scripts/notify.sh rename to arch/stow/_scripts/.scripts/notify.sh index 698993e..faa63de 100755 --- a/scripts/notify.sh +++ b/arch/stow/_scripts/.scripts/notify.sh @@ -2,10 +2,8 @@ # Show system status in notification, or your own message # Syntaxis: notify [-vb] [-t ] [-p ] [ <message>] -# Requirements/dependencies: -# - amixer +# Requirements: # - brightnessctl -# - libnotify (notify-send) panic () { >&2 echo "Syntaxis: notify [-vb] [-t <timeout>] [-p <value>] [<title> <message>]" @@ -23,14 +21,14 @@ while getopts ":bvt:p:" options; do v) # Get volume (don't use pamixer because that is way slower) value=$( pactl get-sink-volume @DEFAULT_SINK@ \ + | cut -d '/' -f2 \ | grep -o '[0-9]*%' \ - | tr -d '%' \ - | head -n1 ) + | tr -d '%' ) title="Volume: ${value}%" category='sysinfo' # If audio disabled, set value to zero. - if [ "$( pactl get-sink-mute @DEFAULT_SINK@ | grep -o '\(yes\|no\)' | head -n1 )" == 'yes' ] ; then + if [ "$( pactl get-sink-mute @DEFAULT_SINK@ )" == "Mute: yes" ] ; then title="Volume: ${value}% (Disabled)" value=0 fi diff --git a/arch/stow/_scripts/.scripts/wander.sh b/arch/stow/_scripts/.scripts/wander.sh new file mode 100755 index 0000000..4325164 --- /dev/null +++ b/arch/stow/_scripts/.scripts/wander.sh @@ -0,0 +1,9 @@ +#!/usr/bin/env bash +# Toggle brightness to 'sleep' or 'awake', since brightnessctl does not support +# percentages of current amount. +# Just run the script + +current=$( brightnessctl get ) +# Doesn't have to be accurate so we can use built-in calculator. +brightnessctl -sq set $(( current / 10 * 3 )) + diff --git a/scripts/sunset.sh b/arch/stow/_scripts/.scripts/wlsunset.sh similarity index 65% rename from scripts/sunset.sh rename to arch/stow/_scripts/.scripts/wlsunset.sh index f185115..84a7d69 100755 --- a/scripts/sunset.sh +++ b/arch/stow/_scripts/.scripts/wlsunset.sh @@ -6,10 +6,10 @@ pid=$(pgrep wlsunset) if [[ -z ${pid} ]] ; then # Start wlsunset right away. - wlsunset -l 50.50 -L 4.00 -t 3000 -T 6500 & + wlsunset -l 50 -L 4 -t 2500 & else # Currently stop wlsunset but restart in an hour. kill ${pid} - notify-send 'Stopping sunset' 'Restarting in an hour' - at now +1 hours -f "${0}" + ~/.scripts/notify.sh 'Stopping sunset' 'Restarting in an hour' + at now +1 hours -f ~/.scripts/wlsunset.sh fi diff --git a/arch/stow/_scripts/git-flake b/arch/stow/_scripts/git-flake new file mode 100755 index 0000000..e6df509 --- /dev/null +++ b/arch/stow/_scripts/git-flake @@ -0,0 +1,7 @@ +#!/usr/bin/env bash +# Ignore flake.nix and flake.lock +# For using personal flakes in a project that does not provide and want flakes. +# Syntaxis: git flake + +git add --intent-to-add flake.nix flake.lock +git update-index --assume-unchanged flake.nix diff --git a/arch/stow/bash/.bashrc b/arch/stow/bash/.bashrc new file mode 100644 index 0000000..617dfaf --- /dev/null +++ b/arch/stow/bash/.bashrc @@ -0,0 +1,11 @@ +# +# ~/.bashrc +# + +# If not running interactively, don't do anything +[[ $- != *i* ]] && return + +alias ls='ls --color=auto' +PS1='[\u@\h \W]\$ ' + +eval $( keychain --eval --quiet ~/.ssh/id_ed25519 ) diff --git a/stow/fuzzel/.config/fuzzel/fuzzel.ini b/arch/stow/fuzzel/.config/fuzzel/fuzzel.ini similarity index 76% rename from stow/fuzzel/.config/fuzzel/fuzzel.ini rename to arch/stow/fuzzel/.config/fuzzel/fuzzel.ini index 078c64d..b4ee0e2 100644 --- a/stow/fuzzel/.config/fuzzel/fuzzel.ini +++ b/arch/stow/fuzzel/.config/fuzzel/fuzzel.ini @@ -4,8 +4,8 @@ font=letter:size=10 dpi-aware=yes -icon-theme=Icosystem -terminal=kitty -e +icon-theme=Win11-black +terminal=alacritty -e output=eDP-1 lines=10 diff --git a/stow/mako/.config/mako/config b/arch/stow/mako/.config/mako/config similarity index 100% rename from stow/mako/.config/mako/config rename to arch/stow/mako/.config/mako/config diff --git a/assets/bluescreen.png b/assets/bluescreen.png deleted file mode 100644 index ef36cd9..0000000 Binary files a/assets/bluescreen.png and /dev/null differ diff --git a/colors.sh b/colors.sh deleted file mode 100644 index e51c155..0000000 --- a/colors.sh +++ /dev/null @@ -1,225 +0,0 @@ -# tdpeuter color schemes -# The goal is to offer light and dark theme that is easy on the eyes, -# whilst also being unique and defining. - -############################### -# tdpeuter-light color scheme # -############################### - -# 171717 # Foreground -# FAFAFA # Daisy (Background) - -# Regular colors (0-7) - -# 000000 # Black (0) -# 1 -# 2 -# 3 -# 4 -# 5 -# 6 -# 7 - -# Bright colors (8-15) - -# 000000 # Black (8) -# 9 -# 10 -# 11 -# 12 -# 13 -# 14 -# 15 - -############################## -# tdpeuter-dark color scheme # -############################## - -# FAFAFA # Daisy (Foreground) -printf "\033]10;#FAFAFA\007" -# 171717 # Background -printf "\033]11;#171717\007" - -# Regular colors (0-7) - -# 242124 # Black 0 -printf "\033]4;0;#242124\007" -# B90E0A # Crimson (Red) 1 -printf "\033]4;1;#B90E0A\007" -# B2BC68 # Leafy (Green) 2 -printf "\033]4;2;#B2BC68\007" -# FFE135 # Banana (Yellow) 3 -printf "\033]4;3;#FFE135\007" -# 80A2BE # Icicle (Blue) 4 -printf "\033]4;4;#80A2BE\007" -# A45EE5 # Amethyst (Magenta) 5 -printf "\033]4;5;#A45EE5\007" -# # (Cyan) 6 -printf "\033]4;6;#80A2BE\007" -# FBFCF8 # Pearl (White) 7 -printf "\033]4;7;#FBFCF8\007" - -# Bright colors (8-15) - -# 363636 # Grey-isch (Black) 8 -printf "\033]4;8;#363636\007" -# BC544B # Blush (Red) 9 -printf "\033]4;9;#BC544B\007" -# A6E3A1 # Lime (Green) 10 -printf "\033]4;10;#A6E3A1\007" -# FCF4A3 # Banana (Yellow) 11 -printf "\033]4;11;#FCF4A3\007" -# 74C7EC # Sapphire (Blue) 12 -printf "\033]4;12;#74C7EC\007" -# B4BEFE # Lavender (Magenta) 13 -# #CBA6F7 -printf "\033]4;13;#B4BEFE\007" -# # (Cyan) 14 -printf "\033]4;14;#74C7EC\007" -# FFFFFF # White 15 -printf "\033]4;15;#FFFFFF\007" - - -# NEW COLORS 20241101 -# -# Nr # R G B H S B # Name -# FG # 250 250 250 0 0 98 # Daisy (White) -printf "\033]10;#FAFAFA\007" -# BG # 19 19 19 0 0 7 # - -printf "\033]11;#131313\007" - -# Regular colors (0-7) - -# Nr # R G B H S B # Name -# 0 # 61 61 61 0 0 24 # - (Black) -printf "\033]4;0;#3D3D3D\007" -# 1 # 186 19 61 345 90 73 # - (Red) -printf "\033]4;1;#BA133D\007" -# 2 # 61 186 19 105 90 73 # - (Green) -printf "\033]4;2;#3DBA13\007" -# 3 # 186 144 19 45 90 73 # - (Yellow) -printf "\033]4;3;#BA9013\007" -# 4 # 19 61 186 225 90 73 # - (Blue) -printf "\033]4;4;#133DBA\007" -# 5 # 144 19 186 285 90 73 # - (Magenta) -printf "\033]4;5;#9013BA\007" -# 6 # 19 186 144 165 90 73 # - (Cyan) -printf "\033]4;6;#13BA90\007" -# 7 # 186 186 186 0 0 73 # - (White) -printf "\033]4;7;#BABABA\007" - -# Bright colors (8-15) - -# Nr # R G B H S B # Name -# 8 # 122 122 122 0 0 48 # - (Black) -printf "\033]4;8;#363636\007" -# 9 # 250 25 81 345 90 98 # - (Red) -printf "\033]4;9;#FA1951\007" -# 10 # 81 250 25 105 90 98 # - (Green) -printf "\033]4;10;#51FA19\007" -# 11 # 250 194 25 45 90 98 # - (Yellow) -printf "\033]4;11;#FAC219\007" -# 12 # 25 81 250 225 90 98 # - (Blue) -printf "\033]4;12;#1951FA\007" -# 13 # 194 25 250 285 90 98 # - (Magenta) -printf "\033]4;13;#C219FA\007" -# 14 # 25 259 194 165 90 98 # - (Cyan) -printf "\033]4;14;#19FAC2\007" -# 15 # 250 250 250 0 0 98 # - (White) -printf "\033]4;15;#FAFAFA\007" - -# BRIGHTER -# -# Nr # R G B H S B # Name -# FG # 250 250 250 0 0 98 # Daisy (White) -printf "\033]11;#FAFAFA\007" -# BG # 19 19 19 0 0 7 # - -printf "\033]10;#131313\007" - -# Regular colors (0-7) - -# Nr # R G B H S B # Name -# 0 # 61 61 61 0 0 24 # - (Black) -printf "\033]4;0;#3D3D3D\007" -# 1 # 186 19 61 345 90 73 # - (Red) -printf "\033]4;1;#E62E4D\007" -# 2 # 61 186 19 105 90 73 # - (Green) -printf "\033]4;2;#4DE62E\007" -# 3 # 186 144 19 45 90 73 # - (Yellow) -printf "\033]4;3;#E6C72E\007" -# 4 # 19 61 186 225 90 73 # - (Blue) -printf "\033]4;4;#2E4CE6\007" -# 5 # 144 19 186 285 90 73 # - (Magenta) -printf "\033]4;5;#C52DE3\007" -# 6 # 19 186 144 165 90 73 # - (Cyan) -printf "\033]4;6;#2EE6C7\007" -# 7 # 186 186 186 0 0 73 # - (White) -printf "\033]4;7;#BABABA\007" - -# Bright colors (8-15) - -# Nr # R G B H S B # Name -# 8 # 122 122 122 0 0 48 # - (Black) -printf "\033]4;8;#7A7A7A\007" -# 9 # 250 25 81 345 90 98 # - (Red) -printf "\033]4;9;#FF002B\007" -# 10 # 81 250 25 105 90 98 # - (Green) -printf "\033]4;10;#2BFF00\007" -# 11 # 250 194 25 45 90 98 # - (Yellow) -printf "\033]4;11;#FFd500\007" -# 12 # 25 81 250 225 90 98 # - (Blue) -printf "\033]4;12;#002AFF\007" -# 13 # 194 25 250 285 90 98 # - (Magenta) -printf "\033]4;13;#D400FF\007" -# 14 # 25 259 194 165 90 98 # - (Cyan) -printf "\033]4;14;#00FFC0\007" -# 15 # 250 250 250 0 0 98 # - (White) -printf "\033]4;15;#FAFAFA\007" - -# TEsting again - -# Nr # R G B H S B # Name -# FG # 250 250 250 0 0 98 # Daisy (White) -# FAFAFA # Daisy (Foreground) -printf "\033]10;#FAFAFA\007" -# 171717 # Background -printf "\033]11;#171717\007" - -# Nr # R G B H S B # Name -# 0 # 61 61 61 0 0 24 # - (Black) -printf "\033]4;0;#202124\007" -# 1 # 186 19 61 345 90 73 # - (Red) -printf "\033]4;1;#EA4335\007" -# 2 # 61 186 19 105 90 73 # - (Green) -printf "\033]4;2;#34A853\007" -# 3 # 186 144 19 45 90 73 # - (Yellow) -printf "\033]4;3;#FBBC04\007" -# 4 # 19 61 186 225 90 73 # - (Blue) -printf "\033]4;4;#4285F4\007" -# 5 # 144 19 186 285 90 73 # - (Magenta) -printf "\033]4;5;#A142F4\007" -# 6 # 19 186 144 165 90 73 # - (Cyan) -printf "\033]4;6;#24C1E0\007" -# 7 # 186 186 186 0 0 73 # - (White) -printf "\033]4;7;#FBFCF8\007" - -# Bright colors (8-15) - -# Nr # R G B H S B # Name -# 8 # 122 122 122 0 0 48 # - (Black) -printf "\033]4;8;#5F6368\007" -# 9 # 250 25 81 345 90 98 # - (Red) -printf "\033]4;9;#EA4335\007" -# 10 # 81 250 25 105 90 98 # - (Green) -printf "\033]4;10;#34A853\007" -# 11 # 250 194 25 45 90 98 # - (Yellow) -printf "\033]4;11;#FBBC05\007" -# 12 # 25 81 250 225 90 98 # - (Blue) -printf "\033]4;12;#4285F4\007" -# 13 # 194 25 250 285 90 98 # - (Magenta) -printf "\033]4;13;#A142F4\007" -# 14 # 25 259 194 165 90 98 # - (Cyan) -printf "\033]4;14;#24C1E0\007" -# 15 # 250 250 250 0 0 98 # - (White) -printf "\033]4;15;#FFFFFF\007" - diff --git a/nixos/.sops.yaml b/nixos/.sops.yaml index 385e7af..72755e4 100644 --- a/nixos/.sops.yaml +++ b/nixos/.sops.yaml @@ -1,10 +1,10 @@ keys: - - &Tibo-NixFatDesk age1fva6s64s884z0q2w7de024sp69ucvqu0pg9shrhhqsn3ewlpjfpsh6md7y - - &Tibo-NixTop age1qzutny0mqpcccqw6myyfntu6wcskruu9ghzvt6r4te7afkqwnguq05ex37 + - &tdpeuter age1q2gqur3t4fu8flsuu2zdnule37vdkh6egpt6a2e3ytx433x8gpvsr4hw6l + - &Tibo-NixDesk age1quvlqpznqkw2r0jhyx6p2hsq3dk93087yha46ugtce6ew9c64pgq4uhcvz creation_rules: - - path_regex: secrets/[^/]+\.(yaml|json|env|ini)$ + - path_regex: secrets/[^/]+\.yaml$ key_groups: - age: - - *Tibo-NixFatDesk - - *Tibo-NixTop + - *tdpeuter + diff --git a/nixos/README.md b/nixos/README.md index 552606d..615cc7a 100644 --- a/nixos/README.md +++ b/nixos/README.md @@ -1,16 +1,3 @@ -# NixOS +# nixos -Nix Flake configuration for my Linux machines running NixOS. - -## Structure - -The directory structure is organized as follows: - -- [`flake.nix`](./flake.nix): Main entrypoint for the configuration. -- [hosts/*hostname*](./hosts): Host-specific configuration by setting options. Each host has its own folder. -- [modules](./modules): Declarations of configuration options. -- [overlays](./overlays): Attribute overrides for Nix Packages. -- [secrets](./secrets): Encrypted files that store sensitive information, such as SSH private keys. -- [users/*username*](./users): User-specific configuration. Users are defined as modules, so they can be enabled or disabled on a host machine. - -[Modules](https://nixos.wiki/wiki/NixOS_modules) are a key component of NixOS. They encapsulate various configuration options, which should make it easy for you to integrate it into your specific configuration. +Nix Flake for my Linux machines running NixOS. diff --git a/nixos/flake.lock b/nixos/flake.lock index de6ae4c..9327918 100644 --- a/nixos/flake.lock +++ b/nixos/flake.lock @@ -1,15 +1,36 @@ { "nodes": { - "flake-utils": { + "devshell": { "inputs": { + "nixpkgs": [ + "nixpkgs" + ], "systems": "systems" }, "locked": { - "lastModified": 1731533236, - "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "lastModified": 1687173957, + "narHash": "sha256-GOds2bAQcZ94fb9/Nl/aM+r+0wGSi4EKYuZYR8Dw4R8=", + "owner": "numtide", + "repo": "devshell", + "rev": "2cf83bb31720fcc29a999aee28d6da101173e66a", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "devshell", + "type": "github" + } + }, + "flake-utils": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1687709756, + "narHash": "sha256-Y5wKlQSkgEK2weWdOu4J3riRd+kV/VCgHsqLNTTWQ/0=", "owner": "numtide", "repo": "flake-utils", - "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "rev": "dbabf0ca0c0c4bce6ea5eaf65af5cb694d2082c7", "type": "github" }, "original": { @@ -25,63 +46,58 @@ ] }, "locked": { - "lastModified": 1758463745, - "narHash": "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA=", + "lastModified": 1687647567, + "narHash": "sha256-Ua90LZYJO7/7KW/KK/AqijhIekd+wxPwbVKXuBYzJeQ=", "owner": "nix-community", "repo": "home-manager", - "rev": "3b955f5f0a942f9f60cdc9cacb7844335d0f21c3", + "rev": "6ca1e16eb3016c94b7ac16699e1d4158bd4e39a4", "type": "github" }, "original": { "owner": "nix-community", - "ref": "release-25.05", + "ref": "release-23.05", "repo": "home-manager", "type": "github" } }, - "nix-github-actions": { - "inputs": { - "nixpkgs": [ - "openconnect-sso", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1720066371, - "narHash": "sha256-uPlLYH2S0ACj0IcgaK9Lsf4spmJoGejR9DotXiXSBZQ=", - "owner": "nix-community", - "repo": "nix-github-actions", - "rev": "622f829f5fe69310a866c8a6cd07e747c44ef820", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "nix-github-actions", - "type": "github" - } - }, "nixpkgs": { "locked": { - "lastModified": 1760862643, - "narHash": "sha256-PXwG0TM7Ek87DNx4LbGWuD93PbFeKAJs4FfALtp7Wo0=", + "lastModified": 1687729501, + "narHash": "sha256-mTLkMePoHUWvTCf3NuKbeYEea/tsikSIKBWwb9OfRr4=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "33c6dca0c0cb31d6addcd34e90a63ad61826b28c", + "rev": "35130d4b4f0b8c50ed2aceb909a538c66c91d4a0", "type": "github" }, "original": { "id": "nixpkgs", - "ref": "nixos-25.05", + "ref": "nixos-23.05", "type": "indirect" } }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1687031877, + "narHash": "sha256-yMFcVeI+kZ6KD2QBrFPNsvBrLq2Gt//D0baHByMrjFY=", + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "e2e2059d19668dab1744301b8b0e821e3aae9c99", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "release-23.05", + "repo": "nixpkgs", + "type": "github" + } + }, "nixpkgs-unstable": { "locked": { - "lastModified": 1760878510, - "narHash": "sha256-K5Osef2qexezUfs0alLvZ7nQFTGS9DL2oTVsIXsqLgs=", + "lastModified": 1687681650, + "narHash": "sha256-M2If+gRcfpmaJy/XbfSsRzLlPpoU4nr0NHnKKl50fd8=", "owner": "NixOS", "repo": "nixpkgs", - "rev": "5e2a59a5b1a82f89f2c7e598302a9cacebb72a67", + "rev": "1c9db9710cb23d60570ad4d7ab829c2d34403de3", "type": "github" }, "original": { @@ -90,95 +106,30 @@ "type": "indirect" } }, - "openconnect-sso": { - "inputs": { - "flake-utils": [ - "utils" - ], - "nix-github-actions": "nix-github-actions", - "nixpkgs": [ - "nixpkgs" - ], - "poetry2nix": "poetry2nix", - "systems": "systems_2", - "treefmt-nix": "treefmt-nix" - }, - "locked": { - "lastModified": 1758594056, - "narHash": "sha256-6XyKDRWqBngw1g73e789iyIaw/0VF04ELk/ATtlkTVU=", - "owner": "ThinkChaos", - "repo": "openconnect-sso", - "rev": "2041471efd331d0591d34e122aefb02690fb233a", - "type": "github" - }, - "original": { - "owner": "ThinkChaos", - "ref": "fix/nix-flake", - "repo": "openconnect-sso", - "type": "github" - } - }, - "poetry2nix": { - "inputs": { - "flake-utils": [ - "openconnect-sso", - "flake-utils" - ], - "nix-github-actions": [ - "openconnect-sso", - "nix-github-actions" - ], - "nixpkgs": [ - "openconnect-sso", - "nixpkgs" - ], - "systems": [ - "openconnect-sso", - "systems" - ], - "treefmt-nix": [ - "openconnect-sso", - "treefmt-nix" - ] - }, - "locked": { - "lastModified": 1721039874, - "narHash": "sha256-XANsG9GYHip8pxZpbqKf/YGv8tIa0xTh289Y+WNBNfw=", - "owner": "nix-community", - "repo": "poetry2nix", - "rev": "d11c01e58587e5f21037ed6477465a7f26a32e27", - "type": "github" - }, - "original": { - "owner": "nix-community", - "repo": "poetry2nix", - "type": "github" - } - }, "root": { "inputs": { + "devshell": "devshell", "flake-utils": "flake-utils", "home-manager": "home-manager", "nixpkgs": "nixpkgs", "nixpkgs-unstable": "nixpkgs-unstable", - "openconnect-sso": "openconnect-sso", "sops-nix": "sops-nix", - "utils": "utils", - "zen-browser": "zen-browser" + "utils": "utils" } }, "sops-nix": { "inputs": { "nixpkgs": [ "nixpkgs" - ] + ], + "nixpkgs-stable": "nixpkgs-stable" }, "locked": { - "lastModified": 1760998189, - "narHash": "sha256-ee2e1/AeGL5X8oy/HXsZQvZnae6XfEVdstGopKucYLY=", + "lastModified": 1687398569, + "narHash": "sha256-e/umuIKFcFtZtWeX369Hbdt9r+GQ48moDmlTcyHWL28=", "owner": "Mic92", "repo": "sops-nix", - "rev": "5a7d18b5c55642df5c432aadb757140edfeb70b3", + "rev": "2ff6973350682f8d16371f8c071a304b8067f192", "type": "github" }, "original": { @@ -217,27 +168,6 @@ "type": "github" } }, - "treefmt-nix": { - "inputs": { - "nixpkgs": [ - "openconnect-sso", - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1721769617, - "narHash": "sha256-6Pqa0bi5nV74IZcENKYRToRNM5obo1EQ+3ihtunJ014=", - "owner": "numtide", - "repo": "treefmt-nix", - "rev": "8db8970be1fb8be9c845af7ebec53b699fe7e009", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "treefmt-nix", - "type": "github" - } - }, "utils": { "inputs": { "flake-utils": [ @@ -245,11 +175,11 @@ ] }, "locked": { - "lastModified": 1738591040, - "narHash": "sha256-4WNeriUToshQ/L5J+dTSWC5OJIwT39SEP7V7oylndi8=", + "lastModified": 1657226504, + "narHash": "sha256-GIYNjuq4mJlFgqKsZ+YrgzWm0IpA4axA3MCrdKYj7gs=", "owner": "gytis-ivaskevicius", "repo": "flake-utils-plus", - "rev": "afcb15b845e74ac5e998358709b2b5fe42a948d1", + "rev": "2bf0f91643c2e5ae38c1b26893ac2927ac9bd82a", "type": "github" }, "original": { @@ -257,26 +187,6 @@ "repo": "flake-utils-plus", "type": "github" } - }, - "zen-browser": { - "inputs": { - "nixpkgs": [ - "nixpkgs" - ] - }, - "locked": { - "lastModified": 1761105987, - "narHash": "sha256-d01CGcdNlsqIn4ncGCWHM0Velnii/Ggef1iybQvEOfc=", - "owner": "youwen5", - "repo": "zen-browser-flake", - "rev": "e7d9fefd8665be5d4c77466140f21a15f6d29e93", - "type": "github" - }, - "original": { - "owner": "youwen5", - "repo": "zen-browser-flake", - "type": "github" - } } }, "root": "root", diff --git a/nixos/flake.nix b/nixos/flake.nix index fa8b125..2440f38 100644 --- a/nixos/flake.nix +++ b/nixos/flake.nix @@ -2,64 +2,41 @@ description = "System configuration of my machines using flakes"; inputs = { - nixpkgs.url = "nixpkgs/nixos-25.05"; + nixpkgs.url = "nixpkgs/nixos-23.05"; nixpkgs-unstable.url = "nixpkgs/nixos-unstable"; - flake-utils.url = "github:numtide/flake-utils"; - home-manager = { - url = "github:nix-community/home-manager/release-25.05"; + devshell = { + url = "github:numtide/devshell"; inputs.nixpkgs.follows = "nixpkgs"; }; - openconnect-sso = { - url = "github:ThinkChaos/openconnect-sso/fix/nix-flake"; - inputs = { - flake-utils.follows = "utils"; - nixpkgs.follows = "nixpkgs"; - }; + flake-utils.url = "github:numtide/flake-utils"; + home-manager = { + url = "github:nix-community/home-manager/release-23.05"; + inputs.nixpkgs.follows = "nixpkgs"; }; sops-nix = { url = "github:Mic92/sops-nix"; - inputs.nixpkgs.follows = "nixpkgs"; + inputs.nixpkgs.follows = "nixpkgs"; }; utils = { url = "github:gytis-ivaskevicius/flake-utils-plus"; inputs.flake-utils.follows = "flake-utils"; }; - zen-browser = { - url = "github:youwen5/zen-browser-flake"; - inputs.nixpkgs.follows = "nixpkgs"; - }; }; outputs = inputs@{ self, nixpkgs, nixpkgs-unstable, - flake-utils, home-manager, openconnect-sso, sops-nix, utils, zen-browser, + devshell, flake-utils, home-manager, sops-nix, utils, ... }: let - system = utils.lib.system.x86_64-linux; - - unfreePackages = pkg: builtins.elem (nixpkgs.lib.getName pkg) [ - "corefonts" - "nvidia-settings" "nvidia-x11" "nvidia-persistenced" - "Oracle_VirtualBox_Extension_Pack" - "spotify" - "steam" "steam-unwrapped" "steam-run" - "vista-fonts" - "intel-ocl" - "libfprint-2-tod1-broadcom" - ]; + system = "x86_64-linux"; in utils.lib.mkFlake { inherit self inputs; - channelsConfig.allowUnfreePredicate = unfreePackages; - - sharedOverlays = [ - (import ./overlays/cmdtime) - (import ./overlays/icosystem) - (import ./overlays/letter) - (import ./overlays/spotify) - ]; + channelsConfig = { + allowUnfree = true; + }; hostDefaults = { inherit system; @@ -67,16 +44,13 @@ specialArgs = { pkgs-unstable = import nixpkgs-unstable { inherit system; - config.allowUnfreePredicate = unfreePackages; }; }; modules = [ - ./modules - ./users - - home-manager.nixosModules.home-manager + home-manager.nixosModule sops-nix.nixosModules.sops + ./modules ]; }; @@ -84,7 +58,6 @@ Tibo-NixDesk.modules = [ ./hosts/Tibo-NixDesk ]; Tibo-NixFat.modules = [ ./hosts/Tibo-NixFat ]; Tibo-NixTest.modules = [ ./hosts/Tibo-NixTest ]; - Tibo-NixTop.modules = [ ./hosts/Tibo-NixTop ]; }; }; } diff --git a/nixos/hosts/Tibo-NixDesk/default.nix b/nixos/hosts/Tibo-NixDesk/default.nix index 11b7a40..4226342 100644 --- a/nixos/hosts/Tibo-NixDesk/default.nix +++ b/nixos/hosts/Tibo-NixDesk/default.nix @@ -1,92 +1,72 @@ { config, pkgs, ... }: { - imports = [ - ./hardware-configuration.nix - ]; + imports = + [ # Include the results of the hardware scan. + ./hardware-configuration.nix + ../../modules/hardware/nvidia.nix - sisyphus = { - desktop.sway.enable = true; + ../../modules/apps/virtualbox + ../../modules/des/gnome + ]; - hardware = { - nvidia = { - enable = true; - model = "RTX 2060"; - gui-settings = true; - }; - yubikey.enable = true; - }; + # Bootloader. + boot.loader.systemd-boot.enable = true; + boot.loader.efi.canTouchEfiVariables = true; + boot.loader.efi.efiSysMountPoint = "/boot/efi"; - networking = { - networkmanager.enable = true; - openconnect-sso.enable = true; - }; - - nix = { - flakes.enable = true; - gc.onFull.enable = true; - }; - - programs = { - direnv.enable = true; - home-manager.enable = true; - sops.enable = true; - ssh.enable = true; - }; - - services = { - pipewire.enable = true; - printing.enable = true; - openrgb.enable = true; - }; - - users.tdpeuter.enable = true; - - virtualisation = { - docker.enable = true; - virtualbox.enable = true; - }; - }; - - boot = { - loader = { - systemd-boot.enable = true; - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot/efi"; - }; - }; - }; - - environment.systemPackages = with pkgs; [ - git - vim-full - w3m - wget - zenith-nvidia - ]; - - programs = { - steam.enable = true; - zsh.enable = true; - }; - - hardware.bluetooth.enable = true; - - networking.hostName = "Tibo-NixDesk"; - - services.xserver.xkb = { - layout = "us"; - variant = "altgr-intl"; - }; - - system.stateVersion = "24.05"; + # Enable networking + networking.hostName = "Tibo-NixDesk"; # Define your hostname. + networking.networkmanager.enable = true; + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + # Set your time zone. time.timeZone = "Europe/Brussels"; - i18n.defaultLocale = "en_GB.UTF-8"; - console = { - # font = "Lat2-Terminus16"; - useXkbConfig = true; # use xkbOptions in tty. + # Select internationalisation properties. + i18n.defaultLocale = "en_GB.utf8"; + + # Configure keymap in X11 + services.xserver = { + layout = "us"; + xkbVariant = ""; }; + + # Enable sound with pipewire. + sound.enable = true; + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + system.stateVersion = "23.05"; } diff --git a/nixos/hosts/Tibo-NixDesk/hardware-configuration.nix b/nixos/hosts/Tibo-NixDesk/hardware-configuration.nix index 4903685..826c7bc 100644 --- a/nixos/hosts/Tibo-NixDesk/hardware-configuration.nix +++ b/nixos/hosts/Tibo-NixDesk/hardware-configuration.nix @@ -4,67 +4,26 @@ { config, lib, pkgs, modulesPath, ... }: { - imports = [ - (modulesPath + "/installer/scan/not-detected.nix") - ]; + imports = + [ (modulesPath + "/installer/scan/not-detected.nix") + ]; - boot = { - initrd = { - availableKernelModules = [ "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; - kernelModules = [ ]; - }; - kernelModules = [ "kvm-intel" ]; - extraModulePackages = [ ]; - }; + boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; - fileSystems = { - "/" = { - device = "/dev/disk/by-label/NIX-ROOT"; + fileSystems."/" = + { device = "/dev/disk/by-label/NIXROOT"; fsType = "ext4"; }; - "/boot/efi" = { - device = "/dev/disk/by-label/NIX-BOOT"; + fileSystems."/boot/efi" = + { device = "/dev/disk/by-label/NIXBOOT"; fsType = "vfat"; }; - "/nix" = { - device = "/dev/disk/by-label/NIX-STORE"; - fsType = "ext4"; - options = [ "noatime" ]; - }; - - "/mnt/Nextcloud" = { - device = "/dev/disk/by-label/Nextcloud"; - fsType = "ntfs"; - }; - - # "/home/${config.users.users.tdpeuter.name}/Nextcloud" = { - "/home/tdpeuter/Nextcloud" = { - depends = [ - "/mnt/Nextcloud" - ]; - device = "/mnt/Nextcloud/Nextcloud"; - fsType = "none"; - options = [ - "bind" - ]; - }; - - "/mnt/Games" = { - device = "/dev/disk/by-label/Games"; - fsType = "ntfs"; - options = [ - "uid=tdpeuter" - "gid=users" - "defaults" - ]; - }; - }; - - swapDevices = [ - { device = "/dev/disk/by-label/SWAP"; } - ]; + swapDevices = [ ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's diff --git a/nixos/hosts/Tibo-NixFat/default.nix b/nixos/hosts/Tibo-NixFat/default.nix index 2e790c3..b6947d1 100644 --- a/nixos/hosts/Tibo-NixFat/default.nix +++ b/nixos/hosts/Tibo-NixFat/default.nix @@ -3,131 +3,107 @@ { imports = [ ./hardware-configuration.nix + ../../modules/hardware/nvidia.nix + + ../../modules/apps/virtualbox + ../../modules/des/gnome ]; - - sisyphus = { - desktop = { - sway.enable = true; - hyprland.enable = true; + + # Use the systemd-boot EFI boot loader.] + boot.loader = { + systemd-boot.enable = true; + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot/efi"; }; - - hardware = { - eid.enable = true; - nvidia = { - enable = true; - model = "Quadro T2000"; - }; - yubikey.enable = true; - }; - - networking = { - networkmanager.enable = true; - openconnect-sso.enable = true; - }; - - nix = { - flakes.enable = true; - gc.onFull.enable = true; - }; - - programs = { - direnv.enable = true; - home-manager.enable = true; - sops.enable = true; - ssh.enable = true; - }; - - services = { - pipewire.enable = true; - tailscale.enable = true; - }; - - users.tdpeuter.enable = true; - - virtualisation = { - docker.enable = true; - virtualbox.enable = true; - }; - }; - - boot = { - # Encryption - initrd = { - # Setup keyfile - secrets."/crypto_keyfile.bin" = null; - - # Enable swap on luks - luks.devices."luks-3825c43c-6cc4-4846-b1cc-02b5938640c9" = { - device = "/dev/disk/by-uuid/3825c43c-6cc4-4846-b1cc-02b5938640c9"; - keyFile = "/crypto_keyfile.bin"; - }; - }; - - # Use the systemd-boot EFI boot loader.] - loader = { - systemd-boot.enable = true; - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot/efi"; - }; - }; - }; - - environment.systemPackages = with pkgs; [ - git - vim-full - w3m - wget - zenith-nvidia - ]; - - programs = { - zsh.enable = true; - }; - - hardware.bluetooth = { - enable = true; - powerOnBoot = false; }; - networking = { - hostName = "Tibo-NixFat"; - networkmanager.wifi.powersave = true; + # Setup keyfile + boot.initrd.secrets = { + "/crypto_keyfile.bin" = null; }; - services = { - logind = { - # Handle the laptop lid switch as follows: - lidSwitch = "hybrid-sleep"; - lidSwitchExternalPower = "lock"; - lidSwitchDocked = "ignore"; - - # Handle the power key - powerKey = "suspend"; - }; - - xserver.xkb = { - # Keyboard layout - layout = "us"; - variant = "altgr-intl"; - }; - - # Touchpad - libinput.enable = true; - - thermald.enable = true; - }; - - system.stateVersion = "24.05"; - - systemd.coredump.enable = false; - + networking.hostName = "Tibo-NixFat"; + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. + + # Set your time zone. time.timeZone = "Europe/Brussels"; - - # --- Barrier --- - + + # Configure network proxy if necessary + # networking.proxy.default = "http://user:password@proxy:port/"; + # networking.proxy.noProxy = "127.0.0.1,localhost,internal.domain"; + + # Select internationalisation properties. i18n.defaultLocale = "en_GB.UTF-8"; - console = { - useXkbConfig = true; # use xkbOptions in tty. + # console = { + # font = "Lat2-Terminus16"; + # keyMap = "us"; + # useXkbConfig = true; # use xkbOptions in tty. + # }; + + services.xserver = { + # Configure keymap in X11 + layout = "us"; + xkbVariant = ""; }; + + # Enable CUPS to print documents. + # services.printing.enable = true; + + # Enable sound with pipewire. + sound.enable = true; + hardware.pulseaudio.enable = false; + security.rtkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + alsa.support32Bit = true; + pulse.enable = true; + # If you want to use JACK applications, uncomment this + #jack.enable = true; + + # use the example session manager (no others are packaged yet so this is enabled by default, + # no need to redefine it in your config for now) + #media-session.enable = true; + }; + + services.logind.lidSwitch = "ignore"; + + # Enable Bluetooth. + hardware.bluetooth.enable = true; + + # Enable touchpad support (enabled default in most desktopManager). + services.xserver.libinput.enable = true; + + # Allow unfree packages + nixpkgs.config.allowUnfree = true; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + + # Open ports in the firewall. + # networking.firewall.allowedTCPPorts = [ ... ]; + # networking.firewall.allowedUDPPorts = [ ... ]; + # Or disable the firewall altogether. + # networking.firewall.enable = false; + + # Copy the NixOS configuration file and link it from the resulting system + # (/run/current-system/configuration.nix). This is useful in case you + # accidentally delete configuration.nix. + # system.copySystemConfiguration = true; + + system.stateVersion = "23.05"; } + diff --git a/nixos/hosts/Tibo-NixFat/hardware-configuration.nix b/nixos/hosts/Tibo-NixFat/hardware-configuration.nix index b0dfd70..d2ef044 100644 --- a/nixos/hosts/Tibo-NixFat/hardware-configuration.nix +++ b/nixos/hosts/Tibo-NixFat/hardware-configuration.nix @@ -8,50 +8,35 @@ (modulesPath + "/installer/scan/not-detected.nix") ]; - boot = { - initrd = { - availableKernelModules = [ - "xhci_pci" - "nvme" - "usb_storage" - "sd_mod" - "rtsx_pci_sdmmc" - ]; - kernelModules = [ ]; - luks.devices."luks-c21cb4a4-f618-43af-bc0c-e8be74fe3b81".device = "/dev/disk/by-uuid/c21cb4a4-f618-43af-bc0c-e8be74fe3b81"; - }; - kernelModules = [ "kvm-intel" ]; - extraModulePackages = [ ]; - }; + boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; + boot.initrd.kernelModules = [ ]; + boot.kernelModules = [ "kvm-intel" ]; + boot.extraModulePackages = [ ]; - fileSystems = { - "/" = { - device = "/dev/disk/by-label/NIX-ROOT"; + fileSystems."/" = + { device = "/dev/disk/by-label/NIXROOT"; fsType = "ext4"; }; - "/boot/efi" = { - device = "/dev/disk/by-label/NIX-BOOT"; + boot.initrd.luks.devices."luks-7319552e-7148-4a9b-aa56-aa580b0b935a".device = "/dev/disk/by-uuid/7319552e-7148-4a9b-aa56-aa580b0b935a"; + + fileSystems."/boot/efi" = + { device = "/dev/disk/by-label/NIXBOOT"; fsType = "vfat"; }; - }; - swapDevices = [ - { device = "/dev/disk/by-label/SWAP"; } - ]; + # swapDevices = + # [ { device = "/dev/disk/by-label/SWAP"; } + # ]; # Enables DHCP on each ethernet and wireless interface. In case of scripted networking # (the default) this is the recommended approach. When using systemd-networkd it's # still possible to use this option, but it's recommended to use it in conjunction # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`. networking.useDHCP = lib.mkDefault true; - # networking.interfaces.eno1.useDHCP = lib.mkDefault true; - # networking.interfaces.wlp111s0.useDHCP = lib.mkDefault true; + # networking.interfaces.eno2.useDHCP = lib.mkDefault true; + # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; - nixpkgs.config.allowUnfree = true; - hardware = { - enableAllFirmware = true; - cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; - }; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; } diff --git a/nixos/hosts/Tibo-NixTest/default.nix b/nixos/hosts/Tibo-NixTest/default.nix index 15022c7..e983ff6 100644 --- a/nixos/hosts/Tibo-NixTest/default.nix +++ b/nixos/hosts/Tibo-NixTest/default.nix @@ -1,14 +1,22 @@ +# Edit this configuration file to define what should be installed on +# your system. Help is available in the configuration.nix(5) man page +# and in the NixOS manual (accessible by running ‘nixos-help’). + { config, pkgs, ... }: { imports = [ # Include the results of the hardware scan. ./hardware-configuration.nix - - ../../modules/des/plasma ]; - # Bootloader + # Nix Flakes + nix.package = pkgs.nixFlakes; + nix.extraOptions = '' + experimental-features = nix-command flakes + ''; + + # Use the systemd-boot EFI boot loader.] boot.loader = { systemd-boot.enable = true; @@ -18,11 +26,10 @@ }; }; - networking = { - hostName = "Tibo-NixTest"; - # wireless.enable = true; # Enables wireless support via wpa_supplicant. - networkmanager.enable = true; # Easiest to use and most distros use this by default. - }; + networking.hostName = "Tibo-NixTest"; # Define your hostname. + # Pick only one of the below networking options. + # networking.wireless.enable = true; # Enables wireless support via wpa_supplicant. + networking.networkmanager.enable = true; # Easiest to use and most distros use this by default. # Set your time zone. time.timeZone = "Europe/Brussels"; @@ -46,6 +53,29 @@ # "caps:escape" # map caps to escape. # }; + + services.xserver = { + # Enable the X11 windowing system. + enable = true; + + # Enable the Plasma 5 Desktop Environment. + displayManager.sddm.enable = true; + displayManager.defaultSession = "plasmawayland"; + + desktopManager.plasma5 = { + enable = true; + excludePackages = with pkgs.libsForQt5; [ + elisa + okular + plasma-browser-integration + khelpcenter + kwalletmanager + oxygen + ]; + }; + + }; + # Enable CUPS to print documents. # services.printing.enable = true; @@ -59,6 +89,44 @@ # Enable touchpad support (enabled default in most desktopManager). services.xserver.libinput.enable = true; + # Define a user account. Don't forget to set a password with ‘passwd’. + users.users.tdpeuter = { + description = "Tibo De Peuter"; + isNormalUser = true; + extraGroups = [ "wheel" "networkmanager" ]; + initialPassword = "ChangeMe"; + packages = with pkgs; [ + home-manager + ]; + }; + + # List packages installed in system profile. To search, run: + # $ nix search wget + environment.systemPackages = with pkgs; [ + firefox + git + mongodb + vim + wget + ]; + + nixpkgs.config = { + allowUnfree = true; + }; + + # Some programs need SUID wrappers, can be configured further or are + # started in user sessions. + # programs.mtr.enable = true; + # programs.gnupg.agent = { + # enable = true; + # enableSSHSupport = true; + # }; + + # List services that you want to enable: + + # Enable the OpenSSH daemon. + # services.openssh.enable = true; + # Open ports in the firewall. # networking.firewall.allowedTCPPorts = [ ... ]; # networking.firewall.allowedUDPPorts = [ ... ]; @@ -70,7 +138,13 @@ # accidentally delete configuration.nix. # system.copySystemConfiguration = true; - system.stateVersion = "23.05"; + # This value determines the NixOS release from which the default + # settings for stateful data, like file locations and database versions + # on your system were taken. It‘s perfectly fine and recommended to leave + # this value at the release version of the first install of this system. + # Before changing this value read the documentation for this option + # (e.g. man configuration.nix or on https://nixos.org/nixos/options.html). + system.stateVersion = "22.11"; # Did you read the comment? } diff --git a/nixos/hosts/Tibo-NixTop/default.nix b/nixos/hosts/Tibo-NixTop/default.nix deleted file mode 100644 index 7431ae5..0000000 --- a/nixos/hosts/Tibo-NixTop/default.nix +++ /dev/null @@ -1,203 +0,0 @@ -# Edit this configuration file to define what should be installed on -# your system. Help is available in the configuration.nix(5) man page, on -# https://search.nixos.org/options and in the NixOS manual (`nixos-help`). - -{ config, lib, pkgs, ... }: - -{ - imports = [ - # Include the results of the hardware scan. - ./hardware-configuration.nix - ]; - - sisyphus = { - desktop.hyprland.enable = true; - - hardware = { - eid.enable = true; - fingerprint-scanner.enable = true; - nvidia = { - enable = true; - model = "Quadro T2000"; - }; - yubikey.enable = true; - }; - - networking = { - networkmanager.enable = true; - openconnect-sso.enable = true; - }; - - nix = { - flakes.enable = true; - gc.onFull.enable = true; - }; - - programs = { - direnv.enable = true; - home-manager.enable = true; - sops.enable = true; - ssh.enable = true; - }; - - services = { - pipewire.enable = true; - tailscale.enable = true; - }; - - users.tdpeuter.enable = true; - - virtualisation = { - docker.enable = true; - virtualbox.enable = true; - }; - }; - - boot = { - initrd = { - # Use EFI and YubiKey - kernelModules = [ "vfat" "nls_cp437" "nls_iso8859-1" "usbhid" ]; - - luks = { - # Enable YubiKey PBA - yubikeySupport = true; - devices."encrypted".yubikey = { - slot = 2; - twoFactor = false; - gracePeriod = 10; - keyLength = 64; - saltLength = 16; - storage.device = "/dev/nvme0n1p1"; - }; - }; - }; - - loader = { - # Use the systemd-boot EFI boot loader. - systemd-boot = { - enable = true; - - editor = false; - memtest86.enable = true; - }; - efi.canTouchEfiVariables = true; - }; - - # Use latest kernel. - kernelPackages = pkgs.linuxPackages_latest; - - plymouth.enable = true; - }; - - hardware.bluetooth = { - enable = true; - powerOnBoot = false; - }; - - programs.zsh.enable = true; - - services = { - auto-cpufreq = { - enable = true; - settings = { - battery = { - governor = "powersave"; - turbo = "never"; - }; - charger = { - governor = "performance"; - turbo = "auto"; - }; - }; - }; - - logind = { - # Handle the laptop lid switch as follows: - lidSwitch = "hybrid-sleep"; - lidSwitchExternalPower = "lock"; - lidSwitchDocked = "ignore"; - - # Handle the power key - powerKey = "suspend"; - }; - - - power-profiles-daemon.enable = false; - - smartd.enable = true; - - thermald.enable = true; - - xserver = { - # Keyboard layout - xkb = { - layout = "us"; - variant = "altgr-intl"; - }; - }; - - # Touchpad - libinput.enable = true; - }; - - networking = { - hostName = "Tibo-NixTop"; # Define your hostname. - }; - - # Set your time zone. - time.timeZone = "Europe/Brussels"; - - # Select internationalisation properties. - i18n = { - defaultLocale = "en_GB.UTF-8"; # LANG - extraLocaleSettings.LC_TIME = "nl_BE.UTF-8"; - }; - - console = { - # font = "Lat2-Terminus16"; - # keyMap = "us"; - useXkbConfig = true; # use xkb.options in tty. - }; - - # Enable CUPS to print documents. - # services.printing.enable = true; - - # Enable touchpad support (enabled default in most desktopManager). - # services.libinput.enable = true; - - # List packages installed in system profile. - # You can use https://search.nixos.org/ to find more packages (and options). - environment = { - # Enabled to allow installed binaries in ~/.local/bin - localBinInPath = true; - - systemPackages = with pkgs; [ - git - vim-full # Do not forget to add an editor to edit configuration.nix! The Nano editor is also installed by default. - w3m - wget - zenith-nvidia - ]; - }; - - # This option defines the first version of NixOS you have installed on this particular machine, - # and is used to maintain compatibility with application data (e.g. databases) created on older NixOS versions. - # - # Most users should NEVER change this value after the initial install, for any reason, - # even if you've upgraded your system to a new NixOS release. - # - # This value does NOT affect the Nixpkgs version your packages and OS are pulled from, - # so changing it will NOT upgrade your system - see https://nixos.org/manual/nixos/stable/#sec-upgrading for how - # to actually do that. - # - # This value being lower than the current NixOS release does NOT mean your system is - # out of date, out of support, or vulnerable. - # - # Do NOT change this value unless you have manually inspected all the changes it would make to your configuration, - # and migrated your data accordingly. - # - # For more information, see `man configuration.nix` or https://nixos.org/manual/nixos/stable/options#opt-system.stateVersion . - system.stateVersion = "25.05"; # Did you read the comment? - -} - diff --git a/nixos/hosts/Tibo-NixTop/hardware-configuration.nix b/nixos/hosts/Tibo-NixTop/hardware-configuration.nix deleted file mode 100644 index ac27dba..0000000 --- a/nixos/hosts/Tibo-NixTop/hardware-configuration.nix +++ /dev/null @@ -1,41 +0,0 @@ -# Do not modify this file! It was generated by ‘nixos-generate-config’ -# and may be overwritten by future invocations. Please make changes -# to /etc/nixos/configuration.nix instead. -{ config, lib, pkgs, modulesPath, ... }: - -{ - imports = - [ (modulesPath + "/installer/scan/not-detected.nix") - ]; - - boot.initrd.availableKernelModules = [ "xhci_pci" "nvme" "usbhid" "usb_storage" "sd_mod" "rtsx_pci_sdmmc" ]; - boot.initrd.kernelModules = [ ]; - boot.kernelModules = [ ]; - boot.extraModulePackages = [ ]; - - fileSystems."/" = - { device = "/dev/disk/by-uuid/e759b10f-7949-4094-9272-d91340dcc5b6"; - fsType = "ext4"; - }; - - boot.initrd.luks.devices."encrypted".device = "/dev/disk/by-uuid/2b6586fa-8823-4add-94f3-132aab17b7b8"; - - fileSystems."/boot" = - { device = "/dev/disk/by-uuid/12CE-A600"; - fsType = "vfat"; - options = [ "fmask=0022" "dmask=0022" ]; - }; - - swapDevices = [ ]; - - # Enables DHCP on each ethernet and wireless interface. In case of scripted networking - # (the default) this is the recommended approach. When using systemd-networkd it's - # still possible to use this option, but it's recommended to use it in conjunction - # with explicit per-interface declarations with `networking.interfaces.<interface>.useDHCP`. - networking.useDHCP = lib.mkDefault true; - # networking.interfaces.eno2.useDHCP = lib.mkDefault true; - # networking.interfaces.wlo1.useDHCP = lib.mkDefault true; - - nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; - hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; -} diff --git a/nixos/modules/apps/alacritty/default.nix b/nixos/modules/apps/alacritty/default.nix new file mode 100644 index 0000000..dad5f42 --- /dev/null +++ b/nixos/modules/apps/alacritty/default.nix @@ -0,0 +1,15 @@ +{ inputs, lib, config, pkgs, ... }: + +{ + home-manager.users.tdpeuter = { pkgs, ... }: { + home = { + packages = with pkgs; [ + alacritty + ]; + + file = { + ".config/alacritty".source = ../../../../stow/alacritty/.config/alacritty; + }; + }; + }; +} diff --git a/nixos/modules/apps/default.nix b/nixos/modules/apps/default.nix new file mode 100644 index 0000000..ab391da --- /dev/null +++ b/nixos/modules/apps/default.nix @@ -0,0 +1,27 @@ +{ + imports = [ + ./alacritty + ./firefox + ./steam + ./thunderbird + # ./virtualbox + ]; + + home-manager.users.tdpeuter = { pkgs, ... }: { + home.packages = with pkgs; [ + brave + caprine-bin + discord + jellyfin-media-player + libreoffice-fresh + mattermost-desktop + nextcloud-client + obsidian + pinentry_qt + qalculate-gtk + spotify + zathura + zoom-us + ]; + }; +} diff --git a/nixos/modules/apps/firefox/default.nix b/nixos/modules/apps/firefox/default.nix new file mode 100644 index 0000000..058ed81 --- /dev/null +++ b/nixos/modules/apps/firefox/default.nix @@ -0,0 +1,41 @@ +{ inputs, lib, config, pkgs, ... }: + +{ + home-manager.users.tdpeuter.programs.firefox = { + enable = true; + package = pkgs.firefox.override { + cfg = { + enableTridactylNative = true; + }; + extraPolicies = { + DisableFirefoxStudies = true; + DisablePocket = true; + DisableTelemetry = true; + ExtensionSettings = {}; + OfferToSaveLogins = false; + }; + }; + profiles.tdpeuter = { + search = { + default = "DuckDuckGo"; + force = true; + engines = { + "eBay".metaData.hidden = true; + "Nix Packages" = { + urls = [{ + template = "https://search.nixos.org/packages"; + params = [ + { name = "type"; value = "packages"; } + { name = "query"; value = "{searchTerms}"; } + ]; + }]; + + icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; + definedAliases = [ "@np" ]; + }; + }; + }; + }; + }; +} + diff --git a/nixos/modules/apps/steam/default.nix b/nixos/modules/apps/steam/default.nix new file mode 100644 index 0000000..1dc2523 --- /dev/null +++ b/nixos/modules/apps/steam/default.nix @@ -0,0 +1,8 @@ +{ inputs, lib, config, pkgs, ... }: + +{ + programs.steam = { + enable = true; + }; + +} diff --git a/nixos/modules/apps/thunderbird/default.nix b/nixos/modules/apps/thunderbird/default.nix new file mode 100644 index 0000000..b6d8d57 --- /dev/null +++ b/nixos/modules/apps/thunderbird/default.nix @@ -0,0 +1,164 @@ +{ inputs, lib, config, pkgs, ... }: + +let + signatures = { + default = '' + Met vriendelijke groeten + Tibo De Peuter + ''; + UGent = '' + Met vriendelijke groeten + Tibo De Peuter + + Student 2Ba Informatica + ''; + MrFortem = '' + Kind regards + MrFortem Fiducia + ''; + }; +in +{ + home-manager.users.tdpeuter = { + accounts.email.accounts = { + Telenet = { + address = "tibo.depeuter@telenet.be"; + userName = "tibo.depeuter@telenet.be"; + imap = { + host = "imap.telenet.be"; + port = 993; + tls.enable = true; + }; + smtp = { + host = "smtp.telenet.be"; + port = 587; + tls = { + enable = true; + useStartTls = true; + }; + }; + + realName = "Tibo De Peuter"; + signature = { + showSignature = "append"; + text = signatures.default; + }; + + primary = true; + thunderbird = { + enable = true; + settings = id: { + "mail.identity.id_${id}.htmlSigText" = signatures.default; + }; + }; + }; + UGent = { + flavor = "outlook.office365.com"; + address = "tibo.depeuter@ugent.be"; + + realName = "Tibo De Peuter"; + signature = { + showSignature = "append"; + text = signatures.UGent; + }; + + thunderbird = { + enable = true; + settings = id: { + "mail.server.server_${id}.authMethod" = 10; + "mail.smtpserver.smtp_${id}.authMethod" = 10; + "mail.identity.id_${id}.htmlSigText" = signatures.UGent; + }; + }; + }; + Gmail = { + flavor = "gmail.com"; + address = "tibo.depeuter@gmail.com"; + + realName = "Tibo De Peuter"; + signature = { + showSignature = "append"; + text = signatures.default; + }; + thunderbird = { + enable = true; + settings = id: { + "mail.identity.id_${id}.htmlSigText" = signatures.default; + }; + }; + + }; + MrFortem = { + flavor = "gmail.com"; + address = "fortemfiducia@gmail.com"; + + realName = "Fortem Fiducia"; + signature = { + showSignature = "attach"; + text = '' + Kind regards + MrFortem Fiducia + ''; + }; + + thunderbird = { + enable = true; + settings = id: { + "mail.server.server_${id}.directory" = ".thunderbird/tdpeuter/ImapMail/imap.gmail.com-mrfortem"; + "mail.server.server_${id}.directory-rel" = "[ProfD]ImapMail/imap.gmail.com-mrfortem"; + "mail.identity.id_${id}.htmlSigText" = signatures.MrFortem; + }; + }; + }; + }; + + programs = { + thunderbird = { + enable = true; + profiles.tdpeuter = { + isDefault = true; + settings = { + "mailnews.default_sort_order" = 2; # Sort descending + "mailnews.mark_message_read.delay" = true; + "mailnews.start_page.enabled" = false; + "mail.pane_config.dynamic" = 2; # Vertical view + + "calendar.list.sortOrder" = "personal ugent tasks planning zeus"; + + "calendar.registry.personal.cache.enabled" = true; + "calendar.registry.personal.name" = "Personal"; + "calendar.registry.personal.type" = "caldav"; + "calendar.registry.personal.uri" = "https://cloud.depeuter.dev/remote.php/dav/calendars/tdpeuter/personal/"; + "calendar.registry.personal.username" = "tdpeuter"; + + "calendar.registry.ugent.cache.enabled" = true; + "calendar.registry.ugent.color" = "#1E64C8"; + "calendar.registry.ugent.name" = "UGent"; + "calendar.registry.ugent.type" = "caldav"; + "calendar.registry.ugent.uri" = "https://cloud.depeuter.dev/remote.php/dav/calendars/tdpeuter/ugent/"; + "calendar.registry.ugent.username" = "tdpeuter"; + + "calendar.registry.planning.cache.enabled" = true; + "calendar.registry.planning.name" = "Planning"; + "calendar.registry.planning.type" = "caldav"; + "calendar.registry.planning.uri" = "https://cloud.depeuter.dev/remote.php/dav/calendars/tdpeuter/planning/"; + "calendar.registry.planning.username" = "tdpeuter"; + + "calendar.registry.zeus.cache.enabled" = true; + "calendar.registry.zeus.color" = "#FF7F00"; + "calendar.registry.zeus.name" = "ZeusWPI"; + "calendar.registry.zeus.type" = "ics"; + "calendar.registry.zeus.uri" = "https://zeus.ugent.be/ical.ics"; + + "calendar.registry.tasks.cache.enabled" = true; + "calendar.registry.tasks.color" = "#813D9C"; + "calendar.registry.tasks.name" = "Tasks"; + "calendar.registry.tasks.type" = "caldav"; + "calendar.registry.tasks.uri" = "https://cloud.depeuter.dev/remote.php/dav/calendars/tdpeuter/tasks-2/"; + "calendar.registry.tasks.username" = "tdpeuter"; + }; + }; + }; + }; + }; +} diff --git a/nixos/modules/apps/virtualbox/default.nix b/nixos/modules/apps/virtualbox/default.nix new file mode 100644 index 0000000..8766028 --- /dev/null +++ b/nixos/modules/apps/virtualbox/default.nix @@ -0,0 +1,17 @@ +{ + + virtualisation.virtualbox = { + host = { + enable = true; + enableExtensionPack = true; + }; + guest = { + enable = true; + x11 = true; + }; + }; + users.extraGroups.vboxusers.members = [ + "user-with-access-to-virtualbox" + ]; + +} diff --git a/nixos/modules/default.nix b/nixos/modules/default.nix index 4a466b2..6a39c9c 100644 --- a/nixos/modules/default.nix +++ b/nixos/modules/default.nix @@ -1,11 +1,58 @@ +{ inputs, lib, config, pkgs, ... }: + { imports = [ - ./desktop - ./hardware - ./networking - ./nix - ./programs - ./services - ./virtualisation + ./apps + ./shells + ./utils ]; + + # Nix Flakes + nix.package = pkgs.nixFlakes; + nix.extraOptions = '' + experimental-features = nix-command flakes + keep-outputs = true + keep-derivations = true + ''; + + users.users.tdpeuter = { + description = "Tibo De Peuter"; + isNormalUser = true; + extraGroups = [ "networkmanager" "wheel" ]; + initialPassword = "ChangeMe"; + packages = with pkgs; [ + home-manager + ]; + }; + + home-manager.useGlobalPkgs = true; + + home-manager.users.tdpeuter = { pkgs, ... }: { + home = { + username = "tdpeuter"; + homeDirectory = "/home/tdpeuter"; + stateVersion = "23.05"; + + packages = with pkgs; [ + gnupg + + # Fonts + corefonts # Calibri for Uni + ]; + }; + + programs = { + home-manager.enable = true; + gpg.enable = true; + }; + + services = { + gpg-agent = { + enable = true; + pinentryFlavor = "qt"; + }; + + }; + }; + } diff --git a/nixos/modules/des/gnome/default.nix b/nixos/modules/des/gnome/default.nix new file mode 100644 index 0000000..9fc9bee --- /dev/null +++ b/nixos/modules/des/gnome/default.nix @@ -0,0 +1,41 @@ +{ config, lib, pkgs, ... }: + +{ + services.xserver = { + enable = true; + + # Enable the GNOME Desktop Environment. + displayManager.gdm.enable = true; + desktopManager.gnome.enable = true; + + excludePackages = with pkgs; [ + xterm + ]; + }; + + environment.systemPackages = with pkgs; [ + gnomeExtensions.launch-new-instance + ]; + + environment.gnome.excludePackages = (with pkgs; [ + epiphany # Web browser + gnome-console + gnome-photos + gnome-text-editor + gnome-tour + ]) ++ (with pkgs.gnome; [ + geary # Mail client + gedit + gnome-calculator + gnome-calendar + gnome-characters + gnome-clocks + gnome-contacts + gnome-maps + gnome-music + gnome-weather + simple-scan + totem # Movie player + yelp # Help viewer + ]); +} diff --git a/nixos/modules/des/plasma/default.nix b/nixos/modules/des/plasma/default.nix new file mode 100644 index 0000000..55c69bb --- /dev/null +++ b/nixos/modules/des/plasma/default.nix @@ -0,0 +1,32 @@ +{ config, lib, pkgs, ... }: + +{ + services.xserver = { + enable = true; + + displayManager.sddm = { + enable = true; + # https://discourse.nixos.org/t/plasma-wayland-session-not-available-from-sddm/13447/2 + settings.Wayland.SessionDir = "${pkgs.plasma5Packages.plasma-workspace}/share/wayland-sessions"; + }; + + desktopManager.plasma5 = { + enable = true; + useQtScaling = true; + + excludePackages = with pkgs.libsForQt5; [ + elisa + okular + khelpcenter + konsole + print-manager + plasma-systemmonitor + gwenview + ]; + }; + + excludePackages = with pkgs; [ + xterm + ]; + }; +} diff --git a/nixos/modules/des/sway/default.nix b/nixos/modules/des/sway/default.nix new file mode 100644 index 0000000..c485a60 --- /dev/null +++ b/nixos/modules/des/sway/default.nix @@ -0,0 +1,110 @@ +{ config, pkgs, lib, ... }: + +let + # bash script to let dbus know about important env variables and + # propagate them to relevent services run at the end of sway config + # see + # https://github.com/emersion/xdg-desktop-portal-wlr/wiki/"It-doesn't-work"-Troubleshooting-Checklist + # note: this is pretty much the same as /etc/sway/config.d/nixos.conf but also restarts + # some user services to make sure they have the correct environment variables + dbus-sway-environment = pkgs.writeTextFile { + name = "dbus-sway-environment"; + destination = "/bin/dbus-sway-environment"; + executable = true; + + text = '' + dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway + systemctl --user stop pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr + systemctl --user start pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr + ''; + }; + + # currently, there is some friction between sway and gtk: + # https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland + # the suggested way to set gtk settings is with gsettings + # for gsettings to work, we need to tell it where the schemas are + # using the XDG_DATA_DIR environment variable + # run at the end of sway config + configure-gtk = pkgs.writeTextFile { + name = "configure-gtk"; + destination = "/bin/configure-gtk"; + executable = true; + text = let + schema = pkgs.gsettings-desktop-schemas; + datadir = "${schema}/share/gsettings-schemas/${schema.name}"; + in '' + export XDG_DATA_DIRS=${datadir}:$XDG_DATA_DIRS + gnome_schema=org.gnome.desktop.interface + gsettings set $gnome_schema gtk-theme 'Dracula' + ''; + }; +in +{ + services.xserver = { + enable = true; + + displayManager.lightdm.enable = true; + + excludePackages = with pkgs; [ + xterm + ]; + }; + + security.polkit.enable = true; + services.pipewire = { + enable = true; + alsa.enable = true; + pulse.enable = true; + }; + + services.dbus.enable = true; + xdg.portal = { + enable = true; + wlr.enable = true; + extraPortals = [ pkgs.xdg-desktop-portal-gtk ]; + }; + + programs.sway = { + enable = true; + wrapperFeatures.gtk = true; + }; + + home-manager.users.tdpeuter = { pkgs, ... }: { + home = { + username = "tdpeuter"; + homeDirectory = "/home/tdpeuter"; + + file = { + ".config/sway".source = ../../../../stow/sway/.config/sway; + ".config/waybar".source = ../../../../stow/waybar/.config/waybar; + ".config/dunst".source = ../../../../stow/dunst/.config/dunst; + # TODO Fix scripts, I don't like it this way + ".scripts".source = ../../../../stow/_scripts/.scripts; + }; + + packages = with pkgs; [ + brightnessctl + dunst + font-awesome + pamixer + pavucontrol + playerctl + swayidle + swaylock-effects + waybar + wmname + ]; +# }; +# +# wayland.windowManager.sway = { +# enable = true; +# package = pkgs.sway-unwrapped; +# config = rec { +# terminal = "alacritty"; +# startup = [ +# {command = "alacritty";} +# ]; +# }; + }; + }; +} diff --git a/nixos/modules/desktop/default.nix b/nixos/modules/desktop/default.nix deleted file mode 100644 index 2defa4d..0000000 --- a/nixos/modules/desktop/default.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ - imports = [ - ./gnome - ./hyprland - ./plasma - ./sway - - ./waybar - ]; -} diff --git a/nixos/modules/desktop/gnome/default.nix b/nixos/modules/desktop/gnome/default.nix deleted file mode 100644 index 2ce218c..0000000 --- a/nixos/modules/desktop/gnome/default.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.desktop.gnome; -in { - options.sisyphus.desktop.gnome.enable = lib.mkEnableOption "GNOME"; - - config = lib.mkIf cfg.enable { - services = { - gnome = { - core-apps.enable = false; - core-developer-tools.enable = false; - core-shell.enable = true; - }; - - xserver = { - enable = true; - - excludePackages = with pkgs; [ - xterm - ]; - - displayManager.gdm.enable = true; - desktopManager.gnome.enable = true; - - videoDrivers = [ "nvidia" ]; - }; - }; - - # Start a new instance of application instead of going to that window. - environment.systemPackages = with pkgs.gnomeExtensions; [ - launch-new-instance - ]; - }; -} diff --git a/nixos/modules/desktop/hyprland/default.nix b/nixos/modules/desktop/hyprland/default.nix deleted file mode 100644 index 6d7d25b..0000000 --- a/nixos/modules/desktop/hyprland/default.nix +++ /dev/null @@ -1,62 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.desktop.hyprland; -in { - options.sisyphus.desktop.hyprland.enable = lib.mkEnableOption "Hyprland"; - - config = lib.mkIf cfg.enable { - environment = { - sessionVariables = { - # Hint Electron apps to use wayland - NIXOS_OZONE_WL = "1"; - - ASSETS_DIR = ../../../../assets; - SCRIPT_DIR = ../../../../scripts; - }; - - systemPackages = with pkgs; [ - brightnessctl - dunst - libnotify - swaybg - waycorner - playerctl - wlsunset - wl-clipboard # Copying to system clipboard in vim - wl-mirror # Mirror an output - wdisplays # Tool to configure displays - - hyprlandPlugins.hy3 # i3/sway layout plugin - - swaylock - - glib - - libva - - dmenu - jq - j4-dmenu-desktop - rofi - ]; - }; - - programs.hyprland = { - enable = true; - xwayland.enable = true; - }; - - security.polkit.enable = true; - - services = { - dbus.enable = true; - displayManager.ly.enable = true; - gnome.gnome-keyring.enable = true; - xserver.videoDrivers = [ "nvidia" ]; - }; - - sisyphus.desktop.waybar.enable = true; - }; -} - diff --git a/nixos/modules/desktop/plasma/default.nix b/nixos/modules/desktop/plasma/default.nix deleted file mode 100644 index 8bdb62c..0000000 --- a/nixos/modules/desktop/plasma/default.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ config, lib, pkgs, ... }: - -# This module is not tested at all so it might be broken! - -let - cfg = config.sisyphus.desktop.plasma; -in { - options.sisyphus.desktop.plasma.enable = lib.mkEnableOption "KDE Plasma"; - - config = lib.mkIf cfg.enable { - services = { - displayManager = { - defaultSession = "plasma"; - sddm = { - enable = true; - wayland.enable = true; - # https://discourse.nixos.org/t/plasma-wayland-session-not-available-from-sddm/13447/2 - # settings.Wayland.SessionDir = "${pkgs.plasma5Packages.plasma-workspace}/share/wayland-sessions"; - }; - }; - - desktopManager.plasma6.enable = true; - - # Use gnome keyring instead of KDE Wallet. - gnome.gnome-keyring.enable = true; - - xserver = { - enable = true; - excludePackages = with pkgs; [ - xterm - ]; - videoDrivers = [ "nvidia" ]; - }; - }; - - environment.plasma6.excludePackages = with pkgs.kdePackages; [ - elisa - gwenview - kate - khelpcenter - konsole - kwalletmanager - okular - plasma-systemmonitor - print-manager - ]; - }; -} diff --git a/nixos/modules/desktop/sway/default.nix b/nixos/modules/desktop/sway/default.nix deleted file mode 100644 index b9a8003..0000000 --- a/nixos/modules/desktop/sway/default.nix +++ /dev/null @@ -1,147 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.desktop.sway; - - # bash script to let dbus know about important env variables and - # propagate them to relevent services run at the end of sway config - # see - # https://github.com/emersion/xdg-desktop-portal-wlr/wiki/"It-doesn't-work"-Troubleshooting-Checklist - # note: this is pretty much the same as /etc/sway/config.d/nixos.conf but also restarts - # some user services to make sure they have the correct environment variables - dbus-sway-environment = pkgs.writeTextFile { - name = "dbus-sway-environment"; - destination = "/bin/dbus-sway-environment"; - executable = true; - - text = '' - dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP=sway - systemctl --user stop pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr - systemctl --user start pipewire pipewire-media-session xdg-desktop-portal xdg-desktop-portal-wlr - ''; - }; - - # currently, there is some friction between sway and gtk: - # https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland - # the suggested way to set gtk settings is with gsettings - # for gsettings to work, we need to tell it where the schemas are - # using the XDG_DATA_DIR environment variable - # run at the end of sway config - configure-gtk = pkgs.writeTextFile { - name = "configure-gtk"; - destination = "/bin/configure-gtk"; - executable = true; - text = let - schema = pkgs.gsettings-desktop-schemas; - datadir = "${schema}/share/gsettings-schemas/${schema.name}"; - in '' - export XDG_DATA_DIRS=${datadir}:$XDG_DATA_DIRS - gnome_schema=org.gnome.desktop.interface - # gsettings set $gnome_schema gtk-theme 'Dracula' - - # https://github.com/crispyricepc/sway-nvidia/blob/2101a18698151a61266740f1297158119bf660ac/wlroots-env-nvidia.sh - # Hardware cursors not yet working on wlroots - export WLR_NO_HARDWARE_CURSORS=1 - # Set wlroots renderer to Vulkan to avoid flickering - export WLR_RENDERER=vulkan - # General wayland environment variables - export XDG_SESSION_TYPE=wayland - export QT_QPA_PLATFORM=wayland - export QT_WAYLAND_DISABLE_WINDOWDECORATION=1 - # Firefox wayland environment variable - export MOZ_ENABLE_WAYLAND=1 - export MOZ_USE_XINPUT2=1 - # OpenGL Variables - export GBM_BACKEND=nvidia-drm - export __GL_GSYNC_ALLOWED=0 - export __GL_VRR_ALLOWED=0 - export __GLX_VENDOR_LIBRARY_NAME=nvidia - # Xwayland compatibility - export XWAYLAND_NO_GLAMOR=1 - ''; - }; -in { - options.sisyphus.desktop.sway.enable = lib.mkEnableOption "Sway"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = (with pkgs; [ - # Window manager related - dbus-sway-environment - configure-gtk - wayland - xdg-utils # Open with default program - glib # gsettings - wl-clipboard # Copying to system clipboard in vim - wl-mirror # Mirror an output - wdisplays # Tool to configure displays - - # Desktop Environment related - brightnessctl - dunst - libnotify - playerctl - swaybg - swaylock-effects - wlsunset - waycorner - - # TODO Turn into own module/package? - dmenu - jq - j4-dmenu-desktop - rofi - ]) ++ (with pkgs.sway-contrib; [ - grimshot - ]); - - environment.sessionVariables = { - ASSETS_DIR = ../../../../assets; - SCRIPT_DIR = ../../../../scripts; - }; - - fonts.packages = with pkgs; [ - dejavu_fonts - font-awesome - noto-fonts - noto-fonts-cjk-sans - noto-fonts-cjk-serif - noto-fonts-emoji - ]; - - hardware.graphics.enable = true; - - services = { - atd.enable = true; # Required by sunset.sh - dbus.enable = true; - displayManager.ly.enable = true; - gnome.gnome-keyring.enable = true; - power-profiles-daemon.enable = true; - xserver.videoDrivers = [ "nouveau" ]; - # xserver.videoDrivers = [ "nvidia" ]; - }; - - xdg.portal = { - enable = true; - wlr.enable = true; - extraPortals = with pkgs; [ - xdg-desktop-portal-gtk - gtk-session-lock - ]; - xdgOpenUsePortal = true; - }; - - programs.sway = { - enable = true; - package = pkgs.swayfx; - wrapperFeatures.gtk = true; - }; - - sisyphus = { - desktop.waybar.enable = true; - - users.wantedGroups = [ - config.users.groups.video.name # Brightnessctl - ]; - }; - }; -} diff --git a/nixos/modules/desktop/waybar/default.nix b/nixos/modules/desktop/waybar/default.nix deleted file mode 100644 index 273e4ce..0000000 --- a/nixos/modules/desktop/waybar/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.desktop.waybar; -in { - options.sisyphus.desktop.waybar.enable = lib.mkEnableOption "Waybar"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - libnotify - playerctl - jq - j4-dmenu-desktop - ]; - - programs.waybar.enable = true; - }; -} diff --git a/nixos/modules/hardware/default.nix b/nixos/modules/hardware/default.nix deleted file mode 100644 index 238bcea..0000000 --- a/nixos/modules/hardware/default.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ - imports = [ - ./eid - ./fingerprint-scanner - ./nvidia - ./yubikey - ]; -} diff --git a/nixos/modules/hardware/eid/default.nix b/nixos/modules/hardware/eid/default.nix deleted file mode 100644 index 5249adf..0000000 --- a/nixos/modules/hardware/eid/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.hardware.eid; -in { - options.sisyphus.hardware.eid.enable = lib.mkEnableOption "Electronic identity card (eID)"; - - config = lib.mkIf cfg.enable { - services.pcscd = { - enable = true; - plugins = [ pkgs.ccid ]; - }; - - environment.systemPackages = with pkgs; [ - eid-mw - ]; - }; -} diff --git a/nixos/modules/hardware/fingerprint-scanner/default.nix b/nixos/modules/hardware/fingerprint-scanner/default.nix deleted file mode 100644 index b7580c6..0000000 --- a/nixos/modules/hardware/fingerprint-scanner/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.hardware.fingerprint-scanner; -in { - options.sisyphus.hardware.fingerprint-scanner.enable = lib.mkEnableOption "Fingerprint scanner support"; - - config = lib.mkIf cfg.enable { - # Enable driver - services.fprintd = { - enable = true; - - # Enable Touch OEM Drivers library support - tod = { - enable = true; - # Dell drivers - driver = pkgs.libfprint-2-tod1-broadcom; - }; - }; - - # Start driver at boot - systemd.services.fprintd = { - wantedBy = [ - "multi-user.target" - ]; - serviceConfig.Type = "simple"; - }; - }; -} - diff --git a/nixos/modules/hardware/nvidia.nix b/nixos/modules/hardware/nvidia.nix new file mode 100644 index 0000000..1473758 --- /dev/null +++ b/nixos/modules/hardware/nvidia.nix @@ -0,0 +1,33 @@ +{ inputs, lib, config, pkgs, ... }: + +let + nvidia-offload = pkgs.writeShellScriptBin "nvidia-offload" '' + export __NV_PRIME_RENDER_OFFLOAD=1 + export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 + export __GLX_VENDOR_LIBRARY_NAME=nvidia + export __VK_LAYER_NV_optimus=NVIDIA_only + exec "$@" + ''; +in +{ + nixpkgs.config.allowUnfree = true; + + services.xserver.videoDrivers = [ "nvidia" ]; + + hardware = { + opengl.enable = true; + nvidia = { + open = true; + package = config.boot.kernelPackages.nvidiaPackages.stable; + modesetting.enable = true; + }; + }; + + # Offloading + # environment.systemPackages = [ nvidia-offload ]; + # hardware.nvidia.prime = { + # offload.enable = true; + # intelBusId = "PCI::00:02:0"; + # nvidiaBusId = "PCI:01:00:0"; + # }; +} diff --git a/nixos/modules/hardware/nvidia/default.nix b/nixos/modules/hardware/nvidia/default.nix deleted file mode 100644 index e98ed6d..0000000 --- a/nixos/modules/hardware/nvidia/default.nix +++ /dev/null @@ -1,90 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.hardware.nvidia; - - # The graphics cards for which to do offloading - do-offloading = builtins.elem cfg.model [ "Quadro T2000" ]; - nvidia-offload = pkgs.writeShellScriptBin "nvidia-offload" '' - export __NV_PRIME_RENDER_OFFLOAD=1 - export __NV_PRIME_RENDER_OFFLOAD_PROVIDER=NVIDIA-G0 - export __GLX_VENDOR_LIBRARY_NAME=nvidia - export __VK_LAYER_NV_optimus=NVIDIA_only - exec "$@" - ''; -in { - options.sisyphus.hardware.nvidia = { - enable = lib.mkEnableOption "NVIDIA GPU support"; - model = lib.mkOption { - type = lib.types.enum [ "" "Quadro T2000" "RTX 2060" ]; - default = ""; - example = "Quadro T2000"; - description = lib.mdDoc "The model of NVIDIA GPU card"; - }; - gui-settings = lib.mkEnableOption "NVIDIA settings menu"; - }; - - config = lib.mkIf cfg.enable { - boot = { - extraModprobeConfig = '' - options nvidia-drm modeset=1 - ''; - kernelParams = [ - "nvidia_drm.modeset=1" - ]; - }; - - hardware = { - graphics = { - enable = true; - enable32Bit = true; - extraPackages = with pkgs; [ - intel-ocl - intel-compute-runtime - opencl-clhpp - opencl-clang - opencl-headers - ocl-icd - ]; - }; - - nvidia = { - # Use the NVidia open source kernel module (or not) - open = false; - package = config.boot.kernelPackages.nvidiaPackages.stable; - # Modesetting is required. - modesetting.enable = true; - nvidiaSettings = cfg.gui-settings; - powerManagement = { - enable = do-offloading; - finegrained = do-offloading; - }; - - # Avoid flickering - forceFullCompositionPipeline = true; - - prime = lib.mkMerge [ - (lib.mkIf do-offloading { - offload = { - enable = true; - enableOffloadCmd = true; - }; - }) - (lib.mkIf (cfg.model == "Quadro T2000") { - intelBusId = "PCI::00:02:0"; - nvidiaBusId = "PCI:01:00:0"; - }) - (lib.mkIf (cfg.model == "RTX 2060") { - sync.enable = true; - intelBusId = "PCI::00:02:0"; - nvidiaBusId = "PCI:01:00:0"; - }) - ]; - }; - }; - - environment.systemPackages = lib.mkIf do-offloading [ - nvidia-offload - ]; - }; -} diff --git a/nixos/modules/hardware/yubikey/default.nix b/nixos/modules/hardware/yubikey/default.nix deleted file mode 100644 index 2134c87..0000000 --- a/nixos/modules/hardware/yubikey/default.nix +++ /dev/null @@ -1,42 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.hardware.yubikey; -in { - options.sisyphus.hardware.yubikey.enable = lib.mkEnableOption "YubiKey support"; - - config = lib.mkIf cfg.enable { - programs = { - gnupg.agent = { - enable = true; - # TODO Necessary? - # enableSSHSupport = true; - # pinentryFlavor = "curses"; - }; - - # yubikey-touch-detector.enable = true; - }; - - # Enable smart card reading - services.pcscd.enable = true; - - environment.systemPackages = with pkgs; [ - yubikey-touch-detector - ]; - - # Send a notification if the YubiKey is waiting for touch. - systemd.services.yubikey-touch-detector = { - enable = true; - description = "Detects when your YubiKey is waiting for a touch"; - path = with pkgs; [ - gnupg - yubikey-touch-detector - ]; - wantedBy = [ - "graphical-session.target" - ]; - script = ''exec yubikey-touch-detector --libnotify''; - environment.YUBIKEY_TOUCH_DETECTOR_LIBNOTIFY = "true"; - }; - }; -} diff --git a/nixos/modules/networking/default.nix b/nixos/modules/networking/default.nix deleted file mode 100644 index 5a46d2c..0000000 --- a/nixos/modules/networking/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ - imports = [ - ./networkmanager - ./openconnect-sso - ]; -} diff --git a/nixos/modules/networking/networkmanager/default.nix b/nixos/modules/networking/networkmanager/default.nix deleted file mode 100644 index 492e724..0000000 --- a/nixos/modules/networking/networkmanager/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.networking.networkmanager; -in { - options.sisyphus.networking.networkmanager.enable = lib.mkEnableOption "NetworkManager"; - - config = lib.mkIf cfg.enable { - networking.networkmanager.enable = true; - - # Prevent slow boot times - systemd.services.NetworkManager-wait-online.enable = false; - }; -} diff --git a/nixos/modules/networking/openconnect-sso/default.nix b/nixos/modules/networking/openconnect-sso/default.nix deleted file mode 100644 index db5b91d..0000000 --- a/nixos/modules/networking/openconnect-sso/default.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ config, inputs, lib, pkgs, ... }: - -let - cfg = config.sisyphus.networking.openconnect-sso; -in { - options.sisyphus.networking.openconnect-sso.enable = lib.mkEnableOption "OpenConnect SSO"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - inputs.openconnect-sso.packages.${config.nixpkgs.localSystem.system}.default - ]; - }; -} diff --git a/nixos/modules/nix/default.nix b/nixos/modules/nix/default.nix deleted file mode 100644 index 1c67c6d..0000000 --- a/nixos/modules/nix/default.nix +++ /dev/null @@ -1,6 +0,0 @@ -{ - imports = [ - ./flakes - ./gc - ]; -} diff --git a/nixos/modules/nix/flakes/default.nix b/nixos/modules/nix/flakes/default.nix deleted file mode 100644 index aeaf3c1..0000000 --- a/nixos/modules/nix/flakes/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.nix.flakes; -in { - options.sisyphus.nix.flakes.enable = lib.mkEnableOption "Nix Flakes"; - - config.nix = lib.mkIf cfg.enable { - extraOptions = '' - experimental-features = nix-command flakes - ''; - package = pkgs.nixVersions.stable; - }; -} diff --git a/nixos/modules/nix/gc/default.nix b/nixos/modules/nix/gc/default.nix deleted file mode 100644 index a28133f..0000000 --- a/nixos/modules/nix/gc/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.nix.gc; -in { - options.sisyphus.nix.gc = { - weekly.enable = lib.mkEnableOption "Scheduled Nix garbage-collection"; - onFull.enable = lib.mkEnableOption "Nix garbage-collection when disk is almost full"; - }; - - config.nix = { - # If the disk has less than 100MiB, free up to 2GiB by garbage-collecting. - extraOptions = lib.mkIf cfg.onFull.enable '' - min-free = ${toString (100 * 1024 * 1024)} - max-free = ${toString (2048 * 1024 * 1024)} - ''; - - # Scheduled garbage-collect - gc = lib.mkIf cfg.weekly.enable { - automatic = true; - dates = "weekly"; - options = "--delete-older-than 30d"; - }; - }; -} diff --git a/nixos/modules/programs/default.nix b/nixos/modules/programs/default.nix deleted file mode 100644 index fd61ea8..0000000 --- a/nixos/modules/programs/default.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ - imports = [ - ./direnv - ./home-manager - ./sops - ./spotify-adblock - ./ssh - ]; -} diff --git a/nixos/modules/programs/direnv/default.nix b/nixos/modules/programs/direnv/default.nix deleted file mode 100644 index f974886..0000000 --- a/nixos/modules/programs/direnv/default.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.programs.direnv; -in { - options.sisyphus.programs.direnv.enable = lib.mkEnableOption "direnv"; - - config = lib.mkIf cfg.enable { - programs.direnv = { - enable = true; - nix-direnv.enable = true; # Use nix-specific direnv, https://github.com/nix-community/nix-direnv - }; - - # This is also done by setting programs.direnv.persistDerivations. - # Keep derivations so shells don't break. - nix.extraOptions = '' - keep-outputs = true - keep-derivations = true - ''; - }; -} diff --git a/nixos/modules/programs/home-manager/default.nix b/nixos/modules/programs/home-manager/default.nix deleted file mode 100644 index 65e3bf6..0000000 --- a/nixos/modules/programs/home-manager/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.programs.home-manager; -in { - options.sisyphus.programs.home-manager.enable = lib.mkEnableOption "Home-manager"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - home-manager - ]; - - home-manager.useGlobalPkgs = true; - }; -} diff --git a/nixos/modules/programs/sops/README.md b/nixos/modules/programs/sops/README.md deleted file mode 100644 index 8d7b9d8..0000000 --- a/nixos/modules/programs/sops/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Adding SSH keys - -To incorporate SSH keys, for instance, to enable authentication with a Git server, follow these steps: - -Step 0: If necessary, generate a keypair, for example using the command: - -```bash -ssh-keygen -t ed25519 -``` - -Please note that setting a password for the keypair is not yet tested. - -Step 1: Create a new file named `yourservice.yaml` within the [secrets](../../../secrets/) directory by executing the following command: - -```bash -sops secrets/yourservice.yaml -``` - -Within this file, create a value that contains your private key. For example: - -```yaml -yourservice: - ssh: | - -----BEGIN OPENSSH PRIVATE KEY----- - <...> - -----END OPENSSH PRIVATE KEY----- -``` - -Step 2: Reference this value in [your sops configuration](../../utils/sops/default.nix) as follows: - -``` -sops.secrets."yourservice/ssh".format = "yaml"; -sops.secrets."yourservice/sss".sopsFile = secrets/youservice.yaml; -``` - -Step 3: Finally, add the SSH key to your SSH configuration so that it is used correctly when connecting to your host. Add the following lines to your SSH configuraton file: - -``` -Host yourservice - IdentityFile /run/secrets/yourservice/ssh -``` diff --git a/nixos/modules/programs/sops/default.nix b/nixos/modules/programs/sops/default.nix deleted file mode 100644 index c18f0fc..0000000 --- a/nixos/modules/programs/sops/default.nix +++ /dev/null @@ -1,25 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.programs.sops; -in { - options.sisyphus.programs.sops.enable = lib.mkEnableOption "Sops"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - sops - ]; - - sops = { - # Add secrets.yml to the Nix Store. - defaultSopsFile = ../../../secrets/secrets.yaml; - age = { - # Don't derive age keys from SSH keys. - sshKeyPaths = [ ]; - # Use an age key that is expected to already be in the filesystem. - # You will need to place this file manually. - keyFile = "/var/lib/sops-nix/key.txt"; - }; - }; - }; -} diff --git a/nixos/modules/programs/spotify-adblock/default.nix b/nixos/modules/programs/spotify-adblock/default.nix deleted file mode 100644 index fc80856..0000000 --- a/nixos/modules/programs/spotify-adblock/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.programs.spotify-adblock; -in { - options.sisyphus.programs.spotify-adblock.enable = lib.mkEnableOption "Spotify adblock"; - - config = lib.mkIf cfg.enable { - environment.etc."spotify-adblock/config.toml".source = "${pkgs.spotify-adblock}/config.toml"; - }; -} diff --git a/nixos/modules/programs/ssh/default.nix b/nixos/modules/programs/ssh/default.nix deleted file mode 100644 index 13b008c..0000000 --- a/nixos/modules/programs/ssh/default.nix +++ /dev/null @@ -1,13 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.programs.ssh; -in { - options.sisyphus.programs.ssh.enable = lib.mkEnableOption "SSH"; - - config = lib.mkIf cfg.enable { - programs.ssh = { - enableAskPassword = false; - }; - }; -} diff --git a/nixos/modules/services/default.nix b/nixos/modules/services/default.nix deleted file mode 100644 index 663fc70..0000000 --- a/nixos/modules/services/default.nix +++ /dev/null @@ -1,11 +0,0 @@ -{ - imports = [ - ./monero - ./openrgb - ./openssh - ./pipewire - ./printing - ./remEYEnder - ./tailscale - ]; -} diff --git a/nixos/modules/services/monero/default.nix b/nixos/modules/services/monero/default.nix deleted file mode 100644 index fc49b91..0000000 --- a/nixos/modules/services/monero/default.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.services.monero; -in { - options.sisyphus.services.monero.enable = lib.mkEnableOption "Monero"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - monero-cli - ]; - - services = { - # Choose to run a node or not. - monero.enable = true; - - xmrig = { - enable = true; - settings = { - autosave = true; - background = true; - pause-on-battery = true; - pause-on-active = 60; - donate-level = 5; - cpu = true; - opencl = false; - cuda = true; - pools = [ - { - url = "monerohash.com:9999"; - # url = "127.0.0.1:18081"; # Local node - user = "44FjmmLn1k1GC1AFTLSdWDZ17CHB2h3eRCnfkfTQBucHaKX1AGS5oLERR1FEaHxPQcUNwrbEfsgbY4Y6bYJm6ZrdCYGwg7b"; - keepalive = true; - tls = true; - } - ]; - }; - }; - }; - }; -} diff --git a/nixos/modules/services/openrgb/default.nix b/nixos/modules/services/openrgb/default.nix deleted file mode 100644 index ae4fc51..0000000 --- a/nixos/modules/services/openrgb/default.nix +++ /dev/null @@ -1,23 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.services.openrgb; -in { - options.sisyphus.services.openrgb.enable = lib.mkEnableOption "OpenRGB"; - - config = lib.mkIf cfg.enable { - services.udev.packages = with pkgs; [ - openrgb - ]; - - boot.kernelModules = [ "i2c-dev" ]; - - hardware.i2c.enable = true; - - services.hardware.openrgb = { - enable = true; - package = pkgs.openrgb-with-all-plugins; - motherboard = "intel"; - }; - }; -} diff --git a/nixos/modules/services/openssh/default.nix b/nixos/modules/services/openssh/default.nix deleted file mode 100644 index f4ba49b..0000000 --- a/nixos/modules/services/openssh/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.services.openssh; -in { - options.sisyphus.services.openssh.enable = lib.mkEnableOption "OpenSSH"; - - config = lib.mkIf cfg.enable { - services.openssh = { - enable = true; - settings = { - PasswordAuthentication = false; - PermitRootLogin = "no"; - }; - }; - }; -} diff --git a/nixos/modules/services/pipewire/default.nix b/nixos/modules/services/pipewire/default.nix deleted file mode 100644 index 68985d3..0000000 --- a/nixos/modules/services/pipewire/default.nix +++ /dev/null @@ -1,41 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.services.pipewire; -in { - options.sisyphus.services.pipewire.enable = lib.mkEnableOption "Pipewire"; - - config = lib.mkIf cfg.enable { - security.rtkit.enable = true; - services.pipewire = { - enable = true; - alsa.enable = true; - alsa.support32Bit = true; - pulse.enable = true; - # If you want to use JACK applications, uncomment this - #jack.enable = true; - - # use the example session manager (no others are packaged yet so this is enabled by default, - # no need to redefine it in your config for now) - #media-session.enable = true; - - wireplumber = { - enable = true; - # Fix pops after silence - extraConfig."99-disable-suspend" = { - "monitor.alsa.rules" = [ - { - matches = [ - # Headphone jack on laptop - { "node.name" = "alsa_output.pci-0000_00_1f.3.analog-stereo"; } - ]; - actions.update-props = { - "session.suspend-timeout-seconds" = 0; - }; - } - ]; - }; - }; - }; - }; -} diff --git a/nixos/modules/services/printing/default.nix b/nixos/modules/services/printing/default.nix deleted file mode 100644 index 9b8738a..0000000 --- a/nixos/modules/services/printing/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.services.printing; -in { - options.sisyphus.services.printing.enable = lib.mkEnableOption "Printing"; - - config = lib.mkIf cfg.enable { - services = { - printing.enable = true; - avahi = { - enable = true; - nssmdns4 = true; - openFirewall = true; - }; - }; - }; -} diff --git a/nixos/modules/services/remEYEnder/Vecteezy-License-Information.pdf b/nixos/modules/services/remEYEnder/Vecteezy-License-Information.pdf deleted file mode 100644 index bf8503e..0000000 Binary files a/nixos/modules/services/remEYEnder/Vecteezy-License-Information.pdf and /dev/null differ diff --git a/nixos/modules/services/remEYEnder/default.nix b/nixos/modules/services/remEYEnder/default.nix deleted file mode 100644 index 4d3b5cd..0000000 --- a/nixos/modules/services/remEYEnder/default.nix +++ /dev/null @@ -1,35 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.services.remEYEnder; - - icon = ./vecteezy_eyes-line-icon-vector-isolated_13932670.jpg; -in { - options.sisyphus.services.remEYEnder.enable = lib.mkEnableOption "Eye reminder"; - - config = lib.mkIf cfg.enable { - systemd.user = { - services.remEYEnder = { - enable = true; - description = "Send an eye reminder"; - serviceConfig.Type = "oneshot"; - script = '' - # Display reminder for 20 seconds. - ${pkgs.libnotify}/bin/notify-send -t 20000 --icon=${icon} "RemEYEnder" "Look away from your screen :)" - ''; - }; - timers.remEYEnder = { - enable = true; - description = "Timer for remEYEnders, runs every 20 minutes."; - wantedBy = [ - "timers.target" - ]; - timerConfig = { - OnActiveSec = "20min"; - OnUnitActiveSec = "20min"; - Unit = "remEYEnder.service"; - }; - }; - }; - }; -} diff --git a/nixos/modules/services/remEYEnder/vecteezy_eyes-line-icon-vector-isolated_13932670.eps b/nixos/modules/services/remEYEnder/vecteezy_eyes-line-icon-vector-isolated_13932670.eps deleted file mode 100644 index cc916ca..0000000 --- a/nixos/modules/services/remEYEnder/vecteezy_eyes-line-icon-vector-isolated_13932670.eps +++ /dev/null @@ -1,9936 +0,0 @@ -%!PS-Adobe-3.1 EPSF-3.0 -%ADO_DSC_Encoding: Windows Roman -%%Title: Eye vector.eps -%%Creator: Adobe Illustrator(R) 21.0 -%%For: Maman Suryaman -%%CreationDate: 11/6/2022 -%%BoundingBox: 0 0 2000 2000 -%%HiResBoundingBox: 0 0 2000 2000 -%%CropBox: 0 0 2000 2000 -%%LanguageLevel: 2 -%%DocumentData: Clean7Bit -%ADOBeginClientInjection: DocumentHeader "AI11EPS" -%%AI8_CreatorVersion: 21.0.0 %AI9_PrintingDataBegin %ADO_BuildNumber: Adobe Illustrator(R) 21.0.0 x223 R agm 4.7740 ct 5.3840 %ADO_ContainsXMP: MainFirst %AI7_Thumbnail: 128 128 8 %%BeginData: 5417 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF -%0066000066330066660066990066CC0066FF009900009933009966009999 -%0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 -%00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 -%3333663333993333CC3333FF3366003366333366663366993366CC3366FF -%3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 -%33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 -%6600666600996600CC6600FF6633006633336633666633996633CC6633FF -%6666006666336666666666996666CC6666FF669900669933669966669999 -%6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 -%66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF -%9933009933339933669933999933CC9933FF996600996633996666996699 -%9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 -%99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF -%CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 -%CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 -%CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF -%CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC -%FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 -%FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 -%FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 -%000011111111220000002200000022222222440000004400000044444444 -%550000005500000055555555770000007700000077777777880000008800 -%000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB -%DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF -%00FF0000FFFFFF0000FF00FFFFFF00FFFFFF -%524C45FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFD91FFA8A87D7D527D527D52FD047DFD6EFFA87D52 -%522727FD05F827FD05F827F82727527DA8FD65FFA87D2727F827F827F827 -%F8272727F827F827F8272727F827F827F85252A8FD5FFFA87D2727F8F8F8 -%27F827F827F8F8F827F827F827F8F8F827F827F827F827F8F8F82752A8FD -%5AFFA85227F8272727F8272727F827F82752A8A8FFFFFFA8A87D7D2727F8 -%272727F8272727F827F8527DFD56FF7D27F827F827F827F827F827F8F827 -%7DA8FD0BFF7D27F827F827F827F827F827F8F8277DA8FD51FF7D2727F827 -%F827F8FD0527F8277DFD10FF7DF8272727F8272727F8272727F8277DFD4E -%FF7D27F827F827F8F827A87D27F827F827A8FD12FFA827F8F827F8A87D27 -%F8F8F827F8F8277DFD4AFFA82727F827F827F8527DFFFF52F827F852A8FD -%15FFFD0527FFFFA85227F8272727F852A8FD46FFA87DF8F8F827F8F827A8 -%FFFFFF52F827F827A8FD17FF27F8F8F852FFFFFFA852F827F827F82752FD -%44FF7D27F8272727F852A8FD04FFA8F827F827A8FD18FFA8F827F827A8FD -%04FFA82727F827F82727A8FD41FF52F8F827F8F8277DFD06FF27F8F8F852 -%FD0DFFA8FD0CFF7DF827F852FD06FF7D27F827F827F852A8FD3DFFA8FD04 -%27F82752FD07FFA827F82727FD0CFFA82752527DA8FD0AFF27F827F8A8FD -%07FF7DF8272727F852A8FD3BFF7DF8F8F827F827A8FD08FF7DF827F87DFD -%0CFFA827F827F8277DFD09FF7DF8F8F852FD08FFA827F8F827F8277DFD39 -%FF7DF8272727F87DFD0AFF2727F827A8FD0DFF2727F827F8F852FD09FF27 -%27F852FD0AFF5227F827F82752FD36FFA852F827F8F827A8FD0AFFA827F8 -%F852FD0EFF27F827F827F8F87DFD08FF52F827F8A8FD0AFF7D27F827F8F8 -%27FD34FFA827F827F82752FD0CFFA8F827F8A8FD0EFF2727F8272727F827 -%A8FD07FF7D27F8277DFD0CFF52F8FD0427FD32FFA827F827F8F852FD0DFF -%52F8F827A8FD0DFF2727F827F827F827F87DFD07FFA8F827F87DFD0DFF7D -%F827F8F8F8A8FD2FFFA827F827F8277DFD0EFF7DF82727FD08FFA8A8FFFF -%FF5227F8272727F827272752FD07FFA827F82752FD0EFF7DF8272727F8A8 -%FD2DFF7D27F827F827A8FD0FFF52F8F827A8FD07FFFD0427F827F827F827 -%F827F827F827A8FD07FFF827F852FD0FFFA8F827F8F8F8A8FD2CFFA8F8FD -%0427FD10FF7DF82727FD08FF52F827F8272727F8272727F8FD0427FD08FF -%27F82752FD0FFFA827F827F827A8FD2DFFA8F827F827F87DFD0EFF5227F8 -%27A8FD07FF2727F827F827F827F827F827F827F852FD07FFA8F827F852FD -%0EFF7D27F827F827A8FD2FFFA8F8272727F87DFD0DFF7DF827F8A8FD07FF -%7DF8272727F8272727F8272727F8277DFD07FFA827F8277DFD0DFF5227F8 -%27F827A8FD31FFA827F8F827F852A8FD0BFF7DF8F8F87DFD07FFA827F827 -%F827F827F827F827F827F8FD08FF7DF827F87DFD0CFF27F8F827F827A8FD -%34FF2727F827F8277DFD0BFFF827F852FD08FF7D272727F8272727F82727 -%27F87DFD08FF5227F827A8FD0AFFA82727F827F852A8FD36FF52F8F827F8 -%F852FD0AFF27F82727FD09FF52F8F827F827F827F827F852FD08FFA827F8 -%2727FD0AFF7DF827F827F852FD39FF7D27F82727F827A8FD08FF5227F827 -%7DFD09FF7D27F827F827F827277DFD09FF7DF827F87DFD08FFA852F827F8 -%27F87DFD3BFFA827F827F8F8F87DA8FD06FFA8F827F827FD0AFFA87D5227 -%27527DFD0BFF27F8F827A8FD07FF52F8F827F8F827A8FD3EFF7DF8272727 -%F8277DFD06FF52F827F87DFD1AFF7D27F82752FD06FFA82727F827F82752 -%FD41FFA827F8F827F8F827A8FD04FFA8F8F827F8A8FD18FFA827F827F8A8 -%FD04FF7D52F827F827F8277DFD44FF5227F8272727F852A8FFFFFF52F8F8 -%2727FD18FF27F827F852FFFFFFA85227F827F827F87DFD47FFA852F827F8 -%27F82727A8FFFF27F8F8F827FD15FFA827F827F827FFFF7D52F8F8F827F8 -%F827A8FD4AFFA82727F8272727F8527DA8FD0527FD13FFA827F827F827A8 -%A82727F827F827F8277DFD4EFF7D27F827F827F8272727F827F8F8F87DFD -%10FF7D27F827F8272727F8F8F827F8F8277DFD52FF7D2727F827F8272727 -%F8272727F8277DFD0CFF7D2727F827F8272727F8272727F8527DFD56FF7D -%52F8F8F827F827F827F827F8F827527DA8A8FFA8FFA87D5227F8F8F827F8 -%27F827F827F827277DA8FD59FFA85252F827F8272727F8272727F8FD0727 -%F827F827F8272727F827F827277DA8FD5EFFA8A85227F827F827F827F827 -%F827F827F827F827F827F827F8F8F827277D7DFD65FFA87D7D2727F827F8 -%F8F827F827F827F827F827275252A8A8FD6CFFA8A87D7DFD07527D7DA8A8 -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFFFDFCFF -%FDFCFFFDFCFFFD90FFFF -%%EndData -%ADOEndClientInjection: DocumentHeader "AI11EPS" -%%Pages: 1 -%%DocumentNeededResources: -%%DocumentSuppliedResources: procset Adobe_AGM_Image 1.0 0 -%%+ procset Adobe_CoolType_Utility_T42 1.0 0 -%%+ procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 -%%+ procset Adobe_CoolType_Core 2.31 0 -%%+ procset Adobe_AGM_Core 2.0 0 -%%+ procset Adobe_AGM_Utils 1.0 0 -%%DocumentFonts: -%%DocumentNeededFonts: -%%DocumentNeededFeatures: -%%DocumentSuppliedFeatures: -%%DocumentCustomColors: -%%CMYKCustomColor: -%%RGBCustomColor: -%%EndComments - - - - - - - -%%BeginDefaults -%%ViewingOrientation: 1 0 0 1 -%%EndDefaults -%%BeginProlog -%%BeginResource: procset Adobe_AGM_Utils 1.0 0 -%%Version: 1.0 0 -%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. -systemdict/setpacking known -{currentpacking true setpacking}if -userdict/Adobe_AGM_Utils 75 dict dup begin put -/bdf -{bind def}bind def -/nd{null def}bdf -/xdf -{exch def}bdf -/ldf -{load def}bdf -/ddf -{put}bdf -/xddf -{3 -1 roll put}bdf -/xpt -{exch put}bdf -/ndf -{ - exch dup where{ - pop pop pop - }{ - xdf - }ifelse -}def -/cdndf -{ - exch dup currentdict exch known{ - pop pop - }{ - exch def - }ifelse -}def -/gx -{get exec}bdf -/ps_level - /languagelevel where{ - pop systemdict/languagelevel gx - }{ - 1 - }ifelse -def -/level2 - ps_level 2 ge -def -/level3 - ps_level 3 ge -def -/ps_version - {version cvr}stopped{-1}if -def -/set_gvm -{currentglobal exch setglobal}bdf -/reset_gvm -{setglobal}bdf -/makereadonlyarray -{ - /packedarray where{pop packedarray - }{ - array astore readonly}ifelse -}bdf -/map_reserved_ink_name -{ - dup type/stringtype eq{ - dup/Red eq{ - pop(_Red_) - }{ - dup/Green eq{ - pop(_Green_) - }{ - dup/Blue eq{ - pop(_Blue_) - }{ - dup()cvn eq{ - pop(Process) - }if - }ifelse - }ifelse - }ifelse - }if -}bdf -/AGMUTIL_GSTATE 22 dict def -/get_gstate -{ - AGMUTIL_GSTATE begin - /AGMUTIL_GSTATE_clr_spc currentcolorspace def - /AGMUTIL_GSTATE_clr_indx 0 def - /AGMUTIL_GSTATE_clr_comps 12 array def - mark currentcolor counttomark - {AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 3 -1 roll put - /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 add def}repeat pop - /AGMUTIL_GSTATE_fnt rootfont def - /AGMUTIL_GSTATE_lw currentlinewidth def - /AGMUTIL_GSTATE_lc currentlinecap def - /AGMUTIL_GSTATE_lj currentlinejoin def - /AGMUTIL_GSTATE_ml currentmiterlimit def - currentdash/AGMUTIL_GSTATE_do xdf/AGMUTIL_GSTATE_da xdf - /AGMUTIL_GSTATE_sa currentstrokeadjust def - /AGMUTIL_GSTATE_clr_rnd currentcolorrendering def - /AGMUTIL_GSTATE_op currentoverprint def - /AGMUTIL_GSTATE_bg currentblackgeneration cvlit def - /AGMUTIL_GSTATE_ucr currentundercolorremoval cvlit def - currentcolortransfer cvlit/AGMUTIL_GSTATE_gy_xfer xdf cvlit/AGMUTIL_GSTATE_b_xfer xdf - cvlit/AGMUTIL_GSTATE_g_xfer xdf cvlit/AGMUTIL_GSTATE_r_xfer xdf - /AGMUTIL_GSTATE_ht currenthalftone def - /AGMUTIL_GSTATE_flt currentflat def - end -}def -/set_gstate -{ - AGMUTIL_GSTATE begin - AGMUTIL_GSTATE_clr_spc setcolorspace - AGMUTIL_GSTATE_clr_indx{AGMUTIL_GSTATE_clr_comps AGMUTIL_GSTATE_clr_indx 1 sub get - /AGMUTIL_GSTATE_clr_indx AGMUTIL_GSTATE_clr_indx 1 sub def}repeat setcolor - AGMUTIL_GSTATE_fnt setfont - AGMUTIL_GSTATE_lw setlinewidth - AGMUTIL_GSTATE_lc setlinecap - AGMUTIL_GSTATE_lj setlinejoin - AGMUTIL_GSTATE_ml setmiterlimit - AGMUTIL_GSTATE_da AGMUTIL_GSTATE_do setdash - AGMUTIL_GSTATE_sa setstrokeadjust - AGMUTIL_GSTATE_clr_rnd setcolorrendering - AGMUTIL_GSTATE_op setoverprint - AGMUTIL_GSTATE_bg cvx setblackgeneration - AGMUTIL_GSTATE_ucr cvx setundercolorremoval - AGMUTIL_GSTATE_r_xfer cvx AGMUTIL_GSTATE_g_xfer cvx AGMUTIL_GSTATE_b_xfer cvx - AGMUTIL_GSTATE_gy_xfer cvx setcolortransfer - AGMUTIL_GSTATE_ht/HalftoneType get dup 9 eq exch 100 eq or - { - currenthalftone/HalftoneType get AGMUTIL_GSTATE_ht/HalftoneType get ne - { - mark AGMUTIL_GSTATE_ht{sethalftone}stopped cleartomark - }if - }{ - AGMUTIL_GSTATE_ht sethalftone - }ifelse - AGMUTIL_GSTATE_flt setflat - end -}def -/get_gstate_and_matrix -{ - AGMUTIL_GSTATE begin - /AGMUTIL_GSTATE_ctm matrix currentmatrix def - end - get_gstate -}def -/set_gstate_and_matrix -{ - set_gstate - AGMUTIL_GSTATE begin - AGMUTIL_GSTATE_ctm setmatrix - end -}def -/AGMUTIL_str256 256 string def -/AGMUTIL_src256 256 string def -/AGMUTIL_dst64 64 string def -/AGMUTIL_srcLen nd -/AGMUTIL_ndx nd -/AGMUTIL_cpd nd -/capture_cpd{ - //Adobe_AGM_Utils/AGMUTIL_cpd currentpagedevice ddf -}def -/thold_halftone -{ - level3 - {sethalftone currenthalftone} - { - dup/HalftoneType get 3 eq - { - sethalftone currenthalftone - }{ - begin - Width Height mul{ - Thresholds read{pop}if - }repeat - end - currenthalftone - }ifelse - }ifelse -}def -/rdcmntline -{ - currentfile AGMUTIL_str256 readline pop - (%)anchorsearch{pop}if -}bdf -/filter_cmyk -{ - dup type/filetype ne{ - exch()/SubFileDecode filter - }{ - exch pop - } - ifelse - [ - exch - { - AGMUTIL_src256 readstring pop - dup length/AGMUTIL_srcLen exch def - /AGMUTIL_ndx 0 def - AGMCORE_plate_ndx 4 AGMUTIL_srcLen 1 sub{ - 1 index exch get - AGMUTIL_dst64 AGMUTIL_ndx 3 -1 roll put - /AGMUTIL_ndx AGMUTIL_ndx 1 add def - }for - pop - AGMUTIL_dst64 0 AGMUTIL_ndx getinterval - } - bind - /exec cvx - ]cvx -}bdf -/filter_indexed_devn -{ - cvi Names length mul names_index add Lookup exch get -}bdf -/filter_devn -{ - 4 dict begin - /srcStr xdf - /dstStr xdf - dup type/filetype ne{ - 0()/SubFileDecode filter - }if - [ - exch - [ - /devicen_colorspace_dict/AGMCORE_gget cvx/begin cvx - currentdict/srcStr get/readstring cvx/pop cvx - /dup cvx/length cvx 0/gt cvx[ - Adobe_AGM_Utils/AGMUTIL_ndx 0/ddf cvx - names_index Names length currentdict/srcStr get length 1 sub{ - 1/index cvx/exch cvx/get cvx - currentdict/dstStr get/AGMUTIL_ndx/load cvx 3 -1/roll cvx/put cvx - Adobe_AGM_Utils/AGMUTIL_ndx/AGMUTIL_ndx/load cvx 1/add cvx/ddf cvx - }for - currentdict/dstStr get 0/AGMUTIL_ndx/load cvx/getinterval cvx - ]cvx/if cvx - /end cvx - ]cvx - bind - /exec cvx - ]cvx - end -}bdf -/AGMUTIL_imagefile nd -/read_image_file -{ - AGMUTIL_imagefile 0 setfileposition - 10 dict begin - /imageDict xdf - /imbufLen Width BitsPerComponent mul 7 add 8 idiv def - /imbufIdx 0 def - /origDataSource imageDict/DataSource get def - /origMultipleDataSources imageDict/MultipleDataSources get def - /origDecode imageDict/Decode get def - /dstDataStr imageDict/Width get colorSpaceElemCnt mul string def - imageDict/MultipleDataSources known{MultipleDataSources}{false}ifelse - { - /imbufCnt imageDict/DataSource get length def - /imbufs imbufCnt array def - 0 1 imbufCnt 1 sub{ - /imbufIdx xdf - imbufs imbufIdx imbufLen string put - imageDict/DataSource get imbufIdx[AGMUTIL_imagefile imbufs imbufIdx get/readstring cvx/pop cvx]cvx put - }for - DeviceN_PS2{ - imageDict begin - /DataSource[DataSource/devn_sep_datasource cvx]cvx def - /MultipleDataSources false def - /Decode[0 1]def - end - }if - }{ - /imbuf imbufLen string def - Indexed_DeviceN level3 not and DeviceN_NoneName or{ - /srcDataStrs[imageDict begin - currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse - { - Width Decode length 2 div mul cvi string - }repeat - end]def - imageDict begin - /DataSource[AGMUTIL_imagefile Decode BitsPerComponent false 1/filter_indexed_devn load dstDataStr srcDataStrs devn_alt_datasource/exec cvx]cvx def - /Decode[0 1]def - end - }{ - imageDict/DataSource[1 string dup 0 AGMUTIL_imagefile Decode length 2 idiv string/readstring cvx/pop cvx names_index/get cvx/put cvx]cvx put - imageDict/Decode[0 1]put - }ifelse - }ifelse - imageDict exch - load exec - imageDict/DataSource origDataSource put - imageDict/MultipleDataSources origMultipleDataSources put - imageDict/Decode origDecode put - end -}bdf -/write_image_file -{ - begin - {(AGMUTIL_imagefile)(w+)file}stopped{ - false - }{ - Adobe_AGM_Utils/AGMUTIL_imagefile xddf - 2 dict begin - /imbufLen Width BitsPerComponent mul 7 add 8 idiv def - MultipleDataSources{DataSource 0 get}{DataSource}ifelse type/filetype eq{ - /imbuf imbufLen string def - }if - 1 1 Height MultipleDataSources not{Decode length 2 idiv mul}if{ - pop - MultipleDataSources{ - 0 1 DataSource length 1 sub{ - DataSource type dup - /arraytype eq{ - pop DataSource exch gx - }{ - /filetype eq{ - DataSource exch get imbuf readstring pop - }{ - DataSource exch get - }ifelse - }ifelse - AGMUTIL_imagefile exch writestring - }for - }{ - DataSource type dup - /arraytype eq{ - pop DataSource exec - }{ - /filetype eq{ - DataSource imbuf readstring pop - }{ - DataSource - }ifelse - }ifelse - AGMUTIL_imagefile exch writestring - }ifelse - }for - end - true - }ifelse - end -}bdf -/close_image_file -{ - AGMUTIL_imagefile closefile(AGMUTIL_imagefile)deletefile -}def -statusdict/product known userdict/AGMP_current_show known not and{ - /pstr statusdict/product get def - pstr(HP LaserJet 2200)eq - pstr(HP LaserJet 4000 Series)eq or - pstr(HP LaserJet 4050 Series )eq or - pstr(HP LaserJet 8000 Series)eq or - pstr(HP LaserJet 8100 Series)eq or - pstr(HP LaserJet 8150 Series)eq or - pstr(HP LaserJet 5000 Series)eq or - pstr(HP LaserJet 5100 Series)eq or - pstr(HP Color LaserJet 4500)eq or - pstr(HP Color LaserJet 4600)eq or - pstr(HP LaserJet 5Si)eq or - pstr(HP LaserJet 1200 Series)eq or - pstr(HP LaserJet 1300 Series)eq or - pstr(HP LaserJet 4100 Series)eq or - { - userdict/AGMP_current_show/show load put - userdict/show{ - currentcolorspace 0 get - /Pattern eq - {false charpath f} - {AGMP_current_show}ifelse - }put - }if - currentdict/pstr undef -}if -/consumeimagedata -{ - begin - AGMIMG_init_common - currentdict/MultipleDataSources known not - {/MultipleDataSources false def}if - MultipleDataSources - { - DataSource 0 get type - dup/filetype eq - { - 1 dict begin - /flushbuffer Width cvi string def - 1 1 Height cvi - { - pop - 0 1 DataSource length 1 sub - { - DataSource exch get - flushbuffer readstring pop pop - }for - }for - end - }if - dup/arraytype eq exch/packedarraytype eq or DataSource 0 get xcheck and - { - Width Height mul cvi - { - 0 1 DataSource length 1 sub - {dup DataSource exch gx length exch 0 ne{pop}if}for - dup 0 eq - {pop exit}if - sub dup 0 le - {exit}if - }loop - pop - }if - } - { - /DataSource load type - dup/filetype eq - { - 1 dict begin - /flushbuffer Width Decode length 2 idiv mul cvi string def - 1 1 Height{pop DataSource flushbuffer readstring pop pop}for - end - }if - dup/arraytype eq exch/packedarraytype eq or/DataSource load xcheck and - { - Height Width BitsPerComponent mul 8 BitsPerComponent sub add 8 idiv Decode length 2 idiv mul mul - { - DataSource length dup 0 eq - {pop exit}if - sub dup 0 le - {exit}if - }loop - pop - }if - }ifelse - end -}bdf -/addprocs -{ - 2{/exec load}repeat - 3 1 roll - [5 1 roll]bind cvx -}def -/modify_halftone_xfer -{ - currenthalftone dup length dict copy begin - currentdict 2 index known{ - 1 index load dup length dict copy begin - currentdict/TransferFunction known{ - /TransferFunction load - }{ - currenttransfer - }ifelse - addprocs/TransferFunction xdf - currentdict end def - currentdict end sethalftone - }{ - currentdict/TransferFunction known{ - /TransferFunction load - }{ - currenttransfer - }ifelse - addprocs/TransferFunction xdf - currentdict end sethalftone - pop - }ifelse -}def -/clonearray -{ - dup xcheck exch - dup length array exch - Adobe_AGM_Core/AGMCORE_tmp -1 ddf - { - Adobe_AGM_Core/AGMCORE_tmp 2 copy get 1 add ddf - dup type/dicttype eq - { - Adobe_AGM_Core/AGMCORE_tmp get - exch - clonedict - Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf - }if - dup type/arraytype eq - { - Adobe_AGM_Core/AGMCORE_tmp get exch - clonearray - Adobe_AGM_Core/AGMCORE_tmp 4 -1 roll ddf - }if - exch dup - Adobe_AGM_Core/AGMCORE_tmp get 4 -1 roll put - }forall - exch{cvx}if -}bdf -/clonedict -{ - dup length dict - begin - { - dup type/dicttype eq - {clonedict}if - dup type/arraytype eq - {clonearray}if - def - }forall - currentdict - end -}bdf -/DeviceN_PS2 -{ - /currentcolorspace AGMCORE_gget 0 get/DeviceN eq level3 not and -}bdf -/Indexed_DeviceN -{ - /indexed_colorspace_dict AGMCORE_gget dup null ne{ - dup/CSDBase known{ - /CSDBase get/CSD get_res/Names known - }{ - pop false - }ifelse - }{ - pop false - }ifelse -}bdf -/DeviceN_NoneName -{ - /Names where{ - pop - false Names - { - (None)eq or - }forall - }{ - false - }ifelse -}bdf -/DeviceN_PS2_inRip_seps -{ - /AGMCORE_in_rip_sep where - { - pop dup type dup/arraytype eq exch/packedarraytype eq or - { - dup 0 get/DeviceN eq level3 not and AGMCORE_in_rip_sep and - { - /currentcolorspace exch AGMCORE_gput - false - }{ - true - }ifelse - }{ - true - }ifelse - }{ - true - }ifelse -}bdf -/base_colorspace_type -{ - dup type/arraytype eq{0 get}if -}bdf -/currentdistillerparams where{pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse -{ - /pdfmark_5{cleartomark}bind def -}{ - /pdfmark_5{pdfmark}bind def -}ifelse -/ReadBypdfmark_5 -{ - currentfile exch 0 exch/SubFileDecode filter - /currentdistillerparams where - {pop currentdistillerparams/CoreDistVersion get 5000 lt}{true}ifelse - {flushfile cleartomark} - {/PUT pdfmark}ifelse -}bdf -/ReadBypdfmark_5_string -{ - 2 dict begin - /makerString exch def string/tmpString exch def - { - currentfile tmpString readline not{pop exit}if - makerString anchorsearch - { - pop pop cleartomark exit - }{ - 3 copy/PUT pdfmark_5 pop 2 copy(\n)/PUT pdfmark_5 - }ifelse - }loop - end -}bdf -/xpdfm -{ - { - dup 0 get/Label eq - { - aload length[exch 1 add 1 roll/PAGELABEL - }{ - aload pop - [{ThisPage}<<5 -2 roll>>/PUT - }ifelse - pdfmark_5 - }forall -}bdf -/lmt{ - dup 2 index le{exch}if pop dup 2 index ge{exch}if pop -}bdf -/int{ - dup 2 index sub 3 index 5 index sub div 6 -2 roll sub mul exch pop add exch pop -}bdf -/ds{ - Adobe_AGM_Utils begin -}bdf -/dt{ - currentdict Adobe_AGM_Utils eq{ - end - }if -}bdf -systemdict/setpacking known -{setpacking}if -%%EndResource -%%BeginResource: procset Adobe_AGM_Core 2.0 0 -%%Version: 2.0 0 -%%Copyright: Copyright(C)1997-2007 Adobe Systems, Inc. All Rights Reserved. -systemdict/setpacking known -{ - currentpacking - true setpacking -}if -userdict/Adobe_AGM_Core 209 dict dup begin put -/Adobe_AGM_Core_Id/Adobe_AGM_Core_2.0_0 def -/AGMCORE_str256 256 string def -/AGMCORE_save nd -/AGMCORE_graphicsave nd -/AGMCORE_c 0 def -/AGMCORE_m 0 def -/AGMCORE_y 0 def -/AGMCORE_k 0 def -/AGMCORE_cmykbuf 4 array def -/AGMCORE_screen[currentscreen]cvx def -/AGMCORE_tmp 0 def -/AGMCORE_&setgray nd -/AGMCORE_&setcolor nd -/AGMCORE_&setcolorspace nd -/AGMCORE_&setcmykcolor nd -/AGMCORE_cyan_plate nd -/AGMCORE_magenta_plate nd -/AGMCORE_yellow_plate nd -/AGMCORE_black_plate nd -/AGMCORE_plate_ndx nd -/AGMCORE_get_ink_data nd -/AGMCORE_is_cmyk_sep nd -/AGMCORE_host_sep nd -/AGMCORE_avoid_L2_sep_space nd -/AGMCORE_distilling nd -/AGMCORE_composite_job nd -/AGMCORE_producing_seps nd -/AGMCORE_ps_level -1 def -/AGMCORE_ps_version -1 def -/AGMCORE_environ_ok nd -/AGMCORE_CSD_cache 0 dict def -/AGMCORE_currentoverprint false def -/AGMCORE_deltaX nd -/AGMCORE_deltaY nd -/AGMCORE_name nd -/AGMCORE_sep_special nd -/AGMCORE_err_strings 4 dict def -/AGMCORE_cur_err nd -/AGMCORE_current_spot_alias false def -/AGMCORE_inverting false def -/AGMCORE_feature_dictCount nd -/AGMCORE_feature_opCount nd -/AGMCORE_feature_ctm nd -/AGMCORE_ConvertToProcess false def -/AGMCORE_Default_CTM matrix def -/AGMCORE_Default_PageSize nd -/AGMCORE_Default_flatness nd -/AGMCORE_currentbg nd -/AGMCORE_currentucr nd -/AGMCORE_pattern_paint_type 0 def -/knockout_unitsq nd -currentglobal true setglobal -[/CSA/Gradient/Procedure] -{ - /Generic/Category findresource dup length dict copy/Category defineresource pop -}forall -setglobal -/AGMCORE_key_known -{ - where{ - /Adobe_AGM_Core_Id known - }{ - false - }ifelse -}ndf -/flushinput -{ - save - 2 dict begin - /CompareBuffer 3 -1 roll def - /readbuffer 256 string def - mark - { - currentfile readbuffer{readline}stopped - {cleartomark mark} - { - not - {pop exit} - if - CompareBuffer eq - {exit} - if - }ifelse - }loop - cleartomark - end - restore -}bdf -/getspotfunction -{ - AGMCORE_screen exch pop exch pop - dup type/dicttype eq{ - dup/HalftoneType get 1 eq{ - /SpotFunction get - }{ - dup/HalftoneType get 2 eq{ - /GraySpotFunction get - }{ - pop - { - abs exch abs 2 copy add 1 gt{ - 1 sub dup mul exch 1 sub dup mul add 1 sub - }{ - dup mul exch dup mul add 1 exch sub - }ifelse - }bind - }ifelse - }ifelse - }if -}def -/np -{newpath}bdf -/clp_npth -{clip np}def -/eoclp_npth -{eoclip np}def -/npth_clp -{np clip}def -/graphic_setup -{ - /AGMCORE_graphicsave save store - concat - 0 setgray - 0 setlinecap - 0 setlinejoin - 1 setlinewidth - []0 setdash - 10 setmiterlimit - np - false setoverprint - false setstrokeadjust - //Adobe_AGM_Core/spot_alias gx - /Adobe_AGM_Image where{ - pop - Adobe_AGM_Image/spot_alias 2 copy known{ - gx - }{ - pop pop - }ifelse - }if - /sep_colorspace_dict null AGMCORE_gput - 100 dict begin - /dictstackcount countdictstack def - /showpage{}def - mark -}def -/graphic_cleanup -{ - cleartomark - dictstackcount 1 countdictstack 1 sub{end}for - end - AGMCORE_graphicsave restore -}def -/compose_error_msg -{ - grestoreall initgraphics - /Helvetica findfont 10 scalefont setfont - /AGMCORE_deltaY 100 def - /AGMCORE_deltaX 310 def - clippath pathbbox np pop pop 36 add exch 36 add exch moveto - 0 AGMCORE_deltaY rlineto AGMCORE_deltaX 0 rlineto - 0 AGMCORE_deltaY neg rlineto AGMCORE_deltaX neg 0 rlineto closepath - 0 AGMCORE_&setgray - gsave 1 AGMCORE_&setgray fill grestore - 1 setlinewidth gsave stroke grestore - currentpoint AGMCORE_deltaY 15 sub add exch 8 add exch moveto - /AGMCORE_deltaY 12 def - /AGMCORE_tmp 0 def - AGMCORE_err_strings exch get - { - dup 32 eq - { - pop - AGMCORE_str256 0 AGMCORE_tmp getinterval - stringwidth pop currentpoint pop add AGMCORE_deltaX 28 add gt - { - currentpoint AGMCORE_deltaY sub exch pop - clippath pathbbox pop pop pop 44 add exch moveto - }if - AGMCORE_str256 0 AGMCORE_tmp getinterval show( )show - 0 1 AGMCORE_str256 length 1 sub - { - AGMCORE_str256 exch 0 put - }for - /AGMCORE_tmp 0 def - }{ - AGMCORE_str256 exch AGMCORE_tmp xpt - /AGMCORE_tmp AGMCORE_tmp 1 add def - }ifelse - }forall -}bdf -/AGMCORE_CMYKDeviceNColorspaces[ - [/Separation/None/DeviceCMYK{0 0 0}] - [/Separation(Black)/DeviceCMYK{0 0 0 4 -1 roll}bind] - [/Separation(Yellow)/DeviceCMYK{0 0 3 -1 roll 0}bind] - [/DeviceN[(Yellow)(Black)]/DeviceCMYK{0 0 4 2 roll}bind] - [/Separation(Magenta)/DeviceCMYK{0 exch 0 0}bind] - [/DeviceN[(Magenta)(Black)]/DeviceCMYK{0 3 1 roll 0 exch}bind] - [/DeviceN[(Magenta)(Yellow)]/DeviceCMYK{0 3 1 roll 0}bind] - [/DeviceN[(Magenta)(Yellow)(Black)]/DeviceCMYK{0 4 1 roll}bind] - [/Separation(Cyan)/DeviceCMYK{0 0 0}] - [/DeviceN[(Cyan)(Black)]/DeviceCMYK{0 0 3 -1 roll}bind] - [/DeviceN[(Cyan)(Yellow)]/DeviceCMYK{0 exch 0}bind] - [/DeviceN[(Cyan)(Yellow)(Black)]/DeviceCMYK{0 3 1 roll}bind] - [/DeviceN[(Cyan)(Magenta)]/DeviceCMYK{0 0}] - [/DeviceN[(Cyan)(Magenta)(Black)]/DeviceCMYK{0 exch}bind] - [/DeviceN[(Cyan)(Magenta)(Yellow)]/DeviceCMYK{0}] - [/DeviceCMYK] -]def -/ds{ - Adobe_AGM_Core begin - /currentdistillerparams where - { - pop currentdistillerparams/CoreDistVersion get 5000 lt - {<</DetectBlends false>>setdistillerparams}if - }if - /AGMCORE_ps_version xdf - /AGMCORE_ps_level xdf - errordict/AGM_handleerror known not{ - errordict/AGM_handleerror errordict/handleerror get put - errordict/handleerror{ - Adobe_AGM_Core begin - $error/newerror get AGMCORE_cur_err null ne and{ - $error/newerror false put - AGMCORE_cur_err compose_error_msg - }if - $error/newerror true put - end - errordict/AGM_handleerror get exec - }bind put - }if - /AGMCORE_environ_ok - ps_level AGMCORE_ps_level ge - ps_version AGMCORE_ps_version ge and - AGMCORE_ps_level -1 eq or - def - AGMCORE_environ_ok not - {/AGMCORE_cur_err/AGMCORE_bad_environ def}if - /AGMCORE_&setgray systemdict/setgray get def - level2{ - /AGMCORE_&setcolor systemdict/setcolor get def - /AGMCORE_&setcolorspace systemdict/setcolorspace get def - }if - /AGMCORE_currentbg currentblackgeneration def - /AGMCORE_currentucr currentundercolorremoval def - /AGMCORE_Default_flatness currentflat def - /AGMCORE_distilling - /product where{ - pop systemdict/setdistillerparams known product(Adobe PostScript Parser)ne and - }{ - false - }ifelse - def - /AGMCORE_GSTATE AGMCORE_key_known not{ - /AGMCORE_GSTATE 21 dict def - /AGMCORE_tmpmatrix matrix def - /AGMCORE_gstack 64 array def - /AGMCORE_gstackptr 0 def - /AGMCORE_gstacksaveptr 0 def - /AGMCORE_gstackframekeys 14 def - /AGMCORE_&gsave/gsave ldf - /AGMCORE_&grestore/grestore ldf - /AGMCORE_&grestoreall/grestoreall ldf - /AGMCORE_&save/save ldf - /AGMCORE_&setoverprint/setoverprint ldf - /AGMCORE_gdictcopy{ - begin - {def}forall - end - }def - /AGMCORE_gput{ - AGMCORE_gstack AGMCORE_gstackptr get - 3 1 roll - put - }def - /AGMCORE_gget{ - AGMCORE_gstack AGMCORE_gstackptr get - exch - get - }def - /gsave{ - AGMCORE_&gsave - AGMCORE_gstack AGMCORE_gstackptr get - AGMCORE_gstackptr 1 add - dup 64 ge{limitcheck}if - /AGMCORE_gstackptr exch store - AGMCORE_gstack AGMCORE_gstackptr get - AGMCORE_gdictcopy - }def - /grestore{ - AGMCORE_&grestore - AGMCORE_gstackptr 1 sub - dup AGMCORE_gstacksaveptr lt{1 add}if - dup AGMCORE_gstack exch get dup/AGMCORE_currentoverprint known - {/AGMCORE_currentoverprint get setoverprint}{pop}ifelse - /AGMCORE_gstackptr exch store - }def - /grestoreall{ - AGMCORE_&grestoreall - /AGMCORE_gstackptr AGMCORE_gstacksaveptr store - }def - /save{ - AGMCORE_&save - AGMCORE_gstack AGMCORE_gstackptr get - AGMCORE_gstackptr 1 add - dup 64 ge{limitcheck}if - /AGMCORE_gstackptr exch store - /AGMCORE_gstacksaveptr AGMCORE_gstackptr store - AGMCORE_gstack AGMCORE_gstackptr get - AGMCORE_gdictcopy - }def - /setoverprint{ - dup/AGMCORE_currentoverprint exch AGMCORE_gput AGMCORE_&setoverprint - }def - 0 1 AGMCORE_gstack length 1 sub{ - AGMCORE_gstack exch AGMCORE_gstackframekeys dict put - }for - }if - level3/AGMCORE_&sysshfill AGMCORE_key_known not and - { - /AGMCORE_&sysshfill systemdict/shfill get def - /AGMCORE_&sysmakepattern systemdict/makepattern get def - /AGMCORE_&usrmakepattern/makepattern load def - }if - /currentcmykcolor[0 0 0 0]AGMCORE_gput - /currentstrokeadjust false AGMCORE_gput - /currentcolorspace[/DeviceGray]AGMCORE_gput - /sep_tint 0 AGMCORE_gput - /devicen_tints[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0]AGMCORE_gput - /sep_colorspace_dict null AGMCORE_gput - /devicen_colorspace_dict null AGMCORE_gput - /indexed_colorspace_dict null AGMCORE_gput - /currentcolor_intent()AGMCORE_gput - /customcolor_tint 1 AGMCORE_gput - /absolute_colorimetric_crd null AGMCORE_gput - /relative_colorimetric_crd null AGMCORE_gput - /saturation_crd null AGMCORE_gput - /perceptual_crd null AGMCORE_gput - currentcolortransfer cvlit/AGMCore_gray_xfer xdf cvlit/AGMCore_b_xfer xdf - cvlit/AGMCore_g_xfer xdf cvlit/AGMCore_r_xfer xdf - << - /MaxPatternItem currentsystemparams/MaxPatternCache get - >> - setuserparams - end -}def -/ps -{ - /setcmykcolor where{ - pop - Adobe_AGM_Core/AGMCORE_&setcmykcolor/setcmykcolor load put - }if - Adobe_AGM_Core begin - /setcmykcolor - { - 4 copy AGMCORE_cmykbuf astore/currentcmykcolor exch AGMCORE_gput - 1 sub 4 1 roll - 3{ - 3 index add neg dup 0 lt{ - pop 0 - }if - 3 1 roll - }repeat - setrgbcolor pop - }ndf - /currentcmykcolor - { - /currentcmykcolor AGMCORE_gget aload pop - }ndf - /setoverprint - {pop}ndf - /currentoverprint - {false}ndf - /AGMCORE_cyan_plate 1 0 0 0 test_cmyk_color_plate def - /AGMCORE_magenta_plate 0 1 0 0 test_cmyk_color_plate def - /AGMCORE_yellow_plate 0 0 1 0 test_cmyk_color_plate def - /AGMCORE_black_plate 0 0 0 1 test_cmyk_color_plate def - /AGMCORE_plate_ndx - AGMCORE_cyan_plate{ - 0 - }{ - AGMCORE_magenta_plate{ - 1 - }{ - AGMCORE_yellow_plate{ - 2 - }{ - AGMCORE_black_plate{ - 3 - }{ - 4 - }ifelse - }ifelse - }ifelse - }ifelse - def - /AGMCORE_have_reported_unsupported_color_space false def - /AGMCORE_report_unsupported_color_space - { - AGMCORE_have_reported_unsupported_color_space false eq - { - (Warning: Job contains content that cannot be separated with on-host methods. This content appears on the black plate, and knocks out all other plates.)== - Adobe_AGM_Core/AGMCORE_have_reported_unsupported_color_space true ddf - }if - }def - /AGMCORE_composite_job - AGMCORE_cyan_plate AGMCORE_magenta_plate and AGMCORE_yellow_plate and AGMCORE_black_plate and def - /AGMCORE_in_rip_sep - /AGMCORE_in_rip_sep where{ - pop AGMCORE_in_rip_sep - }{ - AGMCORE_distilling - { - false - }{ - userdict/Adobe_AGM_OnHost_Seps known{ - false - }{ - level2{ - currentpagedevice/Separations 2 copy known{ - get - }{ - pop pop false - }ifelse - }{ - false - }ifelse - }ifelse - }ifelse - }ifelse - def - /AGMCORE_producing_seps AGMCORE_composite_job not AGMCORE_in_rip_sep or def - /AGMCORE_host_sep AGMCORE_producing_seps AGMCORE_in_rip_sep not and def - /AGM_preserve_spots - /AGM_preserve_spots where{ - pop AGM_preserve_spots - }{ - AGMCORE_distilling AGMCORE_producing_seps or - }ifelse - def - /AGM_is_distiller_preserving_spotimages - { - currentdistillerparams/PreserveOverprintSettings known - { - currentdistillerparams/PreserveOverprintSettings get - { - currentdistillerparams/ColorConversionStrategy known - { - currentdistillerparams/ColorConversionStrategy get - /sRGB ne - }{ - true - }ifelse - }{ - false - }ifelse - }{ - false - }ifelse - }def - /convert_spot_to_process where{pop}{ - /convert_spot_to_process - { - //Adobe_AGM_Core begin - dup map_alias{ - /Name get exch pop - }if - dup dup(None)eq exch(All)eq or - { - pop false - }{ - AGMCORE_host_sep - { - gsave - 1 0 0 0 setcmykcolor currentgray 1 exch sub - 0 1 0 0 setcmykcolor currentgray 1 exch sub - 0 0 1 0 setcmykcolor currentgray 1 exch sub - 0 0 0 1 setcmykcolor currentgray 1 exch sub - add add add 0 eq - { - pop false - }{ - false setoverprint - current_spot_alias false set_spot_alias - 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor - set_spot_alias - currentgray 1 ne - }ifelse - grestore - }{ - AGMCORE_distilling - { - pop AGM_is_distiller_preserving_spotimages not - }{ - //Adobe_AGM_Core/AGMCORE_name xddf - false - //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 0 eq - AGMUTIL_cpd/OverrideSeparations known and - { - AGMUTIL_cpd/OverrideSeparations get - { - /HqnSpots/ProcSet resourcestatus - { - pop pop pop true - }if - }if - }if - { - AGMCORE_name/HqnSpots/ProcSet findresource/TestSpot gx not - }{ - gsave - [/Separation AGMCORE_name/DeviceGray{}]AGMCORE_&setcolorspace - false - AGMUTIL_cpd/SeparationColorNames 2 copy known - { - get - {AGMCORE_name eq or}forall - not - }{ - pop pop pop true - }ifelse - grestore - }ifelse - }ifelse - }ifelse - }ifelse - end - }def - }ifelse - /convert_to_process where{pop}{ - /convert_to_process - { - dup length 0 eq - { - pop false - }{ - AGMCORE_host_sep - { - dup true exch - { - dup(Cyan)eq exch - dup(Magenta)eq 3 -1 roll or exch - dup(Yellow)eq 3 -1 roll or exch - dup(Black)eq 3 -1 roll or - {pop} - {convert_spot_to_process and}ifelse - } - forall - { - true exch - { - dup(Cyan)eq exch - dup(Magenta)eq 3 -1 roll or exch - dup(Yellow)eq 3 -1 roll or exch - (Black)eq or and - }forall - not - }{pop false}ifelse - }{ - false exch - { - /PhotoshopDuotoneList where{pop false}{true}ifelse - { - dup(Cyan)eq exch - dup(Magenta)eq 3 -1 roll or exch - dup(Yellow)eq 3 -1 roll or exch - dup(Black)eq 3 -1 roll or - {pop} - {convert_spot_to_process or}ifelse - } - { - convert_spot_to_process or - } - ifelse - } - forall - }ifelse - }ifelse - }def - }ifelse - /AGMCORE_avoid_L2_sep_space - version cvr 2012 lt - level2 and - AGMCORE_producing_seps not and - def - /AGMCORE_is_cmyk_sep - AGMCORE_cyan_plate AGMCORE_magenta_plate or AGMCORE_yellow_plate or AGMCORE_black_plate or - def - /AGM_avoid_0_cmyk where{ - pop AGM_avoid_0_cmyk - }{ - AGM_preserve_spots - userdict/Adobe_AGM_OnHost_Seps known - userdict/Adobe_AGM_InRip_Seps known or - not and - }ifelse - { - /setcmykcolor[ - { - 4 copy add add add 0 eq currentoverprint and{ - pop 0.0005 - }if - }/exec cvx - /AGMCORE_&setcmykcolor load dup type/operatortype ne{ - /exec cvx - }if - ]cvx def - }if - /AGMCORE_IsSeparationAProcessColor - { - dup(Cyan)eq exch dup(Magenta)eq exch dup(Yellow)eq exch(Black)eq or or or - }def - AGMCORE_host_sep{ - /setcolortransfer - { - AGMCORE_cyan_plate{ - pop pop pop - }{ - AGMCORE_magenta_plate{ - 4 3 roll pop pop pop - }{ - AGMCORE_yellow_plate{ - 4 2 roll pop pop pop - }{ - 4 1 roll pop pop pop - }ifelse - }ifelse - }ifelse - settransfer - } - def - /AGMCORE_get_ink_data - AGMCORE_cyan_plate{ - {pop pop pop} - }{ - AGMCORE_magenta_plate{ - {4 3 roll pop pop pop} - }{ - AGMCORE_yellow_plate{ - {4 2 roll pop pop pop} - }{ - {4 1 roll pop pop pop} - }ifelse - }ifelse - }ifelse - def - /AGMCORE_RemoveProcessColorNames - { - 1 dict begin - /filtername - { - dup/Cyan eq 1 index(Cyan)eq or - {pop(_cyan_)}if - dup/Magenta eq 1 index(Magenta)eq or - {pop(_magenta_)}if - dup/Yellow eq 1 index(Yellow)eq or - {pop(_yellow_)}if - dup/Black eq 1 index(Black)eq or - {pop(_black_)}if - }def - dup type/arraytype eq - {[exch{filtername}forall]} - {filtername}ifelse - end - }def - level3{ - /AGMCORE_IsCurrentColor - { - dup AGMCORE_IsSeparationAProcessColor - { - AGMCORE_plate_ndx 0 eq - {dup(Cyan)eq exch/Cyan eq or}if - AGMCORE_plate_ndx 1 eq - {dup(Magenta)eq exch/Magenta eq or}if - AGMCORE_plate_ndx 2 eq - {dup(Yellow)eq exch/Yellow eq or}if - AGMCORE_plate_ndx 3 eq - {dup(Black)eq exch/Black eq or}if - AGMCORE_plate_ndx 4 eq - {pop false}if - }{ - gsave - false setoverprint - current_spot_alias false set_spot_alias - 1 1 1 1 6 -1 roll findcmykcustomcolor 1 setcustomcolor - set_spot_alias - currentgray 1 ne - grestore - }ifelse - }def - /AGMCORE_filter_functiondatasource - { - 5 dict begin - /data_in xdf - data_in type/stringtype eq - { - /ncomp xdf - /comp xdf - /string_out data_in length ncomp idiv string def - 0 ncomp data_in length 1 sub - { - string_out exch dup ncomp idiv exch data_in exch ncomp getinterval comp get 255 exch sub put - }for - string_out - }{ - string/string_in xdf - /string_out 1 string def - /component xdf - [ - data_in string_in/readstring cvx - [component/get cvx 255/exch cvx/sub cvx string_out/exch cvx 0/exch cvx/put cvx string_out]cvx - [/pop cvx()]cvx/ifelse cvx - ]cvx/ReusableStreamDecode filter - }ifelse - end - }def - /AGMCORE_separateShadingFunction - { - 2 dict begin - /paint? xdf - /channel xdf - dup type/dicttype eq - { - begin - FunctionType 0 eq - { - /DataSource channel Range length 2 idiv DataSource AGMCORE_filter_functiondatasource def - currentdict/Decode known - {/Decode Decode channel 2 mul 2 getinterval def}if - paint? not - {/Decode[1 1]def}if - }if - FunctionType 2 eq - { - paint? - { - /C0[C0 channel get 1 exch sub]def - /C1[C1 channel get 1 exch sub]def - }{ - /C0[1]def - /C1[1]def - }ifelse - }if - FunctionType 3 eq - { - /Functions[Functions{channel paint? AGMCORE_separateShadingFunction}forall]def - }if - currentdict/Range known - {/Range[0 1]def}if - currentdict - end}{ - channel get 0 paint? AGMCORE_separateShadingFunction - }ifelse - end - }def - /AGMCORE_separateShading - { - 3 -1 roll begin - currentdict/Function known - { - currentdict/Background known - {[1 index{Background 3 index get 1 exch sub}{1}ifelse]/Background xdf}if - Function 3 1 roll AGMCORE_separateShadingFunction/Function xdf - /ColorSpace[/DeviceGray]def - }{ - ColorSpace dup type/arraytype eq{0 get}if/DeviceCMYK eq - { - /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def - }{ - ColorSpace dup 1 get AGMCORE_RemoveProcessColorNames 1 exch put - }ifelse - ColorSpace 0 get/Separation eq - { - { - [1/exch cvx/sub cvx]cvx - }{ - [/pop cvx 1]cvx - }ifelse - ColorSpace 3 3 -1 roll put - pop - }{ - { - [exch ColorSpace 1 get length 1 sub exch sub/index cvx 1/exch cvx/sub cvx ColorSpace 1 get length 1 add 1/roll cvx ColorSpace 1 get length{/pop cvx}repeat]cvx - }{ - pop[ColorSpace 1 get length{/pop cvx}repeat cvx 1]cvx - }ifelse - ColorSpace 3 3 -1 roll bind put - }ifelse - ColorSpace 2/DeviceGray put - }ifelse - end - }def - /AGMCORE_separateShadingDict - { - dup/ColorSpace get - dup type/arraytype ne - {[exch]}if - dup 0 get/DeviceCMYK eq - { - exch begin - currentdict - AGMCORE_cyan_plate - {0 true}if - AGMCORE_magenta_plate - {1 true}if - AGMCORE_yellow_plate - {2 true}if - AGMCORE_black_plate - {3 true}if - AGMCORE_plate_ndx 4 eq - {0 false}if - dup not currentoverprint and - {/AGMCORE_ignoreshade true def}if - AGMCORE_separateShading - currentdict - end exch - }if - dup 0 get/Separation eq - { - exch begin - ColorSpace 1 get dup/None ne exch/All ne and - { - ColorSpace 1 get AGMCORE_IsCurrentColor AGMCORE_plate_ndx 4 lt and ColorSpace 1 get AGMCORE_IsSeparationAProcessColor not and - { - ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq - { - /ColorSpace - [ - /Separation - ColorSpace 1 get - /DeviceGray - [ - ColorSpace 3 get/exec cvx - 4 AGMCORE_plate_ndx sub -1/roll cvx - 4 1/roll cvx - 3[/pop cvx]cvx/repeat cvx - 1/exch cvx/sub cvx - ]cvx - ]def - }{ - AGMCORE_report_unsupported_color_space - AGMCORE_black_plate not - { - currentdict 0 false AGMCORE_separateShading - }if - }ifelse - }{ - currentdict ColorSpace 1 get AGMCORE_IsCurrentColor - 0 exch - dup not currentoverprint and - {/AGMCORE_ignoreshade true def}if - AGMCORE_separateShading - }ifelse - }if - currentdict - end exch - }if - dup 0 get/DeviceN eq - { - exch begin - ColorSpace 1 get convert_to_process - { - ColorSpace 2 get dup type/arraytype eq{0 get}if/DeviceCMYK eq - { - /ColorSpace - [ - /DeviceN - ColorSpace 1 get - /DeviceGray - [ - ColorSpace 3 get/exec cvx - 4 AGMCORE_plate_ndx sub -1/roll cvx - 4 1/roll cvx - 3[/pop cvx]cvx/repeat cvx - 1/exch cvx/sub cvx - ]cvx - ]def - }{ - AGMCORE_report_unsupported_color_space - AGMCORE_black_plate not - { - currentdict 0 false AGMCORE_separateShading - /ColorSpace[/DeviceGray]def - }if - }ifelse - }{ - currentdict - false -1 ColorSpace 1 get - { - AGMCORE_IsCurrentColor - { - 1 add - exch pop true exch exit - }if - 1 add - }forall - exch - dup not currentoverprint and - {/AGMCORE_ignoreshade true def}if - AGMCORE_separateShading - }ifelse - currentdict - end exch - }if - dup 0 get dup/DeviceCMYK eq exch dup/Separation eq exch/DeviceN eq or or not - { - exch begin - ColorSpace dup type/arraytype eq - {0 get}if - /DeviceGray ne - { - AGMCORE_report_unsupported_color_space - AGMCORE_black_plate not - { - ColorSpace 0 get/CIEBasedA eq - { - /ColorSpace[/Separation/_ciebaseda_/DeviceGray{}]def - }if - ColorSpace 0 get dup/CIEBasedABC eq exch dup/CIEBasedDEF eq exch/DeviceRGB eq or or - { - /ColorSpace[/DeviceN[/_red_/_green_/_blue_]/DeviceRGB{}]def - }if - ColorSpace 0 get/CIEBasedDEFG eq - { - /ColorSpace[/DeviceN[/_cyan_/_magenta_/_yellow_/_black_]/DeviceCMYK{}]def - }if - currentdict 0 false AGMCORE_separateShading - }if - }if - currentdict - end exch - }if - pop - dup/AGMCORE_ignoreshade known - { - begin - /ColorSpace[/Separation(None)/DeviceGray{}]def - currentdict end - }if - }def - /shfill - { - AGMCORE_separateShadingDict - dup/AGMCORE_ignoreshade known - {pop} - {AGMCORE_&sysshfill}ifelse - }def - /makepattern - { - exch - dup/PatternType get 2 eq - { - clonedict - begin - /Shading Shading AGMCORE_separateShadingDict def - Shading/AGMCORE_ignoreshade known - currentdict end exch - {pop<</PatternType 1/PaintProc{pop}/BBox[0 0 1 1]/XStep 1/YStep 1/PaintType 1/TilingType 3>>}if - exch AGMCORE_&sysmakepattern - }{ - exch AGMCORE_&usrmakepattern - }ifelse - }def - }if - }if - AGMCORE_in_rip_sep{ - /setcustomcolor - { - exch aload pop - dup 7 1 roll inRip_spot_has_ink not { - 4{4 index mul 4 1 roll} - repeat - /DeviceCMYK setcolorspace - 6 -2 roll pop pop - }{ - //Adobe_AGM_Core begin - /AGMCORE_k xdf/AGMCORE_y xdf/AGMCORE_m xdf/AGMCORE_c xdf - end - [/Separation 4 -1 roll/DeviceCMYK - {dup AGMCORE_c mul exch dup AGMCORE_m mul exch dup AGMCORE_y mul exch AGMCORE_k mul} - ] - setcolorspace - }ifelse - setcolor - }ndf - /setseparationgray - { - [/Separation(All)/DeviceGray{}]setcolorspace_opt - 1 exch sub setcolor - }ndf - }{ - /setseparationgray - { - AGMCORE_&setgray - }ndf - }ifelse - /findcmykcustomcolor - { - 5 makereadonlyarray - }ndf - /setcustomcolor - { - exch aload pop pop - 4{4 index mul 4 1 roll}repeat - setcmykcolor pop - }ndf - /has_color - /colorimage where{ - AGMCORE_producing_seps{ - pop true - }{ - systemdict eq - }ifelse - }{ - false - }ifelse - def - /map_index - { - 1 index mul exch getinterval{255 div}forall - }bdf - /map_indexed_devn - { - Lookup Names length 3 -1 roll cvi map_index - }bdf - /n_color_components - { - base_colorspace_type - dup/DeviceGray eq{ - pop 1 - }{ - /DeviceCMYK eq{ - 4 - }{ - 3 - }ifelse - }ifelse - }bdf - level2{ - /mo/moveto ldf - /li/lineto ldf - /cv/curveto ldf - /knockout_unitsq - { - 1 setgray - 0 0 1 1 rectfill - }def - level2/setcolorspace AGMCORE_key_known not and{ - /AGMCORE_&&&setcolorspace/setcolorspace ldf - /AGMCORE_ReplaceMappedColor - { - dup type dup/arraytype eq exch/packedarraytype eq or - { - /AGMCORE_SpotAliasAry2 where{ - begin - dup 0 get dup/Separation eq - { - pop - dup length array copy - dup dup 1 get - current_spot_alias - { - dup map_alias - { - false set_spot_alias - dup 1 exch setsepcolorspace - true set_spot_alias - begin - /sep_colorspace_dict currentdict AGMCORE_gput - pop pop pop - [ - /Separation Name - CSA map_csa - MappedCSA - /sep_colorspace_proc load - ] - dup Name - end - }if - }if - map_reserved_ink_name 1 xpt - }{ - /DeviceN eq - { - dup length array copy - dup dup 1 get[ - exch{ - current_spot_alias{ - dup map_alias{ - /Name get exch pop - }if - }if - map_reserved_ink_name - }forall - ]1 xpt - }if - }ifelse - end - }if - }if - }def - /setcolorspace - { - dup type dup/arraytype eq exch/packedarraytype eq or - { - dup 0 get/Indexed eq - { - AGMCORE_distilling - { - /PhotoshopDuotoneList where - { - pop false - }{ - true - }ifelse - }{ - true - }ifelse - { - aload pop 3 -1 roll - AGMCORE_ReplaceMappedColor - 3 1 roll 4 array astore - }if - }{ - AGMCORE_ReplaceMappedColor - }ifelse - }if - DeviceN_PS2_inRip_seps{AGMCORE_&&&setcolorspace}if - }def - }if - }{ - /adj - { - currentstrokeadjust{ - transform - 0.25 sub round 0.25 add exch - 0.25 sub round 0.25 add exch - itransform - }if - }def - /mo{ - adj moveto - }def - /li{ - adj lineto - }def - /cv{ - 6 2 roll adj - 6 2 roll adj - 6 2 roll adj curveto - }def - /knockout_unitsq - { - 1 setgray - 8 8 1[8 0 0 8 0 0]{<ffffffffffffffff>}image - }def - /currentstrokeadjust{ - /currentstrokeadjust AGMCORE_gget - }def - /setstrokeadjust{ - /currentstrokeadjust exch AGMCORE_gput - }def - /setcolorspace - { - /currentcolorspace exch AGMCORE_gput - }def - /currentcolorspace - { - /currentcolorspace AGMCORE_gget - }def - /setcolor_devicecolor - { - base_colorspace_type - dup/DeviceGray eq{ - pop setgray - }{ - /DeviceCMYK eq{ - setcmykcolor - }{ - setrgbcolor - }ifelse - }ifelse - }def - /setcolor - { - currentcolorspace 0 get - dup/DeviceGray ne{ - dup/DeviceCMYK ne{ - dup/DeviceRGB ne{ - dup/Separation eq{ - pop - currentcolorspace 3 gx - currentcolorspace 2 get - }{ - dup/Indexed eq{ - pop - currentcolorspace 3 get dup type/stringtype eq{ - currentcolorspace 1 get n_color_components - 3 -1 roll map_index - }{ - exec - }ifelse - currentcolorspace 1 get - }{ - /AGMCORE_cur_err/AGMCORE_invalid_color_space def - AGMCORE_invalid_color_space - }ifelse - }ifelse - }if - }if - }if - setcolor_devicecolor - }def - }ifelse - /sop/setoverprint ldf - /lw/setlinewidth ldf - /lc/setlinecap ldf - /lj/setlinejoin ldf - /ml/setmiterlimit ldf - /dsh/setdash ldf - /sadj/setstrokeadjust ldf - /gry/setgray ldf - /rgb/setrgbcolor ldf - /cmyk[ - /currentcolorspace[/DeviceCMYK]/AGMCORE_gput cvx - /setcmykcolor load dup type/operatortype ne{/exec cvx}if - ]cvx bdf - level3 AGMCORE_host_sep not and{ - /nzopmsc{ - 6 dict begin - /kk exch def - /yy exch def - /mm exch def - /cc exch def - /sum 0 def - cc 0 ne{/sum sum 2#1000 or def cc}if - mm 0 ne{/sum sum 2#0100 or def mm}if - yy 0 ne{/sum sum 2#0010 or def yy}if - kk 0 ne{/sum sum 2#0001 or def kk}if - AGMCORE_CMYKDeviceNColorspaces sum get setcolorspace - sum 0 eq{0}if - end - setcolor - }bdf - }{ - /nzopmsc/cmyk ldf - }ifelse - /sep/setsepcolor ldf - /devn/setdevicencolor ldf - /idx/setindexedcolor ldf - /colr/setcolor ldf - /csacrd/set_csa_crd ldf - /sepcs/setsepcolorspace ldf - /devncs/setdevicencolorspace ldf - /idxcs/setindexedcolorspace ldf - /cp/closepath ldf - /clp/clp_npth ldf - /eclp/eoclp_npth ldf - /f/fill ldf - /ef/eofill ldf - /@/stroke ldf - /nclp/npth_clp ldf - /gset/graphic_setup ldf - /gcln/graphic_cleanup ldf - /ct/concat ldf - /cf/currentfile ldf - /fl/filter ldf - /rs/readstring ldf - /AGMCORE_def_ht currenthalftone def - /clonedict Adobe_AGM_Utils begin/clonedict load end def - /clonearray Adobe_AGM_Utils begin/clonearray load end def - currentdict{ - dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ - bind - }if - def - }forall - /getrampcolor - { - /indx exch def - 0 1 NumComp 1 sub - { - dup - Samples exch get - dup type/stringtype eq{indx get}if - exch - Scaling exch get aload pop - 3 1 roll - mul add - }for - ColorSpaceFamily/Separation eq - {sep} - { - ColorSpaceFamily/DeviceN eq - {devn}{setcolor}ifelse - }ifelse - }bdf - /sssetbackground{ - aload pop - ColorSpaceFamily/Separation eq - {sep} - { - ColorSpaceFamily/DeviceN eq - {devn}{setcolor}ifelse - }ifelse - }bdf - /RadialShade - { - 40 dict begin - /ColorSpaceFamily xdf - /background xdf - /ext1 xdf - /ext0 xdf - /BBox xdf - /r2 xdf - /c2y xdf - /c2x xdf - /r1 xdf - /c1y xdf - /c1x xdf - /rampdict xdf - /setinkoverprint where{pop/setinkoverprint{pop}def}if - gsave - BBox length 0 gt - { - np - BBox 0 get BBox 1 get moveto - BBox 2 get BBox 0 get sub 0 rlineto - 0 BBox 3 get BBox 1 get sub rlineto - BBox 2 get BBox 0 get sub neg 0 rlineto - closepath - clip - np - }if - c1x c2x eq - { - c1y c2y lt{/theta 90 def}{/theta 270 def}ifelse - }{ - /slope c2y c1y sub c2x c1x sub div def - /theta slope 1 atan def - c2x c1x lt c2y c1y ge and{/theta theta 180 sub def}if - c2x c1x lt c2y c1y lt and{/theta theta 180 add def}if - }ifelse - gsave - clippath - c1x c1y translate - theta rotate - -90 rotate - {pathbbox}stopped - {0 0 0 0}if - /yMax xdf - /xMax xdf - /yMin xdf - /xMin xdf - grestore - xMax xMin eq yMax yMin eq or - { - grestore - end - }{ - /max{2 copy gt{pop}{exch pop}ifelse}bdf - /min{2 copy lt{pop}{exch pop}ifelse}bdf - rampdict begin - 40 dict begin - background length 0 gt{background sssetbackground gsave clippath fill grestore}if - gsave - c1x c1y translate - theta rotate - -90 rotate - /c2y c1x c2x sub dup mul c1y c2y sub dup mul add sqrt def - /c1y 0 def - /c1x 0 def - /c2x 0 def - ext0 - { - 0 getrampcolor - c2y r2 add r1 sub 0.0001 lt - { - c1x c1y r1 360 0 arcn - pathbbox - /aymax exch def - /axmax exch def - /aymin exch def - /axmin exch def - /bxMin xMin axmin min def - /byMin yMin aymin min def - /bxMax xMax axmax max def - /byMax yMax aymax max def - bxMin byMin moveto - bxMax byMin lineto - bxMax byMax lineto - bxMin byMax lineto - bxMin byMin lineto - eofill - }{ - c2y r1 add r2 le - { - c1x c1y r1 0 360 arc - fill - } - { - c2x c2y r2 0 360 arc fill - r1 r2 eq - { - /p1x r1 neg def - /p1y c1y def - /p2x r1 def - /p2y c1y def - p1x p1y moveto p2x p2y lineto p2x yMin lineto p1x yMin lineto - fill - }{ - /AA r2 r1 sub c2y div def - AA -1 eq - {/theta 89.99 def} - {/theta AA 1 AA dup mul sub sqrt div 1 atan def} - ifelse - /SS1 90 theta add dup sin exch cos div def - /p1x r1 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def - /p1y p1x SS1 div neg def - /SS2 90 theta sub dup sin exch cos div def - /p2x r1 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def - /p2y p2x SS2 div neg def - r1 r2 gt - { - /L1maxX p1x yMin p1y sub SS1 div add def - /L2maxX p2x yMin p2y sub SS2 div add def - }{ - /L1maxX 0 def - /L2maxX 0 def - }ifelse - p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto - L1maxX L1maxX p1x sub SS1 mul p1y add lineto - fill - }ifelse - }ifelse - }ifelse - }if - c1x c2x sub dup mul - c1y c2y sub dup mul - add 0.5 exp - 0 dtransform - dup mul exch dup mul add 0.5 exp 72 div - 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt - 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt - 1 index 1 index lt{exch}if pop - /hires xdf - hires mul - /numpix xdf - /numsteps NumSamples def - /rampIndxInc 1 def - /subsampling false def - numpix 0 ne - { - NumSamples numpix div 0.5 gt - { - /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def - /rampIndxInc NumSamples 1 sub numsteps div def - /subsampling true def - }if - }if - /xInc c2x c1x sub numsteps div def - /yInc c2y c1y sub numsteps div def - /rInc r2 r1 sub numsteps div def - /cx c1x def - /cy c1y def - /radius r1 def - np - xInc 0 eq yInc 0 eq rInc 0 eq and and - { - 0 getrampcolor - cx cy radius 0 360 arc - stroke - NumSamples 1 sub getrampcolor - cx cy radius 72 hires div add 0 360 arc - 0 setlinewidth - stroke - }{ - 0 - numsteps - { - dup - subsampling{round cvi}if - getrampcolor - cx cy radius 0 360 arc - /cx cx xInc add def - /cy cy yInc add def - /radius radius rInc add def - cx cy radius 360 0 arcn - eofill - rampIndxInc add - }repeat - pop - }ifelse - ext1 - { - c2y r2 add r1 lt - { - c2x c2y r2 0 360 arc - fill - }{ - c2y r1 add r2 sub 0.0001 le - { - c2x c2y r2 360 0 arcn - pathbbox - /aymax exch def - /axmax exch def - /aymin exch def - /axmin exch def - /bxMin xMin axmin min def - /byMin yMin aymin min def - /bxMax xMax axmax max def - /byMax yMax aymax max def - bxMin byMin moveto - bxMax byMin lineto - bxMax byMax lineto - bxMin byMax lineto - bxMin byMin lineto - eofill - }{ - c2x c2y r2 0 360 arc fill - r1 r2 eq - { - /p1x r2 neg def - /p1y c2y def - /p2x r2 def - /p2y c2y def - p1x p1y moveto p2x p2y lineto p2x yMax lineto p1x yMax lineto - fill - }{ - /AA r2 r1 sub c2y div def - AA -1 eq - {/theta 89.99 def} - {/theta AA 1 AA dup mul sub sqrt div 1 atan def} - ifelse - /SS1 90 theta add dup sin exch cos div def - /p1x r2 SS1 SS1 mul SS1 SS1 mul 1 add div sqrt mul neg def - /p1y c2y p1x SS1 div sub def - /SS2 90 theta sub dup sin exch cos div def - /p2x r2 SS2 SS2 mul SS2 SS2 mul 1 add div sqrt mul def - /p2y c2y p2x SS2 div sub def - r1 r2 lt - { - /L1maxX p1x yMax p1y sub SS1 div add def - /L2maxX p2x yMax p2y sub SS2 div add def - }{ - /L1maxX 0 def - /L2maxX 0 def - }ifelse - p1x p1y moveto p2x p2y lineto L2maxX L2maxX p2x sub SS2 mul p2y add lineto - L1maxX L1maxX p1x sub SS1 mul p1y add lineto - fill - }ifelse - }ifelse - }ifelse - }if - grestore - grestore - end - end - end - }ifelse - }bdf - /GenStrips - { - 40 dict begin - /ColorSpaceFamily xdf - /background xdf - /ext1 xdf - /ext0 xdf - /BBox xdf - /y2 xdf - /x2 xdf - /y1 xdf - /x1 xdf - /rampdict xdf - /setinkoverprint where{pop/setinkoverprint{pop}def}if - gsave - BBox length 0 gt - { - np - BBox 0 get BBox 1 get moveto - BBox 2 get BBox 0 get sub 0 rlineto - 0 BBox 3 get BBox 1 get sub rlineto - BBox 2 get BBox 0 get sub neg 0 rlineto - closepath - clip - np - }if - x1 x2 eq - { - y1 y2 lt{/theta 90 def}{/theta 270 def}ifelse - }{ - /slope y2 y1 sub x2 x1 sub div def - /theta slope 1 atan def - x2 x1 lt y2 y1 ge and{/theta theta 180 sub def}if - x2 x1 lt y2 y1 lt and{/theta theta 180 add def}if - } - ifelse - gsave - clippath - x1 y1 translate - theta rotate - {pathbbox}stopped - {0 0 0 0}if - /yMax exch def - /xMax exch def - /yMin exch def - /xMin exch def - grestore - xMax xMin eq yMax yMin eq or - { - grestore - end - }{ - rampdict begin - 20 dict begin - background length 0 gt{background sssetbackground gsave clippath fill grestore}if - gsave - x1 y1 translate - theta rotate - /xStart 0 def - /xEnd x2 x1 sub dup mul y2 y1 sub dup mul add 0.5 exp def - /ySpan yMax yMin sub def - /numsteps NumSamples def - /rampIndxInc 1 def - /subsampling false def - xStart 0 transform - xEnd 0 transform - 3 -1 roll - sub dup mul - 3 1 roll - sub dup mul - add 0.5 exp 72 div - 0 72 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt - 72 0 matrix defaultmatrix dtransform dup mul exch dup mul add sqrt - 1 index 1 index lt{exch}if pop - mul - /numpix xdf - numpix 0 ne - { - NumSamples numpix div 0.5 gt - { - /numsteps numpix 2 div round cvi dup 1 le{pop 2}if def - /rampIndxInc NumSamples 1 sub numsteps div def - /subsampling true def - }if - }if - ext0 - { - 0 getrampcolor - xMin xStart lt - { - xMin yMin xMin neg ySpan rectfill - }if - }if - /xInc xEnd xStart sub numsteps div def - /x xStart def - 0 - numsteps - { - dup - subsampling{round cvi}if - getrampcolor - x yMin xInc ySpan rectfill - /x x xInc add def - rampIndxInc add - }repeat - pop - ext1{ - xMax xEnd gt - { - xEnd yMin xMax xEnd sub ySpan rectfill - }if - }if - grestore - grestore - end - end - end - }ifelse - }bdf -}def -/pt -{ - end -}def -/dt{ -}def -/pgsv{ - //Adobe_AGM_Core/AGMCORE_save save put -}def -/pgrs{ - //Adobe_AGM_Core/AGMCORE_save get restore -}def -systemdict/findcolorrendering known{ - /findcolorrendering systemdict/findcolorrendering get def -}if -systemdict/setcolorrendering known{ - /setcolorrendering systemdict/setcolorrendering get def -}if -/test_cmyk_color_plate -{ - gsave - setcmykcolor currentgray 1 ne - grestore -}def -/inRip_spot_has_ink -{ - dup//Adobe_AGM_Core/AGMCORE_name xddf - convert_spot_to_process not -}def -/map255_to_range -{ - 1 index sub - 3 -1 roll 255 div mul add -}def -/set_csa_crd -{ - /sep_colorspace_dict null AGMCORE_gput - begin - CSA get_csa_by_name setcolorspace_opt - set_crd - end -} -def -/map_csa -{ - currentdict/MappedCSA known{MappedCSA null ne}{false}ifelse - {pop}{get_csa_by_name/MappedCSA xdf}ifelse -}def -/setsepcolor -{ - /sep_colorspace_dict AGMCORE_gget begin - dup/sep_tint exch AGMCORE_gput - TintProc - end -}def -/setdevicencolor -{ - /devicen_colorspace_dict AGMCORE_gget begin - Names length copy - Names length 1 sub -1 0 - { - /devicen_tints AGMCORE_gget 3 1 roll xpt - }for - TintProc - end -}def -/sep_colorspace_proc -{ - /AGMCORE_tmp exch store - /sep_colorspace_dict AGMCORE_gget begin - currentdict/Components known{ - Components aload pop - TintMethod/Lab eq{ - 2{AGMCORE_tmp mul NComponents 1 roll}repeat - LMax sub AGMCORE_tmp mul LMax add NComponents 1 roll - }{ - TintMethod/Subtractive eq{ - NComponents{ - AGMCORE_tmp mul NComponents 1 roll - }repeat - }{ - NComponents{ - 1 sub AGMCORE_tmp mul 1 add NComponents 1 roll - }repeat - }ifelse - }ifelse - }{ - ColorLookup AGMCORE_tmp ColorLookup length 1 sub mul round cvi get - aload pop - }ifelse - end -}def -/sep_colorspace_gray_proc -{ - /AGMCORE_tmp exch store - /sep_colorspace_dict AGMCORE_gget begin - GrayLookup AGMCORE_tmp GrayLookup length 1 sub mul round cvi get - end -}def -/sep_proc_name -{ - dup 0 get - dup/DeviceRGB eq exch/DeviceCMYK eq or level2 not and has_color not and{ - pop[/DeviceGray] - /sep_colorspace_gray_proc - }{ - /sep_colorspace_proc - }ifelse -}def -/setsepcolorspace -{ - current_spot_alias{ - dup begin - Name map_alias{ - exch pop - }if - end - }if - dup/sep_colorspace_dict exch AGMCORE_gput - begin - CSA map_csa - /AGMCORE_sep_special Name dup()eq exch(All)eq or store - AGMCORE_avoid_L2_sep_space{ - [/Indexed MappedCSA sep_proc_name 255 exch - {255 div}/exec cvx 3 -1 roll[4 1 roll load/exec cvx]cvx - ]setcolorspace_opt - /TintProc{ - 255 mul round cvi setcolor - }bdf - }{ - MappedCSA 0 get/DeviceCMYK eq - currentdict/Components known and - AGMCORE_sep_special not and{ - /TintProc[ - Components aload pop Name findcmykcustomcolor - /exch cvx/setcustomcolor cvx - ]cvx bdf - }{ - AGMCORE_host_sep Name(All)eq and{ - /TintProc{ - 1 exch sub setseparationgray - }bdf - }{ - AGMCORE_in_rip_sep MappedCSA 0 get/DeviceCMYK eq and - AGMCORE_host_sep or - Name()eq and{ - /TintProc[ - MappedCSA sep_proc_name exch 0 get/DeviceCMYK eq{ - cvx/setcmykcolor cvx - }{ - cvx/setgray cvx - }ifelse - ]cvx bdf - }{ - AGMCORE_producing_seps MappedCSA 0 get dup/DeviceCMYK eq exch/DeviceGray eq or and AGMCORE_sep_special not and{ - /TintProc[ - /dup cvx - MappedCSA sep_proc_name cvx exch - 0 get/DeviceGray eq{ - 1/exch cvx/sub cvx 0 0 0 4 -1/roll cvx - }if - /Name cvx/findcmykcustomcolor cvx/exch cvx - AGMCORE_host_sep{ - AGMCORE_is_cmyk_sep - /Name cvx - /AGMCORE_IsSeparationAProcessColor load/exec cvx - /not cvx/and cvx - }{ - Name inRip_spot_has_ink not - }ifelse - [ - /pop cvx 1 - ]cvx/if cvx - /setcustomcolor cvx - ]cvx bdf - }{ - /TintProc{setcolor}bdf - [/Separation Name MappedCSA sep_proc_name load]setcolorspace_opt - }ifelse - }ifelse - }ifelse - }ifelse - }ifelse - set_crd - setsepcolor - end -}def -/additive_blend -{ - 3 dict begin - /numarrays xdf - /numcolors xdf - 0 1 numcolors 1 sub - { - /c1 xdf - 1 - 0 1 numarrays 1 sub - { - 1 exch add/index cvx - c1/get cvx/mul cvx - }for - numarrays 1 add 1/roll cvx - }for - numarrays[/pop cvx]cvx/repeat cvx - end -}def -/subtractive_blend -{ - 3 dict begin - /numarrays xdf - /numcolors xdf - 0 1 numcolors 1 sub - { - /c1 xdf - 1 1 - 0 1 numarrays 1 sub - { - 1 3 3 -1 roll add/index cvx - c1/get cvx/sub cvx/mul cvx - }for - /sub cvx - numarrays 1 add 1/roll cvx - }for - numarrays[/pop cvx]cvx/repeat cvx - end -}def -/exec_tint_transform -{ - /TintProc[ - /TintTransform cvx/setcolor cvx - ]cvx bdf - MappedCSA setcolorspace_opt -}bdf -/devn_makecustomcolor -{ - 2 dict begin - /names_index xdf - /Names xdf - 1 1 1 1 Names names_index get findcmykcustomcolor - /devicen_tints AGMCORE_gget names_index get setcustomcolor - Names length{pop}repeat - end -}bdf -/setdevicencolorspace -{ - dup/AliasedColorants known{false}{true}ifelse - current_spot_alias and{ - 7 dict begin - /names_index 0 def - dup/names_len exch/Names get length def - /new_names names_len array def - /new_LookupTables names_len array def - /alias_cnt 0 def - dup/Names get - { - dup map_alias{ - exch pop - dup/ColorLookup known{ - dup begin - new_LookupTables names_index ColorLookup put - end - }{ - dup/Components known{ - dup begin - new_LookupTables names_index Components put - end - }{ - dup begin - new_LookupTables names_index[null null null null]put - end - }ifelse - }ifelse - new_names names_index 3 -1 roll/Name get put - /alias_cnt alias_cnt 1 add def - }{ - /name xdf - new_names names_index name put - dup/LookupTables known{ - dup begin - new_LookupTables names_index LookupTables names_index get put - end - }{ - dup begin - new_LookupTables names_index[null null null null]put - end - }ifelse - }ifelse - /names_index names_index 1 add def - }forall - alias_cnt 0 gt{ - /AliasedColorants true def - /lut_entry_len new_LookupTables 0 get dup length 256 ge{0 get length}{length}ifelse def - 0 1 names_len 1 sub{ - /names_index xdf - new_LookupTables names_index get dup length 256 ge{0 get length}{length}ifelse lut_entry_len ne{ - /AliasedColorants false def - exit - }{ - new_LookupTables names_index get 0 get null eq{ - dup/Names get names_index get/name xdf - name(Cyan)eq name(Magenta)eq name(Yellow)eq name(Black)eq - or or or not{ - /AliasedColorants false def - exit - }if - }if - }ifelse - }for - lut_entry_len 1 eq{ - /AliasedColorants false def - }if - AliasedColorants{ - dup begin - /Names new_names def - /LookupTables new_LookupTables def - /AliasedColorants true def - /NComponents lut_entry_len def - /TintMethod NComponents 4 eq{/Subtractive}{/Additive}ifelse def - /MappedCSA TintMethod/Additive eq{/DeviceRGB}{/DeviceCMYK}ifelse def - currentdict/TTTablesIdx known not{ - /TTTablesIdx -1 def - }if - end - }if - }if - end - }if - dup/devicen_colorspace_dict exch AGMCORE_gput - begin - currentdict/AliasedColorants known{ - AliasedColorants - }{ - false - }ifelse - dup not{ - CSA map_csa - }if - /TintTransform load type/nulltype eq or{ - /TintTransform[ - 0 1 Names length 1 sub - { - /TTTablesIdx TTTablesIdx 1 add def - dup LookupTables exch get dup 0 get null eq - { - 1 index - Names exch get - dup(Cyan)eq - { - pop exch - LookupTables length exch sub - /index cvx - 0 0 0 - } - { - dup(Magenta)eq - { - pop exch - LookupTables length exch sub - /index cvx - 0/exch cvx 0 0 - }{ - (Yellow)eq - { - exch - LookupTables length exch sub - /index cvx - 0 0 3 -1/roll cvx 0 - }{ - exch - LookupTables length exch sub - /index cvx - 0 0 0 4 -1/roll cvx - }ifelse - }ifelse - }ifelse - 5 -1/roll cvx/astore cvx - }{ - dup length 1 sub - LookupTables length 4 -1 roll sub 1 add - /index cvx/mul cvx/round cvx/cvi cvx/get cvx - }ifelse - Names length TTTablesIdx add 1 add 1/roll cvx - }for - Names length[/pop cvx]cvx/repeat cvx - NComponents Names length - TintMethod/Subtractive eq - { - subtractive_blend - }{ - additive_blend - }ifelse - ]cvx bdf - }if - AGMCORE_host_sep{ - Names convert_to_process{ - exec_tint_transform - } - { - currentdict/AliasedColorants known{ - AliasedColorants not - }{ - false - }ifelse - 5 dict begin - /AvoidAliasedColorants xdf - /painted? false def - /names_index 0 def - /names_len Names length def - AvoidAliasedColorants{ - /currentspotalias current_spot_alias def - false set_spot_alias - }if - Names{ - AGMCORE_is_cmyk_sep{ - dup(Cyan)eq AGMCORE_cyan_plate and exch - dup(Magenta)eq AGMCORE_magenta_plate and exch - dup(Yellow)eq AGMCORE_yellow_plate and exch - (Black)eq AGMCORE_black_plate and or or or{ - /devicen_colorspace_dict AGMCORE_gget/TintProc[ - Names names_index/devn_makecustomcolor cvx - ]cvx ddf - /painted? true def - }if - painted?{exit}if - }{ - 0 0 0 0 5 -1 roll findcmykcustomcolor 1 setcustomcolor currentgray 0 eq{ - /devicen_colorspace_dict AGMCORE_gget/TintProc[ - Names names_index/devn_makecustomcolor cvx - ]cvx ddf - /painted? true def - exit - }if - }ifelse - /names_index names_index 1 add def - }forall - AvoidAliasedColorants{ - currentspotalias set_spot_alias - }if - painted?{ - /devicen_colorspace_dict AGMCORE_gget/names_index names_index put - }{ - /devicen_colorspace_dict AGMCORE_gget/TintProc[ - names_len[/pop cvx]cvx/repeat cvx 1/setseparationgray cvx - 0 0 0 0/setcmykcolor cvx - ]cvx ddf - }ifelse - end - }ifelse - } - { - AGMCORE_in_rip_sep{ - Names convert_to_process not - }{ - level3 - }ifelse - { - [/DeviceN Names MappedCSA/TintTransform load]setcolorspace_opt - /TintProc level3 not AGMCORE_in_rip_sep and{ - [ - Names/length cvx[/pop cvx]cvx/repeat cvx - ]cvx bdf - }{ - {setcolor}bdf - }ifelse - }{ - exec_tint_transform - }ifelse - }ifelse - set_crd - /AliasedColorants false def - end -}def -/setindexedcolorspace -{ - dup/indexed_colorspace_dict exch AGMCORE_gput - begin - currentdict/CSDBase known{ - CSDBase/CSD get_res begin - currentdict/Names known{ - currentdict devncs - }{ - 1 currentdict sepcs - }ifelse - AGMCORE_host_sep{ - 4 dict begin - /compCnt/Names where{pop Names length}{1}ifelse def - /NewLookup HiVal 1 add string def - 0 1 HiVal{ - /tableIndex xdf - Lookup dup type/stringtype eq{ - compCnt tableIndex map_index - }{ - exec - }ifelse - /Names where{ - pop setdevicencolor - }{ - setsepcolor - }ifelse - currentgray - tableIndex exch - 255 mul cvi - NewLookup 3 1 roll put - }for - [/Indexed currentcolorspace HiVal NewLookup]setcolorspace_opt - end - }{ - level3 - { - currentdict/Names known{ - [/Indexed[/DeviceN Names MappedCSA/TintTransform load]HiVal Lookup]setcolorspace_opt - }{ - [/Indexed[/Separation Name MappedCSA sep_proc_name load]HiVal Lookup]setcolorspace_opt - }ifelse - }{ - [/Indexed MappedCSA HiVal - [ - currentdict/Names known{ - Lookup dup type/stringtype eq - {/exch cvx CSDBase/CSD get_res/Names get length dup/mul cvx exch/getinterval cvx{255 div}/forall cvx} - {/exec cvx}ifelse - /TintTransform load/exec cvx - }{ - Lookup dup type/stringtype eq - {/exch cvx/get cvx 255/div cvx} - {/exec cvx}ifelse - CSDBase/CSD get_res/MappedCSA get sep_proc_name exch pop/load cvx/exec cvx - }ifelse - ]cvx - ]setcolorspace_opt - }ifelse - }ifelse - end - set_crd - } - { - CSA map_csa - AGMCORE_host_sep level2 not and{ - 0 0 0 0 setcmykcolor - }{ - [/Indexed MappedCSA - level2 not has_color not and{ - dup 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or{ - pop[/DeviceGray] - }if - HiVal GrayLookup - }{ - HiVal - currentdict/RangeArray known{ - { - /indexed_colorspace_dict AGMCORE_gget begin - Lookup exch - dup HiVal gt{ - pop HiVal - }if - NComponents mul NComponents getinterval{}forall - NComponents 1 sub -1 0{ - RangeArray exch 2 mul 2 getinterval aload pop map255_to_range - NComponents 1 roll - }for - end - }bind - }{ - Lookup - }ifelse - }ifelse - ]setcolorspace_opt - set_crd - }ifelse - }ifelse - end -}def -/setindexedcolor -{ - AGMCORE_host_sep{ - /indexed_colorspace_dict AGMCORE_gget - begin - currentdict/CSDBase known{ - CSDBase/CSD get_res begin - currentdict/Names known{ - map_indexed_devn - devn - } - { - Lookup 1 3 -1 roll map_index - sep - }ifelse - end - }{ - Lookup MappedCSA/DeviceCMYK eq{4}{1}ifelse 3 -1 roll - map_index - MappedCSA/DeviceCMYK eq{setcmykcolor}{setgray}ifelse - }ifelse - end - }{ - level3 not AGMCORE_in_rip_sep and/indexed_colorspace_dict AGMCORE_gget/CSDBase known and{ - /indexed_colorspace_dict AGMCORE_gget/CSDBase get/CSD get_res begin - map_indexed_devn - devn - end - } - { - setcolor - }ifelse - }ifelse -}def -/ignoreimagedata -{ - currentoverprint not{ - gsave - dup clonedict begin - 1 setgray - /Decode[0 1]def - /DataSource<FF>def - /MultipleDataSources false def - /BitsPerComponent 8 def - currentdict end - systemdict/image gx - grestore - }if - consumeimagedata -}def -/add_res -{ - dup/CSD eq{ - pop - //Adobe_AGM_Core begin - /AGMCORE_CSD_cache load 3 1 roll put - end - }{ - defineresource pop - }ifelse -}def -/del_res -{ - { - aload pop exch - dup/CSD eq{ - pop - {//Adobe_AGM_Core/AGMCORE_CSD_cache get exch undef}forall - }{ - exch - {1 index undefineresource}forall - pop - }ifelse - }forall -}def -/get_res -{ - dup/CSD eq{ - pop - dup type dup/nametype eq exch/stringtype eq or{ - AGMCORE_CSD_cache exch get - }if - }{ - findresource - }ifelse -}def -/get_csa_by_name -{ - dup type dup/nametype eq exch/stringtype eq or{ - /CSA get_res - }if -}def -/paintproc_buf_init -{ - /count get 0 0 put -}def -/paintproc_buf_next -{ - dup/count get dup 0 get - dup 3 1 roll - 1 add 0 xpt - get -}def -/cachepaintproc_compress -{ - 5 dict begin - currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def - /ppdict 20 dict def - /string_size 16000 def - /readbuffer string_size string def - currentglobal true setglobal - ppdict 1 array dup 0 1 put/count xpt - setglobal - /LZWFilter - { - exch - dup length 0 eq{ - pop - }{ - ppdict dup length 1 sub 3 -1 roll put - }ifelse - {string_size}{0}ifelse string - }/LZWEncode filter def - { - ReadFilter readbuffer readstring - exch LZWFilter exch writestring - not{exit}if - }loop - LZWFilter closefile - ppdict - end -}def -/cachepaintproc -{ - 2 dict begin - currentfile exch 0 exch/SubFileDecode filter/ReadFilter exch def - /ppdict 20 dict def - currentglobal true setglobal - ppdict 1 array dup 0 1 put/count xpt - setglobal - { - ReadFilter 16000 string readstring exch - ppdict dup length 1 sub 3 -1 roll put - not{exit}if - }loop - ppdict dup dup length 1 sub()put - end -}def -/make_pattern -{ - exch clonedict exch - dup matrix currentmatrix matrix concatmatrix 0 0 3 2 roll itransform - exch 3 index/XStep get 1 index exch 2 copy div cvi mul sub sub - exch 3 index/YStep get 1 index exch 2 copy div cvi mul sub sub - matrix translate exch matrix concatmatrix - 1 index begin - BBox 0 get XStep div cvi XStep mul/xshift exch neg def - BBox 1 get YStep div cvi YStep mul/yshift exch neg def - BBox 0 get xshift add - BBox 1 get yshift add - BBox 2 get xshift add - BBox 3 get yshift add - 4 array astore - /BBox exch def - [xshift yshift/translate load null/exec load]dup - 3/PaintProc load put cvx/PaintProc exch def - end - gsave 0 setgray - makepattern - grestore -}def -/set_pattern -{ - dup/PatternType get 1 eq{ - dup/PaintType get 1 eq{ - currentoverprint sop[/DeviceGray]setcolorspace 0 setgray - }if - }if - setpattern -}def -/setcolorspace_opt -{ - dup currentcolorspace eq{pop}{setcolorspace}ifelse -}def -/updatecolorrendering -{ - currentcolorrendering/RenderingIntent known{ - currentcolorrendering/RenderingIntent get - } - { - Intent/AbsoluteColorimetric eq - { - /absolute_colorimetric_crd AGMCORE_gget dup null eq - } - { - Intent/RelativeColorimetric eq - { - /relative_colorimetric_crd AGMCORE_gget dup null eq - } - { - Intent/Saturation eq - { - /saturation_crd AGMCORE_gget dup null eq - } - { - /perceptual_crd AGMCORE_gget dup null eq - }ifelse - }ifelse - }ifelse - { - pop null - } - { - /RenderingIntent known{null}{Intent}ifelse - }ifelse - }ifelse - Intent ne{ - Intent/ColorRendering{findresource}stopped - { - pop pop systemdict/findcolorrendering known - { - Intent findcolorrendering - { - /ColorRendering findresource true exch - } - { - /ColorRendering findresource - product(Xerox Phaser 5400)ne - exch - }ifelse - dup Intent/AbsoluteColorimetric eq - { - /absolute_colorimetric_crd exch AGMCORE_gput - } - { - Intent/RelativeColorimetric eq - { - /relative_colorimetric_crd exch AGMCORE_gput - } - { - Intent/Saturation eq - { - /saturation_crd exch AGMCORE_gput - } - { - Intent/Perceptual eq - { - /perceptual_crd exch AGMCORE_gput - } - { - pop - }ifelse - }ifelse - }ifelse - }ifelse - 1 index{exch}{pop}ifelse - } - {false}ifelse - } - {true}ifelse - { - dup begin - currentdict/TransformPQR known{ - currentdict/TransformPQR get aload pop - 3{{}eq 3 1 roll}repeat or or - } - {true}ifelse - currentdict/MatrixPQR known{ - currentdict/MatrixPQR get aload pop - 1.0 eq 9 1 roll 0.0 eq 9 1 roll 0.0 eq 9 1 roll - 0.0 eq 9 1 roll 1.0 eq 9 1 roll 0.0 eq 9 1 roll - 0.0 eq 9 1 roll 0.0 eq 9 1 roll 1.0 eq - and and and and and and and and - } - {true}ifelse - end - or - { - clonedict begin - /TransformPQR[ - {4 -1 roll 3 get dup 3 1 roll sub 5 -1 roll 3 get 3 -1 roll sub div - 3 -1 roll 3 get 3 -1 roll 3 get dup 4 1 roll sub mul add}bind - {4 -1 roll 4 get dup 3 1 roll sub 5 -1 roll 4 get 3 -1 roll sub div - 3 -1 roll 4 get 3 -1 roll 4 get dup 4 1 roll sub mul add}bind - {4 -1 roll 5 get dup 3 1 roll sub 5 -1 roll 5 get 3 -1 roll sub div - 3 -1 roll 5 get 3 -1 roll 5 get dup 4 1 roll sub mul add}bind - ]def - /MatrixPQR[0.8951 -0.7502 0.0389 0.2664 1.7135 -0.0685 -0.1614 0.0367 1.0296]def - /RangePQR[-0.3227950745 2.3229645538 -1.5003771057 3.5003465881 -0.1369979095 2.136967392]def - currentdict end - }if - setcolorrendering_opt - }if - }if -}def -/set_crd -{ - AGMCORE_host_sep not level2 and{ - currentdict/ColorRendering known{ - ColorRendering/ColorRendering{findresource}stopped not{setcolorrendering_opt}if - }{ - currentdict/Intent known{ - updatecolorrendering - }if - }ifelse - currentcolorspace dup type/arraytype eq - {0 get}if - /DeviceRGB eq - { - currentdict/UCR known - {/UCR}{/AGMCORE_currentucr}ifelse - load setundercolorremoval - currentdict/BG known - {/BG}{/AGMCORE_currentbg}ifelse - load setblackgeneration - }if - }if -}def -/set_ucrbg -{ - dup null eq {pop /AGMCORE_currentbg load}{/Procedure get_res}ifelse - dup currentblackgeneration eq {pop}{setblackgeneration}ifelse - dup null eq {pop /AGMCORE_currentucr load}{/Procedure get_res}ifelse - dup currentundercolorremoval eq {pop}{setundercolorremoval}ifelse -}def -/setcolorrendering_opt -{ - dup currentcolorrendering eq{ - pop - }{ - product(HP Color LaserJet 2605)anchorsearch{ - pop pop pop - }{ - pop - clonedict - begin - /Intent Intent def - currentdict - end - setcolorrendering - }ifelse - }ifelse -}def -/cpaint_gcomp -{ - convert_to_process//Adobe_AGM_Core/AGMCORE_ConvertToProcess xddf - //Adobe_AGM_Core/AGMCORE_ConvertToProcess get not - { - (%end_cpaint_gcomp)flushinput - }if -}def -/cpaint_gsep -{ - //Adobe_AGM_Core/AGMCORE_ConvertToProcess get - { - (%end_cpaint_gsep)flushinput - }if -}def -/cpaint_gend -{np}def -/T1_path -{ - currentfile token pop currentfile token pop mo - { - currentfile token pop dup type/stringtype eq - {pop exit}if - 0 exch rlineto - currentfile token pop dup type/stringtype eq - {pop exit}if - 0 rlineto - }loop -}def -/T1_gsave - level3 - {/clipsave} - {/gsave}ifelse - load def -/T1_grestore - level3 - {/cliprestore} - {/grestore}ifelse - load def -/set_spot_alias_ary -{ - dup inherit_aliases - //Adobe_AGM_Core/AGMCORE_SpotAliasAry xddf -}def -/set_spot_normalization_ary -{ - dup inherit_aliases - dup length - /AGMCORE_SpotAliasAry where{pop AGMCORE_SpotAliasAry length add}if - array - //Adobe_AGM_Core/AGMCORE_SpotAliasAry2 xddf - /AGMCORE_SpotAliasAry where{ - pop - AGMCORE_SpotAliasAry2 0 AGMCORE_SpotAliasAry putinterval - AGMCORE_SpotAliasAry length - }{0}ifelse - AGMCORE_SpotAliasAry2 3 1 roll exch putinterval - true set_spot_alias -}def -/inherit_aliases -{ - {dup/Name get map_alias{/CSD put}{pop}ifelse}forall -}def -/set_spot_alias -{ - /AGMCORE_SpotAliasAry2 where{ - /AGMCORE_current_spot_alias 3 -1 roll put - }{ - pop - }ifelse -}def -/current_spot_alias -{ - /AGMCORE_SpotAliasAry2 where{ - /AGMCORE_current_spot_alias get - }{ - false - }ifelse -}def -/map_alias -{ - /AGMCORE_SpotAliasAry2 where{ - begin - /AGMCORE_name xdf - false - AGMCORE_SpotAliasAry2{ - dup/Name get AGMCORE_name eq{ - /CSD get/CSD get_res - exch pop true - exit - }{ - pop - }ifelse - }forall - end - }{ - pop false - }ifelse -}bdf -/spot_alias -{ - true set_spot_alias - /AGMCORE_&setcustomcolor AGMCORE_key_known not{ - //Adobe_AGM_Core/AGMCORE_&setcustomcolor/setcustomcolor load put - }if - /customcolor_tint 1 AGMCORE_gput - //Adobe_AGM_Core begin - /setcustomcolor - { - //Adobe_AGM_Core begin - dup/customcolor_tint exch AGMCORE_gput - 1 index aload pop pop 1 eq exch 1 eq and exch 1 eq and exch 1 eq and not - current_spot_alias and{1 index 4 get map_alias}{false}ifelse - { - false set_spot_alias - /sep_colorspace_dict AGMCORE_gget null ne - {/sep_colorspace_dict AGMCORE_gget/ForeignContent known not}{false}ifelse - 3 1 roll 2 index{ - exch pop/sep_tint AGMCORE_gget exch - }if - mark 3 1 roll - setsepcolorspace - counttomark 0 ne{ - setsepcolor - }if - pop - not{/sep_tint 1.0 AGMCORE_gput/sep_colorspace_dict AGMCORE_gget/ForeignContent true put}if - pop - true set_spot_alias - }{ - AGMCORE_&setcustomcolor - }ifelse - end - }bdf - end -}def -/begin_feature -{ - Adobe_AGM_Core/AGMCORE_feature_dictCount countdictstack put - count Adobe_AGM_Core/AGMCORE_feature_opCount 3 -1 roll put - {Adobe_AGM_Core/AGMCORE_feature_ctm matrix currentmatrix put}if -}def -/end_feature -{ - 2 dict begin - /spd/setpagedevice load def - /setpagedevice{get_gstate spd set_gstate}def - stopped{$error/newerror false put}if - end - count Adobe_AGM_Core/AGMCORE_feature_opCount get sub dup 0 gt{{pop}repeat}{pop}ifelse - countdictstack Adobe_AGM_Core/AGMCORE_feature_dictCount get sub dup 0 gt{{end}repeat}{pop}ifelse - {Adobe_AGM_Core/AGMCORE_feature_ctm get setmatrix}if -}def -/set_negative -{ - //Adobe_AGM_Core begin - /AGMCORE_inverting exch def - level2{ - currentpagedevice/NegativePrint known AGMCORE_distilling not and{ - currentpagedevice/NegativePrint get//Adobe_AGM_Core/AGMCORE_inverting get ne{ - true begin_feature true{ - <</NegativePrint//Adobe_AGM_Core/AGMCORE_inverting get>>setpagedevice - }end_feature - }if - /AGMCORE_inverting false def - }if - }if - AGMCORE_inverting{ - [{1 exch sub}/exec load dup currenttransfer exch]cvx bind settransfer - AGMCORE_distilling{ - erasepage - }{ - gsave np clippath 1/setseparationgray where{pop setseparationgray}{setgray}ifelse - /AGMIRS_&fill where{pop AGMIRS_&fill}{fill}ifelse grestore - }ifelse - }if - end -}def -/lw_save_restore_override{ - /md where{ - pop - md begin - initializepage - /initializepage{}def - /pmSVsetup{}def - /endp{}def - /pse{}def - /psb{}def - /orig_showpage where - {pop} - {/orig_showpage/showpage load def} - ifelse - /showpage{orig_showpage gR}def - end - }if -}def -/pscript_showpage_override{ - /NTPSOct95 where - { - begin - showpage - save - /showpage/restore load def - /restore{exch pop}def - end - }if -}def -/driver_media_override -{ - /md where{ - pop - md/initializepage known{ - md/initializepage{}put - }if - md/rC known{ - md/rC{4{pop}repeat}put - }if - }if - /mysetup where{ - /mysetup[1 0 0 1 0 0]put - }if - Adobe_AGM_Core/AGMCORE_Default_CTM matrix currentmatrix put - level2 - {Adobe_AGM_Core/AGMCORE_Default_PageSize currentpagedevice/PageSize get put}if -}def -/capture_mysetup -{ - /Pscript_Win_Data where{ - pop - Pscript_Win_Data/mysetup known{ - Adobe_AGM_Core/save_mysetup Pscript_Win_Data/mysetup get put - }if - }if -}def -/restore_mysetup -{ - /Pscript_Win_Data where{ - pop - Pscript_Win_Data/mysetup known{ - Adobe_AGM_Core/save_mysetup known{ - Pscript_Win_Data/mysetup Adobe_AGM_Core/save_mysetup get put - Adobe_AGM_Core/save_mysetup undef - }if - }if - }if -}def -/driver_check_media_override -{ - /PrepsDict where - {pop} - { - Adobe_AGM_Core/AGMCORE_Default_CTM get matrix currentmatrix ne - Adobe_AGM_Core/AGMCORE_Default_PageSize get type/arraytype eq - { - Adobe_AGM_Core/AGMCORE_Default_PageSize get 0 get currentpagedevice/PageSize get 0 get eq and - Adobe_AGM_Core/AGMCORE_Default_PageSize get 1 get currentpagedevice/PageSize get 1 get eq and - }if - { - Adobe_AGM_Core/AGMCORE_Default_CTM get setmatrix - }if - }ifelse -}def -AGMCORE_err_strings begin - /AGMCORE_bad_environ(Environment not satisfactory for this job. Ensure that the PPD is correct or that the PostScript level requested is supported by this printer. )def - /AGMCORE_color_space_onhost_seps(This job contains colors that will not separate with on-host methods. )def - /AGMCORE_invalid_color_space(This job contains an invalid color space. )def -end -/set_def_ht -{AGMCORE_def_ht sethalftone}def -/set_def_flat -{AGMCORE_Default_flatness setflat}def -end -systemdict/setpacking known -{setpacking}if -%%EndResource -%%BeginResource: procset Adobe_CoolType_Core 2.31 0 -%%Copyright: Copyright 1997-2006 Adobe Systems Incorporated. All Rights Reserved. -%%Version: 2.31 0 -10 dict begin -/Adobe_CoolType_Passthru currentdict def -/Adobe_CoolType_Core_Defined userdict/Adobe_CoolType_Core known def -Adobe_CoolType_Core_Defined - {/Adobe_CoolType_Core userdict/Adobe_CoolType_Core get def} -if -userdict/Adobe_CoolType_Core 70 dict dup begin put -/Adobe_CoolType_Version 2.31 def -/Level2? - systemdict/languagelevel known dup - {pop systemdict/languagelevel get 2 ge} - if def -Level2? not - { - /currentglobal false def - /setglobal/pop load def - /gcheck{pop false}bind def - /currentpacking false def - /setpacking/pop load def - /SharedFontDirectory 0 dict def - } -if -currentpacking -true setpacking -currentglobal false setglobal -userdict/Adobe_CoolType_Data 2 copy known not - {2 copy 10 dict put} -if -get - begin - /@opStackCountByLevel 32 dict def - /@opStackLevel 0 def - /@dictStackCountByLevel 32 dict def - /@dictStackLevel 0 def - end -setglobal -currentglobal true setglobal -userdict/Adobe_CoolType_GVMFonts known not - {userdict/Adobe_CoolType_GVMFonts 10 dict put} -if -setglobal -currentglobal false setglobal -userdict/Adobe_CoolType_LVMFonts known not - {userdict/Adobe_CoolType_LVMFonts 10 dict put} -if -setglobal -/ct_VMDictPut - { - dup gcheck{Adobe_CoolType_GVMFonts}{Adobe_CoolType_LVMFonts}ifelse - 3 1 roll put - }bind def -/ct_VMDictUndef - { - dup Adobe_CoolType_GVMFonts exch known - {Adobe_CoolType_GVMFonts exch undef} - { - dup Adobe_CoolType_LVMFonts exch known - {Adobe_CoolType_LVMFonts exch undef} - {pop} - ifelse - }ifelse - }bind def -/ct_str1 1 string def -/ct_xshow -{ - /_ct_na exch def - /_ct_i 0 def - currentpoint - /_ct_y exch def - /_ct_x exch def - { - pop pop - ct_str1 exch 0 exch put - ct_str1 show - {_ct_na _ct_i get}stopped - {pop pop} - { - _ct_x _ct_y moveto - 0 - rmoveto - } - ifelse - /_ct_i _ct_i 1 add def - currentpoint - /_ct_y exch def - /_ct_x exch def - } - exch - @cshow -}bind def -/ct_yshow -{ - /_ct_na exch def - /_ct_i 0 def - currentpoint - /_ct_y exch def - /_ct_x exch def - { - pop pop - ct_str1 exch 0 exch put - ct_str1 show - {_ct_na _ct_i get}stopped - {pop pop} - { - _ct_x _ct_y moveto - 0 exch - rmoveto - } - ifelse - /_ct_i _ct_i 1 add def - currentpoint - /_ct_y exch def - /_ct_x exch def - } - exch - @cshow -}bind def -/ct_xyshow -{ - /_ct_na exch def - /_ct_i 0 def - currentpoint - /_ct_y exch def - /_ct_x exch def - { - pop pop - ct_str1 exch 0 exch put - ct_str1 show - {_ct_na _ct_i get}stopped - {pop pop} - { - {_ct_na _ct_i 1 add get}stopped - {pop pop pop} - { - _ct_x _ct_y moveto - rmoveto - } - ifelse - } - ifelse - /_ct_i _ct_i 2 add def - currentpoint - /_ct_y exch def - /_ct_x exch def - } - exch - @cshow -}bind def -/xsh{{@xshow}stopped{Adobe_CoolType_Data begin ct_xshow end}if}bind def -/ysh{{@yshow}stopped{Adobe_CoolType_Data begin ct_yshow end}if}bind def -/xysh{{@xyshow}stopped{Adobe_CoolType_Data begin ct_xyshow end}if}bind def -currentglobal true setglobal -/ct_T3Defs -{ -/BuildChar -{ - 1 index/Encoding get exch get - 1 index/BuildGlyph get exec -}bind def -/BuildGlyph -{ - exch begin - GlyphProcs exch get exec - end -}bind def -}bind def -setglobal -/@_SaveStackLevels - { - Adobe_CoolType_Data - begin - /@vmState currentglobal def false setglobal - @opStackCountByLevel - @opStackLevel - 2 copy known not - { - 2 copy - 3 dict dup/args - 7 index - 5 add array put - put get - } - { - get dup/args get dup length 3 index lt - { - dup length 5 add array exch - 1 index exch 0 exch putinterval - 1 index exch/args exch put - } - {pop} - ifelse - } - ifelse - begin - count 1 sub - 1 index lt - {pop count} - if - dup/argCount exch def - dup 0 gt - { - args exch 0 exch getinterval - astore pop - } - {pop} - ifelse - count - /restCount exch def - end - /@opStackLevel @opStackLevel 1 add def - countdictstack 1 sub - @dictStackCountByLevel exch @dictStackLevel exch put - /@dictStackLevel @dictStackLevel 1 add def - @vmState setglobal - end - }bind def -/@_RestoreStackLevels - { - Adobe_CoolType_Data - begin - /@opStackLevel @opStackLevel 1 sub def - @opStackCountByLevel @opStackLevel get - begin - count restCount sub dup 0 gt - {{pop}repeat} - {pop} - ifelse - args 0 argCount getinterval{}forall - end - /@dictStackLevel @dictStackLevel 1 sub def - @dictStackCountByLevel @dictStackLevel get - end - countdictstack exch sub dup 0 gt - {{end}repeat} - {pop} - ifelse - }bind def -/@_PopStackLevels - { - Adobe_CoolType_Data - begin - /@opStackLevel @opStackLevel 1 sub def - /@dictStackLevel @dictStackLevel 1 sub def - end - }bind def -/@Raise - { - exch cvx exch errordict exch get exec - stop - }bind def -/@ReRaise - { - cvx $error/errorname get errordict exch get exec - stop - }bind def -/@Stopped - { - 0 @#Stopped - }bind def -/@#Stopped - { - @_SaveStackLevels - stopped - {@_RestoreStackLevels true} - {@_PopStackLevels false} - ifelse - }bind def -/@Arg - { - Adobe_CoolType_Data - begin - @opStackCountByLevel @opStackLevel 1 sub get - begin - args exch - argCount 1 sub exch sub get - end - end - }bind def -currentglobal true setglobal -/CTHasResourceForAllBug - Level2? - { - 1 dict dup - /@shouldNotDisappearDictValue true def - Adobe_CoolType_Data exch/@shouldNotDisappearDict exch put - begin - count @_SaveStackLevels - {(*){pop stop}128 string/Category resourceforall} - stopped pop - @_RestoreStackLevels - currentdict Adobe_CoolType_Data/@shouldNotDisappearDict get dup 3 1 roll ne dup 3 1 roll - { - /@shouldNotDisappearDictValue known - { - { - end - currentdict 1 index eq - {pop exit} - if - } - loop - } - if - } - { - pop - end - } - ifelse - } - {false} - ifelse - def -true setglobal -/CTHasResourceStatusBug - Level2? - { - mark - {/steveamerige/Category resourcestatus} - stopped - {cleartomark true} - {cleartomark currentglobal not} - ifelse - } - {false} - ifelse - def -setglobal -/CTResourceStatus - { - mark 3 1 roll - /Category findresource - begin - ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec - {cleartomark false} - {{3 2 roll pop true}{cleartomark false}ifelse} - ifelse - end - }bind def -/CTWorkAroundBugs - { - Level2? - { - /cid_PreLoad/ProcSet resourcestatus - { - pop pop - currentglobal - mark - { - (*) - { - dup/CMap CTHasResourceStatusBug - {CTResourceStatus} - {resourcestatus} - ifelse - { - pop dup 0 eq exch 1 eq or - { - dup/CMap findresource gcheck setglobal - /CMap undefineresource - } - { - pop CTHasResourceForAllBug - {exit} - {stop} - ifelse - } - ifelse - } - {pop} - ifelse - } - 128 string/CMap resourceforall - } - stopped - {cleartomark} - stopped pop - setglobal - } - if - } - if - }bind def -/ds - { - Adobe_CoolType_Core - begin - CTWorkAroundBugs - /mo/moveto load def - /nf/newencodedfont load def - /msf{makefont setfont}bind def - /uf{dup undefinefont ct_VMDictUndef}bind def - /ur/undefineresource load def - /chp/charpath load def - /awsh/awidthshow load def - /wsh/widthshow load def - /ash/ashow load def - /@xshow/xshow load def - /@yshow/yshow load def - /@xyshow/xyshow load def - /@cshow/cshow load def - /sh/show load def - /rp/repeat load def - /.n/.notdef def - end - currentglobal false setglobal - userdict/Adobe_CoolType_Data 2 copy known not - {2 copy 10 dict put} - if - get - begin - /AddWidths? false def - /CC 0 def - /charcode 2 string def - /@opStackCountByLevel 32 dict def - /@opStackLevel 0 def - /@dictStackCountByLevel 32 dict def - /@dictStackLevel 0 def - /InVMFontsByCMap 10 dict def - /InVMDeepCopiedFonts 10 dict def - end - setglobal - }bind def -/dt - { - currentdict Adobe_CoolType_Core eq - {end} - if - }bind def -/ps - { - Adobe_CoolType_Core begin - Adobe_CoolType_GVMFonts begin - Adobe_CoolType_LVMFonts begin - SharedFontDirectory begin - }bind def -/pt - { - end - end - end - end - }bind def -/unload - { - systemdict/languagelevel known - { - systemdict/languagelevel get 2 ge - { - userdict/Adobe_CoolType_Core 2 copy known - {undef} - {pop pop} - ifelse - } - if - } - if - }bind def -/ndf - { - 1 index where - {pop pop pop} - {dup xcheck{bind}if def} - ifelse - }def -/findfont systemdict - begin - userdict - begin - /globaldict where{/globaldict get begin}if - dup where pop exch get - /globaldict where{pop end}if - end - end -Adobe_CoolType_Core_Defined - {/systemfindfont exch def} - { - /findfont 1 index def - /systemfindfont exch def - } -ifelse -/undefinefont - {pop}ndf -/copyfont - { - currentglobal 3 1 roll - 1 index gcheck setglobal - dup null eq{0}{dup length}ifelse - 2 index length add 1 add dict - begin - exch - { - 1 index/FID eq - {pop pop} - {def} - ifelse - } - forall - dup null eq - {pop} - {{def}forall} - ifelse - currentdict - end - exch setglobal - }bind def -/copyarray - { - currentglobal exch - dup gcheck setglobal - dup length array copy - exch setglobal - }bind def -/newencodedfont - { - currentglobal - { - SharedFontDirectory 3 index known - {SharedFontDirectory 3 index get/FontReferenced known} - {false} - ifelse - } - { - FontDirectory 3 index known - {FontDirectory 3 index get/FontReferenced known} - { - SharedFontDirectory 3 index known - {SharedFontDirectory 3 index get/FontReferenced known} - {false} - ifelse - } - ifelse - } - ifelse - dup - { - 3 index findfont/FontReferenced get - 2 index dup type/nametype eq - {findfont} - if ne - {pop false} - if - } - if - dup - { - 1 index dup type/nametype eq - {findfont} - if - dup/CharStrings known - { - /CharStrings get length - 4 index findfont/CharStrings get length - ne - { - pop false - } - if - } - {pop} - ifelse - } - if - { - pop - 1 index findfont - /Encoding get exch - 0 1 255 - {2 copy get 3 index 3 1 roll put} - for - pop pop pop - } - { - currentglobal - 4 1 roll - dup type/nametype eq - {findfont} - if - dup gcheck setglobal - dup dup maxlength 2 add dict - begin - exch - { - 1 index/FID ne - 2 index/Encoding ne and - {def} - {pop pop} - ifelse - } - forall - /FontReferenced exch def - /Encoding exch dup length array copy def - /FontName 1 index dup type/stringtype eq{cvn}if def dup - currentdict - end - definefont ct_VMDictPut - setglobal - } - ifelse - }bind def -/SetSubstituteStrategy - { - $SubstituteFont - begin - dup type/dicttype ne - {0 dict} - if - currentdict/$Strategies known - { - exch $Strategies exch - 2 copy known - { - get - 2 copy maxlength exch maxlength add dict - begin - {def}forall - {def}forall - currentdict - dup/$Init known - {dup/$Init get exec} - if - end - /$Strategy exch def - } - {pop pop pop} - ifelse - } - {pop pop} - ifelse - end - }bind def -/scff - { - $SubstituteFont - begin - dup type/stringtype eq - {dup length exch} - {null} - ifelse - /$sname exch def - /$slen exch def - /$inVMIndex - $sname null eq - { - 1 index $str cvs - dup length $slen sub $slen getinterval cvn - } - {$sname} - ifelse def - end - {findfont} - @Stopped - { - dup length 8 add string exch - 1 index 0(BadFont:)putinterval - 1 index exch 8 exch dup length string cvs putinterval cvn - {findfont} - @Stopped - {pop/Courier findfont} - if - } - if - $SubstituteFont - begin - /$sname null def - /$slen 0 def - /$inVMIndex null def - end - }bind def -/isWidthsOnlyFont - { - dup/WidthsOnly known - {pop pop true} - { - dup/FDepVector known - {/FDepVector get{isWidthsOnlyFont dup{exit}if}forall} - { - dup/FDArray known - {/FDArray get{isWidthsOnlyFont dup{exit}if}forall} - {pop} - ifelse - } - ifelse - } - ifelse - }bind def -/ct_StyleDicts 4 dict dup begin - /Adobe-Japan1 4 dict dup begin - Level2? - { - /Serif - /HeiseiMin-W3-83pv-RKSJ-H/Font resourcestatus - {pop pop/HeiseiMin-W3} - { - /CIDFont/Category resourcestatus - { - pop pop - /HeiseiMin-W3/CIDFont resourcestatus - {pop pop/HeiseiMin-W3} - {/Ryumin-Light} - ifelse - } - {/Ryumin-Light} - ifelse - } - ifelse - def - /SansSerif - /HeiseiKakuGo-W5-83pv-RKSJ-H/Font resourcestatus - {pop pop/HeiseiKakuGo-W5} - { - /CIDFont/Category resourcestatus - { - pop pop - /HeiseiKakuGo-W5/CIDFont resourcestatus - {pop pop/HeiseiKakuGo-W5} - {/GothicBBB-Medium} - ifelse - } - {/GothicBBB-Medium} - ifelse - } - ifelse - def - /HeiseiMaruGo-W4-83pv-RKSJ-H/Font resourcestatus - {pop pop/HeiseiMaruGo-W4} - { - /CIDFont/Category resourcestatus - { - pop pop - /HeiseiMaruGo-W4/CIDFont resourcestatus - {pop pop/HeiseiMaruGo-W4} - { - /Jun101-Light-RKSJ-H/Font resourcestatus - {pop pop/Jun101-Light} - {SansSerif} - ifelse - } - ifelse - } - { - /Jun101-Light-RKSJ-H/Font resourcestatus - {pop pop/Jun101-Light} - {SansSerif} - ifelse - } - ifelse - } - ifelse - /RoundSansSerif exch def - /Default Serif def - } - { - /Serif/Ryumin-Light def - /SansSerif/GothicBBB-Medium def - { - (fonts/Jun101-Light-83pv-RKSJ-H)status - }stopped - {pop}{ - {pop pop pop pop/Jun101-Light} - {SansSerif} - ifelse - /RoundSansSerif exch def - }ifelse - /Default Serif def - } - ifelse - end - def - /Adobe-Korea1 4 dict dup begin - /Serif/HYSMyeongJo-Medium def - /SansSerif/HYGoThic-Medium def - /RoundSansSerif SansSerif def - /Default Serif def - end - def - /Adobe-GB1 4 dict dup begin - /Serif/STSong-Light def - /SansSerif/STHeiti-Regular def - /RoundSansSerif SansSerif def - /Default Serif def - end - def - /Adobe-CNS1 4 dict dup begin - /Serif/MKai-Medium def - /SansSerif/MHei-Medium def - /RoundSansSerif SansSerif def - /Default Serif def - end - def -end -def -Level2?{currentglobal true setglobal}if -/ct_BoldRomanWidthProc - { - stringwidth 1 index 0 ne{exch .03 add exch}if setcharwidth - 0 0 - }bind def -/ct_Type0WidthProc - { - dup stringwidth 0 0 moveto - 2 index true charpath pathbbox - 0 -1 - 7 index 2 div .88 - setcachedevice2 - pop - 0 0 - }bind def -/ct_Type0WMode1WidthProc - { - dup stringwidth - pop 2 div neg -0.88 - 2 copy - moveto - 0 -1 - 5 -1 roll true charpath pathbbox - setcachedevice - }bind def -/cHexEncoding -[/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 -/c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 -/c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 -/c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B -/c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E -/c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 -/c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 -/c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 -/c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA -/cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD -/cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 -/cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 -/cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 -/cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def -/ct_BoldBaseFont - 11 dict begin - /FontType 3 def - /FontMatrix[1 0 0 1 0 0]def - /FontBBox[0 0 1 1]def - /Encoding cHexEncoding def - /_setwidthProc/ct_BoldRomanWidthProc load def - /_bcstr1 1 string def - /BuildChar - { - exch begin - _basefont setfont - _bcstr1 dup 0 4 -1 roll put - dup - _setwidthProc - 3 copy - moveto - show - _basefonto setfont - moveto - show - end - }bind def - currentdict - end -def -systemdict/composefont known -{ -/ct_DefineIdentity-H -{ - /Identity-H/CMap resourcestatus - { - pop pop - } - { - /CIDInit/ProcSet findresource begin - 12 dict begin - begincmap - /CIDSystemInfo 3 dict dup begin - /Registry(Adobe)def - /Ordering(Identity)def - /Supplement 0 def - end def - /CMapName/Identity-H def - /CMapVersion 1.000 def - /CMapType 1 def - 1 begincodespacerange - <0000><FFFF> - endcodespacerange - 1 begincidrange - <0000><FFFF>0 - endcidrange - endcmap - CMapName currentdict/CMap defineresource pop - end - end - } - ifelse -} -def -/ct_BoldBaseCIDFont - 11 dict begin - /CIDFontType 1 def - /CIDFontName/ct_BoldBaseCIDFont def - /FontMatrix[1 0 0 1 0 0]def - /FontBBox[0 0 1 1]def - /_setwidthProc/ct_Type0WidthProc load def - /_bcstr2 2 string def - /BuildGlyph - { - exch begin - _basefont setfont - _bcstr2 1 2 index 256 mod put - _bcstr2 0 3 -1 roll 256 idiv put - _bcstr2 dup _setwidthProc - 3 copy - moveto - show - _basefonto setfont - moveto - show - end - }bind def - currentdict - end -def -}if -Level2?{setglobal}if -/ct_CopyFont{ - { - 1 index/FID ne 2 index/UniqueID ne and - {def}{pop pop}ifelse - }forall -}bind def -/ct_Type0CopyFont -{ - exch - dup length dict - begin - ct_CopyFont - [ - exch - FDepVector - { - dup/FontType get 0 eq - { - 1 index ct_Type0CopyFont - /_ctType0 exch definefont - } - { - /_ctBaseFont exch - 2 index exec - } - ifelse - exch - } - forall - pop - ] - /FDepVector exch def - currentdict - end -}bind def -/ct_MakeBoldFont -{ - dup/ct_SyntheticBold known - { - dup length 3 add dict begin - ct_CopyFont - /ct_StrokeWidth .03 0 FontMatrix idtransform pop def - /ct_SyntheticBold true def - currentdict - end - definefont - } - { - dup dup length 3 add dict - begin - ct_CopyFont - /PaintType 2 def - /StrokeWidth .03 0 FontMatrix idtransform pop def - /dummybold currentdict - end - definefont - dup/FontType get dup 9 ge exch 11 le and - { - ct_BoldBaseCIDFont - dup length 3 add dict copy begin - dup/CIDSystemInfo get/CIDSystemInfo exch def - ct_DefineIdentity-H - /_Type0Identity/Identity-H 3 -1 roll[exch]composefont - /_basefont exch def - /_Type0Identity/Identity-H 3 -1 roll[exch]composefont - /_basefonto exch def - currentdict - end - /CIDFont defineresource - } - { - ct_BoldBaseFont - dup length 3 add dict copy begin - /_basefont exch def - /_basefonto exch def - currentdict - end - definefont - } - ifelse - } - ifelse -}bind def -/ct_MakeBold{ - 1 index - 1 index - findfont - currentglobal 5 1 roll - dup gcheck setglobal - dup - /FontType get 0 eq - { - dup/WMode known{dup/WMode get 1 eq}{false}ifelse - version length 4 ge - and - {version 0 4 getinterval cvi 2015 ge} - {true} - ifelse - {/ct_Type0WidthProc} - {/ct_Type0WMode1WidthProc} - ifelse - ct_BoldBaseFont/_setwidthProc 3 -1 roll load put - {ct_MakeBoldFont}ct_Type0CopyFont definefont - } - { - dup/_fauxfont known not 1 index/SubstMaster known not and - { - ct_BoldBaseFont/_setwidthProc /ct_BoldRomanWidthProc load put - ct_MakeBoldFont - } - { - 2 index 2 index eq - {exch pop } - { - dup length dict begin - ct_CopyFont - currentdict - end - definefont - } - ifelse - } - ifelse - } - ifelse - pop pop pop - setglobal -}bind def -/?str1 256 string def -/?set - { - $SubstituteFont - begin - /$substituteFound false def - /$fontname 1 index def - /$doSmartSub false def - end - dup - findfont - $SubstituteFont - begin - $substituteFound - {false} - { - dup/FontName known - { - dup/FontName get $fontname eq - 1 index/DistillerFauxFont known not and - /currentdistillerparams where - {pop false 2 index isWidthsOnlyFont not and} - if - } - {false} - ifelse - } - ifelse - exch pop - /$doSmartSub true def - end - { - 5 1 roll pop pop pop pop - findfont - } - { - 1 index - findfont - dup/FontType get 3 eq - { - 6 1 roll pop pop pop pop pop false - } - {pop true} - ifelse - { - $SubstituteFont - begin - pop pop - /$styleArray 1 index def - /$regOrdering 2 index def - pop pop - 0 1 $styleArray length 1 sub - { - $styleArray exch get - ct_StyleDicts $regOrdering - 2 copy known - { - get - exch 2 copy known not - {pop/Default} - if - get - dup type/nametype eq - { - ?str1 cvs length dup 1 add exch - ?str1 exch(-)putinterval - exch dup length exch ?str1 exch 3 index exch putinterval - add ?str1 exch 0 exch getinterval cvn - } - { - pop pop/Unknown - } - ifelse - } - { - pop pop pop pop/Unknown - } - ifelse - } - for - end - findfont - }if - } - ifelse - currentglobal false setglobal 3 1 roll - null copyfont definefont pop - setglobal - }bind def -setpacking -userdict/$SubstituteFont 25 dict put -1 dict - begin - /SubstituteFont - dup $error exch 2 copy known - {get} - {pop pop{pop/Courier}bind} - ifelse def - /currentdistillerparams where dup - { - pop pop - currentdistillerparams/CannotEmbedFontPolicy 2 copy known - {get/Error eq} - {pop pop false} - ifelse - } - if not - { - countdictstack array dictstack 0 get - begin - userdict - begin - $SubstituteFont - begin - /$str 128 string def - /$fontpat 128 string def - /$slen 0 def - /$sname null def - /$match false def - /$fontname null def - /$substituteFound false def - /$inVMIndex null def - /$doSmartSub true def - /$depth 0 def - /$fontname null def - /$italicangle 26.5 def - /$dstack null def - /$Strategies 10 dict dup - begin - /$Type3Underprint - { - currentglobal exch false setglobal - 11 dict - begin - /UseFont exch - $WMode 0 ne - { - dup length dict copy - dup/WMode $WMode put - /UseFont exch definefont - } - if def - /FontName $fontname dup type/stringtype eq{cvn}if def - /FontType 3 def - /FontMatrix[.001 0 0 .001 0 0]def - /Encoding 256 array dup 0 1 255{/.notdef put dup}for pop def - /FontBBox[0 0 0 0]def - /CCInfo 7 dict dup - begin - /cc null def - /x 0 def - /y 0 def - end def - /BuildChar - { - exch - begin - CCInfo - begin - 1 string dup 0 3 index put exch pop - /cc exch def - UseFont 1000 scalefont setfont - cc stringwidth/y exch def/x exch def - x y setcharwidth - $SubstituteFont/$Strategy get/$Underprint get exec - 0 0 moveto cc show - x y moveto - end - end - }bind def - currentdict - end - exch setglobal - }bind def - /$GetaTint - 2 dict dup - begin - /$BuildFont - { - dup/WMode known - {dup/WMode get} - {0} - ifelse - /$WMode exch def - $fontname exch - dup/FontName known - { - dup/FontName get - dup type/stringtype eq{cvn}if - } - {/unnamedfont} - ifelse - exch - Adobe_CoolType_Data/InVMDeepCopiedFonts get - 1 index/FontName get known - { - pop - Adobe_CoolType_Data/InVMDeepCopiedFonts get - 1 index get - null copyfont - } - {$deepcopyfont} - ifelse - exch 1 index exch/FontBasedOn exch put - dup/FontName $fontname dup type/stringtype eq{cvn}if put - definefont - Adobe_CoolType_Data/InVMDeepCopiedFonts get - begin - dup/FontBasedOn get 1 index def - end - }bind def - /$Underprint - { - gsave - x abs y abs gt - {/y 1000 def} - {/x -1000 def 500 120 translate} - ifelse - Level2? - { - [/Separation(All)/DeviceCMYK{0 0 0 1 pop}] - setcolorspace - } - {0 setgray} - ifelse - 10 setlinewidth - x .8 mul - [7 3] - { - y mul 8 div 120 sub x 10 div exch moveto - 0 y 4 div neg rlineto - dup 0 rlineto - 0 y 4 div rlineto - closepath - gsave - Level2? - {.2 setcolor} - {.8 setgray} - ifelse - fill grestore - stroke - } - forall - pop - grestore - }bind def - end def - /$Oblique - 1 dict dup - begin - /$BuildFont - { - currentglobal exch dup gcheck setglobal - null copyfont - begin - /FontBasedOn - currentdict/FontName known - { - FontName - dup type/stringtype eq{cvn}if - } - {/unnamedfont} - ifelse - def - /FontName $fontname dup type/stringtype eq{cvn}if def - /currentdistillerparams where - {pop} - { - /FontInfo currentdict/FontInfo known - {FontInfo null copyfont} - {2 dict} - ifelse - dup - begin - /ItalicAngle $italicangle def - /FontMatrix FontMatrix - [1 0 ItalicAngle dup sin exch cos div 1 0 0] - matrix concatmatrix readonly - end - 4 2 roll def - def - } - ifelse - FontName currentdict - end - definefont - exch setglobal - }bind def - end def - /$None - 1 dict dup - begin - /$BuildFont{}bind def - end def - end def - /$Oblique SetSubstituteStrategy - /$findfontByEnum - { - dup type/stringtype eq{cvn}if - dup/$fontname exch def - $sname null eq - {$str cvs dup length $slen sub $slen getinterval} - {pop $sname} - ifelse - $fontpat dup 0(fonts/*)putinterval exch 7 exch putinterval - /$match false def - $SubstituteFont/$dstack countdictstack array dictstack put - mark - { - $fontpat 0 $slen 7 add getinterval - {/$match exch def exit} - $str filenameforall - } - stopped - { - cleardictstack - currentdict - true - $SubstituteFont/$dstack get - { - exch - { - 1 index eq - {pop false} - {true} - ifelse - } - {begin false} - ifelse - } - forall - pop - } - if - cleartomark - /$slen 0 def - $match false ne - {$match(fonts/)anchorsearch pop pop cvn} - {/Courier} - ifelse - }bind def - /$ROS 1 dict dup - begin - /Adobe 4 dict dup - begin - /Japan1 [/Ryumin-Light/HeiseiMin-W3 - /GothicBBB-Medium/HeiseiKakuGo-W5 - /HeiseiMaruGo-W4/Jun101-Light]def - /Korea1 [/HYSMyeongJo-Medium/HYGoThic-Medium]def - /GB1 [/STSong-Light/STHeiti-Regular]def - /CNS1 [/MKai-Medium/MHei-Medium]def - end def - end def - /$cmapname null def - /$deepcopyfont - { - dup/FontType get 0 eq - { - 1 dict dup/FontName/copied put copyfont - begin - /FDepVector FDepVector copyarray - 0 1 2 index length 1 sub - { - 2 copy get $deepcopyfont - dup/FontName/copied put - /copied exch definefont - 3 copy put pop pop - } - for - def - currentdict - end - } - {$Strategies/$Type3Underprint get exec} - ifelse - }bind def - /$buildfontname - { - dup/CIDFont findresource/CIDSystemInfo get - begin - Registry length Ordering length Supplement 8 string cvs - 3 copy length 2 add add add string - dup 5 1 roll dup 0 Registry putinterval - dup 4 index(-)putinterval - dup 4 index 1 add Ordering putinterval - 4 2 roll add 1 add 2 copy(-)putinterval - end - 1 add 2 copy 0 exch getinterval $cmapname $fontpat cvs exch - anchorsearch - {pop pop 3 2 roll putinterval cvn/$cmapname exch def} - {pop pop pop pop pop} - ifelse - length - $str 1 index(-)putinterval 1 add - $str 1 index $cmapname $fontpat cvs putinterval - $cmapname length add - $str exch 0 exch getinterval cvn - }bind def - /$findfontByROS - { - /$fontname exch def - $ROS Registry 2 copy known - { - get Ordering 2 copy known - {get} - {pop pop[]} - ifelse - } - {pop pop[]} - ifelse - false exch - { - dup/CIDFont resourcestatus - { - pop pop - save - 1 index/CIDFont findresource - dup/WidthsOnly known - {dup/WidthsOnly get} - {false} - ifelse - exch pop - exch restore - {pop} - {exch pop true exit} - ifelse - } - {pop} - ifelse - } - forall - {$str cvs $buildfontname} - { - false(*) - { - save exch - dup/CIDFont findresource - dup/WidthsOnly known - {dup/WidthsOnly get not} - {true} - ifelse - exch/CIDSystemInfo get - dup/Registry get Registry eq - exch/Ordering get Ordering eq and and - {exch restore exch pop true exit} - {pop restore} - ifelse - } - $str/CIDFont resourceforall - {$buildfontname} - {$fontname $findfontByEnum} - ifelse - } - ifelse - }bind def - end - end - currentdict/$error known currentdict/languagelevel known and dup - {pop $error/SubstituteFont known} - if - dup - {$error} - {Adobe_CoolType_Core} - ifelse - begin - { - /SubstituteFont - /CMap/Category resourcestatus - { - pop pop - { - $SubstituteFont - begin - /$substituteFound true def - dup length $slen gt - $sname null ne or - $slen 0 gt and - { - $sname null eq - {dup $str cvs dup length $slen sub $slen getinterval cvn} - {$sname} - ifelse - Adobe_CoolType_Data/InVMFontsByCMap get - 1 index 2 copy known - { - get - false exch - { - pop - currentglobal - { - GlobalFontDirectory 1 index known - {exch pop true exit} - {pop} - ifelse - } - { - FontDirectory 1 index known - {exch pop true exit} - { - GlobalFontDirectory 1 index known - {exch pop true exit} - {pop} - ifelse - } - ifelse - } - ifelse - } - forall - } - {pop pop false} - ifelse - { - exch pop exch pop - } - { - dup/CMap resourcestatus - { - pop pop - dup/$cmapname exch def - /CMap findresource/CIDSystemInfo get{def}forall - $findfontByROS - } - { - 128 string cvs - dup(-)search - { - 3 1 roll search - { - 3 1 roll pop - {dup cvi} - stopped - {pop pop pop pop pop $findfontByEnum} - { - 4 2 roll pop pop - exch length - exch - 2 index length - 2 index - sub - exch 1 sub -1 0 - { - $str cvs dup length - 4 index - 0 - 4 index - 4 3 roll add - getinterval - exch 1 index exch 3 index exch - putinterval - dup/CMap resourcestatus - { - pop pop - 4 1 roll pop pop pop - dup/$cmapname exch def - /CMap findresource/CIDSystemInfo get{def}forall - $findfontByROS - true exit - } - {pop} - ifelse - } - for - dup type/booleantype eq - {pop} - {pop pop pop $findfontByEnum} - ifelse - } - ifelse - } - {pop pop pop $findfontByEnum} - ifelse - } - {pop pop $findfontByEnum} - ifelse - } - ifelse - } - ifelse - } - {//SubstituteFont exec} - ifelse - /$slen 0 def - end - } - } - { - { - $SubstituteFont - begin - /$substituteFound true def - dup length $slen gt - $sname null ne or - $slen 0 gt and - {$findfontByEnum} - {//SubstituteFont exec} - ifelse - end - } - } - ifelse - bind readonly def - Adobe_CoolType_Core/scfindfont/systemfindfont load put - } - { - /scfindfont - { - $SubstituteFont - begin - dup systemfindfont - dup/FontName known - {dup/FontName get dup 3 index ne} - {/noname true} - ifelse - dup - { - /$origfontnamefound 2 index def - /$origfontname 4 index def/$substituteFound true def - } - if - exch pop - { - $slen 0 gt - $sname null ne - 3 index length $slen gt or and - { - pop dup $findfontByEnum findfont - dup maxlength 1 add dict - begin - {1 index/FID eq{pop pop}{def}ifelse} - forall - currentdict - end - definefont - dup/FontName known{dup/FontName get}{null}ifelse - $origfontnamefound ne - { - $origfontname $str cvs print - ( substitution revised, using )print - dup/FontName known - {dup/FontName get}{(unspecified font)} - ifelse - $str cvs print(.\n)print - } - if - } - {exch pop} - ifelse - } - {exch pop} - ifelse - end - }bind def - } - ifelse - end - end - Adobe_CoolType_Core_Defined not - { - Adobe_CoolType_Core/findfont - { - $SubstituteFont - begin - $depth 0 eq - { - /$fontname 1 index dup type/stringtype ne{$str cvs}if def - /$substituteFound false def - } - if - /$depth $depth 1 add def - end - scfindfont - $SubstituteFont - begin - /$depth $depth 1 sub def - $substituteFound $depth 0 eq and - { - $inVMIndex null ne - {dup $inVMIndex $AddInVMFont} - if - $doSmartSub - { - currentdict/$Strategy known - {$Strategy/$BuildFont get exec} - if - } - if - } - if - end - }bind put - } - if - } - if - end -/$AddInVMFont - { - exch/FontName 2 copy known - { - get - 1 dict dup begin exch 1 index gcheck def end exch - Adobe_CoolType_Data/InVMFontsByCMap get exch - $DictAdd - } - {pop pop pop} - ifelse - }bind def -/$DictAdd - { - 2 copy known not - {2 copy 4 index length dict put} - if - Level2? not - { - 2 copy get dup maxlength exch length 4 index length add lt - 2 copy get dup length 4 index length add exch maxlength 1 index lt - { - 2 mul dict - begin - 2 copy get{forall}def - 2 copy currentdict put - end - } - {pop} - ifelse - } - if - get - begin - {def} - forall - end - }bind def -end -end -%%EndResource -currentglobal true setglobal -%%BeginResource: procset Adobe_CoolType_Utility_MAKEOCF 1.23 0 -%%Copyright: Copyright 1987-2006 Adobe Systems Incorporated. -%%Version: 1.23 0 -systemdict/languagelevel known dup - {currentglobal false setglobal} - {false} -ifelse -exch -userdict/Adobe_CoolType_Utility 2 copy known - {2 copy get dup maxlength 27 add dict copy} - {27 dict} -ifelse put -Adobe_CoolType_Utility - begin - /@eexecStartData - <BAB431EA07F209EB8C4348311481D9D3F76E3D15246555577D87BC510ED54E - 118C39697FA9F6DB58128E60EB8A12FA24D7CDD2FA94D221FA9EC8DA3E5E6A1C - 4ACECC8C2D39C54E7C946031DD156C3A6B4A09AD29E1867A>def - /@recognizeCIDFont null def - /ct_Level2? exch def - /ct_Clone? 1183615869 internaldict dup - /CCRun known not - exch/eCCRun known not - ct_Level2? and or def -ct_Level2? - {globaldict begin currentglobal true setglobal} -if - /ct_AddStdCIDMap - ct_Level2? - {{ - mark - Adobe_CoolType_Utility/@recognizeCIDFont currentdict put - { - ((Hex)57 StartData - 0615 1e27 2c39 1c60 d8a8 cc31 fe2b f6e0 - 7aa3 e541 e21c 60d8 a8c9 c3d0 6d9e 1c60 - d8a8 c9c2 02d7 9a1c 60d8 a849 1c60 d8a8 - cc36 74f4 1144 b13b 77)0()/SubFileDecode filter cvx exec - } - stopped - { - cleartomark - Adobe_CoolType_Utility/@recognizeCIDFont get - countdictstack dup array dictstack - exch 1 sub -1 0 - { - 2 copy get 3 index eq - {1 index length exch sub 1 sub{end}repeat exit} - {pop} - ifelse - } - for - pop pop - Adobe_CoolType_Utility/@eexecStartData get eexec - } - {cleartomark} - ifelse - }} - {{ - Adobe_CoolType_Utility/@eexecStartData get eexec - }} - ifelse bind def -userdict/cid_extensions known -dup{cid_extensions/cid_UpdateDB known and}if - { - cid_extensions - begin - /cid_GetCIDSystemInfo - { - 1 index type/stringtype eq - {exch cvn exch} - if - cid_extensions - begin - dup load 2 index known - { - 2 copy - cid_GetStatusInfo - dup null ne - { - 1 index load - 3 index get - dup null eq - {pop pop cid_UpdateDB} - { - exch - 1 index/Created get eq - {exch pop exch pop} - {pop cid_UpdateDB} - ifelse - } - ifelse - } - {pop cid_UpdateDB} - ifelse - } - {cid_UpdateDB} - ifelse - end - }bind def - end - } -if -ct_Level2? - {end setglobal} -if - /ct_UseNativeCapability? systemdict/composefont known def - /ct_MakeOCF 35 dict def - /ct_Vars 25 dict def - /ct_GlyphDirProcs 6 dict def - /ct_BuildCharDict 15 dict dup - begin - /charcode 2 string def - /dst_string 1500 string def - /nullstring()def - /usewidths? true def - end def - ct_Level2?{setglobal}{pop}ifelse - ct_GlyphDirProcs - begin - /GetGlyphDirectory - { - systemdict/languagelevel known - {pop/CIDFont findresource/GlyphDirectory get} - { - 1 index/CIDFont findresource/GlyphDirectory - get dup type/dicttype eq - { - dup dup maxlength exch length sub 2 index lt - { - dup length 2 index add dict copy 2 index - /CIDFont findresource/GlyphDirectory 2 index put - } - if - } - if - exch pop exch pop - } - ifelse - + - }def - /+ - { - systemdict/languagelevel known - { - currentglobal false setglobal - 3 dict begin - /vm exch def - } - {1 dict begin} - ifelse - /$ exch def - systemdict/languagelevel known - { - vm setglobal - /gvm currentglobal def - $ gcheck setglobal - } - if - ?{$ begin}if - }def - /?{$ type/dicttype eq}def - /|{ - userdict/Adobe_CoolType_Data known - { - Adobe_CoolType_Data/AddWidths? known - { - currentdict Adobe_CoolType_Data - begin - begin - AddWidths? - { - Adobe_CoolType_Data/CC 3 index put - ?{def}{$ 3 1 roll put}ifelse - CC charcode exch 1 index 0 2 index 256 idiv put - 1 index exch 1 exch 256 mod put - stringwidth 2 array astore - currentfont/Widths get exch CC exch put - } - {?{def}{$ 3 1 roll put}ifelse} - ifelse - end - end - } - {?{def}{$ 3 1 roll put}ifelse} ifelse - } - {?{def}{$ 3 1 roll put}ifelse} - ifelse - }def - /! - { - ?{end}if - systemdict/languagelevel known - {gvm setglobal} - if - end - }def - /:{string currentfile exch readstring pop}executeonly def - end - ct_MakeOCF - begin - /ct_cHexEncoding - [/c00/c01/c02/c03/c04/c05/c06/c07/c08/c09/c0A/c0B/c0C/c0D/c0E/c0F/c10/c11/c12 - /c13/c14/c15/c16/c17/c18/c19/c1A/c1B/c1C/c1D/c1E/c1F/c20/c21/c22/c23/c24/c25 - /c26/c27/c28/c29/c2A/c2B/c2C/c2D/c2E/c2F/c30/c31/c32/c33/c34/c35/c36/c37/c38 - /c39/c3A/c3B/c3C/c3D/c3E/c3F/c40/c41/c42/c43/c44/c45/c46/c47/c48/c49/c4A/c4B - /c4C/c4D/c4E/c4F/c50/c51/c52/c53/c54/c55/c56/c57/c58/c59/c5A/c5B/c5C/c5D/c5E - /c5F/c60/c61/c62/c63/c64/c65/c66/c67/c68/c69/c6A/c6B/c6C/c6D/c6E/c6F/c70/c71 - /c72/c73/c74/c75/c76/c77/c78/c79/c7A/c7B/c7C/c7D/c7E/c7F/c80/c81/c82/c83/c84 - /c85/c86/c87/c88/c89/c8A/c8B/c8C/c8D/c8E/c8F/c90/c91/c92/c93/c94/c95/c96/c97 - /c98/c99/c9A/c9B/c9C/c9D/c9E/c9F/cA0/cA1/cA2/cA3/cA4/cA5/cA6/cA7/cA8/cA9/cAA - /cAB/cAC/cAD/cAE/cAF/cB0/cB1/cB2/cB3/cB4/cB5/cB6/cB7/cB8/cB9/cBA/cBB/cBC/cBD - /cBE/cBF/cC0/cC1/cC2/cC3/cC4/cC5/cC6/cC7/cC8/cC9/cCA/cCB/cCC/cCD/cCE/cCF/cD0 - /cD1/cD2/cD3/cD4/cD5/cD6/cD7/cD8/cD9/cDA/cDB/cDC/cDD/cDE/cDF/cE0/cE1/cE2/cE3 - /cE4/cE5/cE6/cE7/cE8/cE9/cEA/cEB/cEC/cED/cEE/cEF/cF0/cF1/cF2/cF3/cF4/cF5/cF6 - /cF7/cF8/cF9/cFA/cFB/cFC/cFD/cFE/cFF]def - /ct_CID_STR_SIZE 8000 def - /ct_mkocfStr100 100 string def - /ct_defaultFontMtx[.001 0 0 .001 0 0]def - /ct_1000Mtx[1000 0 0 1000 0 0]def - /ct_raise{exch cvx exch errordict exch get exec stop}bind def - /ct_reraise - {cvx $error/errorname get(Error: )print dup( )cvs print - errordict exch get exec stop - }bind def - /ct_cvnsi - { - 1 index add 1 sub 1 exch 0 4 1 roll - { - 2 index exch get - exch 8 bitshift - add - } - for - exch pop - }bind def - /ct_GetInterval - { - Adobe_CoolType_Utility/ct_BuildCharDict get - begin - /dst_index 0 def - dup dst_string length gt - {dup string/dst_string exch def} - if - 1 index ct_CID_STR_SIZE idiv - /arrayIndex exch def - 2 index arrayIndex get - 2 index - arrayIndex ct_CID_STR_SIZE mul - sub - { - dup 3 index add 2 index length le - { - 2 index getinterval - dst_string dst_index 2 index putinterval - length dst_index add/dst_index exch def - exit - } - { - 1 index length 1 index sub - dup 4 1 roll - getinterval - dst_string dst_index 2 index putinterval - pop dup dst_index add/dst_index exch def - sub - /arrayIndex arrayIndex 1 add def - 2 index dup length arrayIndex gt - {arrayIndex get} - { - pop - exit - } - ifelse - 0 - } - ifelse - } - loop - pop pop pop - dst_string 0 dst_index getinterval - end - }bind def - ct_Level2? - { - /ct_resourcestatus - currentglobal mark true setglobal - {/unknowninstancename/Category resourcestatus} - stopped - {cleartomark setglobal true} - {cleartomark currentglobal not exch setglobal} - ifelse - { - { - mark 3 1 roll/Category findresource - begin - ct_Vars/vm currentglobal put - ({ResourceStatus}stopped)0()/SubFileDecode filter cvx exec - {cleartomark false} - {{3 2 roll pop true}{cleartomark false}ifelse} - ifelse - ct_Vars/vm get setglobal - end - } - } - {{resourcestatus}} - ifelse bind def - /CIDFont/Category ct_resourcestatus - {pop pop} - { - currentglobal true setglobal - /Generic/Category findresource - dup length dict copy - dup/InstanceType/dicttype put - /CIDFont exch/Category defineresource pop - setglobal - } - ifelse - ct_UseNativeCapability? - { - /CIDInit/ProcSet findresource begin - 12 dict begin - begincmap - /CIDSystemInfo 3 dict dup begin - /Registry(Adobe)def - /Ordering(Identity)def - /Supplement 0 def - end def - /CMapName/Identity-H def - /CMapVersion 1.000 def - /CMapType 1 def - 1 begincodespacerange - <0000><FFFF> - endcodespacerange - 1 begincidrange - <0000><FFFF>0 - endcidrange - endcmap - CMapName currentdict/CMap defineresource pop - end - end - } - if - } - { - /ct_Category 2 dict begin - /CIDFont 10 dict def - /ProcSet 2 dict def - currentdict - end - def - /defineresource - { - ct_Category 1 index 2 copy known - { - get - dup dup maxlength exch length eq - { - dup length 10 add dict copy - ct_Category 2 index 2 index put - } - if - 3 index 3 index put - pop exch pop - } - {pop pop/defineresource/undefined ct_raise} - ifelse - }bind def - /findresource - { - ct_Category 1 index 2 copy known - { - get - 2 index 2 copy known - {get 3 1 roll pop pop} - {pop pop/findresource/undefinedresource ct_raise} - ifelse - } - {pop pop/findresource/undefined ct_raise} - ifelse - }bind def - /resourcestatus - { - ct_Category 1 index 2 copy known - { - get - 2 index known - exch pop exch pop - { - 0 -1 true - } - { - false - } - ifelse - } - {pop pop/findresource/undefined ct_raise} - ifelse - }bind def - /ct_resourcestatus/resourcestatus load def - } - ifelse - /ct_CIDInit 2 dict - begin - /ct_cidfont_stream_init - { - { - dup(Binary)eq - { - pop - null - currentfile - ct_Level2? - { - {cid_BYTE_COUNT()/SubFileDecode filter} - stopped - {pop pop pop} - if - } - if - /readstring load - exit - } - if - dup(Hex)eq - { - pop - currentfile - ct_Level2? - { - {null exch/ASCIIHexDecode filter/readstring} - stopped - {pop exch pop(>)exch/readhexstring} - if - } - {(>)exch/readhexstring} - ifelse - load - exit - } - if - /StartData/typecheck ct_raise - } - loop - cid_BYTE_COUNT ct_CID_STR_SIZE le - { - 2 copy cid_BYTE_COUNT string exch exec - pop - 1 array dup - 3 -1 roll - 0 exch put - } - { - cid_BYTE_COUNT ct_CID_STR_SIZE div ceiling cvi - dup array exch 2 sub 0 exch 1 exch - { - 2 copy - 5 index - ct_CID_STR_SIZE - string - 6 index exec - pop - put - pop - } - for - 2 index - cid_BYTE_COUNT ct_CID_STR_SIZE mod string - 3 index exec - pop - 1 index exch - 1 index length 1 sub - exch put - } - ifelse - cid_CIDFONT exch/GlyphData exch put - 2 index null eq - { - pop pop pop - } - { - pop/readstring load - 1 string exch - { - 3 copy exec - pop - dup length 0 eq - { - pop pop pop pop pop - true exit - } - if - 4 index - eq - { - pop pop pop pop - false exit - } - if - } - loop - pop - } - ifelse - }bind def - /StartData - { - mark - { - currentdict - dup/FDArray get 0 get/FontMatrix get - 0 get 0.001 eq - { - dup/CDevProc known not - { - /CDevProc 1183615869 internaldict/stdCDevProc 2 copy known - {get} - { - pop pop - {pop pop pop pop pop 0 -1000 7 index 2 div 880} - } - ifelse - def - } - if - } - { - /CDevProc - { - pop pop pop pop pop - 0 - 1 cid_temp/cid_CIDFONT get - /FDArray get 0 get - /FontMatrix get 0 get div - 7 index 2 div - 1 index 0.88 mul - }def - } - ifelse - /cid_temp 15 dict def - cid_temp - begin - /cid_CIDFONT exch def - 3 copy pop - dup/cid_BYTE_COUNT exch def 0 gt - { - ct_cidfont_stream_init - FDArray - { - /Private get - dup/SubrMapOffset known - { - begin - /Subrs SubrCount array def - Subrs - SubrMapOffset - SubrCount - SDBytes - ct_Level2? - { - currentdict dup/SubrMapOffset undef - dup/SubrCount undef - /SDBytes undef - } - if - end - /cid_SD_BYTES exch def - /cid_SUBR_COUNT exch def - /cid_SUBR_MAP_OFFSET exch def - /cid_SUBRS exch def - cid_SUBR_COUNT 0 gt - { - GlyphData cid_SUBR_MAP_OFFSET cid_SD_BYTES ct_GetInterval - 0 cid_SD_BYTES ct_cvnsi - 0 1 cid_SUBR_COUNT 1 sub - { - exch 1 index - 1 add - cid_SD_BYTES mul cid_SUBR_MAP_OFFSET add - GlyphData exch cid_SD_BYTES ct_GetInterval - 0 cid_SD_BYTES ct_cvnsi - cid_SUBRS 4 2 roll - GlyphData exch - 4 index - 1 index - sub - ct_GetInterval - dup length string copy put - } - for - pop - } - if - } - {pop} - ifelse - } - forall - } - if - cleartomark pop pop - end - CIDFontName currentdict/CIDFont defineresource pop - end end - } - stopped - {cleartomark/StartData ct_reraise} - if - }bind def - currentdict - end def - /ct_saveCIDInit - { - /CIDInit/ProcSet ct_resourcestatus - {true} - {/CIDInitC/ProcSet ct_resourcestatus} - ifelse - { - pop pop - /CIDInit/ProcSet findresource - ct_UseNativeCapability? - {pop null} - {/CIDInit ct_CIDInit/ProcSet defineresource pop} - ifelse - } - {/CIDInit ct_CIDInit/ProcSet defineresource pop null} - ifelse - ct_Vars exch/ct_oldCIDInit exch put - }bind def - /ct_restoreCIDInit - { - ct_Vars/ct_oldCIDInit get dup null ne - {/CIDInit exch/ProcSet defineresource pop} - {pop} - ifelse - }bind def - /ct_BuildCharSetUp - { - 1 index - begin - CIDFont - begin - Adobe_CoolType_Utility/ct_BuildCharDict get - begin - /ct_dfCharCode exch def - /ct_dfDict exch def - CIDFirstByte ct_dfCharCode add - dup CIDCount ge - {pop 0} - if - /cid exch def - { - GlyphDirectory cid 2 copy known - {get} - {pop pop nullstring} - ifelse - dup length FDBytes sub 0 gt - { - dup - FDBytes 0 ne - {0 FDBytes ct_cvnsi} - {pop 0} - ifelse - /fdIndex exch def - dup length FDBytes sub FDBytes exch getinterval - /charstring exch def - exit - } - { - pop - cid 0 eq - {/charstring nullstring def exit} - if - /cid 0 def - } - ifelse - } - loop - }def - /ct_SetCacheDevice - { - 0 0 moveto - dup stringwidth - 3 -1 roll - true charpath - pathbbox - 0 -1000 - 7 index 2 div 880 - setcachedevice2 - 0 0 moveto - }def - /ct_CloneSetCacheProc - { - 1 eq - { - stringwidth - pop -2 div -880 - 0 -1000 setcharwidth - moveto - } - { - usewidths? - { - currentfont/Widths get cid - 2 copy known - {get exch pop aload pop} - {pop pop stringwidth} - ifelse - } - {stringwidth} - ifelse - setcharwidth - 0 0 moveto - } - ifelse - }def - /ct_Type3ShowCharString - { - ct_FDDict fdIndex 2 copy known - {get} - { - currentglobal 3 1 roll - 1 index gcheck setglobal - ct_Type1FontTemplate dup maxlength dict copy - begin - FDArray fdIndex get - dup/FontMatrix 2 copy known - {get} - {pop pop ct_defaultFontMtx} - ifelse - /FontMatrix exch dup length array copy def - /Private get - /Private exch def - /Widths rootfont/Widths get def - /CharStrings 1 dict dup/.notdef - <d841272cf18f54fc13>dup length string copy put def - currentdict - end - /ct_Type1Font exch definefont - dup 5 1 roll put - setglobal - } - ifelse - dup/CharStrings get 1 index/Encoding get - ct_dfCharCode get charstring put - rootfont/WMode 2 copy known - {get} - {pop pop 0} - ifelse - exch - 1000 scalefont setfont - ct_str1 0 ct_dfCharCode put - ct_str1 exch ct_dfSetCacheProc - ct_SyntheticBold - { - currentpoint - ct_str1 show - newpath - moveto - ct_str1 true charpath - ct_StrokeWidth setlinewidth - stroke - } - {ct_str1 show} - ifelse - }def - /ct_Type4ShowCharString - { - ct_dfDict ct_dfCharCode charstring - FDArray fdIndex get - dup/FontMatrix get dup ct_defaultFontMtx ct_matrixeq not - {ct_1000Mtx matrix concatmatrix concat} - {pop} - ifelse - /Private get - Adobe_CoolType_Utility/ct_Level2? get not - { - ct_dfDict/Private - 3 -1 roll - {put} - 1183615869 internaldict/superexec get exec - } - if - 1183615869 internaldict - Adobe_CoolType_Utility/ct_Level2? get - {1 index} - {3 index/Private get mark 6 1 roll} - ifelse - dup/RunInt known - {/RunInt get} - {pop/CCRun} - ifelse - get exec - Adobe_CoolType_Utility/ct_Level2? get not - {cleartomark} - if - }bind def - /ct_BuildCharIncremental - { - { - Adobe_CoolType_Utility/ct_MakeOCF get begin - ct_BuildCharSetUp - ct_ShowCharString - } - stopped - {stop} - if - end - end - end - end - }bind def - /BaseFontNameStr(BF00)def - /ct_Type1FontTemplate 14 dict - begin - /FontType 1 def - /FontMatrix [0.001 0 0 0.001 0 0]def - /FontBBox [-250 -250 1250 1250]def - /Encoding ct_cHexEncoding def - /PaintType 0 def - currentdict - end def - /BaseFontTemplate 11 dict - begin - /FontMatrix [0.001 0 0 0.001 0 0]def - /FontBBox [-250 -250 1250 1250]def - /Encoding ct_cHexEncoding def - /BuildChar/ct_BuildCharIncremental load def - ct_Clone? - { - /FontType 3 def - /ct_ShowCharString/ct_Type3ShowCharString load def - /ct_dfSetCacheProc/ct_CloneSetCacheProc load def - /ct_SyntheticBold false def - /ct_StrokeWidth 1 def - } - { - /FontType 4 def - /Private 1 dict dup/lenIV 4 put def - /CharStrings 1 dict dup/.notdef<d841272cf18f54fc13>put def - /PaintType 0 def - /ct_ShowCharString/ct_Type4ShowCharString load def - } - ifelse - /ct_str1 1 string def - currentdict - end def - /BaseFontDictSize BaseFontTemplate length 5 add def - /ct_matrixeq - { - true 0 1 5 - { - dup 4 index exch get exch 3 index exch get eq and - dup not - {exit} - if - } - for - exch pop exch pop - }bind def - /ct_makeocf - { - 15 dict - begin - exch/WMode exch def - exch/FontName exch def - /FontType 0 def - /FMapType 2 def - dup/FontMatrix known - {dup/FontMatrix get/FontMatrix exch def} - {/FontMatrix matrix def} - ifelse - /bfCount 1 index/CIDCount get 256 idiv 1 add - dup 256 gt{pop 256}if def - /Encoding - 256 array 0 1 bfCount 1 sub{2 copy dup put pop}for - bfCount 1 255{2 copy bfCount put pop}for - def - /FDepVector bfCount dup 256 lt{1 add}if array def - BaseFontTemplate BaseFontDictSize dict copy - begin - /CIDFont exch def - CIDFont/FontBBox known - {CIDFont/FontBBox get/FontBBox exch def} - if - CIDFont/CDevProc known - {CIDFont/CDevProc get/CDevProc exch def} - if - currentdict - end - BaseFontNameStr 3(0)putinterval - 0 1 bfCount dup 256 eq{1 sub}if - { - FDepVector exch - 2 index BaseFontDictSize dict copy - begin - dup/CIDFirstByte exch 256 mul def - FontType 3 eq - {/ct_FDDict 2 dict def} - if - currentdict - end - 1 index 16 - BaseFontNameStr 2 2 getinterval cvrs pop - BaseFontNameStr exch definefont - put - } - for - ct_Clone? - {/Widths 1 index/CIDFont get/GlyphDirectory get length dict def} - if - FontName - currentdict - end - definefont - ct_Clone? - { - gsave - dup 1000 scalefont setfont - ct_BuildCharDict - begin - /usewidths? false def - currentfont/Widths get - begin - exch/CIDFont get/GlyphDirectory get - { - pop - dup charcode exch 1 index 0 2 index 256 idiv put - 1 index exch 1 exch 256 mod put - stringwidth 2 array astore def - } - forall - end - /usewidths? true def - end - grestore - } - {exch pop} - ifelse - }bind def - currentglobal true setglobal - /ct_ComposeFont - { - ct_UseNativeCapability? - { - 2 index/CMap ct_resourcestatus - {pop pop exch pop} - { - /CIDInit/ProcSet findresource - begin - 12 dict - begin - begincmap - /CMapName 3 index def - /CMapVersion 1.000 def - /CMapType 1 def - exch/WMode exch def - /CIDSystemInfo 3 dict dup - begin - /Registry(Adobe)def - /Ordering - CMapName ct_mkocfStr100 cvs - (Adobe-)search - { - pop pop - (-)search - { - dup length string copy - exch pop exch pop - } - {pop(Identity)} - ifelse - } - {pop (Identity)} - ifelse - def - /Supplement 0 def - end def - 1 begincodespacerange - <0000><FFFF> - endcodespacerange - 1 begincidrange - <0000><FFFF>0 - endcidrange - endcmap - CMapName currentdict/CMap defineresource pop - end - end - } - ifelse - composefont - } - { - 3 2 roll pop - 0 get/CIDFont findresource - ct_makeocf - } - ifelse - }bind def - setglobal - /ct_MakeIdentity - { - ct_UseNativeCapability? - { - 1 index/CMap ct_resourcestatus - {pop pop} - { - /CIDInit/ProcSet findresource begin - 12 dict begin - begincmap - /CMapName 2 index def - /CMapVersion 1.000 def - /CMapType 1 def - /CIDSystemInfo 3 dict dup - begin - /Registry(Adobe)def - /Ordering - CMapName ct_mkocfStr100 cvs - (Adobe-)search - { - pop pop - (-)search - {dup length string copy exch pop exch pop} - {pop(Identity)} - ifelse - } - {pop(Identity)} - ifelse - def - /Supplement 0 def - end def - 1 begincodespacerange - <0000><FFFF> - endcodespacerange - 1 begincidrange - <0000><FFFF>0 - endcidrange - endcmap - CMapName currentdict/CMap defineresource pop - end - end - } - ifelse - composefont - } - { - exch pop - 0 get/CIDFont findresource - ct_makeocf - } - ifelse - }bind def - currentdict readonly pop - end - end -%%EndResource -setglobal -%%BeginResource: procset Adobe_CoolType_Utility_T42 1.0 0 -%%Copyright: Copyright 1987-2004 Adobe Systems Incorporated. -%%Version: 1.0 0 -userdict/ct_T42Dict 15 dict put -ct_T42Dict begin -/Is2015? -{ - version - cvi - 2015 - ge -}bind def -/AllocGlyphStorage -{ - Is2015? - { - pop - } - { - {string}forall - }ifelse -}bind def -/Type42DictBegin -{ -25 dict begin - /FontName exch def - /CharStrings 256 dict -begin - /.notdef 0 def - currentdict -end def - /Encoding exch def - /PaintType 0 def - /FontType 42 def - /FontMatrix[1 0 0 1 0 0]def - 4 array astore cvx/FontBBox exch def - /sfnts -}bind def -/Type42DictEnd -{ - currentdict dup/FontName get exch definefont end -ct_T42Dict exch -dup/FontName get exch put -}bind def -/RD{string currentfile exch readstring pop}executeonly def -/PrepFor2015 -{ -Is2015? -{ - /GlyphDirectory - 16 - dict def - sfnts 0 get - dup - 2 index - (glyx) - putinterval - 2 index - (locx) - putinterval - pop - pop -} -{ - pop - pop -}ifelse -}bind def -/AddT42Char -{ -Is2015? -{ - /GlyphDirectory get - begin - def - end - pop - pop -} -{ - /sfnts get - 4 index - get - 3 index - 2 index - putinterval - pop - pop - pop - pop -}ifelse -}bind def -/T0AddT42Mtx2 -{ -/CIDFont findresource/Metrics2 get begin def end -}bind def -end -%%EndResource -currentglobal true setglobal -%%BeginFile: MMFauxFont.prc -%%Copyright: Copyright 1987-2001 Adobe Systems Incorporated. -%%All Rights Reserved. -userdict /ct_EuroDict 10 dict put -ct_EuroDict begin -/ct_CopyFont -{ - { 1 index /FID ne {def} {pop pop} ifelse} forall -} def -/ct_GetGlyphOutline -{ - gsave - initmatrix newpath - exch findfont dup - length 1 add dict - begin - ct_CopyFont - /Encoding Encoding dup length array copy - dup - 4 -1 roll - 0 exch put - def - currentdict - end - /ct_EuroFont exch definefont - 1000 scalefont setfont - 0 0 moveto - [ - <00> stringwidth - <00> false charpath - pathbbox - [ - {/m cvx} {/l cvx} {/c cvx} {/cp cvx} pathforall - grestore - counttomark 8 add -} -def -/ct_MakeGlyphProc -{ - ] cvx - /ct_PSBuildGlyph cvx - ] cvx -} def -/ct_PSBuildGlyph -{ - gsave - 8 -1 roll pop - 7 1 roll - 6 -2 roll ct_FontMatrix transform 6 2 roll - 4 -2 roll ct_FontMatrix transform 4 2 roll - ct_FontMatrix transform - currentdict /PaintType 2 copy known {get 2 eq}{pop pop false} ifelse - dup 9 1 roll - { - currentdict /StrokeWidth 2 copy known - { - get 2 div - 0 ct_FontMatrix dtransform pop - 5 1 roll - 4 -1 roll 4 index sub - 4 1 roll - 3 -1 roll 4 index sub - 3 1 roll - exch 4 index add exch - 4 index add - 5 -1 roll pop - } - { - pop pop - } - ifelse - } - if - setcachedevice - ct_FontMatrix concat - ct_PSPathOps begin - exec - end - { - currentdict /StrokeWidth 2 copy known - { get } - { pop pop 0 } - ifelse - setlinewidth stroke - } - { - fill - } - ifelse - grestore -} def -/ct_PSPathOps 4 dict dup begin - /m {moveto} def - /l {lineto} def - /c {curveto} def - /cp {closepath} def -end -def -/ct_matrix1000 [1000 0 0 1000 0 0] def -/ct_AddGlyphProc -{ - 2 index findfont dup length 4 add dict - begin - ct_CopyFont - /CharStrings CharStrings dup length 1 add dict copy - begin - 3 1 roll def - currentdict - end - def - /ct_FontMatrix ct_matrix1000 FontMatrix matrix concatmatrix def - /ct_PSBuildGlyph /ct_PSBuildGlyph load def - /ct_PSPathOps /ct_PSPathOps load def - currentdict - end - definefont pop -} -def -systemdict /languagelevel known -{ - /ct_AddGlyphToPrinterFont { - 2 copy - ct_GetGlyphOutline 3 add -1 roll restore - ct_MakeGlyphProc - ct_AddGlyphProc - } def -} -{ - /ct_AddGlyphToPrinterFont { - pop pop restore - Adobe_CTFauxDict /$$$FONTNAME get - /Euro - Adobe_CTFauxDict /$$$SUBSTITUTEBASE get - ct_EuroDict exch get - ct_AddGlyphProc - } def -} ifelse -/AdobeSansMM -{ -556 0 24 -19 541 703 - { - 541 628 m - 510 669 442 703 354 703 c - 201 703 117 607 101 444 c - 50 444 l - 25 372 l - 97 372 l - 97 301 l - 49 301 l - 24 229 l - 103 229 l - 124 67 209 -19 350 -19 c - 435 -19 501 25 509 32 c - 509 131 l - 492 105 417 60 343 60 c - 267 60 204 127 197 229 c - 406 229 l - 430 301 l - 191 301 l - 191 372 l - 455 372 l - 479 444 l - 194 444 l - 201 531 245 624 348 624 c - 433 624 484 583 509 534 c - cp - 556 0 m - } -ct_PSBuildGlyph -} def -/AdobeSerifMM -{ -500 0 10 -12 484 692 - { - 347 298 m - 171 298 l - 170 310 170 322 170 335 c - 170 362 l - 362 362 l - 374 403 l - 172 403 l - 184 580 244 642 308 642 c - 380 642 434 574 457 457 c - 481 462 l - 474 691 l - 449 691 l - 433 670 429 657 410 657 c - 394 657 360 692 299 692 c - 204 692 94 604 73 403 c - 22 403 l - 10 362 l - 70 362 l - 69 352 69 341 69 330 c - 69 319 69 308 70 298 c - 22 298 l - 10 257 l - 73 257 l - 97 57 216 -12 295 -12 c - 364 -12 427 25 484 123 c - 458 142 l - 425 101 384 37 316 37 c - 256 37 189 84 173 257 c - 335 257 l - cp - 500 0 m - } -ct_PSBuildGlyph -} def -end -%%EndFile -setglobal -Adobe_CoolType_Core begin /$Oblique SetSubstituteStrategy end -%%BeginResource: procset Adobe_AGM_Image 1.0 0 -%%Version: 1.0 0 -%%Copyright: Copyright(C)2000-2006 Adobe Systems, Inc. All Rights Reserved. -systemdict/setpacking known -{ - currentpacking - true setpacking -}if -userdict/Adobe_AGM_Image 71 dict dup begin put -/Adobe_AGM_Image_Id/Adobe_AGM_Image_1.0_0 def -/nd{ - null def -}bind def -/AGMIMG_&image nd -/AGMIMG_&colorimage nd -/AGMIMG_&imagemask nd -/AGMIMG_mbuf()def -/AGMIMG_ybuf()def -/AGMIMG_kbuf()def -/AGMIMG_c 0 def -/AGMIMG_m 0 def -/AGMIMG_y 0 def -/AGMIMG_k 0 def -/AGMIMG_tmp nd -/AGMIMG_imagestring0 nd -/AGMIMG_imagestring1 nd -/AGMIMG_imagestring2 nd -/AGMIMG_imagestring3 nd -/AGMIMG_imagestring4 nd -/AGMIMG_imagestring5 nd -/AGMIMG_cnt nd -/AGMIMG_fsave nd -/AGMIMG_colorAry nd -/AGMIMG_override nd -/AGMIMG_name nd -/AGMIMG_maskSource nd -/AGMIMG_flushfilters nd -/invert_image_samples nd -/knockout_image_samples nd -/img nd -/sepimg nd -/devnimg nd -/idximg nd -/ds -{ - Adobe_AGM_Core begin - Adobe_AGM_Image begin - /AGMIMG_&image systemdict/image get def - /AGMIMG_&imagemask systemdict/imagemask get def - /colorimage where{ - pop - /AGMIMG_&colorimage/colorimage ldf - }if - end - end -}def -/ps -{ - Adobe_AGM_Image begin - /AGMIMG_ccimage_exists{/customcolorimage where - { - pop - /Adobe_AGM_OnHost_Seps where - { - pop false - }{ - /Adobe_AGM_InRip_Seps where - { - pop false - }{ - true - }ifelse - }ifelse - }{ - false - }ifelse - }bdf - level2{ - /invert_image_samples - { - Adobe_AGM_Image/AGMIMG_tmp Decode length ddf - /Decode[Decode 1 get Decode 0 get]def - }def - /knockout_image_samples - { - Operator/imagemask ne{ - /Decode[1 1]def - }if - }def - }{ - /invert_image_samples - { - {1 exch sub}currenttransfer addprocs settransfer - }def - /knockout_image_samples - { - {pop 1}currenttransfer addprocs settransfer - }def - }ifelse - /img/imageormask ldf - /sepimg/sep_imageormask ldf - /devnimg/devn_imageormask ldf - /idximg/indexed_imageormask ldf - /_ctype 7 def - currentdict{ - dup xcheck 1 index type dup/arraytype eq exch/packedarraytype eq or and{ - bind - }if - def - }forall -}def -/pt -{ - end -}def -/dt -{ -}def -/AGMIMG_flushfilters -{ - dup type/arraytype ne - {1 array astore}if - dup 0 get currentfile ne - {dup 0 get flushfile}if - { - dup type/filetype eq - { - dup status 1 index currentfile ne and - {closefile} - {pop} - ifelse - }{pop}ifelse - }forall -}def -/AGMIMG_init_common -{ - currentdict/T known{/ImageType/T ldf currentdict/T undef}if - currentdict/W known{/Width/W ldf currentdict/W undef}if - currentdict/H known{/Height/H ldf currentdict/H undef}if - currentdict/M known{/ImageMatrix/M ldf currentdict/M undef}if - currentdict/BC known{/BitsPerComponent/BC ldf currentdict/BC undef}if - currentdict/D known{/Decode/D ldf currentdict/D undef}if - currentdict/DS known{/DataSource/DS ldf currentdict/DS undef}if - currentdict/O known{ - /Operator/O load 1 eq{ - /imagemask - }{ - /O load 2 eq{ - /image - }{ - /colorimage - }ifelse - }ifelse - def - currentdict/O undef - }if - currentdict/HSCI known{/HostSepColorImage/HSCI ldf currentdict/HSCI undef}if - currentdict/MD known{/MultipleDataSources/MD ldf currentdict/MD undef}if - currentdict/I known{/Interpolate/I ldf currentdict/I undef}if - currentdict/SI known{/SkipImageProc/SI ldf currentdict/SI undef}if - /DataSource load xcheck not{ - DataSource type/arraytype eq{ - DataSource 0 get type/filetype eq{ - /_Filters DataSource def - currentdict/MultipleDataSources known not{ - /DataSource DataSource dup length 1 sub get def - }if - }if - }if - currentdict/MultipleDataSources known not{ - /MultipleDataSources DataSource type/arraytype eq{ - DataSource length 1 gt - } - {false}ifelse def - }if - }if - /NComponents Decode length 2 div def - currentdict/SkipImageProc known not{/SkipImageProc{false}def}if -}bdf -/imageormask_sys -{ - begin - AGMIMG_init_common - save mark - level2{ - currentdict - Operator/imagemask eq{ - AGMIMG_&imagemask - }{ - use_mask{ - process_mask AGMIMG_&image - }{ - AGMIMG_&image - }ifelse - }ifelse - }{ - Width Height - Operator/imagemask eq{ - Decode 0 get 1 eq Decode 1 get 0 eq and - ImageMatrix/DataSource load - AGMIMG_&imagemask - }{ - BitsPerComponent ImageMatrix/DataSource load - AGMIMG_&image - }ifelse - }ifelse - currentdict/_Filters known{_Filters AGMIMG_flushfilters}if - cleartomark restore - end -}def -/overprint_plate -{ - currentoverprint{ - 0 get dup type/nametype eq{ - dup/DeviceGray eq{ - pop AGMCORE_black_plate not - }{ - /DeviceCMYK eq{ - AGMCORE_is_cmyk_sep not - }if - }ifelse - }{ - false exch - { - AGMOHS_sepink eq or - }forall - not - }ifelse - }{ - pop false - }ifelse -}def -/process_mask -{ - level3{ - dup begin - /ImageType 1 def - end - 4 dict begin - /DataDict exch def - /ImageType 3 def - /InterleaveType 3 def - /MaskDict 9 dict begin - /ImageType 1 def - /Width DataDict dup/MaskWidth known{/MaskWidth}{/Width}ifelse get def - /Height DataDict dup/MaskHeight known{/MaskHeight}{/Height}ifelse get def - /ImageMatrix[Width 0 0 Height neg 0 Height]def - /NComponents 1 def - /BitsPerComponent 1 def - /Decode DataDict dup/MaskD known{/MaskD}{[1 0]}ifelse get def - /DataSource Adobe_AGM_Core/AGMIMG_maskSource get def - currentdict end def - currentdict end - }if -}def -/use_mask -{ - dup/Mask known {dup/Mask get}{false}ifelse -}def -/imageormask -{ - begin - AGMIMG_init_common - SkipImageProc{ - currentdict consumeimagedata - } - { - save mark - level2 AGMCORE_host_sep not and{ - currentdict - Operator/imagemask eq DeviceN_PS2 not and{ - imagemask - }{ - AGMCORE_in_rip_sep currentoverprint and currentcolorspace 0 get/DeviceGray eq and{ - [/Separation/Black/DeviceGray{}]setcolorspace - /Decode[Decode 1 get Decode 0 get]def - }if - use_mask{ - process_mask image - }{ - DeviceN_NoneName DeviceN_PS2 Indexed_DeviceN level3 not and or or AGMCORE_in_rip_sep and - { - Names convert_to_process not{ - 2 dict begin - /imageDict xdf - /names_index 0 def - gsave - imageDict write_image_file{ - Names{ - dup(None)ne{ - [/Separation 3 -1 roll/DeviceGray{1 exch sub}]setcolorspace - Operator imageDict read_image_file - names_index 0 eq{true setoverprint}if - /names_index names_index 1 add def - }{ - pop - }ifelse - }forall - close_image_file - }if - grestore - end - }{ - Operator/imagemask eq{ - imagemask - }{ - image - }ifelse - }ifelse - }{ - Operator/imagemask eq{ - imagemask - }{ - image - }ifelse - }ifelse - }ifelse - }ifelse - }{ - Width Height - Operator/imagemask eq{ - Decode 0 get 1 eq Decode 1 get 0 eq and - ImageMatrix/DataSource load - /Adobe_AGM_OnHost_Seps where{ - pop imagemask - }{ - currentgray 1 ne{ - currentdict imageormask_sys - }{ - currentoverprint not{ - 1 AGMCORE_&setgray - currentdict imageormask_sys - }{ - currentdict ignoreimagedata - }ifelse - }ifelse - }ifelse - }{ - BitsPerComponent ImageMatrix - MultipleDataSources{ - 0 1 NComponents 1 sub{ - DataSource exch get - }for - }{ - /DataSource load - }ifelse - Operator/colorimage eq{ - AGMCORE_host_sep{ - MultipleDataSources level2 or NComponents 4 eq and{ - AGMCORE_is_cmyk_sep{ - MultipleDataSources{ - /DataSource DataSource 0 get xcheck - { - [ - DataSource 0 get/exec cvx - DataSource 1 get/exec cvx - DataSource 2 get/exec cvx - DataSource 3 get/exec cvx - /AGMCORE_get_ink_data cvx - ]cvx - }{ - DataSource aload pop AGMCORE_get_ink_data - }ifelse def - }{ - /DataSource - Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul - /DataSource load - filter_cmyk 0()/SubFileDecode filter def - }ifelse - /Decode[Decode 0 get Decode 1 get]def - /MultipleDataSources false def - /NComponents 1 def - /Operator/image def - invert_image_samples - 1 AGMCORE_&setgray - currentdict imageormask_sys - }{ - currentoverprint not Operator/imagemask eq and{ - 1 AGMCORE_&setgray - currentdict imageormask_sys - }{ - currentdict ignoreimagedata - }ifelse - }ifelse - }{ - MultipleDataSources NComponents AGMIMG_&colorimage - }ifelse - }{ - true NComponents colorimage - }ifelse - }{ - Operator/image eq{ - AGMCORE_host_sep{ - /DoImage true def - currentdict/HostSepColorImage known{HostSepColorImage not}{false}ifelse - { - AGMCORE_black_plate not Operator/imagemask ne and{ - /DoImage false def - currentdict ignoreimagedata - }if - }if - 1 AGMCORE_&setgray - DoImage - {currentdict imageormask_sys}if - }{ - use_mask{ - process_mask image - }{ - image - }ifelse - }ifelse - }{ - Operator/knockout eq{ - pop pop pop pop pop - currentcolorspace overprint_plate not{ - knockout_unitsq - }if - }if - }ifelse - }ifelse - }ifelse - }ifelse - cleartomark restore - }ifelse - currentdict/_Filters known{_Filters AGMIMG_flushfilters}if - end -}def -/sep_imageormask -{ - /sep_colorspace_dict AGMCORE_gget begin - CSA map_csa - begin - AGMIMG_init_common - SkipImageProc{ - currentdict consumeimagedata - }{ - save mark - AGMCORE_avoid_L2_sep_space{ - /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def - }if - AGMIMG_ccimage_exists - MappedCSA 0 get/DeviceCMYK eq and - currentdict/Components known and - Name()ne and - Name(All)ne and - Operator/image eq and - AGMCORE_producing_seps not and - level2 not and - { - Width Height BitsPerComponent ImageMatrix - [ - /DataSource load/exec cvx - { - 0 1 2 index length 1 sub{ - 1 index exch - 2 copy get 255 xor put - }for - }/exec cvx - ]cvx bind - MappedCSA 0 get/DeviceCMYK eq{ - Components aload pop - }{ - 0 0 0 Components aload pop 1 exch sub - }ifelse - Name findcmykcustomcolor - customcolorimage - }{ - AGMCORE_producing_seps not{ - level2{ - //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne AGMCORE_avoid_L2_sep_space not and currentcolorspace 0 get/Separation ne and{ - [/Separation Name MappedCSA sep_proc_name exch dup 0 get 15 string cvs(/Device)anchorsearch{pop pop 0 get}{pop}ifelse exch load]setcolorspace_opt - /sep_tint AGMCORE_gget setcolor - }if - currentdict imageormask - }{ - currentdict - Operator/imagemask eq{ - imageormask - }{ - sep_imageormask_lev1 - }ifelse - }ifelse - }{ - AGMCORE_host_sep{ - Operator/knockout eq{ - currentdict/ImageMatrix get concat - knockout_unitsq - }{ - currentgray 1 ne{ - AGMCORE_is_cmyk_sep Name(All)ne and{ - level2{ - Name AGMCORE_IsSeparationAProcessColor - { - Operator/imagemask eq{ - //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ - /sep_tint AGMCORE_gget 1 exch sub AGMCORE_&setcolor - }if - }{ - invert_image_samples - }ifelse - }{ - //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ - [/Separation Name[/DeviceGray] - { - sep_colorspace_proc AGMCORE_get_ink_data - 1 exch sub - }bind - ]AGMCORE_&setcolorspace - /sep_tint AGMCORE_gget AGMCORE_&setcolor - }if - }ifelse - currentdict imageormask_sys - }{ - currentdict - Operator/imagemask eq{ - imageormask_sys - }{ - sep_image_lev1_sep - }ifelse - }ifelse - }{ - Operator/imagemask ne{ - invert_image_samples - }if - currentdict imageormask_sys - }ifelse - }{ - currentoverprint not Name(All)eq or Operator/imagemask eq and{ - currentdict imageormask_sys - }{ - currentoverprint not - { - gsave - knockout_unitsq - grestore - }if - currentdict consumeimagedata - }ifelse - }ifelse - }ifelse - }{ - //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{ - currentcolorspace 0 get/Separation ne{ - [/Separation Name MappedCSA sep_proc_name exch 0 get exch load]setcolorspace_opt - /sep_tint AGMCORE_gget setcolor - }if - }if - currentoverprint - MappedCSA 0 get/DeviceCMYK eq and - Name AGMCORE_IsSeparationAProcessColor not and - //Adobe_AGM_Core/AGMCORE_pattern_paint_type get 2 ne{Name inRip_spot_has_ink not and}{false}ifelse - Name(All)ne and{ - imageormask_l2_overprint - }{ - currentdict imageormask - }ifelse - }ifelse - }ifelse - }ifelse - cleartomark restore - }ifelse - currentdict/_Filters known{_Filters AGMIMG_flushfilters}if - end - end -}def -/colorSpaceElemCnt -{ - mark currentcolor counttomark dup 2 add 1 roll cleartomark -}bdf -/devn_sep_datasource -{ - 1 dict begin - /dataSource xdf - [ - 0 1 dataSource length 1 sub{ - dup currentdict/dataSource get/exch cvx/get cvx/exec cvx - /exch cvx names_index/ne cvx[/pop cvx]cvx/if cvx - }for - ]cvx bind - end -}bdf -/devn_alt_datasource -{ - 11 dict begin - /convProc xdf - /origcolorSpaceElemCnt xdf - /origMultipleDataSources xdf - /origBitsPerComponent xdf - /origDecode xdf - /origDataSource xdf - /dsCnt origMultipleDataSources{origDataSource length}{1}ifelse def - /DataSource origMultipleDataSources - { - [ - BitsPerComponent 8 idiv origDecode length 2 idiv mul string - 0 1 origDecode length 2 idiv 1 sub - { - dup 7 mul 1 add index exch dup BitsPerComponent 8 idiv mul exch - origDataSource exch get 0()/SubFileDecode filter - BitsPerComponent 8 idiv string/readstring cvx/pop cvx/putinterval cvx - }for - ]bind cvx - }{origDataSource}ifelse 0()/SubFileDecode filter def - [ - origcolorSpaceElemCnt string - 0 2 origDecode length 2 sub - { - dup origDecode exch get dup 3 -1 roll 1 add origDecode exch get exch sub 2 BitsPerComponent exp 1 sub div - 1 BitsPerComponent 8 idiv{DataSource/read cvx/not cvx{0}/if cvx/mul cvx}repeat/mul cvx/add cvx - }for - /convProc load/exec cvx - origcolorSpaceElemCnt 1 sub -1 0 - { - /dup cvx 2/add cvx/index cvx - 3 1/roll cvx/exch cvx 255/mul cvx/cvi cvx/put cvx - }for - ]bind cvx 0()/SubFileDecode filter - end -}bdf -/devn_imageormask -{ - /devicen_colorspace_dict AGMCORE_gget begin - CSA map_csa - 2 dict begin - dup - /srcDataStrs[3 -1 roll begin - AGMIMG_init_common - currentdict/MultipleDataSources known{MultipleDataSources{DataSource length}{1}ifelse}{1}ifelse - { - Width Decode length 2 div mul cvi - { - dup 65535 gt{1 add 2 div cvi}{exit}ifelse - }loop - string - }repeat - end]def - /dstDataStr srcDataStrs 0 get length string def - begin - AGMIMG_init_common - SkipImageProc{ - currentdict consumeimagedata - }{ - save mark - AGMCORE_producing_seps not{ - level3 not{ - Operator/imagemask ne{ - /DataSource[[ - DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse - colorSpaceElemCnt/devicen_colorspace_dict AGMCORE_gget/TintTransform get - devn_alt_datasource 1/string cvx/readstring cvx/pop cvx]cvx colorSpaceElemCnt 1 sub{dup}repeat]def - /MultipleDataSources true def - /Decode colorSpaceElemCnt[exch{0 1}repeat]def - }if - }if - currentdict imageormask - }{ - AGMCORE_host_sep{ - Names convert_to_process{ - CSA get_csa_by_name 0 get/DeviceCMYK eq{ - /DataSource - Width BitsPerComponent mul 7 add 8 idiv Height mul 4 mul - DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse - 4/devicen_colorspace_dict AGMCORE_gget/TintTransform get - devn_alt_datasource - filter_cmyk 0()/SubFileDecode filter def - /MultipleDataSources false def - /Decode[1 0]def - /DeviceGray setcolorspace - currentdict imageormask_sys - }{ - AGMCORE_report_unsupported_color_space - AGMCORE_black_plate{ - /DataSource - DataSource Decode BitsPerComponent currentdict/MultipleDataSources known{MultipleDataSources}{false}ifelse - CSA get_csa_by_name 0 get/DeviceRGB eq{3}{1}ifelse/devicen_colorspace_dict AGMCORE_gget/TintTransform get - devn_alt_datasource - /MultipleDataSources false def - /Decode colorSpaceElemCnt[exch{0 1}repeat]def - currentdict imageormask_sys - }{ - gsave - knockout_unitsq - grestore - currentdict consumeimagedata - }ifelse - }ifelse - } - { - /devicen_colorspace_dict AGMCORE_gget/names_index known{ - Operator/imagemask ne{ - MultipleDataSources{ - /DataSource[DataSource devn_sep_datasource/exec cvx]cvx def - /MultipleDataSources false def - }{ - /DataSource/DataSource load dstDataStr srcDataStrs 0 get filter_devn def - }ifelse - invert_image_samples - }if - currentdict imageormask_sys - }{ - currentoverprint not Operator/imagemask eq and{ - currentdict imageormask_sys - }{ - currentoverprint not - { - gsave - knockout_unitsq - grestore - }if - currentdict consumeimagedata - }ifelse - }ifelse - }ifelse - }{ - currentdict imageormask - }ifelse - }ifelse - cleartomark restore - }ifelse - currentdict/_Filters known{_Filters AGMIMG_flushfilters}if - end - end - end -}def -/imageormask_l2_overprint -{ - currentdict - currentcmykcolor add add add 0 eq{ - currentdict consumeimagedata - }{ - level3{ - currentcmykcolor - /AGMIMG_k xdf - /AGMIMG_y xdf - /AGMIMG_m xdf - /AGMIMG_c xdf - Operator/imagemask eq{ - [/DeviceN[ - AGMIMG_c 0 ne{/Cyan}if - AGMIMG_m 0 ne{/Magenta}if - AGMIMG_y 0 ne{/Yellow}if - AGMIMG_k 0 ne{/Black}if - ]/DeviceCMYK{}]setcolorspace - AGMIMG_c 0 ne{AGMIMG_c}if - AGMIMG_m 0 ne{AGMIMG_m}if - AGMIMG_y 0 ne{AGMIMG_y}if - AGMIMG_k 0 ne{AGMIMG_k}if - setcolor - }{ - /Decode[Decode 0 get 255 mul Decode 1 get 255 mul]def - [/Indexed - [ - /DeviceN[ - AGMIMG_c 0 ne{/Cyan}if - AGMIMG_m 0 ne{/Magenta}if - AGMIMG_y 0 ne{/Yellow}if - AGMIMG_k 0 ne{/Black}if - ] - /DeviceCMYK{ - AGMIMG_k 0 eq{0}if - AGMIMG_y 0 eq{0 exch}if - AGMIMG_m 0 eq{0 3 1 roll}if - AGMIMG_c 0 eq{0 4 1 roll}if - } - ] - 255 - { - 255 div - mark exch - dup dup dup - AGMIMG_k 0 ne{ - /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 1 roll pop pop pop - counttomark 1 roll - }{ - pop - }ifelse - AGMIMG_y 0 ne{ - /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 2 roll pop pop pop - counttomark 1 roll - }{ - pop - }ifelse - AGMIMG_m 0 ne{ - /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec 4 3 roll pop pop pop - counttomark 1 roll - }{ - pop - }ifelse - AGMIMG_c 0 ne{ - /sep_tint AGMCORE_gget mul MappedCSA sep_proc_name exch pop load exec pop pop pop - counttomark 1 roll - }{ - pop - }ifelse - counttomark 1 add -1 roll pop - } - ]setcolorspace - }ifelse - imageormask_sys - }{ - write_image_file{ - currentcmykcolor - 0 ne{ - [/Separation/Black/DeviceGray{}]setcolorspace - gsave - /Black - [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 1 roll pop pop pop 1 exch sub}/exec cvx] - cvx modify_halftone_xfer - Operator currentdict read_image_file - grestore - }if - 0 ne{ - [/Separation/Yellow/DeviceGray{}]setcolorspace - gsave - /Yellow - [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 2 roll pop pop pop 1 exch sub}/exec cvx] - cvx modify_halftone_xfer - Operator currentdict read_image_file - grestore - }if - 0 ne{ - [/Separation/Magenta/DeviceGray{}]setcolorspace - gsave - /Magenta - [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{4 3 roll pop pop pop 1 exch sub}/exec cvx] - cvx modify_halftone_xfer - Operator currentdict read_image_file - grestore - }if - 0 ne{ - [/Separation/Cyan/DeviceGray{}]setcolorspace - gsave - /Cyan - [{1 exch sub/sep_tint AGMCORE_gget mul}/exec cvx MappedCSA sep_proc_name cvx exch pop{pop pop pop 1 exch sub}/exec cvx] - cvx modify_halftone_xfer - Operator currentdict read_image_file - grestore - }if - close_image_file - }{ - imageormask - }ifelse - }ifelse - }ifelse -}def -/indexed_imageormask -{ - begin - AGMIMG_init_common - save mark - currentdict - AGMCORE_host_sep{ - Operator/knockout eq{ - /indexed_colorspace_dict AGMCORE_gget dup/CSA known{ - /CSA get get_csa_by_name - }{ - /Names get - }ifelse - overprint_plate not{ - knockout_unitsq - }if - }{ - Indexed_DeviceN{ - /devicen_colorspace_dict AGMCORE_gget dup/names_index known exch/Names get convert_to_process or{ - indexed_image_lev2_sep - }{ - currentoverprint not{ - knockout_unitsq - }if - currentdict consumeimagedata - }ifelse - }{ - AGMCORE_is_cmyk_sep{ - Operator/imagemask eq{ - imageormask_sys - }{ - level2{ - indexed_image_lev2_sep - }{ - indexed_image_lev1_sep - }ifelse - }ifelse - }{ - currentoverprint not{ - knockout_unitsq - }if - currentdict consumeimagedata - }ifelse - }ifelse - }ifelse - }{ - level2{ - Indexed_DeviceN{ - /indexed_colorspace_dict AGMCORE_gget begin - }{ - /indexed_colorspace_dict AGMCORE_gget dup null ne - { - begin - currentdict/CSDBase known{CSDBase/CSD get_res/MappedCSA get}{CSA}ifelse - get_csa_by_name 0 get/DeviceCMYK eq ps_level 3 ge and ps_version 3015.007 lt and - AGMCORE_in_rip_sep and{ - [/Indexed[/DeviceN[/Cyan/Magenta/Yellow/Black]/DeviceCMYK{}]HiVal Lookup] - setcolorspace - }if - end - } - {pop}ifelse - }ifelse - imageormask - Indexed_DeviceN{ - end - }if - }{ - Operator/imagemask eq{ - imageormask - }{ - indexed_imageormask_lev1 - }ifelse - }ifelse - }ifelse - cleartomark restore - currentdict/_Filters known{_Filters AGMIMG_flushfilters}if - end -}def -/indexed_image_lev2_sep -{ - /indexed_colorspace_dict AGMCORE_gget begin - begin - Indexed_DeviceN not{ - currentcolorspace - dup 1/DeviceGray put - dup 3 - currentcolorspace 2 get 1 add string - 0 1 2 3 AGMCORE_get_ink_data 4 currentcolorspace 3 get length 1 sub - { - dup 4 idiv exch currentcolorspace 3 get exch get 255 exch sub 2 index 3 1 roll put - }for - put setcolorspace - }if - currentdict - Operator/imagemask eq{ - AGMIMG_&imagemask - }{ - use_mask{ - process_mask AGMIMG_&image - }{ - AGMIMG_&image - }ifelse - }ifelse - end end -}def - /OPIimage - { - dup type/dicttype ne{ - 10 dict begin - /DataSource xdf - /ImageMatrix xdf - /BitsPerComponent xdf - /Height xdf - /Width xdf - /ImageType 1 def - /Decode[0 1 def] - currentdict - end - }if - dup begin - /NComponents 1 cdndf - /MultipleDataSources false cdndf - /SkipImageProc{false}cdndf - /Decode[ - 0 - currentcolorspace 0 get/Indexed eq{ - 2 BitsPerComponent exp 1 sub - }{ - 1 - }ifelse - ]cdndf - /Operator/image cdndf - end - /sep_colorspace_dict AGMCORE_gget null eq{ - imageormask - }{ - gsave - dup begin invert_image_samples end - sep_imageormask - grestore - }ifelse - }def -/cachemask_level2 -{ - 3 dict begin - /LZWEncode filter/WriteFilter xdf - /readBuffer 256 string def - /ReadFilter - currentfile - 0(%EndMask)/SubFileDecode filter - /ASCII85Decode filter - /RunLengthDecode filter - def - { - ReadFilter readBuffer readstring exch - WriteFilter exch writestring - not{exit}if - }loop - WriteFilter closefile - end -}def -/spot_alias -{ - /mapto_sep_imageormask - { - dup type/dicttype ne{ - 12 dict begin - /ImageType 1 def - /DataSource xdf - /ImageMatrix xdf - /BitsPerComponent xdf - /Height xdf - /Width xdf - /MultipleDataSources false def - }{ - begin - }ifelse - /Decode[/customcolor_tint AGMCORE_gget 0]def - /Operator/image def - /SkipImageProc{false}def - currentdict - end - sep_imageormask - }bdf - /customcolorimage - { - Adobe_AGM_Image/AGMIMG_colorAry xddf - /customcolor_tint AGMCORE_gget - << - /Name AGMIMG_colorAry 4 get - /CSA[/DeviceCMYK] - /TintMethod/Subtractive - /TintProc null - /MappedCSA null - /NComponents 4 - /Components[AGMIMG_colorAry aload pop pop] - >> - setsepcolorspace - mapto_sep_imageormask - }ndf - Adobe_AGM_Image/AGMIMG_&customcolorimage/customcolorimage load put - /customcolorimage - { - Adobe_AGM_Image/AGMIMG_override false put - current_spot_alias{dup 4 get map_alias}{false}ifelse - { - false set_spot_alias - /customcolor_tint AGMCORE_gget exch setsepcolorspace - pop - mapto_sep_imageormask - true set_spot_alias - }{ - //Adobe_AGM_Image/AGMIMG_&customcolorimage get exec - }ifelse - }bdf -}def -/snap_to_device -{ - 6 dict begin - matrix currentmatrix - dup 0 get 0 eq 1 index 3 get 0 eq and - 1 index 1 get 0 eq 2 index 2 get 0 eq and or exch pop - { - 1 1 dtransform 0 gt exch 0 gt/AGMIMG_xSign? exch def/AGMIMG_ySign? exch def - 0 0 transform - AGMIMG_ySign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch - AGMIMG_xSign?{floor 0.1 sub}{ceiling 0.1 add}ifelse exch - itransform/AGMIMG_llY exch def/AGMIMG_llX exch def - 1 1 transform - AGMIMG_ySign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch - AGMIMG_xSign?{ceiling 0.1 add}{floor 0.1 sub}ifelse exch - itransform/AGMIMG_urY exch def/AGMIMG_urX exch def - [AGMIMG_urX AGMIMG_llX sub 0 0 AGMIMG_urY AGMIMG_llY sub AGMIMG_llX AGMIMG_llY]concat - }{ - }ifelse - end -}def -level2 not{ - /colorbuf - { - 0 1 2 index length 1 sub{ - dup 2 index exch get - 255 exch sub - 2 index - 3 1 roll - put - }for - }def - /tint_image_to_color - { - begin - Width Height BitsPerComponent ImageMatrix - /DataSource load - end - Adobe_AGM_Image begin - /AGMIMG_mbuf 0 string def - /AGMIMG_ybuf 0 string def - /AGMIMG_kbuf 0 string def - { - colorbuf dup length AGMIMG_mbuf length ne - { - dup length dup dup - /AGMIMG_mbuf exch string def - /AGMIMG_ybuf exch string def - /AGMIMG_kbuf exch string def - }if - dup AGMIMG_mbuf copy AGMIMG_ybuf copy AGMIMG_kbuf copy pop - } - addprocs - {AGMIMG_mbuf}{AGMIMG_ybuf}{AGMIMG_kbuf}true 4 colorimage - end - }def - /sep_imageormask_lev1 - { - begin - MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ - { - 255 mul round cvi GrayLookup exch get - }currenttransfer addprocs settransfer - currentdict imageormask - }{ - /sep_colorspace_dict AGMCORE_gget/Components known{ - MappedCSA 0 get/DeviceCMYK eq{ - Components aload pop - }{ - 0 0 0 Components aload pop 1 exch sub - }ifelse - Adobe_AGM_Image/AGMIMG_k xddf - Adobe_AGM_Image/AGMIMG_y xddf - Adobe_AGM_Image/AGMIMG_m xddf - Adobe_AGM_Image/AGMIMG_c xddf - AGMIMG_y 0.0 eq AGMIMG_m 0.0 eq and AGMIMG_c 0.0 eq and{ - {AGMIMG_k mul 1 exch sub}currenttransfer addprocs settransfer - currentdict imageormask - }{ - currentcolortransfer - {AGMIMG_k mul 1 exch sub}exch addprocs 4 1 roll - {AGMIMG_y mul 1 exch sub}exch addprocs 4 1 roll - {AGMIMG_m mul 1 exch sub}exch addprocs 4 1 roll - {AGMIMG_c mul 1 exch sub}exch addprocs 4 1 roll - setcolortransfer - currentdict tint_image_to_color - }ifelse - }{ - MappedCSA 0 get/DeviceGray eq{ - {255 mul round cvi ColorLookup exch get 0 get}currenttransfer addprocs settransfer - currentdict imageormask - }{ - MappedCSA 0 get/DeviceCMYK eq{ - currentcolortransfer - {255 mul round cvi ColorLookup exch get 3 get 1 exch sub}exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 2 get 1 exch sub}exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 1 get 1 exch sub}exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 0 get 1 exch sub}exch addprocs 4 1 roll - setcolortransfer - currentdict tint_image_to_color - }{ - currentcolortransfer - {pop 1}exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 2 get}exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 1 get}exch addprocs 4 1 roll - {255 mul round cvi ColorLookup exch get 0 get}exch addprocs 4 1 roll - setcolortransfer - currentdict tint_image_to_color - }ifelse - }ifelse - }ifelse - }ifelse - end - }def - /sep_image_lev1_sep - { - begin - /sep_colorspace_dict AGMCORE_gget/Components known{ - Components aload pop - Adobe_AGM_Image/AGMIMG_k xddf - Adobe_AGM_Image/AGMIMG_y xddf - Adobe_AGM_Image/AGMIMG_m xddf - Adobe_AGM_Image/AGMIMG_c xddf - {AGMIMG_c mul 1 exch sub} - {AGMIMG_m mul 1 exch sub} - {AGMIMG_y mul 1 exch sub} - {AGMIMG_k mul 1 exch sub} - }{ - {255 mul round cvi ColorLookup exch get 0 get 1 exch sub} - {255 mul round cvi ColorLookup exch get 1 get 1 exch sub} - {255 mul round cvi ColorLookup exch get 2 get 1 exch sub} - {255 mul round cvi ColorLookup exch get 3 get 1 exch sub} - }ifelse - AGMCORE_get_ink_data currenttransfer addprocs settransfer - currentdict imageormask_sys - end - }def - /indexed_imageormask_lev1 - { - /indexed_colorspace_dict AGMCORE_gget begin - begin - currentdict - MappedCSA 0 get dup/DeviceRGB eq exch/DeviceCMYK eq or has_color not and{ - {HiVal mul round cvi GrayLookup exch get HiVal div}currenttransfer addprocs settransfer - imageormask - }{ - MappedCSA 0 get/DeviceGray eq{ - {HiVal mul round cvi Lookup exch get HiVal div}currenttransfer addprocs settransfer - imageormask - }{ - MappedCSA 0 get/DeviceCMYK eq{ - currentcolortransfer - {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll - {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll - {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll - {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub}exch addprocs 4 1 roll - setcolortransfer - tint_image_to_color - }{ - currentcolortransfer - {pop 1}exch addprocs 4 1 roll - {3 mul HiVal mul round cvi 2 add Lookup exch get HiVal div}exch addprocs 4 1 roll - {3 mul HiVal mul round cvi 1 add Lookup exch get HiVal div}exch addprocs 4 1 roll - {3 mul HiVal mul round cvi Lookup exch get HiVal div}exch addprocs 4 1 roll - setcolortransfer - tint_image_to_color - }ifelse - }ifelse - }ifelse - end end - }def - /indexed_image_lev1_sep - { - /indexed_colorspace_dict AGMCORE_gget begin - begin - {4 mul HiVal mul round cvi Lookup exch get HiVal div 1 exch sub} - {4 mul HiVal mul round cvi 1 add Lookup exch get HiVal div 1 exch sub} - {4 mul HiVal mul round cvi 2 add Lookup exch get HiVal div 1 exch sub} - {4 mul HiVal mul round cvi 3 add Lookup exch get HiVal div 1 exch sub} - AGMCORE_get_ink_data currenttransfer addprocs settransfer - currentdict imageormask_sys - end end - }def -}if -end -systemdict/setpacking known -{setpacking}if -%%EndResource -currentdict Adobe_AGM_Utils eq {end} if -%%EndProlog -%%BeginSetup -Adobe_AGM_Utils begin -2 2010 Adobe_AGM_Core/ds gx -Adobe_CoolType_Core/ds get exec -Adobe_AGM_Image/ds gx -currentdict Adobe_AGM_Utils eq {end} if -%%EndSetup -%%Page: 1 1 -%%EndPageComments -%%BeginPageSetup -%ADOBeginClientInjection: PageSetup Start "AI11EPS" -%AI12_RMC_Transparency: Balance=75 RasterRes=300 GradRes=150 Text=0 Stroke=1 Clip=1 OP=0 -%ADOEndClientInjection: PageSetup Start "AI11EPS" -Adobe_AGM_Utils begin -Adobe_AGM_Core/ps gx -Adobe_AGM_Utils/capture_cpd gx -Adobe_CoolType_Core/ps get exec -Adobe_AGM_Image/ps gx -%ADOBeginClientInjection: PageSetup End "AI11EPS" -/currentdistillerparams where {pop currentdistillerparams /CoreDistVersion get 5000 lt} {true} ifelse { userdict /AI11_PDFMark5 /cleartomark load put userdict /AI11_ReadMetadata_PDFMark5 {flushfile cleartomark } bind put} { userdict /AI11_PDFMark5 /pdfmark load put userdict /AI11_ReadMetadata_PDFMark5 {/PUT pdfmark} bind put } ifelse [/NamespacePush AI11_PDFMark5 [/_objdef {ai_metadata_stream_123} /type /stream /OBJ AI11_PDFMark5 [{ai_metadata_stream_123} currentfile 0 (% &&end XMP packet marker&&) /SubFileDecode filter AI11_ReadMetadata_PDFMark5 <?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> -<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 5.6-c137 79.159768, 2016/08/11-13:24:42 "> - <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> - <rdf:Description rdf:about="" - xmlns:dc="http://purl.org/dc/elements/1.1/" - xmlns:xmp="http://ns.adobe.com/xap/1.0/" - xmlns:xmpGImg="http://ns.adobe.com/xap/1.0/g/img/" - xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" - xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#" - xmlns:stEvt="http://ns.adobe.com/xap/1.0/sType/ResourceEvent#" - xmlns:illustrator="http://ns.adobe.com/illustrator/1.0/" - xmlns:xmpTPg="http://ns.adobe.com/xap/1.0/t/pg/" - xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" - xmlns:xmpG="http://ns.adobe.com/xap/1.0/g/" - xmlns:pdf="http://ns.adobe.com/pdf/1.3/"> - <dc:format>application/postscript</dc:format> - <dc:title> - <rdf:Alt> - <rdf:li xml:lang="x-default">Web</rdf:li> - </rdf:Alt> - </dc:title> - <xmp:CreatorTool>Adobe Illustrator CC 2017 (Windows)</xmp:CreatorTool> - <xmp:CreateDate>2022-11-06T13:04:23+07:00</xmp:CreateDate> - <xmp:ModifyDate>2022-11-06T13:04:24+07:00</xmp:ModifyDate> - <xmp:MetadataDate>2022-11-06T13:04:24+07:00</xmp:MetadataDate> - <xmp:Thumbnails> - <rdf:Alt> - <rdf:li rdf:parseType="Resource"> - <xmpGImg:width>256</xmpGImg:width> - <xmpGImg:height>256</xmpGImg:height> - <xmpGImg:format>JPEG</xmpGImg:format> - <xmpGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgBAAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYqgdZ17RdEs2vdYv4NPtV6zXM ixKTStAWIqfYb4q8k80f85V/l9pbPFo8Nzrk61AeNfq9vUdvUlHP6RGRiry/XP8AnLP8wLwsulWV jpcR+y3BriYf7KQiM/8AIvFWEaj+d/5sahX6x5mvE5dfqxW18en1dYqdcVSWTz957lcyS+Y9Ukc9 Xa9uCTTbqXxV0fn7z3E4ki8x6pG46Ot7cAiu3UPiqdad+d/5safT6v5mvH49PrJW68Ov1hZa9MVZ vof/ADln+YFmVXVbKx1SIfabg1vMf9lGTGP+ReKvUPK//OVf5faoyRaxDc6HO1AXkX6xb1Pb1Ihz +kxgYq9b0bXtF1uzW90e/g1C1bpNbSLKoNK0JUmh9jviqOxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KpN5o84+WfKunnUNf1CKwtt+HqEl3I/ZjjWrufZQcVfOnnz/nLLV7sy2fk 2zGn25qo1K7VZLg/5UcVTEn+y5/RirxeSXzl511r4je69q83QfvLiSlewHLior7AYqgtc0TUNE1O bTNRVY7+3IW5gR0k9N6VKM0ZZeS/tAHY7HcEYqn35e/lj5q8+akbTRYALeEj65qE1Vt4QenJqGrH sq1P0b4q+nfJX/OMn5e6DFHLq8TeYNRFC0t1VLcEfyW6njT/AIyFsVeoadoWiaYippun21ki7Ktt DHEB8ggXFXajoWiamjJqWn216jbMtzDHKD8w4bFXl/nX/nGT8vdeikl0iJvL+ompWW1q9uSf57dj xp/xjK4q+YvzC/LHzV5D1IWmtQA28xP1PUIatbzAdeLUFGHdWofo3xVINE0XUNa1KHTNORZb64JW 3hZ0jMjgVCKzlV5N+ytfiOw3IGKo6Obzl5L1o8GvdB1eH7S/vLeSle4PHkp96g4q9o8h/wDOWWr2 his/OVmNQtxRTqVoqx3A/wAqSKoif/Y8PpxV9F+V/OPlnzVp41DQNQiv7bbn6ZIdCf2ZI2o6H2YD FU5xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KtMyopdyFVRVmOwAHUk4q8H/NP/AJyf0rR2 m0nyaI9T1JapJqjfFaRN0/dgf3zDx+z/AK3TFXzfPc+c/PXmIGVrrXNbuzRFAMj08FUfCiL7AKMV e6fl7/zicWWK/wDPF2VrRv0PZsK/KacfiI/+CxVnn5qa/oH5S/l3JB5XsrfTdQ1E/VdOjgQK3Pj8 dw53ZzEn7TV+IrXFXy/+WvkHVvzA83RaVDIyxsTcanftV/ShB+NzX7TsTRR3Y+FTir7m8t+W9G8t 6NbaNo1strYWq8Y416k/tO7dWZjuSeuKpnirsVdirsVSzzJ5b0bzJo1zo2s2y3VhdLxkjbqD+y6N 1VlO4I6Yq+GfzK8g6t+X/m6XSppGaNSLjTL9ap6sJPwOKfZdSKMOzDwocVfUH5V695f/ADa/LyOD zRY2+pajpxFrqSToGYuF+C4Q7MhlXutPi5UxVgX5h/8AOJzKsl/5Hui9KsdHvG3p4Qzn8Fk/4LFX hkFz5z8i+YiYmutD1u0NHUgxvTwZT8Lo3uCpxV9IflZ/zk/pWsNDpPnIR6ZqTUSPVF+G0lbp+8B/ uWPj9n/V6Yq94VldQ6EMrCqsNwQehBxVvFXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FUu8w+YtF8u6R Pq+s3SWdhbCskz+J6KoG7Mx2Cjc4q+Qvze/P/XfOkk2laUX0zyxUr9XBpNcgd7hh+z/xWNvHltRV DflT+Qvmbzy0eoXPLSvLlfiv5F/eTAdVt4z9rw5n4R7kUxV9aeSfy+8qeS9O+o6BZLByA9e6b47i YjvLKd29h9kdgMVZHir43/5yi80Sav8AmVJpiPW00KBLZFH2fVlUTTN8/iVD/q4q9q/5xk8lRaD+ XsWryx01HzA31qViKEW6Erbp8uNZP9lir17FXYq80/5yKsI7n8p9WuPVeCfTzDc28kbFTy9VYypp 1DLIRTxoe2KvkXy9+Yvnny9cpPpGt3dsUNfS9VpIW9nhflGw+a4q+sfyR/O628/20unajEln5ks0 EksUZ/dXEXQyxA1K8SQGUk0qCD4KvVMVeQ/85N+Sote/L2XV4o66j5fb61EwFSbdyFuE+XGkn+xx V4r/AM4u+aH0j8yU0x3paa7A9s6k/D60QM0TfP4GQf62KvsjFWOedvy98qedNO+o69ZLPxBFvdJ8 FxCT3ikpUfLdT3BxV8k/mr+QvmfyM0l/BXVfLtdr+JSHhBOwuEFeP+sPhPsdsVRf5Q/n/rvkuSHS tVL6n5YqF+rk1mtge9ux/Z/4rO3hx3qq+vfL3mLRfMWkQavo10l5YXIrHMniOqsDurKdip3GKpji rsVdirsVdirsVdirsVdirsVdiqS+cPOGheUdCn1rWpxDaQiiqKGSWQj4Yol25O1P4mgBOKviX8zf zQ8xfmDrn1q9ZorCJiNN0tCTHCp2/wBnI37Td+1BQYq9h/Jj/nGpeMHmHz1BWtJLTQXH0q10Px9L /gu64q+kY444o1jjUJGgCoigBVUCgAA6AYquxV2Kvz6/Me7lvPzB8y3Mh+KTVLw060AncKv0AUxV 976FpyaZomn6ai8UsraG2VR2EUYQD/hcVR2KvNLD/nIv8p7mOQ3GrNp88LtHJb3ME3KqmlVMayKQ abb18QMVeLfn3+fdh5vsB5a8tCT9Deost7eyqY2uGjNUREPxCMNRiWFSabCm6rwvFWR/l15hufLv nnRNXgcoba7iEtK/FDI3pzKafzRswxV+guKoHXdOTU9E1DTXXkl7bTWzKe4ljKEf8Nir4I/Li7ls /wAwfLVzGfij1SzNOlQZ0DL9INMVfoLirsVWyRxyxtHIoeNwVdGAKspFCCD1BxV83fnP/wA41ACf zD5FgpSsl5oKfezWg/H0v+B7Lirx78svzQ8xfl9rn1qyZpbCVgNS0tyRHMo2/wBhIv7Ldu9RUYq+ 2vJ/nDQvN2hQa1os4mtJhRlNBJFIB8UUq78XWv8AEVBBxVOsVdirsVdirsVdirsVdirsVdiqS+cP J+hebtCn0XWoBNaTCqsKCSKQD4ZYm34utf4GoJGKviX8zfyv8xfl9rn1W9VpbCVidN1RARHMo3/2 Ei/tL27VFDir2H8mP+clQBB5e89T0pSOz15/uVbs/h6v/Bd2xV9IxyRyxrJGweNwGR1IKspFQQR1 BxVdirsVfn1+Y9pLZ/mD5ltpB8UeqXgr0qDO5VvpBrir730LUU1PRNP1JG5Je20NyrDuJYw4P/DY qjsVfn1+Yvl658veedb0idChtruX0q/tQyNzhcezRspxVjmKuxVkf5deXrnzF550TSIELm5u4jLS vwwxt6kzGn8sascVfoLiqB13UU0zRNQ1J24pZW01yzHsIoy5P/C4q+CPy4tJbz8wfLVtGPik1SzF etAJ0LN9AFcVfoLirsVWySRxRtJIwSNAWd2ICqoFSST0AxV83fnP/wA5Krxn8veRZ61rHd68h+hl tT+Hq/8AA9mxV49+WX5X+YvzB1z6rZK0VhEwOpao4JjhU7/7ORv2V796CpxV9teT/J+heUdCg0XR YBDaQirMaGSWQj4pZW25O1P4CgAGKp1irsVdirsVdirsVdirsVdirsVdiqXeYfLui+YtIn0jWbVL ywuRSSF/EdGUjdWU7hhuMVfIX5vfkBrvkuSbVdKD6n5YqW+sAVmtge1wo/Z/4sG3jx2qqhPyq/Pr zP5GaOwnrqvl2u9hKxDwgnc27mvH/VPwn2O+KvrbyT+YXlTzpp317Qb1Z+IBuLV/guISe0sdaj57 qexOKsjxV8b/APOUXleTSPzKk1NEpaa7AlyjD7PqxKIZl+fwq5/1sVe1f84yedYte/L2LSJZK6j5 fb6rKpNSbdyWt3+XGsf+xxV69iryv87vyRtvP9tFqOnSpZ+ZLNDHFLIP3VxF1EUpFSvEklWANKkE eCr5O8w/l1558vXLwavol3bFDT1fSaSFvdJk5RsPk2Ku8vfl1558xXKQaRol3clzT1TE0cK70q00 nGNfpbFX1j+SP5I23kC2l1HUZUvPMl4gjlljH7q3i6mKImhbkQCzECtAAPFV6piryH/nJvzrFoP5 ey6RFJTUfMDfVYlBoRboQ1w/y40j/wBlirxX/nF3yu+r/mSmpulbTQoHuXYj4fWlBhiX5/Gzj/Vx V9kYqxzzt+YPlTyXp317X71YOQPoWq/HcTEdoohu3ufsjuRir5K/Nb8+vM3nl5LC35aX5dr8NhG3 xzAHY3Dj7X+qPhHud8VRX5Q/kBrvnSSHVdVD6Z5YqG+sEUmuQO1up/Z/4sO3hy3oq+vfL3l3RfLu kQaRo1qlnYWwpHCnierMTuzMdyx3OKpjirsVdirsVdirsVdirsVdirsVdirsVdirTKrqUcBlYUZT uCD1BGKvB/zT/wCcYNK1hptW8mmPTNSaryaW3w2krdf3ZH9yx8Ps/wCr1xV83z23nPyL5iAlW60P W7Q1RgTG9PFWHwujexKnFXuf5ef85Ysqx2Hni1L0oo1izXenjNAPxaP/AIHFWe/mpoPl/wDNr8vJ J/K99b6lqOnE3WmvA4Zi4X47dxsyGVezU+LjXFXy/wDlr5+1b8v/ADdFqsMbNGpNvqdg1U9WEn40 NfsupFVPZh4VGKvuby35k0bzJo1trOjXK3VhdLyjkXqD+0jr1VlOxB6YqmeKuxV2KuxVLPMnmTRv LejXOs6zcra2FqvKSRupP7KIvVmY7ADrir4Z/Mrz9q35gebpdVmjZY2It9MsFq/pQg/Agp9p2Jqx 7sfCgxV9QflXoGgflL+Xcc/mi9t9N1DUT9a1GSdwrc+PwW6DdnMSfsrX4i1MVYH+YX/OWJZZbDyP aFa1X9MXiivzhgP4GT/gcVeFwW3nPz15iIiW61zW7s1diTI9PFmPwoi+5CjFX0h+Vn/OMGlaO0Or ecmj1TUlo0WmL8VpE3X94T/fN7U4+zdcVe8KqooRAFVRRVGwAHQAYq3irsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVSbzR5O8s+atPOn6/p8V/bb8PUBDoT+1HItHQ+6kYq+dPPn/OJur2hlvPJt 4NQtxVhpt2yx3A/yY5aCJ/8AZcPpxV4vJD5y8l60Oa3ug6vD9lv3lvJSvYjjyU+1QcVQOt61qGta lNqeoust9cENcTKiRmRwKF2VAq8m/aanxHc7knFU/wDy9/M7zV5D1I3eizg28xH1zT5qtbzAdOS1 FGHZlofo2xV9O+Sv+cm/y916KOLV5W8v6iaBorqr25J/kuFHGn/GQLir1DTtd0TU0V9N1C2vUbdW tpo5QfkULYq7Udd0TTEZ9S1C2skXdmuZo4gPmXK4q8v86/8AOTf5e6DFJFpEreYNRFQsVrVLcEfz 3DDjT/jGGxV8xfmF+Z3mrz5qQu9anAt4Sfqenw1W3hB68Vqase7NU/RtiqQ6HreoaJqcOp6cyx39 uS1tO6JJ6b0oHVZAy8l/ZJGx3G4BxVGxxecvOutfCL3XtXm6n95cSUr3J5cVFfYDFXtHkP8A5xN1 e7MV55yvBp9uaMdNtGWS4P8AkyS0MSf7Hn9GKvovyv5O8s+VdPGn6Bp8Vhbbc/TBLuR+1JI1Xc+7 E4qnOKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVA6zoOi63ZtZaxYQahat1hu Y1lUGlKgMDQ+43xV5J5o/wCcVPy+1Rnl0ea50OdqkJG31i3qe/pynn9AkAxV5frn/OJn5gWZZtKv bHVIh9lebW8x/wBjIDGP+RmKsI1H8kPzY0+v1jyzePx6/Vgt149Pq7S16YqksnkHz3E5jl8uapG4 6o1lcAiu/Qpiro/IPnuVxHF5c1SRz0RbK4JNN+gTFU6078kPzY1Cn1fyzeJy6fWQtr4dfrDRU64q zfQ/+cTPzAvCrare2OlxH7S82uJh/sYwIz/yMxV6h5X/AOcVPy+0tkl1ia51ydaEpI31e3qO/pxH n9BkIxV63o2g6Lolmtlo9hBp9qvSG2jWJSaUqQoFT7nfFUdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//2Q==</xmpGImg:image> - </rdf:li> - </rdf:Alt> - </xmp:Thumbnails> - <xmpMM:RenditionClass>proof:pdf</xmpMM:RenditionClass> - <xmpMM:OriginalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</xmpMM:OriginalDocumentID> - <xmpMM:DocumentID>xmp.did:37d8353c-8884-7144-be77-c5d54880a4c8</xmpMM:DocumentID> - <xmpMM:InstanceID>xmp.iid:37d8353c-8884-7144-be77-c5d54880a4c8</xmpMM:InstanceID> - <xmpMM:DerivedFrom rdf:parseType="Resource"> - <stRef:instanceID>xmp.iid:9add332c-ca0d-c84f-9434-b38dec6d3b17</stRef:instanceID> - <stRef:documentID>xmp.did:9add332c-ca0d-c84f-9434-b38dec6d3b17</stRef:documentID> - <stRef:originalDocumentID>uuid:65E6390686CF11DBA6E2D887CEACB407</stRef:originalDocumentID> - <stRef:renditionClass>proof:pdf</stRef:renditionClass> - </xmpMM:DerivedFrom> - <xmpMM:History> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:a8b69cd4-c13d-1d4c-9131-4e439ea2f3c7</stEvt:instanceID> - <stEvt:when>2022-09-01T19:44:47+07:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CC 2017 (Windows)</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:2ae90662-edb0-2a44-952c-678c5a8dd6d5</stEvt:instanceID> - <stEvt:when>2022-09-01T19:47:05+07:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CC 2017 (Windows)</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>converted</stEvt:action> - <stEvt:parameters>from application/postscript to application/vnd.adobe.illustrator</stEvt:parameters> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:b0179cf0-11b4-1e4c-bedf-4f2884d65a85</stEvt:instanceID> - <stEvt:when>2022-11-06T11:36:40+07:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CC 2017 (Windows)</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <stEvt:action>saved</stEvt:action> - <stEvt:instanceID>xmp.iid:37d8353c-8884-7144-be77-c5d54880a4c8</stEvt:instanceID> - <stEvt:when>2022-11-06T13:04:24+07:00</stEvt:when> - <stEvt:softwareAgent>Adobe Illustrator CC 2017 (Windows)</stEvt:softwareAgent> - <stEvt:changed>/</stEvt:changed> - </rdf:li> - </rdf:Seq> - </xmpMM:History> - <illustrator:StartupProfile>Web</illustrator:StartupProfile> - <xmpTPg:NPages>1</xmpTPg:NPages> - <xmpTPg:HasVisibleTransparency>False</xmpTPg:HasVisibleTransparency> - <xmpTPg:HasVisibleOverprint>False</xmpTPg:HasVisibleOverprint> - <xmpTPg:MaxPageSize rdf:parseType="Resource"> - <stDim:w>2000.000000</stDim:w> - <stDim:h>2000.000000</stDim:h> - <stDim:unit>Pixels</stDim:unit> - </xmpTPg:MaxPageSize> - <xmpTPg:PlateNames> - <rdf:Seq> - <rdf:li>Cyan</rdf:li> - <rdf:li>Magenta</rdf:li> - <rdf:li>Yellow</rdf:li> - <rdf:li>Black</rdf:li> - </rdf:Seq> - </xmpTPg:PlateNames> - <xmpTPg:SwatchGroups> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:groupName>Default Swatch Group</xmpG:groupName> - <xmpG:groupType>0</xmpG:groupType> - <xmpG:Colorants> - <rdf:Seq> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>White</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>Black</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Red</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Yellow</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Green</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Cyan</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>255</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Blue</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>RGB Magenta</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>255</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=193 G=39 B=45</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>193</xmpG:red> - <xmpG:green>39</xmpG:green> - <xmpG:blue>45</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=237 G=28 B=36</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>237</xmpG:red> - <xmpG:green>28</xmpG:green> - <xmpG:blue>36</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=241 G=90 B=36</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>241</xmpG:red> - <xmpG:green>90</xmpG:green> - <xmpG:blue>36</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=247 G=147 B=30</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>247</xmpG:red> - <xmpG:green>147</xmpG:green> - <xmpG:blue>30</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=251 G=176 B=59</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>251</xmpG:red> - <xmpG:green>176</xmpG:green> - <xmpG:blue>59</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=252 G=238 B=33</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>252</xmpG:red> - <xmpG:green>238</xmpG:green> - <xmpG:blue>33</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=217 G=224 B=33</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>217</xmpG:red> - <xmpG:green>224</xmpG:green> - <xmpG:blue>33</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=140 G=198 B=63</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>140</xmpG:red> - <xmpG:green>198</xmpG:green> - <xmpG:blue>63</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=57 G=181 B=74</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>57</xmpG:red> - <xmpG:green>181</xmpG:green> - <xmpG:blue>74</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=146 B=69</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>146</xmpG:green> - <xmpG:blue>69</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=104 B=55</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>104</xmpG:green> - <xmpG:blue>55</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=34 G=181 B=115</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>34</xmpG:red> - <xmpG:green>181</xmpG:green> - <xmpG:blue>115</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=169 B=157</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>169</xmpG:green> - <xmpG:blue>157</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=41 G=171 B=226</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>41</xmpG:red> - <xmpG:green>171</xmpG:green> - <xmpG:blue>226</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=113 B=188</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>113</xmpG:green> - <xmpG:blue>188</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=46 G=49 B=146</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>46</xmpG:red> - <xmpG:green>49</xmpG:green> - <xmpG:blue>146</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=27 G=20 B=100</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>27</xmpG:red> - <xmpG:green>20</xmpG:green> - <xmpG:blue>100</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=102 G=45 B=145</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>102</xmpG:red> - <xmpG:green>45</xmpG:green> - <xmpG:blue>145</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=147 G=39 B=143</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>147</xmpG:red> - <xmpG:green>39</xmpG:green> - <xmpG:blue>143</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=158 G=0 B=93</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>158</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>93</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=212 G=20 B=90</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>212</xmpG:red> - <xmpG:green>20</xmpG:green> - <xmpG:blue>90</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=237 G=30 B=121</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>237</xmpG:red> - <xmpG:green>30</xmpG:green> - <xmpG:blue>121</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=199 G=178 B=153</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>199</xmpG:red> - <xmpG:green>178</xmpG:green> - <xmpG:blue>153</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=153 G=134 B=117</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>153</xmpG:red> - <xmpG:green>134</xmpG:green> - <xmpG:blue>117</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=115 G=99 B=87</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>115</xmpG:red> - <xmpG:green>99</xmpG:green> - <xmpG:blue>87</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=83 G=71 B=65</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>83</xmpG:red> - <xmpG:green>71</xmpG:green> - <xmpG:blue>65</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=198 G=156 B=109</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>198</xmpG:red> - <xmpG:green>156</xmpG:green> - <xmpG:blue>109</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=166 G=124 B=82</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>166</xmpG:red> - <xmpG:green>124</xmpG:green> - <xmpG:blue>82</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=140 G=98 B=57</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>140</xmpG:red> - <xmpG:green>98</xmpG:green> - <xmpG:blue>57</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=117 G=76 B=36</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>117</xmpG:red> - <xmpG:green>76</xmpG:green> - <xmpG:blue>36</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=96 G=56 B=19</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>96</xmpG:red> - <xmpG:green>56</xmpG:green> - <xmpG:blue>19</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=66 G=33 B=11</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>66</xmpG:red> - <xmpG:green>33</xmpG:green> - <xmpG:blue>11</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=0 G=0 B=0</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>0</xmpG:red> - <xmpG:green>0</xmpG:green> - <xmpG:blue>0</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=26 G=26 B=26</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>26</xmpG:red> - <xmpG:green>26</xmpG:green> - <xmpG:blue>26</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=51 G=51 B=51</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>51</xmpG:red> - <xmpG:green>51</xmpG:green> - <xmpG:blue>51</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=77 G=77 B=77</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>77</xmpG:red> - <xmpG:green>77</xmpG:green> - <xmpG:blue>77</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=102 G=102 B=102</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>102</xmpG:red> - <xmpG:green>102</xmpG:green> - <xmpG:blue>102</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=128 G=128 B=128</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>128</xmpG:red> - <xmpG:green>128</xmpG:green> - <xmpG:blue>128</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=153 G=153 B=153</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>153</xmpG:red> - <xmpG:green>153</xmpG:green> - <xmpG:blue>153</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=179 G=179 B=179</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>179</xmpG:red> - <xmpG:green>179</xmpG:green> - <xmpG:blue>179</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=204 G=204 B=204</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>204</xmpG:red> - <xmpG:green>204</xmpG:green> - <xmpG:blue>204</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=230 G=230 B=230</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>230</xmpG:red> - <xmpG:green>230</xmpG:green> - <xmpG:blue>230</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=242 G=242 B=242</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>242</xmpG:red> - <xmpG:green>242</xmpG:green> - <xmpG:blue>242</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=63 G=169 B=245</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>63</xmpG:red> - <xmpG:green>169</xmpG:green> - <xmpG:blue>245</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=122 G=201 B=67</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>122</xmpG:red> - <xmpG:green>201</xmpG:green> - <xmpG:blue>67</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=255 G=147 B=30</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>147</xmpG:green> - <xmpG:blue>30</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=255 G=29 B=37</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>29</xmpG:green> - <xmpG:blue>37</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=255 G=123 B=172</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>255</xmpG:red> - <xmpG:green>123</xmpG:green> - <xmpG:blue>172</xmpG:blue> - </rdf:li> - <rdf:li rdf:parseType="Resource"> - <xmpG:swatchName>R=189 G=204 B=212</xmpG:swatchName> - <xmpG:mode>RGB</xmpG:mode> - <xmpG:type>PROCESS</xmpG:type> - <xmpG:red>189</xmpG:red> - <xmpG:green>204</xmpG:green> - <xmpG:blue>212</xmpG:blue> - </rdf:li> - </rdf:Seq> - </xmpG:Colorants> - </rdf:li> - </rdf:Seq> - </xmpTPg:SwatchGroups> - <pdf:Producer>Adobe PDF library 15.00</pdf:Producer> - </rdf:Description> - </rdf:RDF> -</x:xmpmeta> - - - - - - - - - - - - - - - - - - - - - -<?xpacket end="w"?> % &&end XMP packet marker&& [{ai_metadata_stream_123} <</Type /Metadata /Subtype /XML>> /PUT AI11_PDFMark5 [/Document 1 dict begin /Metadata {ai_metadata_stream_123} def currentdict end /BDC AI11_PDFMark5 -%ADOEndClientInjection: PageSetup End "AI11EPS" -%%EndPageSetup -1 -1 scale 0 -2000 translate -pgsv -[1 0 0 1 0 0 ]ct -gsave -np -gsave -0 0 mo -0 2000 li -2000 2000 li -2000 0 li -cp -clp -2000 2000 mo -0 2000 li -0 0 li -2000 0 li -2000 2000 li -cp -false sop -/0 -[/DeviceRGB] /CSA add_res -1 1 1 rgb -f -1000 1121.84 mo -1067.26 1121.84 1121.84 1067.26 1121.84 1000 cv -1121.84 932.741 1067.26 878.155 1000 878.155 cv -991.644 878.155 983.291 878.992 975.492 880.661 cv -983.569 891.802 988.302 905.448 988.302 920.209 cv -988.302 957.807 957.807 988.302 920.209 988.302 cv -905.448 988.302 891.802 983.569 880.661 975.492 cv -878.992 983.291 878.155 991.644 878.155 1000 cv -878.155 1067.26 932.741 1121.84 1000 1121.84 cv -cp -.129412 .129412 .129412 rgb -f -1221.96 1210.82 mo -1274.19 1155.86 1306.35 1081.64 1306.35 1000 cv -1306.35 918.433 1274.25 844.269 1222.09 789.314 cv -1390.49 848.169 1521.43 955.961 1570.33 1000.02 cv -1521.46 1044.13 1390.58 1152.02 1221.96 1210.82 cv -cp -778.044 789.176 mo -725.808 844.144 693.647 918.364 693.647 1000 cv -693.647 1081.57 725.754 1155.73 777.912 1210.69 cv -609.508 1151.83 478.566 1044.04 429.675 999.979 cv -478.537 955.87 609.42 847.985 778.044 789.176 cv -cp -1250.65 1000 mo -1250.65 1138.21 1138.21 1250.65 1000 1250.65 cv -861.789 1250.65 749.348 1138.21 749.348 1000 cv -749.348 861.789 861.789 749.348 1000 749.348 cv -1138.21 749.348 1250.65 861.789 1250.65 1000 cv -cp -1630.83 980.486 mo -1619.33 968.771 1345.14 693.647 1000 693.647 cv -654.857 693.647 380.672 968.771 369.167 980.486 cv -350 1000 li -369.167 1019.51 li -380.672 1031.23 654.857 1306.35 1000 1306.35 cv -1345.14 1306.35 1619.33 1031.23 1630.83 1019.51 cv -1650 1000 li -1630.83 980.486 li -cp -f -%ADOBeginClientInjection: EndPageContent "AI11EPS" -userdict /annotatepage 2 copy known {get exec}{pop pop} ifelse -%ADOEndClientInjection: EndPageContent "AI11EPS" -grestore -grestore -pgrs -%%PageTrailer -%ADOBeginClientInjection: PageTrailer Start "AI11EPS" -[/EMC AI11_PDFMark5 [/NamespacePop AI11_PDFMark5 -%ADOEndClientInjection: PageTrailer Start "AI11EPS" -[ -[/CSA [/0 ]] -] del_res -Adobe_AGM_Image/pt gx -Adobe_CoolType_Core/pt get exec -Adobe_AGM_Core/pt gx -currentdict Adobe_AGM_Utils eq {end} if -%%Trailer -Adobe_AGM_Image/dt get exec -Adobe_CoolType_Core/dt get exec -Adobe_AGM_Core/dt get exec -%%EOF -%AI9_PrintingDataEnd - -userdict /AI9_read_buffer 256 string put -userdict begin -/ai9_skip_data -{ - mark - { - currentfile AI9_read_buffer { readline } stopped - { - } - { - not - { - exit - } if - (%AI9_PrivateDataEnd) eq - { - exit - } if - } ifelse - } loop - cleartomark -} def -end -userdict /ai9_skip_data get exec -%AI9_PrivateDataBegin -%!PS-Adobe-3.0 EPSF-3.0 -%%Creator: Adobe Illustrator(R) 10.0 -%%AI8_CreatorVersion: 21.0.0 -%%For: (Maman Suryaman) () -%%Title: (Eye vector.eps) -%%CreationDate: 11/6/2022 1:04 PM -%%Canvassize: 16383 -%AI9_DataStream -%Gb"-6CQB`4EZP")JGp)TKtsje/V^lmH[+ll/l7s=7BJgq(HY9H(PFJUp,$ttm)PcsLXbV@?TZ<Pbrm8W\uQpZ>_uBC;dF)Ti=Z&E -%\&U5p^\E`IRibsdqr7;;O)P$L0+ZOj(NGn@"+O$@^A<c&pb+:Lqu$=%>]YAcm"\Zg?bcK_gGdHMJ,fK3c-&%a^]3ESoZ*l5%tF3C -%p[ZSX_uKK/ji]U_H8rWdqWsj9T%dW6DsguFI")+XmAm/R%cq:H0n$s/s6b6E9.Ia7UbCX'lBRIFIfAc+]S=q\kPk1YNoMASC+)=D -%LYk;qrJU.%]m]bF`LGKZj6*rEp/a\`rqcG7:\>*pm$EJMj_+/GiV`VGT)S6MSNcYlYED--rVV0qro;thhgt>]mjdn$^bT'?:SBhC -%Q!X[lf.Xc6$\-2a3m@Gjhu)VqB10G+9SYXOf?nIA(CpN-B7*;Ci:!8PqX3IoGL&9O5mHR#bObDamDjC&Mut^clRZD>[2_N%b2F.J -%RdH8%_U&8D`UeTXjl*s:J,8R([l0>WDr6!Aid].%q7NpbIf%%+kAUCgoo"%BB8*]m8)\CCI/Ei<]Nq`!roI(=ld/'![OZh$o^2+> -%^QYYlk2d*jKO5e#5NQg5GkKZas7dR40%`O?rS@(s^O,S0po;(793_s@abT+-8f*^G+6kE5>P'@"P[Tu8+`-hG&ld7.?SFOUO_OUV -%[kE41iq4tJKX"8F*m6Klp%HA6I>0BE;"YXZEDqYmfCltmXu-.6]B?BPqhOskl#2<e52H.]fCk0\rS`N5s7lHT$Zo^Vr4h7!N\]X% -%T:`iEqTD6t_]n.4^CJ:K^3fjmHn")1V1da&i:jhBpZ^2+.H00Kn81em2C8=qrgpUbD5H0r;XgY">ZM1a/*6cE<P#?CAmKE$.R1Ro -%?#eQ/i\LFchmi#p_I]VYDEXQ[c09msmdK]5rI$--rVdiSgu%ElqU55_qF:<Tr>)lNmo,D(nII6>]C6c+Tj=e.qAgK.hm`lM_Jclr -%Fbeh4G2YADTi(TEWjK+>C,?:4flm8o1>7G[C7jc1i%d+u^N%Ns4_S\sq"!.fg6^MnpoV#?la6ciqYGC3I(jtIWcj6ui%hYO^JU7+ -%UpaOCZ[p"9\.!4j,HY7H2kuB-NDF5\c3+!QQNmi3E>dJdh`@,c?*n\G%IhS"(\mQ<-FKPr=4Ft)A_MF3Dm]2k!5?+[RQam?DSr?< -%Zl`P*#.?OL#4cqS\UKMri\rL=\W/R_^Z`r;NGHm+\\68Y[Z\#poGK^=gN7=sVTh3:]M9?8'Q&u>Z.7^_pX?k.-Yqo8jkISXp?Co' -%ZM&[J?7XCkouCBF(TPbs*II/rXl>p:3gKU-f6cTP[X.g3CRs#-J^3nr#5V$Sm<pn#Q/>*DolV>c]Mn,khVPl?]l&2Yp11:-D[k>* -%jTkf(Wsn\8UOLbneXq-<ci%5LOkXqX;ZBgJQ:4%4J+]^?rEQBf^"Ug"Xa\h#eXtl!5PK[#7rCP`Q.5iaT=[2`h#Gosaa]8q@gqm3 -%a&bL7:\l`u)!BA<n'CaleW9Wf!W&T2hg>5=mdG)[D-bH13QLjnrHXiuoDQ5TiEK.Rnkk&@q't:RiSOtlDS*#k6e33$AaTNXl+Ct. -%hL<a)7oU[T%$dL,mGimKn,(mS=s75O(3Q>Xj)`9(j&3FT5HRHJHTqE!(:74N<gEk@]R0g0$as>&B0(M*;S=[f]l);ApS]2b$-s%o -%0"TW$p+NS;n$oO0:W78>haYL^6U\Q@p\.[ki6rXeCVA7k[t?'caH'"9qeSD;0V&")pQoB_Qd%rhI/Bksb*O2c[9&Wng)/!lpT<G[ -%6SXGZp3H).+.kO;\7JTQh,CP\kC$"rX#]B*D>Rloj*Pdb9kW%'Ska.4pr^6k4"C)5WEhacSEK!,)]W(7-iJuMA!?4ZT<1JY0>D>$ -%Lcs^qeGDsEVqU#=9u64pr_.7hg2H,#ea90[X3tahY!8C7o+d$nT)30(E!=M?:;ST/H98:/N8s<Uh6qOdUufjF]i4Q$^.7Q(Wnl=J -%U2cZDR^_ZsKr7++GjAXR_Q[GDe^A6p;bo;_A8GCs*36RC4khkLZte&]m=/0HoQT9W1EP3%7FbIupK*+>Y)c<s7-/h:\8,o$57:]i -%Ne=D@p)ME5\]naApBB#la*M3>2h1Y^7U4T4c$aN:2pfR_(+`WG1<8d,n(D4j%:$5FEP$,KPKkD2Y[5([rPdOG.pie>G-,\<c^:!k -%kO+bpiaF"$qdOCQj=^%tm9gpL<mgF-m?oD>=1,<WJT:$,gC;rBi\!1uf"oE]N*0SsNLe'^O.3DXD-PdScsFGim:#kX[OU<gARs\h -%>rWAVPZYta/r$P>gr=6Am4E1AV01RC7W-u;;?tK,lh3nSSi\j8F2+F9i9V[Y!L6G2RqZYd!iaJV:*geMp4f1lq`TsF[or;\mVVQ2 -%01>nQi2UY7gMWjr7F&Nuk0LLg]$KtE`s*HkRCL.Q2h)/`o:D(als6+u"qL;9K6G!E<-jbjj\!jg89!IqITDlGliZ/2>Ae&D8J@Rb -%g0W>70=/6sk=46<p0:'U^2"Br4"F8aS$j,VEP%23jkDa%UUtO'n<VP2$b$R[ij/#m<u=DDg;L*#A3O!P?$EhU-onIl5k!\*b6>6+ -%^9Ua\Vd&/(%X`fYoiFO=e=TDT)Z.K!lH>YsRU`tUjj]P,]JOq&qrGdp"$cVTFY]rT0CE.r$QH,EH$]&h2Xg+j^A=>.DdL0R]m\X" -%n@Plr^\ctO1E;VJc/66t)d^13&bjCKJ#hJWDgq<K#PmqohS/gE]3i8NV`.DcqUt8FDuT;&iNHV$IX]Ws&,c.aLS'_&o^08?IIm0) -%jl<PYIK$VN9Q$H9q!R;eW:]D*IfAcg+845'olDV^DpP&hHh6sMs*jt7iRe,)5NMu^JVWCW]=1S.8W2]:?h9WlmpA8,gY+=TnmhRk -%1&%<4s-(*CY<](2YQ*_[b;\;f($g"'WUVo#T>#dNeiU!nd_Ej^:M!LPQ+6>Z]>&hpS^62Bs.+6>CY93?#;6q.HIS^]^AGh,q""7H -%Dnl&#oj`JmZpnbjRS83YooF#t^A.\mf/HTV,LbnrZ^9"Qro<bASj06-:JY?3I.@*C:VZeEMe@h*gE400_r5fXhRrL7YC,eW5(:PU -%E9AIXjk]O;YCHLSqrdOLG/=0/[r:0g4b(IIo=M.g8\Y*ekp]t(A'\D,`qCp4Nfj>MT@*r>mb8Pp&0G$Ln%IlLIsiddqlaB)is->L -%](qt)]`(sgqs,>1]R/Med[O=q_2!O8q@?B:Hd:a,Y5Gk4RD4l4D;;ULnVd/1BV?E+YK'<8lL!&=?c\i7bJV[*lHRLjT>*Sf(7Tlf -%gA(1L%a3i+m?=aQiQ50Mn6]l/c%j(/k4nYl=8uFEf7(S5i_U92]IS7Y;Ic<@:mRfVRrUTT,KkrDT<6o=Ih<ZtHRj=#MhU[K%ODQq -%hNTRfKHbhp^QtSCTr_.0mItHW%cuaTJ"Q\'#cloZb#ukm\0&oHI=/a%PD57\/>`:t-r7S*IoZ3LZ4>u>-q>jb^A<=$)H6%/BfE%/ -%c0`#INc0Z?EBhT(``^<'*9D=C;Qc#N3fLHDQ5[du8*OND_U38]/h`7BqD2CtF&<T2hGHaF7m;"4A[L3j9A,@a`jg&RqagT$99&`@ -%c:2t=RdI@O>uju]$UtIJ='9XP.`P'"<6#>UG-Z.#\[-=;P&*B;20NIJ3*NZ]J$j_gBocDhb\S_3L\@86f"p4Kn;V<?=8:Qt4sd$c -%Q*d?Ueo[-#)S?K,R+"1DH!]Vohb#oRU,^Hmd[`tPS4d2ZRW%dhauRX+Pue=@n@@VcPZht$*6Y=ObIpRZTL@q=^almqbAfP![W4%M -%,tKE.2:k`m\r-'!XQOn2mq(KLgXigXCL51ff6'6ZVtFr@QNi6",VPC#7E<)IiO"eh\ins-h;6=S$IXV'R#fFq*`r1&F?CZ6Nq]I9 -%,cm&tSkcW)[(O8TSo.?Ee*1s<_9s&X)"Un!F"X1\ean)NSknO]o=[hLGW4OA]1#?*P8CbkhOX(FjknmN+t0"003rX+Ud2n_f9C<? -%+r0"mh/@a%VA"a8Bm2p)&*5X4j%sVPASjkN>ZJ\KZ4*RG8fl,;PVa)BNDa8nZK5n$0B:75NBcT#3GFU._nX6cg^[m99&5_C-tOg4 -%l,^ZI12fc'8fUG?b1')Mp*X5#?Xj2XT@6Vs>1um1N9>?u[q"#ZD*(YMd?,$')Wu*.L6:-^s0gO][s(!ZI[0odpSmiHV@U07[coB9 -%T_:)(YAM$fTA3UQ=fRa@V-(i?AsQsrjrG7JYej\^Q\%,t4fnT%=`1@C/CfV/G$4adWE:=q&iQC/=](dGFo^L%_jK;#*02)Kb&PQD -%(Q?APhES?UD`M_Pp?'TU$gb&Yp<Jf6;5JCCgQ!&EPnRAEAh.cph@&4]k$,s>aMbWQ/j159_U;InD9K0iPFI9Z7:CK4VD>"9UpEk6 -%$u^hO<ah%XR,fgB1()3pA?+J-0V!fYh?l?HlQV9F$\M0Z6Nu/Tmq"hUV6c3!L=[pD-nMn7CS#;S-66W0^R(p?QEE>&\&-(a0_;S\ -%@I$LPHOs?<?7+'&]([VSJ!DTn.7H.I\KoiD6BQJV.=ERrIEG(537_>G$Rn*ZAs-]f$mKKBbJZKcO;qiL=_6Vrjs"$V/6bu9%;CtO -%E$s,p,b*;cCf^+eZ>C?0O(R(`U?qc@/<;l\3%&UMfQaY=6aX^2*T@ctr=1$U?&<@OQ0hc2qB>:_;C&?LZ)U&4@Rch+Er!,@Z6i_M -%]nUu#7?n=s\0#kqSS,"IYut\jFEM3;]Ge3jmS^utaC[5JYDR?,p+%\0h6F3^\S#?kOtB6.L@tu,)gu'Eg_\S#SM>+sD#<3DT%WOU -%)'bOP]/2O#'$_NZN*qf<G$3jK589@?,31nj3Jtl_=n(2p=A[.d`dJO?E5ECG/n9[@1OP^1<O>=61B8UG*^o+`W<k%@WF0CkTJs/6 -%Z^N<!7;o1W'N1]_TtMd&%BMqc^Xbt?.km2OR#(puL=$3&g5He#1/g@bAn9X_)RC@8<M*<_AW9BACs.2*$8^GBZ4AZF+-,/TrZVaG -%kjijHUX$5_8f>dMJ^$nBP8]W>"8u)bJ"mWpAYMHuCokN26tHETT1:L([*^Lec=U,W\*hDE0;cp)f6$RYkFGm')G@_@lpke1J#:E; -%27#SA]/0EQcLlD9ZR=]EVWfsD:Wr,-AUUem,sc9NG,;j\m'YH'6G%r;]m\p.-!_3[%B2'GZ<Z_V.n+3c1)QYTo76f&c_AEfH]?me -%.fVCUrbP$b[Uon]/&1E,>0NEZX'52gVR8@09OA/([G>BNe#q?'jf33!KP":fYH6DdV6ANhQg,?e#gqYLlP05l02f-?W24$,Rr*;> -%\MZ5`b@t(N8%6B@?_.(Zl8B[:E;$??mac1HZG'tbij5f(O'&YgClfHKPEr6[Xk8E\Z*38,09[<XJ+mq5])=auW]t91s.?Nq*tWaZ -%VANB5KJQ&)Q!0WpZC8G3:g/]*%oQee7+1.Y@S13Rp$1D1&upS:<"_,>(6g@IZ(?=h8f#o-<O*7%/?2gPA=[CV;FLtnQ7?(['J67e -%-W.41<4&YT>#2l,Z5'lGm\t].nHc+eMQ3Mq(=]Ibl4t,;ZRK-L.U8uo'iDNWb%0q-g3$3!$]::N?FQYV62er*^LjKQ+lCJKJlUd" -%:&bqS$u4E=O2[riBo._5X9@70m\l5<W@-S$.D$>&%#S1dc(LRQMAc/oM!c\AWEdIf*.4T1#75=BPZMf+6\n(hm`*r+cIKNHf6OmK -%C,7mFaL_\[9n'3&K4`H[In-)8#&[+[8bh\#S^1X3dZ%eTE`I^R("5-O/#/s=+[5WA5'9;cpe7j\Kib[_U0:"og%_m2$4`rYd1/[[ -%LP73J0U9)5Zmf4K?f%'R.3\b./;_Qqb#gS<aOM!fYoNMW/=L'/?^/a+qodE"RkVp'-P'9N]NWb6d]A7k,sP5KK>m6";WG&5ot=r8 -%5S9,fB@jjuNfPaPpep/:OlcMN+uN\)Y79TgMq%OKGG"YOZ+YVWcX7la>jdU67+'G!W4J`\qs%Xefj@f2At>2*eQU^V)QW'pW!uD[ -%\'5Q@V#FsT<kGW\Dfa^4o;7el9(fJn\b1!U_R&=DD;&($eKpjAE2`*8C$V\Ln>$<!d6h/Pj?,rdK-'/<n)68G*b0SP[^:g8bSAFo -%+c[a(^6amCJqNDL"he0d2*RF,%'0Co54M1HE6/@AZ`;nire.?KUWg.c_lX2f-aff!;%-SY+[f63_Es#4`'f`Wh.]!.NZ65_SEW); -%,'^tQI&-Z7Ngl%iO:t(6>Y:,AL4\c,Y%0MUn*!MILN7t\\n&C;eZjKp;&RYj/1,Kn_o3&[PA]M1?d[D/+dLO4Hkc9rG,OpW;BdA] -%31e[n>h4TQr$p_(/Y169@39^UMOn]s`JDk_.K%(4S`0=?CDtL_m[dGaoc5FB6oQu6gdGd4gsqMB(HS\!W#dHpf=/dFg#SPRloRtr -%`ebWFDS3Guh8X;sdi+8^IbVAJkGjN2G!=WjBBP_S>E1gD\`:I?2r(Y/^o^9gEk<oYPE$5]eiDKNQgM<7(!5[&5E.GEFh-WXY-X<a -%`Zd:SLPpPACHQe7s7B=Ibi+)$D%`bb6_/+,=Z;*^h8i3F\.E@-^A6,ua6t\Ib1!&=)poMGK@LBsY_JWD7/%&oq.#t*=BaRA>\fkk -%O!Vhhk1;?KZ<@_--;AdR&,E;1oKB'?oYq"4SO=^@c-f:"0Bu^'4KV:%,0Y"<8e_-Wg66D$@3ibFI"#Ap:3iti;>;@ApZ,%ab#'Z% -%X\idi$3s!g1-g-XMXiU+j%FfLAY1qkEOi%tXf/,ZAc8--gK4'`/6pdGiR[IeKQ[Oe5FsqHZU$#^J62aHmB]$ip_LqCqb&Du,H111 -%P`XfTO`!oCdags.V5ta3/?cm7mh_hVH"]-O.NZ4f?oR>^M`O'\m3D),/plqjF1Fjk,AYUQ4L3lBOWFDn5Q;>/N.9pN\TRFl[f'e0 -%JL5ST[iK"%J*>#J$$0q;?8+GhX#-57R!g[8fh=s;Yd5Q#J:!aIFQY=4o5D1ohf0S8kU[\:XNI[U"5rt^jAOs%bp^9P#d.b_Cq8$7 -%0AQKKk7(*<^B_i*m:U>=\dmB;K9:n]%>AX1\Dbeoo3apb!/Em#'Z=E6%U'J5%*3G2mMgU>5fM\2Ns)BI]t5orN1s*8.s/G@#pPCd -%2\!+?7%1OB(=#*_"4g=<=,<t!k6R;^-,pP6.7@*B)^165A/7qY1hK*3SelU]CG3:)\:Hk&n.Du\:@:2,dF4gJ_o6GEZ[!ET\"#Yq -%^f)<[hJp%kZ^K/%a,^S=19f<^!*0P2eLg"<i)9uPROAj*?$PK:FK=G+e]"@;p>d\mVOC@q.BZ]PWZ8$\TZH>Z)r+BjkR*.*<ABN6 -%KW#fp=%$"&M&b?>q.!r3T6s(mUf&LQ9$(3N',kW'?8WnGFX>2<iEW@P2"a7;fiCDT/6SsHSBNI&k6T^Rl:En"<2lPG;E6`pj[@*p -%eWXORfPJ^PC5hF?-mjMbF&bhE.OC#5AR-Soe`Ek^M(9l\:eICHjK=dW9$*3Q$.TZ$<d02js*hmc)D5FtpRV>tV:rVad;f1,s1e5L -%Nh>jN@htec8RoYq'A:a-"Bqlls#4foSHg-[qfft^./K[J2kaa)g[BkMD^b5-OldnF>Z'40&g?PQ,L5`^[!B]\pP=Ce=EBH4W")Di -%\,[_d:D`fs8<cj>Pui@`l+5p)Tblm^c<J#kJQj2!^b$?)>'?!="'6DB;Ro3e[L$k:En@h_%',n:`HDdb]g[+q`0iZ4i,/c1>k&h' -%A2!@#h%t:tlRC^jcImH?F&1tkNIqiH8M2K?oZ:1S8Om)JEmkU/\V3Cg!KdkKI.EQjVUS6l6'2\o,2WK]jDNQ<<1eiB$GMt4JYMn3 -%htMYq]1LP3XKob!]'4>F"F_0r4MZNM$t*JBnbn!rLZ`;-j7Efg/2OnjJO_-XjE(%Olk=%'';$]A[+VMOG9sHR/=)^+1V&U2pA(3e -%WhrHT5o+<ThcZ;:"u!=.F"&lNFg`q]isUQ=DKEC"\b)07W&%=Q^`?JWf7EhWY;q:0+TVC[h<bn09ZIr8!`t!X[_VQo^]BjY(Z>HX -%@/KU>Jpebm#8:?n^0_'YN)99["Vi:,;Qg<@>R`:[^`#69<I8j7*=%p"?VBF*)HPCB0h<#Y,+:\q[Q5.j,D'kFr&]UD%F!1F,:ZqM -%d-L6PMYQ0LoIR(^d,mR-/i><g6X5c$pL[`uQs.A_S(Z$fC-keH7(JGN[gm?H.<k*!QW]\>D'*I(rRPip@4Bn[r.W_O=nnl-GqO,A -%)!kP#<Jq_s7/UPuj]'iJ(!pKui$Oh,ZkMQXod8j9URcngm2rC$s7#=(o=%]Hoe5$!\fkT`;k*><U8hCu?nkZkH;'tUb>*d]]5,ic -%+]*M2B9Ti)^1srQO4McS@4Nl$#YV0%LA=d'Di`',Z'/Z3hYT/EPEZo/cukT'Fd1XXUTiN24[h1B#`t7$%^i<QKh@%M="4S6Kp(+k -%\r,H`4#@/kXP+""0fYrgG$;9tZY4MU/(MdW`O7&4!r;!E*m+[bESr$P(+mX$p<nF+0<:FD0?7Cp`eI\al(6Y3V1+(-D?8*u.-s.F -%]4N^A;_ERbY,k]^a=b['76*M-cL34MDh&_j!WV<djSOR`'3aJGpa+'O]P4V#g`fKNk#<RKmlVf+LJAPte.=I1lV^cV)7RVi$0ii2 -%VN"uCFVeP319-@q<AV+l!mP'&bH8a[_C@Om@ah^\@e79Ko$HE>(+78^g#cr/I)Q%tcGf3X`/K<1?Hoa"9,eD^Om'HT[q@WFWn-$4 -%MYGWQ-Y_r6qRX6N=*Gp]c+F=J(b*-UID&J&K@G+@`_I>EC$aZ8W&f9L,BcT:W3&Ef*?Brg$W3_VXV7sU>`%:)fDup$ckrDnd:-`' -%MQm=nN:+VFa=Z!d(aJ+Y_%ro/1^Qh.C6Ql1`3tG@?,@llLr;cg]S&m>jI<o79Cu"]Uu02m-lrRj>_?iU"P7s<C"dpdL8VJqe;h+G -%LHs?)K\H'L*dB_k";)r&p>e-Y["n'%*`pjekT3X5%43)@@?Z2QbhJuL;-WCUii"*5L,`q&k5O4PL=bf.(L#cm,;bt<+Al@FE2sdm -%28cP6W&B[T[6r=P74N'k@b26^SesUYBH"7sqa"l-o>Tc&YehpE_u%dFV0_C\>2Q-^Qamp30b't7=bTQfTs.a>qP]Kq:k_8[L2bk2 -%j$gN7Q"rUYiK;/ubLMTC2P>h`$VF<,I\=n,?+@9sZb[G+T+mmprW$M!ouRQr`q<UA.;u!Y[XlS2W3Z5NA9O<!5H&p^c5TF5`f?t2 -%+nlI(s3Rm/o4$aUr>Kn4qND.?Y<.DclF&g]k1q3B+;qtW949\"M;mol^J$5+h.*ndR5M19#!S@t1WT"Zl9"=gZfXJ.%iR$L\"$?] -%p:k2?bU1L\=ooq=afl#u,'\%[5XX]VbrU*mM,jkGI\Ekt>9a#6Rpi,K:l<=k'CCSLN6#i1rNk`C8(nVpc)0-Tr$.NBR,VOH%F,9Q -%[a`/B<K#R#E'4oQFeX#!+2o\7T#Yen;>$VRc<fX-))L\'[e'(Q1>(lcn=D.74lCE`U-V#THjI_*ldeFQq.90pk=I"K;U!2"duIfK -%a=pDCDQ(&P2#,-r5LQFuGHY@<IJ*Nm_s`S,#d>seToPe(CIrJ#bmM^kJ0;:;o_#kT^-7sWh.!U&('*Vs%07N&]aIcr@NCZ3+ds0Z -%F=]n34q-<sbP8r4+7.79)+KLurN3cH]#!e>Q)Z95]bO&KLsBo+GV"0I4H/-]q<"gU`4'Wt*eu]2oXqgoP@L#+js#E6bV.Q\"^FQf -%-DF4O,do.EIZ.5H?S#'pX`0/hW8gBC0_3[sn)&G$'2O.mJYC&Z:'!k>`B&pkISf)=$s?[2\E'$L>7pWXQu&>uhX6'Ck-!0TS\GLP -%ce*<kaE>49KqIR,a-p>%;!^ULR@$STlW.&'R`o_L\OI</UPZmab8!c>mKh)Dn`H4bSgpg$S>IIAK7Rb;R8?")dG3")o&M<V8uTkn -%emK*n8J&eq&_qX38MgRZ@^s_oQB2R-$o"]o1tY2OV'e@%]*sQp*Uqn`a4)[j?;1m`G\p\glTklIW9\jqLfS$f`/Be]QMH)p\&HkA -%l_Q^GQA5j=S_$O5Zsk2gO"4<(`QM`3qCbs"Wpuc5#!&DLCrNs-S`SWu"O`7.$7"L]$b;1aLP$m$"G[SLZ:e$H5^RU3QlAF>YT^Tr -%!F-)H28k`8P1G.f/Z,<E[]0A:Nb6qYUPXF=;khAAMj]&$gCbQM*6c4<R4Q'_@O,tND/(-%PfB.C)oIC/8<(p,Zue+GH/rNDs74Nj -%DMT1T1DG$>Om+1*Vp)c90+,7be6!bC=$.lAP\uee#'Td/Ea^3H(9-g+=+"h0FH)@\OW)"(ci5"CIYaa-qudKX\t;+><\Z2$Bm@uW -%9Y1suEhZk@XWgud;b/M7%Kc(?:-De*i1S3IT't\fNMh_?AK.PUO&Sct<Re9!Hg:Y<*Fm[gG.^8S9CSHQaUO<eBLtB4*+a,-dsh.8 -%^!:-]S7]ZY<0#[OSS;^RhJf,<A]K(>k2uDZV2*70WMIO,me-SM0MhR"fDDB7;iQ:,)F$"&imC!ZXmn.MpXZXUCb.)K$Xt;J[B+2M -%$$o@`Q;:>Z5>?$10(i[s/-8^KEcUJ;:[WVF8a`[2&%C[b^Gjbi1<2DB8-<\`.hLa_=*0f[bQ=jL`cM[>!H'%-<LsY6!Oeb02h^]L -%k>I.-Gn_b?Nag$7>9"-iI3s$#CM@RsNG2m1c10=A05=_8P'T?+<hne6C-Z#%AM;jL56bFX?R_=u6IZB+]sgC&;Z4*\5Gf:%ou!Ug -%[RcC=^@pG_NIt[+CcPblIC]r5pNL8IY$.4)'a[R[QE7)?8_(cO<(@k;$4U6k`\!Rd<canXQ@oSL/NCt#g*m3:T:'^liU+1PR\DU^ -%F8F&%Z]H;l-lS3G1&64k)1=ZGDhkM\q8s[[c&'sj=NOt;_;//T!R-".cDp$,ap)WWZqEoAbt[VtlHZBkRd+dimZ\Vq;Q7:'7+N=4 -%;&`Tdh@[/>6Ts@XHLfV3"ndrZC?'bhTBh>1WN32"CMp%?31A."]g&slP8mm\Fu[?ob<lK9Mo$`s?aTag:h.i%nInFgM51!e;1@LQ -%T3L>O*9AQ.ne4OhM5,I/)L%U)hL"8;Vgh9fr?=n!&Po^J28H3P:mbd+OgRkTQk9:?jc:p0q_(lToA57EaPg_DhR;t5&*.nF#rdZ7 -%5G\+PKH\%V[I;g4Mq!l!3Q1//`HBkhZiBI6`Y68qn,s>JJi)BlG4=]*OkuDQ_kla$)__'P;i91K$&ZHFYNP&bbN(t;%F!7n/0.'h -%#Hhhkq_D7ra.qIV!S)AZl.O+am<AHuB3WiP_PQA"gY0\-7soFPj#2k.?W40'eJrpE#u+#VVP]mee+*_Q.4]_uPr^0q):GX7O__C! -%/<qNEf.8@*5dY&m7#Vfh=Rq:3SC]2rq;WA,q]b^@^t?'F-%ago5:3')#s*c#08;EN)j>6e>&jEV&c2mDgQOk6'jnCF5+bPUB9Mcu -%5cnZ[2ZqBL]Jr`DTZYA3KJ7[NK7Z8gb.0Kro4Up7dCAp4+RSZ''*rjNl$K&,D,#(d1pH2PmS1=[S=FZ1qc$td#GHkXO`01f5=-1j -%T-@(8+Gp[li?KJ/gLp.DNCuH6D8Y7OMimkrM@&P4r(m4cmobF?S_L+]LT6p%H#&h&md(A.IK$Eu#-]?De!rQbYpGBI#u6DL@+I8l -%+WD7=?kX9k7&=k"K")6RC/5U"X\mO@N9CNL(a(m_5ZH,Y?PSQDL2Z!dOj"`O*"<ORJ:LkI+L]N<VXrZ.fBgu<N!X;E^&A\M!%j&P -%R)W_DJ$Ds2<rue-W/2;hdZ0gld/<hZ_!_A@nF;%d.l7,K&jbkb_aiR_HW=2r@C/RF&HYlTl<V9F8hDX`jS5*4hXK2KY$PIUFe;jb -%Z\#Sq`FEei-;']qeV8NDO1`e'efZ4J*:\CD*0f3/DfGl*>:bDpmoI'5Hg5oP>Ydk22CGYsFn+WWE.I!O=d&c;pPcsB\n6p"lreo1 -%-KanDhK-baeWc[112b7X2CD=Zg@UBL'qDkIEk$9+di!nM43njV/EdjZA`qcHB1*OjGlI%b4DC:aBRF"QB[OHJ1N0a=c_E4=XNr*j -%)#NL:(;NT]Kl'*BUleRO3ZWkF-d7dT][\RZT6OPc8s<eK>4/1p0L@*pNA*Mu1>B+Y3on&k8NTFV1="HB3)bSeI()4(#ID=/S(pSJ -%O$=TTiGb,)GdQm*O"Bn=^[#MCCMcVnh>qC$ikN`r\E/7-4O=eg.leE7e.O^Uq[l.ZK&6f(oDn>a2R'no#7Fo#[F_o?o6L#QO"Dfo -%KBu(;gcgg.KZlKiE_MeVi.npg][#'V"^g`Fjl6=c]XrF;C[\hD]Ps.lB?CJ]D_NMiQlamEo#2(?J<FjY6Ba/J8LHie'&c=\*Sh<@ -%1_Wmm-kUtsM;Y%lO<6`5!5\37)\5%0]VCM[FAtS*5P]]VG4b9"DtfZ<[h1OA,,/Mrr*CSaj,[nHZuO0UM6o!*c1lGWLZUk&+pX-r -%o=n\(-D76D_Urmm91[,4G(Ym4=t,#gQ'pnN19SYJJ$?X"DcT`]a*7GjFdg/0ZYf.WggFpsUA"LcVtK(,`>Nt%''Za^/6Y;JcF9cP -%>*opYl<jAI;@E7$[=,380ON?Ak.TSWQssT0,K/3)R!q$I7^Q:/iHn4"";Y8PEHrale?_l4SSE`c&Fi(]O[#<Z+&;4En_$\kBkk;Q -%>;DdRZ98@`1rml::V2g_`k5Mu"(/f:3Fq<Apj#ZeI]d2hqI%.5PTP1$d"fc96]H!U9:"OCj"D+IXHB5WKg6=O]'))mf5#3sXbqJX -%a;K]7><)i"UF,]?ZsM-XFYB&lXsL0]2e6r>CtJ$qkD2p"9r/_7o\^T]+K%tS9b>qIe6ODOlgWe?.d[nY4d:uo9$(/X9P_k[;EhMX -%KVL2(5/'LY,FU<h>"X-!2_To-+-T%"UOr0ci-$AbnO#$p*f%j)0U%una.mnVmk>`A3=X#>NYq]7@J)kLkGK4?HUg;]@Zohu.QFiE -%n?gn@j?H1b31C\(?_knijr(NVV7i:0cGJ#(3Nkq%:E_P*8U5rYkE=]T?m)qEZb;n?gWjP)%)?O:j]`MsT"Y+[S=dJX`P.oBH?&BG -%E8pfpjOa-u6N,gKYRd<NrQ-EZs4L'ZbrQB!n3V28gd'2cAUVpq&"`7KrMPUA%BCGrRk8>i6pD/!Um_n/AW[nUkb1`cRjN"]GA^5A -%>@,[O):i^h]2USk=#74mT-8J0:MLcjHr8;o-!i5eQ/YsRT3?IDobT2%?_[]Y]'EdH4uE#O,tt(b1of^R*-2HRaGcU9Jj%HX@kn@. -%EsXTpRYTlJ04Quf(7DT=%D$kCjW..:H)OsMgO,ri%&i\"bF_.]HQ1qY]cd9KeG*@86u'C6c,2cDM[?]25YhW,?U<;iF4d)H&7(,3 -%=&iI'7ii+eC[St&-]-(8"RLD`hLF8/fhP>i1D?u',hi+`%>*pHA:kuabbQFF4]^H]rp9mRc`6NH@PL*?MKf?h$e=?*ak:7-*f%J1 -%9s.(p5B"/=gY$];d[`nI,#.'D.P2J38fruR;4K'K7LEZk98FMKR1iYc&QMG^,-GWd7+_\YZjk3Ob)1D-'lQfE<,8.!M7:\_W"L:c -%6^%d!#t"WD]E]nSQ3mu[2>=6OgIk*;mVCUXFr"D$!6,dh*A5j[1anJjV6V>4ZH;HphcE`hX/i=+7CH'ZY4N2Rc=cjs`Qt0T`qLtt -%&"PdqL"^k.FEd3I?:HfneK\._W`o[.%`)leeo?I2D23nSm"o.16t5!m,#P?#kn+OUM`\H?]TCBHq*(/,ATl.d)c@2e=PY"J17p.1 -%\%:TcK!82tofS9IoWp"Hbm!@XWpp+Tj+1Zs$F9qQbGCB.<ItDYl.SuE;PP>i@-)(T<r)h+Q?@n,=!l8,1?N]Dma'&B.p("(^W8=b -%>dUOnTDN&EacGD]b]]c4niO1DX0'%_Z$<!s4OCL'jcs6dGGr^"]cd9KeG*@8">5arafs,hjh%;!?'T0hgNO"VW/>^$X^t#dC0WKC -%`R9f=O;ca,\a)aa&t9DAlc!NbY;b?-o30Z+V%D&.i/-_nYg_-tSZ8jUi/VI.T!'9sQ<AknGa`(j"7g8G5"&K[E^%FZ;K$NOmpVW& -%6=*.%hl#)":,J)uA46K)*Kk4ep`frF?!9g'@mK-pFfink(t)i!DK)=nIuVdS`f?O7FA(n>M"AlsI=k>,rGs!&q5V=bmnpGnYr8)R -%lXNiYcL[E.f2#6acVPWX:doE+l\U65,/!l7p:L>^8n<:l-Z,PTj1H$Ag@)/rOIN&S4fu"U9g9\4CAR$e]9M7o:GY2kIdfI0#LAF. -%BA=$\gg-MCYmr/2D9pOqrVR(LP6]F\3,QNoRZ0u%d="hsRcCF6.FpO=B^-in.Pb7\Vo)k'OSkmBZpW06k^U6<IPaJGY&6NBX$U^- -%TP-R\`m7t:f)b76-NlMa]q5l&59\[o4G(8J=4`t(5::1q?:gp\(tC9Xa4]lFO.($Kb)ee\iI6AW5Ju`!)5Z(J:=[[1l6eU"ZX*OJ -%egpX68$Ub7AGkXqmAPoe)&CtpGO<T"SRoueTk_-"Wck`8_':=^=Lj@M)FcRUKCO!:dkWT=n`G@UWtBXGM8O]?0cBG.kD,i$*p/t' -%o?PU&IP3p7/4Y0h,'b0#J(2:;f+-:>,5`_'#H(fMreEIu;JjPqqt7Ka*Wir\1nR^m(QIDNmsfTPmeM>n*+(mXp<QhbS'QSa_cYX' -%XIjn\bEK+Xs4D<B9]"N%JOA"VGA2EM_qC+*1uOr,r5i$3W`P0Kbu"&BUBn:5&^Wd2iTP@B'3]q!a!X\)rPSsF/"Rp#;dAaM1cmM: -%O+#O&KlQgM&%c8]T)G0>)piQ0o^PYRm4%+#dcW53HQm`tOS*GE-6qEYPl/@.o".llAocZQHiB8.OR[G?4&*utWGs*9oErJJ(Y=gd -%>Y3N9O`TOP#74+3l6meXT'g70rT6N$rJW]H1I<ss\YfLYn!s/l3q+ZkJpuS&M8e/e%/J#'T+m9+H^W6qVsD*`npZpqj3,Qu:#c-c -%ep,I$2-R*PPQtm&cYf`P]]46<Fcrd3S[[jR/cP"V=.^?2[:ftJO+<Brp;o$ck,:8>m=KM>A7kp];mG+`:WDrMSL*rC2SZ;[&giZg -%[+3LMKah8='&B+*W]TH`2/+c#SL;$25:YLF2VFWi:5R3d=g:mD]53j<`_Q'"qbN0B,+]PeMIJPK+DA$gmWU+$QKsBMI[Up7c&&(T -%`(tI6]lRYP>jKcTW%R[TII+(#MXa:ehu)l2f=uV.iq9o"YCHS1?];#]ps##+rq8F&Qh7oI4FQtlq:jMq`S\E-j7hFqL&Pt>*S0mq -%/STrl<j^_*M"?!=S%SY2b)K)nU2PCZs8;i1inkjM6a/KHr?(_(J!IeKVbmCn]&<':LO](@e)B%/]^*&:TKT8SI!>h[`UaRh]cjlZ -%qWkDDX2JiYYOUp3Dr88j^NfJ?`LGIThu<089/V7tjmgTbQdQ\bZ@;W3mb8QHhRrgLq"36(9CI<#],*,mJ+MFXceeWun=O[?s+=\8 -%mf2d/eoK>2s&s&+'X<'Ao4H7+1S"o[MD;or%`b^=PfJ'O;d']]s&A=<p1+NhAkJm>EkP&=(g':"4/7UGLV1Lb^)hqJgdl;XO;I/3 -%+<=;?qARg+kF3U;mdQ20eU/Sl],l"*.2hm1F>M*l43[#MW!l*#jX/(&4O!%ZQ=4V(XZ)I5N'ibH(KS<7o4#CAi,PjI9h'5C>],3N -%"M8T?Da]MGb6m6hj`s:d1X5$CU:qBK.G+6SUa73%gO2BtTe6Qfq&3d-PiW+4.fApSK%%FZ).-N^6AVVLk*>08MToQ^2`RGo&>al. -%YdM@gDN^qh#JVJES([6;2^7;uJ+Zo!ZHd1T3@&o$j^uM1%p?nQ`klUD2ettGJ4G:(nsuROWN=B)of+<:MQ1*s_=*O&Z/^9FDM3k? -%a&B[>EXde,H;Z_u&EGu.21j$fd1Ye8l$@kW%q2`?bee="]XA53\l_/BL]GH1YAN21(5-e1[$S[fC:IO0WOYQ(e#_Rfk8S^"2Jsu! -%a9S,.7CkEKgZ8>`$H]!c14E@I3_+IS<*\L(1;n@.9YV_+G?>1rdOVq-Gkd6pAEsk[/D$,=<)dDFKr**K=Z$AjjY4g2:"#t?-:",5 -%^h(#d)/qX[oTX4/7S_h,VG,G21)jkJ7>c>[['%R==f,8`M9#G*7%JjST8^.U8!0M-MtB>&+3N'nor">>iF:@-[XZ_*Ib)oM8.h5. -%$Q%*h%998CiY+=p<mfY50TL<Ep;>s`D'mBJakkl-P-lPBi_YOFg;A<H.oka&>&]n[,;YD*o;=H4T=B-DIT^HE=0uaJDgi&W&K.8g -%#q(gKp1d6kFdaVEV6YfY+NT9gN'eG&7YlI;fDs'q$aNn2A[=S2=4@NL4M.doj,N9<14W\.\='T>pZEF1mVB#fQaIY(MK\CQ:&b`R -%LYmUU&UVX'^6bt^]B;uI4ob3p\\kk;lPKQF;q\WUDnc,/2fJ\PS'YNUIIk@#qd!htr9WU%^]3a5Cd9a[6o&5/b-bc1TOdW95/W@M -%Gh#.4XD^4Z*m\^CcWkCS29UH+[5?WkmSr7\J.#F*9rbK8$aV?`33dS:?@ddJ+u3ng"lVNT<1-$uT.Eu1;B2"(eN73I/+gPF%F]&N -%7dTTLV2%m+,5e^aFeIs#ZgI_i6CH/GiDfL+S?c01&+n.:'e[H#n#`a#MX05qD_B[.R*dM&B53\1'uoi[9,.I3Cb5qE'F?KQ[MH)# -%aY^GeedgB-6jWO&d$72r0X&D$p8m-2U]q^hMJ'>C-=+RhY\@4hrJg`Tp<I!jY%dbJZ($A;G&\R?4dB1erfKWKSeVMrcS!X=&eH18 -%XKua82@$#D\Er*86[$Vl<3`l_(X,05'&h,UP-;49o7BPgD17Z(8bN\-1QL!d2E(pu0='0>[t(L_iV(nIf3*:X.QaN/oi8H$_^`9Q -%#U+@5[L?m4.L\^'M?ET>fs"KhR7(nScb_/`a?[&qXD;W6Qr',SFls@fFGQ$;AFZ@'732RtY-0%L#\TRRh!Pj@/?LtS7L@g"+'5I5 -%*O>@h)$8@&;_Ieg//i?Io'AK\41s9Fd;81.dbHr4:+XVa.*OB<oBl-*n*HmjIZ_\VU2pdO1kIm7DJN2hDG`(u?I+3eSkFQ:,M7G< -%:AqKlem?b,EVnu:%_(>D55,Er6Y3<Pi$+>:X^@u<))<(EH2j@aS1HFMFTFiA?6]esFb4Tf&[Q%<%$sP(,-O\DW"JBAG$h!s2c02Y -%]crTRZV6,Q4<rL,mBuktp>TE+Y'iYjRKf\'pa)5GOL^Pu5[t91qp`?5l@Btfa>f%O)MIR;0[*T,9>i"i::,hY-*)@2K!>V+o+!lc -%G]^sl(KpS]@\LoL.$H3L:uUdod0\MQclaGl[B!guOiOBL2?tI_.Pu#H7MQ6.'O_FOE[k5lD"ic[<RD>o798:R!q_UDk&DLo@f7L0 -%/_m2.9$!P9AP19tX-5ulL@p84e;?Nnl\2D%JEg2J;EI<cQ!J[;1)p(DnsW4CB5Wl3N!>.f,&>9eej_!5&_.@SQIl>AjW'q-'VGr_ -%KV2hO\&q<:SCOpI(<B$%a>[hQeg/^cOtB*l[r&fe)7h7l1028=3?P6gaToAO#%"fI\PLcqdlQj'S-BhV0EFlPi:I.PA)TBuo.$pq -%HTFIu_5QZ6g6.UpU3t"6.*)^!KPYANB<j+jPJ4k^[U/Ch:eE]Y"!4j,dAW6PC.dLo38C65JfHr[;[5(O;gbmpfEm9?U\$kZ6X<Hk -%BA/nOQMsFl.>GE%Ub/m4L5-\dDY:L1$bZRIftO;r1IV8nDScgSE\tl["'m]B9I#J0/[G9WMG/a^D^^NYEAfXK`aZ"E0N9AL"9?<t -%WCF-sdnQpSN#0X>4G1!6b+,bcWg!DS]J=EB^9'aeaMM@-M8Dpipsk[f5_=r+QaFBfWqq/UPp9^@2M/7ajRDE#Q)Z(q'fj+%pT.(Q -%V'_T`OI*YTBW^jg)8VVeHS*"6]m-SkhnBVWH_4m9JgNMbI:M%6qh$BMCg57?Eg"PsCg1<`!D_.SX_eI*X_a9'gU:&d&J!3)>EF!* -%BqDfB/_%3qi+obQ0N10=fsUs!-Gi,.[Oq&K0Z@YY$;n5[=Z(*O![5RSBe.,)`BZ4rJcCTq&DXW]egQF"f!Ilk.e9L,[]ll)f?J3e -%ngapn(7=ALfDanUMA3JHlD1kj&7ml'>K[dq9,0)9/6a_i1tre3>toItg:"edEtVgI[OkWbCP3SO9NtV5ZH$c5>I#CCK`3dFQEUO\ -%aKaF+jC=WmR2kQs?k`pFhj@P>l:@nUc)N)&>m>,u)RVt>?RG#iB%'p4BJ48OP5QV_fWd/EOYs:7E.\oe&5m2JB?AV@i2,)[Z[t<, -%bH0C'K$7M46#9/aE+;Z%NBJdW3F99W$TkHr[Bl@/6B+%&2s)Z-BbZPr3D5qp41MqGZY*Pp[*)1(JOj5+g9[='/5_cQ22`SoVQ(2q -%kV7#B=kM:LjMH(;JGg0?^K*uPD!XfcC1\ltV\uN4BcDDb^JhnK[A?m1DqpYLM\n<im9,upAgm.CA@$)q.ZmgF9X\i`=l?iHK,QA3 -%oYJ547MsBCSSD3(?BNp?qX[0tQG8\leR%"rfsU8J-u7Ds=;$8h`(Ed9QGQ]BZE/2;$f0V^4$N/@63oW/^oDEmG&8WVF/0Bj+dORO -%k=+CKI6!_;PT.,;+^9p&1!E>mb>K*^j1Y^p>.@Ocj2d_1hurWa5i,lE<A=D*U(Pmirf9NN=+*@.&V,am1)7I"m!Za9<pCZhA7-[C -%AKY(WX6;3Ai9`So_-eV^b<EVH6nFO*?*Rmq'P2Hl:)<7H>/@9UB)4Jr1bT%MBZZrHX9[];8S,OgW_6j#XAR\Mh5kMT`S?>W)0@Wo -%UHc.`m+1lVIUR.tX6cR_5GFt7%LEEcV6':6%g_9PSDG9;\1g?:^mc\_Ec01A?$bW?PV!r]ZEa9.KA7'g4(tYs)j.'-bn\dAJWpl_ -%T<U6C[HM^UIj!5QOfEdPR6qO#FBL;uRR[o_OK[h"6#:%`Krt.RZ/#T-Eq]ouW$*r?jmEn;[6`ri&#X^OT^.G*\TGlbX:9G;=(]&K -%7[prf$bg#^*R-Z:>tc:t\d+G1UUL.fb--)NmN@0YDO+qILG2P@BjK4NKN-p(gUN"M!j$3FEGuN8k`dDYF<@4CI+kU_,Ri=PA^K4, -%8Adn,mThY6+^2'5T]RYU'k!#gnBFsh?CYWjNQkNqX_C3cS$OeD#r:f"]nO=47;cl;Qb*VMrAc`WIj&`!S)%KY,B'2Ec!cD8lOlkb -%(rBTO`Q*C]Z5&7mf.9P^1lN%#VX1;M22kq4Jc<I)o>7<PFR(l=&W3l/Eu[MfSYapKQOEIpf-)d*3d\7Z=4tmZg7=!QS$5KPcu[@\ -%JN-nJ^;6KuVq=qW:.0&VRd%i#b+L34i9X6^b1;V5>j+oOb4]\ci_#0XB3BP!k=^KQLJuU6Ftq(8]S,_.CP8fGZ!V,?e52?-m#bLr -%,)/0Hi9k_Rdg:#=U_1'7`.",h][sN/jhDTL/>Sr9du[t.D"AVc.!8%-0.JAnisE^lB_p0!d$SMQ-Uh,_.B^srGH`4>M,K:OrYa9. -%@3ms)j^DnLC_Y@>OualcL%#mV3rmUK/%DJH[?/4urDldalrMfPpf+eH9!B/KA;e.eU8aId<eAHu6X?:<*IJt7h3q.V%-=]$YCZQN -%>Tkei2N"IsZF&%ZL'r\u<@F'EY"kAhDUceV&DcojZ<?rk%.iu<7X<PhQ#G9XCCTdE/mA)P_<=O:Xl43XN7b_D@:%O4DLQB2)('Tu -%gi4?&Lk9n]kIIGrS$t;J2#)sR3iAc9c7p]mD2pL:Fj,i!2WqJH[a+2f@<5%2/rDJ`dP=M%:<'6pd9V`kDostAgMV>iK,l+9MqG@W -%@E/X474d8Mm2Kn`/3@;+a6qP:(Nlp^;s^2^?T'iR=q&&!#hu`S[>-ZWet"s/k7-plp+?754PJ_,_D^[S%s;pA6esTPoMEaFg2o6! -%.+l]gRZQj/:tGd>h)%8/V@FLt2gVFW'Up0/L;B`q_FVD*\8:h7BU@2@Xhn$rb62`uB`#Hi66"=;:fu*QglnmGdUAQpZI;-K9Nu,A -%SmU^[f<ioJ*kc%+.V^NfC8%3R'M$l20[F"7`#g;eAZ(71n<E&p>SsJE+F@Zpg$"%jfbDJ5=]6sM;`@lnJ%^<)\'-AW\+O20ph-#[ -%kA2gl=N079I^LCRVGPNYo5YUH9sEJ$#X2"'HTgc!_hF0Si)o?23Q7TTXMr8]R4Z',fsZR]Q/S^%imrSM[eb^7"KuY!efW@F*jLC_ -%C6i.XWe7;RU6M_e!EN'oNgOKs?g*O^!Hf^/?P[r9J5KGi_'7?^DD[aZ@o2m!!fQ]Yk[BTmN&=(A2/S&-j+qZK@M;g)&<Ru8MU:WB -%1Ec!ummAbq[P"4neu6A/BlTkYTqk+q?.Ld[;+s&.\i<El9lq3d&m?UpKBi7$dT'3'=GO_#?.>)F.87+qVF$03-lYjQ5@:,('88tp -%Q\ncYkoWY$aDo%]QN5;=PI`1;C]q2G9##)Vg8^$i/Ltr)APu7X'Qg>,<94+f11i'ZHKo1?LJ:Qtf0giR9!2Z:3[n[T=k++T(&L8< -%;H;9GA@PS\@o905DOQ\Xj401F$l,-qZpIF;/.l@u79C-+7^;cP'SA5I.,/F6H*#4=p/JZSaiTX]]s=TKlgWC`m'jmuq1[Z.YAE+I -%+&A,[\Y1%@AIp/Y]M>>Mcb[t[D-^Vp8B<_gCebjAYZbH2Kb\7OO9?:LVfj<7;E?X'2=(AbACcGq%HL)<E\s<kb"^@'@oG>k0bOs@ -%9\k0VZ8VL=WmBT[<G9C`&L3V_)6?^t7&Hs+]hX]deA]L(?;_G:l1flY*N=Q5=+Z#[lUKN5$uQ02UV:Y\mjinO6gJ8WD%u.NbD**1 -%9C*lW>6\73>@m-!Q@U^ZIA%$^;canWTLs<BVA;]Glm2C*3T$aFW\mCd;m*4u6F9`%*h-W9Tot^A^K(*Q&oMCGS>,[Jaj$iLS#.&. -%[?j@h)'T2geMR;]VNQP_dJs;Z=sq8NI:ko:;F@9Ld&2/rl$>A[06n$S.+!?T'('nHG%B9UlE$;;105L():hUM+$'Uc@`q,bHi\0Q -%(G=te*\)5')QeabS8XLnpFoPNP8(kBqGWA_\,,FdL#)s9Cu<g[>:@sfIQ8qZmV&eIjAh2>JE>.Q#>7L_^SLoQ8na8_%*0"pXYa92 -%CH1HNAPTM.qQ34nbfJq3_=7oNCO^)ofWFQ6qM!c/YAE+ITc[g$er9!!'MH;"?Z!p;`tu<"VIlI:TQ8Yc7!CW,)8S^C6bdM.ikRD# -%jcoI8]@G#bR-=3ZPlW;=K`4[BC^d,Q>.^dnW`=/gbh`LW!EWaeJ:p_CF$,Os8C.]G%!,<B#UORpBk'k1V\iWi!<q'O7OFpjYLY0B -%./$WPe]H2a_Hn,8'_%+SV]+Z"HXV7a^X/HXQ!Lh@k_B:BF]9'AkX!JTk@>G(+NoC7:7-mD"tAR5+e>JfFNUp:a:Q!<>R6Q!gmVQ9 -%;qaTEUbK)W8:"ja=og8C%lJt70^RWL<P;83U5NX_GX_d*Ht,gCO)Bl.a0o$96+-gQZ!3'tZZIHTllW4<K:lZ3TeWM;UOhA)>gKYG -%3>t)=m#]g;qJZET"^/79g#;Ga1A/[G4?Tc?fc<\>LSrg:/oq99;_eEk`Y%`K\S9kEimBg(ZlB\hPFOdNha:JR/AmJ-&#sbV<'4-S -%UmdB2d(-UfG3_tIV`aSMa2Tf<BW1[!Z:8P(Fg]B5<I<3\P%W0pgE5,t/k5-\oaAHAXfd(F+#X.I$&C^7FjXX%SZH35#GYdda]r"2 -%B\b+L))6+-E1u7JHX0CNBA/nOQArWjGjKQ)As_or>t4^6IlkEl)rR"K><8uMfTG-lKPa!L8->/;=i@L+"b^BCLpj7e0pi>jRT_gJ -%BKIq"aNIi2E+,1D_!4o[V*3:qQBG\4"3dlKL?US!j&6o9`'Sl4^W^'BX1E!-O(e]9$oXCeZ0.UD!D7Di>IL1*XIl$HT<kHsBMCi: -%C'tuR-P?j)is$VOX\4U9E53nL)en@u^TPNY5]A[:I&!cOUI#idlkZ>'7h8Gc<;jhR#Jao_SF5nLnG]I\d_Z&>&em\pV8/2O[lRXp -%+_4^CnH/bI&UE=)"&:Sual3R%Ke4hu/dA!4P\/ckWQWBAL>_;34qQt=!q)b9%fh8^qYR_j!I.2c6J''Zi;?,=aZY"O]#gVi[."(r -%#D`fYn,Y!n.Ae.OJEja)irK8_;p`&'iWh.KA@rsKJGf\?OIBus&HpJP9-#2^YbU_?/uS079tEXV0q87V.Bdo*;=.g6U'TEDFU01) -%"J7BdrV+Jd1gm9(.J?<Ee&b<qoX]PgMdt[s;s`*/DZ)nOJ$3\Gcp;M^\9d)fk28P&%JK7$%h6<pTKd(^j=tnVP@6+s]<YKBR@O=* -%J#ZB4<eL>](KtLf:mk7j:N`tXSlb&KfXH"eLPE(S<*ElmVK]=b2ZeFH>[PEW=kf&()m%pGcEmlWmh`D<JR2KWfMeEM.;7dM7[m`; -%ABjF922X*hIm(QnS'WXsB^5m+k:[HEY_C3,L]U)gGt<L]j?0;IMj!\)!_:@X<.Uh*gip4raa%-BUZ=PA^eo+n=g1?:H"_c(j?0ld -%;0"7u?ji.hkQ2"2H$k0qjP1W_"j)&fJ:loF`5"ZZrL+0dcFo(k%$*2`PahssN#4R91iSCY%lJ#K3KH&MT]A5d^eo,(f"aRl*c/'s -%aEb-YK?1H>"%UG?J:fF?Y!j<i5d#e\3'OJK*Gj\S/aC.!E@pOm_/U67Y_C)Bi.48U>3(5Zj#lsAK8fEK"%U@Vlp5j6\*/Gr19Q<Q -%3&&Y<%icGL!=2n;S4=\]0[<#s*#Wt22Qo)X%B$s0`XQG\ZT7+(!H0"tYXQQW#XQ5072ba?3b?7.%:fRIH"@J1o;?JgEW1:%L#.J` -%fgT,SqZD7P>@cMS2EY1O!,.0I%hmRqj#id'?Y8g46Ua`f;/-3di,$(Z6bN(^NkdW(0u(k<h(.3gnKG$Bq`SBP'B[[n9MU>U@Sm.X -%PLh>kKJ@7<%:#\u0bZq/#Ps.k_9s=Cb+)p:mFDRib;oa3+"B&a@<h&c2%6\?0'l;GQ!Lb>=<sN6^$db!;,p;r)M/aoJlb$Sd)[Nc -%I2:a2"4("GH(!*3;r$;@WgR32%)p]]Ef*$P=gJh]3GG_e:ml,cWWW,sNFKB*\+Apu!FFBlV.5j@Nm\9Ljg:uc+qeOPAigk72.dj0 -%-6Lu&T_MJ0nmq$"UR3O_ZE3hTN*XY=W2rqaWQ+WNH(>Weh('/]Z@WDY;]E]Ig0UsifUC/;gUD=`<c^.O"?R=KcDqs'h/%nZ2.t,2 -%!gIoUF19^qZ,Qe1;r`+rCe6J<p<&n7:\F,$agD\pfIDO,Xq&e-cZWN>[<BsE-ECb9atL+WpDMkeO/fZB.=UR4NXY7jFEpu+l0Osn -%V$]d"\:^K^;>U,=0od'm9>h#edE7tg:N[V?P;O_Vf/5@EBR$BeS/^+m[EF;*Bgqo2NrAc69#.%KWCFte=,RiB[3Gc_QSd?"Es0Pq -%00gdZpSSGW.&R#=MCA#\C'+Tc?(GF8Fg&3878F;UO'5gCoU=!3cSWeNVE<PUq1[Z*YA<%D+)?nR&-E`XBFm_efmI.d3pUYf-WFAM -%3'\@\Wdg-GgLk;h8;`<fdk<39A*UHYJj%=8J#1<YT'=.2odh"sd\!t,On8QI9++=*Df$4p1iDsc7b+YC6j:-Ue#Cc4;c/<eMXi5I -%-?)j90_OHq0ZL`)C@%8f<`)k^d#+?$ca3Ke'f-$Kat(>t>1__Y7W=-f^6W-W?G':FDr6V`-FkQmc@PCMVq.mh):DruTVDcW("Ag( -%Wr/PnnJ]B7>Y-B((SVSo4BCSYH`Ak^,;4q"+"F<<M"IUr+W&;jH@DPH_(49Loh,T6qbE,RD;c2`@@VbR-,ZkfG;dsb3DO=jUR3*l -%+iaj8YenpLYJXq83q\5r)PoUFmW:3lKSt/tZnC'k;B;@^.!BBQ[sk#0b:D=+oLG(-_-)[Br<Ws\l-sAH%=":tOn<<QJ87dB"Odb- -%%F0MAYJ\Lm1)@(:.J?G:.?+b.%DeTA)04Pf3]tmtG,N*F?e=/lX4fH&8"-)-pIl@[0!!!CfhR9A/$#TqeYjop6R:W!>uTu%CE1eV -%YN(<Mbp5Y^NF:*))lGS[-fSN<9gTEqI3'H_-pA:?DZ)nOJ$3\GcnDd="1OLOk*Q1BYI;s7&k<Wl>;BZ&<g,;!K]j,68*6+td4Z40 -%$u)Gjb+)oOFdnGTV<=40Y?)JeNM#K3D3S]#IJ*:0L":i^f<1g\"$\PImW68'^8-f'kg3kKk77(fenrEqCaa49pOj1u*TRYD=p@4H -%@(\!V=)..7mtK?#e.LOFL*uBXh6JFsHAETuNP(ht^5n$:0$'GH\G$9s7R14pJ2M.%m'Y;?41#q:P%@3HA2e>_;Zh"oTeeElWT1QG -%@JW&b[leQfkVl<s@o?h$T^DmJ"*No1e@cEu2KqjhZHAU_aP.in'Xh_I*"h!\-EkTt3i"hKE_.pgGs-ue.dOYJFTW*f@2X!NDTHj> -%lA4kd@DB$m<nP4(W&Ang:,S4rno8\8)b:n[p1Xgp0_YYC6s2ToOVb)qLg*<=0Oh%DeZdZ=,(jP&kD_1`r`\\EIrVOQU4",&!.>VP -%-19^GTJY^f'EgpCf=](<09!;1%bDIsNl4Bsen/*Y\:\P64VKC(,*CRj`&m`4P9"d^0\Wh8='4LRRZJV1^g/1:CCe]c,AHG!ltH^D -%SiR&pnE>`Mc61aO>0S+=%5khOYG8d&6W>9T<[g,gount@SVZA)d?(e)?-cQp#'4WX%2,siX^eJaI:-71dFXHT\E(1&XfK-/K3;\f -%9e#F*ek<CcD]iifc3U[eQK#1P=:9>p+Y4X@%GPtR*F2qe)p%OY"#CG&`R_9DS:1oJ]pXcpM]N:@2EtIP<-P?.TUA"O5cBF##/@kP -%;e)uUFeC@C(C6_ddg77r\Pit7gab.)Zp/Fr;>6D4C4C*$kG!+4rNP2@S9G8(:2QA2g<'Y"1kHL/4a:/Keg7CBG$=Up103Fg/TSF" -%)qMQ"jD\dZg_Mban'm0lV6-2E[e45[7U-JVj]<C9_`2/FOeFTKF@+F=V<m-gYdoHK>_V!mhUPY&,A_nRSSA/f<f\DsrF$pGg0^gb -%j=P)2m$lR1NI4r=>'ChJ:,Q!,3])e?kfami!=>l+!MUg;Njd-h;Phsu.WWC^;smW&1\Zb8o%]ir6DOEn[EJKe>=JG_oqoX>PaN)+ -%KLIu1+dlo\XGIgO%."D'f0\Zt#`9C02ofL&_D=:8!FG/H%6h=$%EIfM):I1[2o;9eV:nApQ<)2CE=_m5i4P,p"gEPNG&kJ[,+:I7 -%/NOh18D1+bf%^`g$1E.A@]*8&l!=VQV%Yc&7Ai%oUK>r!OT)m%;R4&=,PQD#<F%NRPEhCT0=ckNaP@Lm#O(UK[oUtAWs8b*f,+JX -%*6/-N?V:/`)d+#`%7tcG$:Kn3,ZBs"T?X&pL-#=d_h%02Xo=@>ffW;rp2RCQhd6mo>U=8<plh9Y6j%..OiA%-<"YIj02BC$B9dCF -%432^(Al?a>-Q%+4B?s<_.V'ME'h>,p&-AR+i([7;&Jj`4.`'Ln1Ek*f`_*SqA@5M"Yu4d5cM#+QJrkE/4VJ`HjLG9=XY]oj$!Ei8 -%A6ONG.3$)),RXa\faTN(GQI:KW2grr5Qm8^N!BUhlr=<ZeF`V<+%0/8S/(7on8+G%H3cDM+FZmQZ+!Iad3fcA"*`o>i"nZ@<3g7B -%_-ljM(9WX\%:IGCTUqES!&u2+qNXWSP7j62%LU&=+Ms7'Q_8Q"Gu[K!YiK2[ZmH]ML0J^Fl\d^OGX,+d&f5-fP1&FBW.$@9"Hg#1 -%5^sbtPr6@DVAc7o.%9L\.Om3CPV2VO#_>l&E]t5_6H\W2PXJj#$<Sp2d6[k?P,%/4Ylcg"Rp(E3$CRAkJu_HFWV&Xj!!%U`odgPU -%*1Hk/cl^KT#8]^tNA<!fSqMRY9UfA(fkRj];jjI!BssnhT#t.a:nk#PfV(sef:i^9j2aeo</R'q*J(+X392C<N[,.+BtIK)C'!O^ -%3E!C9Q7Zr/o8V$>i;]+=".a2W1j!l[cqZ95-p0:34-G8LD?_gTULoKu=sCC]k($`[Md<hdX">SpMSCeEAp.\H7@NZWp#iD9;8t;? -%_Ca,PKA?SU%h*kDI%]UXSD\gI8%4qe[DG$Wf:Moc=gY#j=mQmVQ6mk'=lEXeX;(b[#hbi.#F[sT6q.jB@L,f"1nk-jhAXoXa':!F -%j>@H0WQ`s%3*t+g0guBndqH<!8d@T,m\5C?'IZ3aZNV?VQPQmYXj#%i=Um;*.)'A)aQrp6WJb1KBlQIACR$n>/5.<@Q+ECX-`KXK -%"iF;M<)-:n!/:U<0+O)1V-?56@0e?W9-.'.kEF4"*6>(6TKNkKUoB$<H"^_\-I5Fc1*A^M\5d,s%WmJ,1I-L==R-U5nPICU#*;iu -%#\nE<][iTRk^B2U[YKD>.-<;LU'#s9=kE^T@(iI]I[:V'pW8*(Gki9-AG:p?3Y1sb9u>:mIb)M(p3#(G"%Etl>d@$@fVFh7SpFS@ -%QW8/=CL,<M/Vk$r#)n5J$7gLo'GHmB/ct$\nf3^`;VMC<%O\JT[^?E-Gc@,Y=:ki!D+oRbi#5Qf"bgAiPc=oI<?*fLXiMFd(MdOt -%/"guYi3Y"1`gAXMR!r^.'8hEa(*$8(LB4?jLjBo)(7tNe2U6j6KJ56+Fp;]GGrZ].Egf=iSrkC@a'rH;Pm!U1g,].a`<e$]Ju*-a -%9&-lY,Ofs^!9DcM09=):IgZu!=B`rZ.5HlD(ubUl8uC93R0nZe$&U6Vk>cqq+qnpK1[X.tkS.5<n<;VH^"<Gp2p=8b/#99_h,@sS -%Wb^NhE[*Ld@>.u3lVL_>3(=Zm//R;H@"L!N]+EC53l-a`+rD7`:HIRB)AOR:KG?gEMo2'u18JNc$;#s[S[hPhX]J@`cjJ/TAo!lX -%XNhNW,[P/ERZVP$N[JWYOS:629pa;Wd`]''f-1WlP8`YQ126j1.%6*+,>;FrVC3hm',4iXp#@Z:NL,QVCJk.g.j2>&=n4H.R6+#O -%2X8qK%LqD42@?$N!^PqiRmb@*"NISKE,:S-JEf]>&iRt6B(q-pBH^lsaoZ"GJuF?89clo.F+,!e"(9F"%";G=V',,Y8_P9?VT)Vh -%OJu5]4@.F)>K'oZnbE<>7DMe@1g_el&2LAUJ21+o+8P*8Ge.%[-na.c/16+L75*-b;4]P<1/aV[:Eo]r4&W7q*[jG?L9.s'Kh]-i -%ip[gU(PLS?>6ngs"Oa72.@ebCK*arueaTf2k9-5!CN#VS6A8Df7l..f_^YrAV'/cG89!>E.J"-eL/YULgr>:-4Mu.C;q9Y/A;b0Q -%XjYp(eXMG!:TI,XFB)eqH=Jp3SV:2#FVuI<Q(,$>)=S4?K#FFknJ0-fPoD4?mX>sZ]r\=fO[m+DF"Zb4cUb8D_UN/j7;!E7rfZ)F -%]L:hs)$2ZE]?ufUX.!'b:"0^;\P+#9nXgJ*/Z>K+DR3d2B3@?k"Le1S%@j1gOUQo!`JjSn3,.M_AI1XsGK'`bk19]XTlHlCKImHI -%M]fhHLE.-$2hc_<"E5a^-JEZ/!*WTHi#74[+Q>#;[a4_QYYHjOJ'>7]FGAPS(-VDPrIi/"->.:PL$&XYl.&o&/OaH_A9JiG0cE?M -%-;/\S1oOc9cqj"9A4b\s1eY[60FEt*;+R(U$k_(u3!=F'3SVj#PYdJiF!MQ25[E;4"Z7G.)oC4;`Xo3gPeb(["G8;TddL\k]Qpq/ -%"p*oTY]GCC_.+lA#h?cf5t/0)1sMF(5O'KS)0G(34hh5,)Hr[)V21Us?-YDeC!t-?+JWRac"``2H)UUhB:#moBcqG5,!?!.$OF.O -%YRDiHG'Qn=i5!c9.GJEb"HbT!@2hOWn[WsQ,!u@_*2YI_;@G5m<m(WDXO@I]g\#F8WRXs=@d^Lp:6_1Z0Vni?I^[pGJsB\R$4[LH -%9M<qB4KueWYD`hc#1OMbGq,**cjZ>]hPTBCo[,Fa[B_":L/?DD-@4cOE3Lu`,+p\7D1h)G;_TQd6'g+*;'^&0%/!$F`OlLU[A/-c -%o\S#7UMCj7jeNe:!<X1&=H.k+AdF'\Kd#%L6t!MFVd]X+S8F@d=/j,'B#,1GWD0T&N]&'.p<@+]$n5_^M=ObSA50GnpsZJ0+>ps' -%;k!@nhHUU?[SE.)')/L<B:i5LD[:*RI_-6IKZ*%(e9KaQWt*"]L;ahALN0J41Zh$WJkh2fIRUM;Rc:CW)?@dI0V,^13A.6MM8OFe -%-9^I>b]AtGj3IugKBA*jGd5bB"Q2c'\CC15"4eU3brUnA;o<bioZ`:R,_-QSkZcgG+WB%Q;g/9joq,1B8t,WMceK#1.rrWcOa/(- -%1Zgg-1]lSSk5A`fGm(9%Rb_R)])>EqUGOIKb19^HoL6*ogX%Z7Otsa&b<1GOE]tWpYZRc'c0r.Z#6dE>`)="en"ZVMM(gK_/E?=< -%gQSm&19&_(+j6SVPiH0KONksX$$fDrr,k`"08RG3#U7bghcr%5!r8FnJk]3EJiRjO1b@,)2hGg7[#Xk'<je[<5,7O:,9XQIHZYfW -%@<]tbB2J:D^8F`;S_Q@f9p)VN;o0iOJ!Mk("]L+Ao+GNIH*f$:>M+3Gfh/]3U".XE`l@V?KGYF'K.Op/bT4NL4=;9+\I>_Q7RW>2 -%%_=A/F;lWr_9rpS%"UXaT?.KATM0g!is`D$RCBX\n\.2^lE*q0V*]91>;1F/O"7!O`==e6S/1h=Jh77q?"-.:Lp0Ha92i5(>%G'H -%p&"nQb^c<j'!g'r$^ikVG1EVbR:%mo%^Qn/OYCSW.<EjW(jN\,mT_nP$m6TnoH\(@i4u0)/Yd"-"'jEf/o?4]SuE:GU<F_2,u,)e -%0(^fMI3q%5MFJPs25l>-@RXl/>=';\3Ha?O"rY:S@O,IOksCS:?a2dK1P*ARH>mCr7qX%g/$6\0bNhVu`4>,p);#U77[U=s:'(b+ -%@UQ7eb0=bkAV_j6ZRs7>YlGJACse?W.Xmk[)GmC'qlQ(q6-^tnP+j]Qr5:uh<Q"#[8J;Vgn-j\(Kk\u*jY99KV*k,@Vd%R(5DmEM -%3mcN?`V"q=I>;E*=N]S#$^g<<&cltWr@/NS^H?9i2mj!J@^m6<<KnbS!hk>Mo6"IcXDtaif&XTQWUVH,QG=a_UZI3*kaHWs\7&"M -%R5&[E>TTcQ.fUWk$fQ*\R'81M`!%rj/[d]bYTahd&rA>$!:e!mn[lV>!,A([7fYV#j&4McN#mU,PB?EI>oT\\17Dre'`F,T;$;*V -%0N'f8:$1HL^LX*Y3^^DaI<U<rL:C6.8>%t3]gKI]FS!Ba.t_*j^S]I]gPRW)<P9JgRe0WT1-M$V"D]%&]$^tnl#dqO`S%":c%.Q2 -%1)JNa4LR_XM6Ym;0CHppari<jg`"_iekH",jeJ>',eWaU"@iU[asppEmh=<lC.nluR^su(W8uMnA<ga6QYB@('.,Z4$<J;9W%jju -%#)K7!`Wmk",O-L/I:\E2[aVFY]odgJ.0ueX=uI6rkuu-9a6ZK-!Z!7mB$JT+:<TAb0W_CFon;^7-Z'uR,c`p2)(C(NZiZT@9K$"b -%V.@TqW3nQZ\g!Ore@GesE_.aa(_aujjT-aLA6oNP?1]omJrG/6c\@RtI^BlrePbX*k_m;oB7ufVB:EOnR]!h#W=c]N4Q;_uU,StR -%D1dKJ-;i%]_GHGQH/=BDZ_=]fmBD^*Ft,J\4'5?Y[S7,[RSS!3$,gE=/tbs%`Fi&[!n"g]\A6"6mpd:(U*-c2HilN>@$R,dJj55b -%9JFGIn&hjVJJ$7<NJTW1L7FM@3$O?t$AD8",l<]g<DRa23;kW()J0.=qM#"/('J1B>[_47/9I[g4f8at:=b&b*ZX<;S0/l-0PpDO -%q;^sejPl"(drMR*`hNb^;=7kqT/Gj:-6H6q[NdHl`"^O[)uWr7>U#PYV9^[(h$);c%*tSYG\+2B3*o\Z<=u>u^[0r`0o<[j^miN, -%"I1e=ou+YMQ'>25pg`9DhR[*G>f^doBg7:*<k'83d=`l6q2DBM_3tlFnm>q'07p%1"X.A/Kcju,JoUq:FZYP+Xo6bAa<V@:Nsa47 -%]T-)%3.bSu,_;'o!@uW3)9@,El(k1a<lO^"i,J$)4HhMCT_)m6(nqm>T\j1[cV:J`/3@UPDC3>+X'.MXr6%.[d84RBHN$p'VCu"F -%'P40T^f]ph)GYH=3unp6=A5qi:6:BY4:TjT%B!?M<Q^aPNr@.Icm?u3Xa9W+V@r'G7ThS&>XTQ#^Jdp?$-6S-R0JPcNKRb]/sUuR -%;#j+YS)2p58&U-f!^[ErI1Q\4cR.T/9PAZF$:6/3T*H+n@+A2a+,BpXR<`rl[jr"f8c:OK?pP71bJ=+8b+[bb1]:iqcuYR"!3U`P -%IWA?DUkT<%.YuI[.$l;&nD*(>RX&UD$5Vp9Jh7a?-VO_A^R5[5C-W[NoAStG8@O*Z.?KKG[YFnY8F8UOI2#ZQDOqOK$==M0AY.Bk -%%*)$thR.V3,'Qi$j3q>E6oE6B<HRWEeV.0gJcQ21TXY!'8CK?ceZ(d&jt)1`@OJG,-4\]HIdJ>VXT<Mu=Em@]5VMctE$?'J`VjkQ -%(@?_U%8[1,Kc@k>1!s[kYC^")/P3aR_fXE73/0&h^%7MFI=KYs,iU<T9T"]tVhK1u]=/MCY':Maq<saC'WsMeSq)?O`^*#AG[I.F -%^R?GT'd6a!Rh^LV8@GbfI=k8+c3b'^Q+fGX$Of/VHRTLQ(YD79<\aW1=qq%3Jm:GtisH'7A`V$$J(I#dR7@-dnWR5o$I&f=%^b^T -%>,QEu9^Z@[4bBp1%">7&JYP4\QW:_GgouCE-F#&1Dt5Vb<9fhO4bDbY#tTr2L1i0bmTgR%F)#c:`jA"pTg!<k(k%8KW?YhOj7q\; -%$oeV;La'<:BlSTPCbRlbU?Q<R>/K;\gdOF^m-LEZbRS%^9\#s]Ko*.e_/EF4&P,N+[=Y$@YbW.CVaYru_[U2/*In.c+Suh#;oQ&b -%J;qs%2='kpAT?U"=-LBFAKZ5#;c/&=7$G3(]7QM'1(gk+T2lFO=9m8&&kif;UfS!SRE(1?oh0Y'q,?6bbcBmgU;q!5*+<SQSOoq1 -%q*p\pHOgA7&R0u@_VE7m@&s>:Pkc<dZ?9"j%U#fPeVosH\7?CZOp;Ut=GMH.I<5=F&9_S_X5Ju<qDGbl]464_R`tp=ctm?Zd]n=u -%Ab;4hFtS3;`o(YCVJWbX,5+hjkeJFdBsVsa]KFAV=GRSk6TS,!WgqGZ&p1`foZU%K8_YkMC!L7I$B0_6aL**/5QhCB=,eJu1!qit -%W[MJ+_e2+;"VM%L^9dZ.ESK!,QQhjBWg-Gi@3RVd`iXc`'=5Ns<3AU6;f3.#bG^9715mq*a0HNd.cZm_"O6&b\r*SY#V%<iDNu+O -%P`En-Ar)OY0<K]="nSDFnt]J8O4+0G/"41@kS2N>*]EIR/'OK/L+t%e0-c7*`J"SuBRiZ6dAQ'O6UY$gC]jKV1maPbGdL7Qa?Csf -%Mlp^V(=@50R*Qo!Bi^0J:a6ag=X)WO4S]>`%9eFpCtcL##)`]"_:^fUPLE+"$a^bVMPe8+b6f(B/V)A9]!b.#&HJA5[Z&>04>@C; -%P8gTF>%7Fh<B-p#!WM)H3N5\V7@4b-qdelBbo;Ql%_.ou/-(ngS'n)8ZVk!+_0KOdSCRUk,f4N0Z?"k05R9dbj;B5m_9PRs)epaZ -%/83m$>(Iic_pJY&'C=\kD'l8LVF]+sU;AjFJ\\o@a+DV'Huc#l9AsMcqfuT'@^unlHM"4qb\o#I+[ra36tU\]=gk@t2+R]XJZ3]? -%0"nEBbQtdJ#hstlPBeAg9rLKL9GV,WoE+Ar1dKJMat/(L?A@8!CUKZE9W'pT?3*3ak9lZ_&$;t4_arD!UhQ9RZC(qj'(_!"V9YOH -%X6SZ>aq/e$3)ntO0>i4VqFlY5$td4B-dK%]%r</;jE_ciN]b*HD2_0:bQEeid"E?XVVHXLpC]0U"UB("Ipe%dHqLLV!K)QN^k0Q" -%?IcH`q]2DX@@"gX^^LE<.ru4j5Y!!B+LNL]9PH3DJP$-&hB\<l+NhRC-<k]AaS*KpDTM`;`6Qj%&_5[Qn95q]RhXdQ6=O8=m;B[u -%^2&Z]ei;,t1(Z8Zcj%PA_#+7`>]J^1pB<<n76Vsd-d7n_iZcre1$^"6kEH50hukPI=)H>I#dd<8Z#e6$eq2+J1Q"Bp54!QFMbU5; -%&6tW^o70)m-jf;^>8@r!iC#"tTu'hYK.-(]2AJlW$lI![lV8D>6ablEc"^X<GHPC@_$^br!5*A@_Z=Kgr'XX`ZQeti[g4?&$sl>H -%c?^R,*Ol06[GOKe!iXXIH;jenah2[;5YW@*e4&&LoRE;,Qln>^hVbVI12H%MRiOf2Kl?@Zl4S]+6Z#-jJhuHE$-E;n$*G?Mg'<". -%Us`+l@BK'Fj_"b\'FT@A6,d-A/#g8f.Eo]281c$da8:O:7BO(P2[b9&7HMa<oqj%rBNUL1d>^/MQat6PoP&TZ0Np_8@>0A]P!RPC -%;bJcDfCQ=,jBQgm3]$QFfVShJ1Qd!Fjbn`&"ueMJZ7<_tkXBT43oUg+7?Q5Jl6f;#VX[I?!%[^db&k#O;<+XE?QlUfmP%42os/$r -%9KhJI[aLm8;.>KX?\2pdm^pRJ`W^.O*tLk'iVDCsQoH58'`rtkR3qu&jde]5[;%JG53f+j6r[l]/,^0p<IL,tX3jGa>RN5p24^2@ -%\o@YDrPgQH8HZ'q.oGWt7H'?W'ZQ[J'.g>>mi2t7:7l-5T/6Y<6_C,BW%_73]6G">%9a/\#E`BqP,?_U11IY&:5\%%6r4cA"=gm[ -%Qoli?O]"f=[:V@5oZD-W"%<CGCCm_o_bi"O%&OkU#B<FLI4mcc<03tm\T2FQR^<]J3s@s-3q&i"#6tO5X?P>2QH^7c+Y.`Zh6dg$ -%TDa@%nmhh"r:$%[^O,k;p$WDU4!&=44o=3gDr83SMMq56BC5I-#St?j^^(>>aK%e5N'@VI'=nrPS.d4Q-W67<MJ3oB*H4Dn*,uuA -%f3*e;,'Pp(a.a+nj>+(ioFR%W-q.5hB3P-,<5no(]j/gLW(p0aR-;r')#"D>>li0sTupGXLuI:"`<F9`m6s0jj<mpAkeG0cZ.KH6 -%`49W1Ce<%I[\2*=VrCH$]J8dZ$,J$C=mtgLFE7VR#U!#c;+n;cL'.rf!JQgKfD7>&X"#eA%A:cLmjMdVq[<Hf3/u,%1OoUn3%E/V -%9Fqc*F4nQS@A(eadoC'E)7u&(3$JVFFaOZW\d[')D=a:pD$cS(B%rgJ2F80e-^]P+FHHO*#5>CR5q*4),]V5_,rMSOc-Qn@#6'N4 -%XlE-3(RqpF$/aiUA3EelLEn!sV-'=O/pcOE6.L5j1f.RKKn;Er6X`$n'tsiLpZ:h*Q*UMA#ApkNg($:9;E\c:&YE;G/s_]T7q#W) -%M\][%52*g%IL.]U^Q$oXR(*/qR6&bgQ8R.>!([o.:ROZkHSPkLR>c&N<.oN#QZ4kH%S?G#-Vn%W,&C]?"K,tB"%Y3O"dnUX%4(-M -%ZuL9DA6kd$Q\cKp\H(Roq&XQ9'5%;/?(7/eTF-LVgo=H;LM@o<2=r"(SI4E<3lE6#F:UdZpf5so&Lo;OKfYMC^#0kA`&,!R'0-)H -%$c0?FGt(>1(="nqJrt@#nhGda]Q"2^J7`'@nq:\sA[[tmS4DP>%"jW>81gXH_5`)uS3&#&!&<C7L-00=RKBFd(?(iYk3GMA-^m8] -%Wrc2M18u5r(Zg7+OJRA?-7F*=74?&oOli^^DQYHc9E<u?j;>g&e60KGqRAPbi(:H]b7gOa^=B<hH4jWQJOImO5r1[FUah%SQ`\IK -%5W_#BSi(!YD&%5$<d)N"T'1<in_cEX*^DAV,D\$FF-#//W6&i]Z\=V$kQsL7,=1H!qsL.8^irY7o?3;2;[Y=tFW_eDelC0gX]_1u -%OY2N*;)eU-6CXJ6Krfa]/J.pf3ej>ikclmWdPH]?%!%!_JWiI#*]cN;9/,Tike`'EYc&[7)]mg]9BQ$Bp_hA***/-SG`=6\%XNuC -%15L@sfQA6i7DI8r4h"Fg2WLd)#9^ch+g*YuTA#*Za;&q7$mZ](/*^EOJ=**.?1V>J!gSNC_I:c6+K'NtTVY9%N2_\V\b@NE8A2%/ -%1*X_05ctq`nB'<#A]5&>^3n;`Mk2nh8I05X!G<Sb.!?&Eqc#Fu7FsFOhMQ6AO=R,?Z=M+Z3:A#%4a;n^1(<3).u]=eM@s*nX`L/_ -%e5MCk*V=8Z5d$\XdH)YkX:QXKZ;+,:<ml+#7>V.6%,j9lV2t<"U)-:Q-rs?B8RXE=`UJsE?iXn#@90[6:K1**"<QnjH>m1C]'DH3 -%,W0t6JOp-1!T9QQb!A]0Y>uL:A(Q!(&nb6AcOC0f&$Xt5hFMT`R"mADOuZ4?OjB4<_d@[c"=W!-P;5I&"rlBm`rA;l@b#k'A0+F* -%U3]4,kF`!,jM'MdE'C@JC_o?^`!uk/BNa_j3k5j6_2Tf;G1gE9MEk"s4AqhOXEB?n1ifjW?HbZbBnDqjT[N=1=T@r<!Q,7hJ5+SI -%D<]H"`k=YpAc_t*W!S2Lk*j2E1;s4;RNkB=7u^0Z]$jb!*_/R4$$p@:PNF;=kW[oP@h_**7DgZ6>p6n!':0?<(IF23'G@D&[2-?D -%g0KU`phQ-F@A5!G$]fZRr@bE%<=B4>",`;f3JLLR$E8kW>6ePajY8^Zf7tS=.]leS"K`SO/Xa(>T>lDuQ#Got&UF"[ic:*GTEB(S -%!nofq,b&Et9FU2r69%$FU3bic#j@I/`0B7q$%Bo_P9_b)7'"(5[7"Ph>+"q?Ci__$)[a0R4O^qK/Yir?5<pFn'%-l2i&AH^0<9e( -%!(hbuN<$5Y*=U!6cq[:cLu1*p4tV""-;APaJZG.\9quPb9mpG6PWTIRIC#V5&A+V76\,2F989@s@l-0?Z"Aa7"sB[*iL$HQN<co4 -%_Q9<`&4'H\_>rg^k8k<CiuFlh?VED)#QbJ6D+Yt];B@B@)W`JFinY@Yi_7O)L-2'uA3kP\aq%G3!&)rFdWjcV);>_>aQt!O0gd51 -%4AArf[=7!7Ka?sQF)]Sf*_K(^;([QYV%W1X2NI+O;LLt+@3S[$$!+?K@gc-NB"+9jo4,-YQI+2jD$-k::$e&a-lY\2?3Q"HVn\\h -%*oI>fo2WW_,XCs]RhuI)%LN^n6A1Vq5fU_ni9-#h1rf>0RG_R7"+$faE,G-OQH59%\"35G4=uOsTA%pPIYZlu6)-pVKLod/V%XpD -%jV.sUR8/53;F+lm'sRdrc5h3l'td@VXf"ab)^279`tUDrdY$RYZN;eG3Wl9)%!*_nD)`9Rf&\X18bFZp+,/3V2LKB!]II`ZLGghm -%(r;#b\=R5Na(43i'QKRr]ISqZ9.aZr2JI"!aj`CY!B;P?TM%M5d'?iQ<UnS?SgiZ"bD1[/B3Bb!eQa$KV@J/,@B5FB3_E/hglRJe -%YNgHW'[0$"W]-Dp+P;h9=F&S_!<<Ob=bnA--g)"/eNdZ*A[p#j'Z?/s&d>$cS(e3Mj;RoDKVX7#nO]%/+KMQ'T4--gMcqt(2V:HO -%?"Kb*2)nY,+>(^]CtUBOU^J@&`XXL.%M4W?iDnOAB[OfMQ"F=:Go9?VE:Yd*k+^!S#W+Yo_!iugi9gW^m;/Fn-p_^/RmsnG9WTAD -%k:-1C;)mXC[T-5kS<8W'C.<98@[61]Ln4_c9:!(SD[T6FY1.!5$*aC`Vpei:F'puddX>c$,!)J&)3R8'g![`KJOY/kCsaPGpFVhA -%!U&iM9@-DN+1&4-cF)l8/e"\M)Z,.tXAOM9q(1Q:)gH,&^I9m>!'n)?L8#`jkj\8J-Mo+fXM-K<jpVdc"8(>m,R'nY\T=F88tY[U -%T*V2a(+*]M:/DcAe<7m$VJO&EBW7Gp"eIT<S4dfp8&H1?WaS4Co42e4`=ho,d9o!&5CgK+</gVPZhJXFgF_*)fD11#%aUgU]p\P" -%FdO_#TIciDL'3V]]qZdQ<n*57msVm.W`f)&3cTpmoH:C&^&I&[F5HMrC=F*Ppl.g94`1bN@`@]^&SINdo<&4-n<F`$Yq3a"Nb%d( -%i>*/)fo_DFIIsp20&+7+Kg$JTo[RY"f!6*OR8?Z3L[092F+B6igG&EnRF3O#Wp/JGi:Jd0l6m-4R$gM;U1VHS_47o`9I/$"r@3J! -%Vkc`q<7BaEbdSkjiSW]g9mqeD\&uXrC'OGlS'hIQle?:V)lsH%9&nC@9"a6@1\:4HiOr^TcE>A@VrH*U*qi]>gB;il,k/mm6a2Xu -%h$>pU`U6_@jCD_-N[''i]Js=NCP10u%*"QPoG.WXqV#_EKVMJ&J8G#P\8;;q'ElKU!1CdM6<1mgbV0(OKr*fuZR6rO;ZpiU1JCl< -%5Q:%li3Tc:g1h)S'p[RS]aT?R.13SkLiUe)k8\;m[i/+//1XR0J>+qY7m?nRap(Q:'Vui'8-]%*)%@EsE1F&B5['67Qf05<q[at& -%0oVqP\egRW\2Z?Ub5L"_i;cF$;.PKl3Xi?$qq4TS3YiB-o/q+6Un^`[,79(:]r@+khJ>=^8#,X27HN:n]Td'`3eQIN(bB2iZe-@h -%-Bl[Oc5b0)O^jRA@6Cg'WhZWD!GgKRmE??2(X?j*_6f:1P"LaZppm*s:=pP!703Un&GNFN%Y`MN+Pj/CKN`db#GY?65cDsfTR]2+ -%Lr*?p?L'sZCJ>!iO%+n*I#WAMoWVahIN?[;3M$=jLti]Dq"oDD`<kqNO<Sh985\Ab66oWpecs/T'J'&3a>soo$J&Eib,fl'>lK6k -%PhBe=]UQ5V6l!+NXM;WA4NQ_YMKMXkgAHRp!M/JCTDLp'K"*rZ^bF,NS?=s2q_@OK.l,#DZ$U`=)iHV\8n^cICTiD&7N`-O2:Z#6 -%O\me='266sb8,MOBMIj:1VXB2XcQSbcX9%(;rrTrg`ZBs-/^hj\Ju9Nb2SW'5g/56A4_.d-s7oJQSiub/C&S#!`WaCo6m.&"L]D# -%A98uo1g?N]/^BUs:anD@K<I!u=J`'%!Zr\BH3jB2n)1f&X"Z(G-\c?'HUD=_YV)`L79.gd8e.bFWfAKCY:dN>C7M9#Wfh,F41K'j -%?,'q2o9<Qs&V<l?fj-0+kV<0ga(jZth]a5.^Em57PAaWf06QO<>5hXP]:e.cZN08X/1%*>Gu`@+[jXU1^dPXI)7@=8[?ipVP&:i, -%r12u=5"8MlHqBN,,@A^L^qr]G9e6X;W)iJ#(j4Z:WnS*5+JjC5_g"sED7C%%h*LqccI14b&&aJs.I0W,i@'`J`(^CP5pjoX9TW64 -%J,o\/6(VubG(T?6OX>A*:A;(?Kbl8ik`pcA;sg#nTguPD_NRo]54;,ADLXeReFsBJiq6G5b<hW]hjui4(@]hD(aUjE"5rGsRJHQN -%Ieg$+CB)7[KLu3a*:<bbAEoe$ao@KjjI_mbFnIc0W6+h!e!M)CSCnUWCh>Fhc02KV+d:)ImPBsHka772,DaI4SOrY]9ZB+6YBTK! -%Z-rUKo#;tc<ArD$nBd=SMgXfE-0&p6D6T2nG84T_TTZiaC7CHH,EK)f-onX/s2H<OI;.O^Z^lp@,()%7EjH2Abt*R[S8P\GaXA]/ -%e0YICe_7/FOSlPMO'IUB]7EJT7=jKgNa.KW))`HP]QZ!OJrO$+VSCO"bl6]9AE7KZP/55a'CWn/L14-3?=T*"4L_<2#RkE@GXIT* -%(s->/-8Jd*c#o,h'FpAu77;$rPhA=_<hpkn4Cf@VqnaMc@X:JiOE$pU%h#pN'R-=6d<.r5#a(2lmOV$a)MF''T(j"<%PlM>V&p+$ -%l_qgS+SQa/X>^5!.u.T]'kc8UUoOq+18\mhs5*fe:@Gk;r\<`m!]Z080$<'hqJk#*)1RSh\p;rKr6mOJ-U@_;=a=/6O3q]3F0<@" -%UG<U-@?61r+[J7\Ns*\/!Bl/Y!7bg#o6@f17j*jo@a6<Na7tis`Z%j3I9$g2nOf71$p04,Kn[gk3hBVkdQei5S&S&Y8B3^_Wgs[a -%(b.=0D1ZiQ@Ua^F_)^YB8?1OcNTNW3a6"@_Si![=S7;rdb0;rD*Y.)@3QG+:,mc`B7"p3Gb^&`r\e_rp3QCH9/:W)4X(N@K9fZPJ -%iY.PdIG!h4`EF8,ieXC9Qt':^g+ZtQ."UiVEV=(i].h9QD5]-Ik*UT-Q"@/t)""sia31FLTH"&kOn=?(BoCu)VY/\P*3ZI$$H02N -%;ZSjadk\-dh\\h1>_+h'a9!+G5rZf?ZuWF2+V.s77VH:Z$',QhGq[*cPjQ3#`XA&]/T%XFhkM)h@n`e&6b\u.+Nh9D&0o)0aZBm) -%EBC\C1G1PC)1uQ1%Kq5=E5kU%`X?D6'P%T90l!KR4$bXAhu'$(iXhLj.&2E)gnU'rF!>QQb.&S6h/.[o@GIEY%"p>:mWa(2Jha<f -%qZq^,6rj3n2!lT#(GC/UF_t((Ma<o/B$p*WE='h50!9r="M;1T@OKOAp`%kUMd3oUA8j8%/^SbN>[4>>!Z/>UGh<F@0nS>koUlu; -%iG)0'WPr+MXV0"?h":jSZhW:=4$c]dSM>oGnqAVaD$ZkD-5M6QdDRCZYdh7(iPd;oHK1D4=57'#'sqH:Pc5sX'cgfCU+Va@(#tWA -%]@Mm+gp.\5Dbr0^'/,kq2;U;H`Q4r%`q?2CULq9"\fo%kHtNH6N8eMcFs2`o>f@(_,&q[rg%-T1Ii"^o39kPJ`%=']C,dsIAek*1 -%9jF4n%l?"*>#`P#9YCCQK8JnnH8*.QT=(##L<[_P/u#k[`5ofJ`u8(>juSBm'#Sq4c+fpiE-cid87IN3bbQ(IN.5^H)':%WcA%iR -%",W/U6NM?!Lg+H[n=gN4`fJ>'@f24T+#IGc.ZgW70Of9?"M1$j%#H-Z3PcmD_kr9ZIqB4e6obC.6k%`p@NPUp-EFN'RmTm>`TL8* -%L:B:s&/8S]K/%IT&7U_S?O5ZVe9;I[5n2r-r<<fLG*L+<5>4W3k=l9\0`FhJh"9R<"P!nTE)sV+d)28:p_u>#g]H0aiPM["hUpdR -%m;'G8_oUqNeUt+R)b=h:RWM1C+S^((LQMqc#=AnC#oA?t*/4ZL&Cqd[r-<YZcj^u77&VJEVZ:soqF)>mBgisG2N3@-1Ce3qOm;p8 -%%0M)=`ZYfO(;2]F%u7oX15s<_`N)9BL7klO4eetM.b>"D@MknK9H5!+N;SJK^`j1?+e<Md0QMKcfRRBE$6?]s[^tssH')T2_U_Td -%_2V&NB]5e"XZ'E#fkls4"^)[BIr-41E;Y-(Ku4a0iMG1WJ\ba&@`A>$$DRY;4eZ@!/fj4H$Lbae7,]g(:`*2/3:>o8qj"d4_Mb8b -%Fjl#[,Ci,p0]@f1C%4`S+ENI9JgLn3$?74T'7M?W.pk,AI';&/"ASZPb]@2m)`Zf3Q,Z-OT4&!?Zb="b_JmE^G6%9H^ANm8%/_A! -%:.>P>hAZrb)^S/eBDE_X@kN8Z"poo*1_DYUO>'-5#$*@<0`/c6GsK4WB\l8j"A'G'ClF_t86A-`F?%-u_1$qI7e!;!Rj*fIF[ZSX -%&7MMbSlUFdN7$i,q*kX"`p"nk2*i(X#$+Vjq%1D>V;2",gb^aQ+3`/P'n9-uJA8!C/=bc;%TM07n6dNV"`^gt[4,e]7L-hPl`+;= -%4,Y]$B&2BQLaNei\[]Ia$u@Us/T[d`%H^q>hrH)ELJ/&Y9e_3n?,5A8aC+p-gOd(p_(\WmA!.t4\/7DS_9`;FG12&:$6U#7Yi)h2 -%UbsY>&7S^iT5qte8P>.s1#d0^@KLL!;ANN-@!MR)$&0$H6K/#?$')bR8FSO+&WD1U&(AaKV7uo`is6kPD+<4u&Zg^8UMiP>W\-*^ -%Lg]EoKI2$XJl?ZdGnYe7R4,<U,iJi7*9@5)e!sa+?Pl1f%6e`?ojf"KHse?\=O@'$[B"Mhjoa'fF8=etj+rq3DEb99YH&X,Yd?OS -%)\>\bHuV&uWVDXI,7-UhWOF+s00h596H'iSN;m;.FT[6k+3\t8KOB@^b<1Gc?6S;lRh3en9'.TFRTQ.60FU9%1Lb`%Je6-R6uq*P -%#Y**3q(WP7EO25tb97#S'js)j9aG@BNWI6E";=Cco)(`UZekamU_b3l5Ck;W9aJ`f.;]lS?lkN*hMVq=KbgGO5mV)_KC"'1&s6et -%f5<pZ`*N<AJn\W]QiI9,+tD)2#UW]@l.$mZ,:KQGEtEp@>u^Oh9aG@J:>_<C_$hD;h^hh&XX:R*%1!0]6@s"CJUsgH#<hRlBP"'\ -%H>bq8C/L",4tno7LCT:'/8&N)*#QL752flO1[Lsl'!m./.25b;CuD`!>m)'j,nUqP)&QM5<55rYLdnDlS?]l9#lh?4^bB0LH:*6r -%NZNOZ!lH."UQN@7S<PZN0FHW9DegILj)\$6C`kF>#AoDQ+>Bu\5Q(S5q$?dr"qVX,;M77f*q43tVK'D-KJD_!)DM/nrF,fF6p6K+ -%^c93+p`2rA`1qcFY6tK'-kJp`PCOC;GC"o'':9kq]6ofm3OFpN*@,%Lql5uPr!V:3N;"+qQr3dT^6h:hdsu[LTR^`16MR4(PlkcH -%UO\W*R:E"BQ2XqX7KMPVWHJX`0^Fd%PoS%8;4icMj^J7sW<FOX_#hWTcYq,\@,;`$'>@VbZm'1%(,0h)#^HX_(^=S*/f$.BJIj.9 -%Qj*\/Jd"gM44q5L^m&n<&7cV3>Jac5#T,7M'FH*<)R(KYH#=NS2oF\l1uOUh0"GZ2YVNHq1uPJ='b*-bQo*Mk",<()8'ld#5bp)I -%^bi8id$k5u!M-#r_gp:O@ATUtZSsn!Z&8hq.r1%F#b8t^/TV#FBj_hV)[IuFng"D@o0=kN1_:K.deYU>0UlE7)%]&@Q&F]<5[\c# -%jU;"k!io'%>[7G_dCY2JHOtb%o;6d,+p(^AD)+)-^o<dLCa(S5jpV/X!n.KF6QgrV,1"D/Obq*8UV,kY!_YGS0:fB]p4?JJQm<8g -%$c4P@0V-"F2>0VWMOk4JH@cE]l@C=2"+alTX;_Tm0J&g3SnMbD:X8PSJ^\=7@3dN;`a0g>"@b*GjeFaI(tU4//<IZ;ZB[1'2@k8` -%pa-&@Y/T\<+9H%C<W!"4(cOgTLl2NIjhAS0-3E3Jj!PI)i7-P*oEGB'FGNPT!!9K*S!(_p!n2]*S*C%VVb"dF+L!C%#Q1pgs&p+E -%P^Og<5<*%j-h=,8A(7=hgb`EP!\<(d?s;O""V)@SVd;H0^bB`Y\p2$7i6SZJ_#,.X=R^iPkj.@3j6)N[%NI1;&(*T*FCF#[(@I"I -%OQ]'>:>gYj-;AnuIPEb*2K'Ed`]<3BC$a6F<@Hdc@HX%;#oL\&aPNn5Lk?9E(_YnT;h3Q7n8n1&!o.'Gl##o;L5?9=gtaJ?#f$Fa -%4UOG!p4Od2Qos7'?]oM4%3(cB\%_+Anb4"%]5;0[:/B(7o`aKD2+qlYmq<&*mu<21/-5a0^Ydi(D):n[F8ckmRef)fJ]$?kh`r4f -%o63A:o)e_L+86Fq'7[9N_7bg&9M8ZCpH'J1`u"/f\0k2$I[Qs0oS^(`^_o["I)CETIP#WIIY.eCW*b4i5GQ+"qLoC9<e,Yh2j1M` -%q&SJ_?Bj>UfigXiLKiC6j-MLjgi(,L[jr&H?[R?eFnYD$7WaE1'7PSh'nBY55XKWOpqAma>4BQ/dT5q9qdLX&,7XANCl'Uo(Yfg7 -%Z8+>l(Wf[Q_F=/%PDlX0lCDEpq,;6\OY!B<``V-WFlc'bAWL(sj9k2,[6t@tD`<jL,5Uk8lK7oJX8/IbG/i%s%J+/e)dZ1DI(M,6 -%Jb%X;G_(7S'90iu*DY6Lqn"c*(VgQ72?<9d:mGA.hAKTsh?[JEd($TBNL&."!UqCSN+Cc]^R$bg<7iXfKg.ZfPj#g0P)>1S4,jRW -%GV;JaXQ_LP(H>lg1;:lDMdb\P_7`sXZF,H<WT3G+[WgJ"m0,hSMn:sMHfH=3@eMDVGQQQVV&[8.5k^?XdF:nW+F@O^GZqp;$;_S( -%)H"Q(2<DT0]gP^,"Z>Cf5Uf11XHC3OJqD]8Z58]EL\*k*_?hf`f/nm3rIsRV64;_)T_7l/*c7`GBm:?@JDF-\!NuQk)n937'LEh@ -%SQg+NiX=@RYG,i<0+8i^!nU'I9>BAo?M\4qH/j4mUqhKp]\]9NP@(cUo!d]Q1.VXnd`(OK("(7`odXu`ncn_A*_27jS(Pnt$^<D4 -%lm5#OLDR4><P97dYSWYOomQmfpQ@:^]ni_oAaBTe<<GrU3$e4GJCCY_C=qW)e152\$qLAF't!:D"++2L80n3SfZUeTj.r+H;-h?? -%+SIQA_F45>ft72S,CB5Q>0A&.!52bg#i<YZ\!=5tjKNtRHcaHE8e`:V0.$=Rh#t#BOdVa27eW8X;Jp"ujc3:k(tgE)>:UZGMatmS -%dY7$VSI1[X60q%B'f"@@!ab;rEq+H!V_Tlp*]KTlN"1F)ARqg@:#s.`15aN14'P72a/r\Nf1SJ0$0/'#Lt:9=Y*TA[/2_C[r4P42 -%=t]u/CrC0o03=I)FXX>=A,qN]a;:oo&K\CbB?:jd=]fPGWg=GG\_a,g<)O>*CJaJeK'<H:GIW+h_Xt]I<52!rs)=*;5^J4#N=4/B -%ESWC6(WoJR:4pnT\tVS/TQ`6!$d@cS6aaP'o-/EH+T38)Me3tHEWaVAQ^ah?c.a8b]?n1j4s;6fADXIK@;pJuL`5[#o!4;b&nIa- -%iXg@h!m8^CgLK#4hX6!GW;f:&P:Qt>Mu%D`=MS93??Wo_AHR3\Xe,.HnUf?rcg\gA_HY;H/Z.p^B!UVu#ii$>QFp>4=G@;#>1,.- -%Et`qhCV\ish_,Noj=_q5%Lt.=.-7`h]KjM(BQI$q;(G7gh%8GoZr&N%+iM3#qa0ehLm:4JGTl$[,3NuT$AjfUHD_1d<FnN!^tYlR -%^9=)0=*<JG;-6VCJ;GE-_$>E*Kf,610D[:L*r)R^n$]cr*cjY5<=f2QDtYfBplkingH>?9Go(*k%.;jfAE_h]cSKe^q9<o4MI7tL -%l%0EY#FE&-*s(RV(.a)lR(8+f><o_OjR2RG.?M0b/Y%F&$cOm;HZ.gpFKd=k1iJ^L7;Hbq/elroo"AbLP%npdmW.YV:qQKaIV4jf -%R1XtA*i.VJg]qL/`D3(!>b#)a13+CNbjI5u0dsZWn`("_MfaVYP)*PYn3'a\,&64Z6[!/i,MLSL7-nWj)m[X(3df]jZHK]A#VcNo -%(Xp.`NF_CQBM7l-m%.^TYmUYr5Jbu`\H5)<(Ln6k:V7UgQGIo\cZV*fSM"5-A!_W_4+EX&bCh9UV-rZhjPQMIfO(&O]A1Kj7dM>I -%b6!GAllsjsFW4R%@J3JDmN)\[,!=0#>mqu4W.*<>?0oT_c3;g2&Z=E)U30PqE<DT/YhTVolPCE[,>0k'41+aN?K.&(E:QY?YV$rA -%8dYX$b=**9h>u2=YgE''LQ9Q6+j3I%e`Ed(i-]Tgknt.gp=#VHWjk<R[94;&a,c51V1kIh0<?f#?q$0^]"E"+2ob.N^FuZ@K?1tQ -%(os^Kk#jWDQanr=<P5TJN4ZF2i!B#3,J@i2Fm1\pnSqn^R..M(g/qV`r`Oe`W\4=b#i^30\i_Fs^S'khBHIgc?'[$LLqTau[.7E[ -%<L3oM25]YZS3tQ>7Fe5mLiX*,/e"g4%]V,i'\?\k?*7$b4,Bn0$-#k>9#$Ea@k'9WW4H6?inai>(G@d@'nWHdHtTE;<L:W6O<T:V -%Ws!h8S#VCj!!f!OW_7A)'/Wbm,qt/H5]r>gcqnna\s-DA'GXSQ)N#rSLlubeWjpC`%ff0;Dn2jYj9?rb%>W;W8U'Enl9^qjW+ -%RJWJ/W=.et_]]gp(Mkm>chD&@1.\])<#;MM^*sjt(KS!E'iYtp-@-.&eO>d[+fGdK9,\dNY6!1-JPKN:F_Q@Kr.=3sNC6*bTt5h% -%II:f7Fh&S%IbmoWeEkil<#6js>a>Ll=2!Y1K76+/R6tK+NM3pGmjbet:gHojaBj*IF^`e'RAl[s#HDo&F_O*7k$mVm8e>5]Fh&B. -%Jsj24E`,hd_ph+I;A]s$Fn(:0&IYK(2I&r3@l71$LM)\n@(D*ql9'!^/i'tZe+RBV9;"Q8m_@XIh(T%02\DG^ab55Vqo-3u\kL2> -%^-."XXL1Oc4Fk#eWO_-,;%1majO*4]7Rdj1RK2V.0rD]]I0X-VWb9[X`VkV#621W_'arEIVb>B=PNSppFpS@[!-K/!RMSbdeA`k/ -%#;l(L#VlrR?%-#'Cqj25<&kNPl/M/lP[a-(@A%+PnT82NOs#"\1q;!dH+Ggp3`(6Q3a(]O'6T`:V*HPe]$T6;<:D7"id#acoLUb` -%'4Iii/:kBsT+T9;#3o+2ON"c^2icFu'$UXGiWWkNYa_R!1Ki%nW(RMibXUmG6;cTneE%;.1guZQ)0C?Zh[QA6/<#J"Oh,X-R?]X- -%QRK+)h,NlHP,Y$kVX??[VCq$]8kjr;b8W@_2cLT*]j6BX_SGBOL?`dml?k4_0$ScA!S%pED&BT0_J7XeGXHVQ"al9@lC(qh7ZS#/ -%-2BiiK/Zbr&Rq&J#?7$YU=@qcQHN'SfD^NiEn-A6ECCDOJ2D/]7FXJ$duD_m6u3Y1FFS>Trru,HcRl*tH+\+-Wle,,V@,nd/%'ol -%,';W+(J>Q1.+TU^V;!:@h^%#,#/C\rr>5cb[jL*$jaj@@J98%)8,&m=UPfjqJ+#1d\(hO#b?/\;/rCrP)e"CP)Qehk,(_FVUFk"8 -%TF5a"0EpV%,.rXKj$;&p%1L4uL!PHmP,TsX/n0CXh!A8[&tie!6K^[kNp;cmkMkra'SFN<p_ssq(HIffim5(GjBP7CTsrZe#73+$ -%1G?H];_mj?L!>=1]O2:i[2Z&q$[:hEc%TbcjDYR;ASM&QA8^XJao:Ga_V<.6C`&M^Y'j+!Zs6uDlSH:`\YVj,YZ\LJ^,Nnb>R^`: -%C8l)K0!#W%"t6sbUHq)6gk)b9.:8ItZD<U/,o8RFP#2,&+;N2i(iMl]2>Ss;\W!ksYmIss!H<bj#36un6%i!$_]An&N5t>:M-Y4. -%(b(Y(*#C[g,to&?I8"[+UN)b\>!^/FmTp`<g_R6D$]GIm$mYNOj$LP4Qe#8D30YZD:gAZZR;XkpG8TZ[8DM$2a;]qn,^gHqQ9<r2 -%Y#=1sYn(4P(C_/^*TlAj_o98!VRBX;OHQk6j,Lpp2.AHS&h`SQF1Vp9,#F-;m`!"2GRn!%^u-u?0$GUTLg@NCMh0X=`?>f&;-+b@ -%ghr.h"i+]QMm>8@Fr/1;Ip6%&SSn:@21I18\%o<o;ePf@.i\8/d'mP,jLWIBc&JV&I+p3b]XYF)(@c1>)CDDXk=rX,7=>=ll>:Z< -%5sTAIG-Tkp'6tu1@q3S=ns9-.;)[q[$l"([#2\>t5Tb=BDIIonhmcn;18eYMUtlgK?IB:p%9Q?/D@9+hF.dF@B?$4M8[l2WO(;#h -%h%mYX!l[uk:rkRD2s(nK:TT7K;+\lu>lo&)qC84bhi(c?530-a\"\td9t3XW[#^\pS%C.I")j+46"C;5/cL4a]&C(8R@'lm[Ooj$ -%C2Z;gI(8b%^W<k%i7eOA/JKSR3<n+ODf->_p2FjfkYfaCg1'o3.iD;jKUs7$E"CHAZ0"4jVJTmIl9X-537Ai>,2+r+Kf7=:H!3)P -%(,&*N2pN1W'-*4/fg61+oL[DG0lccIh_87g-QptGQ7\hqb*lc`JeT>gDiu\_5OEu;&HgD+&?j!3XsJR+Cd0Qj#TfIECGG11fL!/S -%b88&3+cTA1_A4q#3<38o>uUd_f-9@jk/#[/]k+qadq_2I5ul=r$XR&ukQJLUHi=Ls/aK)"6G:LKd":np\[>OiOAm(L>1>r'l'kia -%eplN&=sWJV3FE\'\bMj:ps#moUk8#S0P_9"FH:?s>oo:8b6L2W>/]rb!B7D%#'Br#$0`i+poj.:@o+1PmVZ\ij9neE"g^+S<Iq5? -%->eVpH\f(3h*^*<^fj]q6f/Nh>1+AT\oG+pT\rq><niSa$s5+\*qMkO2CII9</Zte!r`5#-(Y9\jYs*G2$$u,3"7b\I$<L7!iY*h -%fqHp@Zu`Q1@f=R+T\<.[J?Zo*&@F4OIKlKh\[d:m[=EPf?Or_D!H_"q6)R.7&;+WP#`1ZS\Lof-SE_"3B\Hk"#'+l\AP4X0/Y[LZ -%7`*fUA?LK[NP@+rD&<@I4$3rWD0C$'8M;DB`1oa^1`C")-oZshqsQJ*2N5JI,t<+/NM@L`;Hu%^88(SQ0oQla3Q.3c7SD<;*]K"# -%\F4F1BSR<`!M78g?LkTlZlloJ?VAMp1pT7u[*\1DE-5)m&]Q=.9esl-^WW=t11Zej#447o-P3Z6XdF]*lRp<rJ!L\p<WbS0jK"YJ -%S.V$VXVZ@C5Y8e`S^VG-!^/XD2;[EIaXjEEBJ.bCYtom_nTS#iqJ^(]9QO]V60s<@,,hgre:H@t6"ee`1rkJ4!e!QGjt'/2nkGVX -%P6kZp!7'U&;o+!0ZdEUc`m)doAd3*q`I]IFZReR]o8>JAV!o_UifmJ.S66Q`YYt#.bT[*[(4#&u;HZISB(mJ*LtNY;9bV-:dlbI1 -%NN`<?b<jN(I]`+F1[4UMC@%m2_-M09*h_,h,25J*WnF\B8^I6eQ6#CM^<*Y`Nq@A-ZK!sa\m*!5Sl;gCd,!_700tm%(f\:s6"RYQ -%baU'9T-uC9U%1+SM6b/MTPQOjB9Q"Z<jgE$PGQX'rn'&1Ph-%=Nugi77G,kJXXhPnNKU+d^IN2pM<UcUfL]Nra-;I5NB6nE,,0?/ -%e[bJp,24YbfF1pDf36o3fb$L0$Qt@d-C",<O6)8A>G7(CJ4^L?[cR\R;8r;r(*qK_&_:R7eu[FL2`eBVYoY;sgi"$/9l=uf[5d[X -%a.d:BcJ5D6a>a>]p=kT&jfe)#r?l@H5E6Z*Y$D`2@*&9T`YJiHk,ucn&,,(%?:u7.ou5(,JU8<D&fPes.4\KEA1$UYVNu%+-4@W% -%\sAdkga!]a_;/ei9I%A<k<+^p=@[!$'.\*q(PP-TD?'dD`.E]S21`pm@2RMUCscI(Y?`4qQ:ZhO;MT$foBOelZ3]3u**M&ug="Km -%9Q5s3OiD,_nV,$)"'HEHC8ba!:[*#$]1ZZM#3/aGr]J\^>\1)ja[JN$jWj;CRBp?lWO_X8(*WpL%jo1&QBGRdP4D+alXEGtRgE-- -%\7etm<^d:AmbSAs*R<>?(e\UK!oo+'JG_+Vs(HLc(ZVV6kZ(bm[MgENJ<aG4]ph78G@M;568[)^E*%8"b2F9[Y7'*oU"!mu)7kKY -%AZmG\s1qRdCG5@&W\tC^@U^Me(5,BWGLbSn6SW;GC@U05<N3Sf)_AZkHRM:jC$AJ>VZpX"5KP*!5'o0UH3A4^h(eut]$ke,W?c?U -%YX&WG^R6\.47p"I(.n\u2UiUh0=7;ncBaM!_/hH*&E=7a'u:I1Q$'TtI-aUN=S'\iX6sT;0j;MIq<^q,=L=lP_JgF,,LS:@S!?&4 -%"[Wr3_,LD-g,K:aa=L$*U\?E`(#\'D.!Q;rktfF1a'7]CV%c>Xm!t)!9r6.'QFb_ug\o([&WI\"43WqXcj]Cf/VCgc8IqQsNd55b -%a_>D`W2:PHP-D7=#W`_GNVRQ=<EXLur,QX*bgQEO8F,sV._*MV6%bIL/;fP1'A@@E;&r7@OC@/U%+eYLd5*Kfj*cPo"u-m*^,ULm -%QpAS^I'J7890To2'6+M*A7rBuTo^'L<-JTF7cMVC,je98^'5@]&P!QrRt*1`8V[Bk&Nll3+`Wl\!sf"K$X[ZmE0#u<:rn5O[G<[3 -%O,oVL`DTEj+3frk/TL<Fg_u`>*[io<\!27747-8E=BM(!9_OKUb/B;E($n<f.38kn)Z7PCTQa`SS1FQ7AL2Ge9;F(FAF`N*btO99 -%i#@Rc:"Jn1I0+0dbnE&BllY=jMI(rd5CO>-.miq&,e`S+fYA=<29"qA8rs_1a@P;le_P=$l!A%cMb4<3g:Lra8g#TnQb$2PWWDHp -%G'9?$31rj2<"EU/b_#R`8OV,U%Lmmk!C4j/C.$bPHQ7^,@a7Fq49!f6@'1Z4VH`7X9A,LgW]dm\U)B,EmLFe1'SDR=A)]GjL19eV -%'OINgc0rSV$JDWg9,p?p&/)mM9B<GaUsZ$gB3uT9N?AkEl03[-[J6MC"VH`EFN2f0n-_]j5.a*K3WJRc%IMh]E:m^q6XZeo9,Q/T -%%0qu'q+M.,!g7<N5]Cj/<"_7#^TqJB_oI8BnG%/$gt!rJigX9l;a!A1"%&N2qd3&Y!g:4l!a&3a(da,g76uO^UL_;7[0W@J"IU,g -%QL&'["hjoaG!NUPJXL(4YbWh:oJ<5Oj6Ym>T"qBqbOe!(g7]+bpfgiHF+JVrN?d15CT3mRf'VnHT%MKemEVX81sG#F^r"N/+@55% -%_*V56#e(V^2K^%eMEIkbQUjiC2>cZ-mY8@5fOFR_i0p'@)^91Cf==k%`hH*Q_$t6t=0oI#1$[4/G<9NWca.=jG&K0mVkB+jI2>7; -%ilTdd_Dsf\*e^2qKo@qW\gMfu27k\hT)h_h<YQOi,qQT;%$'<[R$@JHpr8#l/bDYK_t45[9[3@_QXpNX\(tfY5k$X.MqXnD30rQh -%9fe1>>_k5)>P-M&Ym,(((]1Dp5Ob1O+_.Xdb80j-*u/RQfN5C-[mWlO@I`1>Y)u\5i8%Y?"Tsb/<@Cb)<X^O!aQfq?35uHkI*\I^ -%WW0<oS(^OL(@nHk#b0)%)s"$LZ_O[SE;2r<d-#FJTW+fmPi:'=cIu_%%:i>h,K1\2cff+CF4HAK#4L@cY?tbl6$]P<Z`:Gi/A,Vb -%*=e>#kdi$NIJO6D(>76Yh=h[>>$Q/\ohnt,Z&tFD9:Do-gX8ThL[f)R4"ilA8B%kfe.IiJ)%2VnFd.+!'!',FHr>1Ql-@#%jD\1d -%Bd8@]5+.l!8T_.n#c?^MJs\2,Yr2EuF[W\sF/M!D`7_`opp)c%1+<F,(a[qkicJ:fb2@)l2&YRK:lO\75agK)rcW7_D>W,^jY%"8 -%.f(*KNY:&6?)qp(qtikNM\.rLCIV_*Wp)H98s8q5EY$Ag3P.m]85'Kqf@'kB]Mb"W*&.8U/6jQI=$)>%d,`59ZRe<A80YC#`^QYI -%5IfLuh5(mhW*N=nq?:=Ega#Lc9icShM)[jU_P#jk1h.&!)F;t!k8).Up?c$[>uKe0N+so<igM,?:UfT*(XoJQnt+ZI-"RIJ&"Wp3 -%6ubE:@U%2)Fq7*`4MC5QTU/"bg+dPaLDEi!Ub.&]_o"PTH>Q.O$H_t-KjpG%1T[\b5ttr7IfeLk=3^Wm"VV*SL7]kL!B=FEDf,Ur -%Fm=F^),cM7,OhS<!u#),TC,s;GaJH-3:.mZF37AkTEgO]l<t:U.hGV-,GkNoQJ1^VShUf327hucmSB*=\>S+;_A,qQ@U`?;]+6#> -%p4Vg!(T.d\Wh3#ERY*IA*7qtO4s:kmTCc)"8nBCe13Y.<C%8>J#>.4Klg=h5<=K3(9#7Jt<oDuQn5.Gd4W1FIe)bshJ5!45+Gh/b -%DRnRu=F-K;)"`sl`S&ELWi(X0'YBUOSh4[p)Fqa4Gos;gZ3pXEXJURhh2jHB+>D*Q$`N?Tn"@HQnIJ.,O$Jku\!HBbkXj`%S4T<s -%DYBF;(-KJsWZ=JcJhDM5kV58AFVG@>"cpqRrSsT,g8ujH43KY^4VUXlUYFJcB/&%OZ66*-72VaXIlP]^X[L0Cm%=ft7=='%I^4cI -%@Ydn\RIo"9hI<C94mpl,YHmR96Q__=>o$06X;`>Dp"fM%mlTtJSpG,Q\b/:?2-(f*FS*VVp=_2b[&-d9#J@^C;:GK9WcYP6#'[Y4 -%QG'6OD>Lp(:>ZJ7[pKn!'3F)Jk;FOj9b1qTTS%P^^6d_-K<oaBW&(X8$p\K^(Y$.JO9>Z2)Rg*:[2_TDN4B%3He(]t\.*(j"TYPW -%Hb!7iP4?LcE^cGRg!;#h7j44E_PaV]nOG9*TcF?EF+ljr<MmW0Obfa*`_CuO$N+[8Ep<?,8UkB1D;a8e`@uakS,c/2&Y$SJ^)2XJ -%OuhVai3=L<b@sG4#s?o!G4:'.;2.#@9!7ZY:j&JSOsa*oq?aL<(;'p+83f1I$ghEe+=q3,6c8-n#6brN3$&X%Z:e861t+r^U_X`q -%6h!EHW*8tc%*k3:3<L5+LRCmRs1_/qM$moPb'U_f%hHB#8lFUi;p[RuRDp2mK%R<G!8"BlMt=6;hT_Rkn.ZEuU8LskP$&TI,0YGV -%7!Da*Idd@i506;IGXat)6i7c_CWHun<m2IoK[O:+\/IMS+L$HK#m_"h/"JifK]_Qk0K^+OT!5FYP<YM%%3Zn<<8?IaCJn3(;1%F@ -%pqAIh4B,[Jqosk@4.`ssX+=r?@Xp^pP6T@+=-50UQ4[FfXGVe..e-qnU'P8MmJ'@`8U<Wbf<Z]3qG!YMDSufCclNPI'ap!-qq)b` -%B7i4%)H/%(]ek*f"K<7*jsu<Z4[P]q!-aKG#-kCKE/ai<U:)Wupk0]%4BpgGGFs^;@OA3RHEu9\JPWLhEefI-i$c+eATP,M@tK.T -%dpZmYD*)O;\@4otb7*k>Zj\2HKh^s@(26ojih7>lJ^P6D.M+8p(o)5Q\-#..!4u4:G*OcYZ0T?B]h_ZuM:'EYMk!.C=[k@#;:qkG -%%OYS2O7AOQ%6P^lb_$dbWPW*c9VHTf+jgmIB[==u,Bird%$/gOiN9)AmD@Mn2he%U4K9bS.QJG)a)i+aA[i>jg,oqUnX2P3$p^su -%HNZb66O)3c@t\oD'.`c90%uLk38UYL'JGosaiDp`VJ@75miFje1>=4;@7u&tC$a'h>F!ZX;Fb@SPqX`N#sAi@7/JXMB**^\P`?gk -%12.F/biR4opP>qdai`JBTCLkdG7r5h,lMT&6>\-cho_`/[",b)"9<(<lFM?f;qkQa+WJdI)hq5:"8'P1+d[s3]qWIUZoa6B/I.%b -%,kjeR"T)$jOeS"h%GRB!?(%Yai=Ia,_;`r^J+M`^MYX^gQ=J8mdEWRE#U*VRFk\IN10Bq*YtXD-10*T,j1^#-S/(a6msG%g1n>"W -%C+JhW_Dds1p0;uU`1A`f'A?j_L[I`MfH$M_6!(&=K42Y:$VPiR:#@5t1/H^cG.->67[JfR++CI0rT8G)AsJ)c3O+k=%O6eJ@1/?d -%nfbT5F5li&NI@h+6j%KIE-j>HO\S*faWc"ABoGVF1^*D$?"4H3a'`&rFE3LH4`%Hn-_C8H&\J3!"j8bu6YrIYZt.4'&!l(C.]43> -%]36ip1Rn-s\d26p0NO$pbMjBfB,IUDG`SS85r?k9$rIg%;&EQ"5fng.[@ql?kL4,TqFXuBn<\_/c,K%*!^gJ3G[4;Sk[-95+(q+5 -%LME?t*j#J=S!a`o+V4+4bo@1'/Qok\s&$W82pBD1=4TP$,#i=_de"L&(L0qeZf)J@Sk!n,aYC\O*fP:QKec,uK#e:*\FmY>JiFh) -%pWUu;hJ:U`79'l"D;oQO[mdhtB':&m:#+$[_1;X7V%Vdr9Q<SRL5di+a]DE,ch^R)HESW$lO6GiFg'.V0=KFLW;3I]B[0)"YRpM^ -%'S9RXVuW2;l7/.mBV+!%G'$LsM3V6=Rq:k=E4Y'FA$!#s")itWk"0;jM85J[%E]^bf7F<U;BN`jqJ&X\.RV'JDbQ`e_O4@>kLf[" -%P#*oeT9L+(D*0S/P_Hsbft#$;=WVlsjh>6B;<%kSWtN9"__aBR;X+bZ_TZ5Eg:6JY"dC@=kE2T0R.76n@-2:,-Lc:K$LY;F'5>Yj -%p.%p.]/IQ1TX&4/4BT@Sdj`oRIOJj(Yh8+gEg+e'X-k.6BaUKo[K$u*2AknM+86FPFokd:cSGfPJnshZp^S*O"jV;ED(KGOIVoO' -%oUE^:ba!Ud'-YUa\H,\]-;B2-gO,iuQ#<E4b&&>1@;?/r7[,,SPnNWP=4CqRG@lN5]/O9d:0?0EM/n35_m0C<ZPiqqQ9$rZ,7d!> -%Kp(Y-KgZ2lL59t.3Mb"+Z7h/*[0ZNB14?kf9r#XWfc^WZ2H=NDICsfTBH5)E.YI09(1Ee,])a`<"Lk:qfI2(0fdlq-=pf>DKW>iY -%Y$-\?@!/6FL3ss&`n7\M\Qm(T8sa%F/*Aie,\:4lP6;k6Y,kuXKMl6]KDtt1@]t#no)<#<1RCBbLL,QO;O"?[90m8aG$uff4dC#B -%);upJVORAUPEI.mfImNtW*VL8mY9K(34-\#hT<kQ.\q5,D)?sg)lGknQA+!2H4<Eg9T#3MM6hc[fO1F=@FNG"*b+=Q6XX=7Hs`a: -%,n_k+UhU3K?R7D#V$&,rDsmL)l#h=t'+JRr("$_`rf+W_H4MK6dA8VSj^()A)]D'f&hB]I.&5bb&f)!-`ZUl_f5LaF+_NbFBR/1+ -%FL<of\LU!D/s@%o..A=>U_LC<:]Gc;EhChbJ.'j>]nNc`i@%FY4N)+15_b".>Xn5)N9o(Zq[6-<%?:HWhqbd@AR:\)ZL?!WN[5Ld -%:Es>e:QHtgb]b7T+LX4tf=2ee8n`Cr`]nPK7e_5Qm?S_VKZ,VO[fqLT.;*Hq?h,f>l?GSj=Km$?:-(4NXN83!`I>EBeVI=#&^ubk -%HH>3D>f0iXSSg7t_f_s[(_d4bk?LdQFu.bZrs'RKP&p]37&P95H1e9/YOWF-dA$k<7;C[-.T8%9S6]-e?M&9c^ekoAHYVTHjf_W4 -%e@'l!EJLRj6oRAD"VD#gUd;X6Z<t&Hp:#]31Xo!F2Z)55?\;seNk;-,N.@d9@8V$KF.U/@;HM!o88+WuLlHlblK>%SR,/VZG&fG' -%VC,KCe@Zm\??%bQ\U2n"4;65kjgr,,c:%n49Nj'#0I$2GFs+6I&ScM4[OT?e@2,2'i[6/05fkdEI^oTZ!1*Vs_PpEYZD'G&=_;@R -%5QHf0=Z&UF#%X84%A0);R2LZKN[+Vr^p,)qolsq7I%'4eZ?^39U4m:kLhp1_T-#Qa.D%%hm&K'+iYWJs`b_tJIe8lQ=<e@Bo&o_R -%=6O+V4sd3`M+C$;7pbc\\U_UVF6c7MM_s?p1Fe?[EffmkIqLCoBs&8h_`0qpL^97Vb?g-8FkrTZdoZ1?Qr4!aGbuo>NF6UN#9P=6 -%Man@s_m,3Ro_FBY\M)cK@;g2aR^qb;r1b8#@2XFZak5q+\M2ISJ/r*eZuj=+L05JNFcZ8F3`nF)<aN[nk5$'A7#IhkU9gF1*,.H& -%bpC!GQ0:7c].;Eh)_S02Js*J<$>q1Ge@JiQFm@6X?nIfsfRG`gOH>2[qsOm&ig:3eERc(YW,bXbL$@:\&aWf"#[m$%<@pq8jhu78 -%ea+sG#fKI]YF=m8<0O0JO;,$,!#!88b7BA,nI8@A]@Tdg"+b9H_=a]N[]jF#*SDoIbU.U^F>.bkXjn5Fhr'u-CH+M?;242./]Y)N -%Mu7.pg6O=2ODq<)J>"N9=M+4l-OQgoF/AY//h!rYin)f+:>gWCrQQ6ooV4*!b:Jp>7E1N75:V"31f1MF=N^%V#DiaW&ZRLjeZ8=6 -%WW';m5mnX3J%+,OM\TW4YmdO6Oo!&p=MqqcMbujO@doD]Fh1Es(2-qRp#6EBbJc"[,7A:_pYr0A[0h!s-2B5G)'k`hl#9<bNC2R+ -%+JHL\H,JF+e91'<pYM1KdWG++fG2muYpPR[!\\AW7]*7uGktL>P.b0pr_:Nk)$=jX(]*TfT,:q/UhscRpf"g7qFIT<a!p\K'<-US -%_AirEDGf7`?dQF=<"=[I30dEYZA$#s$qp<Cp/\]Q:lkc(?.#k!Xb;_GEPXQ,3K-)qG*fnT*00GrYa5u52CX;.5NdV9o).m&_FdPe -%W`nI>s1smAL?t%ASQR7ANjg!f]?gS1J\/tu&T5\&#A4nR-qR'YaCaS$lYInP,"[t8Ei^_j>I-n0`1,_:\%BEkP#bUF4OH$o-\Vdc -%Jaj39oB6hFW9WL04'.!3c3S^&K73$)3i;h+5=L;sQ++X\8,+3&Z`;Hf/*Q@pcRa"".Ej90)q3=I#Zn<J(;I\GeYHgPn0aUp3au#t -%D8mclVJhV'06db*nYdbMRI_4l.KVChHtMiFV"p554uOibQ?o+=%euMmpHh$hh^C4)G"4]EG$[sto<4+GVB8_Rp0J(3r>+Op!iHbc -%hp>i%Q<p*q+E.\"DD`8`Pt\IEa)/fK/Tj(th-A,iVjjMmmF2>_kt^pHRElhTdE9+k%_"@ZRV8sYK,VM[h]&"obmHE^&9l,+NT/N4 -%>60b"p?2mh/lfP=/h&NC-k,Il@ifcroTJ'VQmpbPkmdL5,Jq1:]d^[=I@OY=<asInmNb?^X3`9*%P"`ioi[TlE,\>gc[Su*NCU8- -%D.+T!BRd:b+I5REEV5Ns`+%/<q5Fi=:^ok$p/C'FSL%f(/&fB'%n#qu<]qT!S3<E+fr1"pjQ)7f+qMc]qFrhTH7ZSsKbj8#i?[\T -%Mh=GSdK:?O3*p*Rfb,AVqAreO1;GE;5#Tj??r7UH\\IhPh%F.5^%fcf/7ILP!g0*m-g==">cDMiW?)&g:tI3#_K6\5@AoT`DG^AV -%?G(KIkpGQ\ZF`mU#W#=FUZAog%1BQ^HV^mMckq]*Zg;;@M>[q:S>:CG6>5k!-q]<Z@HJDbWW<<^`oDiuUlp=J[;KO\X:,)<,/r^G -%_f1]tiCY/K%QnD1kH-C54GN.o<K=@o.'4)sUpu2(%5l:(?sb'^;;dd>6IN[6XMRl?$;t#a*ehS4/1NeigEEQGPL:IDn&%$*0"jGT -%<@5C!1I(FWLm$b"Et#aHRaIU=*Jlp'p8+L.KM2.VT/.m;qC%,A$g@+KL%jj>r9di*5mNj/;_BUhPb98_auYpH?W`o1Ihf+6X37_r -%`_S-3g>JpYdm?)t\<G=*qU5=Rc,>k-rSpI"--DP!GR6G7P8VPgf$_>9)*9g0\r8&gA'u:<H_"DAf``r9A'n6.ZXGFP$H((E/[sa\ -%WQI<li#8u&+tqfZ\P5"P33j/?TOd$c$koH%[UBZ"Z+T6XB*Ub<'IJBE"EeUbl0/.CeJ;+bne_%T-.[@*9Tf1[TOrO(UUPM+j]O?c -%>>bU/<:%>+?`*QigF;]ncGWPD8Fb<R+Qsfd<H-Wjp8Y\s>MRA#D"3_:@)/p1Fr;Ch3(D@A4[iNO6KZXI@6>Kp<L_dn9[OD&e?HgO -%4l[Z";Wn_ecq4_#eX8L1Hiq)[B!0k0LL9%X?m?gh[n1Ve#<X2BBDJsoM[[;;=foM&X+_n#bZ%[sa[-da/#SLsk]XJ@n,oSLa@%s< -%CItA==W[jn"]]jEIA,(L/aH-!9#:*b4`L*"UUjr'R.p0,l:<rsa?NM["r1qEqHsbcH&ITRnTrQ3nM%JIA(U5&:m/cuBPp'Y'd@'l -%&qtWOZf2I;0K6\Xaqm^n:o'+^\jKYU4O0PH5/HuWjE,.e:Z%47>$Ml`D0DOtqSe6kBeH36VI";QFOhF0^.E_l?&LieD0*#^LE`Wo -%I<L"4eGdVR5BRC&qVsT;RH88G*'M3L*/dsO86'/J!@VXDo7F%TWsh+FKt%dIP,TVU7_)lTQWI(f8kK'ia%?<VJHh>1e064irCW2* -%<n;U1(N'9T2."qUJ)e*P_<=J`%)d(spop8rij2s'8pVc:/L!4q9:h"EHe3-&Y!n+0-k.UUoNM7$4S\6G6s+(G.b)t+Y)6,#.r(f( -%MeN2O@ADUA44acn3Y`@]-LF6<G&q3&\q"#p<@',h81c<M])@ZMq*QZ\_O]L`>G]*amAo=k1_i[gEAa.:?j]du`7^b'LH8/r?]aAH -%,Jk+Kk&2_:Q*add+IK/sp+TZ&nQdWY@+\?.M=_41!%_E#<*?8Ni^4;j"Bqco<)`9la]DcBc"kBMZ69WJ9b^5TSH`fnBJAj[S+DKi -%amme'Q+4@YNU=Q-Q"-k*nXD((__6!S.IGE[:+KrGGsA4A_ddm%P+XWHOsC26V7S3iXkb05oEI;:@[3%Eas3q+#/0"'U&@]):j225 -%kS%@*nLDj]_Cd.P(/RZQSK"FZc^69t%tS0ZXs)\R\IO=6'gYWV@[#T%Y<8%bkuHsrIhoRhL32r!N:4PK%S][[\mZ1kEl^KK($DQ] -%IR^SDMPj;,+5ThsnT*KN2tC#RoW1ED7#X!iLn]TifOXAL@DJU@3r(c[LOHab!%_*>^qpc19i:/gX*PIf>na4>jT]`5/BegGLAc&= -%QDPdJW/!M;G*AI)7V*Wt6VT?Z5@.kK*1*f(3q.ESW7#>B&BQZ')'4;-W$OFn8lWGQQ^T1lJ>@l!,Bdn1`eF)Zjf4f$!//K7_JcdG -%>mVuQ_)(5VI%Lf,:HM72*(a5"\]_UC\nNOdOrm\@Z_:3Q_>]dGVCMM\2^Mp$1s2g.2cBgpW-Z^lKt[Vt9\<sRH_f#-:5i=cM+P;, -%g%BaO0XK^?&SP1ZT`V23@IIWr$n\YA.6/:VN\d(8VtN;i'rZ^r4RV3FL9?eQNjonu;&G?':me9e.j;I!?5!BTSa1tdH;mj5/-Y)t -%N%J,74Lkc0acsg52F@n*&*`P]^#q&Ql4%,+8mP8ahhhl@'oZpN?r!]d6Ksg+)]gX.rqJR?2hQ-85LaMk!%U<maAVk2HU'5,JE;.3 -%;+u4(QL6%KMRF.)K5SdCbIFQiQ4e#dF_tsb-AK@<)Rgi.F=0+`@9BB;Kk7nIHB0dQqRG]UFk]MHNM4ju#4D`g>ZaAgTgm(ck#sBT -%a=.]5CmT26S+#C.#!o8Sb:K#npSZ9O#u6geL&BRt6YSW8#W'.9RT]2gW^FnlEM_R"e8\"lqkog9[43MVjRH3G2fMrQKKpK3_.n^_ -%G"%3[jeBY=W2*<0hE5r:$e7pnTPa.s4uH3n.S3X(`O4Lb/]hP_cnOB`LVY0rJ`GjG.[OW]hNQ":d1bt3Fi\a-b25_JBj0k&p=Ms8 -%,tc\!$P\[Uhn^Z5>%&0IAmutrQF0"-a5g:NSFrIpTj;LG30!M*E3-$B9;\#R3D%>Y?!EMVok^SI)Q@taWTF?qJ!Qk21%LaeJJ?Fe -%"`R,Rm=g!'bLeWrX*+KdY;<@jU'>aAA[6/tl@+K2A8@1HgglZC/kf<4$a+6A-?FS==G2e'on8Q(bE?qCEq7S',j"#'DM_r!C`:+u -%70E";64EBVE)2=[pK7t9iXfLSn_-r'`cV6KL07rM`ElD.(FlfSG$i`&YbIYQeaR(098?pGoR'C+4kB[>_uP*@1f/<#bL*GGn:X5^ -%O%S)jU<c-4qe8(\2d!@VHg6^/E&B/p_L1=8Y2d%qPRqOqPPUlt?WY'<4J=n2/eJnJ/;Y,aQVGqd!!/NL@6%9s0OO$&_&NFm[9:A_ -%QB?MhOk/,>%_j.r#QeO:@VXF[UFH"XP$,:Uo[V`c->&FQnW<ACd2%e\0cD`hnNS4/R^P/.+LMj[hJ/%[6*:?'0T8oXok8'F1U(%8 -%XN*+62WRMl88"pU<HJaRNa%*iVOZ1<5jjc[<FF8pd_arLLYpf%h?GU:VO,B6?KF#AEDD@M":_bb!M7C%0($%iqi.r#Biumi/Vq*R -%G3r/IpR"-)j\%"%S<\7u1a"@C2Q(R1B1$8FRM%`b^AiXglG7?"'m&eqN1IO8#Y=1bcCjj3r6E=fJ=Yi^WiPRT&gU")&Cn"&Vn*_T -%K]%1NL6A.1AG?7UFElE$7j&Ob\0OuqZ"/"u@b##+5g[[-LZOJ[hH[@n(%)e,.T"^ST5lZsZEZ.&hX=Tr"bgg!6*FXD`fZUbKGE// -%\`DHD.=TZJJYg.2D^k:iYaBV]'bp@h1#p,2>#SrX>`0/Lm&ce#Vj'kb1Q!b86KXpim'\E,=V&R\X[G9XZ>sS<<TtT"/eM3//@[4< -%5`;HJ1rs667OIIb,q2*.@k:VU;H^k3frd8DaVGEDqCD*Z[Q'(%\QH?K(kgf]@4]:@c=+\(5b'8PCTM_$?G\9I,[!FSat-T&Z::jd -%RK8s!1(8!_Z_Wa,BnY6+8#%-UhDlKtm9Src^e>>"/YmH^/(^r;NJ#K(HddlEG^YN,>0[G[fUL/q$n9rj9219WZ)jK8ij4%IS!6i/ -%GCLuE4JE5tDYJmQI[F&ao1CC%71NVgK2_3XC'_h%+_H0+LO>?Y)[+`28'qCX<H0]'1I*H7%#N2oP6PTHMMgW.c!Hb<Z,E#FEClFi -%#cr)+0&]q'<M=KX8ZH$]*&pC5bG%tNmJ=:MO-kd.*bNNN_<Uj3>NJ71Q^TZlSCU=_B"UJg;?k<,Z#Ha)[MXn/**M^olq/N.c1)_s -%nn'\L\;bfg't'soZaWg:WL*eo'GGHjn@L[M;k;N>I!,inOtjA?U1.5=D?H!R067CE,;q*)79c"pV'g0]mNu!8TSodehCD>&8d\Q+ -%6NTsMqP_0mGnB?tnRD8,DcZX24L'Z-/f*Ik1b17]3F&N*_M<&jm$GJue+]Iokl3UPH5'H9(j#oAdSQO+&P[r-)=T?`*H?0j<%\B$ -%=\]>0"!,J_eQ(#:=q^VRllC$Wcr%a(1,&gWUG(<_T47oCG"`_O4>/"%2uT7?*dS2k_nS;D?0lY#QW10++<V.Ym#@+lP*]qY0(+"5 -%JpV8!3T<h.<s83/=U]OBc_EYNAtH>?JTJ#Z#$!2>DW:Js)L,TEJT^S0!K&.jj2.>h,?9ZSk+',#d2HuAcDr6$2sZu:d&`+B%OO%I -%@6lqm0gi]Ak>:u3`9dPOcl>",S95ED8ENW'BZ!j:!BEZ,3JZI!S5XT.aqs'M\XI7HcI%D#]+tG7iJIt(0>9Gnobi?V]f(n6kCK*] -%b7S[$3?`dP*4.`c>\_2jZ8i\a_rl8p^<BTDI^nOA`DaX8M9S4Op%F-/U[M'b`/Sgm8A`\LjV)-KR+2L:^PM$Br4=rO"IcZ#dK"Pj -%"J`!f`gK=[i9$F@%/j\Rbk^GM,<Dc?'\b'&D3VSmfKsG:A3R"Q1De)Z3"iPPk+BU);fS:9^>'CmL6uK$_1%ih0OJQR)$KPr[,ek# -%jqIl2-b<nL2IF:nQS1;"^>\1[4)#]$EmQ^*$0t'IO!WB19eKdO]sBZ-SCMj1X)rrEATeUsRdqZ?Za!&d;Hh"cA910]2n0hCV-#?h -%H(l7L68?[O-IF4i^u_po/3>Mt?ME/7^u\[`59YtT.Lk\kk!^q>3N=3ijpPucg9>8&^m;;5$3P\m[p8'pg0eKPT&^66@2.Y[Ra?ss -%%eENEJ@XcX&CXq[koCM2]t!1IE;khKO,d+(/P!'<o@!+nb;#D9LC>$cp*+>ebL[1$h&BH+.oWdj.n@rsjSWNJb&KU>;T;Z6NGda5 -%$^k#/L<6VBa'Q[ZO,Htt"Z2E:!@j^9"iZ$A8!UE;W<Z>Xh7@AXb1i)k[h7`h"e@aX>-m#6J9!nMpuB1<Dc3"[FRnQB@'Ic-2#]AZ -%j=orXgA,.;KrAi!0R<;N%5'YpS,0E#Q(/-n$82i7mubm)-@$PZ].P?hnkt?u3B70bg\tS?HR<B30-5Cu;RjN)f-b[:<Yh?=[(1kO -%^rWS(7N4g'URiu<j=lNNIbZ@BF#9*%R@G>pas_":R1R1:0+^-EM:7nRY!.s*<7R3fjRDLA1;>O(\XubL;TLXA3dHAk"FW@l-\-!_ -%3ZJ56ZJQ(2PR2=q)@1@+BUX5,,`onU@,0`COHVWp.$@@Y98b"0^lPtem,USWa.eFghggdJpR(7UUc:G#VD%L"E@YroGn";0E6"_8 -%nVnPZqF;E9;oe3]\@eNq8.[PfH83Hk2<T<'J8q)Z1M/EOdUlh$ET$#<%`T\br#I*!9LluCNklYm?:.I!XDqJukE8)i+2aR)cC3.L -%%V`R=/nGR?G`,aoM_j4aO]cYC>EmS>B"Y[$i^F_teVe5P_dc-7*0M3"fKdR;2e!aS`HrDSEM,?pjWB$C<YbPFnDZ.egGE7W#0e[< -%MdpRt2!CZlPP7E9ZJjf)JhlO1E,j6r<93^aM^*kUOkj^@g8rX1Z8b$gV@P>a3(5H\1:Ab)W"+]$XE]T4pnEX5/+@/.f+8Ms;S3-E -%rZ[5dd),u_*;s\RgM*6=)r+UAEH'nT`AgHdM3+M#Ngh>dQU4Ue8\?b/.Q'EgNl$IE.[Co-0#b'V2b"e*!QFM%&^S&h2;$h0#,V"Q -%Ar(Z/ikkJ0SXK_uTFC9tZIMZ$?3G8NnCf%ApS`'G5Q#L>n]$?rMYGK8+(rYQ4<1,Gc/7mW7u5-:%Y+KW#)C)(94-=jb`c^4]s6O] -%NIFkfTXrLMeFLQeT8\9/+,:a5#Y9-#iQKoFRi&l0S.&jd=$Hp+N^(QX?djG3i-iM[\QR$-<]HP/)CPMnKf^iq;;kg"pP0Hs%2UF? -%>D!U'*9mh+2a`aB*.q"m3U448ZTl,@iQ(FSKPt?3_XfC?%7#0NQ5:V_,nQ%MC#Qn5e7*p,TS#IfI\us1#KJQ>)`.!A!^>+]nDO)[ -%frFqhK0P$%Q?)KQIq0>!p2p)fi'!$5D#5*ji2:Z(%K[/Y'$$l%k<P&7E,[A\R4ek)pnEDqIKUT0_p^/$^<kg-+,C"Q)>rHS<bjAH -%`1lc#F,JgqPJQ3EeN!_QnX1s`TWt3V7YAm,OH/Re_,4#91?AOhj*i<?0->TT'\D5En8,2DVLk/9Wf7Gka'^5Se=-aSO\9mO%1VOJ -%#oZj=3j`LAd00Y#,dpoc.^?Ucq_es)"tE_-*&rsZRTqJp$:%;3XYZ(&\2cm!Z,#<lG5"6F[YBM/;qK2:8b.-src*S+[l$/'&9+iT -%4##U*:T8e?^^6,Pj$:D<la&JO**Y,FHm-:6jhhB+3)gR;Qj3VO$a?Af<.X$Q3+)pg].B)@2uK.#4o1g)p3-sK;4t[$0Z)@=!53r$ -%U3bi$Iq+$BI8t"KO*R=JPhh(PqL,H"I^`n!82.f.o#-TmNe,=!_Dh'jI@3Phb\q7q=O7o/D^lf2)Xp4Fj4e-Y@3`OlS\WRF&d*WP -%+f%'eS(@5KG3`G[CBM<bMfmeL!e00@,E:ZiB3,ld"2F[+1g'U"iU_i3[N"uND5U:%!W87NWdGJpM9oYpD%OH2'P71tLu/=`1!b=] -%^M+J\fu.emVpX6BIT(:)<8`K.VTbp&\WPcKfJ(YeaDYsZ9M'_"r(pA.cu^DFWPX'eh8jL_LkLr(OPc;mMrAL5G9W0;V%lIKirp0t -%pd0F.^<Kbr+MV>.9k#on7ADX*r7+e&WR'-bIR?8pKOu@AWJ"lRqa,a1-HAr#+MZSJKje42^M2UfIj)QQYj7)>9`rsoS+mF#CFX8` -%2_I`smQc4gOff7B+MTA';I9-Xr+=:;poISncEN],PX^*Hd*[dehUMW4b;!*=_!fgLin_7c1h'FBckl.t[A`s\n=*XAKDWYsaBZDl -%heU462XHpl4N<`jp5LSrG3t$4UFn%5qIG#XA--M=^<&oH8^[fk,OVR\RHAlaT;1sqA%jDEaU2`(au=X`X';MGh_5>2C;r4+X2]Z3 -%`&AllWp2M$Ro)[*0nSo>L@S#N?A*6'G(,ZL;,6ItZ`m1!7X8sVj2VW(?7l98HuCo_GJ8e'8TpI;Hi(Ul@4\P^-efT\;=I_%D`42: -%"=2f6mmJ0b1>5(NLB:NrBQ)-Om[\XMh?*6_GHtcr4JF?l%OPQkp_+Y?0=Eg`Xr01QRhiC+$+;c%5m9JhDjjh-'l7gf7%HX7L(DU` -%g6t6D[Prfme.ur12bQ22"s;AK-j/YqF2>Om84'G%^qEU4+a@2+]m5rDL\caP-\2BNNt(hqB6QiC"7FF&NlUd_"8?DIc/sT[mS+(A -%9*+da785c!E,Vam-*]5]Rn]`JX%oK8!I^`T`q&'$V7\)Zhfs'W8/,%]]eNTfPPg./VZ3EgR)XIpM/M7b@As:l5'V"5jd[1V9`kKj -%JbQ$1D91RYDoVTT4);F:g:18#,XN,q<ugc`^c.T\PdCSP3t^$0jp'i7^`khWS+&!c^L\(mGqdeEMXV(-qK6%rDg'*n^`j'A>!/2J -%XT`hbLPUEch^Tme&dV7_2&5ujJb\A2B:>6-&Dn1tX$qONhpean,;J2I(4?X1`])/lL]laBV#f7#L$J?#Tb).^[gE.X5V:.;[OcV= -%+Q@_Ur,9M4I7Q7!&&^EpS(*ROpf;4lS++Z&M9:p>ph"Ju1LMoN'e\ajTkq_m3pg_,pia#U*l^,`1c')!k>slL.\A=1hfKa$DN@dN -%-K(L-hcN9;q\"i`()s5NQABIRnWI*t+2g+ubA-*H`&HO4Z93a.SQbYjIM9Fu8k*r"&AHg];Xu.J^?PX[<5/^rBe('Qn1DiBHiL`r -%Gc`DK/jE4nYkd.s75B'(Gje%^a<RdN]Ks=N8_q#RhDA1-Cq_iW5mmJhI)@-CrWW(O=c.(f]kL;ddXZ7=QuRHT^@@]Z;\jb!A4W,= -%#eW+EM#gL:G]+os=g8]hn("Pu$u.^j^<"/3]([V8+1ARI]BWdNGEgcBmX*=;YWbNpF5DI680`c#Tbj>YN1C[a>Hh""DQ7oAEno<K -%=(fl4VK[5_oo8SbaU,9RFe`G.-_Lk29cWl,a3(:F9gX*a]XQjoGos(qhU@\fAon-IV1Q-7b'Ptci:ghP>bOm_hM)F!IB;FQO)A*; -%@(\eh+C+B0G]0a15eI]iAi;+UhCtn;i>^a8r;sm]OOO](;#n8lj*1O_GE:su(AMbIEn"CCphmlT`!q.D]1Hg^oT'TQNGoANpIN/+ -%^<,38/IV?0>(WGo.qT-C&_\&0HT[Er2RRnA/(TGu_na^RMqQqRY\[o1@]ZY-$"WddYP<h<hGh*0Fp!]D1j&f1!HR!]o*pq][E(t2 -%!;7)-e[4b*6/]hBf%lP\ct7DFlq=lTTXo9n10jWG<QG?B)_$#SBJZQ5Gboas]%Kc)eO/Th>.AE=G7OiAL$7Z%eH>$TI:a4Un_EoO -%fHG.9SHMju3-PlCEj3)]LH/o5*\#eCF,rk!"bh:6%2Y<L'MF]RS'$_a0YJ(R1YQSM9^^Rc]\f211\cUD%38n6BR9ilM&r5\n@2oj -%^6QWVcVV/W3:7Xen=Xcr]S#IbJ8p3&c7Z8<'_c(d]GqPC<npB\)8s5g^,XogC(*%G3ROmrV/3K*T6NZ3="pV*_2[QT#(g6%-OT\* -%mI2g>@FjEc!d^(;O`S+?rE*9lXaPL]6]+;8=<P+^)6BA7"uj$MVuL4F@uf*p&Ie)-M/`e$2qC?D1G8\#k7WVeg%]EU(%6/#[u!J> -%6-DG,2"38Gjh]h$%q-AfXq$[F3kA\rD*Co7LmYs%Q_PGg/V/)N*qSN4Z`RnGKu3-E$ou*@_#:U[oZQs*rg!P%7NP,;])^VC;h>S] -%D?V:Y5/;">)V#VaNSnCsN.RolE8r,=2iQZ!.[.'Z7Gu0K:^L_F\Bh`G#i,:)Vl&-K"IOUim;j_iQ_R6^mD*DEj3mA2W'E;2^^Yo1 -%%7/oaRB9Y>]F!B';G$2+^l?rBS?+tp_\n[SmUC,Wa#=jjHs]68,$G0_+%&W,_r-!3c/<1eB]^7c_$u<UD&7holjRX)K#+!K7lPua -%h<H-qk-/n]\FBo104G,EKnUuk2M2sp=XDi>K,Z[p`2Nol)msHJi4C[k\]`G2i.`p<3X9W3!<8NU9(9=[_JjpEn[BAqib0D2D$H"g -%GOR"I967B)X*BS8GD`7CPm:f9H18<=UKJe9KAU8tPiZ"uho:jmS8mSuf*kXTMnY1N,13Y)hk!1CkKVjqPn?gkNS[,P+JHGBhM)/t -%XFgLkO!omu\D*d*kR?hOLl1YoDNFRWhUHDDN0Y(1N3j#2L]b0sMBO!nMmtoRn2Lj3*lHOh`bbh)`n8Uq[Z-kE*4^^1:#-&Z$&3;@ -%#<6YQ2@sR2b6;Xm(O'4ABU_]'TdoWNfk/^67m(Zq)NM_e0dtei7.['1A@k@ZFO[*bY%XC1$V,1[oau$"+L[u;TUIS@gIN.OdgElK -%aEM`10>9?-Lr<I%?5k9s7biTu?)($dJnma<2+kpr+]Jk?1=4`#>-&:8L(kQc,dIRTXN_N"\K%b1aNkPf?!(rC.r0]EWci17/>1^! -%=Kqkt@VWg'oh.!HTs\XT?ul>Y24!`sDko;R&G@%KU3<T?6%84!dbft\c/fpZ(oH<Z77ZjS+b/HeIc7YR(&Yb<Bt&BAa)e+DSXDb, -%DjY\erpkZ;h-tC4PW$gc(nGqMo9aT$;\LEn9N:&K:MnS*9eMA_r-h'J9[Ul5$+XK#2H3g8Xdc#t@\FSHmF@q&UCl4\4.6$oBL<uG -%U14;4=81#G5?fhd0[-;@<bjA+Z^2=:S"1!Ur7XGL1W.(`7A-t3#I;J)OJ\/:Ee1R[Lo)'PB!23-"u^fsi;HBp7ZL!B:u=ip5W=?i -%RgUVor\&"EbsK<P_O&=q[Tq0#B/LjpU1V<U850A)2Q9r16_r>dc#54Jp?R6`B#>fl<^<uiEWP)-c.:<WXTQg[#+Q%SJ7]/p@7AtP -%m/Xdg.T?M=c)`_a]RXVolu8Q#iEmIk^"e5+AnJ4m@`:fKK0-lsTHIjacU^N=++4jo5tkJd0,k*qF;pR+rKnnCB\=p^Y(r:UJp/4< -%C]uFultjGq:n4gZ348pTPK;o0A\Sk&Dc/J0(R/e?.@U],l3i3.c%)h;D%H$&;,u#]%EdhTWM/<2nPcau^N](".8uj,K5-uIe?rhR -%gq5Z#/7MK,R5rs5oYE"5F0`::iacOpO^j!,NR*jf)`B&_?<C4<cC:",ZW]a%-Q<g.PW("[Xui9*"j3]LQaIj?PsAZSk"h@\DSRWD -%@Bt/r$sa)b47-'*J]VL)%#<n&-C`TOIN)bM_4hfAQu%e</AeqOg%7nCCD)NU,>%"b)j:_hW\Q2#2HSCs<K,$pX9pLV/*f#GVQ`tY -%_IR_I9s&VYZEZ#oj\'!eQ"VfC$^8hc$iqc-alXL7SO&4V-D7MF_to8^k7E4M-C]Osl0\8%F&:LA9K$H8N5$6o9g^WLRo)N?.9Q<` -%PDo^F++l<$:p$[a=(&>=NUGMSaX6Sa`tZ>=lZ.r5"V>H0\oU0CM)&R@dGD)bf+S95)llcJ7MdA?!Gu:*K9?\a<'ElMZ4W-oT^AIa -%M^11#Tk%*:W)(j+Cg'ppE)Ep;$17=\Z@s)>V8\[8m]'Hs2^Or5q4OT<b5%6&90p\^E`=1V2^MZpcnu=[Ro^.I]qf0`4sm#F)j1Z2 -%IoDGFL=(*\L1JcM@+,;$L0=.;6aF7nDMTIh4EtlWOTW_fl:C-.5`h:C7\:jWa)F>M?Y2[2nIpf8"T+Xm.#A>gODHI-jU^bgZPR8j -%a?G>;,(!OHONfYVF9Eq$ms"LQA2>H*;F;#$aUFi@+UHcFA4Ebe,Q+?_fmV@0J5dk^>9[T6*uTRrU*5B`rD62CCsM_X+Ih,)l$NN; -%V6liY&@*<7R>6mK(te`jA<X+kjQK*rS=(Qe,66Ep(di31DJ)r9Scg/TQ<pXu&@&ZDH!`KQRkZ:R)Zl*qMe4sMZ>#C1i_@MV;d^q8 -%&D>:D;f!8+CkNO&iHcZQ8JQ:S%\eb&OR)0aBgO^I5de><#h`1LjQMZ@E<.\T')s:h1CR2[r^(/59YUBnACJD.'oZs4.'gK&ffUH9 -%7)?rV1e)WO.k]?u9fF;dDK'dF&-q'N2qj@0-8=/0rYp2Dg?*orEroU[*_82-*&P5c,o^I0F$[p&7ImUSA9/^4[Ot01c$X%faVOAb -%oL$`t&lP9)hUR*TGd?g$.+urbEMV9PD!$K9!+1t,L<0`N#YI!*S>i4kpbdF/[_KF'fj&j"QZ\!m,d=9&E$;NJebCe>7hV*.JF&no -%!e5hk#OhT>%a^6ZNPbR_IV_,)*d=#uhP+M(pS,:Yf\MA=c,T/]:N&)`2!a-J@o%k%2rE>crJ-=pit]5BfTX.cpMM/mD^tI&<Qtul -%7en#M>@q@9I;(^'fMK(314Bh?"&HR\f[-1/YRATqG(oG)_hN.LP-+-j?*'fO@5FC\aqkFI]4u#cY[Lq7[6S0,GecW?6_kr:*,?[j -%YgEJ_XRnQo'as7b#TJI97/7#l4-3D\K3b46pdN#RjGOW7J7)=N>j#O'"'N$L!-W)8GFF"eU=F>CYF4Nn9(pW8OW[_kbj]D45;Ya5 -%)*0;QT3USq(l:`knoY8L@XtYE)FKbOk$Fei.%2l3&k7mK),S(A.(0`Pr!g?BJ_COp2'[ll*98uA.El+*`,"FpkcP0[)L@h>,liWq -%h=A<"GMSma<17uir>:J(fJS]5i8;MbDV!T[e9-\8X[0O9T#bft27ar#7Y@LP-uPDs2!5d6nY(FsF"Z'YO1m%oUPJYH_71Oh[J1Qs -%)GA*jRPT=Q_[*Qm\&N<%KQH+S&]mm>dr]B8&EN*]g_q(seagB+f!sZ+g(,rUWMXA:i\LuIFTgaX(YDp!F7mT9>#Wu01_Z(X?20I" -%C>GWs9JES-1E_e1h/JLGB[,Bo4IUiPVl8?4lf&!))eWH/h&/%bYa(XL%%)/f#L0k`en!BO_'>+/MmdjrZ>Li$]g1/Q(=K/+YpRbN -%b9(5qnS@JXEac&MlVBFX)K)*LME33/[//51m4bW(5[hAf&D#bCn[f0\Fg5!2#$@5Jld>WF'W$V.C4%n$E^ikIHM,9@"h_F*QlDS? -%KRm[i$XM"Yd)%]d3oKp5T,uqU%<'"keYoWL%AjMr9(o>4C3<!@bgc$(QRPG?Jm"($EV!dWrRcfs]n"YDX+4XMWaT:f"Q?A%ZrOeQ -%eK8FS'pf/+?&e4[<d!FnX.mXeWb)?mY[XoVjM;bm+B@G*c_aDY:j#.Yhc!=M--"EM0?TYs7'.L4Xq.@T0fPSNCe/\kchPb`*ib8! -%6<&H3e7Han&Cnm$G7^c+S\=jKP7'*L0s+#>.#^$)Fd#L2-P,qY)ebPEU_kJLH?q:_E9[_RJ"`hf>!$9[&`"iDVU!RDq;tS!'p]gj -%[2#!s9$Q.DC,]KrC*m2[<"mGg_dPKd)Xg0O.,t<,;&Zpf`?:3[0=TOfqIhi6C/&e`eAWJ0^o2=!$GiHK;87nGNM8o0?WS*pSLQ1J -%pj-ff2(J&'_gZ*oX]c5BF^rW=*=+OSALuiS+OlA+NDU1=)KFKW>-B"T2:\[%=LMImin)hE'bdh$lEWE6^n8=6^])@UA+PM!Gu1I* -%FN;g[:^87`1T4LfOmj;UNM&Zo)3k+[\02P0"b<$uPA8"<$NN:WmAK9IM26a&o]_[4<d_6O>K@nFSjj3W)V-$,,AAX0q\qZRRL)QG -%f0]U4J&jlh['kuGj2Oj?'PVJ'an;dr5c7[]:uZ(^_ocGN5YeNHg(M><Y]mdsna9KLe/Po3PbffokfrT-9FY=4krIR>4'9rNX;h@W -%+?o"Q?DQiUf`)7.AC/O.#%r6$0$JE>2e@;[Wo*;Z#aDle^*(nO'e;gclV'di$8Hu.HkWBp\cL:@A$:4RdN^Ft(LA"hCXJJBQQFDn -%oUnjp0MOl_q6JCL51n:.1fXR>*mIj<M_#=_="pWDZHqb%&6rps7@TaYZ-ou3%1fNs%HW;/B#Hf[6)A3jZcnZ*DAO*[l0)&q!Moh: -%<8u[qBrF^nq(thbE`1c9M^H+TAH@uA!g>W)Z_XM6g`%Q!MQLEZCD7G^(N,>1@E=J]+-8=]R&kla%=T)C0#gGc@\<1b8?[4r9t3+b -%G)p_fd]>dZ?O1@"d254YJi)Nl.T%ocReQND?i9+*jP.I?0<`SX4drdB`(@`%d>!BoF>V9Wo`L4\7<7IY)ia<Ijb&,D?;V%DeEGM( -%%PrE#L,b:Be*4-^LQ7MU#"Cu".jhZLd3,mjn\RPPl9Y-\7J@o`LD:\LL=ZMC9l^-5?`[r%YTA"q7ed+9-PN>SKHdQRItOJX*/d.) -%Ypgck4#SE(H+)kLL.?^B*F.K`kT4ki_2-s&$P@fg-:E%kUc+SWMrS=VnGu%QjT3KD?I5@L.o;UTCT7aWD`BR%>p9<:%?2Zt0VV$( -%@kj7t(Dn%uZ;g\Z6=\ger+LP%eU!"?$Jhd)fhc@DS6A!FkRjKY(D.QP/7LdF#gN%5C].?::9\Q&?T;`qDlF`q[+<1o^nA5Q*r1]t -%N>;.B>afjV#,)TeK!*[mhBZdM]&MN@\O8>nF.g9RU0mob:=oND)!HH+h>)-iJ+i^<s5^pGs8&Adq&au0)B'%aqOdfVJ,X@N-i/=B -%cLm6J[/HWrS,_UA/$FHu_r(Fas+C>0ol'm&s89A+fDiFCoq23WJ,]'>o\7.VLEGP@s24HgTD[[:Sfe"'hu2O&r[n0=L-e*hri=@p -%rGNe4^\^lXr7=14L]?o?nIM7_roJY(LVN`HkP:lVS0:5s(\1hG_9S(7G_qIZf5LP!#"*;!fC.bt-2T^JT7*=2c0'QngSI!h5AsUN -%U$FKTP>=#!+$]!\T,#L]R=P>4$jD(L57hCX')k'D3!a<5/u$W;HU^_bNMCj\#7>eqgU!?-#r/)[iX#L^hRLEoq<9g4(I.Wn=oU;m -%<W)b.oMg7Ya^B!Z=n[]CAaH$,gV8Y47)mQSl'&*Qm#r;h*Vr8j/,\Cd9-JV;=fATA9]PY'XH,SfNpn/iUiVo!>l-"g5PO[SC)DBG -%<8Y/p+Z\n9Q]!g$SCR*HA=NFCI,dG?c>.pPZug4iMj&S/2SpL/Abj>5?Sopk*e603/#`=d+R?$PS9sbu*.E`7KK1%U?N*mCg\4q) -%1\/_pG<]kF7m&c*7!sgC^Mh;Dd.;VB1rnX$b"D2NF2+>Q"=b@Q604H?ei^r"g"9rm%bShS)gg%kWDs0,2>27?i1(c:@J-^!>PYh) -%^MS=";/C(_7#!UK^)%_1h6a&RTO7El&<k;oI?Ts@@5=Pgi-3N*s36aBFo!:b[^D`-lQr-&Y2)mNq???QoC23u>c?%RqBpZID3'N% -%oc3s5)qG3OmZE,a1)Qqc@*;[4Q=*pE$o2>'&4`:r/S8*(B70"5+TV3QGHcB">E!T5qY]b=m)u0]S)TuQ\bbl)Ip*A0>/$ngqG0>s -%Q1W27fV]7sH93'CV(6&=0CZTg\49229M<#]lf0_>a[";d0Dq>d;..VIqa"\AZOtDs4ik$L($tg_:Co2SkJ1tt0l$b>KK@-MJVa(b -%69Nu)-Qa;JLU$>ZIeP>K0@T)PV[`bmI_SOq?a;':W%kP./]D8h/)CKM$>#0)qtn1l!Dc+%HoBJ:r3l!SUs!(%>SQpioeS+,CY@$L -%X;%GSAY4dT`rU4gZ(7ZHV\!JG6gAug^oT#WXC\U7%_*hqA%_7<n'F7M5Io<tqR1h;9Q5Zt2kFOZ>^d^PI1GH4Nl(p0A=@La#ld); -%c.[J*3-dDHRoW2Z&]Vl;L:'N9),!ZG^[mB\lTiAuTKo+=B0@=];'W/ML4/PWcoBJB(ip)FMK^#IfVNrTN-Zun8,O>kV;FFkrLtIL -%1Ln?GFQU':Im,G+I"5i^A,$OYql4MX*tpiY&hht3@O\1TU_<bZ)cE,?9)A>thHq=^0/\Jn,2JmJ)*jZUV7\sap=N//Q\?9oRhRS8 -%kIN$l-ROCtR"DeQER_2LJ)@c>li-;Gll'WRN#t:Z?gYH99qCW`]S:j"(usnfn+78,j6)0B^NfYSjrqPSF##,9hmWJ>R/27J4^&Q% -%XQl.R%G_[7`tS(EdplX[4dXgRY:0OJ/Il"H7K.ZEkO]m_lS4XK&fqd'r+etFW1WlCm'A&]C6$6+]G7DSCt-Q!o9&d.+u'B?rG;L< -%fYbI;;L@*Lp'?Hb:W?H/_:tP(@F)"Ae(Yi)4ke1k9K@iC&$5ajN0ukM.<,hT5)opsi-2Ba>[S<[qY]>kg]!`-Xmkb$aDt`Ji>TVR -%&[u4X^%=r;JOqWOF,u=PG$adq7tBgA`feUZ^<S<"aT@>tHgL(F(\oZLkt,4#d)35q'S#H/TasVfLR')koe61J3P6b`/XN_gnj"7b -%$b>.TLYJAY?_k0Fa!%TB\!(K0*cJg^0+B28QWVA836k"*4ZL;"MZ0>33T@W,T*o/<5=q^-mp<s0Z_6'Qa`NMg5)Y7$^$Jkfr>PBK -%)"?)E=1(7)Dr<p1pW35%On!/E9$]W[<CM4I08IZ.rH6ke3aU.Q#P%=e$f6C2mZGh\;OI#:=,I3Yh94e[ZM"-9eQ70RN<q5#N6hCg -%VG]kVgu8U(8c&ejZcc.W%#h%^ne]U=rI%KQk-mEaS+!hXZd%rd$NKBUYjlksJ&*31hZ05W*i]E`q`_cK4Z?*;6j:mY1=j#i9]HG< -%V2l?uCP2]qKP\'mNq\<X4>oqZmp!,7Hh-f)V*=K2^uu[i4\s2P!4C=['tJ/]Xn<UP)E5<bRM]tsdq`ciiWspWCi&X4Xs]NfYb)H. -%-Vd:DV(K_3F06n1VpFWmr!Rj3^Ah\)/kDnof]-7PZfU(o;Yp_&QKr&4(eg\`c0+h2n+=95a#!!DCMA/9=s_Utpj<+k`eaO$ad7C. -%TquASJN"MmU@m"Q[N@.t;8@>JSd8qADgXgbL:tnm?V[=Z7.5SWo4gK/>Kc3FYpp[_eR^;FphK&4anWCd?W_2Ys3Fu.#8:%^OMjFp -%B_Nl2?EY0_,d0"+HNE%$\[8r_*BI*4@C,<g@"n-W?s9`cpQ>%\Mk;gc0_$o5]VBQDJrqgH0](Ls&+$KDo^UH4)`(u5:&>3ua082k -%X,kX$gjg#)Iqbu4nVNOqqZAK1`Q(p*3_/tHReAl#\i7o*dck0Kcdrn36cZgbk6N/",GkSPe\8q7$PGDI@kiq;`Q"bLjT2X%a'E7@ -%HcYaO-rOjRVEMskd#miO[Cp/?oc,,&h+G>O^;!\0FS`O/_t`jO]o;goca07jkMkLTT`(oTaGe;]#K-FMc*+0]H0cd=f143Z*8[(A -%/.\7&`=^C"ig:tWO>)Y+DnKEkA=):tT5ISTRd_!MrQU7HjmCXD),pHi:6*)5.".Z-M3HKHE.;&,bh%F3fUnJt_d>OkZgY`_+\s)N -%Nj(Hr4AdN5;[$EhGg"WIW[aj;,Ff$JXDuipF'4Y7,Nc[&1T'q"@-9Z:oDRJ;?c-2J%+QlMfk*90mR2pW,<_045Ve&"Le>I3-D;'_ -%OO\QRDM[*T,:`?FoSOG<j9\4`A*,i3a;(6U,DKroF.#b)Vr8HmoF!Gpns[mQ,M"'A)O7rjk*!/#Vq@;S;\Ajt@ika2W"O9p>@l$* -%(lrVng<oA/UO`W`NtAJ6TV>h@Sg3V_)UmZR\*[f\ptj%ir<jZ_c/Ba)IR80V4MT2J^V]ca1t,=XpIcJKNW!+KngmUEm?o_=Ji#YG -%F$(](DhoV"Ich7RrAEqSKT4M>Wd]Akh$QHf<9)0tbVDlElNm$;HmXsqqsVkG31L-uce'IPN\Q7bn!)L'?>5iRH[U.fW&bG1HR/gN -%<h8b;qML9)B5WKfZdd$$73-@fG3*t"+RQ/Y2\"a,?c/C;pM3G=$q@/MI=q31UI/IlA)Hs-D*uGZ]8nb.nEe!!!WM@/m'Z6D#9pg2 -%7[U=HOnac7C/We)?`qCh(fuXY`hC=@fFDT^cT"E)Do>:I)-^g%P0rTGhqG6u.Qa=_W?d=o+.CT*DIq.10lg&^I3QPo^`n`9!n;Wc -%AG.!'[lEqV0F`G&4XNi3+>Ustrq;Ri03Zs>Za7u[D9!Y<Pf>4E`5_:Uk@oAhi?;T&#nMU<*''eA(%%IN,4D@\#,$hD_/OAJg&WEq -%\Dt\*59u$s_aiQ:$3Ys-R54*B2Y,O2?B^]WA)6!dLHd1sH/ee'Haprop?KV<IYQp&D`^jS".TeO>^J_&=oF.fo5(9!#bS`:^KR0D -%)NhuHeb>_$+(YiY%;:,Z>I-J'1Giq.?D*Xm_brJ`N)t[J1`:(tq^^AjW+EWtSpc8Qp)RqR!m/eGp2HS/;FaQBH(pgURKHTh`C8"b -%Dm.m6[b':2CY2:/@c`O@q6iL:Dm.;\?XJ<nnjr(#E'c:qHp3l;FRMII`M1IA$IE1@0mUS5UZ0;dno/g*rc*\QZ\mk1DMY*pP+N7p -%UeL:Rm,pC-?Ap$/'@a3o:]"J<4:Ym#%N%K,lb(;<j2-6*pbHIJ4AQN"`Xs)Jns?XLWrplX1#PFP!o(%+8$5$@#R68qem%I7afV># -%oCR!!4NI.E=8R$"q@KIBc`?O00]J16K[97GFE\gi?Md#J`WW;ZaYDi>:$>;<@ia6**8@s"`8Ln<j3q=p+nkU>;9eJcG:R%rF#c>W -%L#RH)$?Q6\ht#t.4@[2m#<cW4Z17N.f@3HG/R&Y=I*;3qSeAqYcH<,=qK<'%kL@>&F#_e^V'"%R.G73I[dAFrV(&Jb9B@%?kL+=" -%Ibrfl^\6<n_]rB*fJL(4eFuA[_.nn]HnCsD(0**P;G-K"Inp%VoTHL-$B:lISY\<$\2%$\`+#q=5Rd$)k.8U:3C:-[n+h.[f!YqF -%/6Wq-h4a/*,[b,Y\1g]Mba7\3`-Q&^inD[PDeh"$m1n=,p*+/9KuD#<4d]!HQN,#_deThd2DTI5YGpC84p#>jL`nfl!96Wr?ugh# -%MgD'9SlXW:f[nofm)a6t*?/_+DI_KI=P53ep@bItdg$#G@#HJ<FpVC*Fu@:$ci".LJp`P@.2>:8J^bO_FuiY@O48!sPGG7_^fnr/ -%:u=UfliBuk[Y?sf4"ae4W!W@VX26;UWtF@$UECIWOE'$k`R,p$Y9TRfL/5=X5kVXm2XWP)cg>k*m6%Y=lV7X*_-36QP(CrN'q_qC -%d<E8kfC:o0]KaY3ZF'O569KBZ8puYBpgC#Wqhi4S$tC0sjgHh9n,Z`"DkI%%T"-Y<luBc/hnmM'*d!i2&O(pB3et$WgJ8+"-">o\ -%UQRA!X=??JB-/;1,AV_pNH^28+UT7`\>JK<G`KR:s)R(kVp5m4A9Se,o86O,d2i)i+\uK?A<)Yi:H&NtFk^2<kBhOUo\@8l9-I,1 -%^(lT%86:"cP#I_-D5\;2G&5tV97>t9MV#d#mL[4XEIpB&7AQZ-r\rnSk[YL=Vk+Se$\RKt[;Co]fH5@,4cJcQ^/"k;\T*HP+_,`2 -%LAc?dA5-n;$!?<_g3RW#B[a*$:Zg$dECo4C9;o4(c4rt74B#1X.L@?>U*mq"Em"beNFDbG+ClR4qp3:.JFP:%j7$<cS/<-%"((1I -%=i*_bRC6pKSt@7/8s_YDr*8)OL>qPD[bS..,6DCodeL[!('.rh48YkP0U<`-Gf;^On"KJsb(Rbt*I1bgXDn_Sh<GoE\&[7sS4FBp -%h:Ks"-o"!If_LL@VU]2Sm,pr*QF"JR.E>GALY!7nd?^I8*Ub:9m!G['ad7b4q$p:\c"8Bo5FJ.Of+:3=D998qXSCJYNE3-2,/!M/ -%WK!9#fGB"^(loAuWE#X4h1BCpCDGgKA)DH^d(4Tp#9tEj6&pdnP-5CTTX4EdcQ3[6hP(_%j*qO8YTTrM^4X;a4hjuENR?0fYKc:8 -%n)L]6U7\2cbkdn4WhWlSDUAPd_`gE@Jr^R0"9>19i[BSf[d@159'<V"E]p-k]T$.%>BbU>O-G^b@PV+N"8#-EJ[V(7U`@eC:dM"< -%FcWL>omnm,mEdVpiZlZK^+WrL,T4PQe=/X%F;`mjfbR&_<H4Or<Fs.;6f1C.`b^qZVogc<+/-k"db1cD#(q?im6c.\;r!ej[N'MA -%pr_0d0BMT.<3iPAoT,?3[mumV7<<+k/j&@ET5.<40_`o$I1t%m_cXC7S?F0e]m`_J*i"P;A'dD+=V9McFF>7iBj6_Z=<KLS;)Ze$ -%aqdV(95jk<pB%Bl[hSQA'oft_I?YT16Xus!)`E-LeSJac0]LN7IH6TXj17=4E2jVDIFp-gH-;0$.o5je?Ou2'c_7HZ1?2M)ZVJ2k -%O&1$5]aFqD,:&1#@._WpG*2;i^@*`knY)kr&E'0b-(NKO&E1Yhp1fI<l9<)KiV)BDEruSRZ2MQ&*CC"=@t,Mqemja)(!1+5!.`Ie -%Zu2%WT.m&^oc7=3HuIe9:.kTgG56s#NhV>-G2O4pn%KV"Q%1<!T0hga&*s53Mp=e5^t@+<0f@2cXC#jEc^1j.(B@Aqk#>+l&,$TF -%BF%5R48$0L"*_Mfo@_;I6E7Wt^^F:]4RsQ1q_mk)8K%2DKTj41S,sq&)`oJ<s026om;:Xi_Y8,DVuK&+p*NgpgFUH@>ME;Lel`n= -%D0iegaH@ODdGdc=g>n=0+7Dja"N["Y161BsEn)J`?oTD4Jfk&FT_"\ih$eB,_.8pS2+3"6T*]:H5q7^*,>jFNBZ#LiV/G*H0aB,A -%9K7Dl-[T;2:s27]ljaEN03";Q/p+XCG9GeF7NB>4\.go:F0WEH+N5bk<0kIh8ps6:)D3YF#*[E!<[*QX;<'IqVel-Wl34dDm/[i7 -%F$+A18%dd0.G?!0^mK;``:$$D8))%XRZn\c<[BKOWokZ<Djgl9cqI0&4rn>,RubF'$p_5][?A?DXjl5%j-Jp8%s7VYb:0B/'0CI] -%bUI%'!VhOKc=Ohk46&DEgji7B4S7:1R#]O)'W#Z0peo_265PB=7]sMeE+.>2"0gE.hm=86Ee(!2Z4?dd4+q[l?.VJ&H&Nd(E9'm& -%>Qg"<$^Z^'V"5^\P8%(\3%#mp4QVjVTcnLt\Ut$FI8^iDAg`CZ>m[lk"BFB4`+'Sn^eKtZf)lnGdAOK7(>I"Z*K[%2JL81.P:CGg -%912&L#cB:[,$/XDU7;+44"*[U)%DTOFa/i^RkrV2L_84BSu)dP1HO4P2hM.6kXZ;Q[;KtnjF`K[2NfYN@9*s+KMiFGRBbS\gr9]F -%k,EnN!C@O]5!C6A(G^O<,9uWlQj0"hAOdoQ2OH;aG]"ohH3Go>'VGeolnF=_Ed@Of[0[ln0XpfPAKXGP`"P^Sh*N7<plIO=iSa=c -%fFXr4\_%+H\A^!2KQ;`2N(,L*drA2OK(LdS,hskBLI=[-K0:Io&]PhZ9/:\u528TLYdo_<mKb,D#4=Cmj3W0..KoGSSR"]@6.@SZ -%A_),^NpJ"HEFbOZOEcbKU6jlU:dZS0+f447SFjHR_Qmc4c0;hp:-%@Knp7O$_[#aoR=T]Sk0,YrfGU9Rj,%&cKY+,-d>YTRBkt-n -%cK,IHK%llK?J+X80F)tA<"t]+duGNE@MrZ0S?Y[3EXrfl9s]XH)=/jlis:\jRFoM"[+]ID1cX-$G#a[CDEeGj@(8?1Isfh`'1NtF -%d)>P80#8,oEtUbA2)%)0A$09\^^NZ7\P3gn6@6aT[S<cQTrgV\+tV_U6gU=P-A*3!<,L7m3[nc<GjQVY6mtT#PVCZ^i\!i%#8AF. -%A/a#MaSb+tKVij%.jeO'J8RRuL9jk%f78`KE9&f$[qL_ild.;JqLM!>.ZdV\;r9Dc<]J0rg.j]8khllOX2phA$OXr*JRj<\<Qe9) -%aPOTL;j\Tdi:Me6^!d#n-JCh-;ur=W3,L5Y(DGs?6QjVSiKa5_mQ3EgpYHHDMNt^S,U0Q2Nk/AeJf9d\77?5'D=HBN1r2c,&]b,2 -%*tMUdOL7!Ajd&S.J7j*j)il"+,uI!-bALtpOC?8HYCm6u>Se'2Q-0:PqI7sB,aDnb]66osYlaUV*a2"r.,((DE6KM6r#Ok7o*G_J -%,01)S`P:GEaS[5RM\7iaUq%Eq+h4WTp69PO2r/F<JSH\+]5lhcbXf'[EKZCpPVNG.:k8]q)>\cgl(%Sgr"6B])8_I\-H2)HaK;VB -%,VF_cr[&>>r;to%7Z^=L7uelV??q9iN+0('9ZCM0-&eOi(B^3BV3-:$hWX$(l7Gs(s!Dj'e>G5+YHHlpDRqh3ra.EU,Bpr[gj>0: -%F,+L*;`nb2#9,1N,2ng;.6!3,grjSV_6jHd/rC1f+aDU^C]cV4Mp<7Ime%FCpS*9N[M*=>K0TSHT"TZG\4mRSFS+#KlC*W(nJnAt -%_p&rc-Ts2;8XetS:n$)_$*^ZJ0g&i[\=%*Q<2rQ=aN0gd?l7N7P,Kp)#cjUM,E,QQa?Sjp:;aDkkaYC8knHQP%2eE3.-LhbN#:<? -%7\#Tb"#kTA=e[[J;g.)RPR-?q5GNhj6O'\I'8DncI\SKP'p]Zg%G^>IPW-QtiSdp4Ze%`*UM%B=e!Nu7#!q>@28Jp[>>(6pqUP_q -%3<Fmpjn"k&r$.N;Z=&>1m!^uST$*:I-#)<8(o`>@E()kLYg^`kI$pbV[\TQq$Ka;^eY$Bd]#D1_Mk2"D--XmrF<ic>F>kZVNi\^( -%'+73T:YFjYe\J]\XjM$6%2k1Hic\VOQ8O\V4%fW?-'3D(1_rp?"k+s59^X#CNI?m9<3oJmKT&!`%6&3G.`m=3'd]t95n$^K>/(Ej -%V(0"I=A"5mJq/)2fbb0I;a3RRiGj0B.g^I@f8<^Zgar]:aU6u.MImK!Lsu?O9R_#<Gi4sE,Y?(NXV`?AK"77Fi=o3j80oZ@+i[I= -%dRR9)n-EPul!is$4MnY\'Wo0t0k)u%Gm<?:a5PHi3hSl\Mn\/,3>O/.8TE&7hBg*]cscIsWPg,r3)5f"%^GL-+,7Z_6/dL>C=3m= -%Be#SsBb]lb7oGT-]5fb_>R)Z@8<AFuXL"4-La*N[:'CkFX`EjFg#U'FY->6/?noJB'ECm)d3N]Sm*.P.nT+i!JH9Db!*?G$`=FM- -%r*JCWDO#p_!Z\=HUFspV\1?Jg-OW<i]<[7o/MN/\4#-PIW.limX-]QdU^[=5'?CJq;\BbO8AE+K6""$)7m8[Z6%X*c`<S?6H;4u; -%BG;mYb"bh>'EiNp>+$?O\6sQ:Xb$\\a:'dUAPbgYL<^B_iuWg(Vb@i4]XT'm#\9,IMG,cnO0_5=8E@F/jpigsEDUk3C/Ne%A=#Un -%1<`IXiXdP"&ffZ=#obej/jX'$7m8ma%^[R(Sot@t9$g7TZ+_\7T-b,rnWZ6?@`F+@95NI5f/GH,<#DG5mNi5sLW#9<bQ5B]l;)78 -%GYD::'W%sO7`h3OCB6=<F%74tP"`DN'Z5(7Uono,WZh!5!!RS(@b25f(8/eu)4.Y\6X(]$-[Y$-Jt&>7fh7i[34#+*DMHm$IL$V[ -%q(GQdJUL17!g@%%.F&EEV5pYJ1s">:S,cA>dY'$#2Bj63c]/e<"75I@J;osg4NsoaQ>CG[c"':/+#$>&epr<,Yn]Q(!t%kdLabd_ -%-8G0ZGPDt(S?HJ@_uW@8h8%ethN5l'6W7'4WlL(8\eUff2]2s9)a_ON`[st]$mGbFBG==>[\R<9aGh-,?W2bJE#]SMjGC\^GZ0uM -%QDFXu^n<C5QE*:U3GhZ3-O/?>:4)9g!XN".Or$-7I*usBNU`FRTN]LlANWj+-tk7f8pCoe/mTm%Z5tY,7.,[.@MkW]'s?"4WO/]l -%;2hbWYUJ=^U,,`*]^N*LB+F&5N+'4fQ:NbmA)KD$@kaK'9M*"76MLip9A6=!Nm/#[8qE[sdqmN9TO__MRsSIIF,?IRNe=J,!^I+A -%0`&Bb@XO]OIXJ03q\LK(ptsRd?@<\[fS>h6T/*)_E,uNsGpn@SVKZYb7-G)6K^L,a9TTG.J0ub1h#O/O)_(%2b#uKapY[NJ(t\n8 -%lB_N),J_Xi`KW\p#]?kB1:"D0O]..pO6Q/-\KRJR"<>a/28`04OuU>_c.l!Mil@j/G<iuYWO9@K1$ls>@N2*]K3Pc5)d(*OHV:(U -%S"J6E+Bp]j\!:q',`->*P6IhjSRSa?`@][i[8Om(X[^<Rh:4dGZj#1Yo1G-fg,lh;AO3_q^s2tZJSC(<&KH7N_AOqIb%$RmN5K^R -%8SB8ZrnI\,9F4EJ@qFY\lGba:NWo:7Q:AK-2)*2I"j=;jNDlp@:O\]#!""qeChnVP2YW3bete;$ZNA6c4i.4QKhX"G0Gps`Le5:? -%"Qh<-*3@qH7K=VsqL`.4N4@N[/6X06TuA'>El=pRmdlf$m3in[["E>C;+RCWDXL=kK/%O-6XlQF."-a,NCd;(b)_e*!B5#!1-r_Z -%1LHU"1VNo[<dh!P!l`M]&h`Vi>l5^arc2p>,r(r[<;**k+d\=rAQ3.EA@Uu?rR?k'$2),FJLR"bM$\KKI:M3OUm$HY)3$5/LB\oQ -%/@$qHK7**-(T6eb=o`Mq/Rfh(>X#u6EZmuT(=,8p/!aHMT_m]0U.ZDB_8,`cXcOHsq)D=nmItSXPGFno@BbB'DnmdaO+BB6)*)Ed -%L)o&JP/O'mj(`0?q4ml(CM)&Yg#eet)h>;79#%$rN:\>`BtI8^`ZV0*Gj(Ahk_6<oO_XA!f'M9Um'u^>>96[aVDfi3+7jQN_JXs0 -%@`C6F!%2]]9:Q+"KNrN6=\E^=R8XI8a<(f`a-`-W+?Kj)SX7VX:hkS3M,>HZjNY?"&00)Y"#kgfls*0AQne;/\R]0Khb7!mrj`qp -%^1CmM6!W@_m:u8gUuh_#A;SCV#8YgJ3p`<YkS0o'4jo:tL4OiQJrEI'.SBDKiCou_J/^<<L(]pY$sUW2"(bDW:sGs]B0h+nMh6on -%Qg)X<V,1K_]$+eL8?cepDf![[)M;:VW3ef2%HW/.>JhhUNW#FS^e#*,-qDlH@3a/O.`*K:JYVTlaO[*fGBh%T0d+_0\B715r!C[3 -%_e%2*at^B-!_Gk/Wbgi)b<U&;%oV?<d;Y:P`^sI.beltJSGc2#c9R*GIdCllE5*jiesLt4=#3qlPUf[7k6Cu%qRr\_7*&h5#k*u& -%iZMU3^`Fc;hA9Z3iInMa-l_@1C.NpV%!,#-L<2.`&XUEgW]Wr='X'<O>RbDO/=LCG3sbRu]%"\h)'Bg)R!&UL,p,A\WGa3$DPX?p -%#=,SN.C2Q;)m@CjTh%&6(CEMuZRgp.i"9P];7&W)>,(I3Z)Pj()'ful]ZDe'&qCS]s#FFAgmO`ZTtt>U2Q;WJnjD*4?N<\?UQ`7\ -%Dr;P,D4r(d;FK2IPYI\-OsY0*7p2-e[=0dRCIn_*`h_):!LW^H&slrCJ0[]KI3ESD7U2/Wa(BBZQ(>rJ%3>npN&!5k%%M^4=VO`l -%<"aI&k+ml*1`3oWC@LIRc-gN]>.I'*ej_<\hF:hP9nPWS\5Q-r[0$"4APYO[P,-TIk#7<qb"SV4ea>JgO[#<s3cI(4JspE7EsH_H -%!Nk_1<!SY`R9G_f1M^E+j!=Dkj!LH[,eJ\J^L4"-@hjlsVit6``7-H53+^OiS-V\IF+T*C'IoGJN<^C]6/"FBm(,0-%QVRKM)T-h -%>oGJ:>k!E\#KIA#1paH#JJ\LW[Pj"#pm`N4T$Ua8XYKBEg!b'D`![ns13BOHPNJ6).U:V92^![_R?rmKNd;p]J/#AUSZdV<P)Kp* -%C;?&Q6"(h5q_"e,)$SH;;]`577_ACIR?=J7r.n2gN"'Z[qE/;C3\^dQ@^]&u=l*ss%6tVuhD>TbII7n#(K^f#klM)i.O]ulh%HD, -%$^0^"7%>+c&VdG>[kA3+KJ)Z];1Bq3+<B+nP%!=.io2.U%&q*?%\K+/C@L(SS2el>cZk\M0_+0rME7Ot`0=Z:8=5p')9Q3nVO?e- -%0h(WZpIPp^)'q2OHkZgRV+HK36`N!(;;uqaqB]Bm8R[e,TOFiu9]o#fMo[#D(u$4H,gY\m.f$I]:naB("MQpi^O:`.%?hbi;8g+j -%U+g2m/&HVnCfX%A)C7S3"Q3U%8tE<i?m_j_2T)3mVEU/?8a1!r[RqsZ?GQNP'&AoVAduQiL#-$uKqNJ6:8Y=RT,`cQ7i2t6"33\s -%gPG!`do$gJc.7Pm@38t%m+-IHI<Wd!`\!6]k?RhKKG<;j"]h[*"8)34QC.>cj+0!BTWW3pV'89n[m[(6S15^DF5]Rq:6Ns6&[rY[ -%9Bam&Z>T5MX<C4<ZeH6jl(D'N3E@;k#=g-%FE3udc8aXt=G/Sd(V2P2:++2ZC%5`*!N+c>!)fn1;0!&D8SVcj\%@P&"j3*rd[n!4 -%EeR)R]_Ps]a\]E/0OY9Z:r46:/3Y13-BGKIi_1@Vs.%=dC<lZP1/t-<mt[Rr7%!D+-$5bVOD$XoGAJ4+m-iGSA!E?(bFDG^6$P^5 -%-4uH%[k]ufN+kDJUedm\&c%_)0mST`Xt_g/<2;-j0K>[&JRh@nB=DUF/=KEJ*&+.XhUZ;Iq[PfN@jHI3S2,X4c_1G=$B.s&=KS7& -%AUa[9.c,F.bJb.Jjatq#UM*R?=R'eq-AeDZ1qbp+l!t-lBNE?:r/>tu.*37)^J*>jHAch)Z=1p!/"&E5Z&NcUF-7`dF8#YCEfkB$ -%RMtBfZ)'A#KU8Jhj],i/h?nVTgWak2*)Kg$YPRpB_i4p](<RB:.*jC.e,U2-E]B&kAG)(l#q9a#e6L/9P=bu#PZ!#Y18mLeCc:]T -%$hR"&h#92_;^j$g0l`\c#"DAe`9jFk$5.iDJ7D,Pk:gTc9>'25qfI6Y4NDe"9\QPK6HE8j$.\[+C@I!H;bf1Ub1r1_1DkY4ZF*,C -%rmegK^n[(Bi?0G6`/O(4-*`<kQ8jElPX$SkYUdpOa.c5U@<0*&Pd+'\RI+ln9.;033L0Lq-IY)Xh+*a^$Z$--Bl=WSN2dGVnd3)_ -%Y\F$?Fr(pW:O$]Yp"RPj?S4ooPA23kK>RUUE_pTRMeu)G%n7r;TfK[96[1pF\g;F-0FAppCbli?Fsqd\^aP95(poKoVD'@?iLEcQ -%Ym:,1jc%K#-MHAalPLWa(,E]E$<VNUKk1W:ccjK_)Smsl&$O`?0gKa[\V&*18FAa,%=bupK?FH%bseEjWgN-0P?gtG>of;C(s1r9 -%%iV*/,MY;_/J*'TQkBt?)L/eQ$<gJhbhW=@/;`9te-NUuAA%UA:>s?pdsVXd*5a\'_>n."b/bNNr_AtW@@-J47>bH@ANFj0leKLE -%25&&@:<9#sAcVGT_\5eiOkh<H(*t2sD@S3;6CE&<UVQ@!4G=B`IOq$Cj`E%bnd1Ne#>'=&)iT*a"#2a_V"6>HkW/BOIZ9KDoC*'s -%VKm+qT[?GWVGsl8g]gm%g-N1K_X4B6mU?`K=Z]<SI0ZQ!p**2aJN%^<=d`(iPY/t:<gf=7KWYP2A=K7X!>XiG_IlBhE1\]k;hkC8 -%;?-trr\,d^KkhBM89@Cmee/(_ltQT#Ta7rL8^,H#/E(Y'$5Z$I.\QDA+cnHMYZqY5Y3gmD@cc)&d?RgY,TGYK6Zp(?:1:')cUXCq -%'75#6L&9(/R*Sq2o0II'`8jmHDEa@AEqL!8&>j\9:F:25-*^=h%S1:FaQX5m-^\h/],2$G:]s6s_dt1g?ou$<aN_NM`XE)2HXWdD -%kKq9dG*efEb%Z^%0I]Gj!\b+ADG7V+BO];$^`fPC:GE8\?g(PDLp!asX0FZn6OBOX/FQPqAhiG`E_F0HPdFQ:W`&6c;3W#JN`#s7 -%\pVh[.nmD7Zf)i_?#8ed@N-G1]>DK&8W[c,?VE2J`UHL^_C*&RPY9\3NP735;F7s:X8kpbd;m9!-?b+^oa/r=VX_3V-=iFkD-dP1 -%#bu_Q9D*0-2iYf))p0_ABe1Ukb[`U&Q]3K=aCXE]<e>q\SNST,m"K"]P>Kq61#:2,+T4O\FdpgMMCFt$R-5VA-\R)1Znm$qF*6F^ -%)'Z_1^g/BHTl7["geJ<jk!m)>N&JW0U/.0o1-t)OnWZ1Ia<@1Db8^gG8Fj)W/BFS/r4tY2O-YoH/G:NY8pq)6VV&r58\13"dN2qX -%2Ham1[OLSAf*ZR7q)C3pCPGlUKYg>9]EWm#>*d:;2R*Wr`X=:#"?AVl"D>*D"00]X_M+%jFJ5\20Q!o$?C,I$N@Gl;CR<2rhd6h< -%s"^%3+unSM;DK6[YE(-aj!AO^"@f<iYF+mO/":4C&h3ZR"(NtM9W;YP\9cP<Z6fZ%>qP6#$2Ti=O9Sn`ST]b^.C'53btKtA`/=Mn -%QVeB:[l_u)\54$lLcai4nk#=cYnKnf9[TZ/J%NRH(E;hLb\W:Ka.j9J/bHmF^/;+AA.E#?&FM2U2TOu/d)B@7CI4tDVUT+TY3i3i -%G5Xntp!9Jl=#M.uHOotTXl8g6n9JM+D@cUKWW9X)FO5M$m.A>hrgSlV#N':2l1DkP?[hP;aLl#FIC]7(UPGDCY3O1`DU\(.*W>X, -%aj/@$X)3=Cmki(U6,,.%5NgSQg@]rAh7e?KTfY7#llV;CUDpUF]&;^ifI3&"*d5,s@CpGMnCm9MrNUhYIuN8,[EZn\KDe$hc10BC -%\DP_ZC^pBS;7jNB>NiiDJ+9\h4a*G;(h?tG46+_Q_YlsMQIUE+Q+hB9=Dg=Zg[#t%2YPdNoK')]=@&YP6709!+,O^L(uk&2@\`G, -%!XeDB%g?en<']HIh0F'$Y(-fo>\nN]m^0uh'sM]>DH6#mU<,g:k,A*_fPc`&%u9PeNnaME'j`JV5HfY#o.fPQpRX7_NHab>ni\OO -%?9!q*L\o+t:"T)djQorhdA"e0%AETr%,7Q;DAD,^"j[RIra9s*))nHbNW>o<.JL-sXi,RsdM7J\1^r"f%-HkDm?dEh0^/;uEB':. -%lLa6McJYWaClAV:$7"Sh0(p"EoV]gKS@/[!c3ocj_==b_IPbj\*HmlO0WKfQ\^-W0618J@lAVc<QS[o\YtaA)i:d-C61+*_PZoP7 -%:9I:$Pps0tjZXHNIu>aW_;hktQ<XRo\9+%l_6BWFd![t=N)mCB6tB?,grbpefl@b6]p11YZK3]p/Z5_@XnKAMGPA>h)Z5",[]MI_ -%"gE0M+gL8)NkAKf:*k#]*VRd-pNW,8>Xi;2Jr)9%\*g`_FW/W!8nqs?r-\/;j2\_j>/6oQnS$EdoXC^hi*u#s'tCAGAUS<airW3a -%LFUJGlQ"NS_83sd4eBJZb:(N58`jTPld*cd/`eOe&DAj"*Zd/,mG2BL>K+@A07I49ecdW6U(j)LmU1;&n&+D`=Dmq^?O]M0m_"W# -%*OVB_Ni+Ve8fjLpnm-gco[k1.)oM&/Il)'8Wshc!PB4VpWfH"iIuXa3p5'@QT.HtXTabK0c[6XZW'HRXk@iJJ8m!XUGCig6N9^D! -%o@,Ld%m'[Z:,OE;Xg@?5Y+)FQDLGe_V<>^4$!]THi.O:FL#;3p4@75#o:0W`A'lPe"\%g\W%\cZke(#t1$ji0HgPg<]sFPuB&1c- -%H)!/qF'M1SG(Stnn=m#,go5nDgN1<,Jm.qmRe&4gK08TKnk?L<(NrKLnQp*,fYpu5QdH(&M8OXB[%/T3iL;`%E[eDel3lmr*02oC -%`@B#CF^jBAYtWo)6$I+sDL\Uh,I.#p9^9dkHO;:BbcKfk4tA[1'uu!7BQ^nG.bg:_A`["_lRe*A?c>OGk^r`VU9Mp5I+0[BFr3,@ -%S`;2g!u=";X`lH]3ZN5HD^m;,$YY9"825:M:,>m1<jLpuCaH_p_WrbmAE+lPP3uE@h(Ohr\d7JL.\5X)%\MMh8&7Yp"R_EoN3<fO -%]/gc>rA`\enbZ=Pr1t"M'p)RGd9L72=`dYaQ(VOD(S>D]7cE!!4aV1_LG&9NTQ7;Jf]#Ee<#Lmb./kbZIhfDZ[LX>UI_35Hm^AV8 -%4CI8Hc3qB'(%qZ(NaMUGF'`_OG=G*Y7^LodpW$&J7n^DR6oFnO<r0pY5Ne*,q,p-t^k1agT=ou^Y!Pt$EgR4Lgel8$e6[gpQ'E-= -%-#r$__kGa2Zf]G?bI@EW:626>*E<T7/n<Ur.YG,'ZbD=\qS]^hd:QSdmL,sZNB];QcQu8Yr-8`n1ekpq4iD<m;&.E]/U(O"oEY=% -%?IMBMH/(KQZ"'CFUnI4&Tlj0dV"12-m8f,\m@GCTh+k`@W";5OCil.B#$'ZUK;.O_e?Ed@V[C)gC3@OeGEk.KMOkVbWe+bp<Cm7' -%9:["?'eH+G't\-uIQ00qIlH4c(_3[rN>ocmb+C8r^tR\^E6tX0cqL]c[4E6p:9W)tEpKfQDugTXD57sj&uBl9,#P?_ZhTj1`Go69 -%FX5*5^2:&GqP[CFb5",cRhmLhV$\sc0:XPp0T3XG\r&pZpuSE*C:PUp.*[YaMc*-$/Uf6CPqcEui`.PPl1%usU+FQP1FE06'oTBm -%k/'QE7B(m_iic4[=HnN%Dp;95b2UI9<#MLNTCq@YMm<c'1s6_7;i)ZaA1X'/H![=$[FIf!?YYAX)2L*9`Hh186KKlUI(X[\A@U=i -%`,;_h>e_n%Y+LW<EOgsbr*j<,=in(8aL-7=f2cp/$057n5$c:<Q!A[KpL'pC.s:6;lYRc_8uaJM<*O'P/#d[nWO>^U<`3c@UtSFB -%>=l4p;D$Z9gAAgXoZJZ<.ZiSq>Hpi/!P"Rf-_ElMC)U(p_.jmjVGW@d<)cd2U(K!*0.I,N#%c+R'DpD:^\,82:V6M:gN^L-M9g#k -%U\pV%UoV]kX3</.T,4:^R%!AOfeU%@)S=1f)H6LYW2BU0X+0HMn*1^s$P^HA3eA>/o+>/;W&aS\24]2sIF.4S^Q1>jML<okN:0ij -%<tgf]\(OeN\h?ACS[6RGF++nG8M\"2RVK3:kmHaQM;A1?QL4ebe&"WDT@s1$9BCV)1`8!4d*'"Me/\+@"s^5W4?K]b+8jOm[hE\< -%/c9&QMILEo"Mm"%h,6jr$@\_Ye&!oXJUg)MVI9rrj252M>\/44X[Kcl=liDW&1kIZX"oO3+S#.FEN%ggIlhLW2MZoiN;7Jp!_B=" -%aY_Sl%10X+MrZX27%@)408nhr3pCj([K!kms'<kIhbTa\EZ)jaCB+%ZCB&Lcs8.Wh#M9(>dG9Zf`R=,KY&5OgmJ3pYHrk[/X$,>d -%nKG(/Hrk[/X$,@(C2an7c119glO:C*F.qcST,4uMDg/gG^ZQinmCYG!lN/#"8A/.,^#B:[VAN9/$T\Lta.rA%TW_G>IMEH$qI5#\ -%Zcc'CY0<.p0<?.=0@6.l)5DmmT$A\d@F:Bn9&agO-<n%&<c52V.jK8q%,:1K>qKaDG<>b(kKVrQ]?[)(*oA!H>B^=i7Xs^3e]NBM -%nt3&^B-3s@?B?+a=8oPF;jQDMgE#[aI]DUL$HespF@e"@eG.DT*KR+(D3koQ=Rr!<2"s)OT%sG7p0;*+mTY$Pa/R`banG(qqM_d" -%G(CZ'USE!2/+pf<FV`ucS*fCGbu\=K\H+gD5Hk",q<;><&Ua)oOZ$rMKV8?Uj`m3+'!E9./'#iJcLKoL/Cs@N]J.A*Z?!UZ*%rh_ -%bKB@\EkEru"aU1i0ARMKM.PC1>re"leq(3o%%a<h+C2KF',T-,EmYA.T4jIT,m&(sP>,":d(Dt/EGdhZpj&VjeIT-J,-?1(g>\$s -%.W]6fA)_P]P8EDJOt+"8rbY4R(3Ug$MrQfNNYa,Pdg6cMKjQ!)=dTt7KrhFJ0)X_=b/!Xhe6]Mio`X9$=Zc_clq=h%]P,ubr\\tY -%Fq5Oo_;D:dC+e;@r!I/9QL\#Sl8\YbR`lL!MJQ"NTt-8;J'O+]Wo-_4[T-8i]Pn]-*/rT]@&%/B<H40QNC^Z`fufqTU&$_%!$B+S -%b;-(F1BnV3ABrPu^-%%RZHuVfg>Z7KT/_hs\R;b[e<TiC<7)B*;,+-H6kr/\*;)]HU'aF2[]@C';8I<@7ohq=mnTo]n=qMCnma5& -%dN>[j(sA[f/\N5N]`<M?.QFO-(b7hjb)`guA$#SF(O&\VIZ0O6A!-[+j$okY`/D@U*7ZR8jOeC0g(/u+^Q.(IAeeUR;#]8:n-WT- -%rSub@k.'rad[C*=n9H1"0Por*FIs%(<=U_8n)bf`eXm4AbmN=GV,=.k+LCR?dH2edLc_Na/A'rf\2hgSQ?1_E\X/k),q4p+]qf,P -%MF:hN4@?114H#i%B9fB,Q)EdBo@.$,1c8.D_Y$FZ5o#AuE.1oZD6f_O27!dIK3f:<D2M=m4O1t2EK[[pBBAo6Gs'kHmV;]33Lta< -%0)NaZb7ddqOBW?!mE#i`XW42/\`7&W..q%mDqZZ3Ab'Y:M9K,lOKU,^/:,*5FKkn].\ZJ&#l';BdDap=W"@1YF;kSIH$]+gD'o<M -%(MH0EOkeS>>Ae#q/Yan!9dHgA\Wo&Hn$2")BPAu4DD=si=`]LVcG.>eX,r*E8WC7fQn=j`G6+JV<p&2[S6MD&.s#T>cE5=$PrY0i -%kC+H\>&T.T.KXDED7L+!!N`hH81_>8V_48u<sbFILHTjtdP4]TiKc5>6cCk7M_<F2keYlIcRZ9CO1EC`nX5KN!)dWu+Cd^Uej3B, -%3ucF1G;-\9heb4-hQ9r-i2G&iN8NNljK0J_hfl,G4^GVii];_S"VM%TnbL\tmE]Mc4Trc/b#riF]USqQ<V3(iI2:[l4#1M<[m.Q" -%=D6Br,V$ZOhj7CfY%;];4D6S+]?Nf&9d!O8]U8'S_b(/P]C&;\NEJpm@TWKc]^Vt`El-Ye\io8HHe>B$GJu3N(d#@Z<+X3Wl1;cl -%njU,_Zee`t)L0XGV=QEG(Mu$c/*)4qGP+m's):g.]EZpmm#-s:LkuISFlPieG?eipL.\&DqK0J^es`.EgLI_<Z6Mi)mC3=KV9Q-L -%\^+pHS`CFBV9oc:rL1<ras`;-$$>S*-g-4kKgd)1qr"*A6,.gl"T9\uV.cQeU6SK\dY[+.ACo)bV,iI+S.#@+C'th0m.s,FZuU>> -%QLe8N#NG-XZp!A55b[dYX2_A"54#[-V.3j^WRgHqT/Sf0<QeqfC";%7M_EAUbag4S]NoIrVT$L7E007r9V+h?kb;84Dl8lBN<rf@ -%Nb:NeX2T(d31c=_]^Q;>Q2.ai+;\al/H"4(AN9[+CZ@0rOB7bX/um?@2SrpK`oBa>Z'65JOV>%'Y'=02,X-9*_CVIrIqG%EY7_M> -%OUtmj`'g[B\UQ"*,09Zo1dA#L*YpjkVX-0^FVW?6/;4X_Uq[tqLf.GH)0ce1^+9Vh3L9;J(?[9XR(/eZi@\lNO#']Zc>sIII?'8G -%Mi]2oUOqU:n6%N<?0(Uj(Xn)H`(;:.>\kGUWI`6!?E?9#+!VMd@*e3C2Sua*KB3Re#cCIP6[)0ZIoqsTBpV_i5+02jQ<CTe$8i78 -%l\"p#@:shI*$FDmYSV/0H*+r$bdaq8D?!Scs-P<b?:/Nin`bI`k:'+H*qu-WQ;W[kP?LpiZ.\]Pfq[Y>1U[p.bJ[srk8G=L9H6#) -%r,UHRNt/2FUp,A3Ij&)>f"6CIPg0paR94^Ka2tE8AMMo)g\"uAhDW"%Z^EerB]5I\TI^JC/mF.n)>2p@QQTSeI*A=u#Q5EDL1F[! -%5^Q93rTCa-PDa(k_7/-:3rSQmQX;j<_KsGLh=nV]6!*elZdl'=CqL\q6$RbpeMb2?,-&?Uqo^XQc$rUXRJrs&B8JOXlV&X>CnlLF -%/<5lml5t!YWAN-idPU*CWkE;cB,E8nqE6rhYCHMM@=Qm2<-qO?p%PE9dZ(qhn`:Q+$-QFVb#m.+(2(2fV.r/Do-gTE/<UpClIr(P -%=p(1mX%]<Hq\a%7!QM8H*pF0>Ph3?<%09_`j"sAC3u5!aM99odS?[AS8QuM%F/:Vlb'K;l&qEh_(GQ^A.,p39Rb0Qa+Pa=)^pp!, -%Qoe]UU]WA$<<.+uY^2UU=XY9?\VqC+7@gb':e+TeHNQ6@l7aY<DOtT*icX(Bf]'p!=Ee)MTY,pKH7\*\Akgf,b*$!?=;'4!RDd)4 -%!^)@(XAE$L"_VP0$7q<^-).b;17#.j/<DoQ^+@iF/1_fU,Znl;/IdHZU)^u)0^fQX7>Z`!Qmo*^QI5edRZiP3TTmMG!08l>/=;:* -%LfAs`6`6/"_t=/ZI0Va9P3.6'<*;B8_[XC\=/TD0T^T5F*/?1t$dArDqO.T6*;p?%;Fr/=a<Ndt5Yn($70^EA=^;<X\W4s5:IUX/ -%!1+m1DPU/ZKEIO[)M,>O<;.dS8\T/4BR6OfV"C0RdT#P#:ifX\">Qh&F&Sr8fT])f]2?=8ZQn'*QsYtLdm@J;<lU:BB#*Mj'LaLe -%'Gl_/*6C2'RQ\1'&Q]K7+=%BB$BG2T7a;>O>tN8"<6FJtAua4c`L70LL8:8FiuDoD9GQ#tcdF.7iA7DTk&legil7EZMucUUTa*iM -%-<_=&TW2Y0Y2<5En,u.#9J]q[PaTi$GS]Q7&[QE\e&_[afJ>%"j1*`O-\unt#@DrM$=pX^f<$^@LhkU\e6`.p/.PkSCM)O/688f\ -%Kf*8UeXSlpFdH%#n`pqJRSP\1]V"Cg1S2jA@m,L4Lh&7C%Kaf!>$oT4\=l*a\Oc[h#1(nrd^i>>c[b3U=f0Nj<-i?4Ps)7CNUo3p -%Ps+5N&\Y]4k?=Wr&,S$P&jI9Fc2Q?g<(jC\l.&TdDcW($DDk4(;N!0!f(;YpOsal"DSKjD\i(fG^<"inm<1QLT:sga*Xt35+560h -%c+Mg:87"1o#Hd=7[g%J&^/,oa7$!?i/Z42,f`QY8n&m@>`7le,:1]ih`G?QUa+OBJi13oL$;/NDa.TTk-Z5KPR)jkc'%Pjk1#eY8 -%1UG4JpY%J@<J`8SdP?V7$SW43$4e_`n52hE&hdkPnO)odZt-CJg3R.`NZqMFmH@&FYCq>Xan7B=kh2N[$LAsi[G/+:5"f(:Cqk/W -%a`Z=?UTQ));iVo"3^c5=;p\S!$_F_UPKYS<H6j;(R(:@S\N[>>:+W'=J'p)7f(t]O_GPu-CdA@,9[]C88@^*2h3>3VYs.TT$U;+Q -%&S;43"q\_lIVj'^[G*Rr5,5VW]'+(Ap44*b^ZpH;hl=@-2HlZ[SiG_aiQ7&fplbmOp02Hc^)OZ\)d6=IA!pHY^[BcVWpiX,jK7Ro -%YI5d-"agAYRGlrTdaR=nbX&@SX'iXULs_\[XRM(f3pEV'"Jm:$\_4i@Z_]YR'A.qkb`uh=4KB3h!ljThLDsC*aP'KNRrIk@Ju=,V -%MQ@K<ZT4RBpcJc.s2VA`cdZ!N$mH%^oJ2.01?#:9a^5)63<o9^l]J8_l=^ffZX.t1)(n),_fi(:Y&-+PXZ9&#)-bLn;/:llSW/rZ -%KV*$BZhCPpKo%f4/Q><G14`:O6uI.i8eBh)n4Bf:O^%Ub4g!_n>]8Q`2Y@cU8=5jl>ZnZWq7>@fb,nZ0:Y^7rL*Y`Aa47Y3BgHhk -%/7qq@6Q'O.ZiqkCS]1#p#'-dIIVohdiQ4YSX_fL9YcO]rXtKIMOS2N`5LXcn@VL<W+!Cr:!@4AtY8QBBoHW^cVFuo9,moA3SkqC- -%<,GdeGYj`R-4?B2==;6W%d_X78[MX&aO[`rB5Eu9fDCPIqdHDYD,&MdS`EV9CUIReBqq"b;MIE17"H3\/e42dPC?V2U*[thKLmX\ -%>qSd%`Rd:b35&#-r)8ItXkQN[Wi]^c(EUWNWc_qZ[@&J2!/(uIE&C5B6"S%k_Du;J8ZK!.Bt2<SP52!ikD*+)^GH_7m:U>=%ee"+ -%d)o/+/F?0V=e,.Oc]h^-O]lX>Q?AIB#@9]MbO^DU[\eEWrQQq?!?So\38,aF_bl]hs&a]WeFRnh`mG3Riu&]74N>DB@VDcQb!,1q -%:O+kD5OhlIa-jtO:;U0f02?$"KWWuP%?`MlULu2'>lJ8Li[6E.`UU@B1(-rRZQ,trLKs8hQCNZo#&rQl@4M];-M+JW'sWa>fZ#)C -%Bpupms"oq/%CY9VE/jJ!Z=lG)nU+SQNer%AM0Y+uAbkSS0l`FF29ENcVEtU<.#2O9MlDMY(?RUmjuK<(V5I,3_U6j>)blg+dF8Ia -%'AGL%D&d$NR9#WG4rk#$;l=CfD7W28Vs?0E=ieHo(:(/m,,Sr5Vbb:KBp(h`(1*eJ9_"%CM-iqDPZZS27P&?fANA7\:S3f($b.Oo -%(DE]^!S=+kY&Os'35j@R/1Wr51'T@=)U(=%l@d8_5dg+',[AgJIaJOpLk4UW'/D7jpPB_h:)d.mD,B?$6'X5;oaDi'(cW".etSIW -%qP4Oia&Nm]9U`&.>\-?/iuG3^7A!]5QHVRA3X.e.;10/rTn*k,Wb7jD,f,I$f[9iiYMHBl'TSkZ.eKff>u7^bg4%>0Jr=rY\8[cN -%F^BC"-(WA4eM`I>)JDWmSI!e^&5(r@`5#oR@O)0?jKp()jr/Dh*Ft!G#e.?3MP2b,JsW]5lj]Kl?Z&U8'"[n<IBPsr_BSnFe?,3i -%=a_^9_,5";pZ)cKkD5*+pRH%IOQCWec.55BG&(ZT+d\JQ3sBkp9S$i!k4Su&G(RZJPg"$Y_+)0g8O+(tOVZo9VqjO(=:'3d9$N(* -%,cE_RkA[C%k;L+$lis,?\58e(k^scDE(;3"86AGEWOXe_XXeVd'Zn=5eo!\mN*ir]K4.DKI)i/CKRfI3Mpt-GJX]8B;-]\5gRF6G -%3FVIK?ngqU/g&9YRakVprV#+1j(qM8A9[scgYVP(]40B#JP;d`Mh?PqXf]i[o=4O(0_T-aBl60H+Z'2;(-f?N"p>3#'p+YT"2Y8T -%%4l!5RLj:Fe?H%$KTQG*bjeUgE=RZkZl[t@(MZVC.!#h!Md1mRigS@hI:%baQ.cRQ8ZlA`AM3QecFtl+Ruj-8`#25;Wnt-$r!;<h -%H[,$502.)<i=F,Z#)>B4/1@H[HH]&r,o2.;AmT%Q'.XHD5Zeo+<i^L*Iia%rF\,rf.AYFgOG*1pm1nQ5olm](.*IU5N%*'6]^2$n -%0?^apno',]X=?RFC[uj4afl*BI=ePh+i>YL]Rh[Ejl9l3>$a9?"[^FsNQc9c\S,X59GGW=(5Oa_hLVsE$Q@\XVm<F]Q%_Ve<jJuF -%4A0S;LXn!Z;/!?JN7V0N+[I0fS4+"'=BDIu$=7`KIo7*eRCP/VE[jkR']GbMlXjOK8ejED1sbJ,L)9JH<N5aB@Vk<Y)#X#-"P^*I -%Y9f4?H._BT-5_'L6/517F0DtLNV6\Ae<@sCG(@"Hku`hEo1Xi,SNIm@#meo7ak&<X*nFg'3[.F6/96LMGatY`1r>4P@d&)gpgn/L -%eg?!JQ5N;mF>HfiRZT_76^Z:+QeI&@F)?QMogAdJY^3=/4gT%i[Q-947[[l\bXS6sY#guYb:B:O6L]i(Ej"RF1WKZ0=r0bp)(?Gm -%!seZ93)#E!a[sbB73d^')t$[d6u!_kR^TJ-h.dmK>qn<u1@a*EX\7V2.J46+)]r4Zb9k.k8_fV[Pbm/Wq-b+))%*P2qV@@TkcOeT -%/s=9RGO=A!h'u0qSPK2:6)jL"[rZZ@JLb=Ar:N5Jo@Oh08H=7TJ\TF^0KjL2GNd/mWY^YW4]Aee40(m=&cDQlR)#63YT#sEf/,M[ -%IsRh/c6rf<>L<A9"q2gN^QE71MJ<!;A)+Sh-Qu:#r8RD00E1.as89Y3S,1J2KD3i%s53j)T(c/E^3[P?s$)FWT<mG$RpW)j#NUJC -%q`u\K@J1^u.Ll'&lJXR>b,e'2]5GgCFHP:`@7L\D%G\AeZ\mI.<dT)hiPYO28E.9[Eb3S<D6KGq]tWa\UuAg3L[TFVT\QmUh-+UE -%j[uWpj</1"X!6Y(5XeDE:r8(gYDt2t\,\W!eq%PH%D8+1h;mIHH;)&]l#6.#*FP.roUPiK5c(_C:=+.S01'O=ar]b.5_p(g4Bf`& -%Gb%@*h&iin>hM2uhK*8s1n%4JN_e&NgoNo]f"/5clTLJK5cYopO)(6*j$Cpbg<PK3FFMn<IC;@T&)Xd!HeKImZ_\#;KHBO*rh*WA -%GXdH'F5&r4X>U]!e3X]uQSD9g+0\frZ\XtI5&jgkO=4.l4lT?%6H,nHL[^*Mk$4l7`sIkXBfBfaP6o52i&4a@&Q<ZLha'6bEEoFF -%r%1L6[/afb7eJgHSqIE2IC01nE5F`pP^kQM[=#G7bgl!`Y[H0N6B$=%Shr`3+jb=HHO>2').dBOoik!:dbr#L)=CZ_mPlP6h#UX# -%APtc!HtR/(:WDK-dTj_r4?d`N2Cmc#!^h>tguD=ddg/i]1t#gI6?W[_#h^Ll3N0k0LK_k'4i9sd0Ntd?,2j`;5l;0g`7G&DMN^0m -%Q0qpU-@T3\UEVL^>R=*b^Q0P_6<7bJ"FAdWn<!?h3)P;H$ckfnb*1[,OXIh432j`Y->4q5L86KMf979,VJH=u6T@qrf6&/BUuul7 -%]Yap$K,d]6dL2%[SGupFP=--W*s+gXH[).S+e5JsN<NjfDWOIYOiWaC,954l8J<or!^kD&kY%^I@B,0[7/@lC.ADAGgO^eYRd&[c -%1?h(/Ua=HAml/M^["h$dV*PTB+mhET:\t\ujRB8TKVORhL``:P,CY0KY9P0MD_22&LgR$`-U(3^21bNGS;=AUQBtso!1%1fM>/M* -%JP`Z@TYHk*H%?J[&b?(sF23>&!B`mN*1Z6O>72kBH^6%o7jLlZO*"3T-Vr)o#Rng^U9Q(1G?H>Oj:C3;'4+aS6#:4:P!uB=ILlXf -%9Rb(9+Ud?9Q!G-H*s+h#H[).[+e7cT>72kBH^6%o7jLlZO*"3T-Vr)o#Rng^U+qcpJLSY"')?TfUko;57&V*q1eaa?9R`',8X]L= -%`]_H099<4GVT"Z-JKahP4AYqf:A"%X"dJUAbE5"S,Y.h6BjXFs*oC34(m)L+A+-ruD:I^L8n:fR2dmFN5s<ib^&ZYpUr[9I">"6` -%">=Hc\OrBpSnj<nY%N#s+&'O&b%*fm#B1;E=G(B]!u89O\U;.'=O?dK?;UE<Pn85Xk!Ga*g@c4!H^tC!d6.4l3"a(Z^&d?.QCK>; -%f;abiG8b^dqP^FWaR=\*q@gLq!$Rk'Jus=P"[1$<5_)FD!!9OF8r,aH[62eH^]Z-Rp&3kMG^(nBW;bo`!-RD_!'&Li:Ogg0F&emE -%SnlOP6i%&W*<#JJU'S1COq'QS+@"g^+?q"iej8@')[h3?q+EOslhj3BH[%df<.T+t6[cL9I]$KgamV(V>SX3Ck8Ns-4S]:i+FaYE -%MI:3Cl*+Y$ne3&Jne9G[*CQL'Yn.b8^I7+fhHqCT!;@0N,rh\@C!9$:3sE5eIT4=.oLH;P7t2&ne">P%qM0#6#rNM3&%e,L!09^# -%!'Jt$*M,M^CH5cV!+dXHFoUG$G^(nBW!;Dh!-RG@!0E4H(]dOUF-WE`SnlURF!KW%q%:]aM'g_W83Q6B@0d.*_@R:<@3n=9Ydk;^ -%%RGrsAc9A'"<JW2"BFD#oh]QZ%KYkJ`?@LC4BDihn%%RC0L#[C0+:,P-^mkQ+n_dPKcqRD$:@(7LQrF-_WF0m3!:NgQYh8i&-QrJ -%'2jTQlB1L>*!4WtMaN#PH#<maL!L3Z#Ngeli.W<[iC">o/u0Q]/O'@ZQi%D>`.LZEM1Xl1^gIGjFP`FXiFFqM5)aIpf7'o;%7ilc -%!^<QEM0Cc[m@WtP512ij3o7dA8`P=#kFYQInpg61iNLcrX+0?*ZfAda00f0&<E-r:UFL(F`O,U!nsbj3k[N=7Gu#76I/L-"ekk)P -%/\O..cE=9W_VQo.j:o5<;s8'JmoqE\NW'X4#t&#c2aup;/\a=1euu2a_WJ&hmV0+ZZ%hfRE;@b8[t#(^ng6')3R'JO'T13VX3d21 -%*i%3N&DJ,GHc-3ipg%@1TtF0+IWNr.@`5mk=,_&mZWfPGhK)2#dPc.Abt0jWD%5U/A;#I1Ahqq6hG,]<3U)8Ria(D=`]'gK<1ZGF -%Gp>.c\%2G!V#/EF2ru&mKV)`")651S3g\`oGi.1`5&'0tBl]ZUk:%+;4%>DlV9<dP\h.c7R'8;^?^tkH)QP9):7'k.I!ZcO05j\I -%S'u1N:SIU>;4=k9?%-kCh.p64K`,\6EJbcQ>K*C$m.-X0mp[O0jaCrmF./Zd.5[YU8e\\DbAU.ea_cA\@@J3CS7864X!hn/Qf"<\ -%ZQ!m;Dg162dqj8)U%t3UR_0;?I.K(>iH[L6F@>9YUlX1>c^@.o-aNC(jEom39.=sPk"V\5gD?JKo=<T2U^cqTRuc5XcWa!&;**79 -%H/9GhO41):cLZ3WEL]e9I6NAMQ0kC<31Xr"4_H2YLZt&8lZnDe3)$7)@F*\#j\\(p0)H?O=14C:UNF'Vpme`k*i2eP_WS%qngL&@ -%,<g$!Pt1(\S+0Ej?J/X7NRB9Ml#RV=H'D(5=.cs\b/8>$rVF1O<#VZ5mb(C0H=`SF4AMg/cHf]hV1C\hQ@@[O.LjlV\+T?9;gG06 -%\$\GSmZm1:njo<hf0=16Pt1+]49'R6WB=(Vg\oIQ:?@U!>m.qW\lZ>28gAK$i./K5<$&$f"UO1kV".'I/k@+'5F"_'P^rm7kWX'` -%B&j'k/E\A/3E[jr.V[(MK3mf&iUBP'kIN*6`H<4($Y[4O5SANiacBc$@d@@Pi`/gH((]R:P"oHjfd)sjB3^oB1$-H`=-K$[6rP8m -%mNaBh"d?)Nq)b&Y.h=Fq4bca"H<?cMqj8T+FU>4&ic&t;^$p1`f[LNGY"X&:ct&PN50t^pC>a]fR#ZJH\C=2tn4j"cjeW2t,KsH' -%2A$j.!LEpN/>n"aB9-SB&ZEBKNPSUO)<Mt5h9HfiTi3,)k6)S:_8<Bd9l[Z_R+5_F:R#/cR-$<:qeCs$n31d_gYKR1mU4PQ=)gEn -%S;?p7mc,j/iK\Xr?:;&hp;mbhP']gcP/54#!GW,.DX9:-FJ.>mB&N:B=e6<][DTT6ib@!W>rD%&*MT(n&p]ogXs3d)jn[WtZd2!R -%qm@)";6PCR(98EL[WC-20n"-sGS9[+ZaVl_T?9pM)W<q)a,,3g9!V"aZ8c@!0)J>Q!jf-2p'E5,\C9m2atf]%QA(R!\a''*bIVNC -%<0r$1,?KIdn>#G)9$PVKQEZJt.UJsm$ElFcC7k.Kf&X$%bEl&:CGRF#[<+rppGZZ[d;TdN;E,&`Jn),CodL`ui]&=7GlmeQi_tuK -%9"^MNG7jNTa#&/N8%cVLMR_hZYKqk`GtdX1ZV&p90Tg^JIg+H[j-WX;C2<BAJAfqOr@YARVb:m*9l61u"#e_G9Ul<BE8[U+j/Ya3 -%?$U1VCbgK=_V]1'^U?bHY*!U</6BSB-gb?*.ZpQ-diMso"g@aAHA/5oolM*a=CPo8rNfAZFeN91a\uhiA1,IRW+o#a+*(dGoRE#L -%Q-4_n2-jm7o]g,8L#a=s)*pGHV/iPU'7V[G!l?7*(HID;_K2/mL@dk/kH(9M]?:AY],a8kPTkXmOkDnHS]pkFDAfYRqWnsXXu1]] -%\a?N6Z()@45ePD$_X[hJ0otlW&:cAgO0FO(_)%u.fR8bI1@lJ#"3nqbR1!c&(I$<UiqOMK=q,[,KXY,H,1G*%.6`N>&mTOM'V;Qn -%HhTAiLnirHoPkhp1<":iVItBi[5->],ZnnSI9%1-Q=HiPZc<4%NthmV!+DqrnnZi1HXDF3+aA4B$CU6;\#6.ll:=L1+LjYLn1oKG -%HMPadBjXWK7D5AIj[dji8A-3iMpsD?:2U%>eAa3qErdf8+'+anjmad[@#2oR'JLSRI7\%,\f2i%0)mK8(<YO31\p@=l!Kcp1XF=q -%?@M%IR9Z?L?5dVrUd\$>"EUt1S,I0\Sg4c&dN[o8N9S,QE*%E,(MO=G?@4>LT%<#,\#+X\U@mac?)X5sg8"77`VAe%2l$21\SU+$ -%PFWg^=QJaYk$PbOR29%bF1a5OG'_AV$K%'5bR^hV1+Q=l9k&f*XE!`dmY&^q):r>(e)EZb[17AGl+s!-'n'=YnN(GeZS>Hj4]2Wj -%SlX.#)DcU;4O\^D%o3fEHO#*/T!si;KFe0/-O2QG8N\SW_9uccQMO"Y'H:Fb:Vl]@n6JrT,!e",JQd\!@QK@flWIb9NT^.>N4'FF -%\^`MZ<pP:A/g@oR:^8sYFn3,USd$m(PSLD.cBH%K?XEg'8@QOc*)S^43QesH2`OP/ST#pO;Mp>W\lg*+Idn]s/^h'"=j+4KM$Cr' -%6geqU+:#bM&qQj9"<"L_g.qj+?X"#^6\pl'-^NG5Dr%bj4`fs\)!<pQ?-\k*87sc34.V9HAM5`lOt;.P']CLZ=jb(?;E[+Xq0i:" -%@AdE4DE*NB8;(W^!jKHP;*#F_D=($]KAZ.%293Ro:+r[dJ[sq$66r-Lq2S/P#+m"4!S4'(.><sq!sd"&'-a@f3GTfmr7Wo@!E)us -%A0/Bl4C3bVU6MqP3FHdc,LU6k[T^/ob/ke#h+eI>C5-RAWF?XOStj3s-f'i?CGLTLQqV3T^b/;1Q?jA0`U7V`c!t1ngTt2N19HWg -%)h'$u[V)cL#;7"9UK*.IdTZ5n8b'#&b?,$d3Yup%Q7U;r2PJ?@H,ru)!aQnL=:a>9Ohp'-^=p(L--HXDE'W"[hr1647kL[J7#0p+ -%lNgi^fm38cIdKntHF#DDG2%@QmmbQlEn03N5L;'A#@1VAgJi6sF1O.Zi(:c+oM`o\!5=))a_a#4W$e"W>[3hYPeDhn1-\tWUh15q -%mrTMJdPP^u:o9Y?gX0IXb@7350`0IaNG,R"O&b7kYpPH+G(jnK`$@)19kY#IDCO"l(rh_-N&rDh@(*saXLG*(__3L.CJkRZ%1&56 -%Td#^L&PBqS_//"sYb!(6]N!S]C@ta48s."\RXdC-'O"H>=@tW%"=f&)37G/;i<a^R]U>qKY.>/`/pM5BQa`lco#\7g-6U=3-CM:D -%11pM\'B>8+G#Z&sEcJSE(cDo&?5N5oUa,(*Z*Xn::!epCK3%VRN;D^B)E.Zs3?B9`U^Mk-)F\JN/0Gu_N_)!WP%$B(oR'5E[FK42 -%$%$$croFX;l,I.T)5)q.qc25qY_ItPY(.o;,;6F@#+%2k&["P(aq5BK8PGu9Q?FN!MNN]dBgm+P^RR.3PMI:2J=SeS"1f6V'#>:6 -%E1+4oC@ti]la$aEB&p,"'UWu-D6p*AEJ_bBS/mg=r+ES3s-)nKE+r>=oa*#.&UPF)da6`-V]1"G8l-RXHufW!^tA*2$fILQ0EIcB -%.C"GPEB6RV6?H/<=bgA;0sq+4AM4nk;\$1cFsDqZN5<jMcI+DLge*l)]UQd$N$Zo89P@oT?N@f<ECU-YJs/!e<p%%TYhg-^nl6Oj -%Qd>mB?[X7uBYo[]4cZD+FVo@,Nd5)t83",e+]GmI_uNpan/>sD-e=78QUDg;$ac1l5?$."+GC9+8`9I/aMg[=`57%;m="Z/%YV_, -%5^,kk2Pd]Oks@icGEE;VY$&8h8FR2S(?ejRQSL-,:-g+G.\TP<TrjT26o#R,Of90"M6s/%1Ujp_A-/^0RQ$U6O$jm82euD-]8K*6 -%bre0QA.k`o;Lo.Pk<[U3U^G$lNPr99_MhpqOFIcQ7M5%)C[FoR/:^r"f%QS''LZ/oN+[&%o+V9d[+ksc=@Sa1X?T0/NhR_]2CqWs -%!02j(e&7a]!Y(*PLFRr'8o?N6(s_#A*8U@^$mnk3g1rlH/5UDDo(lgsSFW9Z]0i<B`mP'#`SbIiKopOD;T09b=hZT2E@%01bbVO7 -%/N$<LW=-..KgLilL,52rL)aCUk,tq-d?_A!K%VBM#op)+G,S>!5Nlh^)/a)B3EMS.I^M$M$(KA:g_d26Z%=9efEVN)4Ifk<5rb?I -%<=Ma[V5Fr$>8;n+bTkk@G\:['nIDfJ6>6;&Wdtqkp>jCgC\t*=@6KI_R3mLURY4T'1"7G@i;uEn198<J"-YpO[bVcqEKYf8pNYN> -%//tMQrFqBU1E&]UX3O%!Y84XmZq]j5S7Db_XFJoR[Cf27CJu0J-3bQf^5E9D0IE>8f^-kV>L^KK5*cE-8liqt`%gb6ot*8P<_O-A -%^VqmTbi\uu3P6@F#i-pph:8hQbd`K_O6VkYeVrrk;bD$G74qLX`<u@N@V!$$$>aMS.8^,q\]4:n2H1eY!;0N*cMm.,11@@=-5a6Y -%@5#m9a9eqp)r"]p3q`ED3aM=_+s4Nd<e\4RYW7Hs@0T(D'W&+KK$1<-iZ+0p1TLXT-&S5I0VVYWj=U[Z,H)use[QS9@!]+_ePa6J -%&=J<A.t=*ajIr$s"LC:8WmS(kRBa6="Mmsp=>3?]pCD082L?so7j&[\iC198"s6NteP$!BmG8'l_&!i6dDI8$'/(k:6ss-%Zs(_e -%B-_UL#IBb-mnBn?Ha37F@`kh;=r3mu#WT5bB5j#qn"*>A&61Li9XSBJE"lV/_kM[c#?uJibMkrDW<l4T;_r6u>dn(oXKn^^b+l@< -%fRos"HX4N!]O?!"lrA38m";fY@0hd$,L;lk92IcaZP[bu\JjjIG:dXcJ]Mbr`$Xn..&e#31QoJl!#Ds/TtZjZNJ("4mj@RTP8H<3 -%5]'AgjTo<hSRPM#bB:rpIJ8/L*_gB27hGW]=[U&hqNp#F%;PO>Y\esr^%=1.Cl3Hr5FJQICPH)0Z4Mut-BV>,\;JKO7\V*@bf\&N -%`r9"K\1qmf:CNgW@C2gj(M-T\]Y0dpK8D$\46_Dh?.fqs+)!IchXYQ8'Rl0U=V7T6!\&c5J-GFsG\Su:-GC2rK"^EPSWD;`\>c8, -%bYZ4)'dkWrOh"6_^9^C51;<mK_DCskHqeMA*Lh)1KTgi0Fk`(/!XOpU(=]/B#5L".rsbeUG*17k6EDm'%p".8C7S7g)qBW$r$td\ -%<N0_"4Vn\f+[iQM,J>9Ti2/9Yj`to.(C.$:!?/r!:n0.X@>IS:3LuAo,0,.["<.i,#`1*R(ueX**0A9Rp&!NH=/gMH;UpuO)@q0? -%;Hm0K##<LibaDBJ"uhN2`cL)5_*t.gfe`oLApQ6\=N[M"d58A:ikY4P9^Mj2pOJNU^o+Or%F2g3I$4951l9IlC&S>6Ko)VFm9`L+ -%me3sbcZjN`DX8APR`D2oRV?73?5S#Q25f$@MGKJ$cD1[Y5M#\$eg\D'kHHK5H?7e4$T8HHD1P7d/n6f274MJ]?0J#6li[kP@Tp>/ -%=(MYc26omm#Q4\.SAql.pQn_3L:9_<S'='+-\-0p(JGXB<eA\"UJIYh_;98CX@N%)4IN1?cgJ!u@6B`+I.-<mDrN9iD`0Knh!ehK -%k0#EL*gq5OIJ:C$XT*[Vs(Ar(ef8J2'%F@Ea.pQ+P=E=WVEM"D)n&#jS+EpthekBah2YeqNXe-F=7i?/nodaWNlLbGMnsDJFh:oP -%7SWXPHN"9fc28ho=OiFJ*Vt\Lh8X^-#;6>&c,7tF>K>q=5M+]`XKMll0_au.@:Rq01qL)Sg@KL&g$.A-;6)dYlB00:oF/`P;QjI: -%9)Sgak-Gu/jN6d-rX0q2G0P_BP<AZRGYAtpe*CE2/J]76rj2Vp<Vu]Vm>GHF6N7u_*h?a"atsTECtmMVV.hM;s.*`EP@qkud.S]a -%ELA$Q5:`nYloWJU]ArYA[[-WrJ*7FBm[GSco%,h4mmj.mhP8mG[G+J7F+^j4]r;g"GASgOH[F+$Jg#Nol,**!GO-=6oP:mk"^@hs -%[OZE7nn5Sp7e?#;caFae:,DXhE:C;!q]fu"]$H,60[pc=B,\=spdMeTcuQR+hV*Pka4^jtqR@PeqgSF8G.72,(U`Qp?"UXX>;M8j -%oV,9rrOaj):W.$qcu0qK`m[bQr@q\ALQ41\-RZs8;>\2AG5k^g?9r#@kc+-3=QDp\O-03Oq^\^7W0hj=IOQF+oh&e46`(8Y`tS8q -%mH?t8-;_'7?g?)HW;HAr"FGG,CitA[/km#N"0sTub*\-aAf"%nR'=[8.0>l;P>8WYoPnE09r"h.]AGXYO`$X,5%5-.=SO@XU7o>I -%n5$ZA%%XXV9be<e)FT&DKI)O$d6=kDIu>F3'/noa_hOdUSpqrMpl&+R<^'(L\RkVX1<RSPl!uR%7,NE5&R;-(e]!N%;;3-#qsEA+ -%L7pp&dIkQ9m]l:d%#4HK5EJ@]Wn238+Em7#ToRk\46(2^!Qs\$.#p6BJWKPM1kV]-9(C=[`M]EP8nXV:0@Ig:fiI]]ETWaqYp,;u -%f!OELnk8j%i38Oc`!$kS?2tAVY"mqMOi=0=]R+U:cu+m0NR#r4V<MF#0g5a2<aCqtG>"e3>0Apad_AApA1Jh0&i'j'W1T]L89lae -%@NlL">M\=_m:dL`nc.Ec_JH.YcJSh/"G`0`H%t-OVp4j%n]\X8Ve0XES`sQnAlh,r'6_mYViid,OX;PM(ds;3H,:_aLl'D8@0\Yl -%G7>_>&SVo&;,9Ub&L,[q__)F5i]'di+>&i#K\P+1KPW1?f=/W''hJVEB$^[t'J9S]P#P"4?s]1i_tcDf&n]!WJ0]*T"E`3?L1;Pd -%80T2=raO5"9a%!Pdb*lB'O`P[-B[%58Hd8=)75KtOq::JT"!0B`,H(olo[j!VIQ@sR*!4I@@!$4EKaKO7Q<nA"S!Aj4B&ujjB@.) -%na,n$V</.#Mc:P-cm+R/[C#6q"Gsr;0G'I4U"AZLr"(M!5B+#>LkuN`V4RH9p0=CjieG%IE'95h(2!c'Z4<(t%$<([6[TYu=P:58 -%k;A'GiBWlhhf[cqG4kmq`O-Z2@u#ARXB`ln&Jd4bT\+@Ia+P#9_"htZ+dtj`$eam]EVpDW&2HLW[(?bad?at,:1<\i*Shr-&,V'% -%VuZemmEqk;dJ`d$k/,NPIf9`Hm\e(/j)Y7VIe7IVcPN&CmaT+0`nEPth@:b9+m#.;c`MS*UeaBt^G@q92W!3/)`%nkW^f-_7+b"7 -%ZHQ"lP:nCV8"smXQKC%7aV7@rf6M+$`=^A05.:^?V'u5r/)"Xd?"KH)2b?QsQ^Jp.dZ["DL+"d%ZmGQJMEb_CRS&e9j#HF"bsa^B -%T,eo1g>a)>TpLJ,I0oA>9>Fd9<W0XnLI>hqdII(k?o5UVL=4;:5PsIc"-?W\fBr3*0EWr7eE?iuWUFGbMuK/"gYhY[GU;%D8Tntk -%`lho)IO6RVjtZY1483^PQ;9P\)b%)ogqq1``JRCNKeq1.`]+pWE&Y6W'jmmq[!L'U61JYZ=JVR6JH(<5NpjC@ZT98<MOU#[64=]A -%iqY8f(Bt0ac(@j-6qLWZUsu4R"ke9*Pl1uMLIEc>N'SCo*)[kGJq6=dRH5m-9c^BbM&%7@nNtC%?T#K9g`?D99!I,Hn#5Ouf[M]0 -%T?-+O&SHhCpfra"E=N4pGkXM='cc&#Ig5[nUY?iNgD5q7q^:Y(oj>Vl%_pmT<-\?BW0`#(jVQ74P:1SPkJPTTNNZ-Bs$[I.QMJ7, -%8CXi&aI5=iDb@]fZrMJ#DG_'E%+buYo!+>h<oV%.Q2[W9m10,m%q6T\e5r(hqInN!pSjrt/oq3W[>knd\5N.ipC1Il9gpO1)oJAZ -%Q[hAILao1j>RS9u9RUOD=CZ9$nkU0B[//4D:KX-!bYTt7+RQK6_3<Be:df<?1Li)R!E4eI@MkBLC]o9jocDltpZS3iC0UG.nmm]( -%An;TN@bUsFbjHTas+)+3F]015>c$bEZ8@`a,A202?,^(/nE:ohFi>O7`\E$4.V=&@o+_HYe2%O*&Cf0VKc9[KT%;T3$K6&D:kt!! -%M<San8#^Sm:lK^.#(']'oTAB&Fe)CV8Kl=n+:sdSA*2dm;^kC5Z"DS2m[l8EkR/n>cp-a`eif;o%SA#\)h\5p7aoR]k!FJO!WO"6 -%1A%Bb3)EBfnd.P?BppH,h;QM^HA\VW'Bio9/nRS)bC!Ta@)Bq-la=g>;'mK$];f,_I"I%#Ul&,@>U(K/21t>9,+.;./0'80k'L^\ -%2_poED1FnTRF<_)E(``'V_V`_2^dHTUn:,]N"TRP('nKO'Uj9T)3o/P]YN;Lk&kg7hFSQ@fT/E)pnfr7-8L"uUS,j$CE?!=JO#2- -%U<uXWT08YaeeeDoQ(KBpbdkiHARlahfqKU1]cC!;e8i!u8P$^^Z(S7!GKNV8bTa.MThS_o/=tKp.)n"pG:nV1bZ*RjgBmHgl\_KL -%@H\ZnIZgOa9PpjPO5id*/Fsp,N6M^@UF3V?:7?M"CRK*gq,o860T9WsAH`45PmPY;-,GX9;a9g4Mqs;6c-kN!Z$/[M6e_?hRo,Bt -%*kQ&%6Pn^_&@PK,'kU?o1]^C6k?tgJaNQ95Cu;O_gMfp5;mYB>ALM@kfDn&n/L$RiH@VZ@IV<:>bu+](<1+g?'38l4\JN5!:-tZH -%F)d=!it@U*9_oX)"dQHqU:H4Q>0JiAbol?*'j9KAFR9\1$e)%;\d,`XJS`_%LD41:rQ%uT=\m3TW&(iU/u5B3-cm3cjNKqVRR(,+ -%?s#QPE+,Vt_ocGpVk[@Ch%41+3:k=gT"<\_NC7GT1;fM/-`n$BRlH%-nADGJR:5@09TFXB=fRDlQ[2U?6:u='M3H?i&t)2<EkIYj -%;OR68J?WcD+jD9-!gtO7&Z&*h25\!*Ue+r"+C]]R.kPhP"GkhgVe#o\F"ksT:iR+<M60Q/dl3CWB(Ea/WBiq6,]k9L'qKTtoqp)G -%1UCR+:c5[\d">i6G!Hb8&OMEo#ta][il!)Q7gkU_9aDK'H/rP=?qOVMQSFmG@43#9\(%@(Qif]Z$"Uoq<U?'>(a_=#X&dAk`NcsD -%&L\iWBd)#c?o/j_$o<NsMjM3ogFYS!`QP>gJ[?+/MhR/<Ng*Z_ol?UCbN^QK![`G_bOHH#N#hDjd/X4_71WL0pcO+mekQQHcB(#; -%Q<?.XiAMNKjU=[gC$\DB'0WhKH7JRB[R'"o0a")1121h[NZD^kkp!SqC+D2!(.M3^<-(ejUUf9^=Y2a4lmFg:nqD/8m(Rm4pM21@ -%qrl_;H.ZiUrQZ/LT;%4VF_KMnme+q-S^kA)2RSuDK5RaGYIuVo@<:]@bM!<$qa#f`N5*8rFC3;8Y>bAEQ2N*]b:_?gCkFTACI;]c -%l@7"b)Co\^U-oA?UO=iCgXq0$.)UV<3:L^V7%F/ZCetI)+]0AiP[=f-,r4L9;/*rXHRmiJ&]`$^4q$^YnV=/'1%Q+/rZmT1=d#.d -%WO2.N$Cm!:`$cs;gF.f.P5`cZq=#a;5VK%Bq7u>5Jk&^n59d5H>NGlI=8[VlF!FqL%Aj*s1LCMNUS[12DjME:"LGsFb>b5r`UnY/ -%a\nkC&4UYOegISX=^>,;Q6`p).e]q<"7&YIibGi``/>teG-MYD9I"'n-fi]MXPo>js2ZdS1qEc[HMsbNS5Paml):FijAtE1VcFJV -%YXcYSUddblJ-+<ahR<=6,K%N'1b+N=Ok,#.DA:m-)]Y)CN2Ca[;P::-3HZqiUpBSW;q/r;-ehW=dM`#)Xlp(k%,BE+Ht&?oZa_B6 -%p8,-uSlfJAb[`4^VAd?E9f@a6^<R0J;EZ!,CXEK<@Pg04ZYjS2*"Wcl=(8j$1MaY>4E-QVRs,U"Nq5EmL/em_Bs#`a/n`nl1Ub"u -%QJh``COitjA]%_4b8cIY@PEQ04l>hu1NJYL/9frGB/Ip0&p$PH-\[*U4""BiM>#*;4^7YNk4m,tbCutq#J,(@*Y8*"ao$h)oB!'b -%?X/(E3-o^Hq!e9%E7>g(m/bNPrH<C']/pk;D:)uuZ8$5]m'OAV.f-BumD7]Bia.+1V'a`sh<KsXJf^*jZ>a="(Y?FNKX@.F>IB6G -%GCuU^/E4A;`T4-2k8Eo5@sMEkg2$H'\uXsk]A!U1QdnjB^%U]`eXl@.DXI9b]l%0nfP$5a_p88OR.AMYhAd"ET=(+`e4NP4X'FK3 -%Y`2^^@;m'tL-N[A&b#CnrR'K6`c-#YLb9%X^2&60e.m]SUF?@T$Q%:cf!+5;MaXTET\ln=V=(#P[b[rO-7jIY+V<GtoNSoEX9t,Z -%B6N%iVZrUtLk`l5,u^>*-u:e=Wfa"XWN.PoN%-'#mYl+*TlB1#Fg1pX(PCZI:VD^I#JC9PIqQouG=E%o3JB=icbo%<qDm\tma.^$ -%k@.0IdD=]J^u%d-a[^<L_1`bRMOg>&i7/$Y6,`F#O.uG0]s!+<qZXg8&k[prG=$:5?<D;pOScZ=15B9"j5rrd"DW%0a],qH#MRJk -%mBdDDc\<HW``>F2r6`B[&4SSG%ZZ=hp(g&G/qsk0QaVV38$>'n['XlH#s+9@\hf[Vc9kKdkCV.Uo3\,s>Fje\m6u@YkT7@W19,$Z -%0k3(]_.[-=prJt#)RoV2@I<lp%0tVh6]W[G@d7r6HdWrUem:1&j7]_K_*k1)mC5q[Pl'OpnbD<m4R]&d?TV6PhbKsHk.'rY?$eap -%3^.R+`(C>c>>eL;%*/6t`irHY%_@:$NRcmQkV?@EEQQ\oKm@N+Apeh:-*&2/CN'+(efSQfh@'Y=#9Hi)*]EkiUP<B6k'LC4e#JBg -%+50^V]C3diDHYlKP2N.]2nGPW&Y[V"!1?6dqK8&j#>,Pqekr>Or3U,-j4Vh>EH$sWXd8.fc,[6:j7.Z>H.'s/!BiMjr#=\)7_ETN -%(?NtImAP$#H#hF!*I#D:g?/t.M+0\%4I]NW\83!eb[_U*CY-A&>C4`^N#VYbDJ+pN$1)jDWY0T']?u,[)"$GkAEgYTD7<`RGl/7H -%KDaJjK;7Za?\%PU^8@+bO1KuB7e]@KkdW_FFI]`)P.+K,\o$p7!h3qGUrC3l?P5h]f^1VXIb"S)rFGCmO5aK@h`MkeT+=!]nRu7^ -%;>UeZ28.fD@H2:P)H5r^C5`\$=5khmRkTFcD>3hh8.X^YAiA:Wi)MusmdC!(!IeuC&nL3e`simIg.qNN]/u_CW-1E-<D*bVHFl'j -%B+[V^-st=&G2(jA)IkoG](u'hnbnSq4]u9fZ9&/J.7il3l*/*!(eSH[QO:6VZlTCO_qWGV&!+>.jFX#X6f8dZG/@dM"#LtqEMo\5 -%dO5Em.J+JC.8uQ1HuE*0W,7oA:\6u/Cn)-15M$o:C7B8uE,48Nba&M6N;`%.T+P9s+3RB8l#iEYPH/NRTH<(1+!AHDg.?75?hhUe -%#fVdI\iD?aoN]o;AC>%8iA]#!k=A5fnGE-YAc<W3&Dh$6*QJ*q(oh[ATWj;0?IQdf&Y@QgoNQ39T=L'<YBF=C2M^uV,POf;jkF7P -%#L@TihO+8C6>It")fV5"d6k5(K`'m-jfumArIH'K>,Q;Y@PECNZ1>[JibZMgD7^C,OW1S'`.></B$;UG(b_EAX)=f&=mB1>[07I4 -%F#36\T5cELEDYW#+rdkf[I!&:=NKp=S6c)3s(!!q/'$jR1fL>_VE.nVq;dR\Rh*Rt\%OqJqp3*-ID7T+2.1`sR*9S_=T7MYmqmIp -%`6@/tTPdIg<8j^?mkoi<8#>cm6?i"N+-5-E\W'E)h3a4Tq5A.JibZjfef;-`j%_P2G"o-?3?0$`WG'dDl8IPG^r."'p.*2RIa$"& -%)0c'GVd!&=MD`9#lo'mhL\"=r1n<I/*r[m)Z^=hMLsAOc+\?l[D[uWTG@OIZB8m[GS=+S\O_)0cPWmIb7;GsHk-WtQQHgp:)*'U1 -%^C?<\De9V!RNi]\DdsYte>TdWHHsJe]iaJM\phDBT]^R#[f='bJ(T$ZZ>EAW8Gus]-Ocp%Hk7u7P4=Ab<`do;kli=s>:1$bar1q4 -%5%Xn\4f5G':$goSo@2"&VUZ`1hXhb.LXQf!fCi/b5LMN8q?I*:B5A''L3&,,R'?%Z$d#PPn)d4jckc?p_jQ2($e+WNR5Pn6[aLP9 -%B9[-O"t0(U8f8JHJ2o-QTBkZ&U]O^oDLXM2>-;TNqmcm<KGTkhfoR`Y!Nk94'!(_IHiNe8SQ:)VqoM)B^$X^TbXalXh6pIDK11/W -%s,L8*]t,TTi"=+T(/8AROg^5&`-?>2*``l2-XbuFdj%)?L#QYJmFBSc);(tpk0;=NQql-gF;[Tp=mW:ag%BXY38.hjCh<t*q<NTu -%1O47"X(3o,+AqM_RVS]bHOT-p$1ifK\DHKl%1`YL8"P\;YVdE^M)8'Sl@k/gN1([`ra=<=QpM%urMFM7N2\DiPj6Ytji!D-X,h=d -%p@.BtN^EP"BjoI:7aC,d2gAS>b$eS#E7?q?=(4"%[5TD#K@qQdH-s];@Zq!jQUJO4fG\ggFusc,F-Qp#&7Yc;.QT+`,f[os<:nE\ -%j/"l'8+h?.NQJ@^9.Z%/5m0([o"kZ-8O%[.%0teM%:3\rUcq>J:r*d.C[VHKZt],LFM'i,.@'OQe"R%kC+df#jC8i,33,lB6%+aJ -%TM,n=U\a2Yd:s3H1[Qo&W]c*I(X0OKPOupkd@aSs8U8o4>k/r\=s09IpMX]/["9lk7?_>cXq$Zrmh`Z1%WLorCgtLii*$OP"3+*. -%jVWfN)>02A(=".%FB[a2/5Tl?O/;3sR,PH@lW0Khe9/C5M(h_Z#;)o0Si*<PX`Gs2l:EiQ[@s(g)GF4'6.=FdbF@1#&X5[g_U?oE -%0RDJ6dahh+m6l^)I^&iS)]'[0"CoIsn&B_2q5<%shB'NC9Z?O+K\ZdIU^[(SGMGg*>-Q7mH`MdH[(3gIpi3>%CL1bD`$e^<f%(l^ -%B@"?Mg0=I9l`\;+gX!UWmQPGl);a-%4a;!]8)/O([Pn%D>.Z9!Hh$KoBA\`UcGM$EI7U"/Ed[ZOlD'oF%j+!:Xkid@rO'&:Y-"n0 -%?2o@Z=.?4\#L>U/IrmJ^r7g1kO.#ueGmKHa2j<.VFS1\F5O(JadmmX"[NF0D>s3iBlJ%q[s6GF=EUB3?I.6%Uj6tssY'Je8l.p:9 -%nX2!,nitA\nCTRYS*?!n8H636%[I(_B);GO"9%Q*4a;@RRsB+X^3N@9Hj-@t?Tbpjp8QERDEW^"+)H-j05nb'l)M=%J$C`V5;nmS -%qf'/1r!OQQ_;iOfs*jpuFnjA2Iq3;P+79ZaUW"S/I>_+O(O3H<nGBm0nUKPn_[$&lU\0EBHiJ>s/p=u)8o3>?GeX"EYL/Vj&%943 -%RblYGJ$=FucEHsQY'kNUrX['/%mr3A:SFgJ,B._qdb5kZs&_DBpFlPm-i3:-m)=_j=-"sE^Q%:B4)a,F)o)<+5?Q[m\p`6.qBh5Z -%rZ(nm!t@WmlG*kf=)\+KJ\g*a6VX+ElTjd*HNjbJC\[WBeS@DIU#BoO=EscS%+2CErT<VXhr2L-c.7rfhk]8@Vfh]Hl^.XafR2*C -%k3CNMgR"`#dIm@*^](`gs6I/g*aB_urp%n^Dt/=dhVMu&qY%+"3a2VTq.cN&^Hp*F$!LEfrjCDu]K(H9^CMDNMrPnJ5AbW4I<Xl: -%K-rbIgV:I:-9!%54FA'*bK%j<+)\jlreInN?]Tu!UJh-h4.Ejk^?oi_hR)4B:=B%,lh^SRkaUYLIh!N;I=(/AT5SZJE,\`&]jKHn -%6@YT^I6@Aofn97ef(%l5^K`hHj8%l_Xc;\f?gg3s4hdeogZj7B'jFsdANrb(Nt0+jYka[BI%1'E'4q-_mrdAHK?`64[DSJ<&,<u9 -%9fCe:q<dm`rQTGZ^4-)ij#:t-lcG?oMZ`97oRgT7%r7MLY`6%`H50^iDghBCg=lLtV.STCp=e4ZhiFJ/lYaLUI.dC5g5W#6s'#<b -%:A0r]G!!:HLmu*0Itspp&$HMlkX5:>7ec&SUDn,LGdRQG^34X9rT`iqeh5dis)dW`^U_+&-.0'olFgg;B#1l:dA+,8hfO?R]CB9Q -%YkHTXGO'$'IpCl7]CjVp5HSf#p>F9)qYnKo[G,U\pXZ(qo,lT:-u#lA9B432iqQNdVQTpepM9<$97O#hCi?hLIeuO7AImmHCNj*e -%rNUOTfn<d;]6Er2AF8]d^ON]cbtn)jXF8i92qPM+I!'pUqq"JfCCdQX0<[Ndrn"Vphd&8=D=-l"UJ#AeC`IArm52!4XZcXFk)He3 -%=6%>:5ONH5eoi-"O__.pf<<bS3rX2KmIfDgK=1aGh)g:%IXD#C=o77"mVcn@IAq+dmJlffGHLQ7kjmFnlg(+L_a.eFp@`7nh-09m -%07U)5T%+pbrRLiAYI3mPrn[G)j2UWcV5(.?lW:PJ?!Y3oq"iP;c0]GDoo7@as/njf)L'd:Hd^BfXK+SSI(u7:]lni&m[a>qlX+"7 -%r9sKk_dECHh`cFm]Dh;\+6<:Yh]I'oGCKGWg%r&+'=n+:qdY-SebH&/lb>j!U>Il@lg&o0CO>CE4l,bHh8aoVo1E*2]6*]BqU+p, -%0f1]#p+!e`^,ruTl)O[DnC!<Arm-ohG2r$D1%@n_8R3&i0;ZA%kgKM1p[5koDdWG<T1epNIfJc_GIu8?905AQ]m&`:Da2B;0E8\o -%ETrf_2m-H_4Zci^e9Kge?>@7.m9TRPs6uq(k#25up>Mjqe]g%>f:RJ4E;A4im5LAMrpf4AEch&25;0(F=1uf1DgQt>rq_DF[EI>! -%fsT#\M9V%':N$050#+nR\p*u5qOL-CJ%P[.o?3+TQ[ZVqnDoABbA[DB3kftuIT4(fG5(d'DW]*lf2$UngcW=EgD0FhdD$<T2fE$u -%hksPj^9SIols=sZpuC=u-U6CuEFh).Is^:Dp$q>uIrsTIFf"bD-bf07hLD/)3BCjIY-,/No'3WlXWOatYP+!Zb%1J=eN;+1Y?/L+ -%CgP`<>^[=doY]3,YM]&W^:\dXhUVZ(ph9\B,O3@NDqaL.X8Vo[f<666h"^^!e^;\^f/D?l?XK!]rEd6^pW'n\?/,3a+KmqW[bJCe -%r3rlE\b:+-qU)]8NXqae4,ABsH*+RIGjjA]mC1u'1q`PT]s[2!KC&:(3/d61^\;A%^Ad'Lh:L8NBGl*oAUjI>p"t461p=C&5ME[) -%h2:4Xj/jESDd;%32fIL.^A7[rZEs/qNGne5eSdSHli-+foD74mNS!(fs7W%"8Te=lpKb3+!JW9rj(qD2-Kbe)c8hM&qrN;(Q#*Z6 -%_p"Qlc@*9H?77&-\m(`T/]kHRE"DZnN-cGC68Iuh-:iD%da@AHS/n)SmRfuF4@u\=8]![aPaqWEVmW/j4<V'.n>qu4Np!_:GJ%hf -%]^*Ohqn>"ZHlI@-!BTi7IF?-ia>HcMiS3&E?0-Zop[V?s!#_E0D\IN.P03YGrdDg7T9Z7V0L"6=X_s9jN<b.'gQ'hos4a]fpA5jb -%YFc-sGs@oc2Z/ufD""Q++,#.5dE).889s1/cJ'c,'fn@.G)eHd[l?W.8>bfi+SBQhNXR_O,dL#12M&=o&IJ6Uj\[-[Yu(PlRd:1b -%TaMHGf@%>40LmU3/G;Q3bJctJU1RW)EGDGFktBEYf&op5*L-m;h#YB[,N[&L1)Q=$#I%m\]tdN51l'WT%$$<$EKBLM`B*EH/pSFt -%^3fD&?JaTXZ.Hj^*[H;4VA0;"Ao7!i>H7#qRWK&GOW)`*+sWn?/o0X+<H]E/h\lY4O<F]Bd7ZqRN0?rE]Ph?0A&",SQMjLK$2^.] -%Y!!SYD(om-651G>/PpCbA,dOFN]mt@HTXWb%Ut&9XU'Ib>qK.SoP!:=cptP+A3:qZc*6Vm!b]#20@OIs0mq5>:4!LmT"rGp=(h^] -%alFV4&HsrBNeR)@AVOEo[K;5jpbYo["_[eLQK1Jf*DGk9o7IW^aKo]J66YI8$Gok,&Sb#VLX<=FPlR5V4gWgs8MQol-0b@JY"IMd -%Gg]-tLG)$%&OB\\.`.%CAYcgQV]s%:LHBOH[0KQY]Hp$WSr#Ot+"kR\IbgTP*mt`7o-H/i=B$2]A,2'2($i>Mcidg5jhVi/qo*\? -%Q9TNPKgW9c+"BH'IQ@m?/l5(A31_;M\VeR=jX/aTJ[b?aCRuAdQFo=oc2#Al1#l@(_hIS$=g%t:FPR:l"*tT+6Gb&h:1Gq",9hCD -%+nBk9-<;acZoB!NlB8i+SOcEtJ!SLd"Hg9T"YUl#\V_AG`g3nAoXO#:LR"3mSo%,GDlh5V33ZeUr,c4C7YT#G@1BcB$-F@V,uX.n -%,a7FQ`js%8lTQUl2BsQFib=s"0'$,Tle0K\^1o!\ina$&Wn&&GW>1m^V;538T8lW_hK5U*kb]0hBe89oFO$:f]3!=CVaD4&cfHJ= -%$D(GSBHN"*9P5mE]I1=iG?-^_B!(6*90pd%CJ-e!'#N54Q^KMt4=tdJ%Eb!_D^-?%!QceLK%*0X6Kdb$.id[DHP'TnD8fKPj'(eV -%HC'f&41gf1b5SMB?sO7-VDRnmm]n?>7*BRZ`K]])5eObSf@#r"e6/gt!p*:U=)]7]f!c0.2->i.Wl:(#:n:s*URGh#\(-.,-<+b^ -%\5M]n%Bo(s08e;$Mcd,GF3:P<>H!X69S8t`C5mD`n^]\E@WIZ-G#uq?f+i2Kf=>nE40ULmWEU=L\fEoc[LSY1G%d"t\#[6i^:fff -%fa]o%HTE$RhWmj]UY(>`3jsKnNb/+J@s!NLX^/jOaE5>qd&:/!<O1G/Fi3jm+`6N[XR0//a`qQKUfN]V.2U"ra3B<^i$MCSJ[iVK -%K3m^r*njPfO("QZ2hl1P=;bFD`R6/>/f$tM8\I)EGt-n80Rp&(1?6Lpl\tS+e8RbOk,V'fN1MBNHH//pdjR(*7bbe%,DOAt,'b0S -%$B=1j[[qKWSA:!2]MNVAkNh`r\faVWn=gcPeeahKl*M^#gu2hD(@!Gpq(,35=*/GP>#dc!gXT`(MQU+FB!SR44L75T%`;"//d429 -%.lQ4t27KhB(TD5[4^:SIhHfLF:4C5IG2iQ@h>8&MZ;2j)`dTY"71M:\YT8Udrnt$T>18#G0fXtda$sh=G-Vb%oY_p/qPipl&ne[` -%`r8cXW8(`Z[ZYr?qF@S3Y"i`<\Z1!eqif"k?I0d4(qj)bJSZ&IV-gbAG8'aJq`"BRE:EtGl6e-ta%JbOqf.O4Q9+Fb<):ELiHLA5 -%"7"8l_:YjeJcQV[q)%)TYhHmY]Cc\Z:kn.+@lgVCVgmUUFfUGbH"n4gVO#D7C:W^7=jGJ(I%:4Qq0OjP=jBCE4CT2r/5VgRD*@Zk -%;q3(HB6[AP<!K"j+8&&R[Bk`-r1:<F%uC8=?S.$BkdoYSi%#-W(!),aF:MYk^"d?#/1*aT=TDkN_%)F]EnNfJj/HUhT%=la2FFV( -%5OdShd*ZGcerHApYN#ds344t"h/`[d7eoLaf[1FQ]q6/N/^KaKD@PKGMgSsLGH1_2a/A%XGPgqA.P.(__S4L.G['_#:Z!a`hkA6B -%Gn072rg4/Rl+"WL^oQA\j4lqY_tc-#*%L^n[!GnnboFLP4tqlr./!,kof)Ase*nFcW)%c72RD1%llU`1X`>E_Io,jN9,X2FICYlB -%Im^4C(C_GrH[co&J=EJFUt+@nbgJXWgXE3lSile)!8u89iFQ1u>dpKaE4NMPq0,1<NGTGpfY1b_GGg).2A>Jr!E=RAiIS*aje`5^ -%;;Fs!]G:1Vc2TN<oX44(T5db(q^q<4^\=XKp31-tmNc_SBE%)'LDik&!!Kah+3\Mt*Y0LlSrWNK%=Es0_tgGgp;!=!X^U(E-XUaG -%hRhkB]=m/m.CeWfO7qIK-U(4UY?d7d,1uh[_4s6IX+#(4E*k\BRX[;ioDK5,qnq`jg"4X7o@`B[?%7)Mr/XMr2$%diEjdgMO8P-@ -%r-YAfPgo*ZM0o0=?Ysht(=jiP,Ca3pA+eq[?YJ]Y#c-jYo&J2J1q[@Ss%H5OInN>P`;'9rT02,^8:R@9po):%E_F`.(h7I1WSJDe -%<R66Y#IaF(l'=!hs#6!iHp<mr&pg!>s%F6Gmg`TP1"AE*lkcQ#If>ktGE`Q3rAm"=e;!sYnD3(ul*[U(io9I#4k-q<I-CSLrI4LR -%bNi(ZhoXfSA,4Ch*_[MP[/a0apnD)6ra_diN#/!)Dkmtn%hG/D1uU"\"n%W-/jf0#26Bu/Y'4kG7*]teQBZ)fLoVh23AMYuI_=jR -%drik_17ek70Trf:kZM(\F!#/[_EGiT7=9kHGL#+I5_]YZXf"6[qBF.IV(<E+V\O1hNK#4eH(TS\Q(>8^5t4`l+f:g?8?8mY[f&C= -%]?d)E<9:FT`b=+,O[sgd=Dcn6J;c<Pe"`8^ljPsclD;c2?PS_"f2U"6Te7-a.pXcL7^cXFkI<"E`+0(nW:Egj5W-ukgL/sR>;J)L -%()Lu,['9jm%%P`_b9"2br4SdI!_f6*hRp<&=3`&G]<_kDi6'>Hr3i096ut>u!]',bjW2NSWoOd/A3V'm*JDlljF%-?Bie6Ol.$HJ -%Veq@]GW]6KX//mhAJZ8!$k3W5e'^Dc/UQ`=Y]7V=r?q'SQ-WL$7lUK-(JZXAAhP1-G<(+2Ic#IH\T!)PIRKM5)i,Y27lcm`k;n\E -%o0-_("?Hi@`P<$5)9YHSIc",W0ZC.PL/umAM5c<5+o>@Kme]ST%W.+YikFT8e0gdu5-f<2]Wn"0$n4YmCeu](\j;[+:fK/XmABh@ -%"0GA).+YffUqe\D<34sM$'M"@NLl"r"T`/\d9DK-s*/$GjE;8Pa;GFnoZ71E)rAG1^k/&S2\qU*\.kQ*Dho=Z89hG_pJc"p*!:Ql -%J\%$G:dS>uTkgl_\Y<X@2'pd2asor1<SVPcQ_`C.C<TbUPujCX1.QULI('LUW)dAcNb48(LdFt-<L-/CfF?*aQ7gjjp,.E0kt,+I -%A)=d^2YhqKXVuV-\Y92bg"%lZ`0gi415lYZVEENN"G<!"2T$?:Sr=l(-Q,W>G?J]6!);Bl5YBmXI<a7r'Vg:J/mQ*&n^[9nqK[$U -%_DOpEY)MMbH:Ls9*`N^07]P7839KuY&slGVK-O>WL^YJb"Dl$:o*TiQpT1PgiL6$Y=,(<Nn\t=(apF*J/?3eM_=uEGC,Zan+ZrS+ -%ZOF^GO_PhZgNsNlP=LJVf.oEf>g@t+>gVT?m*-`3@B[HW>'i-Z<9+?B<"=0)ed2OnF,TXDHtL7U>+'$WGiMp;`T3oqJG^uBqgB^_ -%Q!2i51a<&WHo3kQJm]7%,pD#H^Z&;u28LSBbR?IlN2(WLb^DCA92T[F2do.Lg:0)-(r5lM)FFVe)UB+#U)8IT([>c%6*OnUVc&c] -%K7cZr>p`caZ`EQjlCqtt3&4e\_*Re^o=3fP1EF1l>J,T+?)Kr7Z\r&OFMhT91uNSmcpFI3D^Oob*Djh!X+\@7UJ2To#L\E52#*ML -%I"$`io&XV!'3oDP&N.-;o)^1I!:80J6s.&29-ob:>c(?T/pi=bZ%0C('Y6#@FHp.ZA&F[ZT'eptG$UIq?uT<F":uPt_l<59`:'sj -%'!U]!_cI%VnTL8\#@&N'+ol.M#Orr&'X7;=cW@8Ld^Z=Z_jCX3[bPR:Eb['[4)1E'M&4)N;kD6>fVhm3$)c<+6dlgUKUClZ<=DSL -%YUDOQL#SKG--#VdR*c"t0gO9$pfDuc;,hnBJ*BQ@0>Y7tXo"Z@#hoIk)^"T#%-<huGe\Zg+\5!)L4A/oS^*l.U%/C3N=7*-LkF10 -%O6JgE.L9R_W:H_pQrc;!)l[ePg6a$f9JMs9_R?\+boie@Ga?dKl"@$]?QEM8:.F]TFp^S:FWbZkROYtmTI.b94C$<g:f0Z]PDME$ -%&":;/[U/1lhb_=V-LPEO:/G7$EciM)W#d5t<QA\K<O(ea'/,a2?B6H,HaRN\X&h>SNU#P2br4KJn<J9HBc@UCX,kH.Q^@8@Da8sS -%/?c!1>h+Jp&r@O%L;8LEEd_t2?&$ard%3_,MC%nN,Q>cEW0>e+qh_<[Cj7$YBL?>AWf7n9X2754n1S#nXKu$Y_h_p)lA^-);"=Oq -%\A's@<U-S,<QoY[HPI"?_<F/[B?$mL7JEW_kZ#)Ddm;2`:p2\j^k&HN_k6X4:?^Z;oup1ihPX@M#L%/Yr5%qc0RM*Oaro:C.96r\ -%V_pH@i&q23gHe"JXgs1g2A_^n4suEC8#J8SR;r`$;Z+,]1$9b;L0F#\C@/:c;-B1HIWo&?$&^8,LGA$Ve75G:X1u8KEH*S>V+g#" -%R"lsZVgNb;'t?m)2#=&?=578GA@uYk&^$l<I`+HIp<RpbDse)`<9jd7m&L<ng5#Q"V'RIIk0ha(-]O?`9q]p9er\-.48T:!9\#[o -%ZN0YK/:cE5ZCbiFgF!+u&p3a6"1dt-%iL!+'ZfC8p4#uQr1J(-'<(r8GkjYeE_cp_6hS@5Bnc4IL"olO'hiS!S<>foe/[dYg=/e( -%C5-M[b!>Y"Y4,9Rm<cg;r/`Z8r=16c7m`'uG_D6THVm^Q(c@ZsU,&&bWqFEr$mMNKbg;Fk/3KTpDCXRg8Z'5D<r#'6"3_grWFhn0 -%-XYCDRRgpFmEtkT+`-@f8$*4#)5B=hbj)PX-.\)*n?Z!q/q8hrQ1'kq]T$%E)^b0;GdCc,0Tl*6YY">L%HdoNk=9>nNYcZ;An>oB -%Ct1<Fnlh6l=WG63CR_j/Y_E.urVkUU\d0-,!i(:Mc?V^L;Oil\UP*%2ckFuTe8!dcD&s-\[Mop\.fE18dt/3p57ehCU\),=Rj.=( -%col@R]+&NKjg,1Q6"ZW]$`,$PArkM$Iq/0*Eq#oQV%-/hqi/UQ\;>M"7%*^j<(+%tA<SthVPbfiGP?KZrdRW\OO5XYiD-:>N==ne -%EKrj-NJ@bC!#3fu/#H"]$O7h(OB2J%I'p<R5nBM-c\=6)rC3&7,"l7CemokHH:oV#O5!0Vd+&+"ODhE,doBOJqJPU#Ng8NHUY_#H -%Pe>;g_HU/pfoTL=k&-(,T9_O$IOT^9$uVC)fl!m39EWg.q#T6rg_cr7V`H-(CGrs!AAVHHr8*E-S3T";e`)$)0$d0o?%29eb%OsB -%MGGXMYSpod>I&k&r9hQ-889n!'dSG9Xfs!Ggo]Rica9p5VTWX"5ER9seos&=f,H.$j/=4MD;+(3hcjTH[U>c1[PadYBKC*-Dk]i> -%"2Y6k@fU4SVrf1RN(,U1$[1W\cd;d[c`Pu"kdg=7CnY&TLr$IS!JJ:di#FS?7tLC)0saa;G=O7TDc:n(%ML7fOZQM`kAq)sM%K5W -%mM/3>OKjIIm$YEGYo!As8JbS4Ts,-Ynq.m0_T#%(25c\m/is,7D^'SN;k3I@WYZEl#tL`5#]"6s1++d0";;58WD;"H1Q\mL!b-;J -%nr!BReS238I@IPhc%*lg:!i<ldOr"%9mM[GTV`NH`u8%aq\GdV.uP3C8MI94ca).iccku$eCUBIoXML2Em[HkJXYb&qN=k$d%I?f -%id\K4DFIKp7-'(iT5rJ)h:ua'$SC7/3KWS&GXZ?n4g,(a!(XlsW8[0YoC3i#h8A<oiPH7!GhR5BeTJ>tINDh<^3pq&@?SM&$DhhX -%gPb58_QEH<o?!;7B/$gU(0Z"tVjduI0@o/Z#'/Jq3*A<cV*:2rVR`HND7lQ/&Kp$:r2,LcJ+>o:#]S9%9h1IY1*US@P`[*G'\Tfq -%V-.B6(RK&`$J7:?i-2HUrfnY+\q.:kfT-PZDAL%_6:fC@@GtThbAY$^>hmHI?=ANLGc!RE9/C`&OPA6Bo1>bElL\Bd\Nm@;mhZ-< -%'\]>(kZO/HpVUA\YSBs%9I1INM-!`pY'IS#1Mg4=-i;>nFG?!d(,^"-->eX]GNXk)c-&\*'MIt4@*QFjiB8]o?;1loLibAV"6-WR -%N=.V@F"V\sp!on_(M#eUk>CmUCoOr>kub@kmh&2<Z,pjr0d`$9o?FN\DX#k!5h)%EE/D=4Ch2YglEfd+KKM`%Y7aa)psmF#9US!; -%WR>_-::tH"k^Im>eIks9K)+n%"n.qr@bMdV`B>Nl&kNkA;R1L19>6N48)/8X%9R0,-u98GlEem&hS=6ADQ=(C(it8$7limF<t.^, -%l3Ysmk\P$T`RMF[82q<!L-+(7(MU<B+YW2J"nUs5%6''2ME$M-L)\t7)ji?6E;<O-]bGg7[7#"L]oWj]`t[ST/?Q&0NpH)=N]4&L -%;Nh;95X/Y`BM-`E%i,dZY>HP0gI-_8jUP1dE!%@YM%sC5"9MQ_nMM,>*Gf>c]OsamC(`3,&j?-GFK@sS4QXnR@*$,iOAV]N<dP0[ -%I5sm4.G:7SVKRKs+*#&Wf/q;XEXL/\X2sc*RHk595l-o,=#aG-WC#dAS<j4sCXm.tOiopjs%PFZ3Inh]O'[>u=*Hcaa-@8kXT9o4 -%>:3&&P)&'<fXHWm*j&RDU;_!!mDjRriJj_hBp4(_1t36u$tiWlNSB19%<j-9cP;1pEl^J'SFj(Tf.(f42_&W%LVZo[DmD4K<'HI8 -%B]S!>hqq8Yg'rKeSAIDu)r0dGq=6^rOaMlCjISW=Y<(DKo8QA^.?EBM/uWln-UeN2PKt,f0j2f%j`GaUFZMg2^S6]%ks\X7"7]Sb -%</![ph]s-!L?pM)H[uTPrpScS3T,r94!:XJY=JaN3qW[nfdL`ZK)U_2o!JQd?Ts?mR2r4>N&PotZUUU@TbEG9l70>KY_'t%QF9WN -%QL!D$Pl<!pK7HO332S^&q-`30JK*j&`Kg/K7BEp\LSl<Y(6#ik2Ns.A[q^5g7d0VlqA;8sHuO1pRq;p`r3f89,Y/"2BR"]kSt6&S -%hBN1t4nLmLeT0Rt`t;f3+;q@2$9&40?Fa)a^GfY+Xc-7O^a^K4CoDo;,UJVc5=Fkk4ciNX<$#E(qUu%b+B>50N"!p+];\&u-PO't -%ldg\^>YL$5cK#G#?uK;G7.d9K-M"&&4$RqAH($L1b$;G\!uWOdntNY_3!M[`]`usTm(erH<9#,I&"DA-h0bDAB`_DO9fTeCY4k9` -%`AUZ^?[$JBY$r'>d[[&h,/3B`P)^PG1+8>K7jXmgDap_H.QpJ]_p^37SSpAUdHQX2baYCL7KAs#7A_in7pr?GYkS(8MJ-ZY)-93# -%cr1W:I]SuO[[T@ORu:[Us(NVOhWUsJ]%;Z4oX.jbq00P&W@GfeE)cd0i9_-BJA2,l?ZYbLdJU)d\He?^I&kPMVK3[eGj?KUm9P8O -%>7M5(8lt'@c-dMX[Dl/TnZckIPm)ft2BJ/ETqho&0P;EQ1QP#r#Lc#>.PKaD;O'Af^c:=hAHY3\90msN,ohp0[<eG:Q1XMP\tsj2 -%aK^CQ?cXMO^?`E8-%S;M<-eXf`O$:"2YQY!?7@##*/_u.QZB:?W.EU]DnUZCd'Z2QFUL*1jl9"pMYe%Cb@B7##s#JAam;nOY?J.p -%04U>6/s'#gJQ:IZZG.-E$Y4nZRnR5Co?I*2FS=)%bV1(A'sn?J?P2XeTT6tnpM[pDcoNY!QS"]KgiPr!q%)V\m8l9'P.9EsIOVZ: -%)c(/JMO-MCMCTnSTl,a)hqfW1LD=o7NtG#eUJgZ].T8g(Hm%7"a[C0DY&rP;;qe=ar1[6?"?Lg5T*`WW_90geimshZE-60a'H^6, -%3^X>\n&YC>E2o!Ne"LAj"@b1IDRguG\6I`ZUMtc$k'q86iPW=R:PWcB+.ZT0fY1G4H!0'R?6A[5l<,1KOoSM,H*FV4\RT:8%9Q1( -%hNDhP+6i=G`V9MFI!f6O]cUAalE`-Vo:odk$WWd*^("GRE^*pP4MEr!N668=dq(XUU`JNKDfFNJE6g132PYM:1_u\>I!Tr-!If%] -%LX3HC5+T=@XZ,DNEZUibVrK]`@rH>HrUnY:Pu>6%"b(+WM`9`sLB!_)Y+*W*YaP&XD]1CGk(rle$['0KaDWu%.6Jb62*Ua'=U)*( -%]R=2^l%?/LprQVddpJu5lDeKsJ,P((Y_R/11TUb/N>m>=(q!2E2*:[-QV3%@?uAV\Vs4BRp?H-n[?LgdUI"VTZmJ8L&&;uW)nmJj -%IJCop*r\"rrq4kXo"cF+hh(B<HAsZSJRaZs*.H<6+8@JuY#_4_D[V;'EgBH:[7l%#S)n",WF&?I^2p]9T\<sX_j\9p2m2f-ZX844 -%^)YhpSus%c6Qsfu)=HW+o@H*5HPZBXAMH;@6_WR[2q^l#-M.6hk1&g+_p*5mKN"c`$AnZ/DL-nql%DCAoAa:5@EZR1np33es,7/2 -%5:^XJ1=[%_o&]0_^Z>Y!0e[,55$i3gEQ!@\n)s>e@n6PnC-V0"VM>&3"L3H?[m-X.+3FIq^aJ'iD@,4\=Lo"$43Ba@[qF4[gV&(i -%os[Eq0c'YDM^a#rXnbo2f'eU*nbBiGQS?)7cM%Y(ad\4+dr9[5iq?l\@kB=BV:j3udc2":XbS%okB:9%WJ;P[s/uOoF2S#T>l&@] -%qJRMQD]nn+&Vr-&O6uX&$dN.=(6Pb7+pLt!"LO:BBgE?"U03Y1(F0`+=`D1g(lQ9>$ti.nc%!G]dPUT^VI=5p_CursJg;4ei=84h -%#/MaC0t/*'IcLDp,JZ)>SW+t^^_);hBo<:+O9m*J7H##AY5T70A6B<LKqM/BClgo$(8\Ab!'j[hL-eEHK2=ifF;e^A,3TC7JN*q^ -%$EsY1#T*so"H!5K!!,EL+D!Ggi@';Q!$9QG=t'[JV*X#9KjVTopFr%Dh`GSJ<G0+N1So0Xf=;,KlU17/_peqZf7dWih'HlT\][th -%[97!8RN8HnZU`:"-1F88-k[eE)U_+f1.Z-%V_Jr1E2Yr]LbK7q$6r(K_+4W("JZ!60uOO3rYOLi.1uqbFO8N0^i;0?#o,b4#Y$VG -%M'e;e6(tdHJZ7)u_,.oSKorn!I)gr7"GYho93D[\(kL*@6/g%9d/&6*OTt\03.7.u5*JACdNTB^RD2gDdjc#1'e<$Ff>R+bgHIN( -%6kI0h'U3P4Q/B*$j'M`r[7t-:")Q-8$j$DqOA+#[cd[-E';J":@3F$;C*`JeWX%j[),S<aF<&UOea/1peqoP8O:D7W0SY;p?uQJJ -%6kHpW8O?\c/\7)>=U]Nb9k'us4$I^Y&-L4r=<K)J,,!S='>T\7jM<MUMa9N,gB\f&<A@;hN<0ih5uNC>5!XW1J[#2+We(6r-kTu@ -%,gHJ/U+keP/Aa0DlC9=H_8'):--2a4"l^c#!(]@,#Y+T7W1kaC$jSBi\req+JiK`t!<^?e@a'gS@(JV`\j^@$U^;p,CqPI%UC#)$ -%,_-7hHoO]-RT+8f#k`l2#RW1`Q3`FK-%QXZH4QGi#TbhP*X.oV#uV]b94IrF`Lt!o86-snTK#QDh,R8iB5_5]EsZe.Lm(_2O9-[^ -%0\TUgeg07SWHGhE?tY2J)MbtpW2gJYogp>%ifiYA\D4kGO84(rYGjs=YQ+)IKs+j<T;t(]p8=nO]\*5n>@8hlK>SiKP[Aq=0>'&n2Z~> -%AI9_PrivateDataEnd diff --git a/nixos/modules/services/remEYEnder/vecteezy_eyes-line-icon-vector-isolated_13932670.jpg b/nixos/modules/services/remEYEnder/vecteezy_eyes-line-icon-vector-isolated_13932670.jpg deleted file mode 100644 index 9673ea3..0000000 Binary files a/nixos/modules/services/remEYEnder/vecteezy_eyes-line-icon-vector-isolated_13932670.jpg and /dev/null differ diff --git a/nixos/modules/services/tailscale/default.nix b/nixos/modules/services/tailscale/default.nix deleted file mode 100644 index 48eceb7..0000000 --- a/nixos/modules/services/tailscale/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ config, lib, pkgs, pkgs-unstable, ... }: - -let - cfg = config.sisyphus.services.tailscale; -in { - options.sisyphus.services.tailscale.enable = lib.mkEnableOption "Tailscale"; - - config = lib.mkIf cfg.enable { - services.tailscale = { - enable = true; - package = pkgs-unstable.tailscale; - useRoutingFeatures = "client"; - }; - }; -} diff --git a/nixos/modules/shells/default.nix b/nixos/modules/shells/default.nix new file mode 100644 index 0000000..87b90be --- /dev/null +++ b/nixos/modules/shells/default.nix @@ -0,0 +1,5 @@ +{ + imports = [ + ./zsh + ]; +} diff --git a/nixos/modules/shells/zsh/default.nix b/nixos/modules/shells/zsh/default.nix new file mode 100644 index 0000000..0d84ea8 --- /dev/null +++ b/nixos/modules/shells/zsh/default.nix @@ -0,0 +1,70 @@ +{ config, lib, pkgs, ... }: + +{ + programs.zsh.enable = true; + users.users.tdpeuter.shell = pkgs.zsh; + + home-manager.users.tdpeuter = { pkgs, ... }: { + home = { + packages = with pkgs; [ + font-awesome + ]; + + file = { + ".oh-my-zsh".source = ../../../../stow/zsh/.oh-my-zsh; + }; + }; + + programs.zsh = { + enable = true; + enableAutosuggestions = true; + enableSyntaxHighlighting = true; + history = { + expireDuplicatesFirst = true; + extended = true; + }; + initExtra = '' + eval "$(direnv hook zsh)" + ''; + oh-my-zsh = { + enable = true; + custom = "$HOME/.oh-my-zsh"; + plugins = [ + "dirhistory" + "git" + "screen" + ]; + theme = "mrfortem"; + }; + plugins = [ + { + name = "cmdtime"; + src = pkgs.fetchFromGitHub { + owner = "tom-auger"; + repo = "cmdtime"; + rev = "ffc72641dcfa0ee6666ceb1dc712b61be30a1e8b"; + hash = "sha256-v6wCfNoPXDD3sS6yUYE6lre8Ir1yJcLGoAW3O8sUOCg="; + }; + } + ]; + shellAliases = { + cp = "cp -i"; # Confirm before overwriting something + df = "df -h"; + free = "free -m"; + ll = "ls -la"; + np = "nano -w PKGBUILD"; + more = "less"; + hgrep = "history | grep"; + + gs = "git status"; + + update = '' + pushd ~/projects/sisyphus/nixos + nix flake update + sudo nixos-rebuild switch --flake .# --show-trace + popd + ''; + }; + }; + }; +} diff --git a/nixos/modules/utils/default.nix b/nixos/modules/utils/default.nix new file mode 100644 index 0000000..50b298a --- /dev/null +++ b/nixos/modules/utils/default.nix @@ -0,0 +1,43 @@ +{ + imports = [ + ./mpv + ./vifm + ./vim + ./zellij + ]; + + home-manager.users.tdpeuter = { pkgs, ... }: { + home.packages = with pkgs; [ + direnv + duf + git-crypt + lynx + nsxiv + w3m + wget + zenith-nvidia + ]; + + programs = { + direnv = { + enable = true; + nix-direnv.enable = true; + }; + + git = { + enable = true; + userName = "tdpeuter"; + userEmail = "tibo.depeuter@gmail.com"; + extraConfig = { + core.editor = "vim"; + }; + includes = [ + { + path = "~/.gitconfig-ugent"; + condition = "gitdir:~/Nextcloud/Documenten/UGent"; + } + ]; + }; + }; + }; +} diff --git a/nixos/modules/utils/mpv/default.nix b/nixos/modules/utils/mpv/default.nix new file mode 100644 index 0000000..098e7d5 --- /dev/null +++ b/nixos/modules/utils/mpv/default.nix @@ -0,0 +1,11 @@ +{ config, system, lib, pkgs-unstable, ... }: + +{ + home-manager.users.tdpeuter.home = { + packages = with pkgs-unstable; [ + mpv + ]; + + file.".config/mpv".source = ../../../../stow/mpv/.config/mpv; + }; +} diff --git a/nixos/modules/utils/ssh/default.nix b/nixos/modules/utils/ssh/default.nix new file mode 100644 index 0000000..07b2810 --- /dev/null +++ b/nixos/modules/utils/ssh/default.nix @@ -0,0 +1,8 @@ +{ config, lib, pkgs, ... }: + +{ + services.openssh = { + enable = true; + passwordAuthentication = false; + }; +} diff --git a/nixos/modules/utils/vifm/default.nix b/nixos/modules/utils/vifm/default.nix new file mode 100644 index 0000000..61e1da7 --- /dev/null +++ b/nixos/modules/utils/vifm/default.nix @@ -0,0 +1,22 @@ +{ config, lib, pkgs, ... }: + +{ + + home-manager.users.tdpeuter.home = { + packages = with pkgs; [ + vifm + + chafa # Terminal image previewer + glow # Terminal Markdown renderer + + font-awesome_5 + ]; + + # Put files separately so history still works + file = { + ".config/vifm/colors".source = ../../../../stow/vifm/.config/vifm/colors; + ".config/vifm/scripts".source = ../../../../stow/vifm/.config/vifm/scripts; + ".config/vifm/vifmrc".source = ../../../../stow/vifm/.config/vifm/vifmrc; + }; + }; +} diff --git a/nixos/modules/utils/vim/default.nix b/nixos/modules/utils/vim/default.nix new file mode 100644 index 0000000..338a356 --- /dev/null +++ b/nixos/modules/utils/vim/default.nix @@ -0,0 +1,76 @@ +{ inputs, lib, config, pkgs, ... }: + +{ + home-manager.users.tdpeuter = { pkgs, ... }: { + home.file = { + ".vim".source = ../../../../stow/vim/.vim; + }; + + programs.vim = { + enable = true; + extraConfig = '' + colorscheme catppuccin_mocha_mod + + " Tags + " pacman -S ctags + command! MakeTags !ctags -R . & + " Move to defintion using ^] + " Move to ambigious using g^] + " Move back using ^t + + filetype on + filetype indent on + filetype plugin on + + " File browsing + let g:netrw_browse_split=4 " open in the previous window + let g:netrw_altv=1 " split new windows to the right + let g:netrw_liststyle=3 " treeview + + set autoindent + set conceallevel=2 + set incsearch + set linebreak + set nocompatible + set path+=** + set scrolloff=3 + set showcmd + set showmatch + set smartindent + set smarttab + set title + set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx + set wildmenu + + syntax enable + + if $TERM == 'alacritty' + set ttymouse=sgr " Alacritty specific + endif + if has("autocmd") + au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif + " https://stackoverflow.com/a/37558470/19044747 + augroup remember_folds + autocmd! + autocmd BufWinLeave * silent! mkview + autocmd BufWinEnter * silent! loadview + augroup END + endif + ''; + plugins = with pkgs.vimPlugins; [ + ale + catppuccin-vim + statix + vifm-vim + ]; + settings = { + expandtab = true; + mouse = "a"; + number = true; + relativenumber = true; + shiftwidth = 4; + tabstop = 4; + }; + }; + }; +} diff --git a/nixos/modules/utils/zellij/default.nix b/nixos/modules/utils/zellij/default.nix new file mode 100644 index 0000000..b84eb71 --- /dev/null +++ b/nixos/modules/utils/zellij/default.nix @@ -0,0 +1,16 @@ +{ config, pkgs, lib, ... }: + +{ + home-manager.users.tdpeuter.home = { + packages = with pkgs; [ + zellij + ]; + + file.".config/zellij".source = ../../../../stow/zellij/.config/zellij; + }; + + fonts.fonts = with pkgs; [ + noto-fonts + noto-fonts-cjk + ]; +} diff --git a/nixos/modules/virtualisation/default.nix b/nixos/modules/virtualisation/default.nix deleted file mode 100644 index 5de3dce..0000000 --- a/nixos/modules/virtualisation/default.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ - imports = [ - ./docker - ./qemu - ./virtualbox - ]; -} diff --git a/nixos/modules/virtualisation/docker/default.nix b/nixos/modules/virtualisation/docker/default.nix deleted file mode 100644 index b48ae5e..0000000 --- a/nixos/modules/virtualisation/docker/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.virtualisation.docker; -in { - options.sisyphus.virtualisation.docker.enable = lib.mkEnableOption "Docker"; - - config = lib.mkIf cfg.enable { - virtualisation.docker = { - enable = true; - # Because these are made for development purposes and not for servers - enableOnBoot = false; - - daemon.settings.features.cdi = true; - }; - - # Updated version of deprecated enableNvidia. - hardware.nvidia-container-toolkit.enable = true; - - sisyphus.users.wantedGroups = [ - "docker" - ]; - }; -} diff --git a/nixos/modules/virtualisation/qemu/default.nix b/nixos/modules/virtualisation/qemu/default.nix deleted file mode 100644 index 220e027..0000000 --- a/nixos/modules/virtualisation/qemu/default.nix +++ /dev/null @@ -1,15 +0,0 @@ -{ config, lib, pkgs, ... }: - -let - cfg = config.sisyphus.virtualisation.qemu; -in { - options.sisyphus.virtualisation.qemu.enable = lib.mkEnableOption "QEMU"; - - config = lib.mkIf cfg.enable { - environment.systemPackages = with pkgs; [ - qemu - ]; - - virtualisation.libvirtd.qemu.runAsRoot = false; - }; -} diff --git a/nixos/modules/virtualisation/virtualbox/default.nix b/nixos/modules/virtualisation/virtualbox/default.nix deleted file mode 100644 index 3124493..0000000 --- a/nixos/modules/virtualisation/virtualbox/default.nix +++ /dev/null @@ -1,30 +0,0 @@ -{ config, lib, pkgs-unstable, ... }: - -let - cfg = config.sisyphus.virtualisation.virtualbox; -in { - options.sisyphus.virtualisation.virtualbox.enable = lib.mkEnableOption "VirtualBox"; - - config = lib.mkIf cfg.enable { - virtualisation.virtualbox.host = { - enable = true; - enableExtensionPack = true; - enableHardening = true; - package = pkgs-unstable.virtualbox; - }; - - - # https://www.virtualbox.org/ticket/22248#comment:1 - # and - # https://github.com/NixOS/nixpkgs/pull/444438 - boot.kernelParams = [ "kvm.enable_virt_at_load=0" ]; - - # Define the group - users.groups.vboxusers = {}; - - sisyphus.users.wantedGroups = [ - config.users.groups.vboxusers.name # The group we defined earlier - config.users.groups.dialout.name # Serial Port - ]; - }; -} diff --git a/nixos/overlays/cmdtime/default.nix b/nixos/overlays/cmdtime/default.nix deleted file mode 100644 index 6ff497f..0000000 --- a/nixos/overlays/cmdtime/default.nix +++ /dev/null @@ -1,17 +0,0 @@ -final: prev: { - cmdtime = final.stdenv.mkDerivation { - name = "cmdtime"; - version = "v0.0.0"; - src = final.fetchFromGitHub { - owner = "tom-auger"; - repo = "cmdtime"; - rev = "ffc72641dcfa0ee6666ceb1dc712b61be30a1e8b"; - hash = "sha256-v6wCfNoPXDD3sS6yUYE6lre8Ir1yJcLGoAW3O8sUOCg="; - }; - - installPhase = '' - mkdir -p $out/share/cmdtime - cp $src/cmdtime.plugin.zsh $out/share/cmdtime/cmdtime.plugin.zsh - ''; - }; -} diff --git a/nixos/overlays/default.nix b/nixos/overlays/default.nix deleted file mode 100644 index 545008f..0000000 --- a/nixos/overlays/default.nix +++ /dev/null @@ -1,12 +0,0 @@ -# The following is taken from: https://nixos-and-flakes.thiscute.world/nixpkgs/overlays - -# import all nix files in the current folder, and execute them with args as parameters -# The return value is a list of all execution results, which is the list of overlays - -args: -# execute and import all overlay files in the current directory with the given args -builtins.map - (f: (import (./. + "/${f}") args)) # execute and import the overlay file - (builtins.filter # find all overlay files in the current directory - (f: f != "default.nix") - (builtins.attrNames (builtins.readDir ./.))) diff --git a/nixos/overlays/icosystem/default.nix b/nixos/overlays/icosystem/default.nix deleted file mode 100644 index 0249251..0000000 --- a/nixos/overlays/icosystem/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -final: prev: { - icosystem = final.stdenv.mkDerivation { - name = "icosystem"; - version = "v1.0.0"; - src = final.fetchFromGitea { - domain = "git.depeuter.dev"; - owner = "tdpeuter"; - repo = "icosystem"; - rev = "ca565dc36d"; - hash = "sha256-GJu0APTkrsFH981Y1RBedOnvVJ5Z79w2WPcLkrc8CH0="; - }; - - installPhase = '' - mkdir -p $out/share/icons - cp -R $src $out/share/icons/icosystem - ''; - }; -} diff --git a/nixos/overlays/letter/default.nix b/nixos/overlays/letter/default.nix deleted file mode 100644 index d494bf4..0000000 --- a/nixos/overlays/letter/default.nix +++ /dev/null @@ -1,18 +0,0 @@ -final: prev: { - letter = final.stdenv.mkDerivation { - name = "letter"; - version = "v1.0.0"; - src = final.fetchFromGitea { - domain = "git.depeuter.dev"; - owner = "tdpeuter"; - repo = "letter"; - rev = "v1.0.0"; - hash = "sha256-2HaXZMIYSauqj9Cy7rRzYGyuYLno9AHAXpWsyD+BdtE="; - }; - - installPhase = '' - mkdir -p $out/share/fonts - cp -R $src/ttf $out/share/fonts/letter - ''; - }; -} diff --git a/nixos/overlays/spotify/default.nix b/nixos/overlays/spotify/default.nix deleted file mode 100644 index 84be4da..0000000 --- a/nixos/overlays/spotify/default.nix +++ /dev/null @@ -1,24 +0,0 @@ -final: prev: { - spotify-adblock = final.rustPlatform.buildRustPackage rec { - name = "spotify-adblock"; - version = "v1.0.3"; - src = final.fetchFromGitHub { - owner = "abba23"; - repo = "spotify-adblock"; - rev = "5a3281d"; - sha256 = "sha256-UzpHAHpQx2MlmBNKm2turjeVmgp5zXKWm3nZbEo0mYE="; - }; - - cargoHash = "sha256-oGpe+kBf6kBboyx/YfbQBt1vvjtXd1n2pOH6FNcbF8M="; - - buildInputs = with final; [ - cargo - rustc - ]; - - postPatch = '' - mkdir -p $out - cp $src/config.toml $out/config.toml - ''; - }; -} diff --git a/nixos/secrets/HomeLab.yaml b/nixos/secrets/HomeLab.yaml deleted file mode 100644 index d39ba71..0000000 --- a/nixos/secrets/HomeLab.yaml +++ /dev/null @@ -1,41 +0,0 @@ -HomeLab: - Gitea: - ssh: ENC[AES256_GCM,data:+H9qhfOg5WlTB7pihvbJ9omY/zLTAADe8KzI4fbdZ7NuaM0auC95AIQqhwNNCZNglg9UGOVL662pY7dNhbQ/2iCLPHSPgFFXf3fx1moRRcYYQzoJxsgxp19FZQeGNJ0qfRf72xYbZQZKslyHQmcqDieoVTyhaLqTfgC8MQ/UZofw/ortmgME7z51rGV5sXXMjxpJpHz9JxiPwQEL0ABWDAeCqBVBzlqqwdmfKEdkcR4l3USHfH1iNF5XQ5V26I+UGDOyoixt1c/BXzD9xzKI7MUDoRz+qfC6C62LIlEgqZY5tWg+tVZnqobakxwH6d8pXtQ7vaIREEP0LqQMkrNcK8X+cDRteToQ1fcxtN1V+JfZSa9pVC+iGgvmSZ00q4bnOgTmgO9IZ80TvOR4bHpRhjM5l4JMbLBv2jqY1zeUx/5L3WNuYIm9sL5mWXkV/RAD8WCemNSWdKbGsvByEUeiFcxczL/vQ6y3fi+ntmXUgeXVy5zVNkNlYbqd+DemBmwZQb9D1T5T97i2ChciYb3/ON1NObja/bt0PTQa,iv:hIbwsPcDSfgDItlvFFy0vCjuQWvgoQHBH60v8nTVTNg=,tag:1T/TdTEy98TfgMzYAxfHKA==,type:str] - HTPC: - ssh: ENC[AES256_GCM,data:svt6jhMXVCydmlcoa052TtFoIwQiAzNJRn9GPZDBuOGSnB83kUpuy/oqPOIa2ipco0L/5F/mQWn7OHUFtyhWWMerzY8niPldUDKH4jgsvRhRIatGOFiDyL8oA+f1O9lmhyFx35uxGa+Q6tn6rtXVKRVWQFe8kYBvGYjugKixsOMugoqLIxY8wUlMTzm6uDd7a72s/0hgQZGKp0eHWBHEdSJGPdv8svVDZ1PBMrlZa5ZpuiUmmvZvyCEnRtImUZALG4nKMvJjunxKr/4MJhWuffQ60jLYzInoGggiJlwBm+E+m43FwIFndY+LJ+ykO5RAbHhSwgXsCS5WXBrvDGuOTNAlIp6yTgSK1DCzSjzOJOc93rVSPhPdkaOoKgxhz1k95qCEhYUf9vyBgyIaOntWEArV+OZmHje6awbk4fpyIzRe7ggHlhKILYoGYzeejxbMGB9nH15RlUiTF7QnAWxWNSwcET6dSn2MtpC3yegnYl4u3eJ7YkHHYYQtwCQ9vCnt0i/sfuJmbrSFBXnVKMWB2w1Att145gDdlDok,iv:4bkSYvgmG6j/AwVnfGsLjdqtyP/gpWRvOKZCQxP0sMs=,tag:LyjE7dTt0+IDuSlbVLgCMg==,type:str] - Hugo: - ssh: ENC[AES256_GCM,data:y233CFIH7/n4EGEd2D7MuoprcMV9A8DaiV9JYZ6sr5j+hZnGr8sIAm9/55Bi2cD74sBZcE+tjOz+V2aJ2llKgcdS84ZmXMPh6KQ2QYRYuGdBLeztl8foKdimToblBapebTVO7Rc2mdhg7sZtC/TKSIJnG3R3lRfRdKaxNjaRS51epl7VZKGhLBjZoZqMXOezY7lvNBvF3hFfMh5el5I5Te/yQbbp0a7DkAvA+c1nG9bo9FN0h3VJJTzcuHqvGHI736VosLe8UGirMkX9mBwB8ZV4+2Vp7ZsSHnX5or/MzuYexT0zeLbTNHfj64d2W2/LKDkxNc35Sw7NvxwsVj3k2UHC2jEgus2z0AdMFszEFXh+Eu9wK8yX4ebzUut+OHNPuxvIk+ORxYr3OdVkOhhWHLinu/skNg0u5OdUXo/0p1876+gpcnOVC5UrUflwrtKGQgNk+ovWWjSfcQMh+gI6GYXzksX3YdMEriYZt4Z8lev2od/i7q48cV4W3Lo6TDDttipynxQus6K+J3oBKRirLHylRA5gusqUOVzC,iv:thw9OUnA02qe6aMuLTwy+q/a6isB375/k7JixPEy960=,tag:s95FtFRmPG0Up2oVuQyXsg==,type:str] - Nextcloud: - ssh: ENC[AES256_GCM,data:aVqa57u9hIOquP367EDj2rlyQWRe3EZv8l5cC+yQQKCri2bN5IFSq8qNemOIcU9ycBnxIyK6gLerJYQQcgzIIARmnfDpbJ9w+EeUL5yvPVJN6FM7oBeaL9mzYRl8aDKr22LhL9YiKAT1nKHESmTb3TZRvuvWJTGzCMRV85ROGxZYVUgG6BjuHEzuTsc4fy3NVPIl7/4ZjPgNNYx+UNsV5xwTejveB/sGblVrHOO74LZXzUWRlQNun5nM3MY3GALzfrPrVIAyGNu37CGachtwxaPOj7vUKZmD/e+XajYVKRJ3v33jrUeI0dDmhuwJj3taoFik6suAyiK3RlDdeWoERR8vqduiyxJnVMs6mNkigzkVtifpwZyQ8vNyG7w1JNPygMYgQzjN43lGVml8cx1lZvcoBzQabjWxcNzhV8gXxoGKvAwUV7ELB6l00rUH+EeI0uU8/IFm9kwmZq42ciM/bRGSGXzo2PYG2OHOiDe5b0nrIlajaRKd+vuuzTtFFU9EwH0GPzERRaoxVK+h9tzcco/REITCE+CVlHSx,iv:bb1X95HK5tT7EJpqqgMOUxw5VO5MuzoYxkPIzR5sEqU=,tag:y2LKHm7czwyuHp7Ea8KiYw==,type:str] - NixOS: - admin: - ssh: ENC[AES256_GCM,data:rAn/H2CtK2dkES2UIJrZbEP/3rqLgJsy5rortmdqoCthQ41IxztiaH1VtdaVDtw5j0qu49RJ59KkmYpOQXC2okAgLeqcb+J9iwrwspfKd+/I186a4gHZ2l+hGpmr3Vbs6K/UoCY67uygZhznBuwKeW4EjYJgGS7zInJFmMvcMV1rP/t4VoW+5oxptQNCrzoRukIG6NiAOcqU1GtvBfL5PxLaTWUEcZMYuo6sY/9VuEWgkZP1bmhBPUIv9D5yJo94KQr0YOaX4lz2pwd+K0cdD8d0Lh8B5YplA1NDCUnBbuDXfH0aSUAm7DCm6Y/E2UECEMRLuwfyEoe/yaHh8iCGveI//FkmiIKNY1SmTkjM2Fdfk6QaVDF8sG2CWdX21H3senfeM6jSow7JLY1LDvC2WxO4YIJEi14Y7zEpIZinWimyAhihPvMLnwd3taOhE59NrTOQKQS3tyFX+5tO3LtBrpn+Tm/B7WO49EkRn1LXN8CWkFnEEGXgxfNRg91C967nHaNpDMssGjfVG20WwYAtMKXzrNyzSEJbZglQ,iv:vY/8yyO0eLzpdho9aPUH9WGQ8Cp5LA+5RckjzDgYMMY=,tag:Jar1qVS/c1rQ8f3qpYqJdA==,type:str] - Roxanne: - ghost: - ssh: ENC[AES256_GCM,data:hkgVUVyCLANeYB4bcCTLB/F6eAbg7J4eN8y+VVzBfkcgnpDmXmghBihreQVT7OIwRrHIH1ok2vuH8vgXb38tuplUD5I8e0Gqy3EqpOGagsO8lss4aIg2lRwZ9WazJknvo4OaGc34jrwcZicesnaxK6g+GX2r2N4caGKMuOZ2i1mLKBwOcEtL6l3REKrGkExd3mYJX1Yqs7sMbGLNpfemDghv646zvxDRwPby49qIPA8OtGR+DBMZTTEviNqamJaFbs7YX+K77J1NHK59u6UfzU6hEjTBEYIjkFDzGATAZAopCsjOHcAA0alejHK4QZZt3e8unVsLICNK08ZCyEzwSXQ/wpUh3ccGcLit2t1LYZT4PqqG8+6ooaQYso67Wral0pdsTsrF0mGNfsZm76MDV9puP5B+IInanHz+2mCHbdmTi6rg9t8Q6mpFqrUbrwxMn2Ns1proBXBCqK/sFjC/bVIyMHUVOh6GYcKaVTv8ecB9ZEjp5dZ4VeStqTMT+xqS7dXBAJzGytLwXT/JaQelIE0w47aBaGy63Pqy,iv:WuAGU+ru8xLp2LXK12x/ueCH0XDxA0zGUt7+HWUdVMo=,tag:UqUMD/jSdTXOkf0kyMqwHA==,type:str] - Vaultwarden: - ssh: ENC[AES256_GCM,data:LJ7nbIdl1GqcsBtOwqsDtjKMfks13X5hsGkEFxDj0eX1EegEBkoWnzstu34RTgt1O1O+3Y/Amg7cDce2ZyZrTwDmLqinpuJD3CI7pRtQygAH8X9wPQYE6U3D1t4dXuMcDftjS+uY0CJFmq01dLv0GytSZSiNBcqNepTY+fO20yylyUbDGjI3Foyi86ipEtLVeFJqESiHDMHn/Cr+ggpLNMXijpnyoCRstPlm3GY3n6EhPwKhwovLB3AXolUeScnInIpwiikVTkYLNLCbrG8KAAr+DmWK3GTZYToH0wV8HpacPQI+4cHf96+EvAVlYMwGyQztPmXO7/9xUgWCNYow+z8BD6ijMuyZHT9aNkoAPt/y72N/PSf5HqW0QVWr3LmyIG+i9Bxbhqc7mRUIy4wZsODbtoO8/RtAly6mXIg0DZLlbo8kDe3TE3m+P5E/KQJOAvM2QdL+NXPcf2J2JYHW4kzITx447Bc3+F/DRs616MhekIoDybLhY3MT0XvYX1d1wAv/Ip98EGzfptXjnJvKPcJgTBlqNyeKuPOe,iv:oEGJUpoj+N30TgLpSWQqGdqYBdWLUWnSuQ+7TdSgmFc=,tag:AUZ2QnPUxLHaxsHbrmSYZQ==,type:str] -sops: - age: - - recipient: age1fva6s64s884z0q2w7de024sp69ucvqu0pg9shrhhqsn3ewlpjfpsh6md7y - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBlL05vZHk2T1B6OHArUXlj - bEZWV0dUeVN0M3ZpeHdKcGlKV1RWYmRLM0FjCm9PLzBZTFo3RjhZTEhYMDBSN2Nj - aithQ2hpZXVCSngxcVBvQ2hKRzFXUEEKLS0tIE5rL0NHb1llRmlSQXVUeU8rVmNY - aEZHdDFEWUdxMzRVVjFhQWZmS04wRkkKrD2CiwdNcbK9s64omQ7xSA29J48HwIHa - ickyL/uorYhXmBKhqdvNq/j1Nb88LR9ti55Z7eecJNbyJb4OTtgzXQ== - -----END AGE ENCRYPTED FILE----- - - recipient: age1qzutny0mqpcccqw6myyfntu6wcskruu9ghzvt6r4te7afkqwnguq05ex37 - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBOWNXQ1BsekdoS3BCdHA4 - YTJJRHJBTEJ1bmhkWktSamYyRk1TUmovZ2trCnBXbUZQZFBndmU3VzJHVjczZGtY - ZkJDY3RzSEhXQVlLL0g1QTYxSC9CZGMKLS0tIGFBZnNlWmZjZFdkdGZvaHA5ZjMw - NFRtOFIybnFPWm1idFY0WEVqVGxOK1UKiJDByqKv/i/l9dvOplDyzDORU3ulhSwi - 6xyEqmyNQpIkiS6TLZZYrBlQMDYqZ2gj1HhdIUssWJCf5Ho8KVDjJQ== - -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-10-18T15:55:58Z" - mac: ENC[AES256_GCM,data:vdVOTFlDD9jlGJksI5TDxk3stPkLY8lB6LMhV6QGqh9R2vaGuGGh6RZuR6AInq1Rm89innA6M1S2UUM6Jef1EKiPgq41neWMx/i3n7Ixx8FcraO/lgUYKG5yszYdjAlLQvKWqIbvX0bMYNwpF10FO5OyiXWiJrP9Om0Pjvk7dO8=,iv:W9I1nv0fKckNlNjJF0U4HlkyI5VDpvOGiSo0GeOODaY=,tag:RjkSTQYejyf1WO0LilbXYg==,type:str] - unencrypted_suffix: _unencrypted - version: 3.10.2 diff --git a/nixos/secrets/UGent.yaml b/nixos/secrets/UGent.yaml deleted file mode 100644 index 634ba65..0000000 --- a/nixos/secrets/UGent.yaml +++ /dev/null @@ -1,31 +0,0 @@ -UGent: - GitHub: - ssh: ENC[AES256_GCM,data:J50bZHBhN1AT1mF0YpzAFvC4zYeXiIPLJsb4Bx2oqnwX8XlfL0xta7z9Y5CmLxBIxowpj2sLaAnElO1pbsGl8NCnERYvAAt0tpnF3ndozLKfqGPsBKnnc/s9CrZhcsCtoH23lMlVsYMJfVR3B1/0W1XeU+E/GpzBTaH0jkwpmE9+k/TdtPPqSqHvF47NS9lTDx9puHSFixNhxUE82/7wvKTrkGO6+SJXTELXqFM7IojwIHs9UrL2zIrMMRnSPwAiZ96UI4Cg2S18j610ZzX/aw1qODqL53ZfZ9HKurGxyEN58ehR4UhiGsHiml9Ged9UIHhpX3DtMCrwrZfAzGLDV4DxDGQRT8C/aCgOag5AtYJczivY8wA9CQpiTBBUlomUurjRtiSX4FdvZxZLTmY+DtnE/SblRNsAZUEu6DVcg+HUYgqWu+XgVhWyKCiEbKpw0Crl4O3e8evIZ8H7+o3ydQjSgjbIkNjtYGR6fH/8Hh1HOsdh9CDevhNh0TtD/KP7ahTEIeelm6A9ZaP92Bnga5aafKtjX0RBOv4u,iv:6YE94ihsaUkB9+c48ELvRiY8bgZvS0EoyP+l5AisW8o=,tag:NSMpky7GoxDkybFSCjJm3Q==,type:str] - HPC: - ssh: ENC[AES256_GCM,data:A4ir0yvCgIVJCl4C5fB4+WhJVj6Go9XWfjw1/lOaWr2rP+tVNnjGuv/d47z55Gxose5keYX2wRMet/M2Re18+5ckFTyfT4YkcHtQCyBGbmwYmIzxcaxinNsCuOelEdNnFnYW2ha0aJ8Q5Xjfpec1YqDrCT/Add3qGRzBizQJ1FajbyhxJOKLYvUrYvLZ8+XE8SUndvjQnVig3ArUm2hDFsEMm4ClZ4T+EwcIuWrS8ia7ZoqlQhglEtlSEczE65a6hQAFeXE64YC3s8kWlRGhRqJQXjB5g/UTkOht3Vrw2cNzrz90tR9vhooOEBEI6d8F8RJGkdyUe5zod1eKnE/lwOFhhTbzrGrYzX4oUrDIL+Dx9+R9mQchv9qSau1JtKDvzkYmqVVgTC6wE98gTRSBw78f0MKO27FA3diC/k3t+mwsKVRjcvlTUcbRcFAxjq/U5TbOq5jOgA41dI9KE/+bnJoLRh81m/sq9EqMTp90wDKn+jjCn7lGcGDwtaaTlbLIGIw5u9pcfD4UyvJZamnS96JAhsDUqk+fxb05,iv:jPCdaC7CahKrj3tvzZTs1ZI/3+zuCCqIdXp3vo9l/iY=,tag:DeUdWEZHpsB1AMD2AQuiTg==,type:str] - SubGit: - ssh: ENC[AES256_GCM,data:hJAle4DHJNvX569reclBG5rEdWsjAyV2TtHYMiPfky/dMKJkYgT4+T0doLfUn1O6at77kJGPmwUEvmK819DUuvHtNY7c6angV7iLygJ/ThI1FIFOKH+NxEsI3scoT0VDDybHpgice/fcJL1tMcvE74+dWOnZ2r4pxcMJEFHUPVVWcl9/stJLn78OonsyWpj8PglcnYFOfZ6THIe3lyNBxRp7XEweuwjacthGzOzNu3Z95zcCAnAokFVZ570glJNhjJVNEmPHZkHOcGiGNNM4JNbR11v+dOYtac942t/mmmWwAzbznuu8ZLupYWjdg/f07ftkPAwFwCoXblZ3708Lvf6uOt/CPeWvEII2Haf1Cr5w+U6TAt14zzL73xCSQqwz1TfkcmD+bJplmtcpSP/KX8/BRK7qr6Ec5T9ecbraRB7zDBg0X2x51DSHLrA7UIhpI9JNaOArU5UOVYTWwuzFiGG61elJMcPZ5vWEVrTCocfa4INPo4B2MkFbbsYf6xnY1L3Wc9LQjkff6aCqYnQaXZ/WfPWepf9YvYG1,iv:0Bm1r0FuJJKKmcbTiPL36rb5FaMZfOO7Mx8pXU2FSfg=,tag:0ShoJPJUx37mEAus+mhPmw==,type:str] -sops: - age: - - recipient: age1fva6s64s884z0q2w7de024sp69ucvqu0pg9shrhhqsn3ewlpjfpsh6md7y - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBpb0dlWE5PNllnME1jQWE4 - cHFzWkR4ZzNaWlR0WDJ4c1hEdlJGN0FISWlZCmNNdVRtL080QzgwQTZtTGpVRkxW - dkdvYXdQNUlhYWQrYlNDR2JISXdpdkkKLS0tIEpIU20rK3F3WGpBS1g3NmJqYWRX - SWlNbFZ0NTJJZ09Wd3JzK1hscjJoS2MK4GU8ndim80CaOjgvMwVlgIq/1VQIylSZ - EJl15zUFaDiDZUCcZE8TkJQ/rbGDSiq7KlWyFe48Q3UC86jfF88qCg== - -----END AGE ENCRYPTED FILE----- - - recipient: age1qzutny0mqpcccqw6myyfntu6wcskruu9ghzvt6r4te7afkqwnguq05ex37 - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBYNjkzeHloK3hKUTJaMTdr - NUdiZ2JGZitqN1k0WCtEODU4R2MrTmUzR1hrCmNJL0Y4ZEpLN0l6ZmhGWEM5UktG - ck1PUnFSSVNCRUd5Sm9kSXNmVW5jZDQKLS0tIHpHWVBVNFNBSlUvZldJVGowUEtZ - S05HZ0FiSVlkUjRRV01TbjlpVFlkQWcK7jAqOYd9EDT93xpVgtpKl03EO6oHmGRR - iK9j2y7j1YSghPKDBrC5eKy9+IP/EFEBGygcokqT7C6Nscu80YhVbg== - -----END AGE ENCRYPTED FILE----- - lastmodified: "2025-10-06T14:01:15Z" - mac: ENC[AES256_GCM,data:bWo5DGCt5cK02Lf61yKFDZLLaMmcWyba+03CZ35EnGz7Hoc1sl3qTmgJfNz8EKDeXTIkk33DdnI/kZ2nX7vsZ/QgOhFQWzWRYe1cxqiWyd0wnUlwdoeeFrBP3uOTHXAOVe6q77S3qChzBP3J+5OijztvdOVEOKFmFPSCgyA029Q=,iv:6DSp63IrtYyaFxkaify/JZDXpB76AaGGW/OcPTKBbvk=,tag:sPKddpcx60JFZ4VEGD1tnQ==,type:str] - unencrypted_suffix: _unencrypted - version: 3.10.2 diff --git a/nixos/secrets/personal.yaml b/nixos/secrets/personal.yaml deleted file mode 100644 index 8a60040..0000000 --- a/nixos/secrets/personal.yaml +++ /dev/null @@ -1,28 +0,0 @@ -GitHub: - ssh: ENC[AES256_GCM,data:jzRpTgefhZg7Vhm8QvWNsPBko1yw56sM/XehY72lAc7aRz+dx6BGgyYbZiifd7GrGJGUbH6gWfUg8YjgVla6VRsiHCEvSK3bY0ADDwTeSUs+wuybYXQZqhivSCInVtVSNAcp99uI1QwKor289zmxcFtSZEXgU1OCSel/8br+qipAbOkzAKX1v15eigjY4OSQxXL59EuuuHEQ+vjVVv95tDv03jaNAoU9UKr0Atrny/Fn2sQn4Tmec5Q1XdvDErKhSxrAFiACkxXUwPZMHez+BUZrmkksqpzNJjYNIlmsITuOVr7Fyen9wotAwsDf96Fmz5JYLtRX9CAboUgQLdUOKprwX/xgBnFtDTSH1Qr785T1QSAZL6xdE6hNibxZO3vGeeaPC3oGB5g9x5CwTQelMdOUPKdKorCDj226o56cTc/IQxUpsULbeOyi2pMGHiTHbiQBzHpxWyQ/gBktPkF25GOFeaCu3gW+xsspX91jSKudcYdBqWUNmJcdsfHfPxPM4cZtA/sVMyoA+YcehgU7GTu9DAlxDTug/JWo,iv:5shfzmrFFVEuaYmyTkBMAw9BIFFkKz0yl1dyJWxq6Y4=,tag:CX7TBJJXCKuIPSmg9/RpGg==,type:str] -Gitea: - ssh: ENC[AES256_GCM,data:8eyuycMkBVMHfzaGeGs+0RA4vCpaAUTjCwiplUamypEk9BDYqxe+69O6OjJAGaPnmH4kpsb/WVd5sU6HNUogBuzDQhCrv2B6NadcmnV+fH3MHfAWvDy7R68PUkwcywWVOo65SONckjKVa0Y+8IeeJh9zpr36qCbbs+zPC4XTk+Y5R4vK/ocmSJSmwqVK1SfGGwOjFoJvHVI6jdXh//vgKaITqmyZV7N3OU9EiQp1FmNKwFf/x70w2LGATrNBcexwNy20ZYd6ewiAfJxFHR6Svfc2P5X2nlv99W5t1eU5QEGUcalcslsW/VkmFC3agN3Yry2EMIlfTlm0hm4+ryDGWEvgyUC0dLA8Ao0TLaaqig9HzBRP1h6aORe0lDwzTUg6WltrIu0s7hFwD4YLi1qP5lY99hvrDIRbTEg6AY6X4b32YFlyOXy0YDetv90+QyEcwANWO9MXz2S9hxuQmjOXMCVYMaiMLVUkG+mShbQuxTiFQt/7D83yOBSRLugx/aU318NKvUDlCt7wpZbMI3gBia4nUYLoLcXRKcAZ,iv:uc1ZtGdcolLrpQgS5n5LEAwBt0vMmkj2OuTXcn8sQ7A=,tag:F2ofcj0zEBgxwukMUd7+uw==,type:str] -sops: - age: - - recipient: age1fva6s64s884z0q2w7de024sp69ucvqu0pg9shrhhqsn3ewlpjfpsh6md7y - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBwSDRZQ0pVNWhmdFo1UDVv - MFlrZEFtNjlpZ3pBU0VrdkFpR2x4WGxUZ0RRClJad1JPYWhFTWd1N2ZKQWsrSjFj - YXREaGRrbE15MEdpblJtcTk2cFk1eGsKLS0tIHE2ZTd3R1gwQ3E1VzkvZTZoZjBW - aTRLcFJ6NkpJRjkyenVxeFRLVmgwMjQK47HRKyg1SxWABZHCdVdIaPEKoSiWIOO/ - OYu/1owbUwTh1KouUb4tgNmVBOkERJ9i3lEjWLHUWrlCAUImc9dG4g== - -----END AGE ENCRYPTED FILE----- - - recipient: age1qzutny0mqpcccqw6myyfntu6wcskruu9ghzvt6r4te7afkqwnguq05ex37 - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSBBVDZtU2g4dmFXTlNIMFBs - OFBpS2RXRzFwTVdJazQrSldwWUFtdCs0U1ZFCmxRdy9yY3VIWU4zenc4eVNEVUZv - VUlyT29JekNTS3RIMktmS2RGNU5GMTgKLS0tIEhvM2RkcUs0SE5uSXFxc3dvSXhP - WmViM05IMHFPckNic1hHY2ZlTEMrYkkK+66rYqbGQucqQch4Tx9jONR9OIXdjMUd - q/fGLCoSluHuCOkUWr/wUgvF5dWAHftYj9JjDB/9vpp4Q0WClLDszw== - -----END AGE ENCRYPTED FILE----- - lastmodified: "2024-10-19T12:24:38Z" - mac: ENC[AES256_GCM,data:g15gV0H0rlzoeN5Z/Zkgh/8ya9GSrWDVP9oqdVz3m4obmquCLDIygsPaYpRXmfOtPSgvX2KzZ08sNLfcBZSh7eH2Ws7xcezWOntOcmAQNz5LvemqP7YuwtivMK/P4qrkME+LQPkSrSUR+rT99Zj+RQXisy91Cq9NbVBj6uQH7+I=,iv:W+oDp5Dun0g35BFprOmgfI0LoPME3HpPuuniCKA32Kc=,tag:CUU74HZuRNedyI3txn9D+g==,type:str] - unencrypted_suffix: _unencrypted - version: 3.8.1 diff --git a/nixos/secrets/secrets.yaml b/nixos/secrets/secrets.yaml deleted file mode 100644 index b5bf68e..0000000 --- a/nixos/secrets/secrets.yaml +++ /dev/null @@ -1,34 +0,0 @@ -hello: ENC[AES256_GCM,data:Qs69AsC8Yz+2RWSMvZp3zw==,iv:9p9bf2MI0HFwPB5qu0nTy3riyE6xUqsdObaXv3vgs3c=,tag:fjwrOPR/2vIeNgPDEVI+LQ==,type:str] -example_key: ENC[AES256_GCM,data:JaknfPEPPtIotkwWpQ==,iv:OQy1S24scW0Ac9omkHg1HSCH6b7cClBMDH1GXZkzUBY=,tag:ItO6EdXKy4zOuZ2DROI+Tg==,type:str] -#ENC[AES256_GCM,data:Pok2Tcvryb59LmHDanq5/Q==,iv:Wl2nAb0X7s3bFeGeVUAHb+FMqrKHSJwwHulhdwhPkuE=,tag:YxicHwyrYLZZ6sFGNvkMMA==,type:comment] -example_array: - - ENC[AES256_GCM,data:ULZ3vixg/k1biadqhw8=,iv:7NMuh30RkiBGpXO/sd5WKzBggNnMZkV8eD16w39utd4=,tag:+ReYo3sQf2rgK0nTXAq1UA==,type:str] - - ENC[AES256_GCM,data:VawE9ClM28rRQPScWAM=,iv:XKiKDFGy6Io5gyp/FHLXIs7CpT41E6KAKHQmuZLRVHE=,tag:FSIdSnI/emPwHk0dQVT/TQ==,type:str] -example_number: ENC[AES256_GCM,data:yd6R8u2Nd5effA==,iv:7NO330iRkYO42a4AjBr5Ebv/nxx5J0/OpWKIqMTqdPQ=,tag:N/RK1+Q+QqnVPCkGPA1/AQ==,type:float] -example_booleans: - - ENC[AES256_GCM,data:Ul7fKA==,iv:U51FhTsWwkbhUWGsO8D+bl2mLdTIfapIB+OGJEOAiRA=,tag:9NJLKp8s2TSKLyXwM8OncA==,type:bool] - - ENC[AES256_GCM,data:LVU1a90=,iv:1X1qV+8iIe1i5hIrqyB3tJew9hsHjJHlATmkEmwRA0Y=,tag:ko/5OwmJH/6HKPsvbkoRpw==,type:bool] -sops: - age: - - recipient: age1fva6s64s884z0q2w7de024sp69ucvqu0pg9shrhhqsn3ewlpjfpsh6md7y - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSB4KzMrV2dpWFQyQUQyV050 - elVhN0dUeTRodG1kNHZ0VEVmTUI1QjhidFJnClhJU0tVY0tmMkFaMDZkMDJOKzV1 - NVJiSERtR0VZR3VBOGVJbGk3cUxTMzAKLS0tIGhvMmIyOWQwVlhXRzYwampTeG5V - UDVWQnE4NDY5cFF3RnpxcjhMY2N0VUUK+B24C0CT5b82DJSdKotX4iPhzWxnYsn6 - kS7Ut9uy5OwcB+p6erlbLMEUVmmSNw89KBrowT0Ui1d3AfyGAN4rqQ== - -----END AGE ENCRYPTED FILE----- - - recipient: age1qzutny0mqpcccqw6myyfntu6wcskruu9ghzvt6r4te7afkqwnguq05ex37 - enc: | - -----BEGIN AGE ENCRYPTED FILE----- - YWdlLWVuY3J5cHRpb24ub3JnL3YxCi0+IFgyNTUxOSAwTjh4NDRYZGM1VHRZWGor - MmhFWDNvMjI4UUVPbnorNnpabGNZY1BuMVdrCisvZ0U5SXRPM3IzNlZvZEpWZktz - b2FJemtNVHU0WUI4M0U1L2tWR3g1MEUKLS0tIGczTmVubzcwVjg5NDdQdEllWEFw - TWRIRE5WSGRCbncvWlpEMmdWOW5kb00Kq79O2C4aYmZmrq+rbyMtwmEqkqL9epn/ - pw2dxXmYt95qu3x/BxjoN8RFZhabFp9xHkZ1kqJe9FGmBtAmoWXjWA== - -----END AGE ENCRYPTED FILE----- - lastmodified: "2023-09-10T20:20:18Z" - mac: ENC[AES256_GCM,data:yfmYEo8pdlG3tu4Fabwde57igIvpt4UuhQqStVlV36rvPnv9dc42+6iduu+heuQ2OAVw0jk6/o6SWJpcms2DReOAMGDOgt+zV3TgJym52YdMcjTNJTo+4loULhvaWyN9ZdPJjSYKEoSgOZi+oMx4BpwreQEaPaYUxcbTqrWCUa8=,iv:Mb81sBxibRxSaC2kgakhy2pyEmW0MDobF+lHF7cny5E=,tag:DCqTWSnf5Gv5YfAGSEC2yw==,type:str] - unencrypted_suffix: _unencrypted - version: 3.7.3 diff --git a/nixos/secrets/sops/age/keys.txt b/nixos/secrets/sops/age/keys.txt new file mode 100644 index 0000000..b21c58f --- /dev/null +++ b/nixos/secrets/sops/age/keys.txt @@ -0,0 +1,3 @@ +# created: 2023-04-11T14:44:53+02:00 +# public key: age1q2gqur3t4fu8flsuu2zdnule37vdkh6egpt6a2e3ytx433x8gpvsr4hw6l +AGE-SECRET-KEY-10J7MWCWQQY33TVNMQ9AMH4TH5LULSVAZ539P9QG3NA2Z3LTMXAFS2QQ4NG diff --git a/nixos/users/default.nix b/nixos/users/default.nix deleted file mode 100644 index 2c60be9..0000000 --- a/nixos/users/default.nix +++ /dev/null @@ -1,14 +0,0 @@ -{ config, lib, ... }: - -{ - imports = [ - ./tdpeuter - ]; - - options.sisyphus.users.wantedGroups = lib.mkOption { - type = lib.types.listOf lib.types.str; - default = [ ]; - example = [ config.users.groups.wheel.name ]; - description = "Groups to which a user should be added"; - }; -} diff --git a/nixos/users/tdpeuter/default.nix b/nixos/users/tdpeuter/default.nix deleted file mode 100644 index 353a1d4..0000000 --- a/nixos/users/tdpeuter/default.nix +++ /dev/null @@ -1,193 +0,0 @@ -{ config, inputs, lib, pkgs, pkgs-unstable, ... }: - -let - cfg = config.sisyphus.users.tdpeuter; - - user = config.users.users.tdpeuter.name; - installedPkgs = config.environment.systemPackages ++ config.home-manager.users.tdpeuter.home.packages; - - cursor = { - package = pkgs.phinger-cursors; - name = "phinger-cursors-light"; - size = 24; - }; -in { - imports = [ - ./dotfiles.nix - ./firefox.nix # Enables Firefox without setting options - ./mail.nix # Enables Thunderbird without setting options - ./secrets.nix - ]; - - options.sisyphus.users.tdpeuter.enable = lib.mkEnableOption "user Tibo De Peuter"; - - config = lib.mkIf cfg.enable { - users.users.tdpeuter = { - description = "Tibo De Peuter"; - isNormalUser = true; - extraGroups = config.sisyphus.users.wantedGroups ++ [ - config.users.groups.input.name - config.users.groups.keys.name - config.users.groups.networkmanager.name - config.users.groups.wheel.name - ]; - initialPassword = "ChangeMe"; - shell = pkgs.zsh; - - packages = (with pkgs; [ - bitwarden-desktop - brave # Internet browser - chafa # Terminal image viewer - cmdtime # Zsh plugin - duf # Df alternative - feishin # Jellyfin music client - foot - fzf - gh # GitHub CLI tool - glow # Terminal Markdown renderer - icosystem # Personal icon theme - jellyfin-media-player - libreoffice-fresh # Office tools - librewolf # Internet browser - mpv # Media player - nextcloud-client - nsxiv # Lightweight image viewer - qalculate-gtk # Calculator - spotify - spotify-adblock - unzip - vifm # File manager - zathura # PDF viewer - zellij # Tmux + screen alternative - zotero - zsh - zsh-autosuggestions - zsh-syntax-highlighting - - # SMB - cifs-utils - psmisc - - # Linters and LSPs - statix # Nix - # TODO Move to devshells - # ruff pylint # Python - ]) ++ (with pkgs-unstable; [ - logseq # Note taking - ]) ++ [ - inputs.zen-browser.packages.${pkgs.system}.default - ]; - }; - - fonts.packages = with pkgs; [ - corefonts # Calibri for Uni - dejavu_fonts - font-awesome # Dependency of Vifm & zsh config - letter # Personal font - noto-fonts # Dependency of Zellij config - noto-fonts-cjk-sans # Dependency of Zellij config - noto-fonts-cjk-serif # Dependency of Zellij config - noto-fonts-emoji - noto-fonts-color-emoji # Emoji's! - vistafonts # Microsoft fonts - ]; - - sisyphus = { - programs.spotify-adblock.enable = true; - services.remEYEnder.enable = true; - }; - - home-manager.users.tdpeuter = lib.mkIf config.sisyphus.programs.home-manager.enable { - programs.home-manager.enable = true; - - home = { - username = user; - homeDirectory = "/home/${user}"; - inherit (config.system) stateVersion; - - # packages = (with pkgs; [ - # ]) ++ (with pkgs-unstable; [ - # ]); - - pointerCursor = { - inherit (cursor) package name size; - gtk.enable = true; - }; - }; - - # GNOME ricing - # Browse available settings by running: - # gsettings list-schemas | xargs -I % sh -c 'echo %; gsettings list-keys %' | less - dconf.settings = lib.mkIf config.sisyphus.desktop.gnome.enable { - "org/gnome/desktop/background" = { - picture-uri = "file:///home/tdpeuter/Nextcloud/Afbeeldingen/wallpapers/bg"; - picture-uri-dark = "file:///home/tdpeuter/Nextcloud/Afbeeldingen/wallpapers/bg-dark"; - }; - "org/gnome/desktop/interface" = { - enable-animations = false; - enable-hot-corners = false; - }; - "org/gnome/desktop/notifications" = { - show-in-lock-screen = false; - }; - "org/gnome/desktop/peripherals.touchpad" = { - tap-to-click = true; - }; - "org/gnome/mutter" = { - dynamic-workspaces = true; - workspaces-only-on-primary = false; - }; - "org/gnome/shell/app-switcher" = { - current-workspace-only = true; - }; - }; - - services.syncthing = { - enable = true; - extraOptions = [ - "--no-default-folder" - ]; - tray.enable = true; - }; - - xdg = { - desktopEntries.spotify = { - name = "Spotify"; - genericName = "Music Player"; - icon = "spotify-client"; - exec = "env LD_PRELOAD=${pkgs.spotify-adblock}/lib/libspotifyadblock.so spotify %U"; - mimeType = [ "x-scheme-handler/spotify" ]; - categories = [ "Audio" "Music" "Player" "AudioVideo" ]; - settings = { - TryExec = "spotify"; - StartupWMClass = "spotify"; - }; - }; - mimeApps = { - enable = true; - - defaultApplications = let - browser = "firefox.desktop"; - image-viewer = "nsxiv.desktop"; - pdf-viewer = "org.pwmt.zathura-pdf-mupdf.desktop"; - in { - "application/pdf" = pdf-viewer; - "application/x-extension-htm" = browser; - "application/x-extension-html" = browser; - "application/x-extension-shtml" = browser; - "application/x-extension-xht" = browser; - "application/x-extension-xhtml" = browser; - "application/xhtml+xml" = browser; - "image/jpeg" = image-viewer; - "image/png" = image-viewer; - "image/webp" = image-viewer; - "text/html" = browser; - "x-scheme-handler/chrome" = browser; - "x-scheme-handler/http" = browser; - "x-scheme-handler/https" = browser; - }; - }; - }; - }; - }; -} diff --git a/nixos/users/tdpeuter/dotfiles.nix b/nixos/users/tdpeuter/dotfiles.nix deleted file mode 100644 index aca5ba8..0000000 --- a/nixos/users/tdpeuter/dotfiles.nix +++ /dev/null @@ -1,129 +0,0 @@ -{ config, lib, pkgs, pkgs-unstable, ... }: - -# Does basically the same thing that stow does, but using Nix. - -let - cfg = config.sisyphus.users.tdpeuter; - user = config.users.users.tdpeuter.name; - installedPkgs = config.environment.systemPackages ++ config.home-manager.users.tdpeuter.home.packages; -in { - config = lib.mkIf cfg.enable { - home-manager.users.tdpeuter = lib.mkIf config.sisyphus.programs.home-manager.enable { - home = { - file = lib.mkMerge [ - { - ".config/alacritty" = { - enable = false; - source = ../../../stow/alacritty/.config/alacritty; - }; - ".config/dunst" = { - enable = config.sisyphus.desktop.hyprland.enable || config.sisyphus.desktop.sway.enable; - source = ../../../stow/dunst/.config/dunst; - }; - ".config/foot" = { - recursive = true; - source = ../../../stow/foot/.config/foot; - }; - ".config/fuzzel" = { - recursive = true; - source = ../../../stow/fuzzel/.config/fuzzel; - }; - ".config/git" = { - recursive = true; - source = ../../../stow/git/.config/git; - }; - ".config/hypr" = { - inherit (config.sisyphus.desktop.hyprland) enable; - recursive = true; - source = ../../../stow/hyprland/.config/hypr; - }; - ".config/kitty" = { - enable = false; - recursive = true; - source = ../../../stow/kitty/.config/kitty; - }; - ".config/mako" = { - enable = false; - source = ../../../stow/mako/.config/mako; - }; - ".config/mpv" = { - source = ../../../stow/mpv/.config/mpv; - }; - ".config/OpenRGB" = { - inherit (config.sisyphus.services.openrgb) enable; - recursive = true; - source = ../../../stow/openrgb/.config/OpenRGB; - }; - ".config/sway" = { - inherit (config.sisyphus.desktop.sway) enable; - source = ../../../stow/sway/.config/sway; - }; - ".config/swayidle" = { - inherit (config.sisyphus.desktop.sway) enable; - source = ../../../stow/swayidle/.config/swayidle; - }; - ".config/swaylock" = { - enable = config.sisyphus.desktop.sway.enable || config.sisyphus.desktop.hyprland.enable; - source = ../../../stow/swaylock/.config/swaylock; - }; - ".config/vifm" = { - recursive = true; # Fix history and all working - source = ../../../stow/vifm/.config/vifm; - }; - ".config/waybar" = { - enable = config.sisyphus.desktop.sway.enable || config.sisyphus.desktop.hyprland.enable; - source = ../../../stow/waybar/.config/waybar; - }; - ".config/zellij" = { - source = ../../../stow/zellij/.config/zellij; - }; - ".gnupg" = { - inherit (config.programs.gnupg.agent) enable; - source = ../../../stow/gnupg/.gnupg; - recursive = true; - onChange = '' - chmod 700 /home/tdpeuter/.gnupg - # chmod 600 /home/tdpeuter/.gnupg/* # Already read-only? - ''; - }; - ".ssh/config" = lib.mkIf config.sisyphus.programs.ssh.enable { - inherit (config.sisyphus.programs.ssh) enable; - source = ../../../stow/ssh/.ssh/config; - }; - ".vim" = { - recursive = true; - source = ../../../stow/vim/.vim; - }; - ".vim/autoload/plug.vim" = { - source = "${pkgs.vimPlugins.vim-plug}/plug.vim"; - }; - ".vimrc" = { - source = ../../../stow/vim/.vimrc; - }; - } - (lib.mkIf (config.users.users.tdpeuter.shell == pkgs.zsh) { - ".oh-my-zsh" = { - source = "${pkgs.oh-my-zsh}/share/oh-my-zsh"; - recursive = true; - }; - ".oh-my-zsh/themes/tdpeuter.zsh-theme" = { - source = ../../../stow/zsh/.oh-my-zsh/themes/tdpeuter.zsh-theme; - }; - ".zshrc" = { - source = ../../../stow/zsh/.zshrc; - }; - ".zsh/plugins/cmdtime/cmdtime.plugin.zsh" = { - source = "${pkgs.cmdtime}/share/cmdtime/cmdtime.plugin.zsh"; - }; - ".zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" = { - source = "${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh"; - }; - ".zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" = { - source = "${pkgs.zsh-syntax-highlighting}/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh"; - }; - }) - ]; - }; - }; - }; -} diff --git a/nixos/users/tdpeuter/firefox.nix b/nixos/users/tdpeuter/firefox.nix deleted file mode 100644 index 5bb0b46..0000000 --- a/nixos/users/tdpeuter/firefox.nix +++ /dev/null @@ -1,118 +0,0 @@ -{ config, lib, pkgs, pkgs-unstable, ... }: - -let - cfg = config.sisyphus.users.tdpeuter; - user = config.users.users.tdpeuter.name; -in { - config = lib.mkIf cfg.enable { - home-manager.users.tdpeuter.programs.firefox = lib.mkIf config.sisyphus.programs.home-manager.enable { - enable = true; - package = pkgs-unstable.firefox.override { - cfg = { - speechSynthesisSupport = true; # Allow Text-to-speech in e.g. Discord - }; - nativeMessagingHosts = with pkgs; [ - tridactyl-native - ]; - # https://mozilla.github.io/policy-templates/ - extraPolicies = { - DisableFirefoxStudies = true; - DisablePocket = true; - DisableTelemetry = true; - FirefoxHome = { - SponsoredTopSites = false; - SponsoredPocket = false; - }; - OfferToSaveLogins = false; - - # https://discourse.nixos.org/t/declare-firefox-extensions-and-settings/36265 - ExtensionSettings = { - "amazon@search.mozilla.org".installation_mode = "blocked"; - "google@search.mozilla.org".installation_mode = "blocked"; - }; - - # Anything in about:config - Preferences = let - falseLocked = { - Value = false; - Status = "falseLocked"; - }; - in { - "browser.newtabpage.activity-stream.showSponsoredCheckboxes" = falseLocked; - "browser.newtabpage.activity-stream.showSponsoredTopSites" = falseLocked; - "browser.newtabpage.pinned" = { - Value = "[]"; - Status = "default"; - }; - "services.sync.prefs.sync-seen.browser.newtabpage.activity-stream.showSponsoredTopSites" = falseLocked; - }; - }; - - # Support smart cards - pkcs11Modules = with pkgs-unstable; [ - eid-mw - ]; - }; - - languagePacks = [ - "en-GB" - "nl" - ]; - - profiles.tdpeuter.search= { - default = "ddg"; # Reference by id instead of by name - force = true; - engines = { - "bing".metaData.hidden = true; - "ebay".metaData.hidden = true; - - "GitHub" = { - urls = [{ - template = "https://github.com/search"; - params = [ - { name = "q"; value = "{searchTerms}"; } - { name = "type"; value = "repositories"; } - ]; - }]; - - icon = "${pkgs.icosystem}/share/icons/icosystem/scalable/apps/github-mark.svg"; - definedAliases = [ "@gh" ]; - }; - "Nix Packages" = { - urls = [{ - template = "https://search.nixos.org/packages"; - params = [ - { name = "type"; value = "packages"; } - { name = "query"; value = "{searchTerms}"; } - ]; - }]; - - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = [ "@np" ]; - }; - "NixOS Options" = { - urls = [{ - template = "https://search.nixos.org/options"; - params = [ - { name = "query"; value = "{searchTerms}"; } - ]; - }]; - - icon = "${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg"; - definedAliases = [ "@no" ]; - }; - "Google Scholar" = { - urls = [{ - template = "https://scholar.google.ch/scholar"; - params = [ - { name = "q"; value = "{searchTerms}"; } - ]; - }]; - - definedAliases = [ "@gs" ]; - }; - }; - }; - }; - }; -} diff --git a/nixos/users/tdpeuter/mail.nix b/nixos/users/tdpeuter/mail.nix deleted file mode 100644 index 2e05b4b..0000000 --- a/nixos/users/tdpeuter/mail.nix +++ /dev/null @@ -1,143 +0,0 @@ -{ config, lib, pkgs, pkgs-unstable, ... }: - -let - cfg = config.sisyphus.users.tdpeuter; - user = config.users.users.tdpeuter.name; - signatures = { - default = '' - Met vriendelijke groeten - Tibo De Peuter - ''; - english = '' - Kind regards - Tibo De Peuter - ''; - academic = '' - Met vriendelijke groeten - Tibo De Peuter - - Student Ma Informatica - ''; - alias = '' - Kind regards - MrFortem Fiducia - ''; - }; -in { - config = lib.mkIf cfg.enable { - home-manager.users.tdpeuter = lib.mkIf config.sisyphus.programs.home-manager.enable { - accounts.email.accounts = { - Telenet = { - address = "tibo.depeuter@telenet.be"; - userName = "tibo.depeuter@telenet.be"; - imap = { - host = "imap.telenet.be"; - port = 993; - tls.enable = true; - }; - smtp = { - host = "smtp.telenet.be"; - port = 587; - tls = { - enable = true; - useStartTls = true; - }; - }; - - realName = config.users.users.tdpeuter.description; - signature = { - showSignature = "append"; - text = signatures.default; - }; - - primary = true; - thunderbird = { - enable = true; - settings = id: { - "mail.identity.id_${id}.htmlSigText" = signatures.default; - }; - }; - }; - UGent = { - flavor = "outlook.office365.com"; - address = "tibo.depeuter@ugent.be"; - - realName = config.users.users.tdpeuter.description; - signature = { - showSignature = "append"; - text = signatures.academic; - }; - - thunderbird = { - enable = true; - settings = id: { - "mail.server.server_${id}.authMethod" = 10; - "mail.smtpserver.smtp_${id}.authMethod" = 10; - "mail.identity.id_${id}.htmlSigText" = signatures.academic; - - # Allow PGP - "mail.identity.id_${id}.openpgp_key_id" = "9B11F5243089DB5B"; # Your 'master' key - "mail.identity.id_${id}.attachPgpKey" = true; - }; - }; - }; - Gmail = { - flavor = "gmail.com"; - address = "tibo.depeuter@gmail.com"; - - realName = config.users.users.tdpeuter.description; - signature = { - showSignature = "append"; - text = signatures.default; - }; - thunderbird = { - enable = true; - settings = id: { - "mail.identity.id_${id}.htmlSigText" = signatures.default; - }; - }; - - }; - MrFortem = { - flavor = "gmail.com"; - address = "fortemfiducia@gmail.com"; - - realName = "Fortem Fiducia"; - signature = { - showSignature = "append"; - text = signatures.MrFortem; - }; - - thunderbird = { - enable = true; - settings = id: { - "mail.server.server_${id}.directory" = ".thunderbird/tdpeuter/ImapMail/imap.gmail.com-mrfortem"; - "mail.server.server_${id}.directory-rel" = "[ProfD]ImapMail/imap.gmail.com-mrfortem"; - "mail.identity.id_${id}.htmlSigText" = signatures.alias; - }; - }; - }; - }; - - programs = { - thunderbird = { - enable = true; - profiles.tdpeuter = { - isDefault = true; - settings = { - # View - "mailnews.default_sort_order" = 2; # Sort descending - "mailnews.mark_message_read.delay" = true; - "mailnews.start_page.enabled" = false; - "mail.pane_config.dynamic" = 2; # Vertical view - - # Encryption - "mail.openpgp.allow_external_gnupg" = true; # Enable YubiKey GPG signing - "mail.e2ee.auto_enable" = true; # Automatically enable encryption when possible. - }; - }; - }; - }; - }; - }; -} diff --git a/nixos/users/tdpeuter/secrets.nix b/nixos/users/tdpeuter/secrets.nix deleted file mode 100644 index fd1a363..0000000 --- a/nixos/users/tdpeuter/secrets.nix +++ /dev/null @@ -1,48 +0,0 @@ -{ config, lib, pkgs, pkgs-unstable, ... }: - -let - cfg = config.sisyphus.users.tdpeuter; - user = config.users.users.tdpeuter.name; -in { - config = lib.mkIf cfg.enable { - sops.secrets = lib.mkIf config.sisyphus.programs.sops.enable ( - let - HomeLab = { - format = "yaml"; - sopsFile = ../../secrets/HomeLab.yaml; - owner = user; - }; - personal = { - format = "yaml"; - sopsFile = ../../secrets/personal.yaml; - owner = user; - }; - UGent = { - format = "yaml"; - sopsFile = ../../secrets/UGent.yaml; - owner = user; - }; - in { - "UGent/HPC/ssh" = UGent; - - # Git authentication - "Gitea/ssh" = personal; - "GitHub/ssh" = personal; - "UGent/GitHub/ssh" = UGent; - "UGent/SubGit/ssh" = UGent; - - # HomeLab - - # Physical hosts - "HomeLab/Hugo/ssh" = HomeLab; - "HomeLab/Roxanne/ghost/ssh" = HomeLab; - "HomeLab/HTPC/ssh" = HomeLab; - - # Virtual hosts - "HomeLab/Gitea/ssh" = HomeLab; - "HomeLab/Nextcloud/ssh" = HomeLab; - "HomeLab/Vaultwarden/ssh" = HomeLab; - "HomeLab/NixOS/admin/ssh" = HomeLab; - }); - }; -} diff --git a/scripts/toggle-light-dark.sh b/scripts/toggle-light-dark.sh deleted file mode 100755 index c4667bf..0000000 --- a/scripts/toggle-light-dark.sh +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env bash -# Toggle light- or dark-mode for your applications -# Usage: toggle [-m light|dark] [-g] - -################# -### Variables ### -################# - -THEME_LIGHT='tdpeuter-light' -THEME_DARK='tdpeuter-dark' -THEME_DEFAULT="${THEME_LIGHT}" - -STATE_DIR="${HOME}/.local/state/sisyphus" -STATE_FILE="${STATE_DIR}/theme" -BG_DIR="${HOME}/Nextcloud/Afbeeldingen/wallpapers" - -declare -A theme_next -theme_next[${THEME_LIGHT}]="${THEME_DARK}" -theme_next[${THEME_DARK}]="${THEME_LIGHT}" - -declare -A gsettings_alt -gsettings_alt[${THEME_LIGHT}]='default' -gsettings_alt[${THEME_DARK}]='prefer-dark' - -declare -A gtk_theme -gtk_theme[${THEME_LIGHT}]='Adwaita' -gtk_theme[${THEME_DARK}]='Adwaita-dark' - -declare -A wallpaper -wallpaper[${THEME_LIGHT}]="bg-light" -wallpaper[${THEME_DARK}]="bg-dark" - -############# -### Logic ### -############# - -# Parse options -while getopts ":m:g" option; do - case "${option}" in - m) - if [ "${OPTARG}" == 'light' ]; then - theme="${THEME_LIGHT}" - elif [ "${OPTARG}" == 'dark' ]; then - theme="${THEME_DARK}" - else - >&2 printf "Error: Invalid mode: '%s'.\nShould be either 'light' or 'dark'\n" "${option}" - exit 1 - fi - ;; - g) - current_state="$(cat "${STATE_FILE}")" - next_state="${theme_next[${current_state}]}" - if [ "${current_state}" == "${THEME_DARK}" ]; then - class='activated' - percentage=100 - fi - printf '{"alt": "%s", "tooltip": "Set theme to %s", "percentage": %d, "class": "%s"}' \ - "${gsettings_alt[${current_state}]}" "${next_state}" "${percentage:=0}" "${class:="none"}" - exit 0 - ;; - *) - >&2 printf "Error: Invalid option: '%s'.\n" "${option}" - exit 1 - ;; - esac -done -shift $(( OPTIND - 1 )) - -# Check if the state file exists -if ! [ -d "$(dirname ${STATE_FILE})" ]; then - mkdir -p "$(dirname ${STATE_FILE})" -fi - -# Choose next theme -previous_theme="$(cat ${STATE_FILE})" -if ! [[ -z "${previous_theme}" || "${theme}" ]]; then - theme="${theme_next[${previous_theme}]}" -fi -echo "${theme:=${THEME_DEFAULT}}" > "${STATE_FILE}" - -###################### -### Set all themes ### -###################### - -# Update terminal colors by sending it OSC sequences. -# Alternatively, you could use theme.sh (https://github.com/lemnos/theme.sh) -# Function below loosely based on theme.sh and https://codeberg.org/dnkl/foot/issues/708 -function update_terminal_colors() { - for pid in $(pgrep zsh); do - if [ "${theme}" == "${THEME_LIGHT}" ]; then - printf "\033]10;#000000\007" >> /proc/${pid}/fd/0 - printf "\033]11;#ffffff\007" >> /proc/${pid}/fd/0 - elif [ "${theme}" == "${THEME_DARK}" ]; then - printf "\033]10;#ffffff\007" >> /proc/${pid}/fd/0 - printf "\033]11;#000000\007" >> /proc/${pid}/fd/0 - fi - done -} - -# Foot -if [ "$(command -v foot)" ] ; then - # Make color theme switch 'permanent'. - echo "include=~/.config/foot/themes/${theme}.ini" > ~/.config/foot/theme.ini & - # We will have to change the terminal colors ourselves. - update_terminal_colors & -fi - -# GNOME (GTK) -if [ "$(command -v gsettings)" ]; then - gsettings set org.gnome.desktop.interface color-scheme "${gsettings_alt[${theme}]}" & - gsettings set org.gnome.desktop.interface gtk-theme "${gtk_theme[${theme}]}" & -fi - -# Kitty -if [ "$(command -v kitty)" ]; then - kitten themes --reload-in all --config-file-name theme.conf "${theme}" & -fi - -# Sway -if [ "$(command -v swaybg)" ]; then - bg_path="${BG_DIR}/${wallpaper[${theme}]}" - /run/current-system/sw/bin/cp "${bg_path}" "${STATE_DIR}/bg" - if [ "$(command -v swaymsg)" ]; then - pkill swaybg && swaymsg exec "swaybg -m fill -i ${STATE_DIR}/bg" & - elif [ "$(command -v hyprctl)" ]; then - pkill swaybg && hyprctl keyword exec "swaybg -m fill -i ${STATE_DIR}/bg" & - fi -fi - -# Vifm -if [ "$(command -v vifm)" ]; then - echo "colorscheme ${theme} Default-256 Default" > ~/.config/vifm/theme.conf - # Update all running instances - vifm --remote -c "colorscheme ${theme}" & -fi - -# Vim -if [ "$(command -v vim)" ]; then - echo "colorscheme ${theme}" > ~/.vim/theme.conf - # Update all running instances - for server in $(vim --serverlist); do - vim --servername "${server}" --remote-send "<C-\><C-N>:colorscheme ${theme}<CR>" - done -fi - diff --git a/scripts/toggle-notifications.sh b/scripts/toggle-notifications.sh deleted file mode 100755 index fe5624a..0000000 --- a/scripts/toggle-notifications.sh +++ /dev/null @@ -1,48 +0,0 @@ -#!/usr/bin/env bash -# Script to toggle Do not disturb mode for dunst - -# Get current state -if [ "$( command -v dunstctl )" ]; then - current_state="$( dunstctl is-paused )" -fi - -while getopts ":g" option; do - case "${option}" in - g) - if [ "${current_state}" == "false" ]; then - state='normal' - tooltip='Hide notifications' - class='none' - else - state='paused' - tooltip='Show notifications' - class='activated' - fi - printf '{"alt": "%s", "tooltip": "%s", "class": "%s" }' \ - "${state}" "${tooltip}" "${class}" - exit 0 - ;; - esac -done - -# Toggle -if [ "${current_state}" == "false" ] ; then - notify-send 'Hiding notifications' - sleep 5 - - if [ "$(command -v makoctl)" ]; then - makoctl set-mode do-not-disturb - fi - if [ "$(command -v dunstctl)" ]; then - dunstctl set-paused true - fi -else - if [ "$(command -v makoctl)" ]; then - makoctl set-mode default - fi - if [ "$(command -v dunstctl)" ]; then - dunstctl set-paused false - fi - - notify-send 'Showing notifications' -fi diff --git a/scripts/toggle-tailscale.sh b/scripts/toggle-tailscale.sh deleted file mode 100755 index 6f79489..0000000 --- a/scripts/toggle-tailscale.sh +++ /dev/null @@ -1,50 +0,0 @@ -#!/usr/bin/env bash -# Script to toggle Do not disturb mode for dunst - -STOPPED_MSG='Tailscale is stopped' - -# Check if tailscale is installed -if [ ! "$( command -v tailscale )" ]; then - echo 'Tailscale is not installed!' - exit 1 -fi - -# Get current state -status="$( tailscale status )" -current_state="$( grep -o "${STOPPED_MSG}" <<< "${status}" )" - -while getopts ":g" option; do - case "${option}" in - g) - if [ "${current_state}" == "${STOPPED_MSG}" ]; then - state='disconnected' - tooltip='Connect tailnet' - - printf '{"alt": "%s", "tooltip": "%s", "class": "%s" }' \ - "${state}" "${tooltip}" "${state}" - else - state='connected' - tooltip="${status:='Disconnect tailnet'}" - - printf '{"alt": "%s", "tooltip": "<tt>%q</tt>", "class": "%s" }' \ - "${state}" "${tooltip}" "${state}" - fi - - exit 0 - ;; - - *) - echo 'Invalid option' - exit 1 - ;; - esac -done - -# Toggle -if [ "${current_state}" == "${STOPPED_MSG}" ] ; then - notify-send 'Connecting tailnet' - notify-send 'Connected tailnet' "$( tailscale up )" -else - notify-send 'Disconnecting tailnet' - notify-send 'Disconnected tailnet' "$( tailscale down )" -fi diff --git a/stow/alacritty/.config/alacritty/alacritty.yml b/stow/alacritty/.config/alacritty/alacritty.yml index dcd08cc..4ea1c1b 100644 --- a/stow/alacritty/.config/alacritty/alacritty.yml +++ b/stow/alacritty/.config/alacritty/alacritty.yml @@ -102,41 +102,41 @@ window: #multiplier: 3 # Font configuration -font: +# font: # Normal (roman) font face - normal: + # normal: # Font family # # Default: # - (macOS) Menlo # - (Linux/BSD) monospace # - (Windows) Consolas - family: Letter + # family: Letter # The `style` can be specified to pick a specific face. - style: Extended + # style: Extended # Bold font face - bold: + # bold: # Font family # # If the bold family is not specified, it will fall back to the # value specified for the normal font. - family: Letter + # family: Letter # The `style` can be specified to pick a specific face. - style: Heavy + # style: Heavy # Italic font face - italic: + # italic: # Font family # # If the italic family is not specified, it will fall back to the # value specified for the normal font. - family: Letter + # family: Letter # The `style` can be specified to pick a specific face. - style: Oblique + # style: Oblique # Bold italic font face #bold_italic: diff --git a/stow/foot/.config/foot/foot.ini b/stow/foot/.config/foot/foot.ini deleted file mode 100644 index efcd8d9..0000000 --- a/stow/foot/.config/foot/foot.ini +++ /dev/null @@ -1,229 +0,0 @@ -# -*- conf -*- -# ~/.config/foot/foot.ini - -# Include the correct color scheme -include=~/.config/foot/theme.ini - -# shell=$SHELL (if set, otherwise user's default shell from /etc/passwd) -term=xterm-256color -# login-shell=no - -# app-id=foot # globally set wayland app-id. Default values are "foot" and "footclient" for desktop and server mode -# title=foot -# locked-title=no - -font=letter extended:size=10 -# font-bold=<bold variant of regular font> -# font-italic=<italic variant of regular font> -# font-bold-italic=<bold+italic variant of regular font> -# font-size-adjustment=0.5 -# line-height=<font metrics> -# letter-spacing=0 -# horizontal-letter-offset=0 -# vertical-letter-offset=0 -# underline-offset=<font metrics> -# underline-thickness=<font underline thickness> -# box-drawings-uses-font-glyphs=no -dpi-aware=yes - -# initial-window-size-pixels=700x500 # Or, -# initial-window-size-chars=<COLSxROWS> -# initial-window-mode=windowed -#pad=10x10 # optionally append 'center' -# resize-delay-ms=100 - -# notify=notify-send -a ${app-id} -i ${app-id} ${title} ${body} - -# bold-text-in-bright=no -# word-delimiters=,│`|:"'()[]{}<> -# selection-target=primary -# workers=<number of logical CPUs> -# utmp-helper=/usr/lib/utempter/utempter # When utmp backend is ‘libutempter’ (Linux) -# utmp-helper=/usr/libexec/ulog-helper # When utmp backend is ‘ulog’ (FreeBSD) - -[environment] -# name=value - -[bell] -urgent=yes -notify=yes -visual=yes -# command= -# command-focused=no - -[scrollback] -# lines=1000 -# multiplier=3.0 -# indicator-position=relative -# indicator-format="" - -[url] -# launch=xdg-open ${url} -# label-letters=sadfjklewcmpgh -# osc8-underline=url-mode -# protocols=http, https, ftp, ftps, file, gemini, gopher -# uri-characters=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-_.,~:;/?#@!$&%*+="'()[] - -[cursor] -# style=block -# color=<inverse foreground/background> -# blink=no -# beam-thickness=1.5 -# underline-thickness=<font underline thickness> - -[mouse] -# hide-when-typing=no -# alternate-scroll-mode=yes - -[touch] -# long-press-delay=400 - -[colors] -alpha=0.8 -# background=242424 -# foreground=ffffff -flash=b00020 -# flash-alpha=0.5 - -## Normal/regular colors (color palette 0-7) -# regular0=242424 # black -# regular1=f62b5a # red -# regular2=47b413 # green -# regular3=e3c401 # yellow -# regular4=24acd4 # blue -# regular5=f2affd # magenta -# regular6=13c299 # cyan -# regular7=e6e6e6 # white - -## Bright colors (color palette 8-15) -# bright0=616161 # bright black -# bright1=ff4d51 # bright red -# bright2=35d450 # bright green -# bright3=e9e836 # bright yellow -# bright4=5dc5f8 # bright blue -# bright5=feabf2 # bright magenta -# bright6=24dfc4 # bright cyan -# bright7=ffffff # bright white - -## dimmed colors (see foot.ini(5) man page) -# dim0=<not set> -# ... -# dim7=<not-set> - -## The remaining 256-color palette -# 16 = <256-color palette #16> -# ... -# 255 = <256-color palette #255> - -## Misc colors -# selection-foreground=<inverse foreground/background> -# selection-background=<inverse foreground/background> -# jump-labels=<regular0> <regular3> # black-on-yellow -# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue -# search-box-no-match=<regular0> <regular1> # black-on-red -# search-box-match=<regular0> <regular3> # black-on-yellow -# urls=<regular3> - -[csd] -preferred=none -# size=26 -# font=<primary font> -# color=<foreground color> -# hide-when-maximized=no -# double-click-to-maximize=yes -# border-width=0 -# border-color=<csd.color> -# button-width=26 -# button-color=<background color> -# button-minimize-color=<regular4> -# button-maximize-color=<regular2> -# button-close-color=<regular1> - -[key-bindings] -# scrollback-up-page=Shift+Page_Up -# scrollback-up-half-page=none -# scrollback-up-line=none -# scrollback-down-page=Shift+Page_Down -# scrollback-down-half-page=none -# scrollback-down-line=none -# scrollback-home=none -# scrollback-end=none -# clipboard-copy=Control+Shift+c XF86Copy -# clipboard-paste=Control+Shift+v XF86Paste -# primary-paste=Shift+Insert -# search-start=Control+Shift+r -# font-increase=Control+plus Control+equal Control+KP_Add -# font-decrease=Control+minus Control+KP_Subtract -# font-reset=Control+0 Control+KP_0 -# spawn-terminal=Control+Shift+n -# minimize=none -# maximize=none -# fullscreen=none -# pipe-visible=[sh -c "xurls | fuzzel | xargs -r firefox"] none -# pipe-scrollback=[sh -c "xurls | fuzzel | xargs -r firefox"] none -# pipe-selected=[xargs -r firefox] none -# show-urls-launch=Control+Shift+o -# show-urls-copy=none -# show-urls-persistent=none -# prompt-prev=Control+Shift+z -# prompt-next=Control+Shift+x -# unicode-input=Control+Shift+u -# noop=none - -[search-bindings] -# cancel=Control+g Control+c Escape -# commit=Return -# find-prev=Control+r -# find-next=Control+s -# cursor-left=Left Control+b -# cursor-left-word=Control+Left Mod1+b -# cursor-right=Right Control+f -# cursor-right-word=Control+Right Mod1+f -# cursor-home=Home Control+a -# cursor-end=End Control+e -# delete-prev=BackSpace -# delete-prev-word=Mod1+BackSpace Control+BackSpace -# delete-next=Delete -# delete-next-word=Mod1+d Control+Delete -# extend-char=Shift+Right -# extend-to-word-boundary=Control+w Control+Shift+Right -# extend-to-next-whitespace=Control+Shift+w -# extend-line-down=Shift+Down -# extend-backward-char=Shift+Left -# extend-backward-to-word-boundary=Control+Shift+Left -# extend-backward-to-next-whitespace=none -# extend-line-up=Shift+Up -# clipboard-paste=Control+v Control+Shift+v Control+y XF86Paste -# primary-paste=Shift+Insert -# unicode-input=none -# scrollback-up-page=Shift+Page_Up -# scrollback-up-half-page=none -# scrollback-up-line=none -# scrollback-down-page=Shift+Page_Down -# scrollback-down-half-page=none -# scrollback-down-line=none -# scrollback-home=none -# scrollback-end=none - -[url-bindings] -# cancel=Control+g Control+c Control+d Escape -# toggle-url-visible=t - -[text-bindings] -# \x03=Mod4+c # Map Super+c -> Ctrl+c - -[mouse-bindings] -# scrollback-up-mouse=BTN_BACK -# scrollback-down-mouse=BTN_FORWARD -# selection-override-modifiers=Shift -# primary-paste=BTN_MIDDLE -# select-begin=BTN_LEFT -# select-begin-block=Control+BTN_LEFT -# select-extend=BTN_RIGHT -# select-extend-character-wise=Control+BTN_RIGHT -# select-word=BTN_LEFT-2 -# select-word-whitespace=Control+BTN_LEFT-2 -# select-quote = BTN_LEFT-3 -# select-row=BTN_LEFT-4 - -# vim: ft=dosini diff --git a/stow/foot/.config/foot/themes/tdpeuter-dark.ini b/stow/foot/.config/foot/themes/tdpeuter-dark.ini deleted file mode 100644 index 4ee35d8..0000000 --- a/stow/foot/.config/foot/themes/tdpeuter-dark.ini +++ /dev/null @@ -1,64 +0,0 @@ -[colors] -# alpha=0.8 -background=171717 -foreground=dcdfe4 -# flash=b00020 -# flash-alpha=0.5 - -## Normal/regular colors (color palette 0-7) -regular0=242424 # black -# regular0=21222c -# regular1=f62b5a # red -regular1=c86564 -regular2=47b413 # green -# regular2=b2bc68 -regular3=e3c401 # yellow -# regular3=f7e03f -# regular4=24acd4 # blue -regular4=80a2be -regular5=f2affd # magenta -# color5 #b294bb -# regular6=13c299 # cyan -regular6=8abeb7 -regular7=e6e6e6 # white -# regular7=ffffff - -## Bright colors (color palette 8-15) -# bright0=616161 # bright black -# bright0=6272a4 -# bright1=ff4d51 # bright red -# color9 #C86564 -# bright2=35d450 # bright green -# color10 #B2BC68 -# bright3=e9e836 # bright yellow -# color11 #f7e03f -# bright4=5dc5f8 # bright blue -# color12 #80A2BE -# bright5=feabf2 # bright magenta -# bright5=b294bb -# bright6=24dfc4 # bright cyan -# bright6=8abeb7 -bright7=ffffff # bright white - -## dimmed colors (see foot.ini(5) man page) -# dim0=<not set> -# ... -# dim7=<not-set> - -## The remaining 256-color palette -# 16 = <256-color palette #16> -# ... -# 255 = <256-color palette #255> - -## Misc colors -# selection-foreground=<inverse foreground/background> -# selection-foreground=000000 -# selection-background=<inverse foreground/background> -# selection-background=fffacd -# jump-labels=<regular0> <regular3> # black-on-yellow -# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue -# search-box-no-match=<regular0> <regular1> # black-on-red -# search-box-match=<regular0> <regular3> # black-on-yellow -# urls=<regular3> -urls=0087bd - diff --git a/stow/foot/.config/foot/themes/tdpeuter-light.ini b/stow/foot/.config/foot/themes/tdpeuter-light.ini deleted file mode 100644 index daeebb9..0000000 --- a/stow/foot/.config/foot/themes/tdpeuter-light.ini +++ /dev/null @@ -1,64 +0,0 @@ -[colors] -# alpha=0.8 -background=fafafa -foreground=000000 -# flash=b00020 -# flash-alpha=0.5 - -## Normal/regular colors (color palette 0-7) -# regular0=242424 # black -# color0 #383A42 -# regular1=f62b5a # red -# color1 #E45649 -# regular2=47b413 # green -# color2 #40A14F -# regular3=e3c401 # yellow -# color3 #C18401 -# regular4=24acd4 # blue -regular4=0184bc -# regular5=f2affd # magenta -# color5 #A626A4 -# regular6=13c299 # cyan -# color6 #0997B3 -# regular7=e6e6e6 # white -# color7 #FAFAFA - -## Bright colors (color palette 8-15) -# bright0=616161 # bright black -# color8 #6272a4 -# bright1=ff4d51 # bright red -# color9 #E45649 -# bright2=35d450 # bright green -# color10 #40A14F -# bright3=e9e836 # bright yellow -# color11 #C18401 -# bright4=5dc5f8 # bright blue -# color12 #0184BC -# bright5=feabf2 # bright magenta -# color13 #A626A4 -# bright6=24dfc4 # bright cyan -# color14 #0997B3 -# bright7=ffffff # bright white -# color15 #FAFAFA - -## dimmed colors (see foot.ini(5) man page) -# dim0=<not set> -# ... -# dim7=<not-set> - -## The remaining 256-color palette -# 16 = <256-color palette #16> -# ... -# 255 = <256-color palette #255> - -## Misc colors -# selection-foreground=<inverse foreground/background> -selection-foreground=383a42 -# selection-background=<inverse foreground/background> -selection-background=bfceff -# jump-labels=<regular0> <regular3> # black-on-yellow -# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue -# search-box-no-match=<regular0> <regular1> # black-on-red -# search-box-match=<regular0> <regular3> # black-on-yellow -urls=f0f0f0 - diff --git a/stow/git/.config/git/config b/stow/git/.config/git/config deleted file mode 100644 index d0a80e2..0000000 --- a/stow/git/.config/git/config +++ /dev/null @@ -1,28 +0,0 @@ -[user] - name = "Tibo De Peuter" - email = "tibo@depeuter.dev" - signingkey = "0x9B11F5243089DB5B" - -[color] - ui = true - -[commit] - # Always sign commits - gpgsign = true - -[core] - editor = "vim"; - excludesFile = "~/.config/git/ignore" - -[help] - autocorrect = 15 - -[includeIf "gitdir:~/university/"] # Trailing backslash is necessary! - path = "~/.config/git/university" - -[init] - defaultBranch = "main" - -[safe] - directory = "/home/tdpeuter/university/sshfs" - diff --git a/stow/git/.config/git/ignore b/stow/git/.config/git/ignore deleted file mode 100644 index 4c5f88a..0000000 --- a/stow/git/.config/git/ignore +++ /dev/null @@ -1,2 +0,0 @@ -*~ -.*.swp diff --git a/stow/git/.config/git/university b/stow/git/.config/git/university deleted file mode 100644 index 35a9a3a..0000000 --- a/stow/git/.config/git/university +++ /dev/null @@ -1,3 +0,0 @@ -[user] - email = "tibo.depeuter@ugent.be" - diff --git a/stow/gnupg/.gnupg/gpg-agent.conf b/stow/gnupg/.gnupg/gpg-agent.conf deleted file mode 100644 index a11a3bd..0000000 --- a/stow/gnupg/.gnupg/gpg-agent.conf +++ /dev/null @@ -1,5 +0,0 @@ -enable-ssh-support -default-cache-ttl 60 -default-cache-ttl-ssh 60 -max-cache-ttl 120 -max-cache-ttl-ssh 120 diff --git a/stow/gnupg/.gnupg/gpg.conf b/stow/gnupg/.gnupg/gpg.conf deleted file mode 100644 index bb37abf..0000000 --- a/stow/gnupg/.gnupg/gpg.conf +++ /dev/null @@ -1,37 +0,0 @@ -# Use UTF-8 character encoding everywhere. -display-charset utf-8 -utf8-strings - -# When verifying a signature made from a subkey, require that the -# cross-certification "back signature" on the subkey is present and valid. -require-cross-certification - -# Method references -personal-cipher-preferences AES256 AES192 AES -personal-digest-preferences SHA512 SHA384 SHA256 -personal-compress-preferences ZLIB BZIP2 ZIP Uncompressed - -# New keys config -default-preference-list SHA512 SHA384 SHA256 AES256 AES192 AES ZLIB BZIP2 ZIP Uncompressed -cert-digest-algo SHA512 - -# Symmatric ops -s2k-digest-algo SHA512 -s2k-cipher-algo AES256 -# Disable cahcing of passphrase for symmatrical ops -no-symkey-cache - -# Don't leak comments or software version information -no-comments -no-emit-version - -# Display full fingerprints -keyid-format 0xlong -with-fingerprint - -# Other display preferences -list-options show-uid-validity -verify-options show-uid-validity - -# Enable smart card -use-agent diff --git a/stow/gnupg/.gnupg/scdaemon.conf b/stow/gnupg/.gnupg/scdaemon.conf deleted file mode 100644 index 9f0e146..0000000 --- a/stow/gnupg/.gnupg/scdaemon.conf +++ /dev/null @@ -1,7 +0,0 @@ -# Power down and ask PIN again after timout. -card-timeout 180 # 3 minutes - -# Fix repeatedly prompting for an already-inserted YubiKey. -# It works by disabling CCID-support, so it does not clash with pcsc. -disable-ccid - diff --git a/stow/hyprland/.config/hypr/docked.conf b/stow/hyprland/.config/hypr/docked.conf deleted file mode 100644 index ea4034f..0000000 --- a/stow/hyprland/.config/hypr/docked.conf +++ /dev/null @@ -1,6 +0,0 @@ -monitor=desc:BOE 0x08CF,1920x1080@60.0,640x3240,1.0 -monitor=desc:Hewlett Packard HP ZR2740w CNT319Y008,2560x1440@59.95,0x1800,1.0 -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,1920x1080@60.0,2560x1800,1.0 -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,transform,1 -monitor=desc:Samsung Electric Company SAMSUNG,1920x1080@60.0,640x0,0.6000000000000001 -monitor=desc:Samsung Electric Company SAMSUNG,disable diff --git a/stow/hyprland/.config/hypr/hy3.conf b/stow/hyprland/.config/hypr/hy3.conf deleted file mode 100644 index 7d3e999..0000000 --- a/stow/hyprland/.config/hypr/hy3.conf +++ /dev/null @@ -1,164 +0,0 @@ - -# TODO Do not hardcode this path -plugin = /nix/store/afivj8v5kfdsadxs4pa45vh0y65s3ajm-hy3-hl0.49.0/lib/libhy3.so - -general:layout = hy3 - -plugin { - hy3 { - # disable gaps when only one window is onscreen - # 0 - always show gaps - # 1 - hide gaps with a single window onscreen - # 2 - 1 but also show the window border - no_gaps_when_only = 1 # default: 0 - - # policy controlling what happens when a node is removed from a group, - # leaving only a group - # 0 = remove the nested group - # 1 = keep the nested group - # 2 = keep the nested group only if its parent is a tab group - node_collapse_policy = 2 # default: 2 - - # offset from group split direction when only one window is in a group - group_inset = 10 # default: 10 - - # if a tab group will automatically be created for the first window spawned in a workspace - tab_first_window = false - - # tab group settings - tabs { - # height of the tab bar - height = 10 # default: 22 - - # padding between the tab bar and its focused node - padding = 0 # default: 6 - - # the tab bar should animate in/out from the top instead of below the window - from_top = false # default: false - - # radius of tab bar corners - radius = 0 # default: 6 - - # tab bar border width - border_width = 2 # default: 2 - - # render the window title on the bar - render_text = false # default: true - - # center the window title - text_center = true # default: true - - # font to render the window title with - text_font = Sans # default: Sans - - # height of the window title - text_height = 8 # default: 8 - - # left padding of the window title - text_padding = 3 # default: 3 - - # active tab bar segment colors - #col.active = <color> # default: rgba(33ccff40) - #col.active.border = <color> # default: rgba(33ccffee) - #col.active.text = <color> # default: rgba(ffffffff) - - # active tab bar segment colors for bars on an unfocused monitor - #col.active_alt_monitor = <color> # default: rgba(60606040) - #col.active_alt_monitor.border = <color> # default: rgba(808080ee) - #col.active_alt_monitor.text = <color> # default: rgba(ffffffff) - - # focused tab bar segment colors (focused node in unfocused container) - #col.focused = <color> # default: rgba(60606040) - #col.focused.border = <color> # default: rgba(808080ee) - #col.focused.text = <color> # default: rgba(ffffffff) - - # inactive tab bar segment colors - col.inactive = rgba(a6a6a620) # default: rgba(30303020) - col.inactive.border = rgba(a6a6a6aa) # default: rgba(606060aa) - #col.inactive.text = <color> # default: rgba(ffffffff) - - # urgent tab bar segment colors - #col.urgent = <color> # default: rgba(ff223340) - #col.urgent.border = <color> # default: rgba(ff2233ee) - #col.urgent.text = <color> # default: rgba(ffffffff) - - # urgent tab bar segment colors - #col.locked = <color> # default: rgba(90903340) - #col.locked.border = <color> # default: rgba(909033ee) - #col.locked.text = <color> # default: rgba(ffffffff) - - # if tab backgrounds should be blurred - # Blur is only visible when the above colors are not opaque. - blur = true # default: true - - # opacity multiplier for tabs - # Applies to blur as well as the given colors. - opacity = 1.0 # default: 1.0 - } - - # autotiling settings - autotile { - # enable autotile - enable = true # default: false - - # make autotile-created groups ephemeral - ephemeral_groups = true # default: true - - # if a window would be squished smaller than this width, a vertical split will be created - # -1 = never automatically split vertically - # 0 = always automatically split vertically - # <number> = pixel width to split at - trigger_width = -1 # default: 0 - - # if a window would be squished smaller than this height, a horizontal split will be created - # -1 = never automatically split horizontally - # 0 = always automatically split horizontally - # <number> = pixel height to split at - trigger_height = 0 # default: 0 - - # a space or comma separated list of workspace ids where autotile should be enabled - # it's possible to create an exception rule by prefixing the definition with "not:" - # workspaces = 1,2 # autotiling will only be enabled on workspaces 1 and 2 - # workspaces = not:1,2 # autotiling will be enabled on all workspaces except 1 and 2 - workspaces = all # default: all - } - } -} - -# Keybinds - -# Navigation - -# Focus - -# First, unbind default -unbind = $flag, $up -unbind = $flag, $right -unbind = $flag, $down -unbind = $flag, $left - -unbind = $flag, up -unbind = $flag, right -unbind = $flag, down -unbind = $flag, left - -bind = $flag, $up, hy3:movefocus, u -bind = $flag, $right, hy3:movefocus, r -bind = $flag, $down, hy3:movefocus, d -bind = $flag, $left, hy3:movefocus, l - -bind = $flag, up, hy3:movefocus, u -bind = $flag, right, hy3:movefocus, r -bind = $flag, down, hy3:movefocus, d -bind = $flag, left, hy3:movefocus, l - -# Layout -bind = $flag, z, hy3:changegroup, opposite -bind = $flag, x, hy3:changegroup, toggletab -bind = $flag, c, hy3:changegroup, h -bind = $flag, v, hy3:changegroup, v - -bind = $flag, p, hy3:changefocus, raise -bind = $flag+Shift, p, hy3:changefocus, lower -bind = $flag, space, hy3:togglefocuslayer - diff --git a/stow/hyprland/.config/hypr/hyprland.conf b/stow/hyprland/.config/hypr/hyprland.conf deleted file mode 100644 index 6dc3b6b..0000000 --- a/stow/hyprland/.config/hypr/hyprland.conf +++ /dev/null @@ -1,279 +0,0 @@ -# ~/.config/hypr/hyperland.conf - -general { - border_size = 1 - no_border_on_floating = false - - gaps_in = 3 - gaps_out = 5 - gaps_workspaces = 0 - - col.inactive_border = 0xff444444 - col.active_border = 0xffffffff - col.nogroup_border = 0xffff00ff - - layout = dwindle - - no_focus_fallback = true - - resize_on_border = true - extend_border_grab_area = 5 - hover_icon_on_border = true - - allow_tearing = false - - resize_corner = 0 - - snap { - enabled = false - window_gap = 10 - monitor_gap = 10 - border_overlap = false - } -} - -decoration { - rounding = 0 - # rounding_power = 4.0 - - active_opacity = 1.0 - inactive_opacity = 1.0 - fullscreen_opacity = 1.0 - dim_inactive = false - dim_strength = 0.5 - dim_special = 0.2 - dim_around = 0.4 - - blur { - enabled = true - - size = 8 - passes = 1 - noise = 0.01 - contrast = 0.8 - brightness = 0.8 - vibrancy = 0.0 - vibrancy_darkness = 0.0 - - ignore_opacity = true - new_optimizations = true - xray = true - special = false - popups = false - # input_methods = false - } - - shadow { - enabled = false - - range = 4 - render_power = 3 - sharp = false - - ignore_window = true - - color = 0xee1a1a1a - color_inactive = 0xee1a1a1a - # offset = [0,0] - scale = 1.0 - } -} - -animations { - enabled = false - first_launch_animation = true -} - -gestures { - workspace_swipe = true - workspace_swipe_fingers = 3 - workspace_swipe_min_fingers = false - workspace_swipe_distance = 300 - workspace_swipe_invert = true - workspace_swipe_min_speed_to_force = 30 - workspace_swipe_cancel_ratio = 0.2 - workspace_swipe_direction_lock = true - workspace_swipe_direction_lock_threshold = 10 - - workspace_swipe_touch = false - workspace_swipe_touch_invert = false - - workspace_swipe_create_new = false - - workspace_swipe_forever = true - - workspace_swipe_use_r = false -} - -group { - auto_group = true - insert_after_current = true - focus_removed_window = true - drag_into_group = 1 - merge_groups_on_drag = true - merge_groups_on_groupbar = true - merge_floated_into_tiled_on_groupbar = false - group_on_movetoworkspace = false - - col.border_active = 0x66ffff00 - col.border_inactive = 0x66777700 - col.border_locked_active = 0x66ff5500 - col.border_locked_inactive = 0x66775500 - - groupbar { - enabled = true - font_family = misc:font_family - font_size = 8 - gradients = true - height = 14 - stacked = false - priority = 3 - render_titles = false - scrolling = true - - text_color = 0xffffffff - - col.active = 0x66ffff00 - col.inactive = 0x66777700 - col.locked_active = 0x66ff5500 - col.locked_inactive = 0x66775500 - } -} - -misc { - disable_hyprland_logo = true - disable_splash_rendering = true - - col.splash = 0xffffffff - - font_family = Letter - # splash_font_family = - force_default_wallpaper = -1 - vfr = true - vrr = 1 - mouse_move_enables_dpms = false - key_press_enables_dpms = true - always_follow_on_dnd = true - layers_hog_keyboard_focus = true - animate_manual_resizes = false - animate_mouse_windowdragging = false - disable_autoreload = true - enable_swallow = false - # swallow_regex = - # swallow_exception_regex = - focus_on_activate = true - mouse_move_focuses_monitor = true - render_ahead_of_time = false - render_ahead_safezone = 1 - allow_session_lock_restore = false - background_color = 0x018281 - close_special_on_empty = true - new_window_takes_over_fullscreen = 2 - exit_window_retains_fullscreen = false - initial_workspace_tracking = 1 - middle_click_paste = false - render_unfocused_fps = 12 - disable_xdg_env_checks = false - # disable_hyprland_qtutils_check = false - # lockdead_screen_delay = 1000 -} - -binds { - pass_mouse_when_bound = false - scroll_event_delay = 300 - workspace_back_and_forth = false - allow_workspace_cycles = false - workspace_center_on = 1 - focus_preferred_method = 0 - ignore_group_lock = false - # movefocus_cycles_fullscreen = true - # movefocus_cycles_groupfirst = false - disable_keybind_grabbing = false - window_direction_monitor_fallback = true - # allow_pin_fullscreen = true -} - -xwayland { - enabled = true - use_nearest_neighbor = true - force_zero_scaling = false -} - -opengl { - nvidia_anti_flicker = false -} - -render { - explicit_sync = 2 - explicit_sync_kms = 2 - direct_scanout = false - expand_undersized_textures = true - # xp_mode = false - # ctm_animation = 2 - # allow_early_buffer_release = true -} - -cursor { - sync_gsettings_theme = true - no_hardware_cursors = false - no_break_fs_vrr = false - min_refresh_rate = 24 - hotspot_padding = 1 - inactive_timeout = 10 - no_warps = false - persistent_warps = false - warp_on_change_workspace = 0 - # default_monitor = - zoom_factor = 1.0 - zoom_rigid = false - # enable_hypercursor = false - hide_on_key_press = true - hide_on_touch = true - # use_cpu_buffer = 2 - # warp_back_after_non_mouse_input = false -} - -ecosystem { - # no_update_news = false - # no_donation_nag = true -} - -exec-once = gnome-keyring-daemon --start --components=secrets -exec-once = dunst --verbosity crit -exec-once = waycorner -exec-once = waybar - -# TODO Replace with something else? -exec-once = wlsunset -t 2500 -l 50.51 -L 4.21 - -exec-once = nextcloud --background - -# Turn volume off at boot -exec-once = bash -c 'for i in $(seq 1 10); do pactl set-sink-mute @DEFAULT_SINK@ 1 && break; sleep 1; done' - -# STYLING -exec-once = swaybg -i "${HOME}/.local/state/sisyphus/bg" --mode=fill -env = XCURSOR_SIZE,24 - -# SHIFT CAPS CTRL/CONTROL ALT MOD2 MOD3 SUPER/WIN/LOGO/MOD4 MOD5 -$flag = MOD4 - -$left = h -$down = j -$up = k -$right = l - -$term = foot -$menu = j4-dmenu-desktop --dmenu="rofi -dmenu -i" --no-generic --usage-log="/home/tdpeuter/.local/state/dmenu.log" --term=$term -$lock = swaylock --daemonize - -# https://wiki.hyprland.org/Nvidia/#environment-variables -env = __GLX_VENDOR_LIBRARY_NAME,nvidia -env = LIBVA_DRIVER_NAME,nvidia -env = NVD_BACKEND,direct - -source = /home/tdpeuter/.config/hypr/input-output.conf -source = /home/tdpeuter/.config/hypr/keybinds.conf -source = /home/tdpeuter/.config/hypr/modes.conf -source = /home/tdpeuter/.config/hypr/hy3.conf # Sway tiling plugin - diff --git a/stow/hyprland/.config/hypr/input-output.conf b/stow/hyprland/.config/hypr/input-output.conf deleted file mode 100644 index 3c04c15..0000000 --- a/stow/hyprland/.config/hypr/input-output.conf +++ /dev/null @@ -1,62 +0,0 @@ -# ~/.config/hypr/input-output.conf - -input { - kb_layout = us,be,us - kb_variant = altgr-intl,iso-alternate,dvorak - - numlock_by_default = true - resolve_binds_by_sym = false - - repeat_rate = 25 - repeat_delay = 600 - - sensitivity = 0.0 - accel_profile = flat - force_no_accel = false - - left_handed = false - scroll_method = 2fg - scroll_button_lock = true - scroll_factor = 1.0 - natural_scroll = false - - follow_mouse = 2 - focus_on_close = 0 - mouse_refocus = true - float_switch_override_focus = 1 - special_fallthrough = false - off_window_axis_events = 1 - emulate_discrete_scroll = 1 - - touchpad { - disable_while_typing = true - natural_scroll = true - scroll_factor = 0.8 - middle_button_emulation = false - tap_button_map = lrm - clickfinger_behavior = false - tap-to-click = true - drag_lock = false - tap-and-drag = true - } -} - -device { - name = at-translated-set-2-keyboard - numlock_by_default = false -} - -monitor = , preferred, auto, 1 - -monitor = desc:BOE 0x08CF, preferred, 640x1440, 1 -monitor = desc:Hewlett Packard HP ZR2740w CNT319Y008, preferred, auto-up, 1 -# Vertical monitors -monitor = desc:Dell Inc. DELL P2214H 29C2937M4YTL, preferred, auto-right, 1, transform, 1 -monitor = desc:Samsung Electric Company S22C650, preferred, auto-right, 1, transform, 1 - -# TV -monitor = desc:Samsung Electric Company SAMSUNG, disable - -bindl = , switch:on:Lid Switch, exec, hyprctl keyword monitor "eDP-1, disable" -bindl = , switch:off:Lid Switch, exec, hyprctl keyword monitor "eDP-1, enable" - diff --git a/stow/hyprland/.config/hypr/keybinds.conf b/stow/hyprland/.config/hypr/keybinds.conf deleted file mode 100644 index 1a4f1e1..0000000 --- a/stow/hyprland/.config/hypr/keybinds.conf +++ /dev/null @@ -1,180 +0,0 @@ -$notify = "${SCRIPT_DIR}/notify.sh" - -# Navigation - -# Focus -bind = $flag, $up, movefocus, u -bind = $flag, $right, movefocus, r -bind = $flag, $down, movefocus, d -bind = $flag, $left, movefocus, l - -bind = $flag, up, movefocus, u -bind = $flag, right, movefocus, r -bind = $flag, down, movefocus, d -bind = $flag, left, movefocus, l - -# Move windows -bind = $flag+Shift, $up, movewindow, u -bind = $flag+Shift, $right, movewindow, r -bind = $flag+Shift, $down, movewindow, d -bind = $flag+Shift, $left, movewindow, l - -bind = $flag+Shift, up, movewindow, u -bind = $flag+Shift, right, movewindow, r -bind = $flag+Shift, down, movewindow, d -bind = $flag+Shift, left, movewindow, l - -# $flag+Next move scratchpad -# $flag+KP_Next move scratchpad -# $flag+Prior scratchpad show -# $flag+KP_Prior scratchpad show -bind = $flag, Next, movetoworkspace, special:scratchpad -bind = $flag, KP_Next, movetoworkspace, special:scratchpad - -bind = $flag, Prior, togglespecialworkspace, special:scratchpad -bind = $flag, Prior, movetoworkspace, special:scratchpad -bind = $flag, Prior, togglespecialworkspace, special:scratchpad - -# bind = $flag, Next, movetoworkspace, special:magic -# bind = $flag, Next, togglespecialworkspace, magic - -# bind = $flag, KP_Next, togglespecialworkspace, magic -# bind = $flag, KP_Next, movetoworkspace, +0 -# bind = $flag, KP_Next, togglespecialworkspace, magic -# bind = $flag, KP_Next, movetoworkspace, special:magic -# bind = $flag, KP_Next, togglespecialworkspace, magic - -# Layouts -bind = $flag, f, togglefloating -bind = $flag+Shift, f, settiled - -bind = $flag, s, pin -bind = $flag, s, setfloating -bind = $flag+Shift, s, pin -bind = $flag+Shift, s, settiled - -bind = $flag, F11, fullscreen, 1 -bind = $flag+Shift, F11, fullscreen, 0 - -# Workspaces - -$ws1 = 1 -$ws2 = 2 -$ws3 = 3 -$ws4 = 4 -$ws5 = 5 -$ws6 = 6 -$ws7 = 7 -$ws8 = 8 -$ws9 = 9 -$ws10 = 10 -$ws11 = 11 -$ws12 = 12 - -# Focus a specific workspace -bind = $flag, 1, workspace, $ws1 -bind = $flag, 2, workspace, $ws2 -bind = $flag, 3, workspace, $ws3 -bind = $flag, 4, workspace, $ws4 -bind = $flag, 5, workspace, $ws5 -bind = $flag, 6, workspace, $ws6 -bind = $flag, 7, workspace, $ws7 -bind = $flag, 8, workspace, $ws8 -bind = $flag, 9, workspace, $ws9 -bind = $flag, 0, workspace, $ws10 -bind = $flag, minus, workspace, $ws11 -bind = $flag, equal, workspace, $ws12 - -# Move window to a specific workspace -bind = $flag+Shift, 1, movetoworkspace, $ws1 -bind = $flag+Shift, 2, movetoworkspace, $ws2 -bind = $flag+Shift, 3, movetoworkspace, $ws3 -bind = $flag+Shift, 4, movetoworkspace, $ws4 -bind = $flag+Shift, 5, movetoworkspace, $ws5 -bind = $flag+Shift, 6, movetoworkspace, $ws6 -bind = $flag+Shift, 7, movetoworkspace, $ws7 -bind = $flag+Shift, 8, movetoworkspace, $ws8 -bind = $flag+Shift, 9, movetoworkspace, $ws9 -bind = $flag+Shift, 0, movetoworkspace, $ws10 -bind = $flag+Shift, Minus, movetoworkspace, $ws11 -bind = $flag+Shift, Equal, movetoworkspace, $ws12 - -# Go through workspaces in order -bind = $flag+Ctrl, $left, workspace, e-1 -bind = $flag+Ctrl, $right, workspace, e+1 - -bind = $flag+Ctrl, left, workspace, e-1 -bind = $flag+Ctrl, right, workspace, e+1 - -bind = $flag+Ctrl+Shift, $left, movetoworkspace, e-1 -bind = $flag+Ctrl+Shift, $right, movetoworkspace, e+1 - -bind = $flag+Ctrl+Shift, left, movetoworkspace, e-1 -bind = $flag+Ctrl+Shift, right, movetoworkspace, e+1 - -# GNOME-like keybinds -bind = $flag+Alt, $left, workspace, e-1 -bind = $flag+Alt, $right, workspace, e+1 - -bind = $flag+Alt, left, workspace, e-1 -bind = $flag+Alt, right, workspace, e+1 - -bind = $flag+Alt+Shift, $left, movetoworkspace, e-1 -bind = $flag+Alt+Shift, $right, movetoworkspace, e+1 - -bind = $flag+Alt+Shift, left, movetoworkspace, e-1 -bind = $flag+Alt+Shift, right, movetoworkspace, e+1 - -# System - -# Brightness -bind = , XF86MonBrightnessDown, exec, brightnessctl -e s 5%- && $notify -b -bind = , XF86MonBrightnessUp, exec, brightnessctl -e s +5% && $notify -b - -# Audio -bind = , XF86AudioRaiseVolume, exec, wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 2%+ && $notify -v -bind = , XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%- && $notify -v -bind = , XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && $notify -v -bind = , XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle - -# Media -bind = , XF86AudioPlay, exec, playerctl play-pause -bind = , XF86AudioPrev, exec, playerctl previous -bind = , XF86AudioNext, exec, playerctl next - -bind = Shift, XF86AudioMute, exec, playerctl play-pause -bind = Shift, XF86AudioLowerVolume, exec, playerctl previous -bind = Shift, XF86AudioRaiseVolume, exec, playerctl next - -# Other special keys -bind = , XF86Calculator, exec, qalculate-gtk - -# Shortcuts - -# Reload -bind = Alt+Shift, r, exec, "hyperctl reload" -bind = Ctrl+Alt+Shift, r, forcerendererreload -bind = Alt+Shift, e, exit - -# Kill a window -bind = $flag, q, closewindow, activewindow - -# Start a terminal -bind = $flag, Return, exec, $term -bind = CTRL&ALT, T, exec, $term -# Application menu -bind = Alt, Space, exec, $menu -bind = Alt, Tab, focuscurrentorlast - -bind = $flag, e, exec, $term -e vifm -bind = Ctrl+Shift, Escape, exec, $term -e zenith - -bind = Ctrl+Shift, a, exec, notify-send "hole!" && hyprctl setcursor _ 87 && sleep 5 && hyprctl setcursor _ 24 - -# bind = $flag, mouse_up, movefocus, l -bind = SUPER, mouse_down, workspace, e-1 -bind = SUPER, mouse_up, workspace, e+1 -# bind = $flag, mouse_down, movefocus, r - -bind = $flag, Delete, exec, $lock - diff --git a/stow/hyprland/.config/hypr/modes.conf b/stow/hyprland/.config/hypr/modes.conf deleted file mode 100644 index 61bbbf0..0000000 --- a/stow/hyprland/.config/hypr/modes.conf +++ /dev/null @@ -1,38 +0,0 @@ -# System actions -$mode_system = System (l)ock, (s)leep, (h)ibernate, (r)eboot, (Shift+s)hutdown -bind = Ctrl+Alt, Delete, submap, $mode_system -submap = $mode_system - -bind = , l, exec, $lock -bind = , l, submap, reset -bind = , s, exec, $lock, exec, systemctl suspend -bind = , s, submap, reset -bind = , h, exec, $lock, exec, systemctl hibernate -bind = , h, submap, reset -bind = , r, exec, systemctl reboot -bind = Shift, s, exec, systemctl poweroff -i - -bind = Ctrl+Alt, Delete, submap, reset -bind = , Escape, submap, reset -bind = , Return, submap, reset - -submap = reset - -# Launcher -$mode_launcher = Launch (f)irefox, (t)hunderbird, (l)ogseq. -bind = $flag, O, submap, $mode_launcher -submap = $mode_launcher - -bind = , F, exec, firefox -bind = , F, submap, reset -bind = , L, exec, logseq -bind = , L, submap, reset -bind = , T, exec, thunderbird -bind = , T, submap, reset - -bind = $flag, O, submap, reset -bind = , Escape, submap, reset -bind = , Return, submap, reset - -submap = reset - diff --git a/stow/hyprland/.config/hypr/monitors.conf b/stow/hyprland/.config/hypr/monitors.conf deleted file mode 100644 index 4b551d3..0000000 --- a/stow/hyprland/.config/hypr/monitors.conf +++ /dev/null @@ -1,10 +0,0 @@ -# Generated by nwg-displays on 2025-01-27 at 13:58:39. Do not edit manually. - -monitor=desc:BOE 0x08CF,1920x1080@60.0,0x0,1.0 -monitor=desc:Hewlett Packard HP ZR2740w CNT319Y008,2560x1440@59.95,0x1800,1.0 -monitor=desc:Hewlett Packard HP ZR2740w CNT319Y008,disable -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,1920x1080@60.0,2560x1800,1.0 -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,transform,1 -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,disable -monitor=desc:Samsung Electric Company SAMSUNG,0x0@60.0,-1x-1,1.0 -monitor=desc:Samsung Electric Company SAMSUNG,disable diff --git a/stow/hyprland/.config/hypr/undocked.conf b/stow/hyprland/.config/hypr/undocked.conf deleted file mode 100644 index 6f27cc4..0000000 --- a/stow/hyprland/.config/hypr/undocked.conf +++ /dev/null @@ -1,9 +0,0 @@ -monitor=desc:BOE 0x08CF,1920x1080@60.0,0x0,1.0 -monitor=desc:Hewlett Packard HP ZR2740w CNT319Y008,2560x1440@59.95,0x1800,1.0 -monitor=desc:Hewlett Packard HP ZR2740w CNT319Y008,disable -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,1920x1080@60.0,2560x1800,1.0 -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,transform,1 -monitor=desc:Dell Inc. DELL P2214H 29C2937M4YTL,disable -monitor=desc:Samsung Electric Company SAMSUNG,0x0@60.0,-1x-1,1.0 -monitor=desc:Samsung Electric Company SAMSUNG,disable - diff --git a/stow/hyprland/.config/hypr/workspaces.conf b/stow/hyprland/.config/hypr/workspaces.conf deleted file mode 100644 index e69de29..0000000 diff --git a/stow/kitty/.config/kitty/kitty.conf b/stow/kitty/.config/kitty/kitty.conf deleted file mode 100644 index b201ac2..0000000 --- a/stow/kitty/.config/kitty/kitty.conf +++ /dev/null @@ -1,2365 +0,0 @@ -# vim:fileencoding=utf-8:foldmethod=marker - -include ./theme.conf - -#: Fonts {{{ - -#: kitty has very powerful font management. You can configure -#: individual font faces and even specify special fonts for particular -#: characters. - -font_family Letter Extended -bold_font Letter Semibold Extended -italic_font Letter Extended Oblique -bold_italic_font Letter Semibold Extended Oblique - -#: You can specify different fonts for the bold/italic/bold-italic -#: variants. To get a full list of supported fonts use the `kitty -#: +list-fonts` command. By default they are derived automatically, by -#: the OSes font system. When bold_font or bold_italic_font is set to -#: auto on macOS, the priority of bold fonts is semi-bold, bold, -#: heavy. Setting them manually is useful for font families that have -#: many weight variants like Book, Medium, Thick, etc. For example:: - -#: font_family Operator Mono Book -#: bold_font Operator Mono Medium -#: italic_font Operator Mono Book Italic -#: bold_italic_font Operator Mono Medium Italic - -# font_size 11.0 - -#: Font size (in pts) - -# force_ltr no - -#: kitty does not support BIDI (bidirectional text), however, for RTL -#: scripts, words are automatically displayed in RTL. That is to say, -#: in an RTL script, the words "HELLO WORLD" display in kitty as -#: "WORLD HELLO", and if you try to select a substring of an RTL- -#: shaped string, you will get the character that would be there had -#: the the string been LTR. For example, assuming the Hebrew word -#: ירושלים, selecting the character that on the screen appears to be ם -#: actually writes into the selection buffer the character י. kitty's -#: default behavior is useful in conjunction with a filter to reverse -#: the word order, however, if you wish to manipulate RTL glyphs, it -#: can be very challenging to work with, so this option is provided to -#: turn it off. Furthermore, this option can be used with the command -#: line program GNU FriBidi -#: <https://github.com/fribidi/fribidi#executable> to get BIDI -#: support, because it will force kitty to always treat the text as -#: LTR, which FriBidi expects for terminals. - -# symbol_map - -#: E.g. symbol_map U+E0A0-U+E0A3,U+E0C0-U+E0C7 PowerlineSymbols - -#: Map the specified Unicode codepoints to a particular font. Useful -#: if you need special rendering for some symbols, such as for -#: Powerline. Avoids the need for patched fonts. Each Unicode code -#: point is specified in the form `U+<code point in hexadecimal>`. You -#: can specify multiple code points, separated by commas and ranges -#: separated by hyphens. This option can be specified multiple times. -#: The syntax is:: - -#: symbol_map codepoints Font Family Name - -# narrow_symbols - -#: E.g. narrow_symbols U+E0A0-U+E0A3,U+E0C0-U+E0C7 1 - -#: Usually, for Private Use Unicode characters and some symbol/dingbat -#: characters, if the character is followed by one or more spaces, -#: kitty will use those extra cells to render the character larger, if -#: the character in the font has a wide aspect ratio. Using this -#: option you can force kitty to restrict the specified code points to -#: render in the specified number of cells (defaulting to one cell). -#: This option can be specified multiple times. The syntax is:: - -#: narrow_symbols codepoints [optionally the number of cells] - -disable_ligatures always - -#: Choose how you want to handle multi-character ligatures. The -#: default is to always render them. You can tell kitty to not render -#: them when the cursor is over them by using cursor to make editing -#: easier, or have kitty never render them at all by using always, if -#: you don't like them. The ligature strategy can be set per-window -#: either using the kitty remote control facility or by defining -#: shortcuts for it in kitty.conf, for example:: - -#: map alt+1 disable_ligatures_in active always -#: map alt+2 disable_ligatures_in all never -#: map alt+3 disable_ligatures_in tab cursor - -#: Note that this refers to programming ligatures, typically -#: implemented using the calt OpenType feature. For disabling general -#: ligatures, use the font_features option. - -# font_features - -#: E.g. font_features none - -#: Choose exactly which OpenType features to enable or disable. This -#: is useful as some fonts might have features worthwhile in a -#: terminal. For example, Fira Code includes a discretionary feature, -#: zero, which in that font changes the appearance of the zero (0), to -#: make it more easily distinguishable from Ø. Fira Code also includes -#: other discretionary features known as Stylistic Sets which have the -#: tags ss01 through ss20. - -#: For the exact syntax to use for individual features, see the -#: HarfBuzz documentation <https://harfbuzz.github.io/harfbuzz-hb- -#: common.html#hb-feature-from-string>. - -#: Note that this code is indexed by PostScript name, and not the font -#: family. This allows you to define very precise feature settings; -#: e.g. you can disable a feature in the italic font but not in the -#: regular font. - -#: On Linux, font features are first read from the FontConfig database -#: and then this option is applied, so they can be configured in a -#: single, central place. - -#: To get the PostScript name for a font, use `kitty +list-fonts -#: --psnames`: - -#: .. code-block:: sh - -#: $ kitty +list-fonts --psnames | grep Fira -#: Fira Code -#: Fira Code Bold (FiraCode-Bold) -#: Fira Code Light (FiraCode-Light) -#: Fira Code Medium (FiraCode-Medium) -#: Fira Code Regular (FiraCode-Regular) -#: Fira Code Retina (FiraCode-Retina) - -#: The part in brackets is the PostScript name. - -#: Enable alternate zero and oldstyle numerals:: - -#: font_features FiraCode-Retina +zero +onum - -#: Enable only alternate zero in the bold font:: - -#: font_features FiraCode-Bold +zero - -#: Disable the normal ligatures, but keep the calt feature which (in -#: this font) breaks up monotony:: - -#: font_features TT2020StyleB-Regular -liga +calt - -#: In conjunction with force_ltr, you may want to disable Arabic -#: shaping entirely, and only look at their isolated forms if they -#: show up in a document. You can do this with e.g.:: - -#: font_features UnifontMedium +isol -medi -fina -init - -# modify_font - -#: Modify font characteristics such as the position or thickness of -#: the underline and strikethrough. The modifications can have the -#: suffix px for pixels or % for percentage of original value. No -#: suffix means use pts. For example:: - -#: modify_font underline_position -2 -#: modify_font underline_thickness 150% -#: modify_font strikethrough_position 2px - -#: Additionally, you can modify the size of the cell in which each -#: font glyph is rendered and the baseline at which the glyph is -#: placed in the cell. For example:: - -#: modify_font cell_width 80% -#: modify_font cell_height -2px -#: modify_font baseline 3 - -#: Note that modifying the baseline will automatically adjust the -#: underline and strikethrough positions by the same amount. -#: Increasing the baseline raises glyphs inside the cell and -#: decreasing it lowers them. Decreasing the cell size might cause -#: rendering artifacts, so use with care. - -# box_drawing_scale 0.001, 1, 1.5, 2 - -#: The sizes of the lines used for the box drawing Unicode characters. -#: These values are in pts. They will be scaled by the monitor DPI to -#: arrive at a pixel value. There must be four values corresponding to -#: thin, normal, thick, and very thick lines. - -# undercurl_style thin-sparse - -#: The style with which undercurls are rendered. This option takes the -#: form (thin|thick)-(sparse|dense). Thin and thick control the -#: thickness of the undercurl. Sparse and dense control how often the -#: curl oscillates. With sparse the curl will peak once per character, -#: with dense twice. - -# text_composition_strategy platform - -#: Control how kitty composites text glyphs onto the background color. -#: The default value of platform tries for text rendering as close to -#: "native" for the platform kitty is running on as possible. - -#: A value of legacy uses the old (pre kitty 0.28) strategy for how -#: glyphs are composited. This will make dark text on light -#: backgrounds look thicker and light text on dark backgrounds -#: thinner. It might also make some text appear like the strokes are -#: uneven. - -#: You can fine tune the actual contrast curve used for glyph -#: composition by specifying two space separated numbers for this -#: setting. - -#: The first number is the gamma adjustment, which controls the -#: thickness of dark text on light backgrounds. Increasing the value -#: will make text appear thicker. The default value for this is 1.0 on -#: Linux and 1.7 on macOS. Valid values are 0.01 and above. The result -#: is scaled based on the luminance difference between the background -#: and the foreground. Dark text on light backgrounds receives the -#: full impact of the curve while light text on dark backgrounds is -#: affected very little. - -#: The second number is an additional multiplicative contrast. It is -#: percentage ranging from 0 to 100. The default value is 0 on Linux -#: and 30 on macOS. - -#: If you wish to achieve similar looking thickness in light and dark -#: themes, a good way to experiment is start by setting the value to -#: 1.0 0 and use a dark theme. Then adjust the second parameter until -#: it looks good. Then switch to a light theme and adjust the first -#: parameter until the perceived thickness matches the dark theme. - -#: }}} - -#: Cursor customization {{{ - -# cursor #cccccc - -#: Default cursor color. If set to the special value none the cursor -#: will be rendered with a "reverse video" effect. It's color will be -#: the color of the text in the cell it is over and the text will be -#: rendered with the background color of the cell. Note that if the -#: program running in the terminal sets a cursor color, this takes -#: precedence. Also, the cursor colors are modified if the cell -#: background and foreground colors have very low contrast. - -# cursor_text_color #111111 - -#: The color of text under the cursor. If you want it rendered with -#: the background color of the cell underneath instead, use the -#: special keyword: background. Note that if cursor is set to none -#: then this option is ignored. - -# cursor_shape block - -#: The cursor shape can be one of block, beam, underline. Note that -#: when reloading the config this will be changed only if the cursor -#: shape has not been set by the program running in the terminal. This -#: sets the default cursor shape, applications running in the terminal -#: can override it. In particular, shell integration -#: <https://sw.kovidgoyal.net/kitty/shell-integration/> in kitty sets -#: the cursor shape to beam at shell prompts. You can avoid this by -#: setting shell_integration to no-cursor. - -# cursor_beam_thickness 1.5 - -#: The thickness of the beam cursor (in pts). - -# cursor_underline_thickness 2.0 - -#: The thickness of the underline cursor (in pts). - -# cursor_blink_interval -1 - -#: The interval to blink the cursor (in seconds). Set to zero to -#: disable blinking. Negative values mean use system default. Note -#: that the minimum interval will be limited to repaint_delay. - -# cursor_stop_blinking_after 15.0 - -#: Stop blinking cursor after the specified number of seconds of -#: keyboard inactivity. Set to zero to never stop blinking. - -#: }}} - -#: Scrollback {{{ - -# scrollback_lines 2000 - -#: Number of lines of history to keep in memory for scrolling back. -#: Memory is allocated on demand. Negative numbers are (effectively) -#: infinite scrollback. Note that using very large scrollback is not -#: recommended as it can slow down performance of the terminal and -#: also use large amounts of RAM. Instead, consider using -#: scrollback_pager_history_size. Note that on config reload if this -#: is changed it will only affect newly created windows, not existing -#: ones. - -# scrollback_pager less --chop-long-lines --RAW-CONTROL-CHARS +INPUT_LINE_NUMBER - -#: Program with which to view scrollback in a new window. The -#: scrollback buffer is passed as STDIN to this program. If you change -#: it, make sure the program you use can handle ANSI escape sequences -#: for colors and text formatting. INPUT_LINE_NUMBER in the command -#: line above will be replaced by an integer representing which line -#: should be at the top of the screen. Similarly CURSOR_LINE and -#: CURSOR_COLUMN will be replaced by the current cursor position or -#: set to 0 if there is no cursor, for example, when showing the last -#: command output. - -# scrollback_pager_history_size 0 - -#: Separate scrollback history size (in MB), used only for browsing -#: the scrollback buffer with pager. This separate buffer is not -#: available for interactive scrolling but will be piped to the pager -#: program when viewing scrollback buffer in a separate window. The -#: current implementation stores the data in UTF-8, so approximatively -#: 10000 lines per megabyte at 100 chars per line, for pure ASCII, -#: unformatted text. A value of zero or less disables this feature. -#: The maximum allowed size is 4GB. Note that on config reload if this -#: is changed it will only affect newly created windows, not existing -#: ones. - -# scrollback_fill_enlarged_window no - -#: Fill new space with lines from the scrollback buffer after -#: enlarging a window. - -# wheel_scroll_multiplier 5.0 - -#: Multiplier for the number of lines scrolled by the mouse wheel. -#: Note that this is only used for low precision scrolling devices, -#: not for high precision scrolling devices on platforms such as macOS -#: and Wayland. Use negative numbers to change scroll direction. See -#: also wheel_scroll_min_lines. - -# wheel_scroll_min_lines 1 - -#: The minimum number of lines scrolled by the mouse wheel. The scroll -#: multiplier wheel_scroll_multiplier only takes effect after it -#: reaches this number. Note that this is only used for low precision -#: scrolling devices like wheel mice that scroll by very small amounts -#: when using the wheel. With a negative number, the minimum number of -#: lines will always be added. - -touch_scroll_multiplier 2.0 - -#: Multiplier for the number of lines scrolled by a touchpad. Note -#: that this is only used for high precision scrolling devices on -#: platforms such as macOS and Wayland. Use negative numbers to change -#: scroll direction. - -#: }}} - -#: Mouse {{{ - -# mouse_hide_wait 3.0 - -#: Hide mouse cursor after the specified number of seconds of the -#: mouse not being used. Set to zero to disable mouse cursor hiding. -#: Set to a negative value to hide the mouse cursor immediately when -#: typing text. Disabled by default on macOS as getting it to work -#: robustly with the ever-changing sea of bugs that is Cocoa is too -#: much effort. - -url_color #94E2D5 -url_style straight - -#: The color and style for highlighting URLs on mouse-over. url_style -#: can be one of: none, straight, double, curly, dotted, dashed. - -# open_url_with default - -#: The program to open clicked URLs. The special value default with -#: first look for any URL handlers defined via the open_actions -#: <https://sw.kovidgoyal.net/kitty/open_actions/> facility and if non -#: are found, it will use the Operating System's default URL handler -#: (open on macOS and xdg-open on Linux). - -# url_prefixes file ftp ftps gemini git gopher http https irc ircs kitty mailto news sftp ssh - -#: The set of URL prefixes to look for when detecting a URL under the -#: mouse cursor. - -detect_urls yes - -#: Detect URLs under the mouse. Detected URLs are highlighted with an -#: underline and the mouse cursor becomes a hand over them. Even if -#: this option is disabled, URLs are still clickable. - -# url_excluded_characters - -#: Additional characters to be disallowed from URLs, when detecting -#: URLs under the mouse cursor. By default, all characters that are -#: legal in URLs are allowed. Additionally, newlines are allowed (but -#: stripped). This is to accommodate programs such as mutt that add -#: hard line breaks even for continued lines. \n can be added to this -#: option to disable this behavior. Special characters can be -#: specified using backslash escapes, to specify a backslash use a -#: double backslash. - -show_hyperlink_targets yes - -#: When the mouse hovers over a terminal hyperlink, show the actual -#: URL that will be activated when the hyperlink is clicked. - -# copy_on_select no - -#: Copy to clipboard or a private buffer on select. With this set to -#: clipboard, selecting text with the mouse will cause the text to be -#: copied to clipboard. Useful on platforms such as macOS that do not -#: have the concept of primary selection. You can instead specify a -#: name such as a1 to copy to a private kitty buffer. Map a shortcut -#: with the paste_from_buffer action to paste from this private -#: buffer. For example:: - -#: copy_on_select a1 -#: map shift+cmd+v paste_from_buffer a1 - -#: Note that copying to the clipboard is a security risk, as all -#: programs, including websites open in your browser can read the -#: contents of the system clipboard. - -# paste_actions quote-urls-at-prompt - -#: A comma separated list of actions to take when pasting text into -#: the terminal. The supported paste actions are: - -#: quote-urls-at-prompt: -#: If the text being pasted is a URL and the cursor is at a shell prompt, -#: automatically quote the URL (needs shell_integration). -#: confirm: -#: Confirm the paste if bracketed paste mode is not active or there is -#: a large amount of text being pasted. -#: filter: -#: Run the filter_paste() function from the file paste-actions.py in -#: the kitty config directory on the pasted text. The text returned by the -#: function will be actually pasted. - -# strip_trailing_spaces never - -#: Remove spaces at the end of lines when copying to clipboard. A -#: value of smart will do it when using normal selections, but not -#: rectangle selections. A value of always will always do it. - -# select_by_word_characters @-./_~?&=%+# - -#: Characters considered part of a word when double clicking. In -#: addition to these characters any character that is marked as an -#: alphanumeric character in the Unicode database will be matched. - -# select_by_word_characters_forward - -#: Characters considered part of a word when extending the selection -#: forward on double clicking. In addition to these characters any -#: character that is marked as an alphanumeric character in the -#: Unicode database will be matched. - -#: If empty (default) select_by_word_characters will be used for both -#: directions. - -# click_interval -1.0 - -#: The interval between successive clicks to detect double/triple -#: clicks (in seconds). Negative numbers will use the system default -#: instead, if available, or fallback to 0.5. - -# focus_follows_mouse no - -#: Set the active window to the window under the mouse when moving the -#: mouse around. - -# pointer_shape_when_grabbed arrow - -#: The shape of the mouse pointer when the program running in the -#: terminal grabs the mouse. Valid values are: arrow, beam and hand. - -# default_pointer_shape beam - -#: The default shape of the mouse pointer. Valid values are: arrow, -#: beam and hand. - -# pointer_shape_when_dragging beam - -#: The default shape of the mouse pointer when dragging across text. -#: Valid values are: arrow, beam and hand. - -#: Mouse actions {{{ - -#: Mouse buttons can be mapped to perform arbitrary actions. The -#: syntax is: - -#: .. code-block:: none - -#: mouse_map button-name event-type modes action - -#: Where button-name is one of left, middle, right, b1 ... b8 with -#: added keyboard modifiers. For example: ctrl+shift+left refers to -#: holding the Ctrl+Shift keys while clicking with the left mouse -#: button. The value b1 ... b8 can be used to refer to up to eight -#: buttons on a mouse. - -#: event-type is one of press, release, doublepress, triplepress, -#: click, doubleclick. modes indicates whether the action is performed -#: when the mouse is grabbed by the program running in the terminal, -#: or not. The values are grabbed or ungrabbed or a comma separated -#: combination of them. grabbed refers to when the program running in -#: the terminal has requested mouse events. Note that the click and -#: double click events have a delay of click_interval to disambiguate -#: from double and triple presses. - -#: You can run kitty with the kitty --debug-input command line option -#: to see mouse events. See the builtin actions below to get a sense -#: of what is possible. - -#: If you want to unmap an action, map it to no_op. For example, to -#: disable opening of URLs with a plain click:: - -#: mouse_map left click ungrabbed no_op - -#: See all the mappable actions including mouse actions here -#: <https://sw.kovidgoyal.net/kitty/actions/>. - -#: .. note:: -#: Once a selection is started, releasing the button that started it will -#: automatically end it and no release event will be dispatched. - -# clear_all_mouse_actions no - -#: Remove all mouse action definitions up to this point. Useful, for -#: instance, to remove the default mouse actions. - -#: Click the link under the mouse or move the cursor - -# mouse_map left click ungrabbed mouse_handle_click selection link prompt - -#:: First check for a selection and if one exists do nothing. Then -#:: check for a link under the mouse cursor and if one exists, click -#:: it. Finally check if the click happened at the current shell -#:: prompt and if so, move the cursor to the click location. Note -#:: that this requires shell integration -#:: <https://sw.kovidgoyal.net/kitty/shell-integration/> to work. - -#: Click the link under the mouse or move the cursor even when grabbed - -# mouse_map shift+left click grabbed,ungrabbed mouse_handle_click selection link prompt - -#:: Same as above, except that the action is performed even when the -#:: mouse is grabbed by the program running in the terminal. - -#: Click the link under the mouse cursor - -# mouse_map ctrl+shift+left release grabbed,ungrabbed mouse_handle_click link - -#:: Variant with Ctrl+Shift is present because the simple click based -#:: version has an unavoidable delay of click_interval, to -#:: disambiguate clicks from double clicks. - -#: Discard press event for link click - -# mouse_map ctrl+shift+left press grabbed discard_event - -#:: Prevent this press event from being sent to the program that has -#:: grabbed the mouse, as the corresponding release event is used to -#:: open a URL. - -#: Paste from the primary selection - -# mouse_map middle release ungrabbed paste_from_selection - -#: Start selecting text - -# mouse_map left press ungrabbed mouse_selection normal - -#: Start selecting text in a rectangle - -# mouse_map ctrl+alt+left press ungrabbed mouse_selection rectangle - -#: Select a word - -# mouse_map left doublepress ungrabbed mouse_selection word - -#: Select a line - -# mouse_map left triplepress ungrabbed mouse_selection line - -#: Select line from point - -# mouse_map ctrl+alt+left triplepress ungrabbed mouse_selection line_from_point - -#:: Select from the clicked point to the end of the line. - -#: Extend the current selection - -# mouse_map right press ungrabbed mouse_selection extend - -#:: If you want only the end of the selection to be moved instead of -#:: the nearest boundary, use move-end instead of extend. - -#: Paste from the primary selection even when grabbed - -# mouse_map shift+middle release ungrabbed,grabbed paste_selection -# mouse_map shift+middle press grabbed discard_event - -#: Start selecting text even when grabbed - -# mouse_map shift+left press ungrabbed,grabbed mouse_selection normal - -#: Start selecting text in a rectangle even when grabbed - -# mouse_map ctrl+shift+alt+left press ungrabbed,grabbed mouse_selection rectangle - -#: Select a word even when grabbed - -# mouse_map shift+left doublepress ungrabbed,grabbed mouse_selection word - -#: Select a line even when grabbed - -# mouse_map shift+left triplepress ungrabbed,grabbed mouse_selection line - -#: Select line from point even when grabbed - -# mouse_map ctrl+shift+alt+left triplepress ungrabbed,grabbed mouse_selection line_from_point - -#:: Select from the clicked point to the end of the line even when -#:: grabbed. - -#: Extend the current selection even when grabbed - -# mouse_map shift+right press ungrabbed,grabbed mouse_selection extend - -#: Show clicked command output in pager - -# mouse_map ctrl+shift+right press ungrabbed mouse_show_command_output - -#:: Requires shell integration -#:: <https://sw.kovidgoyal.net/kitty/shell-integration/> to work. - -#: }}} - -#: }}} - -#: Performance tuning {{{ - -# repaint_delay 10 - -#: Delay between screen updates (in milliseconds). Decreasing it, -#: increases frames-per-second (FPS) at the cost of more CPU usage. -#: The default value yields ~100 FPS which is more than sufficient for -#: most uses. Note that to actually achieve 100 FPS, you have to -#: either set sync_to_monitor to no or use a monitor with a high -#: refresh rate. Also, to minimize latency when there is pending input -#: to be processed, this option is ignored. - -# input_delay 3 - -#: Delay before input from the program running in the terminal is -#: processed (in milliseconds). Note that decreasing it will increase -#: responsiveness, but also increase CPU usage and might cause flicker -#: in full screen programs that redraw the entire screen on each loop, -#: because kitty is so fast that partial screen updates will be drawn. - -# sync_to_monitor yes - -#: Sync screen updates to the refresh rate of the monitor. This -#: prevents screen tearing -#: <https://en.wikipedia.org/wiki/Screen_tearing> when scrolling. -#: However, it limits the rendering speed to the refresh rate of your -#: monitor. With a very high speed mouse/high keyboard repeat rate, -#: you may notice some slight input latency. If so, set this to no. - -#: }}} - -#: Terminal bell {{{ - -enable_audio_bell no - -#: The audio bell. Useful to disable it in environments that require -#: silence. - -visual_bell_duration 0.1 - -#: The visual bell duration (in seconds). Flash the screen when a bell -#: occurs for the specified number of seconds. Set to zero to disable. - -visual_bell_color #b00020 - -#: The color used by visual bell. Set to none will fall back to -#: selection background color. If you feel that the visual bell is too -#: bright, you can set it to a darker color. - -# window_alert_on_bell yes - -#: Request window attention on bell. Makes the dock icon bounce on -#: macOS or the taskbar flash on linux. - -# bell_on_tab "🔔 " - -#: Some text or a Unicode symbol to show on the tab if a window in the -#: tab that does not have focus has a bell. If you want to use leading -#: or trailing spaces, surround the text with quotes. See -#: tab_title_template for how this is rendered. - -#: For backwards compatibility, values of yes, y and true are -#: converted to the default bell symbol and no, n, false and none are -#: converted to the empty string. - -# command_on_bell none - -#: Program to run when a bell occurs. The environment variable -#: KITTY_CHILD_CMDLINE can be used to get the program running in the -#: window in which the bell occurred. - -# bell_path none - -#: Path to a sound file to play as the bell sound. If set to none, the -#: system default bell sound is used. Must be in a format supported by -#: the operating systems sound API, such as WAV or OGA on Linux -#: (libcanberra) or AIFF, MP3 or WAV on macOS (NSSound) - -# linux_bell_theme __custom - -#: The XDG Sound Theme kitty will use to play the bell sound. Defaults -#: to the custom theme name used by GNOME and Budgie, falling back to -#: the default freedesktop theme if it does not exist. This option may -#: be removed if Linux ever provides desktop-agnostic support for -#: setting system sound themes. - -#: }}} - -#: Window layout {{{ - -# remember_window_size yes -# initial_window_width 640 -# initial_window_height 400 - -#: If enabled, the OS Window size will be remembered so that new -#: instances of kitty will have the same size as the previous -#: instance. If disabled, the OS Window will initially have size -#: configured by initial_window_width/height, in pixels. You can use a -#: suffix of "c" on the width/height values to have them interpreted -#: as number of cells instead of pixels. - -# enabled_layouts * - -#: The enabled window layouts. A comma separated list of layout names. -#: The special value all means all layouts. The first listed layout -#: will be used as the startup layout. Default configuration is all -#: layouts in alphabetical order. For a list of available layouts, see -#: the layouts <https://sw.kovidgoyal.net/kitty/overview/#layouts>. - -# window_resize_step_cells 2 -# window_resize_step_lines 2 - -#: The step size (in units of cell width/cell height) to use when -#: resizing kitty windows in a layout with the shortcut -#: start_resizing_window. The cells value is used for horizontal -#: resizing, and the lines value is used for vertical resizing. - -# window_border_width 0.5pt - -#: The width of window borders. Can be either in pixels (px) or pts -#: (pt). Values in pts will be rounded to the nearest number of pixels -#: based on screen resolution. If not specified, the unit is assumed -#: to be pts. Note that borders are displayed only when more than one -#: window is visible. They are meant to separate multiple windows. - -draw_minimal_borders yes - -#: Draw only the minimum borders needed. This means that only the -#: borders that separate the window from a neighbor are drawn. Note -#: that setting a non-zero window_margin_width overrides this and -#: causes all borders to be drawn. - -# window_margin_width 0 - -#: The window margin (in pts) (blank area outside the border). A -#: single value sets all four sides. Two values set the vertical and -#: horizontal sides. Three values set top, horizontal and bottom. Four -#: values set top, right, bottom and left. - -# single_window_margin_width -1 - -#: The window margin to use when only a single window is visible (in -#: pts). Negative values will cause the value of window_margin_width -#: to be used instead. A single value sets all four sides. Two values -#: set the vertical and horizontal sides. Three values set top, -#: horizontal and bottom. Four values set top, right, bottom and left. - -window_padding_width 5 - -#: The window padding (in pts) (blank area between the text and the -#: window border). A single value sets all four sides. Two values set -#: the vertical and horizontal sides. Three values set top, horizontal -#: and bottom. Four values set top, right, bottom and left. - -# placement_strategy center - -#: When the window size is not an exact multiple of the cell size, the -#: cell area of the terminal window will have some extra padding on -#: the sides. You can control how that padding is distributed with -#: this option. Using a value of center means the cell area will be -#: placed centrally. A value of top-left means the padding will be -#: only at the bottom and right edges. - -# active_border_color #00ff00 - -#: The color for the border of the active window. Set this to none to -#: not draw borders around the active window. - -# inactive_border_color #cccccc - -#: The color for the border of inactive windows. - -# bell_border_color #ff5a00 - -#: The color for the border of inactive windows in which a bell has -#: occurred. - -# inactive_text_alpha 1.0 - -#: Fade the text in inactive windows by the specified amount (a number -#: between zero and one, with zero being fully faded). - -# hide_window_decorations no - -#: Hide the window decorations (title-bar and window borders) with -#: yes. On macOS, titlebar-only can be used to only hide the titlebar. -#: Whether this works and exactly what effect it has depends on the -#: window manager/operating system. Note that the effects of changing -#: this option when reloading config are undefined. - -# window_logo_path none - -#: Path to a logo image. Must be in PNG format. Relative paths are -#: interpreted relative to the kitty config directory. The logo is -#: displayed in a corner of every kitty window. The position is -#: controlled by window_logo_position. Individual windows can be -#: configured to have different logos either using the launch action -#: or the remote control <https://sw.kovidgoyal.net/kitty/remote- -#: control/> facility. - -# window_logo_position bottom-right - -#: Where to position the window logo in the window. The value can be -#: one of: top-left, top, top-right, left, center, right, bottom-left, -#: bottom, bottom-right. - -# window_logo_alpha 0.5 - -#: The amount the logo should be faded into the background. With zero -#: being fully faded and one being fully opaque. - -# resize_debounce_time 0.1 - -#: The time to wait before redrawing the screen when a resize event is -#: received (in seconds). On platforms such as macOS, where the -#: operating system sends events corresponding to the start and end of -#: a resize, this number is ignored. - -# resize_draw_strategy static - -#: Choose how kitty draws a window while a resize is in progress. A -#: value of static means draw the current window contents, mostly -#: unchanged. A value of scale means draw the current window contents -#: scaled. A value of blank means draw a blank window. A value of size -#: means show the window size in cells. - -# resize_in_steps no - -#: Resize the OS window in steps as large as the cells, instead of -#: with the usual pixel accuracy. Combined with initial_window_width -#: and initial_window_height in number of cells, this option can be -#: used to keep the margins as small as possible when resizing the OS -#: window. Note that this does not currently work on Wayland. - -# visual_window_select_characters 1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZ - -#: The list of characters for visual window selection. For example, -#: for selecting a window to focus on with focus_visible_window. The -#: value should be a series of unique numbers or alphabets, case -#: insensitive, from the set [0-9A-Z]. Specify your preference as a -#: string of characters. - -# confirm_os_window_close -1 - -#: Ask for confirmation when closing an OS window or a tab with at -#: least this number of kitty windows in it by window manager (e.g. -#: clicking the window close button or pressing the operating system -#: shortcut to close windows) or by the close_tab action. A value of -#: zero disables confirmation. This confirmation also applies to -#: requests to quit the entire application (all OS windows, via the -#: quit action). Negative values are converted to positive ones, -#: however, with shell_integration enabled, using negative values -#: means windows sitting at a shell prompt are not counted, only -#: windows where some command is currently running. Note that if you -#: want confirmation when closing individual windows, you can map the -#: close_window_with_confirmation action. - -#: }}} - -#: Tab bar {{{ - -# tab_bar_edge bottom - -#: The edge to show the tab bar on, top or bottom. - -# tab_bar_margin_width 0.0 - -#: The margin to the left and right of the tab bar (in pts). - -# tab_bar_margin_height 0.0 0.0 - -#: The margin above and below the tab bar (in pts). The first number -#: is the margin between the edge of the OS Window and the tab bar. -#: The second number is the margin between the tab bar and the -#: contents of the current tab. - -# tab_bar_style fade - -#: The tab bar style, can be one of: - -#: fade -#: Each tab's edges fade into the background color. (See also tab_fade) -#: slant -#: Tabs look like the tabs in a physical file. -#: separator -#: Tabs are separated by a configurable separator. (See also -#: tab_separator) -#: powerline -#: Tabs are shown as a continuous line with "fancy" separators. -#: (See also tab_powerline_style) -#: custom -#: A user-supplied Python function called draw_tab is loaded from the file -#: tab_bar.py in the kitty config directory. For examples of how to -#: write such a function, see the functions named draw_tab_with_* in -#: kitty's source code: kitty/tab_bar.py. See also -#: this discussion <https://github.com/kovidgoyal/kitty/discussions/4447> -#: for examples from kitty users. -#: hidden -#: The tab bar is hidden. If you use this, you might want to create -#: a mapping for the select_tab action which presents you with a list of -#: tabs and allows for easy switching to a tab. - -# tab_bar_align left - -#: The horizontal alignment of the tab bar, can be one of: left, -#: center, right. - -# tab_bar_min_tabs 2 - -#: The minimum number of tabs that must exist before the tab bar is -#: shown. - -# tab_switch_strategy previous - -#: The algorithm to use when switching to a tab when the current tab -#: is closed. The default of previous will switch to the last used -#: tab. A value of left will switch to the tab to the left of the -#: closed tab. A value of right will switch to the tab to the right of -#: the closed tab. A value of last will switch to the right-most tab. - -# tab_fade 0.25 0.5 0.75 1 - -#: Control how each tab fades into the background when using fade for -#: the tab_bar_style. Each number is an alpha (between zero and one) -#: that controls how much the corresponding cell fades into the -#: background, with zero being no fade and one being full fade. You -#: can change the number of cells used by adding/removing entries to -#: this list. - -# tab_separator " ┇" - -#: The separator between tabs in the tab bar when using separator as -#: the tab_bar_style. - -# tab_powerline_style angled - -#: The powerline separator style between tabs in the tab bar when -#: using powerline as the tab_bar_style, can be one of: angled, -#: slanted, round. - -# tab_activity_symbol none - -#: Some text or a Unicode symbol to show on the tab if a window in the -#: tab that does not have focus has some activity. If you want to use -#: leading or trailing spaces, surround the text with quotes. See -#: tab_title_template for how this is rendered. - -# tab_title_max_length 0 - -#: The maximum number of cells that can be used to render the text in -#: a tab. A value of zero means that no limit is applied. - -# tab_title_template "{fmt.fg.red}{bell_symbol}{activity_symbol}{fmt.fg.tab}{title}" - -#: A template to render the tab title. The default just renders the -#: title with optional symbols for bell and activity. If you wish to -#: include the tab-index as well, use something like: {index}:{title}. -#: Useful if you have shortcuts mapped for goto_tab N. If you prefer -#: to see the index as a superscript, use {sup.index}. All data -#: available is: - -#: title -#: The current tab title. -#: index -#: The tab index useable with goto_tab N goto_tab shortcuts. -#: layout_name -#: The current layout name. -#: num_windows -#: The number of windows in the tab. -#: num_window_groups -#: The number of window groups (not counting overlay windows) in the tab. -#: tab.active_wd -#: The working directory of the currently active window in the tab -#: (expensive, requires syscall). Use active_oldest_wd to get -#: the directory of the oldest foreground process rather than the newest. -#: tab.active_exe -#: The name of the executable running in the foreground of the currently -#: active window in the tab (expensive, requires syscall). Use -#: active_oldest_exe for the oldest foreground process. -#: max_title_length -#: The maximum title length available. - -#: Note that formatting is done by Python's string formatting -#: machinery, so you can use, for instance, {layout_name[:2].upper()} -#: to show only the first two letters of the layout name, upper-cased. -#: If you want to style the text, you can use styling directives, for -#: example: -#: `{fmt.fg.red}red{fmt.fg.tab}normal{fmt.bg._00FF00}greenbg{fmt.bg.tab}`. -#: Similarly, for bold and italic: -#: `{fmt.bold}bold{fmt.nobold}normal{fmt.italic}italic{fmt.noitalic}`. -#: Note that for backward compatibility, if {bell_symbol} or -#: {activity_symbol} are not present in the template, they are -#: prepended to it. - -# active_tab_title_template none - -#: Template to use for active tabs. If not specified falls back to -#: tab_title_template. - -# active_tab_foreground #000 -# active_tab_background #eee -# active_tab_font_style bold-italic -# inactive_tab_foreground #444 -# inactive_tab_background #999 -# inactive_tab_font_style normal - -#: Tab bar colors and styles. - -# tab_bar_background none - -#: Background color for the tab bar. Defaults to using the terminal -#: background color. - -# tab_bar_margin_color none - -#: Color for the tab bar margin area. Defaults to using the terminal -#: background color for margins above and below the tab bar. For side -#: margins the default color is chosen to match the background color -#: of the neighboring tab. - -#: }}} - -#: Color scheme {{{ - -# Dark mode -#foreground #f8f8f8 -#background #171717 - -# Light mode -# background #f8f8f8 -# foreground #171717 - -#: The foreground and background colors. - -background_opacity 0.9 - -#: The opacity of the background. A number between zero and one, where -#: one is opaque and zero is fully transparent. This will only work if -#: supported by the OS (for instance, when using a compositor under -#: X11). Note that it only sets the background color's opacity in -#: cells that have the same background color as the default terminal -#: background, so that things like the status bar in vim, powerline -#: prompts, etc. still look good. But it means that if you use a color -#: theme with a background color in your editor, it will not be -#: rendered as transparent. Instead you should change the default -#: background color in your kitty config and not use a background -#: color in the editor color scheme. Or use the escape codes to set -#: the terminals default colors in a shell script to launch your -#: editor. Be aware that using a value less than 1.0 is a (possibly -#: significant) performance hit. If you want to dynamically change -#: transparency of windows, set dynamic_background_opacity to yes -#: (this is off by default as it has a performance cost). Changing -#: this option when reloading the config will only work if -#: dynamic_background_opacity was enabled in the original config. - -# background_image none - -#: Path to a background image. Must be in PNG format. - -# background_image_layout tiled - -#: Whether to tile, scale or clamp the background image. The value can -#: be one of tiled, mirror-tiled, scaled, clamped or centered. - -# background_image_linear no - -#: When background image is scaled, whether linear interpolation -#: should be used. - -# dynamic_background_opacity no - -#: Allow changing of the background_opacity dynamically, using either -#: keyboard shortcuts (increase_background_opacity and -#: decrease_background_opacity) or the remote control facility. -#: Changing this option by reloading the config is not supported. - -# background_tint 0.0 - -#: How much to tint the background image by the background color. This -#: option makes it easier to read the text. Tinting is done using the -#: current background color for each window. This option applies only -#: if background_opacity is set and transparent windows are supported -#: or background_image is set. - -# background_tint_gaps 1.0 - -#: How much to tint the background image at the window gaps by the -#: background color, after applying background_tint. Since this is -#: multiplicative with background_tint, it can be used to lighten the -#: tint over the window gaps for a *separated* look. - -# dim_opacity 0.75 - -#: How much to dim text that has the DIM/FAINT attribute set. One -#: means no dimming and zero means fully dimmed (i.e. invisible). - -# selection_foreground #000000 -# selection_background #fffacd - -#: The foreground and background colors for text selected with the -#: mouse. Setting both of these to none will cause a "reverse video" -#: effect for selections, where the selection will be the cell text -#: color and the text will become the cell background color. Setting -#: only selection_foreground to none will cause the foreground color -#: to be used unchanged. Note that these colors can be overridden by -#: the program running in the terminal. - -#: The color table {{{ - -#: The 256 terminal colors. There are 8 basic colors, each color has a -#: dull and bright version, for the first 16 colors. You can set the -#: remaining 240 colors as color16 to color255. - -# color0 #000000 -# color8 #767676 -# color8 #21222c -# color0 #6272a4 - -#: black - -# color1 #cc0403 -# color9 #f2201f -# color9 #ff5555 -# color1 #ff6e6e - -#: red - -# color2 #19cb00 -# color10 #23fd00 -# color10 #50fa7b -# color2 #69ff94 - -#: green - -# color3 #cecb00 -# color11 #fffd00 -# color11 #f1fa8c -# color3 #ffffa5 - -#: yellow - -# color4 #0d73cc -# color12 #1a8fff -# color12 #bd93f9 -# color4 #d6acff - -#: blue - -# color5 #cb1ed1 -# color13 #fd28ff -# color13 #ff79c6 -# color5 #ff92df - -#: magenta - -# color6 #0dcdcd -# color14 #14ffff -# color14 #8be9fd -# color6 #a4ffff - -#: cyan - -# color7 #dddddd -# color15 #ffffff - -#: white - -# mark1_foreground black - -#: Color for marks of type 1 - -# mark1_background #98d3cb - -#: Color for marks of type 1 (light steel blue) - -# mark2_foreground black - -#: Color for marks of type 2 - -# mark2_background #f2dcd3 - -#: Color for marks of type 1 (beige) - -# mark3_foreground black - -#: Color for marks of type 3 - -# mark3_background #f274bc - -#: Color for marks of type 3 (violet) - -#: }}} - -#: }}} - -#: Advanced {{{ - -# shell . - -#: The shell program to execute. The default value of . means to use -#: whatever shell is set as the default shell for the current user. -#: Note that on macOS if you change this, you might need to add -#: --login and --interactive to ensure that the shell starts in -#: interactive mode and reads its startup rc files. - -# editor . - -#: The terminal based text editor (such as vim or nano) to use when -#: editing the kitty config file or similar tasks. - -#: The default value of . means to use the environment variables -#: VISUAL and EDITOR in that order. If these variables aren't set, -#: kitty will run your shell ($SHELL -l -i -c env) to see if your -#: shell startup rc files set VISUAL or EDITOR. If that doesn't work, -#: kitty will cycle through various known editors (vim, emacs, etc.) -#: and take the first one that exists on your system. - -# close_on_child_death no - -#: Close the window when the child process (shell) exits. With the -#: default value no, the terminal will remain open when the child -#: exits as long as there are still processes outputting to the -#: terminal (for example disowned or backgrounded processes). When -#: enabled with yes, the window will close as soon as the child -#: process exits. Note that setting it to yes means that any -#: background processes still using the terminal can fail silently -#: because their stdout/stderr/stdin no longer work. - -# remote_control_password - -#: Allow other programs to control kitty using passwords. This option -#: can be specified multiple times to add multiple passwords. If no -#: passwords are present kitty will ask the user for permission if a -#: program tries to use remote control with a password. A password can -#: also *optionally* be associated with a set of allowed remote -#: control actions. For example:: - -#: remote_control_password "my passphrase" get-colors set-colors focus-window focus-tab - -#: Only the specified actions will be allowed when using this -#: password. Glob patterns can be used too, for example:: - -#: remote_control_password "my passphrase" set-tab-* resize-* - -#: To get a list of available actions, run:: - -#: kitty @ --help - -#: A set of actions to be allowed when no password is sent can be -#: specified by using an empty password. For example:: - -#: remote_control_password "" *-colors - -#: Finally, the path to a python module can be specified that provides -#: a function is_cmd_allowed that is used to check every remote -#: control command. For example:: - -#: remote_control_password "my passphrase" my_rc_command_checker.py - -#: Relative paths are resolved from the kitty configuration directory. -#: See rc_custom_auth <https://sw.kovidgoyal.net/kitty/remote- -#: control/#rc-custom-auth> for details. - -# allow_remote_control no - -#: Allow other programs to control kitty. If you turn this on, other -#: programs can control all aspects of kitty, including sending text -#: to kitty windows, opening new windows, closing windows, reading the -#: content of windows, etc. Note that this even works over SSH -#: connections. The default setting of no prevents any form of remote -#: control. The meaning of the various values are: - -#: password -#: Remote control requests received over both the TTY device and the socket -#: are confirmed based on passwords, see remote_control_password. - -#: socket-only -#: Remote control requests received over a socket are accepted -#: unconditionally. Requests received over the TTY are denied. -#: See listen_on. - -#: socket -#: Remote control requests received over a socket are accepted -#: unconditionally. Requests received over the TTY are confirmed based on -#: password. - -#: no -#: Remote control is completely disabled. - -#: yes -#: Remote control requests are always accepted. - -# listen_on none - -#: Listen to the specified UNIX socket for remote control connections. -#: Note that this will apply to all kitty instances. It can be -#: overridden by the kitty --listen-on command line option, which also -#: supports listening on a TCP socket. This option accepts only UNIX -#: sockets, such as unix:${TEMP}/mykitty or unix:@mykitty (on Linux). -#: Environment variables are expanded and relative paths are resolved -#: with respect to the temporary directory. If {kitty_pid} is present, -#: then it is replaced by the PID of the kitty process, otherwise the -#: PID of the kitty process is appended to the value, with a hyphen. -#: See the help for kitty --listen-on for more details. Note that this -#: will be ignored unless allow_remote_control is set to either: yes, -#: socket or socket-only. Changing this option by reloading the config -#: is not supported. - -# env - -#: Specify the environment variables to be set in all child processes. -#: Using the name with an equal sign (e.g. env VAR=) will set it to -#: the empty string. Specifying only the name (e.g. env VAR) will -#: remove the variable from the child process' environment. Note that -#: environment variables are expanded recursively, for example:: - -#: env VAR1=a -#: env VAR2=${HOME}/${VAR1}/b - -#: The value of VAR2 will be <path to home directory>/a/b. - -# watcher - -#: Path to python file which will be loaded for watchers -#: <https://sw.kovidgoyal.net/kitty/launch/#watchers>. Can be -#: specified more than once to load multiple watchers. The watchers -#: will be added to every kitty window. Relative paths are resolved -#: relative to the kitty config directory. Note that reloading the -#: config will only affect windows created after the reload. - -# exe_search_path - -#: Control where kitty finds the programs to run. The default search -#: order is: First search the system wide PATH, then ~/.local/bin and -#: ~/bin. If still not found, the PATH defined in the login shell -#: after sourcing all its startup files is tried. Finally, if present, -#: the PATH specified by the env option is tried. - -#: This option allows you to prepend, append, or remove paths from -#: this search order. It can be specified multiple times for multiple -#: paths. A simple path will be prepended to the search order. A path -#: that starts with the + sign will be append to the search order, -#: after ~/bin above. A path that starts with the - sign will be -#: removed from the entire search order. For example:: - -#: exe_search_path /some/prepended/path -#: exe_search_path +/some/appended/path -#: exe_search_path -/some/excluded/path - -# update_check_interval 24 - -#: The interval to periodically check if an update to kitty is -#: available (in hours). If an update is found, a system notification -#: is displayed informing you of the available update. The default is -#: to check every 24 hours, set to zero to disable. Update checking is -#: only done by the official binary builds. Distro packages or source -#: builds do not do update checking. Changing this option by reloading -#: the config is not supported. - -# startup_session none - -#: Path to a session file to use for all kitty instances. Can be -#: overridden by using the kitty --session =none command line option -#: for individual instances. See sessions -#: <https://sw.kovidgoyal.net/kitty/overview/#sessions> in the kitty -#: documentation for details. Note that relative paths are interpreted -#: with respect to the kitty config directory. Environment variables -#: in the path are expanded. Changing this option by reloading the -#: config is not supported. - -# clipboard_control write-clipboard write-primary read-clipboard-ask read-primary-ask - -#: Allow programs running in kitty to read and write from the -#: clipboard. You can control exactly which actions are allowed. The -#: possible actions are: write-clipboard, read-clipboard, write- -#: primary, read-primary, read-clipboard-ask, read-primary-ask. The -#: default is to allow writing to the clipboard and primary selection -#: and to ask for permission when a program tries to read from the -#: clipboard. Note that disabling the read confirmation is a security -#: risk as it means that any program, even the ones running on a -#: remote server via SSH can read your clipboard. See also -#: clipboard_max_size. - -# clipboard_max_size 512 - -#: The maximum size (in MB) of data from programs running in kitty -#: that will be stored for writing to the system clipboard. A value of -#: zero means no size limit is applied. See also clipboard_control. - -# file_transfer_confirmation_bypass - -#: The password that can be supplied to the file transfer kitten -#: <https://sw.kovidgoyal.net/kitty/kittens/transfer/> to skip the -#: transfer confirmation prompt. This should only be used when -#: initiating transfers from trusted computers, over trusted networks -#: or encrypted transports, as it allows any programs running on the -#: remote machine to read/write to the local filesystem, without -#: permission. - -# allow_hyperlinks yes - -#: Process hyperlink escape sequences (OSC 8). If disabled OSC 8 -#: escape sequences are ignored. Otherwise they become clickable -#: links, that you can click with the mouse or by using the hints -#: kitten <https://sw.kovidgoyal.net/kitty/kittens/hints/>. The -#: special value of ask means that kitty will ask before opening the -#: link when clicked. - -# shell_integration enabled - -#: Enable shell integration on supported shells. This enables features -#: such as jumping to previous prompts, browsing the output of the -#: previous command in a pager, etc. on supported shells. Set to -#: disabled to turn off shell integration, completely. It is also -#: possible to disable individual features, set to a space separated -#: list of these values: no-rc, no-cursor, no-title, no-cwd, no- -#: prompt-mark, no-complete. See Shell integration -#: <https://sw.kovidgoyal.net/kitty/shell-integration/> for details. - -# allow_cloning ask - -#: Control whether programs running in the terminal can request new -#: windows to be created. The canonical example is clone-in-kitty -#: <https://sw.kovidgoyal.net/kitty/shell-integration/#clone-shell>. -#: By default, kitty will ask for permission for each clone request. -#: Allowing cloning unconditionally gives programs running in the -#: terminal (including over SSH) permission to execute arbitrary code, -#: as the user who is running the terminal, on the computer that the -#: terminal is running on. - -# clone_source_strategies venv,conda,env_var,path - -#: Control what shell code is sourced when running clone-in-kitty in -#: the newly cloned window. The supported strategies are: - -#: venv -#: Source the file $VIRTUAL_ENV/bin/activate. This is used by the -#: Python stdlib venv module and allows cloning venvs automatically. -#: conda -#: Run conda activate $CONDA_DEFAULT_ENV. This supports the virtual -#: environments created by conda. -#: env_var -#: Execute the contents of the environment variable -#: KITTY_CLONE_SOURCE_CODE with eval. -#: path -#: Source the file pointed to by the environment variable -#: KITTY_CLONE_SOURCE_PATH. - -#: This option must be a comma separated list of the above values. -#: This only source the first valid one in the above order. - -# term xterm-kitty - -#: The value of the TERM environment variable to set. Changing this -#: can break many terminal programs, only change it if you know what -#: you are doing, not because you read some advice on "Stack Overflow" -#: to change it. The TERM variable is used by various programs to get -#: information about the capabilities and behavior of the terminal. If -#: you change it, depending on what programs you run, and how -#: different the terminal you are changing it to is, various things -#: from key-presses, to colors, to various advanced features may not -#: work. Changing this option by reloading the config will only affect -#: newly created windows. - -#: }}} - -#: OS specific tweaks {{{ - -wayland_titlebar_color system - -#: The color of the kitty window's titlebar on Wayland systems with -#: client side window decorations such as GNOME. A value of system -#: means to use the default system color, a value of background means -#: to use the background color of the currently active window and -#: finally you can use an arbitrary color, such as #12af59 or red. - -# macos_titlebar_color system - -#: The color of the kitty window's titlebar on macOS. A value of -#: system means to use the default system color, light or dark can -#: also be used to set it explicitly. A value of background means to -#: use the background color of the currently active window and finally -#: you can use an arbitrary color, such as #12af59 or red. WARNING: -#: This option works by using a hack when arbitrary color (or -#: background) is configured, as there is no proper Cocoa API for it. -#: It sets the background color of the entire window and makes the -#: titlebar transparent. As such it is incompatible with -#: background_opacity. If you want to use both, you are probably -#: better off just hiding the titlebar with hide_window_decorations. - -# macos_option_as_alt no - -#: Use the Option key as an Alt key on macOS. With this set to no, -#: kitty will use the macOS native Option+Key to enter Unicode -#: character behavior. This will break any Alt+Key keyboard shortcuts -#: in your terminal programs, but you can use the macOS Unicode input -#: technique. You can use the values: left, right or both to use only -#: the left, right or both Option keys as Alt, instead. Note that -#: kitty itself always treats Option the same as Alt. This means you -#: cannot use this option to configure different kitty shortcuts for -#: Option+Key vs. Alt+Key. Also, any kitty shortcuts using -#: Option/Alt+Key will take priority, so that any such key presses -#: will not be passed to terminal programs running inside kitty. -#: Changing this option by reloading the config is not supported. - -# macos_hide_from_tasks no - -#: Hide the kitty window from running tasks on macOS (⌘+Tab and the -#: Dock). Changing this option by reloading the config is not -#: supported. - -# macos_quit_when_last_window_closed no - -#: Have kitty quit when all the top-level windows are closed on macOS. -#: By default, kitty will stay running, even with no open windows, as -#: is the expected behavior on macOS. - -# macos_window_resizable yes - -#: Disable this if you want kitty top-level OS windows to not be -#: resizable on macOS. Changing this option by reloading the config -#: will only affect newly created OS windows. - -# macos_thicken_font 0 - -#: Draw an extra border around the font with the given width, to -#: increase legibility at small font sizes on macOS. For example, a -#: value of 0.75 will result in rendering that looks similar to sub- -#: pixel antialiasing at common font sizes. Note that in modern kitty, -#: this option is obsolete (although still supported). Consider using -#: text_composition_strategy instead. - -# macos_traditional_fullscreen no - -#: Use the macOS traditional full-screen transition, that is faster, -#: but less pretty. - -# macos_show_window_title_in all - -#: Control where the window title is displayed on macOS. A value of -#: window will show the title of the currently active window at the -#: top of the macOS window. A value of menubar will show the title of -#: the currently active window in the macOS global menu bar, making -#: use of otherwise wasted space. A value of all will show the title -#: in both places, and none hides the title. See -#: macos_menubar_title_max_length for how to control the length of the -#: title in the menu bar. - -# macos_menubar_title_max_length 0 - -#: The maximum number of characters from the window title to show in -#: the macOS global menu bar. Values less than one means that there is -#: no maximum limit. - -# macos_custom_beam_cursor no - -#: Use a custom mouse cursor for macOS that is easier to see on both -#: light and dark backgrounds. Nowadays, the default macOS cursor -#: already comes with a white border. WARNING: this might make your -#: mouse cursor invisible on dual GPU machines. Changing this option -#: by reloading the config is not supported. - -# macos_colorspace srgb - -#: The colorspace in which to interpret terminal colors. The default -#: of srgb will cause colors to match those seen in web browsers. The -#: value of default will use whatever the native colorspace of the -#: display is. The value of displayp3 will use Apple's special -#: snowflake display P3 color space, which will result in over -#: saturated (brighter) colors with some color shift. Reloading -#: configuration will change this value only for newly created OS -#: windows. - -linux_display_server wayland - -#: Choose between Wayland and X11 backends. By default, an appropriate -#: backend based on the system state is chosen automatically. Set it -#: to x11 or wayland to force the choice. Changing this option by -#: reloading the config is not supported. - -#: }}} - -#: Keyboard shortcuts {{{ - -#: Keys are identified simply by their lowercase Unicode characters. -#: For example: a for the A key, [ for the left square bracket key, -#: etc. For functional keys, such as Enter or Escape, the names are -#: present at Functional key definitions -#: <https://sw.kovidgoyal.net/kitty/keyboard-protocol/#functional>. -#: For modifier keys, the names are ctrl (control, ⌃), shift (⇧), alt -#: (opt, option, ⌥), super (cmd, command, ⌘). See also: GLFW mods -#: <https://www.glfw.org/docs/latest/group__mods.html> - -#: On Linux you can also use XKB key names to bind keys that are not -#: supported by GLFW. See XKB keys -#: <https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon- -#: keysyms.h> for a list of key names. The name to use is the part -#: after the XKB_KEY_ prefix. Note that you can only use an XKB key -#: name for keys that are not known as GLFW keys. - -#: Finally, you can use raw system key codes to map keys, again only -#: for keys that are not known as GLFW keys. To see the system key -#: code for a key, start kitty with the kitty --debug-input option, -#: kitty will output some debug text for every key event. In that text -#: look for native_code, the value of that becomes the key name in the -#: shortcut. For example: - -#: .. code-block:: none - -#: on_key_input: glfw key: 0x61 native_code: 0x61 action: PRESS mods: none text: 'a' - -#: Here, the key name for the A key is 0x61 and you can use it with:: - -#: map ctrl+0x61 something - -#: to map Ctrl+A to something. - -#: You can use the special action no_op to unmap a keyboard shortcut -#: that is assigned in the default configuration:: - -#: map kitty_mod+space no_op - -#: If you would like kitty to completely ignore a key event, not even -#: sending it to the program running in the terminal, map it to -#: discard_event:: - -#: map kitty_mod+f1 discard_event - -#: You can combine multiple actions to be triggered by a single -#: shortcut with combine action, using the syntax below:: - -#: map key combine <separator> action1 <separator> action2 <separator> action3 ... - -#: For example:: - -#: map kitty_mod+e combine : new_window : next_layout - -#: This will create a new window and switch to the next available -#: layout. - -#: You can use multi-key shortcuts with the syntax shown below:: - -#: map key1>key2>key3 action - -#: For example:: - -#: map ctrl+f>2 set_font_size 20 - -#: The full list of actions that can be mapped to key presses is -#: available here <https://sw.kovidgoyal.net/kitty/actions/>. - -# kitty_mod ctrl+shift - -#: Special modifier key alias for default shortcuts. You can change -#: the value of this option to alter all default shortcuts that use -#: kitty_mod. - -# clear_all_shortcuts no - -#: Remove all shortcut definitions up to this point. Useful, for -#: instance, to remove the default shortcuts. - -# action_alias - -#: E.g. action_alias launch_tab launch --type=tab --cwd=current - -#: Define action aliases to avoid repeating the same options in -#: multiple mappings. Aliases can be defined for any action and will -#: be expanded recursively. For example, the above alias allows you to -#: create mappings to launch a new tab in the current working -#: directory without duplication:: - -#: map f1 launch_tab vim -#: map f2 launch_tab emacs - -#: Similarly, to alias kitten invocation:: - -#: action_alias hints kitten hints --hints-offset=0 - -# kitten_alias - -#: E.g. kitten_alias hints hints --hints-offset=0 - -#: Like action_alias above, but specifically for kittens. Generally, -#: prefer to use action_alias. This option is a legacy version, -#: present for backwards compatibility. It causes all invocations of -#: the aliased kitten to be substituted. So the example above will -#: cause all invocations of the hints kitten to have the --hints- -#: offset=0 option applied. - -#: Clipboard {{{ - -#: Copy to clipboard - -# map kitty_mod+c copy_to_clipboard -# map cmd+c copy_to_clipboard - -#:: There is also a copy_or_interrupt action that can be optionally -#:: mapped to Ctrl+C. It will copy only if there is a selection and -#:: send an interrupt otherwise. Similarly, -#:: copy_and_clear_or_interrupt will copy and clear the selection or -#:: send an interrupt if there is no selection. - -#: Paste from clipboard - -# map kitty_mod+v paste_from_clipboard -# map cmd+v paste_from_clipboard - -#: Paste from selection - -# map kitty_mod+s paste_from_selection -# map shift+insert paste_from_selection - -#: Pass selection to program - -# map kitty_mod+o pass_selection_to_program - -#:: You can also pass the contents of the current selection to any -#:: program with pass_selection_to_program. By default, the system's -#:: open program is used, but you can specify your own, the selection -#:: will be passed as a command line argument to the program. For -#:: example:: - -#:: map kitty_mod+o pass_selection_to_program firefox - -#:: You can pass the current selection to a terminal program running -#:: in a new kitty window, by using the @selection placeholder:: - -#:: map kitty_mod+y new_window less @selection - -#: }}} - -#: Scrolling {{{ - -#: Scroll line up - -# map kitty_mod+up scroll_line_up -# map kitty_mod+k scroll_line_up -# map opt+cmd+page_up scroll_line_up -# map cmd+up scroll_line_up - -#: Scroll line down - -# map kitty_mod+down scroll_line_down -# map kitty_mod+j scroll_line_down -# map opt+cmd+page_down scroll_line_down -# map cmd+down scroll_line_down - -#: Scroll page up - -# map kitty_mod+page_up scroll_page_up -# map cmd+page_up scroll_page_up - -#: Scroll page down - -# map kitty_mod+page_down scroll_page_down -# map cmd+page_down scroll_page_down - -#: Scroll to top - -# map kitty_mod+home scroll_home -# map cmd+home scroll_home - -#: Scroll to bottom - -# map kitty_mod+end scroll_end -# map cmd+end scroll_end - -#: Scroll to previous shell prompt - -# map kitty_mod+z scroll_to_prompt -1 - -#:: Use a parameter of 0 for scroll_to_prompt to scroll to the last -#:: jumped to or the last clicked position. Requires shell -#:: integration <https://sw.kovidgoyal.net/kitty/shell-integration/> -#:: to work. - -#: Scroll to next shell prompt - -# map kitty_mod+x scroll_to_prompt 1 - -#: Browse scrollback buffer in pager - -# map kitty_mod+h show_scrollback - -#:: You can pipe the contents of the current screen and history -#:: buffer as STDIN to an arbitrary program using launch --stdin- -#:: source. For example, the following opens the scrollback buffer in -#:: less in an overlay window:: - -#:: map f1 launch --stdin-source=@screen_scrollback --stdin-add-formatting --type=overlay less +G -R - -#:: For more details on piping screen and buffer contents to external -#:: programs, see launch <https://sw.kovidgoyal.net/kitty/launch/>. - -#: Browse output of the last shell command in pager - -# map kitty_mod+g show_last_command_output - -#:: You can also define additional shortcuts to get the command -#:: output. For example, to get the first command output on screen:: - -#:: map f1 show_first_command_output_on_screen - -#:: To get the command output that was last accessed by a keyboard -#:: action or mouse action:: - -#:: map f1 show_last_visited_command_output - -#:: You can pipe the output of the last command run in the shell -#:: using the launch action. For example, the following opens the -#:: output in less in an overlay window:: - -#:: map f1 launch --stdin-source=@last_cmd_output --stdin-add-formatting --type=overlay less +G -R - -#:: To get the output of the first command on the screen, use -#:: @first_cmd_output_on_screen. To get the output of the last jumped -#:: to command, use @last_visited_cmd_output. - -#:: Requires shell integration -#:: <https://sw.kovidgoyal.net/kitty/shell-integration/> to work. - -#: }}} - -#: Window management {{{ - -#: New window - -# map kitty_mod+enter new_window -# map cmd+enter new_window - -#:: You can open a new kitty window running an arbitrary program, for -#:: example:: - -#:: map kitty_mod+y launch mutt - -#:: You can open a new window with the current working directory set -#:: to the working directory of the current window using:: - -#:: map ctrl+alt+enter launch --cwd=current - -#:: You can open a new window that is allowed to control kitty via -#:: the kitty remote control facility with launch --allow-remote- -#:: control. Any programs running in that window will be allowed to -#:: control kitty. For example:: - -#:: map ctrl+enter launch --allow-remote-control some_program - -#:: You can open a new window next to the currently active window or -#:: as the first window, with:: - -#:: map ctrl+n launch --location=neighbor -#:: map ctrl+f launch --location=first - -#:: For more details, see launch -#:: <https://sw.kovidgoyal.net/kitty/launch/>. - -#: New OS window - -# map kitty_mod+n new_os_window -# map cmd+n new_os_window - -#:: Works like new_window above, except that it opens a top-level OS -#:: window. In particular you can use new_os_window_with_cwd to open -#:: a window with the current working directory. - -#: Close window - -# map kitty_mod+w close_window -# map shift+cmd+d close_window - -#: Next window - -# map kitty_mod+] next_window - -#: Previous window - -# map kitty_mod+[ previous_window - -#: Move window forward - -# map kitty_mod+f move_window_forward - -#: Move window backward - -# map kitty_mod+b move_window_backward - -#: Move window to top - -# map kitty_mod+` move_window_to_top - -#: Start resizing window - -# map kitty_mod+r start_resizing_window -# map cmd+r start_resizing_window - -#: First window - -# map kitty_mod+1 first_window -# map cmd+1 first_window - -#: Second window - -# map kitty_mod+2 second_window -# map cmd+2 second_window - -#: Third window - -# map kitty_mod+3 third_window -# map cmd+3 third_window - -#: Fourth window - -# map kitty_mod+4 fourth_window -# map cmd+4 fourth_window - -#: Fifth window - -# map kitty_mod+5 fifth_window -# map cmd+5 fifth_window - -#: Sixth window - -# map kitty_mod+6 sixth_window -# map cmd+6 sixth_window - -#: Seventh window - -# map kitty_mod+7 seventh_window -# map cmd+7 seventh_window - -#: Eight window - -# map kitty_mod+8 eighth_window -# map cmd+8 eighth_window - -#: Ninth window - -# map kitty_mod+9 ninth_window -# map cmd+9 ninth_window - -#: Tenth window - -# map kitty_mod+0 tenth_window - -#: Visually select and focus window - -# map kitty_mod+f7 focus_visible_window - -#:: Display overlay numbers and alphabets on the window, and switch -#:: the focus to the window when you press the key. When there are -#:: only two windows, the focus will be switched directly without -#:: displaying the overlay. You can change the overlay characters and -#:: their order with option visual_window_select_characters. - -#: Visually swap window with another - -# map kitty_mod+f8 swap_with_window - -#:: Works like focus_visible_window above, but swaps the window. - -#: }}} - -#: Tab management {{{ - -#: Next tab - -# map kitty_mod+right next_tab -# map shift+cmd+] next_tab -# map ctrl+tab next_tab - -#: Previous tab - -# map kitty_mod+left previous_tab -# map shift+cmd+[ previous_tab -# map ctrl+shift+tab previous_tab - -#: New tab - -# map kitty_mod+t new_tab -# map cmd+t new_tab - -#: Close tab - -# map kitty_mod+q close_tab -# map cmd+w close_tab - -#: Close OS window - -# map shift+cmd+w close_os_window - -#: Move tab forward - -# map kitty_mod+. move_tab_forward - -#: Move tab backward - -# map kitty_mod+, move_tab_backward - -#: Set tab title - -# map kitty_mod+alt+t set_tab_title -# map shift+cmd+i set_tab_title - - -#: You can also create shortcuts to go to specific tabs, with 1 being -#: the first tab, 2 the second tab and -1 being the previously active -#: tab, and any number larger than the last tab being the last tab:: - -#: map ctrl+alt+1 goto_tab 1 -#: map ctrl+alt+2 goto_tab 2 - -#: Just as with new_window above, you can also pass the name of -#: arbitrary commands to run when using new_tab and new_tab_with_cwd. -#: Finally, if you want the new tab to open next to the current tab -#: rather than at the end of the tabs list, use:: - -#: map ctrl+t new_tab !neighbor [optional cmd to run] -#: }}} - -#: Layout management {{{ - -#: Next layout - -# map kitty_mod+l next_layout - - -#: You can also create shortcuts to switch to specific layouts:: - -#: map ctrl+alt+t goto_layout tall -#: map ctrl+alt+s goto_layout stack - -#: Similarly, to switch back to the previous layout:: - -#: map ctrl+alt+p last_used_layout - -#: There is also a toggle_layout action that switches to the named -#: layout or back to the previous layout if in the named layout. -#: Useful to temporarily "zoom" the active window by switching to the -#: stack layout:: - -#: map ctrl+alt+z toggle_layout stack -#: }}} - -#: Font sizes {{{ - -#: You can change the font size for all top-level kitty OS windows at -#: a time or only the current one. - -#: Increase font size - -# map kitty_mod+equal change_font_size all +2.0 -# map kitty_mod+plus change_font_size all +2.0 -# map kitty_mod+kp_add change_font_size all +2.0 -# map cmd+plus change_font_size all +2.0 -# map cmd+equal change_font_size all +2.0 -# map shift+cmd+equal change_font_size all +2.0 - -#: Decrease font size - -# map kitty_mod+minus change_font_size all -2.0 -# map kitty_mod+kp_subtract change_font_size all -2.0 -# map cmd+minus change_font_size all -2.0 -# map shift+cmd+minus change_font_size all -2.0 - -#: Reset font size - -# map kitty_mod+backspace change_font_size all 0 -# map cmd+0 change_font_size all 0 - - -#: To setup shortcuts for specific font sizes:: - -#: map kitty_mod+f6 change_font_size all 10.0 - -#: To setup shortcuts to change only the current OS window's font -#: size:: - -#: map kitty_mod+f6 change_font_size current 10.0 -#: }}} - -#: Select and act on visible text {{{ - -#: Use the hints kitten to select text and either pass it to an -#: external program or insert it into the terminal or copy it to the -#: clipboard. - -#: Open URL - -# map kitty_mod+e open_url_with_hints - -#:: Open a currently visible URL using the keyboard. The program used -#:: to open the URL is specified in open_url_with. - -#: Insert selected path - -# map kitty_mod+p>f kitten hints --type path --program - - -#:: Select a path/filename and insert it into the terminal. Useful, -#:: for instance to run git commands on a filename output from a -#:: previous git command. - -#: Open selected path - -# map kitty_mod+p>shift+f kitten hints --type path - -#:: Select a path/filename and open it with the default open program. - -#: Insert selected line - -# map kitty_mod+p>l kitten hints --type line --program - - -#:: Select a line of text and insert it into the terminal. Useful for -#:: the output of things like: `ls -1`. - -#: Insert selected word - -# map kitty_mod+p>w kitten hints --type word --program - - -#:: Select words and insert into terminal. - -#: Insert selected hash - -# map kitty_mod+p>h kitten hints --type hash --program - - -#:: Select something that looks like a hash and insert it into the -#:: terminal. Useful with git, which uses SHA1 hashes to identify -#:: commits. - -#: Open the selected file at the selected line - -# map kitty_mod+p>n kitten hints --type linenum - -#:: Select something that looks like filename:linenum and open it in -#:: vim at the specified line number. - -#: Open the selected hyperlink - -# map kitty_mod+p>y kitten hints --type hyperlink - -#:: Select a hyperlink (i.e. a URL that has been marked as such by -#:: the terminal program, for example, by `ls --hyperlink=auto`). - - -#: The hints kitten has many more modes of operation that you can map -#: to different shortcuts. For a full description see hints kitten -#: <https://sw.kovidgoyal.net/kitty/kittens/hints/>. -#: }}} - -#: Miscellaneous {{{ - -#: Show documentation - -# map kitty_mod+f1 show_kitty_doc overview - -#: Toggle fullscreen - -# map kitty_mod+f11 toggle_fullscreen -# map ctrl+cmd+f toggle_fullscreen - -#: Toggle maximized - -# map kitty_mod+f10 toggle_maximized - -#: Toggle macOS secure keyboard entry - -# map opt+cmd+s toggle_macos_secure_keyboard_entry - -#: Unicode input - -# map kitty_mod+u kitten unicode_input -# map ctrl+cmd+space kitten unicode_input - -#: Edit config file - -# map kitty_mod+f2 edit_config_file -# map cmd+, edit_config_file - -#: Open the kitty command shell - -# map kitty_mod+escape kitty_shell window - -#:: Open the kitty shell in a new window / tab / overlay / os_window -#:: to control kitty using commands. - -#: Increase background opacity - -# map kitty_mod+a>m set_background_opacity +0.1 - -#: Decrease background opacity - -# map kitty_mod+a>l set_background_opacity -0.1 - -#: Make background fully opaque - -# map kitty_mod+a>1 set_background_opacity 1 - -#: Reset background opacity - -# map kitty_mod+a>d set_background_opacity default - -#: Reset the terminal - -# map kitty_mod+delete clear_terminal reset active -# map opt+cmd+r clear_terminal reset active - -#:: You can create shortcuts to clear/reset the terminal. For -#:: example:: - -#:: # Reset the terminal -#:: map f1 clear_terminal reset active -#:: # Clear the terminal screen by erasing all contents -#:: map f1 clear_terminal clear active -#:: # Clear the terminal scrollback by erasing it -#:: map f1 clear_terminal scrollback active -#:: # Scroll the contents of the screen into the scrollback -#:: map f1 clear_terminal scroll active -#:: # Clear everything up to the line with the cursor -#:: map f1 clear_terminal to_cursor active - -#:: If you want to operate on all kitty windows instead of just the -#:: current one, use all instead of active. - -#:: It is also possible to remap Ctrl+L to both scroll the current -#:: screen contents into the scrollback buffer and clear the screen, -#:: instead of just clearing the screen, for example, for ZSH add the -#:: following to ~/.zshrc: - -#:: .. code-block:: zsh - -#:: scroll-and-clear-screen() { -#:: printf '\n%.0s' {1..$LINES} -#:: zle clear-screen -#:: } -#:: zle -N scroll-and-clear-screen -#:: bindkey '^l' scroll-and-clear-screen - -#: Clear up to cursor line - -# map cmd+k clear_terminal to_cursor active - -#: Reload kitty.conf - -# map kitty_mod+f5 load_config_file -# map ctrl+cmd+, load_config_file - -#:: Reload kitty.conf, applying any changes since the last time it -#:: was loaded. Note that a handful of options cannot be dynamically -#:: changed and require a full restart of kitty. Particularly, when -#:: changing shortcuts for actions located on the macOS global menu -#:: bar, a full restart is needed. You can also map a keybinding to -#:: load a different config file, for example:: - -#:: map f5 load_config /path/to/alternative/kitty.conf - -#:: Note that all options from the original kitty.conf are discarded, -#:: in other words the new configuration *replace* the old ones. - -#: Debug kitty configuration - -# map kitty_mod+f6 debug_config -# map opt+cmd+, debug_config - -#:: Show details about exactly what configuration kitty is running -#:: with and its host environment. Useful for debugging issues. - -#: Send arbitrary text on key presses - -#:: E.g. map ctrl+shift+alt+h send_text all Hello World - -#:: You can tell kitty to send arbitrary (UTF-8) encoded text to the -#:: client program when pressing specified shortcut keys. For -#:: example:: - -#:: map ctrl+alt+a send_text all Special text - -#:: This will send "Special text" when you press the Ctrl+Alt+A key -#:: combination. The text to be sent decodes ANSI C escapes -#:: <https://www.gnu.org/software/bash/manual/html_node/ANSI_002dC- -#:: Quoting.html> so you can use escapes like \e to send control -#:: codes or \u21fb to send Unicode characters (or you can just input -#:: the Unicode characters directly as UTF-8 text). You can use -#:: `kitty +kitten show_key` to get the key escape codes you want to -#:: emulate. - -#:: The first argument to send_text is the keyboard modes in which to -#:: activate the shortcut. The possible values are normal, -#:: application, kitty or a comma separated combination of them. The -#:: modes normal and application refer to the DECCKM cursor key mode -#:: for terminals, and kitty refers to the kitty extended keyboard -#:: protocol. The special value all means all of them. - -#:: Some more examples:: - -#:: # Output a word and move the cursor to the start of the line (like typing and pressing Home) -#:: map ctrl+alt+a send_text normal Word\e[H -#:: map ctrl+alt+a send_text application Word\eOH -#:: # Run a command at a shell prompt (like typing the command and pressing Enter) -#:: map ctrl+alt+a send_text normal,application some command with arguments\r - -#: Open kitty Website - -# map shift+cmd+/ open_url https://sw.kovidgoyal.net/kitty/ - -#: Hide macOS kitty application - -# map cmd+h hide_macos_app - -#: Hide macOS other applications - -# map opt+cmd+h hide_macos_other_apps - -#: Minimize macOS window - -# map cmd+m minimize_macos_window - -#: Quit kitty - -# map cmd+q quit - -#: }}} - -#: }}} - diff --git a/stow/kitty/.config/kitty/themes/tdpeuter-dark.conf b/stow/kitty/.config/kitty/themes/tdpeuter-dark.conf deleted file mode 100644 index 74d0bb6..0000000 --- a/stow/kitty/.config/kitty/themes/tdpeuter-dark.conf +++ /dev/null @@ -1,39 +0,0 @@ -foreground #dcdfe4 -background #171717 -selection_foreground #000000 -selection_background #FFFACD -url_color #0087BD - -# black -color0 #21222c -color8 #6272a4 - -# red -color1 #C86564 -color9 #C86564 - -# green -color2 #B2BC68 -color10 #B2BC68 - -# yellow -color3 #f7e03f -color11 #f7e03f - -# blue -color4 #80A2BE -color12 #80A2BE - -# magenta -color5 #b294bb -color13 #b294bb - -# cyan -# color6 #60C7CE -# color14 #60C7CE -color6 #8ABEB7 -color14 #8ABEB7 - -# white -color7 #ffffff -color15 #ffffff diff --git a/stow/kitty/.config/kitty/themes/tdpeuter-light.conf b/stow/kitty/.config/kitty/themes/tdpeuter-light.conf deleted file mode 100644 index b2537b7..0000000 --- a/stow/kitty/.config/kitty/themes/tdpeuter-light.conf +++ /dev/null @@ -1,37 +0,0 @@ -foreground #000000 -background #FAFAFA -selection_foreground #383A42 -selection_background #BFCEFF -url_color #F0F0F0 - -# black -color0 #383A42 -color8 #6272a4 - -# red -color1 #E45649 -color9 #E45649 - -# green -color2 #40A14F -color10 #40A14F - -# yellow -color3 #C18401 -color11 #C18401 - -# blue -color4 #0184BC -color12 #0184BC - -# magenta -color5 #A626A4 -color13 #A626A4 - -# cyan -color6 #0997B3 -color14 #0997B3 - -# white -color7 #FAFAFA -color15 #FAFAFA diff --git a/stow/openrgb/.config/OpenRGB/Default.orp b/stow/openrgb/.config/OpenRGB/Default.orp deleted file mode 100644 index e1de89b..0000000 Binary files a/stow/openrgb/.config/OpenRGB/Default.orp and /dev/null differ diff --git a/stow/openrgb/.config/OpenRGB/OpenRGB.json b/stow/openrgb/.config/OpenRGB/OpenRGB.json deleted file mode 100644 index beb068d..0000000 --- a/stow/openrgb/.config/OpenRGB/OpenRGB.json +++ /dev/null @@ -1,1096 +0,0 @@ -{ - "AutoStart": { - "client": "localhost:6742", - "custom": "", - "enabled": true, - "host": "0.0.0.0", - "port": "6742", - "profile": "Default", - "setclient": false, - "setcustom": false, - "setminimized": false, - "setprofile": true, - "setserver": false, - "setserverhost": false, - "setserverport": false - }, - "Detectors": { - "detectors": { - "AMD Wraith Prism": false, - "ASRock Deskmini Addressable LED Strip": false, - "ASRock Motherboard SMBus Controllers": false, - "ASRock Polychrome SMBus": false, - "ASRock Polychrome USB": false, - "ASUS AREZ Strix RX Vega 56 O8G": false, - "ASUS Aura Addressable": false, - "ASUS Aura Core": false, - "ASUS Aura GPU": false, - "ASUS Aura GPU (ENE)": false, - "ASUS Aura Motherboard": false, - "ASUS Aura SMBus Motherboard": false, - "ASUS Cerberus Mech": false, - "ASUS GTX 1060 Strix": false, - "ASUS GTX 1060 Strix 6G Gaming": false, - "ASUS GTX 1070 Strix Gaming": false, - "ASUS GTX 1070 Strix OC": false, - "ASUS GTX 1080 Strix OC": false, - "ASUS KO RTX 3060 O12G V2 GAMING": false, - "ASUS KO RTX 3060 OC O12G GAMING": false, - "ASUS KO RTX 3060Ti O8G V2 GAMING": false, - "ASUS KO RTX 3070 O8G V2 GAMING": false, - "ASUS ROG AURA Terminal": false, - "ASUS ROG Balteus": false, - "ASUS ROG Balteus Qi": false, - "ASUS ROG Chakram (Wireless)": false, - "ASUS ROG Claymore": false, - "ASUS ROG Falchion (Wired)": false, - "ASUS ROG Falchion (Wireless)": false, - "ASUS ROG GTX 1660 Ti OC 6G": false, - "ASUS ROG Gladius II": false, - "ASUS ROG Gladius II Core": false, - "ASUS ROG Gladius II Origin": false, - "ASUS ROG Gladius II Origin COD": false, - "ASUS ROG Gladius II Origin PNK LTD": false, - "ASUS ROG Gladius II Wireless": false, - "ASUS ROG Gladius III": false, - "ASUS ROG Gladius III Wireless 2.4Ghz": false, - "ASUS ROG Gladius III Wireless Bluetooth": false, - "ASUS ROG Gladius III Wireless USB": false, - "ASUS ROG Keris": false, - "ASUS ROG Keris Wireless 2.4Ghz": false, - "ASUS ROG Keris Wireless Bluetooth": false, - "ASUS ROG Keris Wireless USB": false, - "ASUS ROG PG32UQ": false, - "ASUS ROG Pugio": false, - "ASUS ROG Pugio II (Wired)": false, - "ASUS ROG Pugio II (Wireless)": false, - "ASUS ROG Ryuo AIO": false, - "ASUS ROG STRIX 3060 O12G GAMING": false, - "ASUS ROG STRIX 3060 O12G V2 GAMING": false, - "ASUS ROG STRIX 3060Ti O8G OC": false, - "ASUS ROG STRIX 3060Ti O8G V2": false, - "ASUS ROG STRIX 3070 O8G GAMING": false, - "ASUS ROG STRIX 3070 O8G V2 GAMING": false, - "ASUS ROG STRIX 3070 O8G V2 White": false, - "ASUS ROG STRIX 3070 O8G White": false, - "ASUS ROG STRIX 3070 OC": false, - "ASUS ROG STRIX 3070Ti O8G GAMING": false, - "ASUS ROG STRIX 3080 10G GAMING": false, - "ASUS ROG STRIX 3080 10G V2 GAMING": false, - "ASUS ROG STRIX 3080 O10G GAMING": false, - "ASUS ROG STRIX 3080 O10G V2 GAMING": false, - "ASUS ROG STRIX 3080 O10G V2 WHITE": false, - "ASUS ROG STRIX 3080 O10G WHITE": false, - "ASUS ROG STRIX 3080Ti O12G GAMING": false, - "ASUS ROG STRIX 3090 24G GAMING": false, - "ASUS ROG STRIX 3090 O24G GAMING": false, - "ASUS ROG STRIX 3090 O24G GAMING White OC": false, - "ASUS ROG STRIX LC 3080Ti O12G GAMING": false, - "ASUS ROG STRIX RTX 2060 EVO Gaming 6G": false, - "ASUS ROG STRIX RTX 2060 O6G EVO Gaming": false, - "ASUS ROG STRIX RTX 2060 O6G Gaming": false, - "ASUS ROG STRIX RTX 2060S 8G Gaming": false, - "ASUS ROG STRIX RTX 2060S A8G EVO Gaming": false, - "ASUS ROG STRIX RTX 2060S A8G Gaming": false, - "ASUS ROG STRIX RTX 2060S O8G Gaming": false, - "ASUS ROG STRIX RTX 2070 A8G Gaming": false, - "ASUS ROG STRIX RTX 2070 O8G Gaming": false, - "ASUS ROG STRIX RTX 2070S 8G Gaming": false, - "ASUS ROG STRIX RTX 2070S A8G Gaming": false, - "ASUS ROG STRIX RTX 2070S O8G Gaming": false, - "ASUS ROG STRIX RTX 2080 8G Gaming": false, - "ASUS ROG STRIX RTX 2080 O8G Gaming": false, - "ASUS ROG STRIX RTX 2080 O8G V2 Gaming": false, - "ASUS ROG STRIX RTX 2080 Ti 11G Gaming": false, - "ASUS ROG STRIX RTX 2080 Ti A11G Gaming": false, - "ASUS ROG STRIX RTX 2080 Ti O11G Gaming": false, - "ASUS ROG STRIX RTX 2080S A8G Gaming": false, - "ASUS ROG STRIX RTX 2080S O8G Gaming": false, - "ASUS ROG STRIX RTX 2080S O8G White": false, - "ASUS ROG STRIX RTX 3080 12G": false, - "ASUS ROG STRIX RTX 3080 O12G": false, - "ASUS ROG STRIX RX470 O4G GAMING": false, - "ASUS ROG STRIX RX480 Gaming OC": false, - "ASUS ROG STRIX RX560 Gaming": false, - "ASUS ROG Strix Claw": false, - "ASUS ROG Strix Evolve": false, - "ASUS ROG Strix Flare": false, - "ASUS ROG Strix Flare PNK LTD": false, - "ASUS ROG Strix GTX 1050 O2G Gaming": false, - "ASUS ROG Strix GTX 1050 TI 4G Gaming": false, - "ASUS ROG Strix GTX 1050 TI O4G Gaming": false, - "ASUS ROG Strix GTX 1650S OC 4G": false, - "ASUS ROG Strix GTX 1660S O6G Gaming": false, - "ASUS ROG Strix GTX1070 Ti 8G Gaming": false, - "ASUS ROG Strix GTX1070 Ti A8G Gaming": false, - "ASUS ROG Strix GTX1080 A8G Gaming": false, - "ASUS ROG Strix GTX1080 O8G 11Gbps": false, - "ASUS ROG Strix GTX1080 O8G Gaming": false, - "ASUS ROG Strix GTX1080 Ti 11G Gaming": false, - "ASUS ROG Strix GTX1080 Ti Gaming": false, - "ASUS ROG Strix GTX1080 Ti O11G Gaming": false, - "ASUS ROG Strix Impact": false, - "ASUS ROG Strix Impact II": false, - "ASUS ROG Strix Impact II Electro Punk": false, - "ASUS ROG Strix Impact II Gundam": false, - "ASUS ROG Strix Impact II Moonlight White": false, - "ASUS ROG Strix Impact II Wireless 2.4 Ghz": false, - "ASUS ROG Strix Impact II Wireless USB": false, - "ASUS ROG Strix LC": false, - "ASUS ROG Strix SCAR 15": false, - "ASUS ROG Strix Scope": false, - "ASUS ROG Strix Scope RX": false, - "ASUS ROG Strix Scope TKL": false, - "ASUS ROG Strix Scope TKL PNK LTD": false, - "ASUS ROG Strix XG27AQ": false, - "ASUS ROG Strix XG27AQM": false, - "ASUS ROG Strix XG27W": false, - "ASUS ROG Throne": false, - "ASUS ROG Throne QI": false, - "ASUS ROG Throne QI GUNDAM": false, - "ASUS RX 5600XT Strix O6G Gaming": false, - "ASUS RX 570 Strix O4G Gaming OC": false, - "ASUS RX 5700XT Strix Gaming OC": false, - "ASUS RX 580 Strix Gaming OC": false, - "ASUS RX 580 Strix Gaming TOP": false, - "ASUS RX 6800 TUF Gaming OC": false, - "ASUS TUF 3060 O12G GAMING": false, - "ASUS TUF 3060 O12G V2 GAMING": false, - "ASUS TUF Gaming K3": false, - "ASUS TUF Gaming K7": false, - "ASUS TUF Gaming M3": false, - "ASUS TUF Gaming M5": false, - "ASUS TUF RTX 3060 Ti 8G Gaming OC": false, - "ASUS TUF RTX 3060Ti O8G OC": false, - "ASUS TUF RTX 3070 O8G GAMING": false, - "ASUS TUF RTX 3070 O8G V2 GAMING": false, - "ASUS TUF RTX 3070Ti O8G GAMING": false, - "ASUS TUF RTX 3070Ti O8G V2 GAMING": false, - "ASUS TUF RTX 3080 10G GAMING": false, - "ASUS TUF RTX 3080 O10G OC": false, - "ASUS TUF RTX 3080 O10G V2 GAMING": false, - "ASUS TUF RTX 3080 O12G GAMING": false, - "ASUS TUF RTX 3080Ti 12G GAMING": false, - "ASUS TUF RTX 3080Ti O12G GAMING": false, - "ASUS TUF RTX 3090 O24G": false, - "ASUS TUF RTX 3090 O24G OC": false, - "ASUS TUF RTX 4090 O24G": false, - "ASUS TUF RTX 4090 O24G OC": false, - "ASUS TUF RX 6800XT O16G GAMING": false, - "ASUS TUF RX 6900XT O16G GAMING": false, - "ASUS TUF RX 6900XT T16G GAMING": false, - "ASUS Vega 64 Strix": false, - "ASUS_TUF RX 6700XT O12G GAMING": false, - "Acer Predator Gaming Mouse (Rival 300)": false, - "Alienware AW510K": false, - "Anne Pro 2": false, - "Aorus CPU Coolers": false, - "Asus ROG Chakram (Wired)": false, - "Asus ROG Chakram Core": false, - "BlinkyTape": false, - "Bloody MP 50RS": false, - "Bloody W60 Pro": false, - "Cooler Master ARGB": false, - "Cooler Master ARGB Gen 2 A1": false, - "Cooler Master ARGB Gen 2 A1 V2": false, - "Cooler Master MK570": false, - "Cooler Master MK750": false, - "Cooler Master MM530": false, - "Cooler Master MM711": false, - "Cooler Master MM720": false, - "Cooler Master MM730": false, - "Cooler Master MP750 Large": false, - "Cooler Master MP750 Medium": false, - "Cooler Master MP750 XL": false, - "Cooler Master MasterKeys Pro L": false, - "Cooler Master MasterKeys Pro L White": false, - "Cooler Master MasterKeys Pro S": false, - "Cooler Master RGB": false, - "Cooler Master Radeon 6000 GPU": false, - "Cooler Master Radeon 6900 GPU": false, - "Cooler Master SK630": false, - "Cooler Master SK650": false, - "Cooler Master Small ARGB": false, - "Corsair 1000D Obsidian": false, - "Corsair Commander Core": false, - "Corsair Commander Pro": false, - "Corsair Dominator Platinum": false, - "Corsair Glaive RGB": false, - "Corsair Glaive RGB PRO": true, - "Corsair Harpoon RGB": false, - "Corsair Harpoon RGB PRO": false, - "Corsair Hydro H100i Platinum": false, - "Corsair Hydro H100i Platinum SE": false, - "Corsair Hydro H100i Pro XT": false, - "Corsair Hydro H100i Pro XT v2": false, - "Corsair Hydro H115i Platinum": false, - "Corsair Hydro H115i Pro XT": false, - "Corsair Hydro H150i Pro XT": false, - "Corsair Hydro H60i Pro XT": false, - "Corsair Hydro Series": false, - "Corsair Ironclaw RGB": false, - "Corsair K100": false, - "Corsair K55 RGB": false, - "Corsair K55 RGB PRO": false, - "Corsair K55 RGB PRO XT": false, - "Corsair K57 RGB (Wired)": false, - "Corsair K60 RGB PRO": false, - "Corsair K60 RGB PRO Low Profile": false, - "Corsair K65 LUX RGB": false, - "Corsair K65 Mini": false, - "Corsair K65 RGB": false, - "Corsair K65 RGB RAPIDFIRE": false, - "Corsair K68 RGB": true, - "Corsair K70 LUX": false, - "Corsair K70 LUX RGB": false, - "Corsair K70 RGB": false, - "Corsair K70 RGB MK.2": false, - "Corsair K70 RGB MK.2 Low Profile": false, - "Corsair K70 RGB MK.2 SE": false, - "Corsair K70 RGB RAPIDFIRE": false, - "Corsair K95 RGB": false, - "Corsair K95 RGB PLATINUM": false, - "Corsair K95 RGB PLATINUM XT": false, - "Corsair LS100 Lighting Kit": false, - "Corsair LT100": false, - "Corsair Lighting Node Core": false, - "Corsair Lighting Node Pro": false, - "Corsair M65": false, - "Corsair M65 PRO": false, - "Corsair M65 RGB Elite": false, - "Corsair MM700": false, - "Corsair MM800 RGB Polaris": false, - "Corsair Nightsword": false, - "Corsair SPEC OMEGA RGB": false, - "Corsair ST100 RGB": false, - "Corsair Sabre RGB": false, - "Corsair Scimitar Elite RGB": false, - "Corsair Scimitar PRO RGB": false, - "Corsair Scimitar RGB": false, - "Corsair Strafe": false, - "Corsair Strafe MK.2": false, - "Corsair Strafe Red": false, - "Corsair Vengeance": false, - "Corsair Vengeance Pro": false, - "Cougar 700K EVO Gaming Keyboard": false, - "Cougar Revenger ST": false, - "Creative SoundBlasterX G6": false, - "Crucial": false, - "Dark Project KD3B V2": false, - "Das Keyboard Q4 RGB": false, - "Das Keyboard Q5 RGB": false, - "Debug Controllers": false, - "Dell G Series LED Controller": false, - "Ducky One 2 RGB TKL": false, - "Ducky Shine 7/Ducky One 2 RGB": false, - "Dygma Raise": false, - "E1.31": false, - "EK Loop Connect": false, - "ENE SMBus DRAM": false, - "EVGA GP102 GPU": false, - "EVGA GPU": false, - "EVGA GeForce RTX 2070 SUPER FTW3 Ultra": false, - "EVGA GeForce RTX 2070 SUPER FTW3 Ultra+": false, - "EVGA GeForce RTX 2070 SUPER XC Ultra": false, - "EVGA GeForce RTX 2070 SUPER XC Ultra+": false, - "EVGA GeForce RTX 2070 XC Gaming": false, - "EVGA GeForce RTX 2070 XC OC": false, - "EVGA GeForce RTX 2080 Black": false, - "EVGA GeForce RTX 2080 SUPER FTW3 Hybrid OC": false, - "EVGA GeForce RTX 2080 SUPER FTW3 Ultra": false, - "EVGA GeForce RTX 2080 SUPER FTW3 Ultra Hydro Copper": false, - "EVGA GeForce RTX 2080 SUPER XC Gaming": false, - "EVGA GeForce RTX 2080 SUPER XC Ultra": false, - "EVGA GeForce RTX 2080 XC Black": false, - "EVGA GeForce RTX 2080 XC Gaming": false, - "EVGA GeForce RTX 2080 XC Ultra Gaming": false, - "EVGA GeForce RTX 2080Ti Black": false, - "EVGA GeForce RTX 2080Ti FTW3 Ultra": false, - "EVGA GeForce RTX 2080Ti XC HYBRID GAMING": false, - "EVGA GeForce RTX 2080Ti XC HYDRO COPPER": false, - "EVGA GeForce RTX 2080Ti XC Ultra": false, - "EVGA GeForce RTX 3060TI FTW3 Gaming": false, - "EVGA GeForce RTX 3060TI FTW3 Ultra": false, - "EVGA GeForce RTX 3060TI FTW3 Ultra LHR": false, - "EVGA GeForce RTX 3070 Black Gaming": false, - "EVGA GeForce RTX 3070 FTW3 Ultra": false, - "EVGA GeForce RTX 3070 FTW3 Ultra LHR": false, - "EVGA GeForce RTX 3070 XC3 Gaming": false, - "EVGA GeForce RTX 3070 XC3 Ultra": false, - "EVGA GeForce RTX 3070 XC3 Ultra LHR": false, - "EVGA GeForce RTX 3070Ti FTW3 Ultra": false, - "EVGA GeForce RTX 3070Ti FTW3 Ultra v2": false, - "EVGA GeForce RTX 3070Ti XC3 Gaming": false, - "EVGA GeForce RTX 3070Ti XC3 Ultra": false, - "EVGA GeForce RTX 3070Ti XC3 Ultra v2": false, - "EVGA GeForce RTX 3080 FTW3 Gaming": false, - "EVGA GeForce RTX 3080 FTW3 Ultra": false, - "EVGA GeForce RTX 3080 FTW3 Ultra 12GB": false, - "EVGA GeForce RTX 3080 FTW3 Ultra Hybrid": false, - "EVGA GeForce RTX 3080 FTW3 Ultra Hybrid Gaming LHR": false, - "EVGA GeForce RTX 3080 FTW3 Ultra Hybrid LHR": false, - "EVGA GeForce RTX 3080 FTW3 Ultra Hydro Copper": false, - "EVGA GeForce RTX 3080 FTW3 Ultra Hydro Copper 12G": false, - "EVGA GeForce RTX 3080 FTW3 Ultra LHR": false, - "EVGA GeForce RTX 3080 FTW3 Ultra v2 LHR": false, - "EVGA GeForce RTX 3080 XC3 Black": false, - "EVGA GeForce RTX 3080 XC3 Black LHR": false, - "EVGA GeForce RTX 3080 XC3 Gaming": false, - "EVGA GeForce RTX 3080 XC3 Gaming LHR": false, - "EVGA GeForce RTX 3080 XC3 Ultra": false, - "EVGA GeForce RTX 3080 XC3 Ultra Hybrid": false, - "EVGA GeForce RTX 3080 XC3 Ultra Hybrid LHR": false, - "EVGA GeForce RTX 3080 XC3 Ultra Hydro Copper": false, - "EVGA GeForce RTX 3080 XC3 Ultra LHR": false, - "EVGA GeForce RTX 3080Ti FTW3 Ultra": false, - "EVGA GeForce RTX 3080Ti FTW3 Ultra Hybrid": false, - "EVGA GeForce RTX 3080Ti FTW3 Ultra Hydro Copper": false, - "EVGA GeForce RTX 3080Ti XC3 Gaming": false, - "EVGA GeForce RTX 3080Ti XC3 Gaming Hybrid": false, - "EVGA GeForce RTX 3080Ti XC3 Gaming Hydro Copper": false, - "EVGA GeForce RTX 3080Ti XC3 Ultra Gaming": false, - "EVGA GeForce RTX 3090 FTW3 Ultra": false, - "EVGA GeForce RTX 3090 FTW3 Ultra Hybrid": false, - "EVGA GeForce RTX 3090 FTW3 Ultra Hydro Copper": false, - "EVGA GeForce RTX 3090 FTW3 Ultra v2": false, - "EVGA GeForce RTX 3090 FTW3 Ultra v3": false, - "EVGA GeForce RTX 3090 K|NGP|N Hybrid": false, - "EVGA GeForce RTX 3090 K|NGP|N Hydro Copper": false, - "EVGA GeForce RTX 3090 XC3 Black": false, - "EVGA GeForce RTX 3090 XC3 Gaming": false, - "EVGA GeForce RTX 3090 XC3 Ultra": false, - "EVGA GeForce RTX 3090 XC3 Ultra Hybrid": false, - "EVGA GeForce RTX 3090 XC3 Ultra Hydro Copper": false, - "EVGA GeForce RTX 3090Ti FTW3 Gaming": false, - "EVGA GeForce RTX 3090Ti FTW3 Ultra Gaming": false, - "EVGA Pascal GPU": false, - "EVGA X20 Gaming Mouse": false, - "EVGA X20 USB Receiver": false, - "EVGA Z15 Keyboard": false, - "EVGA Z20 Keyboard": false, - "EVision Keyboard 0C45:5004": false, - "EVision Keyboard 0C45:5104": false, - "EVision Keyboard 0C45:5204": false, - "EVision Keyboard 0C45:652F": false, - "EVision Keyboard 0C45:7698": false, - "EVision Keyboard 0C45:8520": false, - "EVision Keyboard 320F:502A": false, - "ElgatoKeyLight": false, - "Espurna": false, - "Everest GT-100 RGB": false, - "FL ESPORTS F11": false, - "FanBus": false, - "Faustus": false, - "GALAX RTX 2070 Super EX Gamer Black": false, - "GaiZhongGai 17 PRO": false, - "GaiZhongGai 17+4+Touch PRO": false, - "GaiZhongGai 20 PRO": false, - "GaiZhongGai 68+4 PRO": false, - "Gainward GPU": false, - "Gainward GTX 1080 Phoenix": false, - "Gainward GTX 1080 Ti Phoenix": false, - "Gainward RTX 2070 Super Phantom": false, - "Gainward RTX 2080 Phoenix GS": false, - "Gainward RTX 3070 Phoenix": false, - "Gainward RTX 3080 Ti Phoenix": false, - "Galax GPU": false, - "Genesis Thor 300": false, - "Gigabyte AORUS RTX2060 SUPER 8G V1": false, - "Gigabyte AORUS RTX2070 SUPER 8G": false, - "Gigabyte AORUS RTX2070 XTREME 8G": false, - "Gigabyte AORUS RTX2080 8G": false, - "Gigabyte AORUS RTX2080 SUPER 8G": false, - "Gigabyte AORUS RTX2080 SUPER 8G Rev 1.0": false, - "Gigabyte AORUS RTX2080 SUPER Waterforce WB 8G": false, - "Gigabyte AORUS RTX2080 Ti XTREME 11G": false, - "Gigabyte AORUS RTX2080 XTREME 8G": false, - "Gigabyte AORUS RTX3060 ELITE 12G": false, - "Gigabyte AORUS RTX3060 Ti ELITE 8G LHR": false, - "Gigabyte AORUS RTX3070 Ti MASTER 8G": false, - "Gigabyte AORUS RTX3080 Ti XTREME WATERFORCE 12G": false, - "Gigabyte AORUS RTX3080 XTREME WATERFORCE 10G Rev 2.0": false, - "Gigabyte AORUS RTX3080 XTREME WATERFORCE WB 10G": false, - "Gigabyte AORUS RTX3090 XTREME WATERFORCE 24G": false, - "Gigabyte AORUS RTX3090 XTREME WATERFORCE WB 24G": false, - "Gigabyte GTX1050 Ti G1 Gaming": false, - "Gigabyte GTX1050 Ti G1 Gaming (rev A1)": false, - "Gigabyte GTX1060 G1 Gaming 6G": false, - "Gigabyte GTX1060 G1 Gaming 6G OC": false, - "Gigabyte GTX1060 Xtreme Gaming V1": false, - "Gigabyte GTX1060 Xtreme Gaming v2": false, - "Gigabyte GTX1070 G1 Gaming 8G V1": false, - "Gigabyte GTX1070 Ti 8G Gaming": false, - "Gigabyte GTX1070 Xtreme Gaming": false, - "Gigabyte GTX1080 G1 Gaming": false, - "Gigabyte GTX1080 Ti 11G": false, - "Gigabyte GTX1080 Ti Gaming OC 11G": false, - "Gigabyte GTX1080 Ti Gaming OC BLACK 11G": false, - "Gigabyte GTX1080 Ti Xtreme Edition": false, - "Gigabyte GTX1080 Ti Xtreme Waterforce Edition": false, - "Gigabyte GTX1650 Gaming OC": false, - "Gigabyte GTX1660 Gaming OC 6G": false, - "Gigabyte GTX1660 SUPER Gaming OC": false, - "Gigabyte RGB": false, - "Gigabyte RGB Fusion": false, - "Gigabyte RGB Fusion 2 DRAM": false, - "Gigabyte RGB Fusion 2 SMBus": false, - "Gigabyte RGB Fusion 2 USB": false, - "Gigabyte RGB Fusion GPU": false, - "Gigabyte RGB Fusion2 GPU": false, - "Gigabyte RTX2060 Gaming OC": false, - "Gigabyte RTX2060 Gaming OC PRO": false, - "Gigabyte RTX2060 Gaming OC PRO V2": false, - "Gigabyte RTX2060 Gaming OC PRO White": false, - "Gigabyte RTX2060 SUPER Gaming": false, - "Gigabyte RTX2060 SUPER Gaming OC": false, - "Gigabyte RTX2060 SUPER Gaming OC 3X 8G V2": false, - "Gigabyte RTX2060 SUPER Gaming OC 3X White 8G": false, - "Gigabyte RTX2070 Gaming OC 8G": false, - "Gigabyte RTX2070 Windforce 8G": false, - "Gigabyte RTX2070S Gaming OC": false, - "Gigabyte RTX2070S Gaming OC 3X": false, - "Gigabyte RTX2070S Gaming OC 3X White": false, - "Gigabyte RTX2080 Gaming OC 8G": false, - "Gigabyte RTX2080 Ti GAMING OC 11G": false, - "Gigabyte RTX2080S Gaming OC 8G": false, - "Gigabyte RTX3050 Gaming OC 8G": false, - "Gigabyte RTX3060 EAGLE 12G LHR V2": false, - "Gigabyte RTX3060 EAGLE OC 12G": false, - "Gigabyte RTX3060 EAGLE OC 12G V2": false, - "Gigabyte RTX3060 Gaming OC 12G": false, - "Gigabyte RTX3060 Gaming OC 12G (rev. 2.0)": false, - "Gigabyte RTX3060 Ti EAGLE OC 8G": false, - "Gigabyte RTX3060 Ti EAGLE OC 8G V2.0 LHR": false, - "Gigabyte RTX3060 Ti GAMING OC LHR 8G": false, - "Gigabyte RTX3060 Ti GAMING OC PRO 8G": false, - "Gigabyte RTX3060 Ti Gaming OC PRO 8G LHR": false, - "Gigabyte RTX3060 Ti Vision OC 8G": false, - "Gigabyte RTX3060 Vision OC 12G": false, - "Gigabyte RTX3060 Vision OC 12G LHR": false, - "Gigabyte RTX3060 Vision OC 12G v3.0": false, - "Gigabyte RTX3070 Eagle OC 8G": false, - "Gigabyte RTX3070 Gaming OC 8G": false, - "Gigabyte RTX3070 Gaming OC 8G v3.0 LHR": false, - "Gigabyte RTX3070 MASTER 8G": false, - "Gigabyte RTX3070 MASTER 8G LHR": false, - "Gigabyte RTX3070 Ti EAGLE 8G": false, - "Gigabyte RTX3070 Ti Gaming OC 8G": false, - "Gigabyte RTX3070 Ti Vision OC 8G": false, - "Gigabyte RTX3070 Vision 8G": false, - "Gigabyte RTX3070 Vision 8G V2.0 LHR": false, - "Gigabyte RTX3080 Gaming OC 10G": false, - "Gigabyte RTX3080 Gaming OC 12G": false, - "Gigabyte RTX3080 Ti EAGLE 12G": false, - "Gigabyte RTX3080 Ti Gaming OC 12G": false, - "Gigabyte RTX3080 Ti Vision OC 12G": false, - "Gigabyte RTX3080 Vision OC 10G": false, - "Gigabyte RTX3080 Vision OC 10G (REV 2.0)": false, - "Gigabyte RTX3090 Gaming OC 24G": false, - "Glorious Model D / D-": false, - "Glorious Model D / D- Wireless": false, - "Glorious Model O / O-": false, - "Glorious Model O / O- Wireless": false, - "HP Omen 30L": false, - "Holtek Mousemat": false, - "Holtek USB Gaming Mouse": false, - "HyperX Alloy Elite 2": false, - "HyperX Alloy Elite 2 (HP)": false, - "HyperX Alloy Elite RGB": false, - "HyperX Alloy FPS RGB": false, - "HyperX Alloy Origins": false, - "HyperX Alloy Origins 60": false, - "HyperX Alloy Origins Core": false, - "HyperX DRAM": false, - "HyperX Fury Ultra": false, - "HyperX Pulsefire Core": false, - "HyperX Pulsefire Dart (Wired)": false, - "HyperX Pulsefire Dart (Wireless)": false, - "HyperX Pulsefire FPS Pro": false, - "HyperX Pulsefire Haste": false, - "HyperX Pulsefire Mat": false, - "HyperX Pulsefire Raid": false, - "HyperX Pulsefire Surge": false, - "Intel Arc A770 Limited Edition": false, - "KFA2 RTX 2070 EX": false, - "KFA2 RTX 2080 EX OC": false, - "KFA2 RTX 2080 Super EX OC": false, - "KFA2 RTX 2080 TI EX OC": false, - "Keychron Gaming Keyboard 1": false, - "LED Strip": false, - "LIFX": false, - "Lenovo Legion 7 gen 5": false, - "Lenovo Legion 7 gen 6": false, - "Lenovo Legion 7S gen 5": false, - "Lenovo Legion 7S gen 6": false, - "Lenovo Legion Y740": false, - "Lian Li O11 Dynamic - Razer Edition": false, - "Lian Li Uni Hub": false, - "Lian Li Uni Hub - AL": false, - "Linux LED": false, - "Logitech G Pro (HERO) Gaming Mouse": false, - "Logitech G Pro Gaming Mouse": false, - "Logitech G Pro RGB Mechanical Gaming Keyboard": false, - "Logitech G Pro Wireless Gaming Mouse": false, - "Logitech G Pro Wireless Gaming Mouse (wired)": false, - "Logitech G203 Lightsync": false, - "Logitech G203 Prodigy": false, - "Logitech G213": false, - "Logitech G303 Daedalus Apex": false, - "Logitech G403 Hero": false, - "Logitech G403 Prodigy Gaming Mouse": false, - "Logitech G403 Wireless Gaming Mouse": false, - "Logitech G403 Wireless Gaming Mouse (wired)": false, - "Logitech G502 Hero Gaming Mouse": false, - "Logitech G502 Proteus Spectrum Gaming Mouse": false, - "Logitech G502 Wireless Gaming Mouse": false, - "Logitech G502 Wireless Gaming Mouse (wired)": false, - "Logitech G512": false, - "Logitech G512 RGB": false, - "Logitech G560 Lightsync Speaker": false, - "Logitech G610 Orion": false, - "Logitech G703 Hero Wireless Gaming Mouse": false, - "Logitech G703 Hero Wireless Gaming Mouse (wired)": false, - "Logitech G703 Wireless Gaming Mouse": false, - "Logitech G703 Wireless Gaming Mouse (wired)": false, - "Logitech G733 Gaming Headset": false, - "Logitech G810 Orion Spectrum": false, - "Logitech G813 RGB Mechanical Gaming Keyboard": false, - "Logitech G815 RGB Mechanical Gaming Keyboard": false, - "Logitech G900 Wireless Gaming Mouse": false, - "Logitech G900 Wireless Gaming Mouse (wired)": false, - "Logitech G903 Hero Wireless Gaming Mouse": false, - "Logitech G903 Hero Wireless Gaming Mouse (wired)": false, - "Logitech G903 Wireless Gaming Mouse": false, - "Logitech G903 Wireless Gaming Mouse (wired)": false, - "Logitech G910 Orion Spark": false, - "Logitech G910 Orion Spectrum": false, - "Logitech G915 Wireless RGB Mechanical Gaming Keyboard": false, - "Logitech G915 Wireless RGB Mechanical Gaming Keyboard (Wired)": false, - "Logitech G915TKL Wireless RGB Mechanical Gaming Keyboard": false, - "Logitech G915TKL Wireless RGB Mechanical Gaming Keyboard (Wired)": false, - "Logitech G933 Lightsync Headset": false, - "Logitech G935 Gaming Headset": false, - "Logitech Powerplay Mat": false, - "Logitech X56 Rhino Hotas Joystick": false, - "Logitech X56 Rhino Hotas Throttle": false, - "MSI 3-Zone Laptop": false, - "MSI GPU": false, - "MSI GeForce GTX 1070 Gaming X": false, - "MSI GeForce GTX 1660 Gaming X 6G": false, - "MSI GeForce GTX 1660 Super Gaming 6G": false, - "MSI GeForce GTX 1660 Super Gaming X 6G": false, - "MSI GeForce GTX 1660Ti Gaming 6G": false, - "MSI GeForce GTX 1660Ti Gaming X 6G": false, - "MSI GeForce RTX 2060 Gaming Z 6G": false, - "MSI GeForce RTX 2060 Super ARMOR OC": false, - "MSI GeForce RTX 2060 Super Gaming X": false, - "MSI GeForce RTX 2070 ARMOR": false, - "MSI GeForce RTX 2070 ARMOR OC": false, - "MSI GeForce RTX 2070 Gaming": false, - "MSI GeForce RTX 2070 Gaming Z": false, - "MSI GeForce RTX 2070 SUPER ARMOR OC": false, - "MSI GeForce RTX 2070 Super Gaming": false, - "MSI GeForce RTX 2070 Super Gaming Trio": false, - "MSI GeForce RTX 2070 Super Gaming X": false, - "MSI GeForce RTX 2070 Super Gaming X Trio": false, - "MSI GeForce RTX 2070 Super Gaming Z Trio": false, - "MSI GeForce RTX 2080 Duke 8G OC": false, - "MSI GeForce RTX 2080 Gaming Trio": false, - "MSI GeForce RTX 2080 Gaming X Trio": false, - "MSI GeForce RTX 2080 Sea Hawk EK X": false, - "MSI GeForce RTX 2080 Super Gaming X Trio": false, - "MSI GeForce RTX 2080Ti 11G Gaming X Trio": false, - "MSI GeForce RTX 2080Ti Gaming X Trio": false, - "MSI GeForce RTX 2080Ti Gaming Z Trio": false, - "MSI GeForce RTX 2080Ti Sea Hawk EK X": false, - "MSI GeForce RTX 3060 12G Gaming X Trio LHR": false, - "MSI GeForce RTX 3060 12GB Gaming X Trio": false, - "MSI GeForce RTX 3060 Gaming X 12G": false, - "MSI GeForce RTX 3060 Gaming X 12G (GA104)": false, - "MSI GeForce RTX 3060 Gaming X 12G LHR": false, - "MSI GeForce RTX 3060 Ti 8GB Gaming X LHR": false, - "MSI GeForce RTX 3060 Ti 8GB Gaming X Trio": false, - "MSI GeForce RTX 3060 Ti 8GB Gaming X Trio LHR": false, - "MSI GeForce RTX 3070 8GB Gaming Trio": false, - "MSI GeForce RTX 3070 8GB Gaming X Trio": false, - "MSI GeForce RTX 3070 8GB Suprim X": false, - "MSI GeForce RTX 3070 8GB Suprim X LHR": false, - "MSI GeForce RTX 3070 Ti 8GB Gaming X Trio": false, - "MSI GeForce RTX 3070 Ti Suprim X 8G": false, - "MSI GeForce RTX 3080 10GB Gaming X Trio": false, - "MSI GeForce RTX 3080 10GB Gaming Z Trio": false, - "MSI GeForce RTX 3080 10GB Gaming Z Trio LHR": false, - "MSI GeForce RTX 3080 12GB Gaming Z Trio LHR": false, - "MSI GeForce RTX 3080 Suprim X 10G": false, - "MSI GeForce RTX 3080 Suprim X 10G LHR": false, - "MSI GeForce RTX 3080 Suprim X 12G LHR": false, - "MSI GeForce RTX 3080 Ti Gaming X Trio 12G": false, - "MSI GeForce RTX 3080 Ti Suprim X 12G": false, - "MSI GeForce RTX 3090 24GB Gaming X Trio": false, - "MSI GeForce RTX 3090 Suprim X 24G": false, - "MSI GeForce RTX 3090 Ti Gaming X Trio 24G": false, - "MSI GeForce RTX 3090 Ti Suprim X 24G": false, - "MSI Mystic Light MS_1562": false, - "MSI Mystic Light MS_1563": false, - "MSI Mystic Light MS_1564": false, - "MSI Mystic Light MS_1720": false, - "MSI Mystic Light MS_7B12": false, - "MSI Mystic Light MS_7B16": false, - "MSI Mystic Light MS_7B17": false, - "MSI Mystic Light MS_7B18": false, - "MSI Mystic Light MS_7B50": false, - "MSI Mystic Light MS_7B85": false, - "MSI Mystic Light MS_7B93": false, - "MSI Mystic Light MS_7C34": false, - "MSI Mystic Light MS_7C35": false, - "MSI Mystic Light MS_7C36": false, - "MSI Mystic Light MS_7C37": false, - "MSI Mystic Light MS_7C56": false, - "MSI Mystic Light MS_7C59": false, - "MSI Mystic Light MS_7C60": false, - "MSI Mystic Light MS_7C67": false, - "MSI Mystic Light MS_7C71": false, - "MSI Mystic Light MS_7C73": false, - "MSI Mystic Light MS_7C75": false, - "MSI Mystic Light MS_7C76": false, - "MSI Mystic Light MS_7C77": false, - "MSI Mystic Light MS_7C79": false, - "MSI Mystic Light MS_7C80": false, - "MSI Mystic Light MS_7C81": false, - "MSI Mystic Light MS_7C83": false, - "MSI Mystic Light MS_7C84": false, - "MSI Mystic Light MS_7C86": false, - "MSI Mystic Light MS_7C90": false, - "MSI Mystic Light MS_7C91": false, - "MSI Mystic Light MS_7C92": false, - "MSI Mystic Light MS_7C94": false, - "MSI Mystic Light MS_7C95": false, - "MSI Mystic Light MS_7C98": false, - "MSI Mystic Light MS_7D06": false, - "MSI Mystic Light MS_7D07": false, - "MSI Mystic Light MS_7D08": false, - "MSI Mystic Light MS_7D09": false, - "MSI Mystic Light MS_7D13": false, - "MSI Mystic Light MS_7D15": false, - "MSI Mystic Light MS_7D17": false, - "MSI Mystic Light MS_7D18": false, - "MSI Mystic Light MS_7D19": false, - "MSI Mystic Light MS_7D20": false, - "MSI Mystic Light MS_7D25": false, - "MSI Mystic Light MS_7D27": false, - "MSI Mystic Light MS_7D28": false, - "MSI Mystic Light MS_7D29": false, - "MSI Mystic Light MS_7D30": false, - "MSI Mystic Light MS_7D31": false, - "MSI Mystic Light MS_7D32": false, - "MSI Mystic Light MS_7D36": false, - "MSI Mystic Light MS_7D38": false, - "MSI Mystic Light MS_7D41": false, - "MSI Mystic Light MS_7D42": false, - "MSI Mystic Light MS_7D43": false, - "MSI Mystic Light MS_7D50": false, - "MSI Mystic Light MS_7D51": false, - "MSI Mystic Light MS_7D52": false, - "MSI Mystic Light MS_7D53": false, - "MSI Mystic Light MS_7D54": false, - "MSI Mystic Light MS_7D59": false, - "MSI Mystic Light MS_7D69": false, - "MSI Mystic Light MS_7D77": false, - "MSI Mystic Light MS_7D91": false, - "MSI Mystic Light MS_7E06": false, - "MSI Optix controller": false, - "MSI Radeon RX 6600 XT Gaming X": false, - "MSI Radeon RX 6700 XT Gaming X": false, - "MSI Radeon RX 6800 Gaming X Trio": false, - "MSI Radeon RX 6800 XT Gaming X Trio": false, - "MSI Radeon RX 6800 XT Gaming Z Trio": false, - "MSI Radeon RX 6900 XT Gaming X Trio": false, - "MSI Radeon RX 6900 XT Gaming Z Trio": false, - "MSI Radeon RX 6950 XT Gaming X Trio": false, - "MSI Vigor GK30 controller": false, - "MSI-RGB": false, - "N5312A USB Optical Mouse": false, - "NVIDIA RTX2060S": false, - "NVIDIA RTX2080S": false, - "NZXT Hue 2": false, - "NZXT Hue 2 Ambient": false, - "NZXT Hue 2 Motherboard": false, - "NZXT Hue+": false, - "NZXT Kraken M2": false, - "NZXT Kraken X2": false, - "NZXT Kraken X3": false, - "NZXT RGB & Fan Controller": false, - "NZXT Smart Device V2": false, - "Nanoleaf": false, - "Np93 ALPHA - Gaming Mouse": false, - "Nvidia ESA - Dell XPS 730x": false, - "OpenRazer": false, - "PNY GPU": false, - "PNY XLR8 OC EDITION RTX 2060": false, - "PNY XLR8 Revel EPIC-X RTX 3080": false, - "PNY XLR8 Revel EPIC-X RTX 3090": false, - "Palit 3060": false, - "Palit 3060 LHR": false, - "Palit 3060TI LHR": false, - "Palit 3060Ti": false, - "Palit 3070": false, - "Palit 3070 LHR": false, - "Palit 3070Ti": false, - "Palit 3070Ti GamingPro": false, - "Palit 3080": false, - "Palit 3080 LHR": false, - "Palit 3080Ti": false, - "Palit 3080Ti Gamerock": false, - "Palit 3090": false, - "Palit GeForce RTX 3060 Ti Dual": false, - "Patriot Viper": false, - "Patriot Viper Steel": false, - "Philips Hue": false, - "Philips Wiz": false, - "Razer Abyssus Elite D.Va Edition": false, - "Razer Abyssus Essential": false, - "Razer Base Station Chroma": false, - "Razer Base Station V2 Chroma": false, - "Razer Basilisk": false, - "Razer Basilisk Essential": false, - "Razer Basilisk Ultimate (Wired)": false, - "Razer Basilisk Ultimate (Wireless)": false, - "Razer Basilisk V2": false, - "Razer Basilisk V3": false, - "Razer Blackwidow 2019": false, - "Razer Blackwidow Chroma": false, - "Razer Blackwidow Chroma Tournament Edition": false, - "Razer Blackwidow Chroma V2": false, - "Razer Blackwidow Elite": false, - "Razer Blackwidow Overwatch": false, - "Razer Blackwidow V3": false, - "Razer Blackwidow V3 Mini (Wired)": false, - "Razer Blackwidow V3 Mini (Wireless)": false, - "Razer Blackwidow V3 Pro (Wired)": false, - "Razer Blackwidow V3 Pro (Wireless)": false, - "Razer Blackwidow V3 TKL": false, - "Razer Blackwidow X Chroma": false, - "Razer Blackwidow X Chroma Tournament Edition": false, - "Razer Blade (2016)": false, - "Razer Blade (Late 2016)": false, - "Razer Blade 14 (2021)": false, - "Razer Blade 15 (2018 Advanced)": false, - "Razer Blade 15 (2018 Base)": false, - "Razer Blade 15 (2018 Mercury)": false, - "Razer Blade 15 (2019 Advanced)": false, - "Razer Blade 15 (2019 Base)": false, - "Razer Blade 15 (2019 Mercury)": false, - "Razer Blade 15 (2019 Studio)": false, - "Razer Blade 15 (2020 Advanced)": false, - "Razer Blade 15 (2020 Base)": false, - "Razer Blade 15 (2021 Advanced)": false, - "Razer Blade 15 (2021 Base)": false, - "Razer Blade 15 (Late 2020)": false, - "Razer Blade Pro (2016)": false, - "Razer Blade Pro (2017 FullHD)": false, - "Razer Blade Pro (2017)": false, - "Razer Blade Pro (2019)": false, - "Razer Blade Pro (Late 2019)": false, - "Razer Blade Pro 17 (2020)": false, - "Razer Blade Pro 17 (2021)": false, - "Razer Blade Stealth (2016)": false, - "Razer Blade Stealth (2017)": false, - "Razer Blade Stealth (2019)": false, - "Razer Blade Stealth (2020)": false, - "Razer Blade Stealth (Late 2016)": false, - "Razer Blade Stealth (Late 2017)": false, - "Razer Blade Stealth (Late 2019)": false, - "Razer Blade Stealth (Late 2020)": false, - "Razer Book 13 (2020)": false, - "Razer Charging Pad Chroma": false, - "Razer Chroma Addressable RGB Controller": false, - "Razer Chroma HDK": false, - "Razer Chroma Mug Holder": false, - "Razer Chroma PC Case Lighting Kit": false, - "Razer Core": false, - "Razer Core X": false, - "Razer Cynosa Chroma": false, - "Razer Cynosa Chroma V2": false, - "Razer Cynosa Lite": false, - "Razer Deathadder Chroma": false, - "Razer Deathadder Elite": false, - "Razer Deathadder Essential": false, - "Razer Deathadder Essential V2": false, - "Razer Deathadder Essential White Edition": false, - "Razer Deathadder V2": false, - "Razer Deathadder V2 Mini": false, - "Razer Deathadder V2 Pro (Wired)": false, - "Razer Deathadder V2 Pro (Wireless)": false, - "Razer Deathstalker Chroma": false, - "Razer Diamondback": false, - "Razer Firefly": false, - "Razer Firefly Hyperflux": false, - "Razer Firefly V2": false, - "Razer Goliathus": false, - "Razer Goliathus Extended": false, - "Razer Huntsman": false, - "Razer Huntsman Elite": false, - "Razer Huntsman Mini": false, - "Razer Huntsman Tournament Edition": false, - "Razer Huntsman V2": false, - "Razer Huntsman V2 Analog": false, - "Razer Huntsman V2 TKL": false, - "Razer Kraken 7.1": false, - "Razer Kraken 7.1 Chroma": false, - "Razer Kraken 7.1 V2": false, - "Razer Kraken Kitty Black Edition": false, - "Razer Kraken Kitty Edition": false, - "Razer Kraken Ultimate": false, - "Razer Lancehead 2017 (Wired)": false, - "Razer Lancehead 2017 (Wireless)": false, - "Razer Lancehead 2019 (Wired)": false, - "Razer Lancehead 2019 (Wireless)": false, - "Razer Lancehead Tournament Edition": false, - "Razer Laptop Stand Chroma": false, - "Razer Laptop Stand Chroma V2": false, - "Razer Mamba 2012 (Wired)": false, - "Razer Mamba 2012 (Wireless)": false, - "Razer Mamba 2015 (Wired)": false, - "Razer Mamba 2015 (Wireless)": false, - "Razer Mamba 2018 (Wired)": false, - "Razer Mamba 2018 (Wireless)": false, - "Razer Mamba Elite": false, - "Razer Mamba Tournament Edition": false, - "Razer Mouse Bungee V3 Chroma": false, - "Razer Mouse Dock Chroma": false, - "Razer Naga Chroma": false, - "Razer Naga Classic": false, - "Razer Naga Epic Chroma": false, - "Razer Naga Hex V2": false, - "Razer Naga Left Handed": false, - "Razer Naga Pro (Wired)": false, - "Razer Naga Pro (Wireless)": false, - "Razer Naga Trinity": false, - "Razer Nommo Chroma": false, - "Razer Nommo Pro": false, - "Razer Orbweaver Chroma": false, - "Razer Ornata Chroma": false, - "Razer Ornata Chroma V2": false, - "Razer Ornata V3": false, - "Razer Seiren Emote": false, - "Razer Strider Chroma": false, - "Razer Tartarus Chroma": false, - "Razer Tartarus Pro": false, - "Razer Tartarus V2": false, - "Razer Tiamat 7.1 V2": false, - "Razer Viper": false, - "Razer Viper 8kHz": false, - "Razer Viper Mini": false, - "Razer Viper Ultimate (Wired)": false, - "Razer Viper Ultimate (Wireless)": false, - "Red Square Keyrox TKL": false, - "Redragon M602 Griffin": false, - "Redragon M711 Cobra": false, - "Redragon M715 Dagger": false, - "Redragon M716 Inquisitor": false, - "Redragon M908 Impact": false, - "Roccat Burst Core": false, - "Roccat Burst Pro": false, - "Roccat Horde Aimo": false, - "Roccat Kone Aimo": false, - "Roccat Kone Aimo 16K": false, - "Roccat Vulcan 120 Aimo": false, - "Roccat Vulcan 120-Series Aimo": false, - "SRGBmods Pico LED Controller": false, - "Sapphire GPU": false, - "Sapphire RX 470/480 Nitro+": false, - "Sapphire RX 5500 XT Nitro+": false, - "Sapphire RX 570/580/590 Nitro+": false, - "Sapphire RX 5700 (XT) Nitro+": false, - "Sapphire RX 5700 XT Nitro+": false, - "Sapphire RX 580 Nitro+ (2048SP)": false, - "Sapphire RX 6600 XT Nitro+": false, - "Sapphire RX 6700 XT Nitro+": false, - "Sapphire RX 6800 Nitro+": false, - "Sapphire RX 6800 XT Nitro+ SE": false, - "Sapphire RX 6800 XT/6900 XT Nitro+": false, - "Sapphire RX 6900 XT Nitro+ SE": false, - "Sapphire RX 6900 XT Toxic": false, - "Sapphire RX 6900 XT Toxic Limited Edition": false, - "Sapphire RX 6950 XT Nitro+": false, - "Sapphire RX Vega 56/64 Nitro+": false, - "Sinowealth Keyboard": false, - "Sony DualSense": false, - "Sony DualShock 4": false, - "SteelSeries Aerox 3 Wired": false, - "SteelSeries Aerox 9 Wired": false, - "SteelSeries Apex (OG)/Apex Fnatic": false, - "SteelSeries Apex 3": false, - "SteelSeries Apex 3 TKL": false, - "SteelSeries Apex 350": false, - "SteelSeries Apex 5": false, - "SteelSeries Apex 7": false, - "SteelSeries Apex 7 TKL": false, - "SteelSeries Apex M750": false, - "SteelSeries Apex Pro": false, - "SteelSeries Apex Pro TKL": false, - "SteelSeries Arctis 5": false, - "SteelSeries QCK Prism Cloth 3XL": false, - "SteelSeries QCK Prism Cloth 4XL": false, - "SteelSeries QCK Prism Cloth Medium": false, - "SteelSeries QCK Prism Cloth XL": false, - "SteelSeries QCK Prism Cloth XL CS:GO Neon Rider Ed.": false, - "SteelSeries QCK Prism Cloth XL Destiny Ed.": false, - "SteelSeries Rival 100": false, - "SteelSeries Rival 100 DotA 2 Edition": false, - "SteelSeries Rival 105": false, - "SteelSeries Rival 106": false, - "SteelSeries Rival 110": false, - "SteelSeries Rival 3": false, - "SteelSeries Rival 3 (Old Firmware)": false, - "SteelSeries Rival 300": false, - "SteelSeries Rival 300 Black Ops Edition": false, - "SteelSeries Rival 300 CS:GO Fade Edition": false, - "SteelSeries Rival 300 CS:GO Fade Edition (stm32)": false, - "SteelSeries Rival 300 CS:GO Hyperbeast Edition": false, - "SteelSeries Rival 300 Dota 2 Edition": false, - "SteelSeries Rival 300 HP Omen Edition": false, - "SteelSeries Rival 310": false, - "SteelSeries Rival 310 CS:GO Howl Edition": false, - "SteelSeries Rival 310 PUBG Edition": false, - "SteelSeries Rival 600": false, - "SteelSeries Rival 600 Dota 2 Edition": false, - "SteelSeries Rival 650": false, - "SteelSeries Rival 650 Wireless": false, - "SteelSeries Rival 700": false, - "SteelSeries Rival 710": false, - "SteelSeries Sensei 310": false, - "SteelSeries Sensei TEN": false, - "SteelSeries Sensei TEN CS:GO Neon Rider Edition": false, - "SteelSeries Siberia 350": false, - "Strimer L Connect": false, - "Tecknet M008": false, - "Thermaltake Poseidon Z RGB": false, - "Thermaltake Riing (PID 0x1FA5)": false, - "Thermaltake Riing (PID 0x1FA6)": false, - "Thermaltake Riing (PID 0x1FA7)": false, - "Thermaltake Riing (PID 0x1FA8)": false, - "Thermaltake Riing (PID 0x1FA9)": false, - "Thermaltake Riing (PID 0x1FAA)": false, - "Thermaltake Riing (PID 0x1FAB)": false, - "Thermaltake Riing (PID 0x1FAC)": false, - "Thermaltake Riing (PID 0x1FAD)": false, - "Thermaltake Riing (PID 0x1FAE)": false, - "Thermaltake Riing (PID 0x1FAF)": false, - "Thermaltake Riing (PID 0x1FB0)": false, - "Thermaltake Riing (PID 0x1FB1)": false, - "Thermaltake Riing (PID 0x1FB2)": false, - "Thermaltake Riing (PID 0x1FB3)": false, - "Thermaltake Riing (PID 0x1FB4)": false, - "Thermaltake Riing (PID 0x1FB5)": false, - "Thermaltake Riing Quad (PID 0x2260)": false, - "Thermaltake Riing Quad (PID 0x2261)": false, - "Thermaltake Riing Quad (PID 0x2262)": false, - "Thermaltake Riing Quad (PID 0x2263)": false, - "Thermaltake Riing Quad (PID 0x2264)": false, - "Thermaltake Riing Quad (PID 0x2265)": false, - "Thermaltake Riing Quad (PID 0x2266)": false, - "Thermaltake Riing Quad (PID 0x2267)": false, - "Thermaltake Riing Quad (PID 0x2268)": false, - "Thermaltake Riing Quad (PID 0x2269)": false, - "Thermaltake Riing Quad (PID 0x226A)": false, - "Thermaltake Riing Quad (PID 0x226B)": false, - "Thermaltake Riing Quad (PID 0x226C)": false, - "Thermaltake Riing Quad (PID 0x226D)": false, - "Thermaltake Riing Quad (PID 0x226E)": false, - "Thermaltake Riing Quad (PID 0x226F)": false, - "Thermaltake Riing Quad (PID 0x2270)": false, - "ThingM blink(1) mk2": false, - "Trust GXT 114": false, - "Trust GXT 180": false, - "ViewSonic Monitor XG270QG": false, - "Wooting ONE Keyboard": false, - "Wooting One (Classic)": false, - "Wooting One (Legacy)": false, - "Wooting One (None)": false, - "Wooting One (Xbox)": false, - "Wooting TWO Keyboard": false, - "Wooting TWO Keyboard HE": false, - "Wooting TWO Keyboard LE": false, - "Wooting Two (Classic)": false, - "Wooting Two (Legacy)": false, - "Wooting Two (None)": false, - "Wooting Two (Xbox)": false, - "Wooting Two 60HE (Classic)": false, - "Wooting Two 60HE (None)": false, - "Wooting Two 60HE (Xbox)": false, - "Wooting Two HE (Classic)": false, - "Wooting Two HE (None)": false, - "Wooting Two HE (Xbox)": false, - "Wooting Two LE (Classic)": false, - "Wooting Two LE (None)": false, - "Wooting Two LE (Xbox)": false, - "XPG Spectrix S40G": false, - "Yeelight": false, - "ZET Blade Optical": false, - "ZET Fury Pro": false, - "ZET GAMING Edge Air Elit": false, - "ZET GAMING Edge Air Elit (Wireless)": false, - "ZET GAMING Edge Air Pro": false, - "ZET GAMING Edge Air Pro (Wireless)": false, - "Zalman Z Sync": false, - "iGame GeForce RTX 3060 Ultra W OC 12G L-V": false, - "iGame GeForce RTX 3070 Advanced OC-V": false, - "iGame GeForce RTX 3070 Ti Advanced OC-V": false - } - }, - "Gigabyte RGB Fusion 2 SMBus": { - "SupportedDevices": [ - "B450 AORUS ELITE", - "B450 AORUS ELITE V2", - "B450 AORUS M", - "B450 AORUS PRO WIFI-CF", - "B450 AORUS PRO-CF", - "B450 AORUS PRO-CF4", - "B450 I AORUS PRO WIFI-CF", - "B450M DS3H-CF", - "X399 AORUS XTREME-CF", - "X399 DESIGNARE EX-CF", - "X470 AORUS GAMING 5 WIFI", - "X470 AORUS GAMING 7 WIFI-CF", - "X470 AORUS GAMING 7 WIFI-50-CF", - "X470 AORUS ULTRA GAMING", - "X470 AORUS ULTRA GAMING-CF", - "Z370 AORUS Gaming 5-CF" - ] - }, - "Plugins": { - "plugins": [ - { - "description": "Provides a variety of custom effects", - "enabled": true, - "name": "OpenRGB Effects Plugin" - }, - { - "description": "Sync colors with hardware measures", - "enabled": true, - "name": "Hardware Sync" - } - ] - }, - "Theme": { - "theme": "auto" - }, - "UserInterface": { - "exit_profile": { - "profile_name": "Default", - "set_on_exit": true - }, - "geometry": { - "height": 0, - "load_geometry": false, - "save_on_exit": false, - "width": 0, - "x": 0, - "y": 0 - }, - "greyscale_tray_icon": false, - "language": "default", - "minimize_on_close": false - } -} \ No newline at end of file diff --git a/stow/ssh/.ssh/config b/stow/ssh/.ssh/config deleted file mode 100644 index ea3df8e..0000000 --- a/stow/ssh/.ssh/config +++ /dev/null @@ -1,89 +0,0 @@ -Host HPC - User vsc44995 - HostName login.hpc.ugent.be - IdentitiesOnly yes - IdentityFile /run/secrets/UGent/HPC/ssh - -# Git authentication -Host git.depeuter.dev - User git - HostName git.depeuter.dev - IdentitiesOnly yes - IdentityFile /run/secrets/Gitea/ssh - -Host github.com - User git - HostName github.com - IdentitiesOnly yes - IdentityFile /run/secrets/GitHub/ssh - -Host github.ugent.be - User git - HostName github.ugent.be - IdentitiesOnly yes - IdentityFile /run/secrets/UGent/GitHub/ssh - -Host subgit.ugent.be - User git - HostName subgit.ugent.be - IdentitiesOnly yes - IdentityFile /run/secrets/UGent/SubGit/ssh - CanonicalizeHostname yes # Ignore capitalization - -# HomeLab - -# Physical hosts -Host Hugo - User admin - HostName 192.168.0.11 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/Hugo/ssh - -Host Roxanne - User ghost - Hostname 192.168.0.13 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/Roxanne/ghost/ssh - -Host HTPC - User root - Hostname 192.168.0.88 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/HTPC/ssh - -# Virtual hosts -Host Gitea - User gh0st - HostName 192.168.0.24 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/Gitea/ssh - -Host Nextcloud - User administrator - Hostname 192.168.0.14 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/Nextcloud/ssh - -Host Vaultwarden - User gh0st - Hostname 192.168.0.22 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/Vaultwarden/ssh - -Host Binnenpost - User admin - Hostname 192.168.0.89 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/NixOS/admin/ssh - -Host Development - User admin - Hostname 192.168.0.91 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/NixOS/admin/ssh - -Host Testing - User admin - Hostname 192.168.0.92 - IdentitiesOnly yes - IdentityFile /run/secrets/HomeLab/Nixos/admin/ssh diff --git a/stow/sway/.config/sway/autostart.sh b/stow/sway/.config/sway/autostart.sh new file mode 100755 index 0000000..dfea59b --- /dev/null +++ b/stow/sway/.config/sway/autostart.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash +# +# ~/.config/sway/autostart.sh +# List of applications to autostart +# + +function execute () { + setsid --fork $SHELL -c "${1}" &> /dev/null +} + +# Idle script +execute "~/.scripts/idle.sh" + +# Gamma and brightness +execute "clight" + +# Notification manager +execute "dunst -verbosity crit" + +# Fix [Slow launch for some GTK apps](https://github.com/swaywm/sway/issues/5732) +dbus-update-activation-environment --systemd DISPLAY WAYLAND_DISPLAY SWAYSOCK + +# Fix JetBrain IDE's showing properly +wmname LG3 + + +sleep 3 +# --- Everything that requires tray to be active --- + +# Nextcloud client +execute "nextcloud --background" + +# Activity watch server & client +execute "aw-qt" + diff --git a/stow/sway/.config/sway/commands b/stow/sway/.config/sway/commands new file mode 100644 index 0000000..4c3c621 --- /dev/null +++ b/stow/sway/.config/sway/commands @@ -0,0 +1,178 @@ +# +# ~/.config/sway/commands +# Keybinds for sway +# + +# Variables +set { + $alt Mod1 + $flag Mod4 + $term alacritty + $notify ~/.scripts/notify.sh +} + +# Focus +bindsym { + $flag+h focus left + $flag+j focus down + $flag+k focus up + $flag+l focus right + + $flag+Left focus left + $flag+Down focus down + $flag+Up focus up + $flag+Right focus right + + $flag+semicolon focus mode_toggle + $flag+p focus parent +} + +# Move windows +bindsym { + $flag+Shift+h move left + $flag+Shift+j move down + $flag+Shift+k move up + $flag+Shift+l move right + + $flag+Shift+Left move left + $flag+Shift+Down move down + $flag+Shift+Up move up + $flag+Shift+Right move right + + $flag+Next move scratchpad + $flag+KP_Next move scratchpad + $flag+Prior scratchpad show + $flag+KP_Prior scratchpad show +} + +# Layouts +bindsym { + $flag+w layout toggle split + $flag+x layout tabbed + $flag+c split h + $flag+v split v + + $flag+f floating enable, border normal 1 + $flag+Shift+f floating disable, border pixel 1 + + $alt+Next border pixel 1 # Show window title + $alt+KP_Next border pixel 1 + $alt+Prior border normal 1 # Hide window title + $alt+KP_Prior border normal 1 + + $flag+s sticky toggle +} + +# Workspaces +set { + $ws1 "1:1" + $ws2 "2:2" + $ws3 "3:3" + $ws4 "4:4" + $ws5 "5:5" + $ws6 "6:6" + $ws7 "7:7" + $ws8 "8:8" + $ws9 "9:9" + $ws10 "10:10" + $ws11 "11:Soc" + $ws12 "12:Ent" +} + +bindsym { + $flag+1 workspace $ws1 + $flag+2 workspace $ws2 + $flag+3 workspace $ws3 + $flag+4 workspace $ws4 + $flag+5 workspace $ws5 + $flag+6 workspace $ws6 + $flag+7 workspace $ws7 + $flag+8 workspace $ws8 + $flag+9 workspace $ws9 + $flag+0 workspace $ws10 + $flag+minus workspace $ws11 + $flag+equal workspace $ws12 + + $flag+Shift+1 move container to workspace $ws1, workspace $ws1 + $flag+Shift+2 move container to workspace $ws2, workspace $ws2 + $flag+Shift+3 move container to workspace $ws3, workspace $ws3 + $flag+Shift+4 move container to workspace $ws4, workspace $ws4 + $flag+Shift+5 move container to workspace $ws5, workspace $ws5 + $flag+Shift+6 move container to workspace $ws6, workspace $ws6 + $flag+Shift+7 move container to workspace $ws7, workspace $ws7 + $flag+Shift+8 move container to workspace $ws8, workspace $ws8 + $flag+Shift+9 move container to workspace $ws9, workspace $ws9 + $flag+Shift+0 move container to workspace $ws10, workspace $ws10 + $flag+Shift+minus move container to workspace $ws11, workspace $ws11 + $flag+Shift+equal move container to workspace $ws12, workspace $ws12 + + $flag+Control+j focus output 'eDP-1' + $flag+Control+h workspace prev_on_output + $flag+Control+l workspace next_on_output + $flag+Control+k focus output 'HDMI-A-1' + + $flag+Control+Down focus output 'eDP-1' + $flag+Control+Left workspace prev_on_output + $flag+Control+Right workspace next_on_output + $flag+Control+Up focus output 'HDMI-A-1' + + $flag+Control+Shift+j \ + move container to output 'eDP-1', focus output 'eDP-1' + $flag+Control+Shift+h \ + move container to workspace prev_on_output, workspace prev_on_output + $flag+Control+Shift+l \ + move container to workspace next_on_output, workspace next_on_output + $flag+Control+Shift+k \ + move container to output 'HDMI-A-1', focus output 'HDMI-A-1' + + $flag+Control+Shift+Down \ + move container to output 'eDP-1', focus output 'eDP-1' + $flag+Control+Shift+Left \ + move container to workspace prev_on_output, workspace prev_on_output + $flag+Control+Shift+Right \ + move container to workspace next_on_output, workspace next_on_output + $flag+Control+Shift+Up \ + move container to output 'HDMI-A-1', focus output 'HDMI-A-1' +} + +# System +bindsym --locked { +# Brightness + XF86MonBrightnessDown exec brightnessctl -e s 5%- && $notify -b + XF86MonBrightnessUp exec brightnessctl -e s +5% && $notify -b + +# Volume control (Pulsemixer is slow!) + XF86AudioRaiseVolume exec pamixer -i 2 --set-limit 100 && $notify -v + XF86AudioLowerVolume exec pamixer -d 2 && $notify -v + XF86AudioMute exec pamixer -t && $notify -v + XF86AudioMicMute exec pactl set-source-mute @DEFAULT_SOURCE@ toggle + +# Media control + F7 exec playerctl play-pause + Shift+XF86AudioLowerVolume exec playerctl previous + Shift+XF86AudioRaiseVolume exec playerctl next +} + +# Special commands +set $fzf ~/.scripts/fzf-jump +bindsym { + # Reload sway + $alt+Shift+r reload + # Dialog to exit sway + $alt+Shift+e exec swaynag -t warning -m 'Do you really want to exit sway?' \ + -B 'Yes, exit sway' 'swaymsg exit' + + $flag+q kill # Kill focused window + $flag+Return exec $term -e bash -c "zellij attach || zellij" # Start a terminal + $flag+Delete exec swaylock # Lockscreen + + # Start application launcher + $alt+space exec $term --title 'FZF-Jump' -e $fzf/launcher.sh + # Window switcher + $alt+Tab exec $term --title 'FZF-Jump' -e $fzf/standalone.sh $fzf/modules/windows.sh $fzf/modules/workspaces.sh + + # File explorer + $flag+e exec $term -e vifm + # Internet explorer + $flag+i exec firefox +} diff --git a/stow/sway/.config/sway/config b/stow/sway/.config/sway/config index e10c9dc..14915b2 100644 --- a/stow/sway/.config/sway/config +++ b/stow/sway/.config/sway/config @@ -1,69 +1,54 @@ # -# ~/.config/sway/config +# .config/sway/config +# Personal config for sway +# Requires noto-fonts-cjk # -# Variables -set { - $alt Mod1 - $flag Mod4 - - $left h - $down j - $up k - $right l - - $scrollUp button4 - $scrollDown button5 - - # $term kitty || alacritty || foot - $term foot - $menu j4-dmenu-desktop --dmenu="rofi -dmenu -i" --no-generic --usage-log="/home/tdpeuter/.local/state/dmenu.log" --term=$term - # TODO Find better location and better way to reference this. - $window_switcher /home/tdpeuter/projects/fzf-jump/new.sh - $lock swaylock -f -} - +# Import other config files include { - input-output - keybinds + commands modes style } -# Focus -focus_follows_mouse no -floating_modifier $flag normal - -# Window rules -for_window { - [window_role="About"] floating enable - [window_role="bubble"] floating enable - [window_role="Organizer"] floating enable - [window_role="page-info"] floating enable - [window_role="pop-up"] floating enable - [window_role="Preferences"] floating enable - [window_role="splash"] floating enable - [window_role="task_dialog"] floating enable - [window_role="task_dialog"] floating enable - [window_role="toolbox"] floating enable - [window_role="webconsole"] floating enable - [window_type="dialog"] floating enable - [window_type="menu"] floating enable - - [app_id="qalculate-gtk"] floating enable, border pixel 1 +input type:touchpad { + natural_scroll enabled + scroll_factor 0.6 + middle_emulation enabled + tap enabled } -exec dbus-sway-environment -exec configure-gtk -exec dbus-update-activation-environment --systemd DISPLAY XAUTHORITY WAYLAND_DISPLAY SWAYSOCK XDG_CURRENT_DESKTOP=sway +seat seat0 hide_cursor when-typing enable -exec wlsunset -l 50.50 -L 4.00 -t 3000 -T 6500 -exec gnome-keyring-daemon --start --components=secrets # Secrets -exec dunst --verbosity crit # Notification manager -exec swayidle -w -exec waycorner +# Output +output * { + bg "~/Pictures/wallpapers/bg.*" fill +} -exec nextcloud --background +output 'Dell Inc. DELL P2214H 29C2937M4YTL' { + # Vertical monitor + transform 270 +} + +output 'Samsung Electric Company SAMSUNG 0x00000001' { + # Zoom in because long distance + scale 2 +} + +# Focus +focus_follows_mouse no +floating_modifier Mod4 normal + +# Window rules +for_window [window_role="pop-up"] floating enable +for_window [window_role="task_dialog"] floating enable +for_window [window_role="splash"] floating enable + +for_window [class="Qalculate"] floating enable +for_window [class="Caprine"] floating enable, border normal 2 +for_window [title="^FZF-Jump$"] floating enable, border pixel 0, resize set 600 350 + +for_window [class="^Betterbird$"] move container to workspace "11:Soc" + +exec "~/.config/sway/autostart.sh" -# SwayFX -blur enable diff --git a/stow/sway/.config/sway/input-output b/stow/sway/.config/sway/input-output deleted file mode 100644 index 97bf8cc..0000000 --- a/stow/sway/.config/sway/input-output +++ /dev/null @@ -1,20 +0,0 @@ -input type:keyboard { - xkb_layout "us","be" - xkb_variant "altgr-intl","iso-alternate" -} - -input type:touchpad { - natural_scroll enabled - scroll_factor 0.8 - middle_emulation enabled - tap enabled -} - -output * { - bg "${HOME}/.local/state/sisyphus/bg" fill -} - -# Vertical display -output "Dell Inc. DELL P2214H 29C2937M4YTL" { - transform 270 -} diff --git a/stow/sway/.config/sway/keybinds b/stow/sway/.config/sway/keybinds deleted file mode 100644 index 0c4bf47..0000000 --- a/stow/sway/.config/sway/keybinds +++ /dev/null @@ -1,235 +0,0 @@ -set $notify ~/projects/sisyphus/scripts/notify.sh - -bindsym { - - # Focus - $flag+$up focus up - $flag+$right focus right - $flag+$down focus down - $flag+$left focus left - - $flag+Up focus up - $flag+Right focus right - $flag+Down focus down - $flag+Left focus left - - $flag+p focus parent - $flag+space focus mode_toggle - - # Move windows - $flag+Shift+$up move up - $flag+Shift+$right move right - $flag+Shift+$down move down - $flag+Shift+$left move left - - $flag+Shift+Up move up - $flag+Shift+Right move right - $flag+Shift+Down move down - $flag+Shift+Left move left - - $flag+Next move scratchpad - $flag+KP_Next move scratchpad - $flag+Prior scratchpad show - $flag+KP_Prior scratchpad show - - # Layouts - $flag+z layout toggle split - $flag+x layout tabbed - $flag+c split h - $flag+v split v - - $flag+f floating enable, border normal 1 - $flag+Shift+f floating disable, border pixel 1 - - $flag+s sticky toggle - $flag+F11 fullscreen - - $alt+Next border pixel 1 # Show window title - $alt+KP_Next border pixel 1 - $alt+Prior border normal 1 # Hide window title - $alt+KP_Prior border normal 1 -} - -# Workspaces -set { - $ws1 "1:1" - $ws2 "2:2" - $ws3 "3:3" - $ws4 "4:4" - $ws5 "5:5" - $ws6 "6:6" - $ws7 "7:7" - $ws8 "8:8" - $ws9 "9:9" - $ws10 "10:10" - $ws11 "11:Soc" - $ws12 "12:Ent" -} - -bindsym { - # Focus a specific workspace - $flag+1 workspace $ws1 - $flag+2 workspace $ws2 - $flag+3 workspace $ws3 - $flag+4 workspace $ws4 - $flag+5 workspace $ws5 - $flag+6 workspace $ws6 - $flag+7 workspace $ws7 - $flag+8 workspace $ws8 - $flag+9 workspace $ws9 - $flag+0 workspace $ws10 - $flag+minus workspace $ws11 - $flag+equal workspace $ws12 - - # Move window to a specific workspace - $flag+Shift+1 move container to workspace $ws1, workspace $ws1 - $flag+Shift+2 move container to workspace $ws2, workspace $ws2 - $flag+Shift+3 move container to workspace $ws3, workspace $ws3 - $flag+Shift+4 move container to workspace $ws4, workspace $ws4 - $flag+Shift+5 move container to workspace $ws5, workspace $ws5 - $flag+Shift+6 move container to workspace $ws6, workspace $ws6 - $flag+Shift+7 move container to workspace $ws7, workspace $ws7 - $flag+Shift+8 move container to workspace $ws8, workspace $ws8 - $flag+Shift+9 move container to workspace $ws9, workspace $ws9 - $flag+Shift+0 move container to workspace $ws10, workspace $ws10 - $flag+Shift+minus move container to workspace $ws11, workspace $ws11 - $flag+Shift+equal move container to workspace $ws12, workspace $ws12 - - # Go through workspaces in order - $flag+Control+$left workspace prev_on_output - $flag+Control+$right workspace next_on_output - - $flag+Control+Left workspace prev_on_output - $flag+Control+Right workspace next_on_output - - $flag+Control+Shift+$left move container to workspace prev_on_output, workspace prev_on_output - $flag+Control+Shift+$right move container to workspace next_on_output, workspace next_on_output - - $flag+Control+Shift+Left move container to workspace prev_on_output, workspace prev_on_output - $flag+Control+Shift+Right move container to workspace next_on_output, workspace next_on_output - - # Also GNOME-like keybinds - $flag+$alt+$left workspace prev_on_output - $flag+$alt+$right workspace next_on_output - - $flag+$alt+Left workspace prev_on_output - $flag+$alt+Right workspace next_on_output - - $flag+$alt+Shift+$left move container to workspace prev_on_output, workspace prev_on_output - $flag+$alt+Shift+$right move container to workspace next_on_output, workspace next_on_output - - $flag+$alt+Shift+Left move container to workspace prev_on_output, workspace prev_on_output - $flag+$alt+Shift+Right move container to workspace next_on_output, workspace next_on_output - - # Use your mouse to scroll between workspaces - --whole-window $flag+$scrollUp workspace prev_on_output - --whole-window $flag+$scrollDown workspace next_on_output -} - -bindgesture { - swipe:3:right workspace prev_on_output - swipe:3:left workspace next_on_output -} - -# Outputs -bindsym { - # Use "left" and "up" at the same time to mimic "previous" - # Use "right" and "down" at the same time to mimic "next" - # Though this does not work when using multiple screens, it's an intermediary solution until Sway supports "output next/previous" - $flag+Control+$up focus output left, focus output up - $flag+Control+$down focus output right, focus output down - - $flag+Control+Up focus output left, focus output up - $flag+Control+Down focus output right, focus output down - - $flag+$alt+$up focus output left, focus output up - $flag+$alt+$down focus output right, focus output down - - $flag+$alt+Up focus output left, focus output up - $flag+$alt+Down focus output right, focus output down - - $flag+Control+Shift+$up move container to output left, focus output left \ - move container to output up, focus output up - $flag+Control+Shift+$down move container to output right, focus output right \ - move container to output down, focus output down - - $flag+Control+Shift+Up move container to output left, focus output left \ - move container to output up, focus output up - $flag+Control+Shift+Down move container to output right, focus output right \ - move container to output down, focus output down - - $flag+$alt+Shift+$up move container to output left, focus output left \ - move container to output up, focus output up - $flag+$alt+Shift+$down move container to output right, focus output right \ - move container to output down, focus output down - - $flag+$alt+Shift+Up move container to output left, focus output left \ - move container to output up, focus output up - $flag+$alt+Shift+Down move container to output right, focus output right \ - move container to output down, focus output down -} - -# System -bindsym --locked { - # Brightness - XF86MonBrightnessDown exec brightnessctl -e s 5%- && $notify -b - XF86MonBrightnessUp exec brightnessctl -e s +5% && $notify -b - - # Audio - XF86AudioRaiseVolume exec wpctl set-volume -l 1 @DEFAULT_AUDIO_SINK@ 2%+ && $notify -v - XF86AudioLowerVolume exec wpctl set-volume @DEFAULT_AUDIO_SINK@ 2%- && $notify -v - XF86AudioMute exec wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle && $notify -v - XF86AudioMicMute exec wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle - - # Media - XF86AudioPlay exec playerctl play-pause - XF86AudioPrev exec playerctl previous - XF86AudioNext exec playerctl next - - Shift+XF86AudioMute exec playerctl play-pause - Shift+XF86AudioLowerVolume exec playerctl previous - Shift+XF86AudioRaiseVolume exec playerctl next - - # Other special keys - XF86Calculator exec qalculate-gtk -} - -bindgesture hold:3 exec playerctl play-pause - -# Shortcuts -bindsym { - # Reload sway - $alt+Shift+r reload - # Dialog to exit sway - $alt+Shift+e exec swaynag -t warning \ - -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' \ - -B 'Yes, exit sway' 'swaymsg exit' - - # Kill focused window - $flag+q kill - # Start a terminal - $flag+Return exec $term - Control+$alt+t exec $term - - $alt+space exec $menu - $alt+Tab focus prev - $flag+Tab exec $window_switcher - - --whole-window $alt+$scrollUp focus prev - --whole-window $alt+$scrollDown focus next - - # Lock the screen - $flag+Delete exec $lock - - # File explorer - $flag+e exec $term -e vifm -} - -bindgesture { - # Also show the bar, hide when finished - swipe:3:up bar hidden_state show, exec "$window_switcher; swaymsg bar hidden_state hide" - swipe:4:up exec "$menu; swaymsg bar hidden_state hide" - - # Cancel and hide bar - swipe:down exec pkill rofi, bar hidden_state hide -} diff --git a/stow/sway/.config/sway/modes b/stow/sway/.config/sway/modes index d62608f..237932b 100644 --- a/stow/sway/.config/sway/modes +++ b/stow/sway/.config/sway/modes @@ -1,117 +1,93 @@ -# +# # ~/.config/sway/modes -# +# Modes for sway +# -set $default "default" +set { + $alt Mod1 + $flag Mod4 +} # Resizing -set $mode_resize "Resize" -bindsym $flag+r mode $mode_resize -mode $mode_resize { - bindsym { - $right resize grow width 10 px or 10 ppt - $up resize grow height 10 px or 10 ppt - $left resize shrink width 10 px or 10 ppt - $down resize shrink height 10 px or 10 ppt +bindsym $flag+r mode "resize" +mode "resize" bindsym { + l resize grow width 10 px or 10 ppt + k resize grow height 10 px or 10 ppt + h resize shrink width 10 px or 10 ppt + j resize shrink height 10 px or 10 ppt - Right resize grow width 10 px or 10 ppt - Up resize grow height 10 px or 10 ppt - Left resize shrink width 10 px or 10 ppt - Down resize shrink height 10 px or 10 ppt + Shift+l resize grow width 50 px or 50 ppt + Shift+k resize grow height 50 px or 50 ppt + Shift+h resize shrink width 50 px or 50 ppt + Shift+j resize shrink height 50 px or 50 ppt - Shift+$right resize grow width 50 px or 50 ppt - Shift+$up resize grow height 50 px or 50 ppt - Shift+$left resize shrink width 50 px or 50 ppt - Shift+$down resize shrink height 50 px or 50 ppt + Right resize grow width 10 px or 10 ppt + Up resize grow height 10 px or 10 ppt + Left resize shrink width 10 px or 10 ppt + Down resize shrink height 10 px or 10 ppt - Shift+Right resize grow width 50 px or 50 ppt - Shift+Up resize grow height 50 px or 50 ppt - Shift+Left resize shrink width 50 px or 50 ppt - Shift+Down resize shrink height 50 px or 50 ppt + Shift+Right resize grow width 50 px or 50 ppt + Shift+Up resize grow height 50 px or 50 ppt + Shift+Left resize shrink width 50 px or 50 ppt + Shift+Down resize shrink height 50 px or 50 ppt - $flag+$right move right - $flag+$up move up - $flag+$left move left - $flag+$down move down + $flag+h move left + $flag+j move down + $flag+k move up + $flag+l move right - $flag+Right move right - $flag+Up move up - $flag+Left move left - $flag+Down move down + $flag+Left move left + $flag+Down move down + $flag+Up move up + $flag+Right move right - $flag+r mode $default - Escape mode $default - Return mode $default - } - - bindgesture { - swipe:2:right resize grow width 10 px or 10 ppt - swipe:2:down resize grow height 10 px or 10 ppt - swipe:2:left resize shrink width 10 px or 10 ppt - swipe:2:up resize shrink height 10 px or 10 ppt - } + Return mode "default" + Escape mode "default" + $flag+r mode "default" } # System actions -set $mode_system "System (l)ock, (s)leep, (h)ibernate, (r)eboot, (Shift+s)hutdown" -bindsym Control+$alt+Delete mode $mode_system -mode $mode_system bindsym { - l mode $default, exec $lock - s mode $default, exec $lock, exec systemctl suspend - h mode $default, exec $lock, exec systemctl hibernate - r mode $default, exec systemctl reboot - Shift+s mode $default, exec systemctl poweroff -i +set $mode_system System (l)ock, (s)leep, (h)ibernate, (r)eboot, (Shift+s)hutdown +bindsym Control+$alt+Delete mode "$mode_system" +mode "$mode_system" bindsym { + l exec swaylock, mode "default" + s exec systemctl suspend, mode "default" + h exec systemctl hibernate, mode "default" + r exec systemctl reboot, mode "default" + Shift+s exec systemctl poweroff -i, mode "default" - Control+$alt+Delete mode $default - Escape mode $default - Return mode $default -} - -set $mode_preferences "Toggle (d)ark mode, (s)unset, (n)otification" -bindsym $alt+end mode $mode_preferences -bindsym $alt+KP_End mode $mode_preferences -mode $mode_preferences bindsym { - d exec "${SCRIPT_DIR}/toggle-light-dark.sh", mode $default - s exec "${SCRIPT_DIR}/sunset.sh", mode $default - n exec "${SCRIPT_DIR}/do-not-disturb.sh", mode $default - - $alt+end mode $default - $alt+KP_End mode $default - Escape mode $default - Return mode $default + Return mode "default" + Escape mode "default" + Control+$alt+Delete mode "default" } # Screenshots -set $mode_screenshot "Screenshot of (a)rea, current (w)indow, (s)creen - Shift to save" -set $save_format ~/Nextcloud/Afbeeldingen/Screenshots/$(date +%F-%H-%M-%S).png -bindsym Print mode $mode_screenshot -mode $mode_screenshot bindsym { - a exec grimshot copy area, mode $default - w exec grimshot --notify copy active, mode $default - s exec grimshot --notify copy screen, mode $default +set $mode_screenshot Screenshot of (a)rea, current (w)indow, (s)creen - Shift to save +set $save_format ~/Pictures/Screenshots/$(date +%F-%H-%M-%S).png +bindsym Print mode "$mode_screenshot" +mode "$mode_screenshot" bindsym { + a exec grimshot copy area, mode "default" + w exec grimshot --notify copy active, mode "default" + s exec grimshot --notify copy screen, mode "default" - Shift+a exec grimshot --notify save area $save_format, mode $default - Shift+w exec grimshot --notify save active $save_format, mode $default - Shift+s exec grimshot --notify save screen $save_format, mode $default - Print exec grimshot --notify save screen $save_format, mode $default + Print exec grimshot --notify save screen $save_format mode "default" # Super fast screens! + Shift+a exec grimshot --notify save area $save_format, mode "default" + Shift+w exec grimshot --notify save active $save_format, mode "default" + Shift+s exec grimshot --notify save screen $save_format, mode "default" - Escape mode $default - Return mode $default + Return mode "default" + Escape mode "default" } -# Launcher -set $mode_launcher "Launch (f)irefox, (s)potify or (t)hunderbird." -bindsym $flag+o mode $mode_launcher -mode $mode_launcher bindsym { - f exec firefox, mode $default - t exec thunderbird, mode $default +# Some preferences +set $mode_preferences Toggle (s)unset, (n)otifications, (f)ocus +bindsym $alt+end mode "$mode_preferences" +mode "$mode_preferences" bindsym { + s exec "~/.scripts/wlsunset.sh", mode "default" + n exec "~/.scripts/dnd.sh", mode "default" + f exec "~/.scripts/focus.sh", mode "default" - $flag+o mode $default - Escape mode $default - Return mode $default + Return mode "default" + Escape mode "default" + $alt+end mode "default" } - -# Ignore (all) keybinds. Useful when working with Virtual Machines. -set $mode_ignore "Ignore keybinds - Press Control+Alt+Insert to escape." -bindsym Control+$alt+Insert mode $mode_ignore -mode $mode_ignore bindsym Control+$alt+Insert mode $default diff --git a/stow/sway/.config/sway/style b/stow/sway/.config/sway/style index 8aea2fc..d1668ac 100644 --- a/stow/sway/.config/sway/style +++ b/stow/sway/.config/sway/style @@ -3,33 +3,25 @@ # Styling for sway # -# Decrease the height of the window title bar. -font pango:monospace 0.1 +# Decrease the height of the window bar thing. +font pango:monospace 1 bar { - swaybar_command waybar + swaybar_command /usr/bin/waybar mode hide } default_border pixel 1 default_floating_border normal 1 -hide_edge_borders smart +hide_edge_borders both smart_borders on -gaps { - inner 5 - outer 3 -} -# Mimic no titles by setting the text color to background color +# Mimic no titles # border backgr. text indic. child_border -client.focused #00897b #00897b #00897b #00897b #00897b -client.focused_inactive #a6a6a6 #a6a6a6 #a6a6a6 #a6a6a6 #a6a6a6 -client.unfocused #a6a6a6 #a6a6a6 #a6a6a6 #a6a6a6 #a6a6a6 +client.focused #000000 #00897b #00897b #00897b #000000 +client.focused_inactive #000000 #222222 #222222 #222222 #000000 +client.unfocused #000000 #222222 #222222 #222222 #000000 client.urgent #ff0000 #ff0000 #ff0000 #ff0000 #ff0000 -# Configure GTK exec gsettings set org.gnome.desktop.interface icon-theme 'IcoSystem' -exec gsettings set org.gnome.desktop.interface cursor-theme 'phinger-cursor' exec gsettings set org.gnome.desktop.interface gtk-theme 'Nordic' - -seat seat0 xcursor_theme phinger-cursors 24 diff --git a/stow/swayidle/.config/swayidle/config b/stow/swayidle/.config/swayidle/config deleted file mode 100644 index d676df0..0000000 --- a/stow/swayidle/.config/swayidle/config +++ /dev/null @@ -1,6 +0,0 @@ -timeout 60 'brightnessctl -sq set $(( $(brightnessctl get) / 10 * 3 + 1 ))' resume 'brightnessctl -qr' -timeout 120 'swaylock -f; swaymsg "output * dpms off"' resume 'swaymsg "output * dpms on"' -timeout 240 'systemctl suspend' - -before-sleep 'playerctl pause' -before-sleep 'swaymsg "output * dpms on"; swaylock -f --grace 0' # Avoid being able to unlock immediately without password diff --git a/stow/swaylock/.config/swaylock/config b/stow/swaylock/.config/swaylock/config index a5ecd8a..b8de2e9 100644 --- a/stow/swaylock/.config/swaylock/config +++ b/stow/swaylock/.config/swaylock/config @@ -2,55 +2,41 @@ # .config/swaylock/config # -#indicator -#indicator-radius=200 -# -#clock -#datestr=%A, %B %d %Y -# -#show-failed-attempts -# -#screenshots -#effect-pixelate=10 -#effect-vignette=0.75:0 # Darken the whole screen. -#fade-in=0.25 -# -#grace=7 # Allow to unlock without password for duration -#grace-no-mouse +indicator +indicator-radius=200 -image=${ASSETS_DIR}/bluescreen.png +clock +datestr=%A, %B %d %Y + +screenshots +effect-blur=5x5 +effect-vignette=0.75:0 # Darken the whole screen. +fade-in=0.25 + +grace=7 # Allow to unlock without password for duration +grace-no-mouse # Styling -color=000000 # The default background color when no image could be loaded - font=letter extended text-color=ffffff text-clear-color=ffffff -text-caps-lock-color=ffffff -text-wrong-color=bd2024 - -layout-text-color=ffffff +text-wrong-color=eb4d4b # Make all the other stuff invisible -inside-color=00000000 -inside-clear-color=00000000 -inside-caps-lock-color=00000000 -inside-ver-color=00000000 -inside-wrong-color=00000000 key-hl-color=00000000 -layout-bg-color=00000000 -layout-border-color=00000000 -line-color=00000000 -line-clear-color=00000000 -line-caps-lock-color=00000000 -line-ver-color=00000000 -line-wrong-color=00000000 +separator-color=00000000 ring-color=00000000 ring-clear-color=00000000 -ring-caps-lock-color=00000000 ring-ver-color=00000000 ring-wrong-color=00000000 -separator-color=00000000 +line-color=00000000 +line-clear-color=00000000 +line-ver-color=00000000 +line-wrong-color=00000000 +inside-color=00000000 +inside-clear-color=00000000 +inside-ver-color=00000000 +inside-wrong-color=00000000 text-ver-color=00000000 diff --git a/stow/vifm/.config/vifm/colors/tdpeuter-dark.vifm b/stow/vifm/.config/vifm/colors/Personal.vifm similarity index 92% rename from stow/vifm/.config/vifm/colors/tdpeuter-dark.vifm rename to stow/vifm/.config/vifm/colors/Personal.vifm index cf92123..abf323b 100644 --- a/stow/vifm/.config/vifm/colors/tdpeuter-dark.vifm +++ b/stow/vifm/.config/vifm/colors/Personal.vifm @@ -34,6 +34,3 @@ highlight Win ctermfg=12 ctermbg=-1 cterm=none highlight Border ctermfg=-1 ctermbg=-1 cterm=none - -highlight CmdLine ctermfg=7 ctermbg=0 cterm=none - diff --git a/stow/vifm/.config/vifm/colors/tdpeuter-light.vifm b/stow/vifm/.config/vifm/colors/tdpeuter-light.vifm deleted file mode 100644 index a27559f..0000000 --- a/stow/vifm/.config/vifm/colors/tdpeuter-light.vifm +++ /dev/null @@ -1,38 +0,0 @@ -" -" ~/.config/vifm/colors/Personal.vifm -" - -" The standard ncurses colors are: -" Default = -1 = None, can be used for transparency or default color -" Black = 0 -" Red = 1 -" Green = 2 -" Yellow = 3 -" Blue = 4 -" Magenta = 5 -" Cyan = 6 -" White = 7 - -" Light versions of colors are also available (set bold attribute): -" LightBlack -" LightRed -" LightGreen -" LightYellow -" LightBlue -" LightMagenta -" LightCyan -" LightWhite - -" Available attributes (some of them can be combined): -" bold -" underline -" reverse or inverse -" standout -" none - -" Make background and vertical borders transparent. -highlight Win ctermfg=12 ctermbg=-1 cterm=none - -highlight Border ctermfg=-1 ctermbg=-1 cterm=none - -highlight CmdLine ctermfg=7 ctermbg=12 cterm=none diff --git a/stow/vifm/.config/vifm/scripts/favicons.vifm b/stow/vifm/.config/vifm/scripts/favicons.vifm index 4c0f6dd..fdd4ce5 100644 --- a/stow/vifm/.config/vifm/scripts/favicons.vifm +++ b/stow/vifm/.config/vifm/scripts/favicons.vifm @@ -48,7 +48,6 @@ set classify+=' ::*.fish,,*.sh,,*.bash::' set classify+=' ::*.ejs,,*.slim,,*.xml::' set classify+='C ::*.c++,,*.cpp,,*.cxx,,*.h,,*.cc,,*.c::' set classify+=' ::*.coffee::' -set classify+=' ::*.nix::' " Unsorted and unconverted set classify+='λ ::*.ml,,*.mli::' diff --git a/stow/vifm/.config/vifm/vifmrc b/stow/vifm/.config/vifm/vifmrc index f280482..b4b588a 100644 --- a/stow/vifm/.config/vifm/vifmrc +++ b/stow/vifm/.config/vifm/vifmrc @@ -2,8 +2,6 @@ " ~/.config/vifm/vifmrc " -source ~/.config/vifm/theme.conf - " vim: filetype=vifm : " Sample configuration file for vifm (last updated: 31 August, 2021) " You can edit this file by hand. @@ -78,6 +76,10 @@ set vimhelp set norunexec +" List of color schemes to try (picks the first one supported by the terminal) + +colorscheme Personal Default-256 Default + " Format for displaying time in file list. For example: " TIME_STAMP_FORMAT=%m/%d-%H:%M " See man date or man strftime for details. @@ -257,8 +259,7 @@ filextype {*.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm},<image/*> \ shotwell, \ gwenview &, fileviewer {*.bmp,*.jpg,*.jpeg,*.png,*.gif,*.xpm},<image/*> - \ kitten icat %f, - \ chafa %f, + \ chafa, \ identify %f, " OpenRaster diff --git a/stow/vim/.vim/autoload/plug.vim b/stow/vim/.vim/autoload/plug.vim new file mode 100644 index 0000000..652caa8 --- /dev/null +++ b/stow/vim/.vim/autoload/plug.vim @@ -0,0 +1,2812 @@ +" vim-plug: Vim plugin manager +" ============================ +" +" Download plug.vim and put it in ~/.vim/autoload +" +" curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ +" https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim +" +" Edit your .vimrc +" +" call plug#begin('~/.vim/plugged') +" +" " Make sure you use single quotes +" +" " Shorthand notation; fetches https://github.com/junegunn/vim-easy-align +" Plug 'junegunn/vim-easy-align' +" +" " Any valid git URL is allowed +" Plug 'https://github.com/junegunn/vim-github-dashboard.git' +" +" " Multiple Plug commands can be written in a single line using | separators +" Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets' +" +" " On-demand loading +" Plug 'scrooloose/nerdtree', { 'on': 'NERDTreeToggle' } +" Plug 'tpope/vim-fireplace', { 'for': 'clojure' } +" +" " Using a non-default branch +" Plug 'rdnetto/YCM-Generator', { 'branch': 'stable' } +" +" " Using a tagged release; wildcard allowed (requires git 1.9.2 or above) +" Plug 'fatih/vim-go', { 'tag': '*' } +" +" " Plugin options +" Plug 'nsf/gocode', { 'tag': 'v.20150303', 'rtp': 'vim' } +" +" " Plugin outside ~/.vim/plugged with post-update hook +" Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' } +" +" " Unmanaged plugin (manually installed and updated) +" Plug '~/my-prototype-plugin' +" +" " Initialize plugin system +" call plug#end() +" +" Then reload .vimrc and :PlugInstall to install plugins. +" +" Plug options: +" +"| Option | Description | +"| ----------------------- | ------------------------------------------------ | +"| `branch`/`tag`/`commit` | Branch/tag/commit of the repository to use | +"| `rtp` | Subdirectory that contains Vim plugin | +"| `dir` | Custom directory for the plugin | +"| `as` | Use different name for the plugin | +"| `do` | Post-update hook (string or funcref) | +"| `on` | On-demand loading: Commands or `<Plug>`-mappings | +"| `for` | On-demand loading: File types | +"| `frozen` | Do not update unless explicitly specified | +" +" More information: https://github.com/junegunn/vim-plug +" +" +" Copyright (c) 2017 Junegunn Choi +" +" MIT License +" +" Permission is hereby granted, free of charge, to any person obtaining +" a copy of this software and associated documentation files (the +" "Software"), to deal in the Software without restriction, including +" without limitation the rights to use, copy, modify, merge, publish, +" distribute, sublicense, and/or sell copies of the Software, and to +" permit persons to whom the Software is furnished to do so, subject to +" the following conditions: +" +" The above copyright notice and this permission notice shall be +" included in all copies or substantial portions of the Software. +" +" THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +" EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +" MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +" NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +" LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +" OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +" WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +if exists('g:loaded_plug') + finish +endif +let g:loaded_plug = 1 + +let s:cpo_save = &cpo +set cpo&vim + +let s:plug_src = 'https://github.com/junegunn/vim-plug.git' +let s:plug_tab = get(s:, 'plug_tab', -1) +let s:plug_buf = get(s:, 'plug_buf', -1) +let s:mac_gui = has('gui_macvim') && has('gui_running') +let s:is_win = has('win32') +let s:nvim = has('nvim-0.2') || (has('nvim') && exists('*jobwait') && !s:is_win) +let s:vim8 = has('patch-8.0.0039') && exists('*job_start') +if s:is_win && &shellslash + set noshellslash + let s:me = resolve(expand('<sfile>:p')) + set shellslash +else + let s:me = resolve(expand('<sfile>:p')) +endif +let s:base_spec = { 'branch': '', 'frozen': 0 } +let s:TYPE = { +\ 'string': type(''), +\ 'list': type([]), +\ 'dict': type({}), +\ 'funcref': type(function('call')) +\ } +let s:loaded = get(s:, 'loaded', {}) +let s:triggers = get(s:, 'triggers', {}) + +function! s:is_powershell(shell) + return a:shell =~# 'powershell\(\.exe\)\?$' || a:shell =~# 'pwsh\(\.exe\)\?$' +endfunction + +function! s:isabsolute(dir) abort + return a:dir =~# '^/' || (has('win32') && a:dir =~? '^\%(\\\|[A-Z]:\)') +endfunction + +function! s:git_dir(dir) abort + let gitdir = s:trim(a:dir) . '/.git' + if isdirectory(gitdir) + return gitdir + endif + if !filereadable(gitdir) + return '' + endif + let gitdir = matchstr(get(readfile(gitdir), 0, ''), '^gitdir: \zs.*') + if len(gitdir) && !s:isabsolute(gitdir) + let gitdir = a:dir . '/' . gitdir + endif + return isdirectory(gitdir) ? gitdir : '' +endfunction + +function! s:git_origin_url(dir) abort + let gitdir = s:git_dir(a:dir) + let config = gitdir . '/config' + if empty(gitdir) || !filereadable(config) + return '' + endif + return matchstr(join(readfile(config)), '\[remote "origin"\].\{-}url\s*=\s*\zs\S*\ze') +endfunction + +function! s:git_revision(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + + let line = get(readfile(head), 0, '') + let ref = matchstr(line, '^ref: \zs.*') + if empty(ref) + return line + endif + + if filereadable(gitdir . '/' . ref) + return get(readfile(gitdir . '/' . ref), 0, '') + endif + + if filereadable(gitdir . '/packed-refs') + for line in readfile(gitdir . '/packed-refs') + if line =~# ' ' . ref + return matchstr(line, '^[0-9a-f]*') + endif + endfor + endif + + return '' +endfunction + +function! s:git_local_branch(dir) abort + let gitdir = s:git_dir(a:dir) + let head = gitdir . '/HEAD' + if empty(gitdir) || !filereadable(head) + return '' + endif + let branch = matchstr(get(readfile(head), 0, ''), '^ref: refs/heads/\zs.*') + return len(branch) ? branch : 'HEAD' +endfunction + +function! s:git_origin_branch(spec) + if len(a:spec.branch) + return a:spec.branch + endif + + " The file may not be present if this is a local repository + let gitdir = s:git_dir(a:spec.dir) + let origin_head = gitdir.'/refs/remotes/origin/HEAD' + if len(gitdir) && filereadable(origin_head) + return matchstr(get(readfile(origin_head), 0, ''), + \ '^ref: refs/remotes/origin/\zs.*') + endif + + " The command may not return the name of a branch in detached HEAD state + let result = s:lines(s:system('git symbolic-ref --short HEAD', a:spec.dir)) + return v:shell_error ? '' : result[-1] +endfunction + +if s:is_win + function! s:plug_call(fn, ...) + let shellslash = &shellslash + try + set noshellslash + return call(a:fn, a:000) + finally + let &shellslash = shellslash + endtry + endfunction +else + function! s:plug_call(fn, ...) + return call(a:fn, a:000) + endfunction +endif + +function! s:plug_getcwd() + return s:plug_call('getcwd') +endfunction + +function! s:plug_fnamemodify(fname, mods) + return s:plug_call('fnamemodify', a:fname, a:mods) +endfunction + +function! s:plug_expand(fmt) + return s:plug_call('expand', a:fmt, 1) +endfunction + +function! s:plug_tempname() + return s:plug_call('tempname') +endfunction + +function! plug#begin(...) + if a:0 > 0 + let s:plug_home_org = a:1 + let home = s:path(s:plug_fnamemodify(s:plug_expand(a:1), ':p')) + elseif exists('g:plug_home') + let home = s:path(g:plug_home) + elseif has('nvim') + let home = stdpath('data') . '/plugged' + elseif !empty(&rtp) + let home = s:path(split(&rtp, ',')[0]) . '/plugged' + else + return s:err('Unable to determine plug home. Try calling plug#begin() with a path argument.') + endif + if s:plug_fnamemodify(home, ':t') ==# 'plugin' && s:plug_fnamemodify(home, ':h') ==# s:first_rtp + return s:err('Invalid plug home. '.home.' is a standard Vim runtime path and is not allowed.') + endif + + let g:plug_home = home + let g:plugs = {} + let g:plugs_order = [] + let s:triggers = {} + + call s:define_commands() + return 1 +endfunction + +function! s:define_commands() + command! -nargs=+ -bar Plug call plug#(<args>) + if !executable('git') + return s:err('`git` executable not found. Most commands will not be available. To suppress this message, prepend `silent!` to `call plug#begin(...)`.') + endif + if has('win32') + \ && &shellslash + \ && (&shell =~# 'cmd\(\.exe\)\?$' || s:is_powershell(&shell)) + return s:err('vim-plug does not support shell, ' . &shell . ', when shellslash is set.') + endif + if !has('nvim') + \ && (has('win32') || has('win32unix')) + \ && !has('multi_byte') + return s:err('Vim needs +multi_byte feature on Windows to run shell commands. Enable +iconv for best results.') + endif + command! -nargs=* -bar -bang -complete=customlist,s:names PlugInstall call s:install(<bang>0, [<f-args>]) + command! -nargs=* -bar -bang -complete=customlist,s:names PlugUpdate call s:update(<bang>0, [<f-args>]) + command! -nargs=0 -bar -bang PlugClean call s:clean(<bang>0) + command! -nargs=0 -bar PlugUpgrade if s:upgrade() | execute 'source' s:esc(s:me) | endif + command! -nargs=0 -bar PlugStatus call s:status() + command! -nargs=0 -bar PlugDiff call s:diff() + command! -nargs=? -bar -bang -complete=file PlugSnapshot call s:snapshot(<bang>0, <f-args>) +endfunction + +function! s:to_a(v) + return type(a:v) == s:TYPE.list ? a:v : [a:v] +endfunction + +function! s:to_s(v) + return type(a:v) == s:TYPE.string ? a:v : join(a:v, "\n") . "\n" +endfunction + +function! s:glob(from, pattern) + return s:lines(globpath(a:from, a:pattern)) +endfunction + +function! s:source(from, ...) + let found = 0 + for pattern in a:000 + for vim in s:glob(a:from, pattern) + execute 'source' s:esc(vim) + let found = 1 + endfor + endfor + return found +endfunction + +function! s:assoc(dict, key, val) + let a:dict[a:key] = add(get(a:dict, a:key, []), a:val) +endfunction + +function! s:ask(message, ...) + call inputsave() + echohl WarningMsg + let answer = input(a:message.(a:0 ? ' (y/N/a) ' : ' (y/N) ')) + echohl None + call inputrestore() + echo "\r" + return (a:0 && answer =~? '^a') ? 2 : (answer =~? '^y') ? 1 : 0 +endfunction + +function! s:ask_no_interrupt(...) + try + return call('s:ask', a:000) + catch + return 0 + endtry +endfunction + +function! s:lazy(plug, opt) + return has_key(a:plug, a:opt) && + \ (empty(s:to_a(a:plug[a:opt])) || + \ !isdirectory(a:plug.dir) || + \ len(s:glob(s:rtp(a:plug), 'plugin')) || + \ len(s:glob(s:rtp(a:plug), 'after/plugin'))) +endfunction + +function! plug#end() + if !exists('g:plugs') + return s:err('plug#end() called without calling plug#begin() first') + endif + + if exists('#PlugLOD') + augroup PlugLOD + autocmd! + augroup END + augroup! PlugLOD + endif + let lod = { 'ft': {}, 'map': {}, 'cmd': {} } + + if get(g:, 'did_load_filetypes', 0) + filetype off + endif + for name in g:plugs_order + if !has_key(g:plugs, name) + continue + endif + let plug = g:plugs[name] + if get(s:loaded, name, 0) || !s:lazy(plug, 'on') && !s:lazy(plug, 'for') + let s:loaded[name] = 1 + continue + endif + + if has_key(plug, 'on') + let s:triggers[name] = { 'map': [], 'cmd': [] } + for cmd in s:to_a(plug.on) + if cmd =~? '^<Plug>.\+' + if empty(mapcheck(cmd)) && empty(mapcheck(cmd, 'i')) + call s:assoc(lod.map, cmd, name) + endif + call add(s:triggers[name].map, cmd) + elseif cmd =~# '^[A-Z]' + let cmd = substitute(cmd, '!*$', '', '') + if exists(':'.cmd) != 2 + call s:assoc(lod.cmd, cmd, name) + endif + call add(s:triggers[name].cmd, cmd) + else + call s:err('Invalid `on` option: '.cmd. + \ '. Should start with an uppercase letter or `<Plug>`.') + endif + endfor + endif + + if has_key(plug, 'for') + let types = s:to_a(plug.for) + if !empty(types) + augroup filetypedetect + call s:source(s:rtp(plug), 'ftdetect/**/*.vim', 'after/ftdetect/**/*.vim') + augroup END + endif + for type in types + call s:assoc(lod.ft, type, name) + endfor + endif + endfor + + for [cmd, names] in items(lod.cmd) + execute printf( + \ 'command! -nargs=* -range -bang -complete=file %s call s:lod_cmd(%s, "<bang>", <line1>, <line2>, <q-args>, %s)', + \ cmd, string(cmd), string(names)) + endfor + + for [map, names] in items(lod.map) + for [mode, map_prefix, key_prefix] in + \ [['i', '<C-\><C-O>', ''], ['n', '', ''], ['v', '', 'gv'], ['o', '', '']] + execute printf( + \ '%snoremap <silent> %s %s:<C-U>call <SID>lod_map(%s, %s, %s, "%s")<CR>', + \ mode, map, map_prefix, string(map), string(names), mode != 'i', key_prefix) + endfor + endfor + + for [ft, names] in items(lod.ft) + augroup PlugLOD + execute printf('autocmd FileType %s call <SID>lod_ft(%s, %s)', + \ ft, string(ft), string(names)) + augroup END + endfor + + call s:reorg_rtp() + filetype plugin indent on + if has('vim_starting') + if has('syntax') && !exists('g:syntax_on') + syntax enable + end + else + call s:reload_plugins() + endif +endfunction + +function! s:loaded_names() + return filter(copy(g:plugs_order), 'get(s:loaded, v:val, 0)') +endfunction + +function! s:load_plugin(spec) + call s:source(s:rtp(a:spec), 'plugin/**/*.vim', 'after/plugin/**/*.vim') +endfunction + +function! s:reload_plugins() + for name in s:loaded_names() + call s:load_plugin(g:plugs[name]) + endfor +endfunction + +function! s:trim(str) + return substitute(a:str, '[\/]\+$', '', '') +endfunction + +function! s:version_requirement(val, min) + for idx in range(0, len(a:min) - 1) + let v = get(a:val, idx, 0) + if v < a:min[idx] | return 0 + elseif v > a:min[idx] | return 1 + endif + endfor + return 1 +endfunction + +function! s:git_version_requirement(...) + if !exists('s:git_version') + let s:git_version = map(split(split(s:system(['git', '--version']))[2], '\.'), 'str2nr(v:val)') + endif + return s:version_requirement(s:git_version, a:000) +endfunction + +function! s:progress_opt(base) + return a:base && !s:is_win && + \ s:git_version_requirement(1, 7, 1) ? '--progress' : '' +endfunction + +function! s:rtp(spec) + return s:path(a:spec.dir . get(a:spec, 'rtp', '')) +endfunction + +if s:is_win + function! s:path(path) + return s:trim(substitute(a:path, '/', '\', 'g')) + endfunction + + function! s:dirpath(path) + return s:path(a:path) . '\' + endfunction + + function! s:is_local_plug(repo) + return a:repo =~? '^[a-z]:\|^[%~]' + endfunction + + " Copied from fzf + function! s:wrap_cmds(cmds) + let cmds = [ + \ '@echo off', + \ 'setlocal enabledelayedexpansion'] + \ + (type(a:cmds) == type([]) ? a:cmds : [a:cmds]) + \ + ['endlocal'] + if has('iconv') + if !exists('s:codepage') + let s:codepage = libcallnr('kernel32.dll', 'GetACP', 0) + endif + return map(cmds, printf('iconv(v:val."\r", "%s", "cp%d")', &encoding, s:codepage)) + endif + return map(cmds, 'v:val."\r"') + endfunction + + function! s:batchfile(cmd) + let batchfile = s:plug_tempname().'.bat' + call writefile(s:wrap_cmds(a:cmd), batchfile) + let cmd = plug#shellescape(batchfile, {'shell': &shell, 'script': 0}) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + return [batchfile, cmd] + endfunction +else + function! s:path(path) + return s:trim(a:path) + endfunction + + function! s:dirpath(path) + return substitute(a:path, '[/\\]*$', '/', '') + endfunction + + function! s:is_local_plug(repo) + return a:repo[0] =~ '[/$~]' + endfunction +endif + +function! s:err(msg) + echohl ErrorMsg + echom '[vim-plug] '.a:msg + echohl None +endfunction + +function! s:warn(cmd, msg) + echohl WarningMsg + execute a:cmd 'a:msg' + echohl None +endfunction + +function! s:esc(path) + return escape(a:path, ' ') +endfunction + +function! s:escrtp(path) + return escape(a:path, ' ,') +endfunction + +function! s:remove_rtp() + for name in s:loaded_names() + let rtp = s:rtp(g:plugs[name]) + execute 'set rtp-='.s:escrtp(rtp) + let after = globpath(rtp, 'after') + if isdirectory(after) + execute 'set rtp-='.s:escrtp(after) + endif + endfor +endfunction + +function! s:reorg_rtp() + if !empty(s:first_rtp) + execute 'set rtp-='.s:first_rtp + execute 'set rtp-='.s:last_rtp + endif + + " &rtp is modified from outside + if exists('s:prtp') && s:prtp !=# &rtp + call s:remove_rtp() + unlet! s:middle + endif + + let s:middle = get(s:, 'middle', &rtp) + let rtps = map(s:loaded_names(), 's:rtp(g:plugs[v:val])') + let afters = filter(map(copy(rtps), 'globpath(v:val, "after")'), '!empty(v:val)') + let rtp = join(map(rtps, 'escape(v:val, ",")'), ',') + \ . ','.s:middle.',' + \ . join(map(afters, 'escape(v:val, ",")'), ',') + let &rtp = substitute(substitute(rtp, ',,*', ',', 'g'), '^,\|,$', '', 'g') + let s:prtp = &rtp + + if !empty(s:first_rtp) + execute 'set rtp^='.s:first_rtp + execute 'set rtp+='.s:last_rtp + endif +endfunction + +function! s:doautocmd(...) + if exists('#'.join(a:000, '#')) + execute 'doautocmd' ((v:version > 703 || has('patch442')) ? '<nomodeline>' : '') join(a:000) + endif +endfunction + +function! s:dobufread(names) + for name in a:names + let path = s:rtp(g:plugs[name]) + for dir in ['ftdetect', 'ftplugin', 'after/ftdetect', 'after/ftplugin'] + if len(finddir(dir, path)) + if exists('#BufRead') + doautocmd BufRead + endif + return + endif + endfor + endfor +endfunction + +function! plug#load(...) + if a:0 == 0 + return s:err('Argument missing: plugin name(s) required') + endif + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + let names = a:0 == 1 && type(a:1) == s:TYPE.list ? a:1 : a:000 + let unknowns = filter(copy(names), '!has_key(g:plugs, v:val)') + if !empty(unknowns) + let s = len(unknowns) > 1 ? 's' : '' + return s:err(printf('Unknown plugin%s: %s', s, join(unknowns, ', '))) + end + let unloaded = filter(copy(names), '!get(s:loaded, v:val, 0)') + if !empty(unloaded) + for name in unloaded + call s:lod([name], ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + endfor + call s:dobufread(unloaded) + return 1 + end + return 0 +endfunction + +function! s:remove_triggers(name) + if !has_key(s:triggers, a:name) + return + endif + for cmd in s:triggers[a:name].cmd + execute 'silent! delc' cmd + endfor + for map in s:triggers[a:name].map + execute 'silent! unmap' map + execute 'silent! iunmap' map + endfor + call remove(s:triggers, a:name) +endfunction + +function! s:lod(names, types, ...) + for name in a:names + call s:remove_triggers(name) + let s:loaded[name] = 1 + endfor + call s:reorg_rtp() + + for name in a:names + let rtp = s:rtp(g:plugs[name]) + for dir in a:types + call s:source(rtp, dir.'/**/*.vim') + endfor + if a:0 + if !s:source(rtp, a:1) && !empty(s:glob(rtp, a:2)) + execute 'runtime' a:1 + endif + call s:source(rtp, a:2) + endif + call s:doautocmd('User', name) + endfor +endfunction + +function! s:lod_ft(pat, names) + let syn = 'syntax/'.a:pat.'.vim' + call s:lod(a:names, ['plugin', 'after/plugin'], syn, 'after/'.syn) + execute 'autocmd! PlugLOD FileType' a:pat + call s:doautocmd('filetypeplugin', 'FileType') + call s:doautocmd('filetypeindent', 'FileType') +endfunction + +function! s:lod_cmd(cmd, bang, l1, l2, args, names) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + execute printf('%s%s%s %s', (a:l1 == a:l2 ? '' : (a:l1.','.a:l2)), a:cmd, a:bang, a:args) +endfunction + +function! s:lod_map(map, names, with_prefix, prefix) + call s:lod(a:names, ['ftdetect', 'after/ftdetect', 'plugin', 'after/plugin']) + call s:dobufread(a:names) + let extra = '' + while 1 + let c = getchar(0) + if c == 0 + break + endif + let extra .= nr2char(c) + endwhile + + if a:with_prefix + let prefix = v:count ? v:count : '' + let prefix .= '"'.v:register.a:prefix + if mode(1) == 'no' + if v:operator == 'c' + let prefix = "\<esc>" . prefix + endif + let prefix .= v:operator + endif + call feedkeys(prefix, 'n') + endif + call feedkeys(substitute(a:map, '^<Plug>', "\<Plug>", '') . extra) +endfunction + +function! plug#(repo, ...) + if a:0 > 1 + return s:err('Invalid number of arguments (1..2)') + endif + + try + let repo = s:trim(a:repo) + let opts = a:0 == 1 ? s:parse_options(a:1) : s:base_spec + let name = get(opts, 'as', s:plug_fnamemodify(repo, ':t:s?\.git$??')) + let spec = extend(s:infer_properties(name, repo), opts) + if !has_key(g:plugs, name) + call add(g:plugs_order, name) + endif + let g:plugs[name] = spec + let s:loaded[name] = get(s:loaded, name, 0) + catch + return s:err(repo . ' ' . v:exception) + endtry +endfunction + +function! s:parse_options(arg) + let opts = copy(s:base_spec) + let type = type(a:arg) + let opt_errfmt = 'Invalid argument for "%s" option of :Plug (expected: %s)' + if type == s:TYPE.string + if empty(a:arg) + throw printf(opt_errfmt, 'tag', 'string') + endif + let opts.tag = a:arg + elseif type == s:TYPE.dict + for opt in ['branch', 'tag', 'commit', 'rtp', 'dir', 'as'] + if has_key(a:arg, opt) + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string') + endif + endfor + for opt in ['on', 'for'] + if has_key(a:arg, opt) + \ && type(a:arg[opt]) != s:TYPE.list + \ && (type(a:arg[opt]) != s:TYPE.string || empty(a:arg[opt])) + throw printf(opt_errfmt, opt, 'string or list') + endif + endfor + if has_key(a:arg, 'do') + \ && type(a:arg.do) != s:TYPE.funcref + \ && (type(a:arg.do) != s:TYPE.string || empty(a:arg.do)) + throw printf(opt_errfmt, 'do', 'string or funcref') + endif + call extend(opts, a:arg) + if has_key(opts, 'dir') + let opts.dir = s:dirpath(s:plug_expand(opts.dir)) + endif + else + throw 'Invalid argument type (expected: string or dictionary)' + endif + return opts +endfunction + +function! s:infer_properties(name, repo) + let repo = a:repo + if s:is_local_plug(repo) + return { 'dir': s:dirpath(s:plug_expand(repo)) } + else + if repo =~ ':' + let uri = repo + else + if repo !~ '/' + throw printf('Invalid argument: %s (implicit `vim-scripts'' expansion is deprecated)', repo) + endif + let fmt = get(g:, 'plug_url_format', 'https://git::@github.com/%s.git') + let uri = printf(fmt, repo) + endif + return { 'dir': s:dirpath(g:plug_home.'/'.a:name), 'uri': uri } + endif +endfunction + +function! s:install(force, names) + call s:update_impl(0, a:force, a:names) +endfunction + +function! s:update(force, names) + call s:update_impl(1, a:force, a:names) +endfunction + +function! plug#helptags() + if !exists('g:plugs') + return s:err('plug#begin was not called') + endif + for spec in values(g:plugs) + let docd = join([s:rtp(spec), 'doc'], '/') + if isdirectory(docd) + silent! execute 'helptags' s:esc(docd) + endif + endfor + return 1 +endfunction + +function! s:syntax() + syntax clear + syntax region plug1 start=/\%1l/ end=/\%2l/ contains=plugNumber + syntax region plug2 start=/\%2l/ end=/\%3l/ contains=plugBracket,plugX + syn match plugNumber /[0-9]\+[0-9.]*/ contained + syn match plugBracket /[[\]]/ contained + syn match plugX /x/ contained + syn match plugDash /^-\{1}\ / + syn match plugPlus /^+/ + syn match plugStar /^*/ + syn match plugMessage /\(^- \)\@<=.*/ + syn match plugName /\(^- \)\@<=[^ ]*:/ + syn match plugSha /\%(: \)\@<=[0-9a-f]\{4,}$/ + syn match plugTag /(tag: [^)]\+)/ + syn match plugInstall /\(^+ \)\@<=[^:]*/ + syn match plugUpdate /\(^* \)\@<=[^:]*/ + syn match plugCommit /^ \X*[0-9a-f]\{7,9} .*/ contains=plugRelDate,plugEdge,plugTag + syn match plugEdge /^ \X\+$/ + syn match plugEdge /^ \X*/ contained nextgroup=plugSha + syn match plugSha /[0-9a-f]\{7,9}/ contained + syn match plugRelDate /([^)]*)$/ contained + syn match plugNotLoaded /(not loaded)$/ + syn match plugError /^x.*/ + syn region plugDeleted start=/^\~ .*/ end=/^\ze\S/ + syn match plugH2 /^.*:\n-\+$/ + syn match plugH2 /^-\{2,}/ + syn keyword Function PlugInstall PlugStatus PlugUpdate PlugClean + hi def link plug1 Title + hi def link plug2 Repeat + hi def link plugH2 Type + hi def link plugX Exception + hi def link plugBracket Structure + hi def link plugNumber Number + + hi def link plugDash Special + hi def link plugPlus Constant + hi def link plugStar Boolean + + hi def link plugMessage Function + hi def link plugName Label + hi def link plugInstall Function + hi def link plugUpdate Type + + hi def link plugError Error + hi def link plugDeleted Ignore + hi def link plugRelDate Comment + hi def link plugEdge PreProc + hi def link plugSha Identifier + hi def link plugTag Constant + + hi def link plugNotLoaded Comment +endfunction + +function! s:lpad(str, len) + return a:str . repeat(' ', a:len - len(a:str)) +endfunction + +function! s:lines(msg) + return split(a:msg, "[\r\n]") +endfunction + +function! s:lastline(msg) + return get(s:lines(a:msg), -1, '') +endfunction + +function! s:new_window() + execute get(g:, 'plug_window', 'vertical topleft new') +endfunction + +function! s:plug_window_exists() + let buflist = tabpagebuflist(s:plug_tab) + return !empty(buflist) && index(buflist, s:plug_buf) >= 0 +endfunction + +function! s:switch_in() + if !s:plug_window_exists() + return 0 + endif + + if winbufnr(0) != s:plug_buf + let s:pos = [tabpagenr(), winnr(), winsaveview()] + execute 'normal!' s:plug_tab.'gt' + let winnr = bufwinnr(s:plug_buf) + execute winnr.'wincmd w' + call add(s:pos, winsaveview()) + else + let s:pos = [winsaveview()] + endif + + setlocal modifiable + return 1 +endfunction + +function! s:switch_out(...) + call winrestview(s:pos[-1]) + setlocal nomodifiable + if a:0 > 0 + execute a:1 + endif + + if len(s:pos) > 1 + execute 'normal!' s:pos[0].'gt' + execute s:pos[1] 'wincmd w' + call winrestview(s:pos[2]) + endif +endfunction + +function! s:finish_bindings() + nnoremap <silent> <buffer> R :call <SID>retry()<cr> + nnoremap <silent> <buffer> D :PlugDiff<cr> + nnoremap <silent> <buffer> S :PlugStatus<cr> + nnoremap <silent> <buffer> U :call <SID>status_update()<cr> + xnoremap <silent> <buffer> U :call <SID>status_update()<cr> + nnoremap <silent> <buffer> ]] :silent! call <SID>section('')<cr> + nnoremap <silent> <buffer> [[ :silent! call <SID>section('b')<cr> +endfunction + +function! s:prepare(...) + if empty(s:plug_getcwd()) + throw 'Invalid current working directory. Cannot proceed.' + endif + + for evar in ['$GIT_DIR', '$GIT_WORK_TREE'] + if exists(evar) + throw evar.' detected. Cannot proceed.' + endif + endfor + + call s:job_abort() + if s:switch_in() + if b:plug_preview == 1 + pc + endif + enew + else + call s:new_window() + endif + + nnoremap <silent> <buffer> q :call <SID>close_pane()<cr> + if a:0 == 0 + call s:finish_bindings() + endif + let b:plug_preview = -1 + let s:plug_tab = tabpagenr() + let s:plug_buf = winbufnr(0) + call s:assign_name() + + for k in ['<cr>', 'L', 'o', 'X', 'd', 'dd'] + execute 'silent! unmap <buffer>' k + endfor + setlocal buftype=nofile bufhidden=wipe nobuflisted nolist noswapfile nowrap cursorline modifiable nospell + if exists('+colorcolumn') + setlocal colorcolumn= + endif + setf vim-plug + if exists('g:syntax_on') + call s:syntax() + endif +endfunction + +function! s:close_pane() + if b:plug_preview == 1 + pc + let b:plug_preview = -1 + else + bd + endif +endfunction + +function! s:assign_name() + " Assign buffer name + let prefix = '[Plugins]' + let name = prefix + let idx = 2 + while bufexists(name) + let name = printf('%s (%s)', prefix, idx) + let idx = idx + 1 + endwhile + silent! execute 'f' fnameescape(name) +endfunction + +function! s:chsh(swap) + let prev = [&shell, &shellcmdflag, &shellredir] + if !s:is_win + set shell=sh + endif + if a:swap + if s:is_powershell(&shell) + let &shellredir = '2>&1 | Out-File -Encoding UTF8 %s' + elseif &shell =~# 'sh' || &shell =~# 'cmd\(\.exe\)\?$' + set shellredir=>%s\ 2>&1 + endif + endif + return prev +endfunction + +function! s:bang(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(a:0) + " FIXME: Escaping is incomplete. We could use shellescape with eval, + " but it won't work on Windows. + let cmd = a:0 ? s:with_cd(a:cmd, a:1) : a:cmd + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + let g:_plug_bang = (s:is_win && has('gui_running') ? 'silent ' : '').'!'.escape(cmd, '#!%') + execute "normal! :execute g:_plug_bang\<cr>\<cr>" + finally + unlet g:_plug_bang + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + return v:shell_error ? 'Exit status: ' . v:shell_error : '' +endfunction + +function! s:regress_bar() + let bar = substitute(getline(2)[1:-2], '.*\zs=', 'x', '') + call s:progress_bar(2, bar, len(bar)) +endfunction + +function! s:is_updated(dir) + return !empty(s:system_chomp(['git', 'log', '--pretty=format:%h', 'HEAD...HEAD@{1}'], a:dir)) +endfunction + +function! s:do(pull, force, todo) + for [name, spec] in items(a:todo) + if !isdirectory(spec.dir) + continue + endif + let installed = has_key(s:update.new, name) + let updated = installed ? 0 : + \ (a:pull && index(s:update.errors, name) < 0 && s:is_updated(spec.dir)) + if a:force || installed || updated + execute 'cd' s:esc(spec.dir) + call append(3, '- Post-update hook for '. name .' ... ') + let error = '' + let type = type(spec.do) + if type == s:TYPE.string + if spec.do[0] == ':' + if !get(s:loaded, name, 0) + let s:loaded[name] = 1 + call s:reorg_rtp() + endif + call s:load_plugin(spec) + try + execute spec.do[1:] + catch + let error = v:exception + endtry + if !s:plug_window_exists() + cd - + throw 'Warning: vim-plug was terminated by the post-update hook of '.name + endif + else + let error = s:bang(spec.do) + endif + elseif type == s:TYPE.funcref + try + call s:load_plugin(spec) + let status = installed ? 'installed' : (updated ? 'updated' : 'unchanged') + call spec.do({ 'name': name, 'status': status, 'force': a:force }) + catch + let error = v:exception + endtry + else + let error = 'Invalid hook type' + endif + call s:switch_in() + call setline(4, empty(error) ? (getline(4) . 'OK') + \ : ('x' . getline(4)[1:] . error)) + if !empty(error) + call add(s:update.errors, name) + call s:regress_bar() + endif + cd - + endif + endfor +endfunction + +function! s:hash_match(a, b) + return stridx(a:a, a:b) == 0 || stridx(a:b, a:a) == 0 +endfunction + +function! s:checkout(spec) + let sha = a:spec.commit + let output = s:git_revision(a:spec.dir) + if !empty(output) && !s:hash_match(sha, s:lines(output)[0]) + let credential_helper = s:git_version_requirement(2) ? '-c credential.helper= ' : '' + let output = s:system( + \ 'git '.credential_helper.'fetch --depth 999999 && git checkout '.plug#shellescape(sha).' --', a:spec.dir) + endif + return output +endfunction + +function! s:finish(pull) + let new_frozen = len(filter(keys(s:update.new), 'g:plugs[v:val].frozen')) + if new_frozen + let s = new_frozen > 1 ? 's' : '' + call append(3, printf('- Installed %d frozen plugin%s', new_frozen, s)) + endif + call append(3, '- Finishing ... ') | 4 + redraw + call plug#helptags() + call plug#end() + call setline(4, getline(4) . 'Done!') + redraw + let msgs = [] + if !empty(s:update.errors) + call add(msgs, "Press 'R' to retry.") + endif + if a:pull && len(s:update.new) < len(filter(getline(5, '$'), + \ "v:val =~ '^- ' && v:val !~# 'Already up.to.date'")) + call add(msgs, "Press 'D' to see the updated changes.") + endif + echo join(msgs, ' ') + call s:finish_bindings() +endfunction + +function! s:retry() + if empty(s:update.errors) + return + endif + echo + call s:update_impl(s:update.pull, s:update.force, + \ extend(copy(s:update.errors), [s:update.threads])) +endfunction + +function! s:is_managed(name) + return has_key(g:plugs[a:name], 'uri') +endfunction + +function! s:names(...) + return sort(filter(keys(g:plugs), 'stridx(v:val, a:1) == 0 && s:is_managed(v:val)')) +endfunction + +function! s:check_ruby() + silent! ruby require 'thread'; VIM::command("let g:plug_ruby = '#{RUBY_VERSION}'") + if !exists('g:plug_ruby') + redraw! + return s:warn('echom', 'Warning: Ruby interface is broken') + endif + let ruby_version = split(g:plug_ruby, '\.') + unlet g:plug_ruby + return s:version_requirement(ruby_version, [1, 8, 7]) +endfunction + +function! s:update_impl(pull, force, args) abort + let sync = index(a:args, '--sync') >= 0 || has('vim_starting') + let args = filter(copy(a:args), 'v:val != "--sync"') + let threads = (len(args) > 0 && args[-1] =~ '^[1-9][0-9]*$') ? + \ remove(args, -1) : get(g:, 'plug_threads', 16) + + let managed = filter(copy(g:plugs), 's:is_managed(v:key)') + let todo = empty(args) ? filter(managed, '!v:val.frozen || !isdirectory(v:val.dir)') : + \ filter(managed, 'index(args, v:key) >= 0') + + if empty(todo) + return s:warn('echo', 'No plugin to '. (a:pull ? 'update' : 'install')) + endif + + if !s:is_win && s:git_version_requirement(2, 3) + let s:git_terminal_prompt = exists('$GIT_TERMINAL_PROMPT') ? $GIT_TERMINAL_PROMPT : '' + let $GIT_TERMINAL_PROMPT = 0 + for plug in values(todo) + let plug.uri = substitute(plug.uri, + \ '^https://git::@github\.com', 'https://github.com', '') + endfor + endif + + if !isdirectory(g:plug_home) + try + call mkdir(g:plug_home, 'p') + catch + return s:err(printf('Invalid plug directory: %s. '. + \ 'Try to call plug#begin with a valid directory', g:plug_home)) + endtry + endif + + if has('nvim') && !exists('*jobwait') && threads > 1 + call s:warn('echom', '[vim-plug] Update Neovim for parallel installer') + endif + + let use_job = s:nvim || s:vim8 + let python = (has('python') || has('python3')) && !use_job + let ruby = has('ruby') && !use_job && (v:version >= 703 || v:version == 702 && has('patch374')) && !(s:is_win && has('gui_running')) && threads > 1 && s:check_ruby() + + let s:update = { + \ 'start': reltime(), + \ 'all': todo, + \ 'todo': copy(todo), + \ 'errors': [], + \ 'pull': a:pull, + \ 'force': a:force, + \ 'new': {}, + \ 'threads': (python || ruby || use_job) ? min([len(todo), threads]) : 1, + \ 'bar': '', + \ 'fin': 0 + \ } + + call s:prepare(1) + call append(0, ['', '']) + normal! 2G + silent! redraw + + " Set remote name, overriding a possible user git config's clone.defaultRemoteName + let s:clone_opt = ['--origin', 'origin'] + if get(g:, 'plug_shallow', 1) + call extend(s:clone_opt, ['--depth', '1']) + if s:git_version_requirement(1, 7, 10) + call add(s:clone_opt, '--no-single-branch') + endif + endif + + if has('win32unix') || has('wsl') + call extend(s:clone_opt, ['-c', 'core.eol=lf', '-c', 'core.autocrlf=input']) + endif + + let s:submodule_opt = s:git_version_requirement(2, 8) ? ' --jobs='.threads : '' + + " Python version requirement (>= 2.7) + if python && !has('python3') && !ruby && !use_job && s:update.threads > 1 + redir => pyv + silent python import platform; print platform.python_version() + redir END + let python = s:version_requirement( + \ map(split(split(pyv)[0], '\.'), 'str2nr(v:val)'), [2, 6]) + endif + + if (python || ruby) && s:update.threads > 1 + try + let imd = &imd + if s:mac_gui + set noimd + endif + if ruby + call s:update_ruby() + else + call s:update_python() + endif + catch + let lines = getline(4, '$') + let printed = {} + silent! 4,$d _ + for line in lines + let name = s:extract_name(line, '.', '') + if empty(name) || !has_key(printed, name) + call append('$', line) + if !empty(name) + let printed[name] = 1 + if line[0] == 'x' && index(s:update.errors, name) < 0 + call add(s:update.errors, name) + end + endif + endif + endfor + finally + let &imd = imd + call s:update_finish() + endtry + else + call s:update_vim() + while use_job && sync + sleep 100m + if s:update.fin + break + endif + endwhile + endif +endfunction + +function! s:log4(name, msg) + call setline(4, printf('- %s (%s)', a:msg, a:name)) + redraw +endfunction + +function! s:update_finish() + if exists('s:git_terminal_prompt') + let $GIT_TERMINAL_PROMPT = s:git_terminal_prompt + endif + if s:switch_in() + call append(3, '- Updating ...') | 4 + for [name, spec] in items(filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && (s:update.force || s:update.pull || has_key(s:update.new, v:key))')) + let [pos, _] = s:logpos(name) + if !pos + continue + endif + if has_key(spec, 'commit') + call s:log4(name, 'Checking out '.spec.commit) + let out = s:checkout(spec) + elseif has_key(spec, 'tag') + let tag = spec.tag + if tag =~ '\*' + let tags = s:lines(s:system('git tag --list '.plug#shellescape(tag).' --sort -version:refname 2>&1', spec.dir)) + if !v:shell_error && !empty(tags) + let tag = tags[0] + call s:log4(name, printf('Latest tag for %s -> %s', spec.tag, tag)) + call append(3, '') + endif + endif + call s:log4(name, 'Checking out '.tag) + let out = s:system('git checkout -q '.plug#shellescape(tag).' -- 2>&1', spec.dir) + else + let branch = s:git_origin_branch(spec) + call s:log4(name, 'Merging origin/'.s:esc(branch)) + let out = s:system('git checkout -q '.plug#shellescape(branch).' -- 2>&1' + \. (has_key(s:update.new, name) ? '' : ('&& git merge --ff-only '.plug#shellescape('origin/'.branch).' 2>&1')), spec.dir) + endif + if !v:shell_error && filereadable(spec.dir.'/.gitmodules') && + \ (s:update.force || has_key(s:update.new, name) || s:is_updated(spec.dir)) + call s:log4(name, 'Updating submodules. This may take a while.') + let out .= s:bang('git submodule update --init --recursive'.s:submodule_opt.' 2>&1', spec.dir) + endif + let msg = s:format_message(v:shell_error ? 'x': '-', name, out) + if v:shell_error + call add(s:update.errors, name) + call s:regress_bar() + silent execute pos 'd _' + call append(4, msg) | 4 + elseif !empty(out) + call setline(pos, msg[0]) + endif + redraw + endfor + silent 4 d _ + try + call s:do(s:update.pull, s:update.force, filter(copy(s:update.all), 'index(s:update.errors, v:key) < 0 && has_key(v:val, "do")')) + catch + call s:warn('echom', v:exception) + call s:warn('echo', '') + return + endtry + call s:finish(s:update.pull) + call setline(1, 'Updated. Elapsed time: ' . split(reltimestr(reltime(s:update.start)))[0] . ' sec.') + call s:switch_out('normal! gg') + endif +endfunction + +function! s:job_abort() + if (!s:nvim && !s:vim8) || !exists('s:jobs') + return + endif + + for [name, j] in items(s:jobs) + if s:nvim + silent! call jobstop(j.jobid) + elseif s:vim8 + silent! call job_stop(j.jobid) + endif + if j.new + call s:rm_rf(g:plugs[name].dir) + endif + endfor + let s:jobs = {} +endfunction + +function! s:last_non_empty_line(lines) + let len = len(a:lines) + for idx in range(len) + let line = a:lines[len-idx-1] + if !empty(line) + return line + endif + endfor + return '' +endfunction + +function! s:job_out_cb(self, data) abort + let self = a:self + let data = remove(self.lines, -1) . a:data + let lines = map(split(data, "\n", 1), 'split(v:val, "\r", 1)[-1]') + call extend(self.lines, lines) + " To reduce the number of buffer updates + let self.tick = get(self, 'tick', -1) + 1 + if !self.running || self.tick % len(s:jobs) == 0 + let bullet = self.running ? (self.new ? '+' : '*') : (self.error ? 'x' : '-') + let result = self.error ? join(self.lines, "\n") : s:last_non_empty_line(self.lines) + call s:log(bullet, self.name, result) + endif +endfunction + +function! s:job_exit_cb(self, data) abort + let a:self.running = 0 + let a:self.error = a:data != 0 + call s:reap(a:self.name) + call s:tick() +endfunction + +function! s:job_cb(fn, job, ch, data) + if !s:plug_window_exists() " plug window closed + return s:job_abort() + endif + call call(a:fn, [a:job, a:data]) +endfunction + +function! s:nvim_cb(job_id, data, event) dict abort + return (a:event == 'stdout' || a:event == 'stderr') ? + \ s:job_cb('s:job_out_cb', self, 0, join(a:data, "\n")) : + \ s:job_cb('s:job_exit_cb', self, 0, a:data) +endfunction + +function! s:spawn(name, cmd, opts) + let job = { 'name': a:name, 'running': 1, 'error': 0, 'lines': [''], + \ 'new': get(a:opts, 'new', 0) } + let s:jobs[a:name] = job + + if s:nvim + if has_key(a:opts, 'dir') + let job.cwd = a:opts.dir + endif + let argv = a:cmd + call extend(job, { + \ 'on_stdout': function('s:nvim_cb'), + \ 'on_stderr': function('s:nvim_cb'), + \ 'on_exit': function('s:nvim_cb'), + \ }) + let jid = s:plug_call('jobstart', argv, job) + if jid > 0 + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = [jid < 0 ? argv[0].' is not executable' : + \ 'Invalid arguments (or job table is full)'] + endif + elseif s:vim8 + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"script": 0})')) + if has_key(a:opts, 'dir') + let cmd = s:with_cd(cmd, a:opts.dir, 0) + endif + let argv = s:is_win ? ['cmd', '/s', '/c', '"'.cmd.'"'] : ['sh', '-c', cmd] + let jid = job_start(s:is_win ? join(argv, ' ') : argv, { + \ 'out_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'err_cb': function('s:job_cb', ['s:job_out_cb', job]), + \ 'exit_cb': function('s:job_cb', ['s:job_exit_cb', job]), + \ 'err_mode': 'raw', + \ 'out_mode': 'raw' + \}) + if job_status(jid) == 'run' + let job.jobid = jid + else + let job.running = 0 + let job.error = 1 + let job.lines = ['Failed to start job'] + endif + else + let job.lines = s:lines(call('s:system', has_key(a:opts, 'dir') ? [a:cmd, a:opts.dir] : [a:cmd])) + let job.error = v:shell_error != 0 + let job.running = 0 + endif +endfunction + +function! s:reap(name) + let job = s:jobs[a:name] + if job.error + call add(s:update.errors, a:name) + elseif get(job, 'new', 0) + let s:update.new[a:name] = 1 + endif + let s:update.bar .= job.error ? 'x' : '=' + + let bullet = job.error ? 'x' : '-' + let result = job.error ? join(job.lines, "\n") : s:last_non_empty_line(job.lines) + call s:log(bullet, a:name, empty(result) ? 'OK' : result) + call s:bar() + + call remove(s:jobs, a:name) +endfunction + +function! s:bar() + if s:switch_in() + let total = len(s:update.all) + call setline(1, (s:update.pull ? 'Updating' : 'Installing'). + \ ' plugins ('.len(s:update.bar).'/'.total.')') + call s:progress_bar(2, s:update.bar, total) + call s:switch_out() + endif +endfunction + +function! s:logpos(name) + let max = line('$') + for i in range(4, max > 4 ? max : 4) + if getline(i) =~# '^[-+x*] '.a:name.':' + for j in range(i + 1, max > 5 ? max : 5) + if getline(j) !~ '^ ' + return [i, j - 1] + endif + endfor + return [i, i] + endif + endfor + return [0, 0] +endfunction + +function! s:log(bullet, name, lines) + if s:switch_in() + let [b, e] = s:logpos(a:name) + if b > 0 + silent execute printf('%d,%d d _', b, e) + if b > winheight('.') + let b = 4 + endif + else + let b = 4 + endif + " FIXME For some reason, nomodifiable is set after :d in vim8 + setlocal modifiable + call append(b - 1, s:format_message(a:bullet, a:name, a:lines)) + call s:switch_out() + endif +endfunction + +function! s:update_vim() + let s:jobs = {} + + call s:bar() + call s:tick() +endfunction + +function! s:tick() + let pull = s:update.pull + let prog = s:progress_opt(s:nvim || s:vim8) +while 1 " Without TCO, Vim stack is bound to explode + if empty(s:update.todo) + if empty(s:jobs) && !s:update.fin + call s:update_finish() + let s:update.fin = 1 + endif + return + endif + + let name = keys(s:update.todo)[0] + let spec = remove(s:update.todo, name) + let new = empty(globpath(spec.dir, '.git', 1)) + + call s:log(new ? '+' : '*', name, pull ? 'Updating ...' : 'Installing ...') + redraw + + let has_tag = has_key(spec, 'tag') + if !new + let [error, _] = s:git_validate(spec, 0) + if empty(error) + if pull + let cmd = s:git_version_requirement(2) ? ['git', '-c', 'credential.helper=', 'fetch'] : ['git', 'fetch'] + if has_tag && !empty(globpath(spec.dir, '.git/shallow')) + call extend(cmd, ['--depth', '99999999']) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, cmd, { 'dir': spec.dir }) + else + let s:jobs[name] = { 'running': 0, 'lines': ['Already installed'], 'error': 0 } + endif + else + let s:jobs[name] = { 'running': 0, 'lines': s:lines(error), 'error': 1 } + endif + else + let cmd = ['git', 'clone'] + if !has_tag + call extend(cmd, s:clone_opt) + endif + if !empty(prog) + call add(cmd, prog) + endif + call s:spawn(name, extend(cmd, [spec.uri, s:trim(spec.dir)]), { 'new': 1 }) + endif + + if !s:jobs[name].running + call s:reap(name) + endif + if len(s:jobs) >= s:update.threads + break + endif +endwhile +endfunction + +function! s:update_python() +let py_exe = has('python') ? 'python' : 'python3' +execute py_exe "<< EOF" +import datetime +import functools +import os +try: + import queue +except ImportError: + import Queue as queue +import random +import re +import shutil +import signal +import subprocess +import tempfile +import threading as thr +import time +import traceback +import vim + +G_NVIM = vim.eval("has('nvim')") == '1' +G_PULL = vim.eval('s:update.pull') == '1' +G_RETRIES = int(vim.eval('get(g:, "plug_retries", 2)')) + 1 +G_TIMEOUT = int(vim.eval('get(g:, "plug_timeout", 60)')) +G_CLONE_OPT = ' '.join(vim.eval('s:clone_opt')) +G_PROGRESS = vim.eval('s:progress_opt(1)') +G_LOG_PROB = 1.0 / int(vim.eval('s:update.threads')) +G_STOP = thr.Event() +G_IS_WIN = vim.eval('s:is_win') == '1' + +class PlugError(Exception): + def __init__(self, msg): + self.msg = msg +class CmdTimedOut(PlugError): + pass +class CmdFailed(PlugError): + pass +class InvalidURI(PlugError): + pass +class Action(object): + INSTALL, UPDATE, ERROR, DONE = ['+', '*', 'x', '-'] + +class Buffer(object): + def __init__(self, lock, num_plugs, is_pull): + self.bar = '' + self.event = 'Updating' if is_pull else 'Installing' + self.lock = lock + self.maxy = int(vim.eval('winheight(".")')) + self.num_plugs = num_plugs + + def __where(self, name): + """ Find first line with name in current buffer. Return line num. """ + found, lnum = False, 0 + matcher = re.compile('^[-+x*] {0}:'.format(name)) + for line in vim.current.buffer: + if matcher.search(line) is not None: + found = True + break + lnum += 1 + + if not found: + lnum = -1 + return lnum + + def header(self): + curbuf = vim.current.buffer + curbuf[0] = self.event + ' plugins ({0}/{1})'.format(len(self.bar), self.num_plugs) + + num_spaces = self.num_plugs - len(self.bar) + curbuf[1] = '[{0}{1}]'.format(self.bar, num_spaces * ' ') + + with self.lock: + vim.command('normal! 2G') + vim.command('redraw') + + def write(self, action, name, lines): + first, rest = lines[0], lines[1:] + msg = ['{0} {1}{2}{3}'.format(action, name, ': ' if first else '', first)] + msg.extend([' ' + line for line in rest]) + + try: + if action == Action.ERROR: + self.bar += 'x' + vim.command("call add(s:update.errors, '{0}')".format(name)) + elif action == Action.DONE: + self.bar += '=' + + curbuf = vim.current.buffer + lnum = self.__where(name) + if lnum != -1: # Found matching line num + del curbuf[lnum] + if lnum > self.maxy and action in set([Action.INSTALL, Action.UPDATE]): + lnum = 3 + else: + lnum = 3 + curbuf.append(msg, lnum) + + self.header() + except vim.error: + pass + +class Command(object): + CD = 'cd /d' if G_IS_WIN else 'cd' + + def __init__(self, cmd, cmd_dir=None, timeout=60, cb=None, clean=None): + self.cmd = cmd + if cmd_dir: + self.cmd = '{0} {1} && {2}'.format(Command.CD, cmd_dir, self.cmd) + self.timeout = timeout + self.callback = cb if cb else (lambda msg: None) + self.clean = clean if clean else (lambda: None) + self.proc = None + + @property + def alive(self): + """ Returns true only if command still running. """ + return self.proc and self.proc.poll() is None + + def execute(self, ntries=3): + """ Execute the command with ntries if CmdTimedOut. + Returns the output of the command if no Exception. + """ + attempt, finished, limit = 0, False, self.timeout + + while not finished: + try: + attempt += 1 + result = self.try_command() + finished = True + return result + except CmdTimedOut: + if attempt != ntries: + self.notify_retry() + self.timeout += limit + else: + raise + + def notify_retry(self): + """ Retry required for command, notify user. """ + for count in range(3, 0, -1): + if G_STOP.is_set(): + raise KeyboardInterrupt + msg = 'Timeout. Will retry in {0} second{1} ...'.format( + count, 's' if count != 1 else '') + self.callback([msg]) + time.sleep(1) + self.callback(['Retrying ...']) + + def try_command(self): + """ Execute a cmd & poll for callback. Returns list of output. + Raises CmdFailed -> return code for Popen isn't 0 + Raises CmdTimedOut -> command exceeded timeout without new output + """ + first_line = True + + try: + tfile = tempfile.NamedTemporaryFile(mode='w+b') + preexec_fn = not G_IS_WIN and os.setsid or None + self.proc = subprocess.Popen(self.cmd, stdout=tfile, + stderr=subprocess.STDOUT, + stdin=subprocess.PIPE, shell=True, + preexec_fn=preexec_fn) + thrd = thr.Thread(target=(lambda proc: proc.wait()), args=(self.proc,)) + thrd.start() + + thread_not_started = True + while thread_not_started: + try: + thrd.join(0.1) + thread_not_started = False + except RuntimeError: + pass + + while self.alive: + if G_STOP.is_set(): + raise KeyboardInterrupt + + if first_line or random.random() < G_LOG_PROB: + first_line = False + line = '' if G_IS_WIN else nonblock_read(tfile.name) + if line: + self.callback([line]) + + time_diff = time.time() - os.path.getmtime(tfile.name) + if time_diff > self.timeout: + raise CmdTimedOut(['Timeout!']) + + thrd.join(0.5) + + tfile.seek(0) + result = [line.decode('utf-8', 'replace').rstrip() for line in tfile] + + if self.proc.returncode != 0: + raise CmdFailed([''] + result) + + return result + except: + self.terminate() + raise + + def terminate(self): + """ Terminate process and cleanup. """ + if self.alive: + if G_IS_WIN: + os.kill(self.proc.pid, signal.SIGINT) + else: + os.killpg(self.proc.pid, signal.SIGTERM) + self.clean() + +class Plugin(object): + def __init__(self, name, args, buf_q, lock): + self.name = name + self.args = args + self.buf_q = buf_q + self.lock = lock + self.tag = args.get('tag', 0) + + def manage(self): + try: + if os.path.exists(self.args['dir']): + self.update() + else: + self.install() + with self.lock: + thread_vim_command("let s:update.new['{0}'] = 1".format(self.name)) + except PlugError as exc: + self.write(Action.ERROR, self.name, exc.msg) + except KeyboardInterrupt: + G_STOP.set() + self.write(Action.ERROR, self.name, ['Interrupted!']) + except: + # Any exception except those above print stack trace + msg = 'Trace:\n{0}'.format(traceback.format_exc().rstrip()) + self.write(Action.ERROR, self.name, msg.split('\n')) + raise + + def install(self): + target = self.args['dir'] + if target[-1] == '\\': + target = target[0:-1] + + def clean(target): + def _clean(): + try: + shutil.rmtree(target) + except OSError: + pass + return _clean + + self.write(Action.INSTALL, self.name, ['Installing ...']) + callback = functools.partial(self.write, Action.INSTALL, self.name) + cmd = 'git clone {0} {1} {2} {3} 2>&1'.format( + '' if self.tag else G_CLONE_OPT, G_PROGRESS, self.args['uri'], + esc(target)) + com = Command(cmd, None, G_TIMEOUT, callback, clean(target)) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + + def repo_uri(self): + cmd = 'git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url' + command = Command(cmd, self.args['dir'], G_TIMEOUT,) + result = command.execute(G_RETRIES) + return result[-1] + + def update(self): + actual_uri = self.repo_uri() + expect_uri = self.args['uri'] + regex = re.compile(r'^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$') + ma = regex.match(actual_uri) + mb = regex.match(expect_uri) + if ma is None or mb is None or ma.groups() != mb.groups(): + msg = ['', + 'Invalid URI: {0}'.format(actual_uri), + 'Expected {0}'.format(expect_uri), + 'PlugClean required.'] + raise InvalidURI(msg) + + if G_PULL: + self.write(Action.UPDATE, self.name, ['Updating ...']) + callback = functools.partial(self.write, Action.UPDATE, self.name) + fetch_opt = '--depth 99999999' if self.tag and os.path.isfile(os.path.join(self.args['dir'], '.git/shallow')) else '' + cmd = 'git fetch {0} {1} 2>&1'.format(fetch_opt, G_PROGRESS) + com = Command(cmd, self.args['dir'], G_TIMEOUT, callback) + result = com.execute(G_RETRIES) + self.write(Action.DONE, self.name, result[-1:]) + else: + self.write(Action.DONE, self.name, ['Already installed']) + + def write(self, action, name, msg): + self.buf_q.put((action, name, msg)) + +class PlugThread(thr.Thread): + def __init__(self, tname, args): + super(PlugThread, self).__init__() + self.tname = tname + self.args = args + + def run(self): + thr.current_thread().name = self.tname + buf_q, work_q, lock = self.args + + try: + while not G_STOP.is_set(): + name, args = work_q.get_nowait() + plug = Plugin(name, args, buf_q, lock) + plug.manage() + work_q.task_done() + except queue.Empty: + pass + +class RefreshThread(thr.Thread): + def __init__(self, lock): + super(RefreshThread, self).__init__() + self.lock = lock + self.running = True + + def run(self): + while self.running: + with self.lock: + thread_vim_command('noautocmd normal! a') + time.sleep(0.33) + + def stop(self): + self.running = False + +if G_NVIM: + def thread_vim_command(cmd): + vim.session.threadsafe_call(lambda: vim.command(cmd)) +else: + def thread_vim_command(cmd): + vim.command(cmd) + +def esc(name): + return '"' + name.replace('"', '\"') + '"' + +def nonblock_read(fname): + """ Read a file with nonblock flag. Return the last line. """ + fread = os.open(fname, os.O_RDONLY | os.O_NONBLOCK) + buf = os.read(fread, 100000).decode('utf-8', 'replace') + os.close(fread) + + line = buf.rstrip('\r\n') + left = max(line.rfind('\r'), line.rfind('\n')) + if left != -1: + left += 1 + line = line[left:] + + return line + +def main(): + thr.current_thread().name = 'main' + nthreads = int(vim.eval('s:update.threads')) + plugs = vim.eval('s:update.todo') + mac_gui = vim.eval('s:mac_gui') == '1' + + lock = thr.Lock() + buf = Buffer(lock, len(plugs), G_PULL) + buf_q, work_q = queue.Queue(), queue.Queue() + for work in plugs.items(): + work_q.put(work) + + start_cnt = thr.active_count() + for num in range(nthreads): + tname = 'PlugT-{0:02}'.format(num) + thread = PlugThread(tname, (buf_q, work_q, lock)) + thread.start() + if mac_gui: + rthread = RefreshThread(lock) + rthread.start() + + while not buf_q.empty() or thr.active_count() != start_cnt: + try: + action, name, msg = buf_q.get(True, 0.25) + buf.write(action, name, ['OK'] if not msg else msg) + buf_q.task_done() + except queue.Empty: + pass + except KeyboardInterrupt: + G_STOP.set() + + if mac_gui: + rthread.stop() + rthread.join() + +main() +EOF +endfunction + +function! s:update_ruby() + ruby << EOF + module PlugStream + SEP = ["\r", "\n", nil] + def get_line + buffer = '' + loop do + char = readchar rescue return + if SEP.include? char.chr + buffer << $/ + break + else + buffer << char + end + end + buffer + end + end unless defined?(PlugStream) + + def esc arg + %["#{arg.gsub('"', '\"')}"] + end + + def killall pid + pids = [pid] + if /mswin|mingw|bccwin/ =~ RUBY_PLATFORM + pids.each { |pid| Process.kill 'INT', pid.to_i rescue nil } + else + unless `which pgrep 2> /dev/null`.empty? + children = pids + until children.empty? + children = children.map { |pid| + `pgrep -P #{pid}`.lines.map { |l| l.chomp } + }.flatten + pids += children + end + end + pids.each { |pid| Process.kill 'TERM', pid.to_i rescue nil } + end + end + + def compare_git_uri a, b + regex = %r{^(?:\w+://)?(?:[^@/]*@)?([^:/]*(?::[0-9]*)?)[:/](.*?)(?:\.git)?/?$} + regex.match(a).to_a.drop(1) == regex.match(b).to_a.drop(1) + end + + require 'thread' + require 'fileutils' + require 'timeout' + running = true + iswin = VIM::evaluate('s:is_win').to_i == 1 + pull = VIM::evaluate('s:update.pull').to_i == 1 + base = VIM::evaluate('g:plug_home') + all = VIM::evaluate('s:update.todo') + limit = VIM::evaluate('get(g:, "plug_timeout", 60)') + tries = VIM::evaluate('get(g:, "plug_retries", 2)') + 1 + nthr = VIM::evaluate('s:update.threads').to_i + maxy = VIM::evaluate('winheight(".")').to_i + vim7 = VIM::evaluate('v:version').to_i <= 703 && RUBY_PLATFORM =~ /darwin/ + cd = iswin ? 'cd /d' : 'cd' + tot = VIM::evaluate('len(s:update.todo)') || 0 + bar = '' + skip = 'Already installed' + mtx = Mutex.new + take1 = proc { mtx.synchronize { running && all.shift } } + logh = proc { + cnt = bar.length + $curbuf[1] = "#{pull ? 'Updating' : 'Installing'} plugins (#{cnt}/#{tot})" + $curbuf[2] = '[' + bar.ljust(tot) + ']' + VIM::command('normal! 2G') + VIM::command('redraw') + } + where = proc { |name| (1..($curbuf.length)).find { |l| $curbuf[l] =~ /^[-+x*] #{name}:/ } } + log = proc { |name, result, type| + mtx.synchronize do + ing = ![true, false].include?(type) + bar += type ? '=' : 'x' unless ing + b = case type + when :install then '+' when :update then '*' + when true, nil then '-' else + VIM::command("call add(s:update.errors, '#{name}')") + 'x' + end + result = + if type || type.nil? + ["#{b} #{name}: #{result.lines.to_a.last || 'OK'}"] + elsif result =~ /^Interrupted|^Timeout/ + ["#{b} #{name}: #{result}"] + else + ["#{b} #{name}"] + result.lines.map { |l| " " << l } + end + if lnum = where.call(name) + $curbuf.delete lnum + lnum = 4 if ing && lnum > maxy + end + result.each_with_index do |line, offset| + $curbuf.append((lnum || 4) - 1 + offset, line.gsub(/\e\[./, '').chomp) + end + logh.call + end + } + bt = proc { |cmd, name, type, cleanup| + tried = timeout = 0 + begin + tried += 1 + timeout += limit + fd = nil + data = '' + if iswin + Timeout::timeout(timeout) do + tmp = VIM::evaluate('tempname()') + system("(#{cmd}) > #{tmp}") + data = File.read(tmp).chomp + File.unlink tmp rescue nil + end + else + fd = IO.popen(cmd).extend(PlugStream) + first_line = true + log_prob = 1.0 / nthr + while line = Timeout::timeout(timeout) { fd.get_line } + data << line + log.call name, line.chomp, type if name && (first_line || rand < log_prob) + first_line = false + end + fd.close + end + [$? == 0, data.chomp] + rescue Timeout::Error, Interrupt => e + if fd && !fd.closed? + killall fd.pid + fd.close + end + cleanup.call if cleanup + if e.is_a?(Timeout::Error) && tried < tries + 3.downto(1) do |countdown| + s = countdown > 1 ? 's' : '' + log.call name, "Timeout. Will retry in #{countdown} second#{s} ...", type + sleep 1 + end + log.call name, 'Retrying ...', type + retry + end + [false, e.is_a?(Interrupt) ? "Interrupted!" : "Timeout!"] + end + } + main = Thread.current + threads = [] + watcher = Thread.new { + if vim7 + while VIM::evaluate('getchar(1)') + sleep 0.1 + end + else + require 'io/console' # >= Ruby 1.9 + nil until IO.console.getch == 3.chr + end + mtx.synchronize do + running = false + threads.each { |t| t.raise Interrupt } unless vim7 + end + threads.each { |t| t.join rescue nil } + main.kill + } + refresh = Thread.new { + while true + mtx.synchronize do + break unless running + VIM::command('noautocmd normal! a') + end + sleep 0.2 + end + } if VIM::evaluate('s:mac_gui') == 1 + + clone_opt = VIM::evaluate('s:clone_opt').join(' ') + progress = VIM::evaluate('s:progress_opt(1)') + nthr.times do + mtx.synchronize do + threads << Thread.new { + while pair = take1.call + name = pair.first + dir, uri, tag = pair.last.values_at *%w[dir uri tag] + exists = File.directory? dir + ok, result = + if exists + chdir = "#{cd} #{iswin ? dir : esc(dir)}" + ret, data = bt.call "#{chdir} && git rev-parse --abbrev-ref HEAD 2>&1 && git config -f .git/config remote.origin.url", nil, nil, nil + current_uri = data.lines.to_a.last + if !ret + if data =~ /^Interrupted|^Timeout/ + [false, data] + else + [false, [data.chomp, "PlugClean required."].join($/)] + end + elsif !compare_git_uri(current_uri, uri) + [false, ["Invalid URI: #{current_uri}", + "Expected: #{uri}", + "PlugClean required."].join($/)] + else + if pull + log.call name, 'Updating ...', :update + fetch_opt = (tag && File.exist?(File.join(dir, '.git/shallow'))) ? '--depth 99999999' : '' + bt.call "#{chdir} && git fetch #{fetch_opt} #{progress} 2>&1", name, :update, nil + else + [true, skip] + end + end + else + d = esc dir.sub(%r{[\\/]+$}, '') + log.call name, 'Installing ...', :install + bt.call "git clone #{clone_opt unless tag} #{progress} #{uri} #{d} 2>&1", name, :install, proc { + FileUtils.rm_rf dir + } + end + mtx.synchronize { VIM::command("let s:update.new['#{name}'] = 1") } if !exists && ok + log.call name, result, ok + end + } if running + end + end + threads.each { |t| t.join rescue nil } + logh.call + refresh.kill if refresh + watcher.kill +EOF +endfunction + +function! s:shellesc_cmd(arg, script) + let escaped = substitute('"'.a:arg.'"', '[&|<>()@^!"]', '^&', 'g') + return substitute(escaped, '%', (a:script ? '%' : '^') . '&', 'g') +endfunction + +function! s:shellesc_ps1(arg) + return "'".substitute(escape(a:arg, '\"'), "'", "''", 'g')."'" +endfunction + +function! s:shellesc_sh(arg) + return "'".substitute(a:arg, "'", "'\\\\''", 'g')."'" +endfunction + +" Escape the shell argument based on the shell. +" Vim and Neovim's shellescape() are insufficient. +" 1. shellslash determines whether to use single/double quotes. +" Double-quote escaping is fragile for cmd.exe. +" 2. It does not work for powershell. +" 3. It does not work for *sh shells if the command is executed +" via cmd.exe (ie. cmd.exe /c sh -c command command_args) +" 4. It does not support batchfile syntax. +" +" Accepts an optional dictionary with the following keys: +" - shell: same as Vim/Neovim 'shell' option. +" If unset, fallback to 'cmd.exe' on Windows or 'sh'. +" - script: If truthy and shell is cmd.exe, escape for batchfile syntax. +function! plug#shellescape(arg, ...) + if a:arg =~# '^[A-Za-z0-9_/:.-]\+$' + return a:arg + endif + let opts = a:0 > 0 && type(a:1) == s:TYPE.dict ? a:1 : {} + let shell = get(opts, 'shell', s:is_win ? 'cmd.exe' : 'sh') + let script = get(opts, 'script', 1) + if shell =~# 'cmd\(\.exe\)\?$' + return s:shellesc_cmd(a:arg, script) + elseif s:is_powershell(shell) + return s:shellesc_ps1(a:arg) + endif + return s:shellesc_sh(a:arg) +endfunction + +function! s:glob_dir(path) + return map(filter(s:glob(a:path, '**'), 'isdirectory(v:val)'), 's:dirpath(v:val)') +endfunction + +function! s:progress_bar(line, bar, total) + call setline(a:line, '[' . s:lpad(a:bar, a:total) . ']') +endfunction + +function! s:compare_git_uri(a, b) + " See `git help clone' + " https:// [user@] github.com[:port] / junegunn/vim-plug [.git] + " [git@] github.com[:port] : junegunn/vim-plug [.git] + " file:// / junegunn/vim-plug [/] + " / junegunn/vim-plug [/] + let pat = '^\%(\w\+://\)\='.'\%([^@/]*@\)\='.'\([^:/]*\%(:[0-9]*\)\=\)'.'[:/]'.'\(.\{-}\)'.'\%(\.git\)\=/\?$' + let ma = matchlist(a:a, pat) + let mb = matchlist(a:b, pat) + return ma[1:2] ==# mb[1:2] +endfunction + +function! s:format_message(bullet, name, message) + if a:bullet != 'x' + return [printf('%s %s: %s', a:bullet, a:name, s:lastline(a:message))] + else + let lines = map(s:lines(a:message), '" ".v:val') + return extend([printf('x %s:', a:name)], lines) + endif +endfunction + +function! s:with_cd(cmd, dir, ...) + let script = a:0 > 0 ? a:1 : 1 + return printf('cd%s %s && %s', s:is_win ? ' /d' : '', plug#shellescape(a:dir, {'script': script}), a:cmd) +endfunction + +function! s:system(cmd, ...) + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + if type(a:cmd) == s:TYPE.list + " Neovim's system() supports list argument to bypass the shell + " but it cannot set the working directory for the command. + " Assume that the command does not rely on the shell. + if has('nvim') && a:0 == 0 + return system(a:cmd) + endif + let cmd = join(map(copy(a:cmd), 'plug#shellescape(v:val, {"shell": &shell, "script": 0})')) + if s:is_powershell(&shell) + let cmd = '& ' . cmd + endif + else + let cmd = a:cmd + endif + if a:0 > 0 + let cmd = s:with_cd(cmd, a:1, type(a:cmd) != s:TYPE.list) + endif + if s:is_win && type(a:cmd) != s:TYPE.list + let [batchfile, cmd] = s:batchfile(cmd) + endif + return system(cmd) + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry +endfunction + +function! s:system_chomp(...) + let ret = call('s:system', a:000) + return v:shell_error ? '' : substitute(ret, '\n$', '', '') +endfunction + +function! s:git_validate(spec, check_branch) + let err = '' + if isdirectory(a:spec.dir) + let result = [s:git_local_branch(a:spec.dir), s:git_origin_url(a:spec.dir)] + let remote = result[-1] + if empty(remote) + let err = join([remote, 'PlugClean required.'], "\n") + elseif !s:compare_git_uri(remote, a:spec.uri) + let err = join(['Invalid URI: '.remote, + \ 'Expected: '.a:spec.uri, + \ 'PlugClean required.'], "\n") + elseif a:check_branch && has_key(a:spec, 'commit') + let sha = s:git_revision(a:spec.dir) + if empty(sha) + let err = join(add(result, 'PlugClean required.'), "\n") + elseif !s:hash_match(sha, a:spec.commit) + let err = join([printf('Invalid HEAD (expected: %s, actual: %s)', + \ a:spec.commit[:6], sha[:6]), + \ 'PlugUpdate required.'], "\n") + endif + elseif a:check_branch + let current_branch = result[0] + " Check tag + let origin_branch = s:git_origin_branch(a:spec) + if has_key(a:spec, 'tag') + let tag = s:system_chomp('git describe --exact-match --tags HEAD 2>&1', a:spec.dir) + if a:spec.tag !=# tag && a:spec.tag !~ '\*' + let err = printf('Invalid tag: %s (expected: %s). Try PlugUpdate.', + \ (empty(tag) ? 'N/A' : tag), a:spec.tag) + endif + " Check branch + elseif origin_branch !=# current_branch + let err = printf('Invalid branch: %s (expected: %s). Try PlugUpdate.', + \ current_branch, origin_branch) + endif + if empty(err) + let [ahead, behind] = split(s:lastline(s:system([ + \ 'git', 'rev-list', '--count', '--left-right', + \ printf('HEAD...origin/%s', origin_branch) + \ ], a:spec.dir)), '\t') + if !v:shell_error && ahead + if behind + " Only mention PlugClean if diverged, otherwise it's likely to be + " pushable (and probably not that messed up). + let err = printf( + \ "Diverged from origin/%s (%d commit(s) ahead and %d commit(s) behind!\n" + \ .'Backup local changes and run PlugClean and PlugUpdate to reinstall it.', origin_branch, ahead, behind) + else + let err = printf("Ahead of origin/%s by %d commit(s).\n" + \ .'Cannot update until local changes are pushed.', + \ origin_branch, ahead) + endif + endif + endif + endif + else + let err = 'Not found' + endif + return [err, err =~# 'PlugClean'] +endfunction + +function! s:rm_rf(dir) + if isdirectory(a:dir) + return s:system(s:is_win + \ ? 'rmdir /S /Q '.plug#shellescape(a:dir) + \ : ['rm', '-rf', a:dir]) + endif +endfunction + +function! s:clean(force) + call s:prepare() + call append(0, 'Searching for invalid plugins in '.g:plug_home) + call append(1, '') + + " List of valid directories + let dirs = [] + let errs = {} + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + if !s:is_managed(name) + call add(dirs, spec.dir) + else + let [err, clean] = s:git_validate(spec, 1) + if clean + let errs[spec.dir] = s:lines(err)[0] + else + call add(dirs, spec.dir) + endif + endif + let cnt += 1 + call s:progress_bar(2, repeat('=', cnt), total) + normal! 2G + redraw + endfor + + let allowed = {} + for dir in dirs + let allowed[s:dirpath(s:plug_fnamemodify(dir, ':h:h'))] = 1 + let allowed[dir] = 1 + for child in s:glob_dir(dir) + let allowed[child] = 1 + endfor + endfor + + let todo = [] + let found = sort(s:glob_dir(g:plug_home)) + while !empty(found) + let f = remove(found, 0) + if !has_key(allowed, f) && isdirectory(f) + call add(todo, f) + call append(line('$'), '- ' . f) + if has_key(errs, f) + call append(line('$'), ' ' . errs[f]) + endif + let found = filter(found, 'stridx(v:val, f) != 0') + end + endwhile + + 4 + redraw + if empty(todo) + call append(line('$'), 'Already clean.') + else + let s:clean_count = 0 + call append(3, ['Directories to delete:', '']) + redraw! + if a:force || s:ask_no_interrupt('Delete all directories?') + call s:delete([6, line('$')], 1) + else + call setline(4, 'Cancelled.') + nnoremap <silent> <buffer> d :set opfunc=<sid>delete_op<cr>g@ + nmap <silent> <buffer> dd d_ + xnoremap <silent> <buffer> d :<c-u>call <sid>delete_op(visualmode(), 1)<cr> + echo 'Delete the lines (d{motion}) to delete the corresponding directories' + endif + endif + 4 + setlocal nomodifiable +endfunction + +function! s:delete_op(type, ...) + call s:delete(a:0 ? [line("'<"), line("'>")] : [line("'["), line("']")], 0) +endfunction + +function! s:delete(range, force) + let [l1, l2] = a:range + let force = a:force + let err_count = 0 + while l1 <= l2 + let line = getline(l1) + if line =~ '^- ' && isdirectory(line[2:]) + execute l1 + redraw! + let answer = force ? 1 : s:ask('Delete '.line[2:].'?', 1) + let force = force || answer > 1 + if answer + let err = s:rm_rf(line[2:]) + setlocal modifiable + if empty(err) + call setline(l1, '~'.line[1:]) + let s:clean_count += 1 + else + delete _ + call append(l1 - 1, s:format_message('x', line[1:], err)) + let l2 += len(s:lines(err)) + let err_count += 1 + endif + let msg = printf('Removed %d directories.', s:clean_count) + if err_count > 0 + let msg .= printf(' Failed to remove %d directories.', err_count) + endif + call setline(4, msg) + setlocal nomodifiable + endif + endif + let l1 += 1 + endwhile +endfunction + +function! s:upgrade() + echo 'Downloading the latest version of vim-plug' + redraw + let tmp = s:plug_tempname() + let new = tmp . '/plug.vim' + + try + let out = s:system(['git', 'clone', '--depth', '1', s:plug_src, tmp]) + if v:shell_error + return s:err('Error upgrading vim-plug: '. out) + endif + + if readfile(s:me) ==# readfile(new) + echo 'vim-plug is already up-to-date' + return 0 + else + call rename(s:me, s:me . '.old') + call rename(new, s:me) + unlet g:loaded_plug + echo 'vim-plug has been upgraded' + return 1 + endif + finally + silent! call s:rm_rf(tmp) + endtry +endfunction + +function! s:upgrade_specs() + for spec in values(g:plugs) + let spec.frozen = get(spec, 'frozen', 0) + endfor +endfunction + +function! s:status() + call s:prepare() + call append(0, 'Checking plugins') + call append(1, '') + + let ecnt = 0 + let unloaded = 0 + let [cnt, total] = [0, len(g:plugs)] + for [name, spec] in items(g:plugs) + let is_dir = isdirectory(spec.dir) + if has_key(spec, 'uri') + if is_dir + let [err, _] = s:git_validate(spec, 1) + let [valid, msg] = [empty(err), empty(err) ? 'OK' : err] + else + let [valid, msg] = [0, 'Not found. Try PlugInstall.'] + endif + else + if is_dir + let [valid, msg] = [1, 'OK'] + else + let [valid, msg] = [0, 'Not found.'] + endif + endif + let cnt += 1 + let ecnt += !valid + " `s:loaded` entry can be missing if PlugUpgraded + if is_dir && get(s:loaded, name, -1) == 0 + let unloaded = 1 + let msg .= ' (not loaded)' + endif + call s:progress_bar(2, repeat('=', cnt), total) + call append(3, s:format_message(valid ? '-' : 'x', name, msg)) + normal! 2G + redraw + endfor + call setline(1, 'Finished. '.ecnt.' error(s).') + normal! gg + setlocal nomodifiable + if unloaded + echo "Press 'L' on each line to load plugin, or 'U' to update" + nnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr> + xnoremap <silent> <buffer> L :call <SID>status_load(line('.'))<cr> + end +endfunction + +function! s:extract_name(str, prefix, suffix) + return matchstr(a:str, '^'.a:prefix.' \zs[^:]\+\ze:.*'.a:suffix.'$') +endfunction + +function! s:status_load(lnum) + let line = getline(a:lnum) + let name = s:extract_name(line, '-', '(not loaded)') + if !empty(name) + call plug#load(name) + setlocal modifiable + call setline(a:lnum, substitute(line, ' (not loaded)$', '', '')) + setlocal nomodifiable + endif +endfunction + +function! s:status_update() range + let lines = getline(a:firstline, a:lastline) + let names = filter(map(lines, 's:extract_name(v:val, "[x-]", "")'), '!empty(v:val)') + if !empty(names) + echo + execute 'PlugUpdate' join(names) + endif +endfunction + +function! s:is_preview_window_open() + silent! wincmd P + if &previewwindow + wincmd p + return 1 + endif +endfunction + +function! s:find_name(lnum) + for lnum in reverse(range(1, a:lnum)) + let line = getline(lnum) + if empty(line) + return '' + endif + let name = s:extract_name(line, '-', '') + if !empty(name) + return name + endif + endfor + return '' +endfunction + +function! s:preview_commit() + if b:plug_preview < 0 + let b:plug_preview = !s:is_preview_window_open() + endif + + let sha = matchstr(getline('.'), '^ \X*\zs[0-9a-f]\{7,9}') + if empty(sha) + let name = matchstr(getline('.'), '^- \zs[^:]*\ze:$') + if empty(name) + return + endif + let title = 'HEAD@{1}..' + let command = 'git diff --no-color HEAD@{1}' + else + let title = sha + let command = 'git show --no-color --pretty=medium '.sha + let name = s:find_name(line('.')) + endif + + if empty(name) || !has_key(g:plugs, name) || !isdirectory(g:plugs[name].dir) + return + endif + + if exists('g:plug_pwindow') && !s:is_preview_window_open() + execute g:plug_pwindow + execute 'e' title + else + execute 'pedit' title + wincmd P + endif + setlocal previewwindow filetype=git buftype=nofile bufhidden=wipe nobuflisted modifiable + let batchfile = '' + try + let [sh, shellcmdflag, shrd] = s:chsh(1) + let cmd = 'cd '.plug#shellescape(g:plugs[name].dir).' && '.command + if s:is_win + let [batchfile, cmd] = s:batchfile(cmd) + endif + execute 'silent %!' cmd + finally + let [&shell, &shellcmdflag, &shellredir] = [sh, shellcmdflag, shrd] + if s:is_win && filereadable(batchfile) + call delete(batchfile) + endif + endtry + setlocal nomodifiable + nnoremap <silent> <buffer> q :q<cr> + wincmd p +endfunction + +function! s:section(flags) + call search('\(^[x-] \)\@<=[^:]\+:', a:flags) +endfunction + +function! s:format_git_log(line) + let indent = ' ' + let tokens = split(a:line, nr2char(1)) + if len(tokens) != 5 + return indent.substitute(a:line, '\s*$', '', '') + endif + let [graph, sha, refs, subject, date] = tokens + let tag = matchstr(refs, 'tag: [^,)]\+') + let tag = empty(tag) ? ' ' : ' ('.tag.') ' + return printf('%s%s%s%s%s (%s)', indent, graph, sha, tag, subject, date) +endfunction + +function! s:append_ul(lnum, text) + call append(a:lnum, ['', a:text, repeat('-', len(a:text))]) +endfunction + +function! s:diff() + call s:prepare() + call append(0, ['Collecting changes ...', '']) + let cnts = [0, 0] + let bar = '' + let total = filter(copy(g:plugs), 's:is_managed(v:key) && isdirectory(v:val.dir)') + call s:progress_bar(2, bar, len(total)) + for origin in [1, 0] + let plugs = reverse(sort(items(filter(copy(total), (origin ? '' : '!').'(has_key(v:val, "commit") || has_key(v:val, "tag"))')))) + if empty(plugs) + continue + endif + call s:append_ul(2, origin ? 'Pending updates:' : 'Last update:') + for [k, v] in plugs + let branch = s:git_origin_branch(v) + if len(branch) + let range = origin ? '..origin/'.branch : 'HEAD@{1}..' + let cmd = ['git', 'log', '--graph', '--color=never'] + if s:git_version_requirement(2, 10, 0) + call add(cmd, '--no-show-signature') + endif + call extend(cmd, ['--pretty=format:%x01%h%x01%d%x01%s%x01%cr', range]) + if has_key(v, 'rtp') + call extend(cmd, ['--', v.rtp]) + endif + let diff = s:system_chomp(cmd, v.dir) + if !empty(diff) + let ref = has_key(v, 'tag') ? (' (tag: '.v.tag.')') : has_key(v, 'commit') ? (' '.v.commit) : '' + call append(5, extend(['', '- '.k.':'.ref], map(s:lines(diff), 's:format_git_log(v:val)'))) + let cnts[origin] += 1 + endif + endif + let bar .= '=' + call s:progress_bar(2, bar, len(total)) + normal! 2G + redraw + endfor + if !cnts[origin] + call append(5, ['', 'N/A']) + endif + endfor + call setline(1, printf('%d plugin(s) updated.', cnts[0]) + \ . (cnts[1] ? printf(' %d plugin(s) have pending updates.', cnts[1]) : '')) + + if cnts[0] || cnts[1] + nnoremap <silent> <buffer> <plug>(plug-preview) :silent! call <SID>preview_commit()<cr> + if empty(maparg("\<cr>", 'n')) + nmap <buffer> <cr> <plug>(plug-preview) + endif + if empty(maparg('o', 'n')) + nmap <buffer> o <plug>(plug-preview) + endif + endif + if cnts[0] + nnoremap <silent> <buffer> X :call <SID>revert()<cr> + echo "Press 'X' on each block to revert the update" + endif + normal! gg + setlocal nomodifiable +endfunction + +function! s:revert() + if search('^Pending updates', 'bnW') + return + endif + + let name = s:find_name(line('.')) + if empty(name) || !has_key(g:plugs, name) || + \ input(printf('Revert the update of %s? (y/N) ', name)) !~? '^y' + return + endif + + call s:system('git reset --hard HEAD@{1} && git checkout '.plug#shellescape(g:plugs[name].branch).' --', g:plugs[name].dir) + setlocal modifiable + normal! "_dap + setlocal nomodifiable + echo 'Reverted' +endfunction + +function! s:snapshot(force, ...) abort + call s:prepare() + setf vim + call append(0, ['" Generated by vim-plug', + \ '" '.strftime("%c"), + \ '" :source this file in vim to restore the snapshot', + \ '" or execute: vim -S snapshot.vim', + \ '', '', 'PlugUpdate!']) + 1 + let anchor = line('$') - 3 + let names = sort(keys(filter(copy(g:plugs), + \'has_key(v:val, "uri") && isdirectory(v:val.dir)'))) + for name in reverse(names) + let sha = has_key(g:plugs[name], 'commit') ? g:plugs[name].commit : s:git_revision(g:plugs[name].dir) + if !empty(sha) + call append(anchor, printf("silent! let g:plugs['%s'].commit = '%s'", name, sha)) + redraw + endif + endfor + + if a:0 > 0 + let fn = s:plug_expand(a:1) + if filereadable(fn) && !(a:force || s:ask(a:1.' already exists. Overwrite?')) + return + endif + call writefile(getline(1, '$'), fn) + echo 'Saved as '.a:1 + silent execute 'e' s:esc(fn) + setf vim + endif +endfunction + +function! s:split_rtp() + return split(&rtp, '\\\@<!,') +endfunction + +let s:first_rtp = s:escrtp(get(s:split_rtp(), 0, '')) +let s:last_rtp = s:escrtp(get(s:split_rtp(), -1, '')) + +if exists('g:plugs') + let g:plugs_order = get(g:, 'plugs_order', keys(g:plugs)) + call s:upgrade_specs() + call s:define_commands() +endif + +let &cpo = s:cpo_save +unlet s:cpo_save diff --git a/stow/vim/.vim/colors/tdpeuter-dark.vim b/stow/vim/.vim/colors/catppuccin_mocha_mod.vim similarity index 99% rename from stow/vim/.vim/colors/tdpeuter-dark.vim rename to stow/vim/.vim/colors/catppuccin_mocha_mod.vim index 25c5705..0282179 100644 --- a/stow/vim/.vim/colors/tdpeuter-dark.vim +++ b/stow/vim/.vim/colors/catppuccin_mocha_mod.vim @@ -1,4 +1,4 @@ -" Name: tdpeuter-dark.vim +" Name: catppuccin_mocha.vim set background=dark hi clear @@ -7,8 +7,7 @@ if exists('syntax on') syntax reset endif -let g:colors_name="tdpeuter-dark" -let colors_name="tdpeuter-dark" +let g:colors_name='catppuccin_mocha_mod' set t_Co=256 set cursorline diff --git a/stow/vim/.vim/colors/tdpeuter-light.vim b/stow/vim/.vim/colors/tdpeuter-light.vim deleted file mode 100644 index 609cfac..0000000 --- a/stow/vim/.vim/colors/tdpeuter-light.vim +++ /dev/null @@ -1,218 +0,0 @@ -" Name: tdpeuter-light.vim - -set background=light -highlight clear -syntax reset - -let g:colors_name="tdpeuter-light" -let colors_name="tdpeuter-light" - -let s:black = { "gui": "#383a42", "cterm": "237" } -let s:red = { "gui": "#e45649", "cterm": "167" } -let s:green = { "gui": "#50a14f", "cterm": "71" } -let s:yellow = { "gui": "#c18401", "cterm": "136" } -let s:blue = { "gui": "#0184bc", "cterm": "31" } -let s:purple = { "gui": "#a626a4", "cterm": "127" } -let s:cyan = { "gui": "#0997b3", "cterm": "31" } -let s:white = { "gui": "#fafafa", "cterm": "231" } - -let s:fg = s:black -let s:bg = s:white - -let s:comment_fg = { "gui": "#a0a1a7", "cterm": "247" } -let s:gutter_bg = { "gui": "#fafafa", "cterm": "231" } -let s:gutter_fg = { "gui": "#d4d4d4", "cterm": "252" } -let s:non_text = { "gui": "#e5e5e5", "cterm": "252" } - -let s:cursor_line = { "gui": "#f0f0f0", "cterm": "255" } -let s:color_col = { "gui": "#f0f0f0", "cterm": "255" } - -let s:selection = { "gui": "#bfceff", "cterm": "153" } -let s:vertsplit = { "gui": "#f0f0f0", "cterm": "255" } - - -function! s:h(group, fg, bg, attr) - if type(a:fg) == type({}) - exec "hi " . a:group . " guifg=" . a:fg.gui . " ctermfg=" . a:fg.cterm - else - exec "hi " . a:group . " guifg=NONE cterm=NONE" - endif - if type(a:bg) == type({}) - exec "hi " . a:group . " guibg=" . a:bg.gui . " ctermbg=" . a:bg.cterm - else - exec "hi " . a:group . " guibg=NONE ctermbg=NONE" - endif - if a:attr != "" - exec "hi " . a:group . " gui=" . a:attr . " cterm=" . a:attr - else - exec "hi " . a:group . " gui=NONE cterm=NONE" - endif -endfun - - -" User interface colors { -" call s:h("Normal", s:fg, s:bg, "") -" Transparent background -hi Normal guisp=NONE guifg=#383a42 guibg=#1E1E2E ctermfg=237 ctermbg=None gui=NONE cterm=NONE - -call s:h("Cursor", s:bg, s:blue, "") -call s:h("CursorColumn", "", s:cursor_line, "") -call s:h("CursorLine", "", s:cursor_line, "") - -" call s:h("LineNr", s:gutter_fg, s:gutter_bg, "") -" Transparent column -hi LineNr guisp=NONE guifg=#d4d4d4 guibg=#fafafa ctermfg=252 ctermbg=NONE gui=NONE -call s:h("CursorLineNr", s:fg, "", "") - -call s:h("DiffAdd", s:green, "", "") -call s:h("DiffChange", s:yellow, "", "") -call s:h("DiffDelete", s:red, "", "") -call s:h("DiffText", s:blue, "", "") - -call s:h("IncSearch", s:bg, s:yellow, "") -call s:h("Search", s:bg, s:yellow, "") - -call s:h("ErrorMsg", s:fg, "", "") -call s:h("ModeMsg", s:fg, "", "") -call s:h("MoreMsg", s:fg, "", "") -call s:h("WarningMsg", s:red, "", "") -call s:h("Question", s:purple, "", "") - -call s:h("Pmenu", s:fg, s:cursor_line, "") -call s:h("PmenuSel", s:bg, s:blue, "") -call s:h("PmenuSbar", "", s:cursor_line, "") -call s:h("PmenuThumb", "", s:comment_fg, "") - -call s:h("SpellBad", s:red, "", "") -call s:h("SpellCap", s:yellow, "", "") -call s:h("SpellLocal", s:yellow, "", "") -call s:h("SpellRare", s:yellow, "", "") - -call s:h("StatusLine", s:blue, s:cursor_line, "") -call s:h("StatusLineNC", s:comment_fg, s:cursor_line, "") -call s:h("TabLine", s:comment_fg, s:cursor_line, "") -call s:h("TabLineFill", s:comment_fg, s:cursor_line, "") -call s:h("TabLineSel", s:fg, s:bg, "") - -call s:h("Visual", "", s:selection, "") -call s:h("VisualNOS", "", s:selection, "") - -call s:h("ColorColumn", "", s:color_col, "") -call s:h("Conceal", s:fg, "", "") -call s:h("Directory", s:blue, "", "") -call s:h("VertSplit", s:vertsplit, s:vertsplit, "") -call s:h("Folded", s:fg, "", "") -call s:h("FoldColumn", s:fg, "", "") -call s:h("SignColumn", s:fg, "", "") - -call s:h("MatchParen", s:blue, "", "underline") -call s:h("SpecialKey", s:fg, "", "") -call s:h("Title", s:green, "", "") -call s:h("WildMenu", s:fg, "", "") -" } - - -" Syntax colors { -" Whitespace is defined in Neovim, not Vim. -" See :help hl-Whitespace and :help hl-SpecialKey -call s:h("Whitespace", s:non_text, "", "") -call s:h("NonText", s:non_text, "", "") -call s:h("Comment", s:comment_fg, "", "italic") -call s:h("Constant", s:cyan, "", "") -call s:h("String", s:green, "", "") -call s:h("Character", s:green, "", "") -call s:h("Number", s:yellow, "", "") -call s:h("Boolean", s:yellow, "", "") -call s:h("Float", s:yellow, "", "") - -call s:h("Identifier", s:red, "", "") -call s:h("Function", s:blue, "", "") -call s:h("Statement", s:purple, "", "") - -call s:h("Conditional", s:purple, "", "") -call s:h("Repeat", s:purple, "", "") -call s:h("Label", s:purple, "", "") -call s:h("Operator", s:fg, "", "") -call s:h("Keyword", s:red, "", "") -call s:h("Exception", s:purple, "", "") - -call s:h("PreProc", s:yellow, "", "") -call s:h("Include", s:purple, "", "") -call s:h("Define", s:purple, "", "") -call s:h("Macro", s:purple, "", "") -call s:h("PreCondit", s:yellow, "", "") - -call s:h("Type", s:yellow, "", "") -call s:h("StorageClass", s:yellow, "", "") -call s:h("Structure", s:yellow, "", "") -call s:h("Typedef", s:yellow, "", "") - -call s:h("Special", s:blue, "", "") -call s:h("SpecialChar", s:fg, "", "") -call s:h("Tag", s:fg, "", "") -call s:h("Delimiter", s:fg, "", "") -call s:h("SpecialComment", s:fg, "", "") -call s:h("Debug", s:fg, "", "") -call s:h("Underlined", s:fg, "", "") -call s:h("Ignore", s:fg, "", "") -call s:h("Error", s:red, s:gutter_bg, "") -call s:h("Todo", s:purple, "", "") -" } - - -" Plugins { -" GitGutter -call s:h("GitGutterAdd", s:green, s:gutter_bg, "") -call s:h("GitGutterDelete", s:red, s:gutter_bg, "") -call s:h("GitGutterChange", s:yellow, s:gutter_bg, "") -call s:h("GitGutterChangeDelete", s:red, s:gutter_bg, "") -" Fugitive -call s:h("diffAdded", s:green, "", "") -call s:h("diffRemoved", s:red, "", "") -" } - - -" Git { -call s:h("gitcommitComment", s:comment_fg, "", "") -call s:h("gitcommitUnmerged", s:red, "", "") -call s:h("gitcommitOnBranch", s:fg, "", "") -call s:h("gitcommitBranch", s:purple, "", "") -call s:h("gitcommitDiscardedType", s:red, "", "") -call s:h("gitcommitSelectedType", s:green, "", "") -call s:h("gitcommitHeader", s:fg, "", "") -call s:h("gitcommitUntrackedFile", s:cyan, "", "") -call s:h("gitcommitDiscardedFile", s:red, "", "") -call s:h("gitcommitSelectedFile", s:green, "", "") -call s:h("gitcommitUnmergedFile", s:yellow, "", "") -call s:h("gitcommitFile", s:fg, "", "") -hi link gitcommitNoBranch gitcommitBranch -hi link gitcommitUntracked gitcommitComment -hi link gitcommitDiscarded gitcommitComment -hi link gitcommitSelected gitcommitComment -hi link gitcommitDiscardedArrow gitcommitDiscardedFile -hi link gitcommitSelectedArrow gitcommitSelectedFile -hi link gitcommitUnmergedArrow gitcommitUnmergedFile -" } - -" Fix colors in neovim terminal buffers { - if has('nvim') - let g:terminal_color_0 = s:black.gui - let g:terminal_color_1 = s:red.gui - let g:terminal_color_2 = s:green.gui - let g:terminal_color_3 = s:yellow.gui - let g:terminal_color_4 = s:blue.gui - let g:terminal_color_5 = s:purple.gui - let g:terminal_color_6 = s:cyan.gui - let g:terminal_color_7 = s:white.gui - let g:terminal_color_8 = s:black.gui - let g:terminal_color_9 = s:red.gui - let g:terminal_color_10 = s:green.gui - let g:terminal_color_11 = s:yellow.gui - let g:terminal_color_12 = s:blue.gui - let g:terminal_color_13 = s:purple.gui - let g:terminal_color_14 = s:cyan.gui - let g:terminal_color_15 = s:white.gui - let g:terminal_color_background = s:bg.gui - let g:terminal_color_foreground = s:fg.gui - endif -" } diff --git a/stow/vim/.vim/source/python b/stow/vim/.vim/source/python deleted file mode 100644 index fc00b9e..0000000 --- a/stow/vim/.vim/source/python +++ /dev/null @@ -1,87 +0,0 @@ -" vimrc file for following the coding standards specified in PEP 7 & 8. -" -" To use this file, source it in your own personal .vimrc file (``source -" <filename>``) or, if you don't have a .vimrc file, you can just symlink to it -" (``ln -s <this file> ~/.vimrc``). All options are protected by autocmds -" (read below for an explanation of the command) so blind sourcing of this file -" is safe and will not affect your settings for non-Python or non-C files. -" -" -" All setting are protected by 'au' ('autocmd') statements. Only files ending -" in .py or .pyw will trigger the Python settings while files ending in *.c or -" *.h will trigger the C settings. This makes the file "safe" in terms of only -" adjusting settings for Python and C files. -" -" Only basic settings needed to enforce the style guidelines are set. -" Some suggested options are listed but commented out at the end of this file. - -" Number of spaces that a pre-existing tab is equal to. -" For the amount of space used for a new tab use shiftwidth. -au BufRead,BufNewFile *py,*pyw,*.c,*.h set tabstop=8 - -" What to use for an indent. -" This will affect Ctrl-T and 'autoindent'. -" Python: 4 spaces -" C: tabs (pre-existing files) or 4 spaces (new files) -au BufRead,BufNewFile *.py,*pyw set shiftwidth=4 -au BufRead,BufNewFile *.py,*.pyw set expandtab -fu Select_c_style() - if search('^\t', 'n', 150) - set shiftwidth=8 - set noexpandtab - el - set shiftwidth=4 - set expandtab - en -endf -au BufRead,BufNewFile *.c,*.h call Select_c_style() -au BufRead,BufNewFile Makefile* set noexpandtab - -" Use the below highlight group when displaying bad whitespace is desired. -highlight BadWhitespace ctermbg=red guibg=red - -" Display tabs at the beginning of a line in Python mode as bad. -au BufRead,BufNewFile *.py,*.pyw match BadWhitespace /^\t\+/ -" Make trailing whitespace be flagged as bad. -au BufRead,BufNewFile *.py,*.pyw,*.c,*.h match BadWhitespace /\s\+$/ - -" Wrap text after a certain number of characters -" Python: 79 -" C: 79 -au BufRead,BufNewFile *.py,*.pyw,*.c,*.h set textwidth=79 - -" Turn off settings in 'formatoptions' relating to comment formatting. -" - c : do not automatically insert the comment leader when wrapping based on -" 'textwidth' -" - o : do not insert the comment leader when using 'o' or 'O' from command mode -" - r : do not insert the comment leader when hitting <Enter> in insert mode -" Python: not needed -" C: prevents insertion of '*' at the beginning of every line in a comment -au BufRead,BufNewFile *.c,*.h set formatoptions-=c formatoptions-=o formatoptions-=r - -" Use UNIX (\n) line endings. -" Only used for new files so as to not force existing files to change their -" line endings. -" Python: yes -" C: yes -au BufNewFile *.py,*.pyw,*.c,*.h set fileformat=unix - - -" ---------------------------------------------------------------------------- -" The following section contains suggested settings. While in no way required -" to meet coding standards, they are helpful. - -" Set the default file encoding to UTF-8: ``set encoding=utf-8`` - -" Puts a marker at the beginning of the file to differentiate between UTF and -" UCS encoding (WARNING: can trick shells into thinking a text file is actually -" a binary file when executing the text file): ``set bomb`` - -" For full syntax highlighting: -"``let python_highlight_all=1`` -"``syntax on`` - -" Automatically indent based on file type: ``filetype indent on`` -" Keep indentation level from previous line: ``set autoindent`` - -" Folding based on indentation: ``set foldmethod=indent`` diff --git a/stow/vim/.vimrc b/stow/vim/.vimrc index 379ddb4..2fa7992 100644 --- a/stow/vim/.vimrc +++ b/stow/vim/.vimrc @@ -2,37 +2,88 @@ " ~/.vimrc " -source ~/.vim/theme.conf -source ~/.vim/source/python - -set autoindent -set conceallevel=2 +filetype on +filetype plugin on +filetype indent on set expandtab -set incsearch -set linebreak -set mouse=a -set nocompatible -set number -set omnifunc=ale#completion#OmniFunc -set path+=** -set relativenumber -set scrolloff=3 -set shiftwidth=4 -set showcmd -set showmatch -set smartindent set smarttab -set tabstop=4 +set smartindent +set incsearch +set showmatch set title set wildignore=*.docx,*.jpg,*.png,*.gif,*.pdf,*.pyc,*.exe,*.flv,*.img,*.xlsx -"" Show suggestions on another line instead of inplace -set wildmenu - syntax enable -filetype on -filetype indent on -filetype plugin on +" -- + +set scrolloff=3 +set showcmd + +set autoindent +set linebreak +set shiftwidth=4 +set tabstop=4 + +set number +set relativenumber + +set conceallevel=2 + +" Add mouse support +set mouse=a +if $TERM == 'alacritty' + set ttymouse=sgr " Alacritty specific +endif + +" PLUGINS --------------------------------------------------------------- {{{ + +call plug#begin('~/.vim/plugged') + +Plug 'dense-analysis/ale' +Plug 'https://github.com/vifm/vifm.vim.git' +Plug 'catppuccin/vim', { 'as': 'catppuccin' } + +call plug#end() + +" }}} + +colorscheme catppuccin_mocha_mod + +" AUTOMATIC STUFF ------------------------------------------------------- {{{ + +if has("autocmd") + + au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif + + " https://stackoverflow.com/a/37558470/19044747 + augroup remember_folds + autocmd! + autocmd BufWinLeave * silent! mkview + autocmd BufWinEnter * silent! loadview + augroup END + +endif + +" }}} + +" TALK ------------------------------------------------------------------ {{{ +" https://youtu.be/XA2WjJbmmoM ---------------------------------------------- + +set nocompatible + +" Finding files using :find <name> +set path+=** +" Also use :b to select files in buffer + +" Show suggestions on another line instead of inplace +set wildmenu + +" Tags +" pacman -S ctags +command! MakeTags !ctags -R . & +" Move to defintion using ^] +" Move to ambigious using g^] +" Move back using ^t " File browsing let g:netrw_browse_split=4 " open in the previous window @@ -45,47 +96,4 @@ let g:netrw_liststyle=3 " treeview " ^p previous " ^x^f filename completion -if $TERM == 'alacritty' - set ttymouse=sgr " Alacritty specific -endif -if $TERM == 'xterm-kitty' - " Fix <HOME> and <END> not working - set term=xterm-256color -endif - -" Automatically start vim in a server - enable colorscheme switching -call remote_startserver("VIM") - -" AUTO ------------------------------------------------------------------ {{{ - -if has("autocmd") - au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif - - " https://stackoverflow.com/a/37558470/19044747 - augroup remember_folds - autocmd! - autocmd BufWinLeave * silent! mkview - autocmd BufWinEnter * silent! loadview - augroup END -endif - " }}} - -" PLUGINS --------------------------------------------------------------- {{{ - -call plug#begin('~/.vim/plugins') - -Plug 'catppuccin/vim', { 'as': 'catppuccin' } -Plug 'dense-analysis/ale' -Plug 'NerdyPepper/statix' -Plug 'prabirshrestha/vim-lsp' -Plug 'sheerun/vim-polyglot' -Plug 'vifm/vifm.vim' - -" Coq -Plug 'whonore/Coqtail' - -call plug#end() - -" }}} - diff --git a/stow/waybar/.config/waybar/config b/stow/waybar/.config/waybar/config new file mode 100644 index 0000000..a8198f5 --- /dev/null +++ b/stow/waybar/.config/waybar/config @@ -0,0 +1,45 @@ +// +// ~/.config/waybar/config +// + +[{ + + "name": "toggle", + + "mode": "hide", + "ipc": true, + + "position": "top", + "height": 25, + "spacing": 4, + "margin": "-25px 0 0 0", // Show this bar on top of the other one, seemingly the "same" one. + + "custom/sep": { + "format": "\uf142" + }, + + "include": [ + // Import modules (!) + "~/.config/waybar/modules.json", +// "~/.config/waybar/default.json" + "~/.config/waybar/left.json" + ], + +}, + +{ + + "name": "keep", + "position": "top", + "height": 25, + "modules-left": ["sway/mode", "custom/browser"], + "modules-center": ["sway/window"], + "modules-right": ["clock"], + + "include": [ + // Import modules (!) + "~/.config/waybar/modules.json" + ], + +}] + diff --git a/stow/waybar/.config/waybar/config.jsonc b/stow/waybar/.config/waybar/config.jsonc deleted file mode 100644 index ff861e3..0000000 --- a/stow/waybar/.config/waybar/config.jsonc +++ /dev/null @@ -1,63 +0,0 @@ -/* * * * * * * * * * * * * * * * * - * * - * ~/.config/waybar/config.jsonc * - * * - * * * * * * * * * * * * * * * * */ - -[ - /* Always visible, contains less information */ - { - "name": "keep", - "position": "top", - "height": 26, - "modules-left": [ - "group/mode" - ], - "modules-center": [ - "clock#center" - ], - "modules-right": [ - "keyboard-state#numlock", - "keyboard-state#capslock", - "privacy" - ], - "include": [ - "~/.config/waybar/modules.json" - ] - }, - - /* Toggle this bar, contains all information */ - { - "name": "toggle", - "mode": "hide", - "ipc": true, - "position": "top", - "height": 26, - /* Show this bar on top of the other one, seemingly replacing it. */ - "margin": "-26px 0 0 0", - "modules-left": [ - "custom/meta", - "sway/window", - "group/workspaces", - "custom/scratchpad-indicator", - "group/mode" - ], - "modules-center": [ - "mpris" - ], - "modules-right": [ - "keyboard-state#numlock", - "keyboard-state#capslock", - "privacy", - "tray", - "group/control-center", - "group/network", - "pulseaudio", - "group/power", - "clock#bar" - ], - "include": [ - "~/.config/waybar/modules.json" - ] - } -] diff --git a/stow/waybar/.config/waybar/default.json b/stow/waybar/.config/waybar/default.json index 5a0a753..d045a28 100644 --- a/stow/waybar/.config/waybar/default.json +++ b/stow/waybar/.config/waybar/default.json @@ -1,12 +1,13 @@ + { - "modules-left": [ + "modules-left": [ "idle_inhibitor", - "mpris" + "custom/media" ], "modules-center": [ "sway/workspaces" ], - "modules-right": [ + "modules-right": [ "disk", "memory", "cpu", diff --git a/stow/waybar/.config/waybar/left.json b/stow/waybar/.config/waybar/left.json index 86b9a00..d8948f0 100644 --- a/stow/waybar/.config/waybar/left.json +++ b/stow/waybar/.config/waybar/left.json @@ -1,16 +1,19 @@ { - "modules-left": [ + "modules-left": [ "sway/workspaces", - "custom/scratchpad-indicator", - "group/system" + "idle_inhibitor", + "custom/media" ], - "modules-right": [ - "tray", - "sway/language", - "bluetooth", - "network", - "pulseaudio", - "group/battery", - "mpris" + "modules-right": [ + "memory", + "cpu", + "temperature", + "custom/sep", + "bluetooth", + "network", + "pulseaudio", + "battery", + "custom/sep", + "tray" ] } diff --git a/stow/waybar/.config/waybar/mediaplayer.py b/stow/waybar/.config/waybar/mediaplayer.py new file mode 100755 index 0000000..d0d8bbb --- /dev/null +++ b/stow/waybar/.config/waybar/mediaplayer.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +# From: +# https://github.com/Alexays/Waybar/blob/master/resources/custom_modules/mediaplayer.py + +import argparse +import logging +import sys +import signal +import gi +import json +gi.require_version('Playerctl', '2.0') +from gi.repository import Playerctl, GLib + +logger = logging.getLogger(__name__) + + +def write_output(text, player): + logger.info('Writing output') + + output = {'text': text, + 'class': 'custom-' + player.props.player_name, + 'alt': player.props.player_name} + + sys.stdout.write(json.dumps(output) + '\n') + sys.stdout.flush() + + +def on_play(player, status, manager): + logger.info('Received new playback status') + on_metadata(player, player.props.metadata, manager) + + +def on_metadata(player, metadata, manager): + logger.info('Received new metadata') + track_info = '' + + if player.props.player_name == 'spotify' and \ + 'mpris:trackid' in metadata.keys() and \ + ':ad:' in player.props.metadata['mpris:trackid']: + track_info = 'AD PLAYING' + elif player.get_artist() != '' and player.get_title() != '': + track_info = '{artist} - {title}'.format(artist=player.get_artist(), + title=player.get_title()) + else: + track_info = player.get_title() + + if player.props.status != 'Playing' and track_info: + track_info = ' ' + track_info + write_output(track_info, player) + + +def on_player_appeared(manager, player, selected_player=None): + if player is not None and (selected_player is None or player.name == selected_player): + init_player(manager, player) + else: + logger.debug("New player appeared, but it's not the selected player, skipping") + + +def on_player_vanished(manager, player): + logger.info('Player has vanished') + sys.stdout.write('\n') + sys.stdout.flush() + + +def init_player(manager, name): + logger.debug('Initialize player: {player}'.format(player=name.name)) + player = Playerctl.Player.new_from_name(name) + player.connect('playback-status', on_play, manager) + player.connect('metadata', on_metadata, manager) + manager.manage_player(player) + on_metadata(player, player.props.metadata, manager) + + +def signal_handler(sig, frame): + logger.debug('Received signal to stop, exiting') + sys.stdout.write('\n') + sys.stdout.flush() + # loop.quit() + sys.exit(0) + + +def parse_arguments(): + parser = argparse.ArgumentParser() + + # Increase verbosity with every occurrence of -v + parser.add_argument('-v', '--verbose', action='count', default=0) + + # Define for which player we're listening + parser.add_argument('--player') + + return parser.parse_args() + + +def main(): + arguments = parse_arguments() + + # Initialize logging + logging.basicConfig(stream=sys.stderr, level=logging.DEBUG, + format='%(name)s %(levelname)s %(message)s') + + # Logging is set by default to WARN and higher. + # With every occurrence of -v it's lowered by one + logger.setLevel(max((3 - arguments.verbose) * 10, 0)) + + # Log the sent command line arguments + logger.debug('Arguments received {}'.format(vars(arguments))) + + manager = Playerctl.PlayerManager() + loop = GLib.MainLoop() + + manager.connect('name-appeared', lambda *args: on_player_appeared(*args, arguments.player)) + manager.connect('player-vanished', on_player_vanished) + + signal.signal(signal.SIGINT, signal_handler) + signal.signal(signal.SIGTERM, signal_handler) + signal.signal(signal.SIGPIPE, signal.SIG_DFL) + + for player in manager.props.player_names: + if arguments.player is not None and arguments.player != player.name: + logger.debug('{player} is not the filtered player, skipping it' + .format(player=player.name) + ) + continue + + init_player(manager, player) + + loop.run() + + +if __name__ == '__main__': + main() diff --git a/stow/waybar/.config/waybar/modern.css b/stow/waybar/.config/waybar/modern.css deleted file mode 100644 index 35ce570..0000000 --- a/stow/waybar/.config/waybar/modern.css +++ /dev/null @@ -1,80 +0,0 @@ -@define-color foreground rgb(202, 202, 202); -@define-color background rgb( 3, 3, 3); - -@define-color highlight-background alpha(@foreground, 0.4); - -@define-color accent #00897b; -@define-color white #ecf0f1; -@define-color warning-red #eb4d4b; - -* { - font-family: letter, "Font Awesome 6 Free", font-awesome, monospace; - font-size: 13px; - font-weight: 600; -} - -window#waybar { - border: none; - color: @white; - - transition-property: background-color; - transition-duration: .5s; -} - -window#waybar.keep { - background-color: @transparent; -} - -window#waybar.toggle { - background-color: alpha(@foreground, 0.4); -} - -tooltip { - background: alpha(@background, 0.8); -} -tooltip label { - color: @white; -} - -#workspaces button { - border: none; - padding: 0 8px; - border-radius: 5px; - animation: ws_normal 20s ease-in-out 1; -} - -#mode, -#workspaces button.focused { - background-color: alpha(@background, 0.2); -} - -#workspaces button:hover { - background-color: alpha(@background, 0.2); -} - -#battery, -#disk, -#bluetooth, -#clock, -#custom-browser, -#custom-scratchpad-indicator, -#custom-system-hibernate, #custom-system-lock, #custom-system-reboot, #custom-system-shutdown, #custom-system-sleep, -#custom-toggle-light-dark, -#custom-toggle-night-light, -#custom-toggle-notifications, -#cpu, -#idle_inhibitor, -#keyboard-state, -#memory, -#mpris, -#network, -#sway-language, -#sway-window, -#power-profiles-daemon, -#privacy, -#pulseaudio, -#temperature, -#tray { - color: @white; -} - diff --git a/stow/waybar/.config/waybar/modules.json b/stow/waybar/.config/waybar/modules.json index 6cec15d..3bd3ba4 100644 --- a/stow/waybar/.config/waybar/modules.json +++ b/stow/waybar/.config/waybar/modules.json @@ -1,402 +1,156 @@ { - "battery": { - "format": "{capacity}% {icon}", - "format-alt": "{time} {icon}", - "format-charging": "{capacity}% \ue55b", /*  */ - "format-plugged": "{capacity}% \ue55c", - "format-icons": [ - "\uf244", /*  */ - "\uf243", /*  */ - "\uf242", /*  */ - "\uf241", /*  */ - "\uf240" /*  */ - ], - "states": { - "warning": 25, - "critical": 12 - } + + "battery": { + "format": "{capacity}% {icon}", + "format-alt": "{time} {icon}", + "format-charging": "{capacity}% \uf0e7 {icon}", + "format-icons": ["\uf244", "\uf243", "\uf242", "\uf241", "\uf240"], + "format-plugged": "{capacity}% \ue55c", + "states": { + "warning": 30, + "critical": 15 + } + }, + + + "disk": { + "interval": 30, + "format": "{percentage_used}% \uf0a0", + "on-click": "alacritty -e ncdu /", + "path": "/", + "tooltip-format": "{used} used out of {total} on {path} ({percentage_free}% or {free} free)" }, + "bluetooth": { - "format-disabled": "\uf294", /*  */ - "format-off": "\uf294", /*  */ - "format-on": "<big>\uf294</big>", /*  */ - "format-connected": "<big>\uf294</big>c", /* c */ + "format-disabled": "<big>\uf294</big>", + "format-off": "\uf294", + "format-on": "<big>\uf294</big>", + "format-connected": "<big>\uf294</big>c", "max-length": 10.3, - "on-click": "bluetoothctl power $( bluetoothctl show | sed -n 's/\\s*Powered: \\(yes\\|no\\)/\\1/p' | sed 's/yes/off/;s/no/on/' )", + "on-click": "alacritty --title 'FZF-Jump' -e ~/.scripts/fzf-jump/standalone.sh ~/.scripts/fzf-jump/modules/bluetooth.sh", "tooltip-format": "{status}", "tooltip-format-on": "{status}, no devices connected", "tooltip-format-connected": "{status} ({num_connections}):\n{device_enumerate}", "tooltip-format-enumerate-connected": "{device_alias} ({device_address})", "tooltip-format-enumerate-connected-battery": "{device_alias}\t{device_address}\t{device_battery_percentage}" }, + - "clock#center": { - "format": "{:%H:%M}", - "format-alt": "{:%a %b %d, %Y, %R}", - "timezone": "Europe/Brussels", - "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", - "calendar": { - "mode": "month", - "week-pos": "left", - "format": { - /* Highlight todays date. */ - "today": "<span background='#ffffff' color='#000000'><b>{}</b></span>" - } + "clock": { + "format": "{:%H:%M}", + "format-alt": "{:%d/%m/%Y %H:%M}", + // "timezone": "Europe/Brussels", + "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>" + }, + + + "custom/browser": { + "format": "\uf120", + "on-click": "alacritty -t 'FZF-Jump' -e ~/.scripts/fzf-jump/launcher.sh", + "tooltip-format": "Launch an application" + }, + + + "custom/media": { + "escape": true, + "exec": "~/.config/waybar/mediaplayer.py 2> /dev/null", + "format": "{icon} {}", + "format-icons": { + "default": "\uf51f", + "spotify": "\uf1bc" }, - "actions": { - "on-click": "mode" - } + "max-length": 40, + "on-click": "playerctl play-pause", + "return-type": "json" }, + - "clock#bar": { - "format": "{:%a %b %d, %R}", - "timezone": "Europe/Brussels", - "tooltip-format": "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>", - "calendar": { - "mode-mon-col": 3, - "on-scroll": 1, - "format": { - /* Highlight today's date. */ - "today": "<span background='#FFFFFF' color='#000000'><b>{}</b></span>" - } - }, - "actions": { - "on-click": "mode" - } - }, + "cpu": { + "format": "{usage}% \uf2db", + "on-click": "alacritty -e htop", + "tooltip": true + }, - "custom/control-center": { - "format": "\uf085", /*  */ - "tooltip": false - }, - "custom/meta": { - "format": "\uf17c", /*  */ - "tooltip": false, - "on-click": "dmenu_run" - }, - - "custom/scratchpad-indicator": { - "interval": 3, - "return-type": "json", - "exec": "swaymsg -t get_tree | jq --unbuffered --compact-output '(recurse(.nodes[]) | select(.name == \"__i3_scratch\") | .focus) as $scratch_ids | [.. | (.nodes? + .floating_nodes?) // empty | .[] | select(.id |IN($scratch_ids[]))] as $scratch_nodes | if ($scratch_nodes|length) > 0 then { text: \"\\($scratch_nodes | length)\", tooltip: $scratch_nodes | map(\"\\(.app_id // .window_properties.class) (\\(.id)): \\(.name)\") | join(\"\\n\") } else empty end'", - "format": "\uf2d2 {}", - "on-click": "exec swaymsg 'scratchpad show'", - "on-click-right": "exec swaymsg 'move scratchpad'" - }, - - "custom/system-lock": { - "format": "\uf09c", /*  */ - "tooltip": true, - "tooltip-format": "Lock device", - "on-click": "swaylock --daemonize" - }, - - "custom/system-sleep": { - "format": "\uf186", /*  */ - "tooltip": true, - "tooltip-format": "Put device to sleep", - "on-click": "swaylock --daemonize; systemctl suspend" - }, - - "custom/system-hibernate": { - "format": "\uf2dc", /*  */ - "tooltip": true, - "tooltip-format": "Hibernate device", - "on-click": "swaylock --daemonize; systemctl hibernate" - }, - - "custom/system-reboot": { - "format": "\uf0e2", /*  */ - "tooltip": true, - "tooltip-format": "Reboot device", - "on-click": "systemctl reboot" - }, - - "custom/system-shutdown": { - "format": "\uf011", /*  */ - "tooltip": true, - "tooltip-format": "Shutdown device", - "on-click": "systemctl poweroff -i" - }, - - "custom/toggle-light-dark": { - "exec": "bash ${SCRIPT_DIR}/toggle-light-dark.sh -g", - "interval": 60, - "return-type": "json", - "on-click": "bash ${SCRIPT_DIR}/toggle-light-dark.sh", + "idle_inhibitor": { "format": "{icon}", - "format-icons": { - "default": "\uf185", - "prefer-dark": "\uf005" - }, - "tooltip": true - }, + "format-icons": { + "activated": "\uf06e", + "deactivated": "\uf070" + }, + "tooltip": false + }, - "custom/toggle-notifications": { - "exec": "bash ${SCRIPT_DIR}/toggle-notifications.sh -g", - "interval": 60, - "return-type": "json", - "on-click": "bash ${SCRIPT_DIR}/toggle-notifications.sh", - "format": "{icon}", - "format-icons": { - "normal": "\uf0f3", /*  */ - "paused": "\uf1f6" /*  */ - }, - "tooltip": true - }, - "custom/toggle-tailscale": { - "exec": "bash ${SCRIPT_DIR}/toggle-tailscale.sh -g", - "interval": 60, - "return-type": "json", - "on-click": "bash ${SCRIPT_DIR}/toggle-tailscale.sh", - "format": "{icon}", - "format-icons": { - "disconnected": "\ue50b", - "connected": "\ue509", - }, - "tooltip": true - }, + "memory": { + "format": "{}% \uf1c0", + "on-click": "alacritty -e htop" + }, - "group/control-center": { - "orientation": "inherit", - "modules": [ - "custom/control-center", - "group/language", - /* "hyprland/language", "sway/language", */ - "custom/toggle-notifications", - "custom/toggle-light-dark", - "bluetooth" - ], - "drawer": { - "transition-duration": 500, - "transition-left-to-right": false, - "children-class": "drawer-child" - } - }, - - "group/language": { - "orientation": "inherit", - "modules": [ - "hyprland/language", - "sway/language" - ] - }, - - "group/mode": { - "orientation": "inherit", - "modules": [ - "hyprland/submap", - "sway/mode" - ] - }, - - "group/network": { - "orientation": "inherit", - "modules": [ - /* Preview */ - "network", - /* Most-left */ - "custom/toggle-tailscale" - /* Most-right */ - ], - "drawer": { - "transition-duration": 500, - "transition-left-to-right": false, - "children-class": "drawer-child" - } - }, - - "group/power": { - "orientation": "inherit", - "modules": [ - /* Preview */ - "battery", - /* Most-left */ - "custom/system-shutdown", - "custom/system-reboot", - "custom/system-hibernate", - "custom/system-sleep", - "custom/system-lock", - "power-profiles-daemon", - "idle_inhibitor" - /* Most-right */ - ], - "drawer": { - "transition-duration": 500, - "transition-left-to-right": false, - "children-class": "drawer-child" - } - }, - - "group/workspaces": { - "orientation": "inherit", - "modules": [ - "hyprland/workspaces", - "sway/workspaces" - ] - }, - - "hyprland/language": { - "format": "\uf11c", - "on-click": "hyprctl switchxkblayout at-translated-set-2-keyboard next && notify-send \"$(hyprctl devices -j | jq -r '.keyboards[] | select(.name == \"at-translated-set-2-keyboard\") | .active_keymap')\" --app-name 'waybar'", - "tooltip": true, - "tooltip-format": "Switch keyboard layouts", - "keyboard-name": "at-translated-set-2-keyboard" - }, - - "hyprland/workspaces": { - "all-outputs": false, - "disable-scroll": true, - "format": "{icon}{name}", - "format-icons": { - "default": "", - "urgent": "\uf071 " /*  */ - } - }, - - "idle_inhibitor": { - "format": "{icon}", - "format-icons": { - "activated": "\uf06e", /*  */ - "deactivated": "\uf070" /*  */ - }, - "tooltip": false - }, - - "keyboard-state#capslock": { - "capslock": true, - "format": { - "capslock": "{icon}" - }, - "format-icons": { - "locked": "\uf11c", /*  */ - "unlocked": "" - } - }, - - "keyboard-state#numlock": { - "numlock": true, - "format": { - "numlock": "{icon}" - }, - "format-icons": { - "locked": "\uf1ec", /*  */ - "unlocked": "" - } - }, - - "mpris": { - "format": "{player_icon} {dynamic}", - "format-paused": "{status_icon} <i>{dynamic}</i>", - "tooltip-format": "{player} ({status}) {title} - {artist} - {album}", - "player-icons": { - "default": "\uf8d9", /*  */ - "mpv": "\uf144", /*  */ - "spotify": "\uf1bc" /*  */ - }, - "status-icons": { - "paused": "\uf04c" /*  */ - }, - "dynamic-order": [ - "title", - "artist" - ], - "dynamic-len": 40 - }, "network": { - "format-disconnected": "\uf127", /*  */ - "format-ethernet": "\uf6ff", /*  */ - "format-linked": "\uf0c1", /*  */ - "format-wifi": "{icon}", + "format-disconnected": "\uf127", + "format-ethernet": "\uf6ff {ifname}: {ipadds}/{cidr}", + "format-wifi": "\uf1eb", "interval": 5, - "tooltip": true, + "on-click-right": "alacritty -e nmtui", "tooltip-format": "{ifname}: {ipaddr}", "tooltip-format-disconnected": "Disconnected", - "tooltip-format-wifi": "{essid} ({signalStrength}%)\n{ifname}: {ipaddr}", - "format-icons": [ - "\uf05e", /*  */ - "\uf1eb", /*  */ - "\uf1eb" /*  */ - ] + "tooltip-format-wifi": "{essid} ({signalStrength}%)\n{ifname}: {ipaddr}" }, - "power-profiles-daemon": { - "format": "{icon}", - "format-icons": { - "default": "\uf110", /*  */ - "performance": "\uf135", /*  */ - "balanced": "\uf24e", /*  */ - "power-saver": "\uf06c" /*  */ - }, - "tooltip": true, - "tooltip-format": "Profile: {profile}\nDriver: {driver}" - }, - - "privacy": { - "transition-duration": 250, - "icon-size": 16, - "modules": [ - { - "type": "screenshare", - "tooltip": true - }, - { - "type": "audio-in", - "tooltip": true - } - ] - }, - - "pulseaudio": { - "format": "{volume}% {icon}", - "format-headset": "{volume}% \uf58f", /*  */ - "format-muted": "\uf6a9", /*  */ - "format-icons": [ - "\uf026", /*  */ - "\uf027", /*  */ - "\uf028" /*  */ - ], - "scroll-step": 2.0, - "on-click": "wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle" - }, - - "sway/language": { - "format": "{short}", - "on-click": "swaymsg input type:keyboard xkb_switch_layout next", - "tooltip": true, - "tooltip-format": "Switch keyboard layouts" - }, "sway/window": { - "format": "{title}", - "max-length": 20, - "tooltip": true, - "all-outputs": true, - "icon": false, - "icon-size": 18, - "rewrite": { - ".* - (.*)": "$1", - ".* — (.*)": "$1" - } + "max-length": 85 }, + "sway/workspaces": { "all-outputs": false, "disable-scroll": true, - "format": "{icon}{name}", + "format": "{icon}{name}", "format-icons": { - "default": "", - "urgent": "\uf071 " /*  */ - } - }, + "default": "", // Prevent showing workspace name literal. + "urgent": "\uf071 " + }, + // "persistent_workspaces": { + // "0:¯\\_(ツ)_/¯": [] + // } + }, + + + "pulseaudio": { + "format": "{volume}% {icon}{format_source}", + "format-bluetooth": "{volume}% {icon}\uf294{format_source}", + "format-bluetooth-muted": "\uf6a9 {icon}\uf294{format_source}", + "format-muted": "\uf6a9{format_source}", + "format-source": " {volume}% \uf130", + "format-source-muted": "", + "format-icons": { + "headphone": "\uf58f", + "hands-free": "\uf590", + "headset": "\uf590", + "phone": "\uf3ce", + "portable": "\uf3ce", + "car": "\uf1b9", + "default": ["\uf026", "\uf027", "\uf028 "] + }, + "on-click": "pamixer --toggle-mute", + "on-click-right": "pavucontrol", + "scroll-step": 2 + }, + + + "temperature": { + "critical-threshold": 70, + "format": "{temperatureC}°C {icon}", + "format-icons": ["\uf2cb", "\uf2c9", "\uf2c7"] + }, + + + "tray": { + "spacing": 10 + } - "tray": { - "icon-size": 16, - "show-passive-items": true, - "spacing": 10 - } } diff --git a/stow/waybar/.config/waybar/style-dark.css b/stow/waybar/.config/waybar/style-dark.css deleted file mode 100644 index d99a2e8..0000000 --- a/stow/waybar/.config/waybar/style-dark.css +++ /dev/null @@ -1,14 +0,0 @@ -@import 'style.css'; - -* { - color: #C2C2C2; -} - -window#waybar { - background-color: #171717; -} - -window#waybar button.focused { - background-color: #C2C2C2; -} - diff --git a/stow/waybar/.config/waybar/style-light.css b/stow/waybar/.config/waybar/style-light.css deleted file mode 100644 index a0bf37e..0000000 --- a/stow/waybar/.config/waybar/style-light.css +++ /dev/null @@ -1,14 +0,0 @@ -@import 'style.css'; - -* { - color: #171717; -} - -window#waybar { - background-color: #C2C2C2; -} - -window#waybar button.focused { - background-color: #171717; -} - diff --git a/stow/waybar/.config/waybar/style.css b/stow/waybar/.config/waybar/style.css index ecc08fc..499b543 100644 --- a/stow/waybar/.config/waybar/style.css +++ b/stow/waybar/.config/waybar/style.css @@ -1,118 +1,132 @@ -/* * * * * * * * * * * * * * * * - * * - * ~/.config/waybar/style.css * - * * - * * * * * * * * * * * * * * * */ +/* + * ~/.config/waybar/style.css + * + * `otf-font-awesome` is required to be installed for icons. + * + * Pick your stylesheet: + * - sharp.css + * - transparent.css + * - round.css + */ -@define-color background #C2C2C2; -@define-color foreground #171717; - -/* Pantone / PMS 18-1559 TCX / Red Alert */ -@define-color warning rgb(208, 52, 44); -/* Safety orange */ -@define-color safety rgb(255, 103, 0); - -* { - padding: 0 4px; -} +@define-color transparent-black rgba(23, 23, 23, 0.9); +@define-color white #ecf0f1; +@define-color warning-red #eb4d4b; +@define-color accent #00897b; window#waybar { - /* background: linear-gradient(90deg, #CECECE 0%, #D1D1D1 10%, #C9C9C9 50%, #BBBBBB 90%, #BABABA 100%); */ - - font-family: letter, "Font Awesome 6 Free", font-awesome, monospace; + font-family: Letter; /* This is my personal font. */ font-size: 13px; - font-weight: 600; + transition-property: background-color; + transition-duration: .5s; } -.modules-right, -.modules-right > widget:last-child { - padding-right: 0; +#window, #workspaces { + margin: 0 5px; +} + +#workspaces button { + border: none; + border-radius: 0; + min-width: 30px; + padding: 0 5px; +} + +#workspaces button:hover, +#workspaces button.focused { + background-color: transparent; + color: @white; +} + +#workspaces button.urgent { + color: @white; + background-color: @warning-red; +} + +/* All modules individually. */ +#backlight, #battery, #bluetooth, #clock, #cpu, +#custom-browser, #custom-media, #disk, #idle_inhibitor, +#memory, #mode, #mpd, #network, #pulseaudio, +#temperature, #tray { + padding: 0 5px; +} + +/* If workspaces is the leftmost module, omit left margin */ +.modules-left > widget:first-child > #workspaces { + margin-left: 0; +} + +/* If workspaces is the rightmost module, omit right margin */ +.modules-right > widget:last-child > #workspaces { margin-right: 0; } -#battery.charging { +@keyframes blink { + to { + background-color: #ffffff; + color: #000000; + } +} + +label:focus { + background-color: #000000; +} + +/* Module specific colours */ + +#battery.charging, #battery.plugged { + color: #ffffff; background-color: #26A65B; - color: #FFFFFF; } #battery.critical:not(.charging) { - background-color: @warning; - color: #FFFFFF; + background-color: #f53c3c; + color: #ffffff; animation-name: blink; animation-duration: 0.5s; - animation-timing-function: steps(12); - animation-iteration-count: infinite; - animation-direction: alternate; -} - -#battery.plugged { - animation-name: blink; - animation-duration: 1.0s; - animation-timing-function: steps(12); + animation-timing-function: linear; animation-iteration-count: infinite; animation-direction: alternate; } #bluetooth.disabled, -#bluetooth.off { - opacity: 0.6; -} - -#custom-toggle-tailscale.disconnected { - opacity: 0.6; -} - -#mpris.Feishin { - background: linear-gradient(45deg, rgba(170,92,195,1) 100%, rgba(0,164,220,1) 0%); -} - -#mpris.spotify { - background-color: #66cc99; - color: #2a5c45; -} - -#mpris.vlc { - background-color: #ffa000; -} - -#network.disconnected { - opacity: 0.6; -} - -#privacy, -#privacy-item, -#privacy-item.screenshare, -#privacy-item.audio-in { - background-color: @safety; -} - -#privacy-item.screenshare { - background-color: #000000; -} - +#bluetooth.off, +#network.disconnected, #pulseaudio.muted { opacity: 0.6; } -#systemd-failed-units.degraded { - background-color: @warning; +#custom-media { + color: #2a5c45; + background-color: #66cc99; + min-width: 100px; +} + +#custom-media.custom-spotify { + background-color: #66cc99; +} + +#custom-media.custom-vlc { + background-color: #ffa000; } #temperature.critical { - background-color: @warning; + background-color: #eb4d4b; } -#tray > .needs-attention { - -gtk-icon-effect: highlight; - background-color: @warning; +#idle_inhibitor.activated { + background-color: #ecf0f1; + color: #2d3436; } #tray > .passive { -gtk-icon-effect: dim; } -#workspaces button.urgent { - background-color: @warning; - color: white; +#tray > .needs-attention { + -gtk-icon-effect: highlight; + background-color: #eb4d4b; } +@import "sharp.css"; + diff --git a/stow/zsh/.oh-my-zsh/themes/tdpeuter.zsh-theme b/stow/zsh/.oh-my-zsh/themes/mrfortem.zsh-theme similarity index 91% rename from stow/zsh/.oh-my-zsh/themes/tdpeuter.zsh-theme rename to stow/zsh/.oh-my-zsh/themes/mrfortem.zsh-theme index b3638be..53ba179 100644 --- a/stow/zsh/.oh-my-zsh/themes/tdpeuter.zsh-theme +++ b/stow/zsh/.oh-my-zsh/themes/mrfortem.zsh-theme @@ -1,5 +1,5 @@ # -# ~/.oh-my-zsh/themes/tdpeuter.zsh-theme +# ~/.oh-my-zsh/themes/mrfortem.zsh-theme # Stolen from gentoo-theme and gianni # @@ -10,7 +10,7 @@ zstyle ':vcs_info:*' check-for-changes true zstyle ':vcs_info:*' unstagedstr '%F{red}*' # display this when there are unstaged changes zstyle ':vcs_info:*' stagedstr '%F{yellow}+' # display this when there are staged changes zstyle ':vcs_info:*' actionformats '%F{5}(%F{2}%b%F{3}|%F{1}%a%c%u%m%F{5})%f ' -zstyle ':vcs_info:*' formats "%f(%F{cyan} %b%c%u%m%f)%f " +zstyle ':vcs_info:*' formats "%F{white}(%F{cyan} %b%c%u%m%F{white})%f " zstyle ':vcs_info:svn:*' branchformat '%b' zstyle ':vcs_info:svn:*' actionformats '%F{5}(%F{2}%b%F{1}:%{3}%i%F{3}|%F{1}%a%c%u%m%F{5})%f ' zstyle ':vcs_info:svn:*' formats '%F{5}(%F{2}%b%F{1}:%F{3}%i%c%u%m%F{5})%f ' @@ -35,7 +35,7 @@ add-zsh-hook precmd loadgit # Backup line(s) # PROMPT='%(!.%B%F{red}.%B%F{green}%n@)%m %F{blue}%(!.%1~.%~) ${vcs_info_msg_0_}%F{blue}%(!.#.$)%k%b%f ' # PROMPT='%(!.%B%F{red}.%B%F{green}%n@)%m %{$reset_color%}%F{cyan}%c %B${vcs_info_msg_0_}%F{green}%(!.#.$)%k%b%f ' -PROMPT='%(!.%B%F{red}%m .)%{$reset_color%}%F{cyan}%c %B${vcs_info_msg_0_}%(?.%F{green}%(!.#.$).%F{red}%?)%k%b%f ' +PROMPT='%(!.%B%F{red}%m .)%{$reset_color%}%F{cyan}%c %B${vcs_info_msg_0_}%F{green}%(!.#.$)%k%b%f ' # PROMPT='%{$fg_bold[green]%}[%n@%m%{$reset_color%} %{$fg[cyan]%}%c%{$reset_color%}$(git_prompt_info)%{$fg_bold[green]%}]%{$reset_color%}$ ' diff --git a/stow/zsh/.zshrc b/stow/zsh/.zshrc deleted file mode 100644 index 155caec..0000000 --- a/stow/zsh/.zshrc +++ /dev/null @@ -1,74 +0,0 @@ -typeset -U path cdpath fpath manpath - -path+="$HOME/.zsh/plugins/cmdtime" -fpath+="$HOME/.zsh/plugins/cmdtime" - -plugins=(dirhistory git screen) -ZSH_CUSTOM="$HOME/.oh-my-zsh" -ZSH_THEME="tdpeuter" -# Disable automatically updating -zstyle ':omz:update' mode disabled -source $ZSH_CUSTOM/oh-my-zsh.sh - -if [[ -f "$HOME/.zsh/plugins/cmdtime/cmdtime.plugin.zsh" ]]; then - source "$HOME/.zsh/plugins/cmdtime/cmdtime.plugin.zsh" -fi -if [[ -f "$HOME/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" ]]; then - source "$HOME/.zsh/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh" -fi - -if [[ -f "$HOME/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" ]]; then - source "$HOME/.zsh/plugins/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh" -fi - -# History options should be set in .zshrc and after oh-my-zsh sourcing. -# See https://github.com/nix-community/home-manager/issues/177. -HISTSIZE="10000" -SAVEHIST="10000" - -HISTFILE="$HOME/.zsh_history" -mkdir -p "$(dirname "$HISTFILE")" - -setopt HIST_FCNTL_LOCK -setopt HIST_IGNORE_DUPS -setopt HIST_IGNORE_SPACE -setopt HIST_EXPIRE_DUPS_FIRST -setopt SHARE_HISTORY -setopt EXTENDED_HISTORY - -# Add direnv -if [ -x "$(command -v direnv)" ]; then - eval "$(direnv hook zsh)" -fi - -# Add fzf -if [ -x "$(command -v fzf-share)" ]; then - source "$(fzf-share)/key-bindings.zsh" - source "$(fzf-share)/completion.zsh" -fi - -# Aliases -alias cp='cp -i' -alias df='df -h' -alias free='free -m' -alias gs='git status --short' -alias hgrep='history | grep' -alias ll='ls -la' -alias mkdir='mkdir -pv' -alias more='less' -alias mv='mv -i' -alias np='nano -w PKGBUILD' -alias rm='rm -I --preserve-root' -alias zip='zip -r' -alias update='pushd ~/projects/sisyphus/nixos -nix flake update -sudo nixos-rebuild switch --flake .# --show-trace -popd -' - -# -- Barrier -- - -for profile in ${(z)NIX_PROFILES}; do - fpath+=($profile/share/zsh/site-functions $profile/share/zsh/$ZSH_VERSION/functions $profile/share/zsh/vendor-completions) -done -