commit 83b02bd753660194bbbe52f07a52470ff2db5ba1 Author: Cian Hughes Date: Wed Nov 6 23:33:20 2024 +0000 Parsed off from home manager config diff --git a/.bashrc b/.bashrc new file mode 100644 index 0000000..f8d360f --- /dev/null +++ b/.bashrc @@ -0,0 +1,224 @@ +# +# ~/.bashrc +# + +[[ $- != *i* ]] + +colors() { + local fgc bgc vals seq0 + + printf "Color escapes are %s\n" '\e[${value};...;${value}m' + printf "Values 30..37 are \e[33mforeground colors\e[m\n" + printf "Values 40..47 are \e[43mbackground colors\e[m\n" + printf "Value 1 gives a \e[1mbold-faced look\e[m\n\n" + + # foreground colors + for fgc in {30..37}; do + # background colors + for bgc in {40..47}; do + fgc=${fgc#37} # white + bgc=${bgc#40} # black + + vals="${fgc:+$fgc;}${bgc}" + vals=${vals%%;} + + seq0="${vals:+\e[${vals}m}" + printf " %-9s" "${seq0:-(default)}" + printf " ${seq0}TEXT\e[m" + printf " \e[${vals:+${vals+$vals;}}1mBOLD\e[m" + done + echo; echo + done +} + +[ -r /usr/share/bash-completion/bash_completion ] && . /usr/share/bash-completion/bash_completion + +# Change the window title of X terminals +case ${TERM} in + xterm*|rxvt*|Eterm*|aterm|kterm|gnome*|interix|konsole*) + PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\007"' + ;; + screen*) + PROMPT_COMMAND='echo -ne "\033_${USER}@${HOSTNAME%%.*}:${PWD/#$HOME/\~}\033\\"' + ;; +esac + +use_color=true + +# Set colorful PS1 only on colorful terminals. +# dircolors --print-database uses its own built-in database +# instead of using /etc/DIR_COLORS. Try to use the external file +# first to take advantage of user additions. Use internal bash +# globbing instead of external grep binary. +safe_term=${TERM//[^[:alnum:]]/?} # sanitize TERM +match_lhs="" +[[ -f ~/.dir_colors ]] && match_lhs="${match_lhs}$(<~/.dir_colors)" +[[ -f /etc/DIR_COLORS ]] && match_lhs="${match_lhs}$(/dev/null \ + && match_lhs=$(dircolors --print-database) +[[ $'\n'${match_lhs} == *$'\n'"TERM "${safe_term}* ]] && use_color=true + +if ${use_color} ; then + # Enable colors for ls, etc. Prefer ~/.dir_colors #64489 + if type -P dircolors >/dev/null ; then + if [[ -f ~/.dir_colors ]] ; then + eval "$(dircolors -b ~/.dir_colors)" + elif [[ -f /etc/DIR_COLORS ]] ; then + eval "$(dircolors -b /etc/DIR_COLORS)" + fi + fi + + # code for handling prompt feedback about error or success + PROMPT_COMMAND='if [ $? = 0 ]; then DOLLAR_COLOR="\033[32m"; else DOLLAR_COLOR="\033[31m"; fi' + + if [[ ${EUID} == 0 ]] ; then + PS1='\[\033[01;35m\]\u@\h\[\033[01;37m\] \W\[\033[01;32m\] \[$(echo -ne $DOLLAR_COLOR)\]$\[\033[00m\] ' + else + PS1='\[\033[01;34m\]\u@\h\[\033[01;37m\] \W\[\033[01;32m\] \[$(echo -ne $DOLLAR_COLOR)\]$\[\033[00m\] ' # normal prompt + fi + + alias ls='ls --color=auto' + alias grep='grep --colour=auto' + alias egrep='egrep --colour=auto' + alias fgrep='fgrep --colour=auto' +else + if [[ ${EUID} == 0 ]] ; then + # show root@ when we don't have colors + PS1='\u@\h \W \$ ' + else + PS1='\u@\h \w \$ ' + fi +fi + +unset use_color safe_term match_lhs sh + +alias cp="cp -i" # confirm before overwriting something +alias df='df -h' # human-readable sizes +alias free='free -m' # show sizes in MB +alias np='nano -w PKGBUILD' +alias more=less + +xhost +local:root > /dev/null 2>&1 + +complete -cf sudo + +# Bash won't get SIGWINCH if another process is in the foreground. +# Enable checkwinsize so that bash will check the terminal size when +# it regains control. #65623 +# http://cnswww.cns.cwru.edu/~chet/bash/FAQ (E11) +shopt -s checkwinsize + +shopt -s expand_aliases + +# export QT_SELECT=4 + +# Enable history appending instead of overwriting. #139609 +shopt -s histappend + +# +# # ex - archive extractor +# # usage: ex +ex () +{ + if [ -f $1 ] ; then + case $1 in + *.tar.bz2) tar xjf "$1" ;; + *.tar.gz) tar xzf "$1" ;; + *.bz2) bunzip2 "$1" ;; + *.rar) unrar x "$1" ;; + *.gz) gunzip "$1" ;; + *.tar) tar xf "$1" ;; + *.tbz2) tar xjf "$1" ;; + *.tgz) tar xzf "$1" ;; + *.zip) unzip "$1" ;; + *.Z) uncompress "$1" ;; + *.7z) 7z x "$1" ;; + *) echo "'$1' cannot be extracted via ex()" ;; + esac + else + echo "'$1' is not a valid file" + fi +} + +# better yaourt colors (or other AUR helper) +export YAOURT_COLORS="nb=1:pkg=1:ver=1;32:lver=1;45:installed=1;42:grp=1;34:od=1;41;5:votes=1;44:dsc=0:other=1;35" + +# custom aliases +alias q="exit" +alias c="clear" +alias h="history" +alias cs="clear;ls" +alias p="cat" +alias pd="pwd" +alias lsa="ls -a" +alias lsl="ls -l" +alias pd="pwd" +alias t="time" +alias k="kill" +alias null="/dev/null" +alias ..="cd .." +alias ...="cd ../.." +alias ....="cd ../../.." +alias .....="cd ../../../.." +alias ......="cd ../../../../.." +# alias for upgrade of all pip packages +alias pip-upgrade="pip freeze --user | cut -d'=' -f1 | xargs -n1 pip install -U" + +# Aliases for conditionally present packages +# alias for using the "thefuck" command +if (hash thefuck &> /dev/null) +then + eval "$(thefuck --alias)" +fi + +if (hash pypy3 &> /dev/null) && (! hash pypy &> /dev/null) +then + alias pypy="pypy3" +fi + +if (hash paru &> /dev/null) && (! hash yay &> /dev/null) +then + alias yay="paru" +fi + +# to finish, if fastfetch, neofetch or screenfetch is present, call it (preferring fastfetch) +if (hash neofetch &> /dev/null) +then + fastfetch +elif (hash neofetch &> /dev/null) +then + neofetch +elif (hash screenfetch &> /dev/null) +then + screenfetch +fi + +# bashrc session path variables +export PATH="$HOME/.local/bin:$PATH" +export PATH="$HOME/.cargo/bin:$PATH" +export PATH="$HOME/.poetry/bin:$PATH" + +# Compiler/interpreter variables +export MAKEFLAGS="-j$(nproc)" +export JULIA_NUM_THREADS=12 + +# >>> conda initialize >>> +# !! Contents within this block are managed by 'conda init' !! +__conda_setup="$('$HOME/anaconda3/bin/conda' 'shell.bash' 'hook' 2> /dev/null)" +if [ $? -eq 0 ]; then + eval "$__conda_setup" +else + if [ -f "$HOME/anaconda3/etc/profile.d/conda.sh" ]; then + . "$HOME/anaconda3/etc/profile.d/conda.sh" + else + export PATH="$HOME/anaconda3/bin:$PATH" + fi +fi +unset __conda_setup +# <<< conda initialize <<< + +if [ -d "$HOME/.bash_completions/openapi-python-client.sh" ] +then + source "$HOME/.bash_completions/openapi-python-client.sh" +fi diff --git a/.config/.rye/config.toml b/.config/.rye/config.toml new file mode 100644 index 0000000..f909e94 --- /dev/null +++ b/.config/.rye/config.toml @@ -0,0 +1,6 @@ +[behavior] +use-uv = true +global-python = true + +[default] +toolchain = "cpython@3.12" diff --git a/.config/Thunar/uca.xml b/.config/Thunar/uca.xml new file mode 100644 index 0000000..97a01d5 --- /dev/null +++ b/.config/Thunar/uca.xml @@ -0,0 +1,38 @@ + + + + utilities-terminal + Open Terminal Here + + 1723548740136882-1 + kitty -d %f + Open terminal in current directory + + * + + + + + text-x-script + Open Neovim Here + + 1723551422453301-1 + kitty -d %f nvim + Start an instance of neovim running in this directory + * + * + + + + text-x-script + Open in Neovim + + 1723551959204741-2 + kitty -d %D nvim %f + Open the selected file in Neovim + * + * + + + + diff --git a/.config/bat/themes/tokyonight_night.tmTheme b/.config/bat/themes/tokyonight_night.tmTheme new file mode 100644 index 0000000..8b77fd8 --- /dev/null +++ b/.config/bat/themes/tokyonight_night.tmTheme @@ -0,0 +1,1338 @@ + + + + author + Folke Lemaitre (http://github.com/folke) + colorSpaceName + sRGB + name + TokyoNight + semanticClass + enki.theme.tokyo + settings + + + settings + + activeGuide + #363b54 + background + #1a1b26 + caret + #DBC08A + findHighlight + #ffa300 + findHighlightForeground + #000000 + foreground + #c0caf5 + guide + #4f4f5e40 + gutterForeground + #3b415caa + inactiveSelection + #282833 + invisibles + #4f4f5e + lineHighlight + #00000030 + selection + #9D599D40 + selectionBorder + #9D599D + shadow + #00000010 + stackGuide + #4f4f5e60 + tagsOptions + underline + + + + name + Italics - Comments, Storage, Keyword Flow, Vue attributes, Decorators + scope + comment, meta.var.expr storage.type, keyword.control.flow, meta.directive.vue punctuation.separator.key-value.html, meta.directive.vue entity.other.attribute-name.html, tag.decorator.js entity.name.tag.js, tag.decorator.js punctuation.definition.tag.js, storage.modifier + settings + + fontStyle + italic + + + + name + Comment + scope + comment, comment.block.documentation, punctuation.definition.comment + settings + + foreground + #565f89 + + + + name + Comment Doc + scope + comment.block.documentation variable, comment.block.documentation storage, comment.block.documentation punctuation, comment.block.documentation keyword, comment.block.documentation support, comment.block.documentation markup, comment.block.documentation markup.inline.raw.string.markdown, keyword.other.phpdoc.php + settings + + foreground + #565f89 + + + + name + Number, Boolean, Undefined, Null + scope + variable.other.constant, punctuation.definition.constant, constant.language, constant.numeric, support.constant + settings + + foreground + #ff9e64 + + + + name + String, Symbols, Markup Heading + scope + meta.property.lua,string.unquoted.key.lua,support.other.metaproperty.lua,support.other.metaproperty.lua,constant.other.symbol, constant.other.key, markup.heading, meta.attribute-selector + settings + + fontStyle + + foreground + #73daca + + + + name + String + scope + string + settings + + fontStyle + + foreground + #9ece6a + + + + name + Colors + scope + constant.other.color, constant.other.color.rgb-value.hex punctuation.definition.constant + settings + + foreground + #9aa5ce + + + + name + Invalid + scope + invalid, invalid.illegal + settings + + foreground + #f7768e + + + + name + Invalid deprecated + scope + invalid.deprecated + settings + + foreground + #bb9af7 + + + + name + Storage Type + scope + storage.type + settings + + foreground + #bb9af7 + + + + name + Storage - modifier, var, const, let + scope + meta.var.expr storage.type, storage.modifier + settings + + foreground + #9d7cd8 + + + + name + Interpolation + scope + punctuation.definition.template-expression, punctuation.section.embedded + settings + + foreground + #7dcfff + + + + name + Spread + scope + keyword.operator.spread, keyword.operator.rest + settings + + fontStyle + bold + foreground + #f7768e + + + + name + Operator, Misc + scope + keyword.operator, keyword.control.as, keyword.other, keyword.operator.bitwise.shift, punctuation, punctuation.definition.constant.markdown, punctuation.definition.string, punctuation.support.type.property-name, text.html.vue-html meta.tag, punctuation.definition.keyword, punctuation.terminator.rule, punctuation.definition.entity, punctuation.definition.tag, punctuation.separator.inheritance.php, punctuation.definition.tag.html, keyword.other.template, keyword.other.substitution, entity.name.operator, text.html.vue meta.tag.block.any.html, text.html.vue meta.tag.inline.any.html, text.html.vue meta.tag.other.html, text.html.twig meta.tag.inline.any.html, text.html.twig meta.tag.block.any.html, text.html.twig meta.tag.structure.any.html, text.html.twig meta.tag.any.html + settings + + foreground + #89ddff + + + + name + Import, Export, From, Default + scope + keyword.control.import, keyword.control.export, keyword.control.from, keyword.control.default, meta.import keyword.other + settings + + foreground + #7dcfff + + + + name + Keyword + scope + keyword, keyword.control, keyword.other.important + settings + + foreground + #bb9af7 + + + + name + Keyword SQL + scope + keyword.other.DML + settings + + foreground + #7dcfff + + + + name + Keyword Operator Logical, Arrow, Ternary, Comparison + scope + keyword.operator.logical, storage.type.function, keyword.operator.bitwise, keyword.operator.ternary, keyword.operator.comparison, keyword.operator.relational, keyword.operator.or.regexp + settings + + foreground + #bb9af7 + + + + name + Tag + scope + entity.name.tag, entity.name.tag support.class.component, meta.tag + settings + + foreground + #f7768e + + + + name + Tag Punctuation + scope + punctuation.definition.tag, punctuation.definition.tag.html, punctuation.definition.tag.begin.html, punctuation.definition.tag.end.html + settings + + foreground + #ba3c97 + + + + name + Blade + scope + keyword.blade, entity.name.function.blade + settings + + foreground + #7aa2f7 + + + + name + PHP - Embedded Tag + scope + punctuation.section.embedded.begin.php, punctuation.section.embedded.end.php + settings + + foreground + #0db9d7 + + + + name + Smarty - Twig tag - Blade + scope + punctuation.definition.variable.smarty, punctuation.section.embedded.begin.smarty, punctuation.section.embedded.end.smarty, meta.tag.template.value.twig, punctuation.section.tag.twig, meta.tag.expression.twig, punctuation.definition.tag.expression.twig, punctuation.definition.tag.output.twig, variable.parameter.smarty + settings + + foreground + #7DCFFF + + + + name + Smarty - Twig variable - function + scope + variable.other.property.twig, support.function.twig, meta.function-call.twig, keyword.control.twig, keyword.control.smarty, keyword.operator.other.twig, keyword.operator.comparison.twig, support.function.functions.twig, support.function.functions.twig, keyword.operator.assignment.twig, support.function.filters.twig, support.function.built-in.smarty, keyword.operator.smarty, text.blade text.html.blade custom.compiler.blade.php punctuation.section.embedded.php entity.name.tag.block.any.html, text.blade text.html.blade custom.compiler.blade.php punctuation.section.embedded.php constant.other.inline-data.html, text.blade text.html.blade custom.compiler.blade.php support.function constant.other.inline-data.html + settings + + foreground + #2ac3de + + + + name + Globals - PHP Constants etc + scope + constant.other.php, variable.other.global.safer, variable.other.global.safer punctuation.definition.variable, variable.other.global, variable.other.global punctuation.definition.variable, constant.other + settings + + foreground + #e0af68 + + + + name + Variables + scope + variable, support.variable, string constant.other.placeholder + settings + + foreground + #c0caf5 + + + + name + Object Variable + scope + variable.other.object, support.module.node + settings + + foreground + #c0caf5 + + + + name + Object Key + scope + meta.object-literal.key, meta.group.braces.curly constant.other.object.key.js string.unquoted.label.js, string.alias.graphql, string.unquoted.graphql, string.unquoted.alias.graphql, meta.field.declaration.ts variable.object.property + settings + + foreground + #73daca + + + + name + Object Property + scope + variable.other.property, support.variable.property, support.variable.property.dom, meta.function-call variable.other.object.property, variable.language.prototype, meta.property.object, variable.other.member + settings + + foreground + #7dcfff + + + + name + Object Property + scope + variable.other.object.property + settings + + foreground + #c0caf5 + + + + name + Object Literal Member lvl 3 (Vue Prop Validation) + scope + meta.objectliteral meta.object.member meta.objectliteral meta.object.member meta.objectliteral meta.object.member meta.object-literal.key + settings + + foreground + #41a6b5 + + + + name + C-related Block Level Variables + scope + source.cpp meta.block variable.other + settings + + foreground + #f7768e + + + + name + Other Variable + scope + support.other.variable + settings + + foreground + #f7768e + + + + name + Methods + scope + meta.class-method.js entity.name.function.js, entity.name.method.js, variable.function.constructor, keyword.other.special-method, storage.type.cs + settings + + foreground + #7aa2f7 + + + + name + Function Definition + scope + entity.name.function, meta.function-call, meta.function-call entity.name.function, variable.function, meta.definition.method entity.name.function, meta.object-literal entity.name.function + settings + + foreground + #7aa2f7 + + + + name + Function Argument + scope + variable.parameter.function.language.special, variable.parameter, meta.function.parameters punctuation.definition.variable, meta.function.parameter variable + settings + + foreground + #e0af68 + + + + name + Constant, Tag Attribute + scope + keyword.other.type.php, storage.type.php, constant.character, constant.escape, keyword.other.unit + settings + + foreground + #bb9af7 + + + + name + Variable Definition + scope + meta.definition.variable variable.other.constant, meta.definition.variable variable.other.readwrite, variable.other.declaration + settings + + foreground + #bb9af7 + + + + name + Inherited Class + scope + entity.other.inherited-class + settings + + fontStyle + + foreground + #bb9af7 + + + + name + Class, Support, DOM, etc + scope + support.class, support.type, variable.other.readwrite.alias, support.orther.namespace.use.php, meta.use.php, support.other.namespace.php, support.type.sys-types, support.variable.dom, support.constant.math, support.type.object.module, support.constant.json, entity.name.namespace, meta.import.qualifier, entity.name.class + settings + + foreground + #0db9d7 + + + + name + Class Name + scope + entity.name + settings + + foreground + #c0caf5 + + + + name + Support Function + scope + support.function + settings + + foreground + #2ac3de + + + + name + CSS Class and Support + scope + source.css support.type.property-name, source.sass support.type.property-name, source.scss support.type.property-name, source.less support.type.property-name, source.stylus support.type.property-name, source.postcss support.type.property-name, support.type.property-name.css, support.type.vendored.property-name, support.type.map.key + settings + + foreground + #7aa2f7 + + + + name + CSS Font + scope + support.constant.font-name, meta.definition.variable + settings + + foreground + #9ece6a + + + + name + CSS Class + scope + entity.other.attribute-name.class, meta.at-rule.mixin.scss entity.name.function.scss + settings + + foreground + #9ece6a + + + + name + CSS ID + scope + entity.other.attribute-name.id + settings + + foreground + #fc7b7b + + + + name + CSS Tag + scope + entity.name.tag.css, entity.name.tag.reference, entity.name.tag.scss + settings + + foreground + #0db9d7 + + + + name + CSS Tag Reference + scope + entity.name.tag.reference + settings + + foreground + #e0af68 + + + + name + CSS Property Separator + scope + meta.property-list punctuation.separator.key-value + settings + + foreground + #9abdf5 + + + + name + CSS Punctuation + scope + meta.property-list, punctuation.definition.entity.css + settings + + foreground + #e0af68 + + + + name + SCSS @ + scope + meta.at-rule.mixin keyword.control.at-rule.mixin, meta.at-rule.include entity.name.function.scss, meta.at-rule.include keyword.control.at-rule.include + settings + + foreground + #bb9af7 + + + + name + SCSS Mixins, Extends, Include Keyword + scope + keyword.control.at-rule.include punctuation.definition.keyword, keyword.control.at-rule.mixin punctuation.definition.keyword, meta.at-rule.include keyword.control.at-rule.include, keyword.control.at-rule.extend punctuation.definition.keyword, meta.at-rule.extend keyword.control.at-rule.extend, entity.other.attribute-name.placeholder.css punctuation.definition.entity.css, meta.at-rule.media keyword.control.at-rule.media, meta.at-rule.mixin keyword.control.at-rule.mixin, meta.at-rule.function keyword.control.at-rule.function, keyword.control punctuation.definition.keyword, meta.at-rule.import.scss entity.other.attribute-name.placeholder.scss punctuation.definition.entity.scss, meta.at-rule.import.scss keyword.control.at-rule.import.scss + settings + + foreground + #9d7cd8 + + + + name + SCSS Include Mixin Argument + scope + meta.property-list meta.at-rule.include + settings + + foreground + #c0caf5 + + + + name + CSS value + scope + support.constant.property-value + settings + + foreground + #ff9e64 + + + + name + Sub-methods + scope + entity.name.module.js, variable.import.parameter.js, variable.other.class.js + settings + + foreground + #c0caf5 + + + + name + Language methods + scope + variable.language + settings + + foreground + #f7768e + + + + name + Variable punctuation + scope + variable.other punctuation.definition.variable + settings + + foreground + #c0caf5 + + + + name + Keyword this with Punctuation, ES7 Bind Operator + scope + source.js constant.other.object.key.js string.unquoted.label.js, variable.language.this punctuation.definition.variable, keyword.other.this + settings + + foreground + #f7768e + + + + name + HTML Attributes + scope + entity.other.attribute-name, text.html.basic entity.other.attribute-name.html, text.html.basic entity.other.attribute-name, text.blade entity.other.attribute-name.class, text.html.smarty entity.other.attribute-name.class + settings + + foreground + #bb9af7 + + + + name + Vue Template attributes + scope + meta.directive.vue punctuation.separator.key-value.html, meta.directive.vue entity.other.attribute-name.html + settings + + foreground + #bb9af7 + + + + name + Vue Template attribute separator + scope + meta.directive.vue punctuation.separator.key-value.html + settings + + foreground + #89ddff + + + + name + CSS IDs + scope + source.sass keyword.control + settings + + foreground + #7aa2f7 + + + + name + CSS psuedo selectors + scope + entity.other.attribute-name.pseudo-class, entity.other.attribute-name.pseudo-element, entity.other.attribute-name.placeholder, meta.property-list meta.property-value + settings + + foreground + #bb9af7 + + + + name + Inserted + scope + markup.inserted + settings + + foreground + #449dab + + + + name + Deleted + scope + markup.deleted + settings + + foreground + #914c54 + + + + name + Changed + scope + markup.changed + settings + + foreground + #6183bb + + + + name + Regular Expressions + scope + string.regexp + settings + + foreground + #b4f9f8 + + + + name + Regular Expressions - Punctuation + scope + punctuation.definition.group + settings + + foreground + #f7768e + + + + name + Regular Expressions - Character Class + scope + constant.other.character-class.regexp + settings + + foreground + #bb9af7 + + + + name + Regular Expressions - Character Class Set + scope + constant.other.character-class.set.regexp, punctuation.definition.character-class.regexp + settings + + foreground + #e0af68 + + + + name + Regular Expressions - Quantifier + scope + keyword.operator.quantifier.regexp + settings + + foreground + #89ddff + + + + name + Regular Expressions - Backslash + scope + constant.character.escape.backslash + settings + + foreground + #c0caf5 + + + + name + Escape Characters + scope + constant.character.escape + settings + + foreground + #89ddff + + + + name + Decorators + scope + tag.decorator.js entity.name.tag.js, tag.decorator.js punctuation.definition.tag.js + settings + + foreground + #7aa2f7 + + + + name + CSS Units + scope + keyword.other.unit + settings + + foreground + #f7768e + + + + name + JSON Key - Level 0 + scope + source.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #7aa2f7 + + + + name + JSON Key - Level 1 + scope + source.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #0db9d7 + + + + name + JSON Key - Level 2 + scope + source.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #7dcfff + + + + name + JSON Key - Level 3 + scope + source.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #bb9af7 + + + + name + JSON Key - Level 4 + scope + source.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #e0af68 + + + + name + JSON Key - Level 5 + scope + source.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #0db9d7 + + + + name + JSON Key - Level 6 + scope + source.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json string.quoted.double.json + settings + + foreground + #73daca + + + + name + JSON Key - Level 7 + scope + source.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json + settings + + foreground + #f7768e + + + + name + JSON Key - Level 8 + scope + source.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.value.json meta.sequence.json meta.mapping.key.json string.quoted.double.json punctuation.definition.string.end.json + settings + + foreground + #9ece6a + + + + name + JSON Key - value + scope + source.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json, source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.array.json meta.structure.dictionary.json meta.structure.dictionary.value.json string.quoted.double.json + settings + + foreground + #9ece6a + + + + name + Plain Punctuation + scope + punctuation.definition.list_item.markdown + settings + + foreground + #9abdf5 + + + + name + Block Punctuation + scope + meta.block, meta.brace, punctuation.definition.block, punctuation.definition.use, punctuation.definition.group.shell, punctuation.definition.class, punctuation.definition.begin.bracket, punctuation.definition.end.bracket, punctuation.definition.parameters, punctuation.definition.arguments, punctuation.definition.dictionary, punctuation.definition.array, punctuation.section + settings + + foreground + #9abdf5 + + + + name + Markdown - Plain + scope + meta.jsx.children, meta.embedded.block + settings + + foreground + #c0caf5 + + + + name + HTML text + scope + text.html + settings + + foreground + #9aa5ce + + + + name + Markdown - Markup Raw Inline + scope + text.html.markdown markup.inline.raw.markdown + settings + + foreground + #bb9af7 + + + + name + Markdown - Markup Raw Inline Punctuation + scope + text.html.markdown markup.inline.raw.markdown punctuation.definition.raw.markdown + settings + + foreground + #4E5579 + + + + name + Markdown - Heading 1 + scope + heading.1.markdown entity.name, heading.1.markdown punctuation.definition.heading.markdown + settings + + fontStyle + bold + foreground + #89ddff + + + + name + Markdown - Heading 2 + scope + heading.2.markdown entity.name, heading.2.markdown punctuation.definition.heading.markdown + settings + + fontStyle + bold + foreground + #61bdf2 + + + + name + Markdown - Heading 3 + scope + heading.3.markdown entity.name, heading.3.markdown punctuation.definition.heading.markdown + settings + + fontStyle + bold + foreground + #7aa2f7 + + + + name + Markdown - Heading 4 + scope + heading.4.markdown entity.name, heading.4.markdown punctuation.definition.heading.markdown + settings + + fontStyle + bold + foreground + #6d91de + + + + name + Markdown - Heading 5 + scope + heading.5.markdown entity.name, heading.5.markdown punctuation.definition.heading.markdown + settings + + fontStyle + bold + foreground + #9aa5ce + + + + name + Markdown - Heading 6 + scope + heading.6.markdown entity.name, heading.6.markdown punctuation.definition.heading.markdown + settings + + fontStyle + bold + foreground + #747ca1 + + + + name + Markup - Italic + scope + markup.italic, markup.italic punctuation + settings + + fontStyle + italic + foreground + #c0caf5 + + + + name + Markup - Bold + scope + markup.bold, markup.bold punctuation + settings + + fontStyle + bold + foreground + #c0caf5 + + + + name + Markup - Bold-Italic + scope + markup.bold markup.italic, markup.bold markup.italic punctuation + settings + + fontStyle + bold italic + foreground + #c0caf5 + + + + name + Markup - Underline + scope + markup.underline, markup.underline punctuation + settings + + fontStyle + underline + + + + name + Markdown - Blockquote + scope + markup.quote punctuation.definition.blockquote.markdown + settings + + foreground + #4e5579 + + + + name + Markup - Quote + scope + markup.quote + settings + + fontStyle + italic + + + + name + Markdown - Link + scope + string.other.link, markup.underline.link, constant.other.reference.link.markdown, string.other.link.description.title.markdown + settings + + foreground + #73daca + + + + name + Markdown - Fenced Code Block + scope + markup.fenced_code.block.markdown, markup.inline.raw.string.markdown, variable.language.fenced.markdown + settings + + foreground + #89ddff + + + + name + Markdown - Separator + scope + meta.separator + settings + + fontStyle + bold + foreground + #444b6a + + + + name + Markup - Table + scope + markup.table + settings + + foreground + #c0cefc + + + + name + Token - Info + scope + token.info-token + settings + + foreground + #0db9d7 + + + + name + Token - Warn + scope + token.warn-token + settings + + foreground + #ffdb69 + + + + name + Token - Error + scope + token.error-token + settings + + foreground + #db4b4b + + + + name + Token - Debug + scope + token.debug-token + settings + + foreground + #b267e6 + + + + name + Apache Tag + scope + entity.tag.apacheconf + settings + + foreground + #f7768e + + + + name + Preprocessor + scope + meta.preprocessor + settings + + foreground + #73daca + + + + name + ENV value + scope + source.env + settings + + foreground + #7aa2f7 + + + + uuid + 06f855e3-9fb7-4fb1-b790-aef06065f34e + + + diff --git a/.config/bottom/bottom.toml b/.config/bottom/bottom.toml new file mode 100644 index 0000000..5a83c21 --- /dev/null +++ b/.config/bottom/bottom.toml @@ -0,0 +1,189 @@ +# This is a default config file for bottom. All of the settings are commented +# out by default; if you wish to change them uncomment and modify as you see +# fit. + +# This group of options represents a command-line flag/option. Flags explicitly +# added when running (ie: btm -a) will override this config file if an option +# is also set here. + +[flags] +# Whether to hide the average cpu entry. +#hide_avg_cpu = false +# Whether to use dot markers rather than braille. +#dot_marker = false +# The update rate of the application. +#rate = "1s" +# Whether to put the CPU legend to the left. +#left_legend = false +# Whether to set CPU% on a process to be based on the total CPU or just current usage. +#current_usage = false +# Whether to set CPU% on a process to be based on the total CPU or per-core CPU% (not divided by the number of cpus). +#unnormalized_cpu = false +# Whether to group processes with the same name together by default. +group_processes = true +# Whether to make process searching case sensitive by default. +#case_sensitive = false +# Whether to make process searching look for matching the entire word by default. +#whole_word = false +# Whether to make process searching use regex by default. +#regex = false +# Defaults to Celsius. Temperature is one of: +#temperature_type = "k" +#temperature_type = "f" +#temperature_type = "c" +#temperature_type = "kelvin" +#temperature_type = "fahrenheit" +#temperature_type = "celsius" +# The default time interval (in milliseconds). +#default_time_value = "60s" +# The time delta on each zoom in/out action (in milliseconds). +#time_delta = 15000 +# Hides the time scale. +#hide_time = false +# Override layout default widget +#default_widget_type = "proc" +#default_widget_count = 1 +# Expand selected widget upon starting the app +#expanded_on_startup = true +# Use basic mode +#basic = false +# Use the old network legend style +#use_old_network_legend = false +# Remove space in tables +#hide_table_gap = false +# Show the battery widgets +#battery = false +# Disable mouse clicks +#disable_click = false +# Built-in themes. Valid values are "default", "default-light", "gruvbox", "gruvbox-light", "nord", "nord-light" +#color = "default" +# Show memory values in the processes widget as values by default +#mem_as_value = false +# Show tree mode by default in the processes widget. +#tree = false +# Shows an indicator in table widgets tracking where in the list you are. +#show_table_scroll_position = false +# Show processes as their commands by default in the process widget. +#process_command = false +# Displays the network widget with binary prefixes. +#network_use_binary_prefix = false +# Displays the network widget using bytes. +#network_use_bytes = false +# Displays the network widget with a log scale. +#network_use_log = false +# Hides advanced options to stop a process on Unix-like systems. +#disable_advanced_kill = false +# Shows GPU(s) memory +enable_gpu_memory = true +# Shows cache and buffer memory +enable_cache_memory = true +# How much data is stored at once in terms of time. +#retention = "10m" + +# These are flags around the process widget. + +#[processes] +#columns = ["PID", "Name", "CPU%", "Mem%", "R/s", "W/s", "T.Read", "T.Write", "User", "State"] + +# These are all the components that support custom theming. Note that colour support +# will depend on terminal support. + +#[colors] # Uncomment if you want to use custom colors +# Represents the colour of table headers (processes, CPU, disks, temperature). +#table_header_color="LightBlue" +# Represents the colour of the label each widget has. +#widget_title_color="Gray" +# Represents the average CPU color. +#avg_cpu_color="Red" +# Represents the colour the core will use in the CPU legend and graph. +#cpu_core_colors=["LightMagenta", "LightYellow", "LightCyan", "LightGreen", "LightBlue", "LightRed", "Cyan", "Green", "Blue", "Red"] +# Represents the colour RAM will use in the memory legend and graph. +#ram_color="LightMagenta" +# Represents the colour SWAP will use in the memory legend and graph. +#swap_color="LightYellow" +# Represents the colour ARC will use in the memory legend and graph. +#arc_color="LightCyan" +# Represents the colour the GPU will use in the memory legend and graph. +#gpu_core_colors=["LightGreen", "LightBlue", "LightRed", "Cyan", "Green", "Blue", "Red"] +# Represents the colour rx will use in the network legend and graph. +#rx_color="LightCyan" +# Represents the colour tx will use in the network legend and graph. +#tx_color="LightGreen" +# Represents the colour of the border of unselected widgets. +#border_color="Gray" +# Represents the colour of the border of selected widgets. +#highlighted_border_color="LightBlue" +# Represents the colour of most text. +#text_color="Gray" +# Represents the colour of text that is selected. +#selected_text_color="Black" +# Represents the background colour of text that is selected. +#selected_bg_color="LightBlue" +# Represents the colour of the lines and text of the graph. +#graph_color="Gray" +# Represents the colours of the battery based on charge +#high_battery_color="green" +#medium_battery_color="yellow" +#low_battery_color="red" + +# Layout - layouts follow a pattern like this: +# [[row]] represents a row in the application. +# [[row.child]] represents either a widget or a column. +# [[row.child.child]] represents a widget. +# +# All widgets must have the type value set to one of ["cpu", "mem", "proc", "net", "temp", "disk", "empty"]. +# All layout components have a ratio value - if this is not set, then it defaults to 1. +# The default widget layout: +#[[row]] +# ratio=30 +# [[row.child]] +# type="cpu" +#[[row]] +# ratio=40 +# [[row.child]] +# ratio=4 +# type="mem" +# [[row.child]] +# ratio=3 +# [[row.child.child]] +# type="temp" +# [[row.child.child]] +# type="disk" +#[[row]] +# ratio=30 +# [[row.child]] +# type="net" +# [[row.child]] +# type="proc" +# default=true + + +# Filters - you can hide specific temperature sensors, network interfaces, and disks using filters. This is admittedly +# a bit hard to use as of now, and there is a planned in-app interface for managing this in the future: +#[disk_filter] +#is_list_ignored = true +#list = ["/dev/sda\\d+", "/dev/nvme0n1p2"] +#regex = true +#case_sensitive = false +#whole_word = false + +#[mount_filter] +#is_list_ignored = true +#list = ["/mnt/.*", "/boot"] +#regex = true +#case_sensitive = false +#whole_word = false + +#[temp_filter] +#is_list_ignored = true +#list = ["cpu", "wifi"] +#regex = false +#case_sensitive = false +#whole_word = false + +#[net_filter] +#is_list_ignored = true +#list = ["virbr0.*"] +#regex = true +#case_sensitive = false +#whole_word = false diff --git a/.config/electron-flags.conf b/.config/electron-flags.conf new file mode 100644 index 0000000..1af1827 --- /dev/null +++ b/.config/electron-flags.conf @@ -0,0 +1 @@ +--enable-features=UseOzonePlatform --ozone-platform=wayland diff --git a/.config/euporie/config.json b/.config/euporie/config.json new file mode 100644 index 0000000..e491577 --- /dev/null +++ b/.config/euporie/config.json @@ -0,0 +1,16 @@ +{ + "edit_mode": "vi", + "external_editor": "nvim", + "color_scheme": "default", + "syntax_theme": "inkpot", + "autoformat": true, + "autoinspect": true, + "autocomplete": true, + "enable_language_servers": true, + "accent_color": "#7aa2f7", + "show_file_icons": true, + "notebook": { + "show_side_bar": true, + "background_pattern": 5 + } +} diff --git a/.config/fastfetch/config.jsonc b/.config/fastfetch/config.jsonc new file mode 100644 index 0000000..0f0fdee --- /dev/null +++ b/.config/fastfetch/config.jsonc @@ -0,0 +1,28 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "file-raw", + "source": "/home/cianh/.config/fastfetch/logo.txt" + }, + "modules": [ + "title", + "separator", + "os", + "host", + "kernel", + "uptime", + "packages", + "shell", + "de", + "wm", + "terminal", + "cpu", + "gpu", + "memory", + "swap", + "localip", + "battery", + "poweradapter", + "break" + ] +} diff --git a/.config/fastfetch/kitty.jsonc b/.config/fastfetch/kitty.jsonc new file mode 100644 index 0000000..63f382f --- /dev/null +++ b/.config/fastfetch/kitty.jsonc @@ -0,0 +1,30 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "kitty-direct", + "source": "/home/cianh/.config/fastfetch/logo.png", + "width": 64, + "height": 18 + }, + "modules": [ + "title", + "separator", + "os", + "host", + "kernel", + "uptime", + "packages", + "shell", + "de", + "wm", + "terminal", + "cpu", + "gpu", + "memory", + "swap", + "localip", + "battery", + "poweradapter", + "break" + ] +} diff --git a/.config/fastfetch/logo.png b/.config/fastfetch/logo.png new file mode 100644 index 0000000..7830c50 Binary files /dev/null and b/.config/fastfetch/logo.png differ diff --git a/.config/fastfetch/logo.six b/.config/fastfetch/logo.six new file mode 100644 index 0000000..9188387 --- /dev/null +++ b/.config/fastfetch/logo.six @@ -0,0 +1 @@ +Pq"1;1;640;360#0;2;13;16;16#1;2;13;13;16#2;2;38;38;35#3;2;27;28;30#4;2;20;20;22#5;2;88;88;88#6;2;85;85;85#7;2;75;75;75#8;2;66;66;66#9;2;50;50;50#10;2;35;31;31#11;2;97;97;97#12;2;94;94;91#13;2;88;88;85#14;2;77;77;74#15;2;66;63;60#16;2;47;45;47#17;2;22;22;22#18;2;97;97;94#19;2;89;89;86#20;2;82;82;78#21;2;72;72;69#22;2;60;56;56#23;2;44;44;44#24;2;19;19;24#25;2;91;91;88#26;2;69;66;66#27;2;53;53;53#28;2;44;41;38#29;2;28;25;27#30;2;19;19;16#31;2;36;39;36#32;2;44;44;38#33;2;55;55;47#34;2;69;69;66#35;2;78;78;75#36;2;66;66;63#37;2;13;19;16#38;2;16;22;16#39;2;22;25;22#40;2;31;35;28#41;2;50;50;47#42;2;66;66;60#43;2;86;88;85#44;2;91;91;91#45;2;47;41;41#46;2;30;35;31#47;2;19;22;16#48;2;22;25;19#49;2;28;31;25#50;2;38;41;38#51;2;78;78;78#52;2;67;67;66#53;2;53;53;56#54;2;25;25;22#55;2;28;28;25#56;2;53;52;50#57;2;75;75;72#58;2;85;85;82#59;2;60;60;60#60;2;14;19;20#61;2;22;22;16#62;2;22;17;20#63;2;25;22;19#64;2;25;28;25#65;2;31;27;27#66;2;35;35;28#67;2;56;56;50#68;2;25;25;27#69;2;69;72;69#70;2;60;60;56#71;2;44;44;41#72;2;25;25;19#73;2;16;16;16#74;2;17;19;20#75;2;35;35;31#76;2;75;75;69#77;2;64;64;64#78;2;22;16;16#79;2;19;16;14#80;2;31;31;25#81;2;72;72;72#82;2;41;44;44#83;2;47;44;44#84;2;27;20;22#85;2;16;19;16#86;2;28;31;31#87;2;96;96;97#88;2;41;38;38#89;2;53;53;45#90;2;60;60;50#91;2;69;69;63#92;2;38;35;28#93;2;19;22;19#94;2;56;56;53#95;2;22;22;25#96;2;47;44;35#97;2;66;63;56#98;2;49;49;44#99;2;50;49;39#100;2;56;55;49#101;2;38;35;35#102;2;16;13;16#103;2;47;47;35#104;2;53;50;41#105;2;58;58;49#106;2;78;78;72#107;2;47;47;44#108;2;47;49;49#109;2;63;60;53#110;2;33;30;30#111;2;50;50;41#112;2;25;28;22#113;2;47;44;31#114;2;28;28;22#115;2;38;38;31#116;2;82;80;75#117;2;85;82;82#118;2;28;25;19#119;2;47;47;38#120;2;63;60;56#121;2;86;85;83#122;2;31;31;28#123;2;22;25;25#124;2;53;50;44#125;2;36;33;35#126;2;75;72;69#127;2;44;44;35#128;2;72;72;66#129;2;41;41;41#130;2;97;94;91#131;2;50;47;35#132;2;82;78;78#133;2;47;47;41#134;2;60;60;53#135;2;28;31;28#136;2;94;94;94#137;2;22;28;19#138;2;35;38;33#139;2;72;69;69#140;2;60;63;56#141;2;41;41;38#142;2;63;63;60#143;2;25;28;19#144;2;66;66;56#145;2;38;41;35#146;2;61;60;61#147;2;56;53;42#148;2;85;85;78#149;2;9;19;16#150;2;9;24;19#151;2;20;28;24#152;2;31;36;36#153;2;49;53;45#154;2;44;47;41#155;2;82;85;82#156;2;93;93;88#157;2;41;38;31#158;2;44;41;31#159;2;69;66;60#160;2;44;38;35#161;2;39;35;30#162;2;66;63;53#163;2;47;45;30#164;2;72;74;75#165;2;56;56;56#166;2;60;56;50#167;2;78;82;80#168;2;39;35;36#169;2;41;35;31#170;2;88;91;91#171;2;38;41;44#172;2;82;82;82#173;2;91;94;93#174;2;88;85;85#175;2;47;44;41#176;2;69;69;69#177;2;47;41;31#178;2;63;60;50#179;2;44;44;31#180;2;44;41;28#181;2;63;63;63#182;2;78;78;82#183;2;63;60;63#184;2;36;39;41#185;2;47;41;35#186;2;69;69;72#187;2;41;38;35#188;2;50;53;53#189;2;56;60;58#190;2;82;83;85#191;2;75;77;78#192;2;61;64;66#193;2;49;55;52#194;2;41;41;35#195;2;20;38;30#196;2;53;56;53#197;2;72;75;72#198;2;13;38;30#199;2;19;50;41#200;2;22;52;42#201;2;31;52;44#202;2;16;56;44#203;2;9;13;16#204;2;69;75;74#205;2;44;49;49#206;2;28;25;22#207;2;94;94;97#208;2;63;66;63#209;2;38;44;44#210;2;28;31;22#211;2;31;28;22#212;2;31;25;19#213;2;36;33;24#214;2;31;28;19#215;2;47;50;41#216;2;31;31;22#217;2;31;31;19#218;2;53;50;47#219;2;75;72;72#220;2;66;69;63#221;2;69;72;66#222;2;25;22;16#223;2;22;19;16#224;2;31;25;22#225;2;25;28;16#226;2;63;63;55#227;2;28;22;16#228;2;41;41;28#229;2;97;94;94#230;2;28;31;19#231;2;85;82;78#232;2;25;25;16#233;2;88;85;78#234;2;38;44;35#235;2;38;41;31#236;2;94;97;94#237;2;38;44;41#238;2;28;28;19#239;2;94;91;91#240;2;22;25;16#0~vlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvlZvz~$#1?GQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGQcGC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0~ulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#1?HQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC-#0NELZU\ZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZulZuz~$#2O#1HACHACHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHC$#5_#3O#4O???_$#6?_#7_#8_#9_#10_-#11BBFFEEEMKKK[[WWWww!4o!5_#45O#5_#51_#52_#53_#50_#54_$#37oOo!4_#15@#16@#10@!4?A!8?G#17G!4?O$#25C!4?G#14@?O#19A!4?C#24A#26C!8?O#22O#46?O$#31G#12C??@!5?O??C?_??G???O!4?_$#30?_#33G!8?_#8_#1@??@?A@?A@CA@CAHCAHCAHCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#32?G#34?G#20G!5?A??_?C!8?O$#38???O#39O#13@#18G?A#43O#17@#0@@?@@AB@ABDEBDMJLEJ\UZ\uzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#40!5?O#41O#42O#48_#49_#50_#21A#22A#23A#5_#27??C#28C#13G#30C#36G#9G#44O$#47!7?_#29!11?C#35G-#11Www!5o!5_!8?!4@!4BFFEEEMMKKK[[WWww!5o!5_#88O#43_#59?_#50_$#37@?@BB@?@C?CC?CG!7?_O???OO#56G#8G!8?A#14_??C#77C#18G#58?G#81G!8?_$#58C!9?O!7?@!8?C#85?O#38O#47_#13G!8?_#1@??A@?A@?AD?AHCAHCQHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#12_???G!8?_#28@!4?A#18@#39C!9?O#74_#60_!6?@#44C!4?G!8?_$#49A#38B???A??@@#64G!5?A??_#67A#34A#54C#25A#12A!6?@@G??A!5?_!7?O#19O#51O#26O#53O$#20?C#30A???BA?E?GKG?KG???g!5?o!4_???_#59@#23@#10@#17@!8?C#22?G#82G#60?G$#69??C#70C!8?O#83O#5_#20_!6?A!8?G#86O#6@??O#19Q#9_?A!4?C$#18???G!4?O#2G!8?_!9?G!8?_???A!4?C$#71!4?C#40C!7?@#10O#56@#26_#22_#79O!6?G#76C!8?O#55_#51?A#0@?@?BB@ABDEFDANLEJ\UZLuzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#13!5?G#14G#73C!9?WK?CG?GG#70C#72G#80G#21!6?@#61_#87??O#36_#68??A!8?G!4?O???_$#72!6?C#77G#47A?@#61A?AC?OC?C#75???C#71C!8?O#22O#43!7?C$#41!8?G#44O!9?@!8?C$#48!10?A@A#62?A#63A#42@#57@#66A#0OOoW_oo$#21!11?O#55@#84??O#74C#65A#78?G-#96!5}!4{www!6o?_?_#20O?A!8?G#93@A@#10G???@#80O!7?C#60?_?o_O__#10O!4?@#6A#26A!4?C#53C#88C#43G#7G#15G#108G#10G#24G#57O#22O#23O#25_#51_#52_#27_#2_#4_$#89@!4?A#11!5@!5BFFEEMMKKK[[WWww!4o!5_!8?!4@!5BFFEEEMKKK[[WWWww!4o!5_#110?O$#90?@#91@#20@!4?A#44A!4?C#105G#91G!8?_#22A#37!4@AAB???C???C#47A?A#20@!8?C#2G#87C#24O#44??G!4?O#1?@??@??@A?@?AD?AHCAHCQHCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#13!4?@#12@#97A#76A#99?C#87A!4?C#106?G#13G!8?_!4?G!4?O#0CCKGCCSSOWwwwoO???_!9?@?@@?BBA@BEFDANLEJ\UZLUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#100!10?C#42C#103GG!4?o?_#70@!8?C#87G#101C#65C#38AC#23G!8?_!5?C#74G#37o#3G#19C#107G#42G#50??O#35@!6?_#3A#20C!8?O$#57!12?C#58C#104G#12???@G??A?O??C_!7?O#4B#64G?@!4?A#5@#12@???A!7?@!8?C?_??G???O!4?_$#43!19?@!8?C#39A!4?C!4?@#73A?GOGGKC???G???O#41!5?O!4?_#8_#45A#5c#79A#68???C#102C#44??O$#89!19?O#14@#21O#16@#25Q#64@#26A#35_#28A#40A#57C#30A@@???C?AG?A?G!4?C#57A!8?G#18??G?A#25A#28_#59?A$#109!20?O#99?_#92@#90_#47@#85@#98!4?C#8??G#94G!7?@#59_#40?_#17_?C???G!4?O__#84_#15P#7O#40_#95@$#111!23?_#18!11?O!4?_#19_#6_#21_!9?C#112!8?_#16@#58O$#74!35?@#61A?@!4?A#69@#75?A#98A#22A???C#64!10?_$#7!38?O#36O#56O#88O#45@#13!7?A!8?G@$#79!39?A-#96~^vj\vzlVyntZtntZl~Fy^vj\vznU{]}[{[{!5w!5o__#26P!8?C#61@AA?C!6?G!9?G??ooo?_?_#21@O#2?_#0!4@?BBA@BEFDAFLMJD]Z\UJ|uZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluzF$#113?_GSaGCQgDOIcIOIcQ?wC_GSaGCOgA_?_?_#116A#5A#12A!4?C??@G???AO??C!4?G???O!4?_#115@!8?C#12A!4?C???G??A#68@#7A?_#10A#1@??@A?@?ADGA@CI@CAHSAHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHCw$#103!20?@#89!7?@!8?C#109C#20?C!8?O!4?_?C!8?O#21O#118C?A?I#76@!8?C#20C!5?@??O#56?_#42a#16A#121_#43C!8?O#126O#15O#12_#10O#58_#57_#59_#23_#3_#4_$#97!29?@#76@!8?C#99?G#91?G#57G#121G#19@!8?c#54A#74A#18G!8?_!7?@#84GG???G#25?C#98G#73_#18@!6?O!6?G???O#2G#17G#16??O#62?O$#58!31?@#44@!8?C#124!4?O#18G#127__#13O!9?G!8?_#65O?A?_!7?G!8?_#130!5?_#76C#120C#71C#19G#51G#52G#56G$#104!32?A#90A!8?G!4?O#56?@#101@#29@#62@#59A#45A#37@@@#30A#4@???C???G???O??COo?GOOO???O?_!9?A#40???C#73C$#18!33?@#11!4@!5BFFEEEMMKK[[WWWw!5o!4_!9?!4@!5BFEEEMMKKK[[WWww!4o!5_$#69!34?A#119?C#51!10?@#119??_#89_#70_#60@#73@#10A#87_#67?C#88C#48@#17E!8?MCCWWCCOo_G_!8?_$#117!51?A#76A#128_#110!6?C#39@???CK?KC??O#10A#44@???A!8?@!4?O???C!8?O!4?_$#7!61?G#72BAAA@@#29A#125O#16@!8?C#47_#101??G#120?G#14G#13G!4?A$#36!62?G#64@@??A#40@#35?_#52_#94_??A#34A#3C#59??C#39!5?O#40O#88O??@$#9!63?G#2G#114@A#70O#45O#109??@#123G#43@#28A#62_#79?_#62!11?_#53@$#25!64?O#122G#54!7?C#63?G#116?A#90!11?O$#47!64?C#129!8?_-#96~ZulZunuZluZluZlvYlv\ju\ju\mzTnun~v~^~^!16~!4}!6{!4woooOo!4_#13A!4?C!8?O#35O#8O#94O#40@!8?C#28C#34?C!8?@#56@!8?C#44G!4?O#4G!8?_$#113?cHQcHOHcQHcQHcQGdQGaSHaSHaPCiOHO?G?_?_#99!16?@#100@???A#11!5@!5BFEEEMMKKK[[WWww!4o!5_!8?!4@!5BFFEEMMKKK[[WWWww!5o!4_#12_#13_#7_#15_#23_$#34!57?@#35@#13@#12@#109A!4?C!8?O#59@#83@#10@#114@!8?C!6?@!8?C#60_#13!4?C!8?O#4@#1@@???@A??@A?D?AHCAHCQHCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHCu$#131!59?A#21??A#20A!4?C!8?O!6?C#30B@#115C#93@A?C???C?C!4?_!4?oo_!5?_#41O#36O!8?C#101?C#17C#76G#59G#107G#86G!8?_$#19!64?A#89C!8?O#98???_#132A#39@???A???ACA@?K@??AC?C!4?G#17!4?O!6?_#14O#40_#71_#57A_#0@@BA@BBEDFAFLEJLUZLUZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluzH$#87!65?A#76?C!7?@O#26???A#61@@#47@#38@??B!8?K?O???So_Og??O_?O__?_#18?A#115@#109?_#22A#129A#5C#87_#43???G#26!5?O#53O#88O#68O$#44!69?C#18C?@!4?A?O!6?G???O!4?_#44_#47G?K???GG?OG???O#30_#21G#58G!8?_#64A$#99!69?G#90G!8?_#94?A#19_!4?G#51G#17@C???K???G#0O#20@!8?C!6?@???A!4?C!8?O$#8!71?G!8?_#28?A#49A#36?C#37A!8?G!4?O???O#121A#66!4?G#133G#134G#135?O#25@#137??_$#106!72?G!8?_#136?_#56??C#34??G#72@A???A???A!8?G!4?O#44?G$#103!72?_#12@G???O???C!8?O#46G!8?_#12@???A!4?C??@!4?AO??C_$#5!73?G#58@#67!15?G#129G#54D@A?A#10O#90@!8?C#50!7?O$#64!92?AA#82??O#58_#48A?GK?C#57A$#71!97?@#7_#15_#55A!8?G$#69!99?@#133_#2A#61G!8?_$#5!101?@#41A#42A$#85!101?O-#96~ZulZulZ|Uj|Vynt]j|uZluz\uZ|uZ|uzm|^|v~l~^!21~^~~^~~^~~]v}v~u^rnz^s]g}gs{{{owww!5o_#105O#34O#9@#19Q!4?_#47@A???A?@BA?B??GO??G!5?__?OO#91G!8?_#1?@??@?A@?A@CA@CI@SAHCqHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHCu$#113?cHQcHQcAhSAgDOI`SAHcQHCaHcAHcAHCPA_AG?Q?_!21?_??_??_??_G?G?G_KOC_I?A#20@#25@#12@???A!4?C#109G#126G#136@#25G!8?C#72A#38@@B@@@A?@L??KCCKKS!6?WO#50G#18C?@#5G!8?_#24A#57C#59C#45C#19G#6G!8?_#139_#2?_#17_$#103!72?@?@??@!6?_S?SG???G???G!5?_?_#101@#20A??_?C!8?O#48??A!8?C!4?___!4?_#14O!4?_#86A#55!4?C#26?G#53G!8?_$#89!83?@#109@#21@#99?A#105A#11!5@!4BFFEEEMKKK[[WWWww!4o!5_!7?!5@!5BFEEEMMKK[[[WWww!5o!5_#44_#61O$#42!89?A#106A#58A!8?G#99O???_#87O!4?_#69C!8?O!9?A#20A#25A!8?@!4?A#9_?A#88!9?G#13O#35O#36O#108O#110O$#104!92?C#18A!8?G?A!4?C#61@!4?A?A???AK?A??A#46A#141A#67A#0__#49C#12A!8?G??A!5?_??G!4?O#39G$#90!93?C#91C#35C!6?@#42@#116O#56?_#54@#39@!7?C!8?O???_#71!4?C!8?O#139@#22@#43O!5?C$#13!96?C#89G#5???@#127?_#80??@#139A#21_#107A!8?G#138G!4?@#4A#36_#7@#145_#70!6?C!8?O#23?@#2_#30@#0@@?@BAB@EFDEBLMJDMJ\UZLuzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluzH$#144!107?_#140A#17@#2A#30??A!4?CC???C??G???G??G#73?G#57C#143G??_#35G#17_??_#114_#3@#51A#34A$#94!113?C!8?O#40?O#35_#42@#41_#58!9?C#33?G#72O??_$#44!114?G!4?O!9?@!8?C!8?O???C$#28!114?C!8?O#98?@#54!15?O#46O#20@$#43!115?G!8?_???@#64!12?_$#55!115?C!7?@$#57!116?G#85C!8?A!4?C$#142!117?G#12O!4?_$#37!120?C??G???OO?sWWowO$#143!120?G-#96~ZulZulZ}V|Y~v|nz~l~zn|~j~v|nz^u~l~Z~u~l~zn|~z!15~^~t^~v\~v\!7~n~v\~v^!4~^~~^~~^~~}~}~|~|~|~~!5}!5{!4woOoOO_?__#71@#19A#72@!4?A?A#138C#20G!4?O#37GCC?CCKGSsGoOooOOoo__??_#23@#19A#20A!4?C!8?O!4?_#8_#41_#10_$#113?cHQcHQc@gAd?GAOC?Q?COA?S?GAOC_H?Q?c?H?Q?COA?C!15?_?I_?Ga?Ga!7?O?Ga?G_!4?_??_??_#103??@?@?A?A?A??@#99@???A!4?C!8?O???_#40@#51A#47@#48@@#137@?@?@#39A?@CBC#38CA#44_!9?A!8?G#33O#15@#38_#80@#50_??A#68A#8?C#41C#44G!4?O#4G!8?_$#89!111?@!8?C#91C#35C#103G_?__?_#76@!8?C#112A@A@A#17C??AA???O#8@#72A!4?C#145C#56C#34C#35C!8?O#112_#1?@???@?A?@CA@CA@CI@SAHCQhcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHCu$#97!112?@#57@#58@#44@!8?C???@!4?O???C#43C#64@#146C#87G#80?C#54DAB?G#36O#0GGK?OOO??oGg!8?_!4?@?@@@?B@BABDEBDMJDMJ\UZLUZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluzH$#111!115?A#11!5@!5BFFEEMMKKK[[WWww!5o!4_!8?!4@!5BFFEEMMKKK[[WWwww!4o!4_#18_#88O#5_$#90!116?A#34A!8?G!8?_#41A#31A#49A#107??C#21??G#22G#71G#46G!8?A#12@#140A#14A#17!4?G#13C!8?O#139?A#27A#101!5?C#43G#76G#146G#71G#46G#21?O#94O#64?O$#20!118?A#25A#87A#43??C#147G#18C!8?O#52A#93!11?C??@#30A??G!9?_???O#12@!5?O??C_!7?O!4?_$#109!125?G!8?_#61!13?@!9?G#49!6?G#129G#94G!8?_#61!7?C$#106!127?G!8?_#74!12?@#18_#55@#43_!7?A#93!4?_#130C#128?G!8?_$#5!128?G!8?_!4?G!4?O#56??O#88O#60AA#47A#41_#85C??C??G#58!6?G!8?_$#12!129?G??A!5?_!7?O#2!5?@#73G???G!5?G!7?_!8?A$#58!129?@??O#104_#3!18?O#33@#146_#106@#25@#71A#55!11?O#5@!8?C$#33!129?O#120O#57O!21?_#138??_#123_#138!12?O#106@#36O#87A$#70!131?@-#96~~mz^|v^|v^|v]zn}zn}zn}zn}zn}zn~Y~|~z}~z}~~}v~z!22~|!7~}!6~|!12~v|~v!21~}|^n|~]~l}~^~|^}}}{y{{{s!4o_!4oO???_#50@#68@#39@#4@#18C#19C!4?G#51G#34G#53G#129G#13O!7?@!8?C#28G!7?@!4?A#1@??GLaODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHCA$#113??PC_AG_AG_AG`CO@CO@CO@CO@CO@CO?d?A?C@?C@??@G?C!22?A!7?@!6?A!12?GA?G#103!21?@A??A?@?A@???A?@??AC???GKGGGOG???_!4?_#76?A#146A#58_#46A#37@?A!6?@?@???C!8?wwoo!9?@!4?A#31C$#113!124?_O??_?O??_??_#89?@#109@#21@#148@#25@#12@???A!7?@!5?O!7?G!8?_#25_!8?A!8?G!4?O#20A!5?_$#111!142?A#33A#11!4@!6BFEEMMKKK[[WWwww!5o!4_!8?!4@!4BFFFEEMMKKK[{Www#35O$#42!144?A#57A!8?G!8?_#93@#60@#17A#0@?B?@CCFEEKKC[W[KWkwWwO#42C#22???G!7?_??A#55?A$#58!146?A#104C!8?O#20@?O!6?C#73A@?AA?A#68?G#1@AAGA??OCOC_?g#149!4?O#21G#58G?@??O#3@#13_???C$#90!148?C!8?O#67?@#97??_#108?A#21??C#22C#71C#40C!8?O#20_!6?A???C#85???O#137O#40O#18G!4?O#0@@@?@Bvq\nyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz|$#34!149?C!8?P#87A#30!10?@?B@#57??O!5?@#114A#17_#18@#38?C!6?___#44@#93_#17_#57O!7?C$#99!150?G#5C!4?@???O#79!10?C#85!4?G??A?A#47A#145?A#89A#49??C???G!8?_#5A#69?A!4?G$#106!150?C#89?G!8?_#70!15?O#16O#2@???_#12!5?A???C!7?A!4?C$#18!152?CC#43?G!5?A#64!16?@#56?@#91@!4?A#108??C#47!7?_#133O#70O#54_#87???_?_$#144!153?G#44??G???A!4?_!8?O!9?@#76!14?@#59@$#127!156?___#52!22?_#67_-#96~~T~~T~~T~~T~n|v]zn}zn}zn}Z~u~l~Z~u!6~^!20~v~~N~Vnv~zv~~~^~~v~^~zv!5~^!5~^~n~^n!20~|v~l~Z~v!29~}~~}}~!5}!4{woowo__??_??_#16@#40@#38@!4?A@B@?@#137@#34??O#87CAC#18?A#35C#0qnZ|Uj|UzluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#113??i??i??i??i?OAG`CO@CO@CO@c?H?Q?c?H!6?_#103!20?G??o?gOG?CG???_??G?_?CG!5?_!5?_?O?_O#113!20?AG?Q?c?G#103!29?@??@#127@#99?@#89@#144@#14@#43@#44@#11!5@!4BFFEEEMKKK[[!4Ww!4ow{]NB@w~|#106G#73C#1OcAhSAhCQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#111!170?A#90A#34A???C!4?G!8?A#37!4@A#153C#129C#46C??@#141?_#14G#36_#116???`#102H$#20!173?A!8?G!8?_!9?A@??C???Q$#25!174?A!8?G!4?A#51A#21_#67A#5_#39A#57C!7?_#40?O#77W$#119!174?C!6?_?O#13@??O#41_#30?@#87C#138A#58C#97?C#150?A#13G#151A#152A#80???_$#127!175?G!5?O_??_#35O#99_#48!10?B#154C#155C$#33!175?C#103G?GOO?O?_#7@#42@$#87!175?A#106?C#5C#12C???@G??AO???C_??GG?G!6?B$#104!179?G#109G!8?_$#18!182?@???A!7?_$#56!184?O#91O-#96~~T~~T~~t^z~V|nz^|v]z~U~l~Z~u^|v~n}^!27~l}~vnzVyEB@@BBBAFNN^z^!5~r~n~~~}~Zm~^~n!18~z}V~|v!59~}~~|p}{{yO#98o!4?A#28g#10@#8y#20???^#0~lZuntYnt]j|Vynt]j|UzluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#113??i??i??I_C?gAOC_AG`C?h?Q?c?H_AG?O@_#103!27?Q@?GOCgDH?AA???D??O_C_!5?K?O???@?cP?_?O#113!18?C@g?AG#103!59?@??AA@A?CA#56C#11B~~!5?~~~#116_#1?QcHOIdOI`SAgDOI`SAhCQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#104!71?O#91_O?G?OO__#119!110?K!4?_!5?{#157@#40A#34D$#147!71?_#109GC?c??G#111G#100O#41!112?@#109@#128@#58@#89G#12[??@#67@#158E#75K$#89!72?C!4?C#127!116?A#71?K#140A#18_#5??W#160?O#115_$#42!72?OG#144oOGg?O#156!117?@#25???E#161??O$#159!73?_G?O?_#121!122?_$#97!74?C?_$#90!76?C!4?_-#96~~T~~Nz]^v~H~nZT~vj^t~n|v^|v^|v]~t^~|!25~n~~Zm~^n~o_???M]K[W_??@FN^Z~}^NNEB@B@?@BA@FF~~~z!7~^!76~|~F!6?O#2o#36p#20???u#0~lZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#113??i??_C@_G?a??_A?G??I?OAG_AG_AG`?I_?A#103!25?O??cP?_O?G!6?Q_???@A???C?@?O?@CA?ABA?@A!5?C#113!7?_#119!76?A!7?A#160A#101E#42G#51???@#1?QcHQcAhSAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#103!5?O?_???S?OCg??S_#147!51?A???DO@!4?_#36C#89?G#111O#105!6?O???C!7?O#127!90?_!6?C#115@#91E#116???G$#89!71?C#97K??O_!5?O??O!7?_O??_?c??_Go#99G#103!90?W#124W!4?_#161?G$#105!71?@#144@AB!4?@AD?_G_#42!8?_OoGoGGOGo#41!93?e#12|#11~~!5?~~~$#159!72?ATw!6?A??O#104!9?G#109G??C?_c???_#56!91?@#87A#5??_#28@h$#33!72?O#42GC_!6?GO#159!11?_?OGOOGO#89C#13!97?@#83[$#109!73?_?G??@??G@#144!13?G#162???C#43!100?M$#99!75?A@_???O!5?_???_#147!4?C#121!104?O$#113!78?_?_!7?_$#90!79?AC??AC?_!5?_!9?C?G$#91!80?@?EG_-#96~^z\fuXnzlYvkZm\rnYlunZll~zl|~z^x!28~j^yn}\m~|^i|}Wo??@B?F[S_!9?OWCGAI!5?_y!6~z~|~~|!77~\!6?C#2A#36S#20???L#0~Yvl]jt^i|Vylv\iv\mzTny\vi\vlYvl]jt^i|VzmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUZLEBDEJLUZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?_?aOHeOCOdGRcPaKOdQGO_Q???A!4?C!28?S_DO?aP?A_TA?_!5?C?Bg!4?A?@???__wS[CEA!4?C#113!6?C?A??A#103!77?A#56v#12Z#11~~!5?~~~#116q#1?dGQ`SI_TAgDQGaTGaPCiODaGTaGQdGQ`SI_TAgCPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCA@CA@CAHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113??C?G!4?A!10?@?C?Q?COA?C_A!32?@#89!7?@#97@?G??G!4?A?@C??C!5?@??_??GLOE#119!90?_#94G#87c#5??A#83g#160O_#42j#108!105?_#87_#82G!5?_$#100!74?A#109C!4?O_???G_A???_!5?@??OGC?_H#13!95?G#98D#28A#115S#165!107?O#11_ooo_#3O$#131!74?C#144A?AC!5?@COWGW??JF!9?qF#43!96?_#124Q#127h#158H#136!108?O#164G#81G#23G#76O#19_$#91!75?@EG?O!5?@??O?o#162!4?A#89A??O?C#105B#121!98?T$#111!75?G!4?G?_??_#163??@@#124!7?_#147@?G!4?O$#42!76?@?_?_!5?E??_G[C?B@!5?o??G$#33!76?O?A!9?C!9?_$#113!76?_???BG??O!8?_$#159!77?SW_!5?AG__??A!8?_?o$#90!77?`!5?@!7?@OGC$#104!79?C!7?@!7?C$#99!81?O?AG!4?A??_OG??A?@@@!4?@$#105!84?CO???CA-#96~lqN|QntmXvi\vlYvi\julZtmZulvlVz|e~v~~~n~z!17~ZylrM|Qn{BM@NINN^^]ScGO??_#91G?WOYOO???GGCEB@B#166A#113???G!13?g#119!74?OA!5?P#28lA#36{#20???~#0~ZulZvylVynt]j|Vynt]j|UzluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZLEB??__Og{go_??@BD]jt^iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?QLoAlOIPeGTaGQdGTaSHQcIPcGQGQgCAX?G???O?C!17?_DQKpAlOB{@M?DOO??`iOo_oo?_!7?@@?__OoWoGqCG?C#71!88?_#94Z#12Z#11~^!5?~~~#1??cHQcGDQgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHCA@?@??O_O?O!6?A@SI_TGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!26?@!32?C#109!9?_!8?@??C@GA???_??c?C!4?G?C??@#103!92?C#100c#87c#18?_#13o#99m#160QO#42A#10!99?_#19_!6?C!5?O#173_#16A#168C#172O#81_$#147!69?O#42_!8?@!4?C??@A?GG??WCCA#96_?_GsKyvvz!12~V!74~nX#43!4?B#115??_#77@#171!100?O#11_ow[MFB@@@BFM[wo_$#105!70?O!8?A??G???A!5?c??A#89@!4?C#121!99?K#158??@#12!102?O#108C#87CA@!8?A#170?G$#144!71?__!8?AE??!4CdC!7?@???@#161!101?C#23!102?G#136G#16A#9@!4?A!4?@$#89!71?O#111O???_!7?@#90Q@!9?O@#169!106?G#6!105?_#20O#13G#95G#3C!8?G$#97!73?_!6?A@?A??OA??b???COA#25!217?A#51?A#68GO#12@?C$#90!74?_#33_#163???G#159@??CG?G?H???WW???G?CA#60!215?C#167C#5G#152_$#147!80?C??@???_!9?O$#99!81?G???@_!5?AA?`!8?@$#89!84?O#33!6?B?_!5?G$#131!92?@#104?a-#96~i\julZulZulZulZulZulZulYvi\ulZulzYl~QnZ~U!16~|~yVylZlqmS#97C!6?@D!7?C!4?OW_?OO???___#147??_#113!5?_G?OC_G@?AG?_G#119!70?C_G#94^#12V#11~^!5?~~~#20^#0~\uj\uzmTzmtZnyTny\vj]tzmTznYtnYvl]jt]j|UzluZluZluZluZlvYnt]j|UzluZluZluZluZluZluZluZluZluZLEB@?_oO{iv\ju\mzTns[w_??@BLez\uj\uzlUzluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?TaSHQcHQcHQcHQcHQcHQcHQdGTaHQcHQC`Q?lOc?h!16?A?DgDQcQLPj#109z!8?@!4?AA?[???g?G???O#105O#33O!4?_#127!92?O#100_#87_#18?_#13w#99j#160fI#36^#116???_#1?aHSaHCPiCPIcODiODaGS`ICPiCOdIOdGQ`SI`SAhCQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHCA@!5?g?SGaSHaPCiOI_!6?AXCaHSaHCQhCQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!34?C#42!35?A!6?AAA??CCsw!5?_O!5?_#89O!5?_#136!92?G#43??@#175S#157G#115O#144_#4!94?_!9?@#23!9?@#87@???A?O#6_$#144!70?|!5~}w{{}}ywG!8?o!4_#121!103?C#177?O#161_#6!96?_???@#146O#98G#2C#13@#165!11?A???@#13C#37C#82O$#90!79?@#105@#104@#99@!4?CFN@?C??G!4?O!5?__#174!93?A#169??D#3!96?O#11_o{]NB@#65A#11!12?BFN{w_$#103!83?@@?@B??A?@EDALFLFLZUHI@O#19!195?O#87G???C#12A#8!13?C#51G#9_#171?A#176G$#96!85?@?_GO?BA@ADAGAGACHUT]N^~~^v~nz^v}~|v~^v!70~z^f#23!105?G#59C#57A_#68!17?O#12O$#33!85?A#89A#113Oo#163_#147CC#90?G!8?_$#178!86?_#131G#104!6?G-#96~uH~itNylrM|Rm\rmTzuLzuLzUlZulZuj[vj]t~Z~nv|!11~z~~~}z|E|JuGyA#109~#42QsASGO!6?_?[s!6?b?BCgO!8?C#105@#96!4~Z}v~l~zn|~j~u~|v!4~^!64~!5?O#160Yv#36C#20???~#0~ju\ju\mzTmz\vi^tmZ|Uj|UzluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZlvYnt]j|UzlUZLEJDEB@AB@??__O{Ulz\uj\vylVzmtZmv\j|Sw???@FALNIDMZLUZlvYnt]j|UzluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?Hu?TIoDQKpAkPaKPiCHqCHqChQcHQcHSaGS`I?c?O?A!11?C???@CAxAsHvD|#144?l@H`bn!6~^nBJ!4?OW[{wpBF~~~z~~~{y#109A#113!4?c@G?Q?COA?S?H?AG!4?_#94!64?h#12|#11~C!5?~~~#1??SHaSHaPCiPCaGT_IPcAhSAhCQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQGdOI`SAhCQHCQHCA@CA@??@???_?gQCaHSaGDQgCPIcPGaSAg!6?DA?DI@CQHCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!33?@!8?G#97!28?IsIS!8?O_!5?lf?BCISg???C???B@{#100!89?U#87A#18?z#13^#83_#157D#169G#42P#60!81?_#9_!4?G!5?_#12O#7?G#26C#5@#62@#57!19?@!7?O#181O!4?_#171_$#162!86?_???A#19!110?_#99I#180_#97?G#51!83?_!4?G#77?C!4?O#60O#73G#82A#3!20?A#11@F^{wo!5_#19_#182_$#109!86?^#96O?~#119!112?C#120??a#87!84?_!4?G?_#14_#35A#54_#59!25?C??@#7C#26G#95G!4?O???_$#113!87?n#179n#175!113?@#10!87?O!4?C#13?C#171A#139?@#136!25?A??A#110A#5?O#56??O#50O$#180!88?O#11!202?__ooowW[[MNFB#9!23?O#6_$#52!291?O#17G#13!34?G$#170!292?O#74!34?_-#96~iV{juLzUlzUlzTmzTmtZulZulR|UlZutjyLzu\j|^|z~|~}!8~z~TyVi\vH~?jSO?___!13?N?l!18?!7~nzVlvYz^u~\~v!68~}#90O#12v#11~@!5?~~~#20^#0~ZulZuntYnt]j|UzluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzlvYnt]j|UzlvYnt]j|UZLEJDEB@?@?__oOwgW{Sm}iVzlvYntZmtZmtZmt]j|UzlvYnt]j|Vyg{k[gWwWwOooo_?__@@@AB@ABDFAND]ZLUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?TgBSHqChQChQCiPCiPIcHQcHQcAhQcHAS@qCHaSA_AC?A?@!8?C?iDgTaGu?~Sj_O???_!12?O?Q!25?OCgQGc!75?@#94f#87G#18?}#5E#99l#160cY#36t#116???_#1?cHQcHOIdOI`SAhCQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQGdOI`SAhCQGdOI`SAhCQHCA@?A@!5?_?O_?gO?SgCQGdOIcPIcPIcPI`SAhCQGdOI`SAgCS?O_O_?_?_!4?_?@???@?A@CA?D?I@CQHCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!26?G!5?G?C#97!34?@@IHAKICW?___Da??N???AD???@!5?C!5?~#113!12?@C_H?a?G#166!69?G#13???X#175Q#169@d#42G#60!69?_#77_!7?A#17@#57O#13@??C#53C#4C#50?A#6@#165@#68@#23!30?@#13@#11!4@!4BFFFEEMMK[[WWwwooo!4_#25_#57_#9_#17_$#109!69?A!4?O???_#99!8?_#113i#19!112?_#157?Y#144?A#12!71?_?O???C?A!6?A#68!36?A#108A#52A#6A#12A#129C#142C#7C#44C#10G???O#53O#88@#5A#81A#108A#12C_#181C#129C#44G#7G#59G#18O#13O#26O#23O$#99!69?G_O???_#163!12?O#68!188?O?G???A#139_!8?A#60!39?C#22!5?G!7?_#35_#20C#62??C#125??G#60G$#105!69?C#144C?CK@PXF!4^W[\~o???wy~~~}!5~z!5~#11!171?__oowW[[MMFFBB@@@#57!45?G???O#152?_#68?A$#42!70?ADA@ACA!5?a@a!5?D#52!187?O?G#25G#8C#87_#65?_#59@#125O#35G#82G#19!51?G???O$#90!70?G??O???_#179!10?C#29!192?C#25!59?@#51@#146@$#147!72?O???_#180!11?@#87!253?G-#96~lQ~Sj\uj\uj\uj\uj\uj]Tj]tJ]tj\uj[vlzn^j~v!13~n~~}|~t]ti|A\c!6?A???@???AECI^BEWGO?O_???_?__!5?|!5~TynZulZtlZvVj|~nz^~nvnv~Z!5~v~n~^~v!46~#22_#12}#11~^!5?~~~#20f#0~ZulZulZ|Uj|Vynt]j|Vynt]j|UzluZluZluZluZlvYlvYlv\iv\ju^TINDBAB@@?_ooWwk[uynV|iv\mzTmz\uj\uzlVylvZmtZmv\iv\mzTmz\vi^tmZ|Uj}TznYtntYnyTnzUzlvYmu[sk[sgWgooO__?@@ABDEBLMZTmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?Ql?jSaHSaHSaHSaHSaHS`IS`IS`ISaHSbGQCO_S?G!13?O??@A?I`ITA|aZ@?@??A!4?C!5?IC_?@C?G???OO!5?_!4?A!5?iDOcHQcIOc?gS!7?GO#70!61?E#87@#18?_#5Q#99}#160}z#15A#51???O#1?cHQcHQcAhSAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT?AC@!7?_?O_GCOgATGaPCiPCaHSaHCQgDQGcPIcPGaTGaPCiPCaGT_IPcAhS@iCOdIOIdODiOChCQGcOGaGO_GO_O??_!5?@?A@CA@CIPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!22?_???_#97!42?oc???KK!7?OOO_!5?A??A?IDGC?CGC??D#113!14?A?G??A?OC??O??G?c!5?G?O?_?G#94!46?O#13???l#175@#157@#169C#36D#116???G#102!55?_??G#22G#5G#139C!8?A?@#10@#60!65?@#82@#26@#6@!6?C#75G#52G!4?A#51_C#5?G#22G#123G#183O#64O#146_#68_$#90!69?C!6?C!7?@?@#91!4?A#147??G!5?O???_#163!26?_#166!65?H#42!7?O#181!60?_#87_!4?c!6?A?@#54!71?A#11@@@BBBFFEMMK[WWwoo__$#111!69?A!8?C#109?GG???@!4?A?C???G!5?O???_Y#97!97?G#50!61?O#11_oowW[MMFFB@@#65A#136!71?@#9A#57A#170A#50C!5?O#108@?_??C$#109!69?G#144W{{{oo!4wooo!7?@@@FF@@@ABBJBBJNN#120!98?_#172!62?O!7?G#88G#164C#75C#77!78?C#12???@!9?O?_$#99!70?@??A!6?@???G!6?_?G!4?OO#17!170?C#171?A#20A#9@#16O#19!86?G??Q#18?C#87_$#105!70?AA#113@@!6?EC!6?_g??__!4?_#142!174?_#13O#19@#7!87?@#139O#60`#152?A$#147!72?A!8?@#105@@??O!8?G!5?O???_?_#60!166?_$#180!74?@?@?A??A#33G!8?C$#163!75?@A?@???E!5?K??O?O_O__??_$#179!77?B?A???C!4?OO$#100!77?C#42!5?___!9?CECGCGCGSOOO$#89!83?G!6?_-#96~TmxVlZulZulZulZulZulZtmXntjvixV{Znz]n|!20~zmZtmR}`J}#97uu?S?KOCs?O_!5?A???LLIsGoI?CGcCWG?wwo#99_#113!21?C!15?CO???O#103!29?_WAOG#94!11?~#12~#11~|!5?~~~#20G#0~v\iv\mzTny\vi\vlYvl]jt^i|Vylv\iv\ju^ti^tmZ|Uj|uZLEB@??__owWwkuZluZmtZmv\iv\mzTny\vj]tzmV|iv\mzTny\vj]tzmV|iv\mzTmz\uj\vylVylvYlv\iv\ju^ti^tzmV|iv\mzTmz\vlZ|Vku[sWwOo__??@BAFDINTzmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?iPEgQcHQcHQcHQcHQcHQcIPcOICGTAg@c??_OA!20?CPcIPk@]s@#109@#42Hs?S?CG?S?O#109!5?K???a!6?A!9?G#18!92?A#5C#99z#160nz#42@#51???T#1?GaTGaPCiODaGTaGQdGQ`SI_TAgDQGaTGaSH_IT_IPcAhSAHCA@?A@!5?_CQGcQHcPIcPGaTGaPCiODaGS`ICPgATGaPCiODaGS`ICPgATGaPCiPCaHSaGDQgDQGdQGaTGaSH_IT_ICPgATGaPCiPCaGQcAgQG_G_?_!4?@??@?AD?ICPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!24?A??O??C?A?OC@#162!32?G#144?JjjrjrJjnN!5~@!4?O_?ECowwoWg_oo#33?C#13!94?z#175C#185O#28C#97S#116???a#26!48?_#87_O??c??G??A#152??@!95?@#139@!5?G?O#19A!5?O#27O#5_#9_$#90!86?o!6?@!8?C#120!102?i#53!53?O#11_owW[MFFB@@#136!99?@???C???O#146A?C#39C#59G#24G#79?O$#96!87?U?@!6?@@???@A@?B@AN~z~|uJ|uJ}Tze\juZlZulYze\uXf}hVmxn\v\zLvX~nvz!27~^f|nv!11~#184!63?G#13G!6?C#50C#151!100?A#11@@BBFEMK[Wwoo__$#113!87?gQI!9?@#103AA@AB?A@O?C?AHsAHs@iCXaSHcQcHQ`CXaHeW@UgPEOaGa?aGe??GC#123!107?C#21C#27A#146_!5?A#8!100?A#12A???@#183@#17@#186_#25C?G$#131!87?@#163Gc!8?@#147A#179@#86!163?@#172@!5?@#68!100?C#52C#86G?O?_#4?A$#180!88?d#179O#162O?@#89?@!9?CC?C#173!156?A#51O#125O#42G#87!108?G???_$#42!91?aSIoICC?C?O??G$#111!95?@#105??A!4?C-#96~Zc~hV|e|z]|Vi|nOnYu~t{nZlunWlVvmzznju~~~|!18~yvYlZuly_#97@`OP_PaTiS?sGSgRVO???n@C???@!5?OGWc^F#96i~~vzMzSntYnYtnYtnty\jyLzuLzuLyvLyvLyVlzUlzT}Zn!25~uz^nsZ}n|}z\~|~~\!6?C#28O#15D#20???A#0~lzUlzVylvYnt]j|UzluZluZluZluZlvYnt]j|UzLEJDB???_oWk{gV|ju\ju\j|UzlvYnt]j|UzluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTny\vj]tzmV|iv\mzTmz\vi\vzmTzmv\ju\ju^tj\vlZ|Ui{kW_o__??@@AFLMZ\uj\uzlUzluZlvYlvZmTZMFLAF@A@@???~lZuntYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?cZ?UgAXAC`AgTAOlOCH?A@?_QHOdQG?OC??SH???A!18?DGdQcHQD^#109}#144GMmMmKG@BjJbbFG_!4?OYzz~}}!5~fvbR_#109o#103T??GCpCjOIdOdIOdIOIDaODqCHqCHqDGqDGqDgQChQCi@cO!25?HC_OJc@OA@Ca?A#71??_#90_#12~#11~~!5?~~~#51T#1?QChQCgDQGdOI`SAhCQHcQHcQHcQHcQGdOI`SAhCQHCA?@?_??_O?SgASHaSHaSAhCQGdOI`SAhCQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiODaGS`ICPgATGaPCiPCaGTaGCPiCPGaSHaSH_ISaGQcAgS?O_O!4?@?A@?A@CAHSaHCQhCQHcQGdQGcPICPGAD?A!5?@?QcHOIdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!16?A?`??GAOC???A?_G@?CO#42!34?U`?P?PaSgS?SGOcG!5?c?C?@!9?G#162?G#113!21?C#119!66?A#94^#13???~#99i#160a`#120y#116???g#168!40?_#6_!4?AO#19G#45G#146C#51A#3A#23@#152!116?@#57@!8?A!6?_#125_#102!18?_!7?@#168A#136_#19A#5A#21W$#109!86?n#96o?{#15!12?G?C#175!97?T#177@#187M#68!46?O#11_oow[MFBB@#12@#85A#11!118?@@BBFFMK[Wwoo__#108!21?_#51_!6?_#29?@#86@#26C$#113!87?NaA#185!113?W#182!48?O#181G#87G!4?C#82!122?A!6?@#183_#173_?G#22G#23?O#87!23?_?O#139G#12G?C#81???_$#163!88?G@#16!164?C#25C#57_#164@#86O#116!124?A#9C#13C?G!7?O#16!24?O#11__oowW[{{#88A$#179!88?T#125!166?A#60@#62!128?G#53G#24O#6@#19O#12?C#52C#4C#7!27?O#171G#2?C#186C?A$#165!388?O#68_#152?A$#87!389?A-#96~t~ylv}|uxv}Xv}lxVu\z|UZluq|zyl}H]d}~z~~~n!16~v|zd~hVyVyUg[sgsgsgogWgoooOoo~z#99E#33_#15!8?_G@???C#96??z~~~]j|jUlzT}Tju\uhV|Uh^itZulZulZulZuzvI|j]ze|jv!26~n]zvz~|}v~yvz~p#94~!7?_#6???O#0nju\ju^ti^tzmV|iv\mzTnyVl}jT}j\uzLUJDA@?__oWkuZnt]j|UzluZlvYlvZmtZmtZnyTnyVl}jT~iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTny\vj]tzmV|iv\ju\mzTntZlv]uk[gw___??BAFLMJDFA@B@!4?OowoOogw!5?~ylVylvZmtZmv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#103?I?DQG@AHEG@eG@ACg@A?A@cAHCA?DA@S`Q@?C???O!16?GACY?UgDgDhS_GSGSGSKO_OG??_!4?`!18?C???`SAShQCi@iSHaHUgAhU_TIcHQcHQcHQcHCGtAS`CXASG!26?O`CGC?A@G?DGC?E#12?~#11~~!5?~~~#20f#1OSHaSH_IT_ICPgATGaPCiODgQ@Si@SaHCQHCA@!5?_OGcOI`SAhCQHcQGdQGcPIcPIcODiODgQ@Si?TGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiODaGS`ICPgATGaSHaPCiOIcQG_GO_O?O???@?@?APCI?DA??@??__??GgCS!7?DQgDQGcPIcPGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#113!15?OA?G_C?g?O?H?C?O?a?G#33!34?@#97@!4?AAB!6?B?B???ZOB_@!5?_G@?GGU~#119!88?G#13!4?~#98O#160G[#59A#58???G#68!33?_#51_#11__ww[MFBB@#77@#84!135?@#52@!6?@#19A!8?O#165G#60C?A??_!9?A#12O#21??A$#131!69?A#147A#144@!4?@?A?@FB??F!4?CM[]}!4~^Vu}~vrh#99!95?l#185v#187b#70K#57!39?O#8G#165C#108A#82@???C#22A#12!138?@!4?G??_#57C#44G???_#77O#24G#13?G???A#5O!7?@??A#26??w$#89!71?A!7?C??G???G??G#175!112?A#90??O#87!40?O#136?C#12A??C#10!140?A#11@@BFEM[[wo__??__ooww[[MMFFBB@@!4?~~#76@$#42!72?!4@??@BA?CFC!6?@?@#120!111?@#52!43?_#7O#13G#86G#139!141?A#87A!8?O#189O#10?O#53!4?C!4?O#51G#28G#172C#188C#19A#37G?E#46@#43@#139??C$#90!72?AA!6?C??G??C#163?C#111O#173!160?@#37O#168!143?C#35C#53G#86O#51O!6?_#6!6?C???@#59!5?A#54A#68?O#44_$#109!74?A!9?G!6?__#136!305?@#4?@#9A#3?C#108G#27!9?A?@!8?@#95g#170K$#99!78?C#105!6?G#146!314?_#20!13?_#4@!6?C#123???C$#67!415?_-#96~~v\|ZmvX}mz~mz~mz~l|}j~v~l}un\v|Jvvn~|!15~^n~^n}!5~}~}!7~v}~~~Z~u^}}j}|yvxuiy}M}]g{kwgWgwWznZntmTyvLyvmXvYvi\ze\jvkZtmTzuljuz^|y~b]t^yn!35~|^~m~un~`#94i!7?a#6???Q#0|luZluZluZluZluZlvYlvZmtZmtZMDB???_oWg}VlzUntYnt]j|UzluZlvYnt]j|UzluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmzlZvms[woOowWks]i{Vlz\vi\vylv!5?z}Tj}TzluZlvYnt]j|UzluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluz~$#113??Ga??O?c?PC?PC?PC?OA?S?G?Q?H?aG?_G?O#103!17?_O?_O@!5?@?@!7?G@???C?@?@@C@ADGEGSC?o?_U?OCO_O?_?OcOIPiDGqDGPeGdGTaCXaSGRcIPiCHQCHC_AD?[`I_DO!35?A_?P?H??C#56@#12t#11~~!5?~~~#20c#1AQHcQHcQHcQHcQHcQGdQGcPIcPIC@A?@!4?_S?gQChOIdOI`SAhCQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCQcGOG_??_??_OG_SAgQCaGTaGDQG!5?C@iS@iCQHcQGdOI`SAhCQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHC$#103!4?Ac@GA@!9?A?@!5?@?O??AS?G??A#113!41?_?G_??O#99!5?@#111@@#89@@#90@@#97@??BA@@#33CA#113C!31?O#119!53?O?I#100S#25G#13??~#83_#28Gb#22C#58???H#22!27?_#87_!6?C#9C#94A#59@#168!152?@!4?G#60G!6?@#108!11?O???O$#42!100?@@??A?B#109@#71!88?O#44?A#99???]#160A#158C#70O#27!32?O#11_ow[MFBB@#172!154?@!4?C#9C#4C#77A#12@#81@#50@#10!12?A#11o~~#23_$#147!100?A???C#100C#175!96?@#177_#187W#166H#16!33?GC#88A#125@?O#23G#24!156?A#11@!5B@@#65A#45!14?G#12@#34??@$#105!101?A#99?C???C#185!95?T#136!35?O#12GC??G#21!158?A#59C#25C#136C#5??A#56!16?_#87K#59??C$#144!103?@?A#6!136?_#5O#86!161?G!20?@#136A#67??G$#170!242?A#13@#88!182?C#77???A$#84!243?_-#96~FznSzzlVnQnlYm~yn{Zynj}v\{~Yln]zl~|~~~}~|!4~v!25~z~v~\vn|v^{v^}vvn~tmU~yUlzTmvylUzlzT~v~zv~juLzuLYvx}z}vw~jk~Tmp^kz}|mzul|ez|Uz|~~}!35~^vnZvNxa!6?P#158o#6!4?C#0Z}Tj~iT~iv\mzTmz\uj\uZLEB@?_ow[ku^j|VylvZmtZmv\iv\mzTmz\vi^tmZ|Uj|UzlvYnTEB@?@@ABDMZ|uj\uzlUzluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZlvYlvZmtZmtZluZluZlvYnt]j|UzluZluZM!4?_}V|ju^ti^tzmV|iv\mzTmz\vi^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluzB$#113?wCOjC??_?cOOcP?CO?c@?S@G_A?`?O?CO?A???@?A#103!4?G#113!25?C?G?aG?AG_AG_@G?O???_!27?_?C!6?OA???C?A!5?G?AG??G#103!40?_GOcGOA#71T#90_!7?H#20???G#1C@iS?Ti?TGaPCiPCaHSaHCA@!6?_OG_SAgDQGcPIcPGaTGaPCiPCaGT_IPcAhSAhCQGdOI@??@??@?A@CAHSaHCQhCQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPIcQHcQHcQGdOI`SAhCQHcQHcP!5?@gASH_IT_ICPgATGaPCiPCaGT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHC{$#103!6?CAG?H?A@??@?B?CO???A@?CQ?`?A!44?O???@!4?G??IPH?DhQCiPGDQhCQCi?G?CG?SHqCHqDGA@C@GF?CP?iPI_PC@APC@Q?PCA`CA??@#119!40?_CG#94G!7?u#58???r#102_#139!20?_!6?G#7?A#51@#95@#10!39?_#57O!4?C#53C?G#7_#102!132?_!4?O$#163!7?O?O#67!187?A#12~#11~~!5?~~~!23?_ow{]MFB@#73A#110!41?G#11_GGGWOO_#23O#7!133?O#11~~@#10A$#100!197?T#5???q#99~#28iM#164!27?O#57G#81C!4?C#173!43?_#87Oooo__#5G#22!135?@#5??O#17G$#13!201?L#185?C#160@#26!30?A#52_#18@#13!46?G#4A#12CC???O#36!134?C#6??_#50@$#183!236?@#186O#88!46?C#20C#152A#3A#102A!4?_#51!132?_#12??G#123C$#18!289?G_#59!135?A#18??A$#65!290?C#139!135?G#87??C-#96~NYfZ|umv~Z|v^|v]~t~Z}v\~v|nz~nz]v~^v~^v~^v~^v~~v~~~n~~~v~n~~~|~~~X~~^!4~|~^~}~n~z~}~~~j~{zl}vXf}xvlyv|y^|v~}!4~}|~}~~v~z~z}!4~|n~~z~~|}~z}~|~}~~z}!33~|jV{jUzUlzTmJI!6?T#2c#87?_#6??G#0O~ntYnt]j|VylvZMDBA@??oWgyVl}jT~iv\mzTmz\vi^tmZ|Uj|UzluZluZluZlvYlvYlv\v#9@#11FO__?__OIA#184C!6?_#68_#22!123?O???C$#113?_dGCAGPG?c?G_AG`?I?c@Ga?GAOC?OC`G?_G?_G?_G?_G??G???O???G?O!7?c??_!4?A?_#103?@?O?C?@???S?@CQ@GeW@EGQDGAD_AG?@!4?@A?@??G?C?C@!4?AO??C??A@?C@?A?@??C@!33?ASgBShChQCiOS#127_!6?G#158J#20!4?O#73C#1?OIdOI`SAgDQGcPIC@!4?_OCgQ@Si?TGaPCiPCaGT_IPcAhSAhCQHcQHcQHcQGdQGdQGaG_#87Gn^^T]ZNCC#60G#1TcHQcHQCHQcAhSAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQGdO!6?IcPIcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHco$#163?O?O_#103?@!4?A!50?A???A#113!23?A#119!103?@_#71T#90O!7?s#43???B#102j#24!14?_#7_#11_ow]NFB@#27!47?C#13O#12???I@C_O#0_oiZulZULZulZ|Uj|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZlvYn!5?~tZmtZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uZN$#94!197?G!7?J#51???_#64!16?O#43O#12G#27A#13_#51O#139G#26C#77A@#62!46?O#165_#18???_???@#58G#82A#4!5?_#2!125?C#11w~N#7@$#22!197?_#12n#11~~!5?^~~#58C#171!17?G#108C#87C#181@#68_#60??C#88!47?G#59!8?_#108O#152@#3!131?A#6@#12?_#68_$#53!197?A#136O#19??~#83D#28aO#94!77?A#136!9?@#16!132?G#19A#18?O#108G$#67!197?@#98!4?O#24!222?@#136C#168??O$#105!197?C#124!4?i#139!222?_#176???A-#96[X]z~V|~]zn|v~|nz~mz~|V~fYzn]vlZf|^V|}V|~T~N|~mz|nz[v|lz^u~^v~nx~~~n|^v~nz~v!4~}~~~z~}~z~}~v~^|~n}|}t}z}!23~n~~}!50~}~~}~~tz~{~~^|a!6?a#2c#22I#87@#6??@#1BP?iCPIcODI?DA!5?O_TI_SHaSHaSHaSAhCQGdOI`SAhCQGdQGdQGaTGaSH_IT_IPcAhSAgO?OcSG_SGcPIcPC_???@?C@A?@??@!5?PIcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHCAHCA@CA?DA?CHASH_IT_IPcAgTAgCPIcPGaTGaPCiPCaHSaH?@!4?OdIOcHQcHOIdOI`SAhCQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGC$#113BC@??GA?`COAG?AOC?PC?AG?O@C?@?A?GA?gA?g??i?OA?PC?OC`GAOC_G?_G?OA???OA_G?OC?G#103!4?@???C?@?C?@?G?_A?O@A@I@C@!23?O??@!50?@??@??IC?B!4?C#90X!7?d#13???[#62W#0m~TzmtZnytNA@@??owk]it^ju\ju\ju\j|UzlvYnt]j|UzlvYlvYlv\iv\ju^ti^tmZ|Uj|Vm{kWgs]ivZmtZmz!5?FBEDFAB@?@?@@~mtZluZlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZlUZLEJDEBDFALNJU\ju^ti^tmZ|Vi|VzmtZmv\iv\mzTmz\uj\u^!4?_nYtnZulZuntYnt]j|UzluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvz$#103_?_??_!16?_?Gc?O_GOcO?_??@?A???_!4?A??A??A!8?C#119!130?_#71AX#94E!7?O#43???a#79c#68!10?O!4?_#36G#25?@#152@#24!52?@#52@#44@#12@@#13@#139@#171@#3!7?P#11M]{!7owWW{{{#29A#24!57?_#165_#13_#11___oo!5_#80O#191_#16_#86!34?_#3A???O$#99?_#163?C!53?@#67!139?_#12T#11~~!5?}~~#81!12?_#11_ow]NF@#45A#73!54?A#86A#50A#152A#60A#15!9?A#23_#87@?G!8?C#51A#102@#57A#53G#17!59?O#53O#20O#12O!7?_#7!37?O???A$#179?A#136!196?i#19??~#98q#127T#28@#13!17?O??_#7O#26!71?C#43O#19_#57@#52C#22G#108G#165G#8G#6G#12G#146C#13C??A#59?O#10!62?G#23G#108G#87O#44O#58O#139O#41O#146!38?G???C$#107!202?H#175G#115A#82!17?G#27C!4?C#56!69?G#58@#136?A#168A#88!5?C#58?_#5_#108???C#129!65?G#110G#102G#12!40?_??O#6@$#124!202?C#158?W#12!18?G#87C???A#60!81?A#9A#139???_#82!108?C#11w~N#23G$#146!224?A#139@#18!199?C#51?_$#170!425?A$#190!425?@-#90G!9?_#113??G`Cp?@c??PA@?c@??A?_IS_AG?A?C??D!4?A?O?@G?A#103!17?O#113?C#103!13?O?P?cODAOHCA?WaH?aO!9?_OA@O?IC#119!66?OC_O_#22G!7?C!7?C#40C#37C??C#51C??G#73G#168?@#3!74?@#77@#4A#11!4@!6?BNM[!6W[[K#9O#68!26?_#108_#8_#186_#181_#23_#24_#22!7?_#11_ow{]MFBBB!6@BBBFFM]{wwo_#108_#23!25?O#11_~~B#2A$#18OO!4?_#5_#20_#8_#175!184?C?A#67C!7?_#20???A?C#81C#43??G#57G#108G#52G!4?C#5!78?@#2A#16A#9A#129A#37CA#108@#93@#86@#173@!4?C#43_!7?G#81!41?O!5?G#12C#192C#152C!6?C#69C?G#82O?@#86?A#193C#59G#189O#27!26?_#52A??_#59@$#89B!5?O#103!188?@C!6?C#2C#90G#6???@_#0AB@ABDFA@??_o[mv\iv\ju^ti^tmZ|Uj|UzluZlvYnt]j|UzlvYnt]j|UzluZluZluZlvYlvZmtZnyTnyVl}jT}jvYk{S{gwOkum]w__??@AB@A@@?@`u\ju^ti^tzmV|iv\mzTmz\uj\uZLUZLUZLuzlUzlUB@?@?_oowwwsk[kwWgoo_??@@BFI\Nyvl]jt]j|Vynt]j|UzluZluZA!4?w^tj]tzmTzmtZluZlvYnt]j|Vynt]j|UzluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlv{$#11!6_#163GB[PUOBO???A!5?_O??GO???@#127!163?G!6?w#141P#12!4?C#48@#1@?A@?A?@!5?_OGaTGaSH_IT_IPcAhSAhCQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQGdQGcPIcODiODgQ@Si@SGcQ?g?SCgOGO_!6?@?A@??@??HaSH_IT_ICPgATGaPCiPCaHSaHCQHCQHCqHCQhCQHCA@!9?O_O?_O!9?DAoDGQ`SI`SAgDOI`SAhCQHcQHcD!5?_IS`ICPiCPIcQHcQGdOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGB$#99CFDE#76O#144O#28!190?P#94r!7?R#55!4?A#87_??G???O#152A#9@???A#12!82?@#7@!9?C#5??_#4A#139_#165A#44O#14C#60!41?G?A#176A#9@#5@!4?A!4?A#173??C!5?C#86!29?G#44G#19??C#68C$#147?G#111A!8?_#12!186?\#11~~!5?~~~WWWww!4o_w{MFB#55!83?A#81!4?A???A#57_?CC#20C#6_#168A#68?_#86A#7!42?G#191C#196?_#189O#49?G#38??C#20A#35A#191A!9?A#87!31?O#51??G$#44??O#96GBNF[BMHN[f]xM`]HqNkOmTIsJuXf[`BM|Vn|^j~^y!4~x~n~}Vv|z~N~n!12~n~z!13~n~m~Zny|nuz|~f\u~\n!9~^n|}n~tz!66~nzZm!7?A#179a#172!5?C#25!9?A#12O??@#168!87?C#73O#22O!9?_A#17!43?C#37!9?G#51??A#151C#195??G#87?G#6@#167_#108!32?@#139??O$#104??G#103@K!7?_??A?[_QLoAL?iPAcHcWASgP?_O?_O?_!5?C!4?_G?C?o?O#87!136?a#19??~!7?_#18!11?@#86O#77!90?G#19?@???_??C#46!66?_#190!33?C$#43???O#41!198?G#71@#194G#27!16?_#87!91?C#25?O!4?_#170!68?O$#98!202?`#84!112?_#67_#3A$#107!202?C#78!113?@$#124!202?Q-#11!4@!5BFFEEMMMKK[[[Wwww!5o!4_#21???_#109_#104_#113!9?@G?@#103!36?O?_??A_GTaCOHaC?cG_!5?O?g?_?OiCPIpCA@#119!64?`Gs#71?T#94r!7?b!6?@??C#136A#5?O#9G#16A#4@!97?@#74@#73@#37?@#4!26?C#11w}M!5FM{!4?_w}^F@#191@#150??O!5?C???O!5?PA#11@BFN}{o#1@GASh?iT?iPCaGT_IPcAgT?O!6?HQcHQ`SI`SAgDOI`SAhCQHcQHcQGdOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQG$#0{[{gWwO_ooo_???_#37_#103!4@B?@A?F?E??C@?CB[?JC_@SOoO_C_???CGoCOk?ShCaHOdIO@?_C??_G#175!118?@#90??C!7?[#51???G!9?C@#22!129?O#9A#94@#19@!7?O!7?G#37osL?GCA???A???GK!4GK[Wo_#87O#25@#3@#6G#9O#102!22?C!4?A#65_$#8A#1_?O_?gO!6?_#21O#58O#48_#106A#91A!8?G#105G!4?O#53!162?G#12Z#11~~!5?~~~___!4?|~NB#23!130?G#13C#87?oWgWgwO#3@!8?_#195G!4?G!4?G#203_#191!9?@A#152G#170G#204_#164?A#108C#51_#3!22?A#11@N~w#7O$#57?A!8?G#102O?_#22O#90@#99@#108?_#142_#51_#19_#96BA@B?F@AFJMNJKB^SZ^}jnNn^z^}v~yvNznR~jUz\unYtn}~^z~~^v!13~n~^~~|^vi\znu\z~Zv^!5~n~V~^~nTzmtMz|}!64~]vI~i#136?c#19??~!7?O#37C???G#41A#164??_#17O#59!130?_#12???_O_O?_!8?_#146O#181C#93???_#199oC??Co!5?__??_#149?_#167C#193O#23!27?@#51C_?A#27G$#51??A#17C#40C#27C#69C#6C#12C??@!4?AO!7?G!8?_#41!167?@#103U#2Q#7!4?C#46@#0MMMO!4?_sS~iv\mzTmz\uj\uzlUzlvYlvYlv\iv\ju^ti^tmZ|Vi~Tmz\uj\vynT}j\uzlUzluZluZluZluZluZlvYlvYlv\iv\j|VlzV|Vmu]iu\jvYlvYnt]j|UzluZlvYlvZmtzA@!9?AJ}LB!5?Gq~DB!4@?N|}B@AFFFA!7?BMv|jU~Ti~Tmz\vi^tmZ|Vi~g_???@^ulZul]jt]j|Vynt]j|UzluZluZlvYnt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlv~$#25???A#85???G#68G#41G#13?G#5@!4?A#89??A#25C#128?C#109C#104C#13G#14G#113?D#44O!4?_#98!166?C#127h#28@#20!4?B#61G#108O#12_??_#58!143?@#7AG#152_??C!5?A#200!4?GCC!9?__#151??C#22!30?G#136O#25?C#87_$#73!12?_#20@!8?C#99!7?G!4?O#107!166?O#50?G#85!5?A#154@#138O#25_#1C!5?Gi?TGaPCiPCaHSaHCQhCQGdQGdQGaTGaSH_IT_IPcAgT?iPCaHSaGDOi@SaHCQhCQHcQHcQHcQHcQHcQGdQGdQGaTGaSAgQCgAgOG_TGaSGdQGdOI`SAhCQHcQGdQGcPIC@!10?@C@A!9?A!5?@OA@CAD#44!36?A#52??@#123C$#118!12?O#28O#34@#58!16?O!4?_#124!165?i#141?C#146!5?O#34??@#60A#57O#136!145?_!4?C???A#201!5?OgWo#86!43?O$#136!12?G#76!19?O#97O#194!170?_#47!8?O#172_#58@#108!145?C#17O#48?O#5O#86@#170@#202!8?_O_G$#197!214?@#77G#188!148?_#52G#186A#151!10?A?A$#198!378?A!5?_o!4O?_-#0~ZulZuntYnyVznZvymVznZumYyWg{kWgwWw_oOo!5_#4_#2_#96!4@ABABBBFENFNNJ^VZ^^!7~v~|^~^~^~n^vnv^n^nv^~n^~n]|Viv\f~jvylU|iV|zUlZulY~m!68~}rI!6?Z#141~#56_#13???C?A??C#52???E#0~tZmtZluZlvYnt]j|UzluZlvYlvZmtZmv\iv\mzTmZ\FIDFBA@???@MFLI^\]JMDJMLZ~ylVynt]j|UzluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\vynT}j\uzkwo?!4_ooOw]@!4?o]GMNJ]GwgsWW?^?o!5?_oc[u[w!4?Fv|iV|mZtmZ|Uj|UzlvYluZ{_???@\vylVzmtZmv\iv\ju^ti^tzmV|iv\mzTmz\uj\vynT}j\vynT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZlv~$#1?cHQcHOIdODgCOcGDPgCOcGOcCcS?OcO?_?O?_#14G!7?A???C#99??C#43G#163C#109G!4?O#130_#121_#91?_#33_#99_#175!126?@G#28C#90C!7?]#87???O??A#34C#190O#139???P#1?IcPIcQHcQGdOI`SAhCQHcQGdQGcPIcPGaTGaPCiPCAGDA??@!5?@GAD?A@C@AC@AC?DQgDOI`SAhCQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaGDOi@SaHCO??_!6?_?_!6?_???S?SCOGC?I???__!5?O_G_!6?GATgAPcIPcAhSAhCQGdQHc!5?AAGDQgCPIcPGaTGaSH_IT_ICPgATGaPCiPCaHSaGDOi@SaGDOi@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQG$#3!22?@#9@#52@#20@#12@!8?C???@G!7?C!4?G???O#5O#106O!4?_#119!130?C_#94B!7?@#12???@#40C#7O!6?_#168!41?_#52_#19_???G!4?O#57O#94O#50O#44_#37O!8?O#68!64?A!6?O#57G!5?@#25??C#60C?_!9?C#149??_#38?O#195???O?@#152???@C#11B^}o#20_#10!22?A#11@N~w#3C#68_$#4!26?A#11!5@!4BFFFEEMMMK[[[WWwww!4o!5_#71!134?P#67w#12R#11~~!5?~~~?```bb~~~#176G#68!43?O#11__ooww{}c__#68?O#26?_#108_#152_#60OOgo_?_#9!63?@#11@BEKKKCEFB???w~^B#69@#151??_??_#150_!4?a!7?_?O?@#170???@C_#136@#3@#65G#59!22?@#22G??@#7O$#129!27?A#70A#7A#5A!8?G#43@#76@!5?_!7?G#34!4?O#136!137?k#19??~!7?G#41G#49CG#55G#208G#22!48?O?G#206C#21C#23A#20A!6?_#17???_#4_#102O?O_#19!65?A#18C#87@BABB!8?_#86_#205A#198???__?@A??A@__?FGO?O?GC#192!4?A#60_#27??A#94O#51!23?C_#12?C_$#110!31?C!8?O#41O#69O#89@!8?C!4?G!4?O#98!139?N#103C#18!5?_#58O#112G#51O#57O#13!50?O#87???C#4@#27@@#110A#165!78?C#183G#12G?@?G@??@#80@#2C#5A#108??O#200!8?@!9?LNNNB#93G#204!5?G#35??C#136!24?A#87O#182?A#53G$#87!31?A#67C#139C#58C#64G#141G#120G#73?O#91??@#20O#44Q#58A#94_#97A???C#99!150?O#127_#20!5?A#77A#71?C#95!51?G#18!6?G??_#184!78?O#22OO#71O#23??G#37G!7?G@VPO?@A???_?T?^G??_?_??IB@A#209?O#173??G#152!24?O$#124!44?@#71@#6??_#103A@?@?C??@?G??C?GC!9?G?A_?_?_?O_GOG_O_OG_?O_?O`AgTGaW?SGDQhATgAChQcHQd?P#124!76?_#136!68?A#165G#14!87?C#81A!5?G#202!9?@?@$#104!48?A#13C#188!222?C#54!88?C#26?O#207C#195!12?A#199A!6?FAO??CA$#87!49?_#53!313?G#203!13?C#201@$#118!363?A$#164!363?_-#0~ZulZulZ|Uj|UzluZmtZmv\iv\ju\mzTmz\uj\vlYvynYtnt^ks]uks[g{OwWwOoOoO_?___#96@?!4@?@@?FFFCNMNDJH]Z\}j|Ulj}djudJ}|e|ivmXvlZtmZtmZvn^~n!66~mO!6?P_#22@#87_??@E?O#5A?A!5?_#36_#50_#62_#79!11?_#62_#68_!6?O#11___!4owwW{{{}efbB@@@??@@@!5BFFEEMMKK[[WWWww!4o!5_#17O#51_#77_#10?_#24_#60!55?A!7?C!6?_#195!7?AG#86!11?A#11@BA#3@#22!23?@#11@N~w#4C#102_$#1?cHQcHQcAhSAhCQHcPIcPGaTGaSHaPCiPCaHSaGQdGDOdIOI_QI_GOG_S?g?_?_?_?_?_#22O#109@!4?A#13?C???G#116G#90?G#44O???_#121_#106_#21_#175!102?P#28C!7?C#90G#18O?G#12w?K???_g#6?@G#1@ISPGATGaPCiPCaHSAHCQGDOI@CAHCA@?A??@#43A#108@??G#20C??_#0O???cowWwg_OoO!7?@?ABBBABDEFLMFLJU^TYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZmt]jv\ju\mzl@!4?Wv\w__?_??@@!8?IJ|vYlv\j|V{Wooo^mzTmz\uj\vylVylv\iv\j|k!4?B]tj]tzlUzlvYnt]j|UzluZluZlvYlvZmtZmv\iv\mzTmzUlzUntYnt]j|VylvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZlv~$#84!49?@#108@#36@#51@#19@#18@#11!4@!5BFFFEEMMKK[[[Wwww!4o!5_#104O!4?_#127!101?@!6?IH#105Q#42!6?G#2K#59O#16O#190O#0??@EDJMV|iv\mzTmz\uJ\UZLVYNTMJLEBDEA@B@#146A#74@#18A#35@#87@!7?@#53A#57A#19A#50C#37_?OO??_??_#23@!7?C#3C#74C???G#57O#22O#19?_#17!60?G#13A??@#37D!5?_??`WA!6?@BP#192!10?@#152C#204C#12@#27C#152!23?A#12A#5_?C#13_$#47!53?A#50A#94A#76A#13A#3C#107C!4?G#8G#20G!4?O?A#128A!8?G???O#109O!4?_#119!102?i#56o!7?C#69!6?C#51O#66C#91C#9???C#39G#29O#40!17?_#82_#9_#181_#76_#6_#25_#98O#139O#13O#50G#36G#174G#12G??c!7?_???@#73SCW!6?_#42G#51G!9?C#15C#20??G#1CA@?A@GASH?IDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPI`SGaSHaPCQ!5?aGa!7?A!9?csAGdQGaSAg?_G??_PCiPCaHSaGDQgDQGaTGaSAO!5?@IS`ICQhCQGdOI`SAhCQHcQHcQGdQGcPIcPGaTGaPCiPChQChOIdOI`SAgDQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQG$#136!58?A#77?C#7C#30G#12C???G???AO???c#35?C#97C#18G???O#20?O#119!4?C#67!105?N!7?_#76!8?A#129G#80???A#57O#37!31?@#15C#51C!5?G#91O#107O#24G#62G??GG#60O#30?G#94?C#21C#6C#44C!7?O!7?G#37@#176G#108G!8?_#62!57?C#19C#11~~#6A#198???@CG?GL??wA!4?@?C#170!12?A#13?C#46G#15!24?G#87O#9?@#23G$#43!62?C#135G#25???@#58@#76@#21O#89@!4?A???C#12!117?|#11~~!5?N~v?xrb``@F~{o_#101!31?C#65??A#58!4?O#118?G#67C#5a#59A#79CC?g#84?C#65!4?G#82G#12?@#85_!5?@#50A#60@#73@#2!6?G???O#65!61?_#51@#7??C#150???A?!4OM?C#24!22?G#108A#51!24?C#57??A#52O$#84!67?O#87G#5???A#103@!4?BAAB???B?@?ICQ@CA@SAhQS@YSHYs@AXATGPeGQcIPcIPcGO_?O#136!69?A#44??C!7?E!8?A#161!44?O#63O#78K#28A?A#13!11?@#1_#146O???A#87??_#12!6?O#43O#68!64?O#87_#57??w#199!4?@?KDA???[!4@??o#60!40?_$#129!68?O#210???_#99_???A???C???G!4?O#19!110?p#41O#71_#141Q#114!9?G#206!49?C#102O#61G#10A_#17!11?O#57@#22@#7O?A?_#136!75?W#200!7?A!8?{}u}y{#82!41?O$#36!74?_#51_#25!125?I#98@#103C#77!62?_#1O#170!12?G#129O#18?A???C#151!83?G!7?@$#124!202?m#41!64?_#102!15?_#19A???c#149!82?O#202FBA!4?_A?G?C$#68!284?@???A#85!86?_OC$#54!284?_#4@#142_$#28!285?_-#0~ZulZulZuntYnt]j|Vynt]j|UzluZluZluZluZluZluZluZlvYlvYlv\iv\mzTnyVlz\vlZ|Vj~v#3C#12H#11~~??!4@!5BFFFEMM}{[K[[!5w!4o!5_#87_#69??_#98?_#119!72?Ad!6?[#71@#18?S!6?@#114_Sg?_O?O_#12@!5?O???_G!4?@?O_#48O!4?GOC!4?A???O#2A#67A#160C!4?G#122W!7?_#37@B@?@???@?GG?M?GSKo[gwo_oOO#91G#47_???_#5A#1@??@???@A?D?A@CI@SAHCQHCQhCQHcQHcQHcQHcQHcQHcQHcQHc_!5?ASH_IS_G_G_!7?_O?iPCaHSaHCQgDQGaTGaSH_IT_IPcAhSAgDQGcPI_O!5?AODiPCaHSaGDOi@SaHCQgDOI`SAhCQHcQHcQHCQHCQHCQHCQHCQhCQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQGdQGdQGaTGaSA$?cHQcHQcHOIdOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaPCiODgQCaGQcAgS?G#39_#44u#87??@@!8?C!7?A_#34_#8_!4?C#105C#44G#7?G#97G#89G!4?O#175!78?G#56b!7?~#20???I!9?C!5?@!6?@@!9?G?C#54O!4?a#151OC_#31@#55_#143G?C#63G#73C#25G#44_???C!8?O!8?O#38?C?C?C#1O#25@???A#18A!8?G#188@#87A?O???_!6?O#60G#7O#22O#101O#17O#51_#77_#108_#10_#3!30?@#12C??_#4O#37!7?@BCO_!4?__WB#139!40?@!4?_#17!35?_#110_#101_#88__!4?_#152_#68_#73_$#64!76?O#58???O!7?C#19C!6?O#144@#100@#99@!7?@C!4?G#21?O#109O!4?_#41!75?O#12}#11~~!5?j~~!5?@@@!5BFEEE!4M]]UU!5ueefNF!4B@@@!9?``pX^NFBAEEEC!4K!4W!4o!4_!5?!5@!4BFFEEEMKKK[[WWww!4o!5_#25_#60!34?G#6_#11~~#7@#79G#150!9?@G#199N[WWO?C#151C#203C#68!40?C#11B^}o#9O#82!40?__?_$#108!76?@#20???i??A#5A#103G??G#89?G#109G???O!6?A#107A#13C#71@#127A#18!5?O#5O!4?_#89!78?K#44@#19??f#98C#28_#103q#5!4?@#118{oC?C???G!4?O#5H#18G!6?G!7?@#57?O#116_#2G?_#64_!8?O_C#12@?O!6?D???A!7?_!8?_#17O#52@#93A#46_#71A#42A#7A#114C!8?O#139@#76?O#17@#7A#0@@?BBBADFAFDMJDMJ\UZluzlUzluZluZluZluZluZluZluZluZ!5?F|ju^tj^u[o!9?g~Tmz\uj\uzlVylv\iv\ju^ti^tmZ|Uj|VylvZmt^g!4?F|nyTmz\uj\vynT}j\uzlVynt]j|UzluZluZLUZLUZLUZLUZLuzlUzluZluZlvYnt]j|UzluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZlvYlvYlv\iv\j|~$#110!76?A#116???C#96ssWw_Ow_oooOO?_!4?@???A!5?@ABADMHAPR]L^m|~~~^~~vn!62~|Q!6?B#127K#58!4?o#66A!5?C???G#87C#59G#76G???O#43O#158_#35@#51@#58_??@#5G???G#0???O#1O#22C#17Go!8?A#20@#10A#90O#83G#42A#7A#56_#54_#21G!7?A#0@@??ABA?C??@??G?A??OC_O?G#21C#13C!8?O???_#51C#36C#83C#65C#6G#139G#9G#2G#121O#65!38?A#44G#25??O#110_#60!9?A#198FO!4_?G#108!42?A#146O??A#65G#129!42?_$#114!76?G#119!4?G?_CO_?OG??_#43G?@#20_???A!4?C!8?O!4?_#25!81?W#124z#116!6?C#76@#211AGgWgO_Og_???_???_#56?_#139_#87?G!7?G??C#71_#61G#137O!4?A?C??C#49_#51!4?C#70?O#118_!7?_#22A#32A#19C???G#30C?@?K@CA?GCG!9?_#20?G@#101??@#143_#138_#94_#21_#123A#84!47?O#87B#35??A#200!13?BFFNNB#25!43?C#87_#18@#12G$#70!81?A#34A#127C??G!7?_#25!4?A#163?@#103@@@A@ABFEDC@I@ALMK@Q?PA???_??GO#212!78?KoC#120A#35A#25A#84G#69C#65?O_?_O_#7@?@@#6!4?@??GG#43G!8?A#36A!9?_#114!6?O!4?O#10P#33O#85@!9?C!6?O!8?O#48G!4?__#146!4?A#82A#95!48?C#174O#51??C#195!17?O?B#35!42?G#51??C$#175!82?G#18??A#36C#76C!8?@!4?A#58_!6?G#119???C#71??C#117!94?@#44@!7?C#119G#64O#45??O#206__#25!7?G#13@@#44@#136OO#109???_#73G#101?C#39CGgScIA?A?O#55!8?_???__#39@#52O#206_#68?A#42?C#71C#65C#47A??C!8?_#73G#129??C!8?O#58!58?G#38!18?O#82!43?_#168??@$#100!85?C#21!6?G#175_#12H!5?O??C#92!108?A#55O???O#70!8?O#21@#38!21?_#72OGGo??G?IGC!6?O??O#20G???O??C_!6?O!5?@#49A#22!5?C!8?O$#124!94?O#99!118?A#98???C#79!31?C#28A#13@#8@#41@??@#69@#211!10?_#6@???A#83???_#61!4?@B??AAA#2@#33@#139_#188_#137!7?G#12?C??@!8?C???G$#112!254?O{CO#80!11?O_#98@#87G#64_#182!8?G#70G#48AA#26?O#9O#75O#58_#38!11?_?o???_$#114!254?G#40!14?_#36@!7?_#107!5?G#80G#64??@#40!13?G#41G#39?O#44G$#129!254?@#71!14?G#8G-#0~ZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZlvYly#3P#12l#11~~#43A#96v^~ItITzNyTNjnz#6O#11~~!4?~~}!4?!4@!6BFFEEMMKK[[[WWww!4o!5_#12_#97???_#56_#119!44?O?^!6?a#28_#33G#18W??W#211@@AB@E@C!4?AKCZVjViNYTG{c[u??G#72_?G!8?_#114_#40_!7?A#72A?G!9?_!7?AA??C???GG?OOO?__!5?@#38@@A???CH??G#15_#20@???A#138?C#94C#128C#73G??_!4?_!4?@#15?C#1A?@?A@CA@CI@CAHSAHcO!5?BCQGdQGaSAgDQ_GCQgATGaSH_IT_IPcAhSAgDQGcPIcPGaTGaSHaSHaSAhCgPG!5?@QCgDQGdOI`SAhCQHCPIC@A??@#22A#18G?A??_???C#36G!5?C#57O?C#33O#139@#27@#83O?_#59A#2A#1@A??DAGDOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQgDQGaTGaSH_IT_IPcAhSAhCQHcQ@$?cHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQD#46A#44Q#58??|#119G_?tItiCoDiOS?C#20N#19??w!8?@#184A#53A#128A#13A#12A!4?C!7?AO???_#119@@???@!7?O???G???O??_#175!39?_!6?C#71G#100O#12???_!4?O???_#63OOO#115_#122?O#212!6?_?A?G#20@#5@!7?C#58?@!9?A??G#0C#55CC?FHEAK??@C^HO?O_G?O???g?G!7?_#28@O#37@@@??!4ACC?CGCGA??MSWC?OG?O#43C!4?@#108O#8O#20O!5?C???G#21G!8?_#22_#68?_!4?_#11N~}o#20_#102_#37!10?!4@#102!45?@#13@O#6?@#9C#17_#79!16?_#26_#71O#11_oOWGGKCCCeEEeeea!7baaaAAAECCCGGWOo_#10O#23_$#55!76?c#175!15?_?O#58?_#5??C#22gw#36B???W#0{Swk[soWwWwoOoo!4_#41@?_#8A#6_#99A!4?E???G!9?_#56!46?N!7?f#20???B!5?O#26O#80@?@!8?_???_#2@#67@!4?A!9?O!4?A#88A!7?@#114D?CG??A?W???LGC]eW_SWo?ocoooO_?_#35G??A#21O???C#6_#75C#13G#57G#22G???O#18_#19_???@???A#12!4?C??@G???O#14A#59_#7_#44C???G#94??G#50G!8?_#9!5?G#136O#18?@#26A#62C#27!61?C#11F~{#10A#87!19?_#17G?C#53C#25O???G?G#87_!4?@O!6?@!8?GC#51C???O#12_$#123!76?G#12!22?@#70BE#26G#87??@???@!9?C???G!8?_#14C#127A!6?G!6?O??_#41!45?O#12g#11~~!5?f~~?Oooo!4_#65BCIF?B#8!11?@#12??@??A!4?@!7?O#41?A!5?G#31G#80A?A?H?DNAX?C_O_!5?C#66A???C#91?C#20C#40G!8?_#41_#39@!9?@!8?C#66!4?G#89G#69G#58G#55O#139@#27@#87A!5?_#45?C!8?O#25_#6_!9?_#87??G#88G#62!61?O#12G?A#19_#58!20?O#146G#5_!5?AG#19O?G?H??C!8?@!4?A#0@@@A@BFILVynt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZmtZmtZnyTnyVl}jT}j\vylVylv\iv\ju^ti^tmZ|Uj|UzluZl}~$#25!99?A#59O#109@#34o#42???C#20@#1gCO_GG_?_??_#42G#51G#44@!8?C!8?O#58O#76O!4?_#89!49?_#44V#5??_#124~#103O#127V#43!4?CG#118CCC?GG!5?OO_???G@?@??AAA??CC#138C#71C!6?@!5?_#97_#2@#25_C#9C#26A#118??G!4?OOO!5?@I@??A#76@#6@???A#44A#18???@???AG#94O#48_#43O#47@!4?C@A@A??CC#0QOOG_osg_wgoooO!4_??@@@?BB@BEFDEBLMJDMZ\UJ|uZn!6?ZlvYlv\j|Vyk]uylV|iv\ju^ti^tmZ|Uj|VylvZmtZmv\iv\ju\ju\j|UzVmu_???@]lzVylvYnt]j|UzluZMDBE@BB?@@#78@#76O#67@#44WOO!4?OO#91C#140CC#32G!4?O#71O#90_#14G#7A#94O#119_#41_#42_#5G#9G$#90!100?C#69?C#52???_#55A#152A#3!4?C!4?G#19???G#88O#76@#97@#13O#96@!4?A?@B@C!4F!4N^^NV^^~n~~^!37~n~!7?H#92!6?C???G#98??O#66O#51_#34_#89_#66!16?A#11@@@BBbb}]MM!5K[[[]qrpoo!4_#13_#65@??CA#64_#143??_@??A???CC???G!6?_???_#12S???_#137??@#30C!4?GC#36@#23_#3_#1C???O#61!6?O#101???@#13A#28_#70A#23A#5_#46???C#18???O#13O#7O#146O#65?O#73O#15!8?C#98???@#120O#139!61?A#81_#51??O#13!22?G#91_#20C#12C???_!4?OPO!8?@?_?C#97G#99_#43G#188???C#73C$#76!106?@#23!7?C!4?G#61??O#134?O#37?_#5A!8?G!8?_#19!55?M#87!8?_#76G#55@!5?C???K?B??S?O???c?O!4?O#206G#28_#80O!4?_?_#39@?@??@#18??H#94!6?O#211@C!6?QAC??@c?G_GO?O#19!4?C!4?A#77?A#107A#10A#93B#34_#67C#87G#61???A??AA#4O#7_#74G#55?A#82A#60G#149G#17!13?@#68???A#24!8?G#35!13?@#117???C#152!62?G#52???G#41!24?_#14O?A!4?@#13G?G!4?O!7?c!6?O?_$#94!106?A#15!8?C#57C!8?O#46?_#103!4@?A???A#34G#90G#120???O#89O#25!56?P#213!8?A#214A#42G#16G#114A@EIGIDG@_Gcg??CoCIO??_G{g_OG#6_#69O!7?O!8?G???O#141?O#212O#14_#42_#107_#10_#84_#210???A??O?K_???G?G??_?_#14@#146@#25G#68@#129!11?G#85@@#50?O#66@#41@#93C#142???A#112!14?_#125!26?O#10!96?A#108_#94O#139_#88@#8?@#43?@!7?O#98G!5?G??O?_$#43!117?C!5?@!8?C#144?C#18G???O#212!74?C#216!24?O#14A#143?O#109C#21C!7?A#120A#63@#122!14?A#49G#141!10?@#70@#12??@#11!4@BBBAEEECCKKKGWWWO!4o___!6?!4@!5BFFEEMMKK[[[WWww!4o!5_#139!10?A#107!96?_#140O#205_#193O#20!7?G?C???O!4?C#89?G#152@#102@#124O$#106!128?A#139_#100A#56!4?C#20?G!8?_#38!97?G#18O#76?_#20O!4?O???_@???@?O#41!21?A???C#118??O#5@!8?C#44!7?O#35O#102!4?A#22!155?G#128C#108G#215G#58?O#133GGG#154G$#70!245?G#8??@#68_#19A#22O#48@??@#52!31?A#127!6?G#120G#80?O#114!13?G#48A#153!161?G#34!4?CO#134O#172@$#49!250?@#51A#76!228?C???_!4?O$#83!250?O#64_-#0~ZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZlz#3@#12~#11~~#43T#96L|viSzi\izTd]pY#6Q#11~~!4?~~~#8r#0}vlYvl]jt^i|VyluZlv\jvZms]ui]gwWw[gwWgo___o!4_#68_#96@@?@@BBABE@ADFJ!4N!4^~^!6~nV~v^jrzDqG!7?O#57_#18@#58??O???@#12@???A???c???O!4?C#211@@ADB#72C!8?QP#80N@C?W?BaGA_WKGG!9?O___#71O!7?C#5G#116G#34G#56G#212?G#26O#41O#210@??A#28_#66_#49??@???G?_#48A#20@#5@#11!4@!4BAEEEC!4KGWWWOooo!4_!6?!5@!4BFFFEMMKK[[XZ^ww!4o!4_#87_#5_#7_#181_#108_#86_#73_#22!46?@#51G??G#17O#108!13?_!7?C?@#6O???A#128?A?C!4?C#90?___?_o_?ogg???C#33C}{?C#18@#53@#0@Ef|Yvl]jt^iv\mzTmz\vi^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZmtZmtZnyTnyVl}jT}j\vylVylv\i~~$#1?cHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQC#10K#58???i#119q?GTjCTaT?iW`M@#20g#12??T#22~Y#21O#36???K#1@GQdGQ`SI_TAgDQHcQGaSGcPI_GS_SCcC_O?_O?OOO#12@G??AO???C???G!4?O#99G!8?_#127?_#119!6?Og?G_SKCyDv!6?s#141G#67A#13???@#211K??Go#55_?G!4?G#25@?_?A!6?_!9?A#175A#36_#9_#49?AAAfzOC?SKC_#69@#20@#12@O?_!5?D???A???S!8?O#217?@#44?_#216G#21_#80GCAGIS?W#72@?AA?A???C!8?O#40O#5A??O#0@ABA!4?C@CHCEY][Ws{[wwwg_!4o!4_?@!6?@A@BAFLMJD]J\UZluzlVylvYlvYlvYnt]j|UzlvYnt]j|UzluZluZluZlvYlvo!4?NntYntZmtZnyTnE#12Go??@!4?C???A??@#44@#121@#109?_?_!4?O?O#130@#11@@@BAECw!5?@A{#7C#1@WAdGQ`SI_TGaPCiPCaGT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcPIcPIcODiODgQ@Si@SaGDQgDQGaT$#46!76?q#103!5?A#175!7?C?A#103??_#58@#19??A#90?c#69J#68!28?@#2@#22@#69@#58@#12@#11!5@!5BFFEEEMKKK[[WWww!5o!4_#18_#44_#58_#7_#94?_#175!18?G!7?@#179@#90D#35???_#217_?O#213?A#41A#91A#174A#66C?_#20C??@???A!9?GC#35A!4?_#70@#118???_#40G???G?_???_CA#11`pXHNFBBAEEE!4KGWWWO!4o!4_#225??O#94_#40!9?@#107@#91@#158??A#22A#210OGO_O?o#76?@!8?_#30@?@EC?I?A#73A!5?G#134A#76A#13A#18A#57?C#17G#12C???G!9?@!5?O#6O#21O#165O#101O#17O#68!51?C#87A?@_#101_#71!13?O#18O!7?O!6?@#8O#20???@?@@#13???@#25@!6?C?G!9?_#62_$#127!95?C#117C#25??g#134?@#139c#64!33?A#83A#8A#20A!4?C!8?O#99@#51A#70_#127@?A#35C!8?O#34O!4?_#41!21?C!4?O#28Ge!5?@#114WGcKWgo?O!7?@@?_@!5?A?@!6?C?O_@_???@!6?O!6?__??O??_@?_@??@@@DA@BBAAMFJDILUpAQFwcs[SwO?Ogo??Go???_#211?___#37@?@!6?@?BCGGC??C#141A#75???C#58??C#46G#41G#36G#20G#25@???O#219A#70_#136A?_#94?A#78A#1@??@?A@CI@SAHCQHCQgDQGdQGdQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQGdQGG!5?OIdOIcPIcODiO@#11_MB@!4?_wKEB@@#116!6?@#134?__!9?O#89?O??@Q?A?w#208_#87A#19G#78G$#5!140?A#87A!4?C!8?O#7?_#13_#121C#91?C#119@?@?@??C#100?O#124O#89!24?G!4?_#103A#109?G#121???I#65A#118EcQ?COCw_OG!6?__@?AA#71C#55A?@@!7?GM?[WD!5?@???C!8?O_!9?A!4?A!5?@??C?@?@CgG_CQ!4?C_G??_!4?_#94?@!6?_#15C#13_#61BA@@A#38C!6?A#44@#39!12?O#35@!9?C#63?C#102E?C#62G#171!55?A#11@~}#9A#122!14?G#56A?_COCA#104G#43G#140A!8?_??_??O?O?O??O?G!8?@#44@#58A#125??A#84O$#46!141?C#108C!8?O#8@#94@#71?_#109?A#124A#136_#67??C#25G#20G#103C!7?O#98!23?@!4?D#140??O#72!4?O#143_!4?C#89??C#222G#34_#94O!9?_#36C#80@#18_#63C!8?C#122!5?O#110?C??C#64?A#28@!4?I#211C???O?O#75G???@#64_#143_!5?A??C!8?OO!4?D?A@G?GCg[c??GG???OO?_#39@#1@@#2A#47A!6?A!4?@!8?C#71!9?O???_#139A#87CC#161??@#126?G#36G#9G#125G#19!57?C#25??O#20!15?C#57@!9?G#42_!8?OO!7?GCC#12A!4?C!6?C?O$#36!143?C#19?C!8?A#98!8?C#175?ACA#5O#56!28?o#12J#11~~!5?}~~!6?!4@BBBAeu]M!4KGWWWOooow{meB@#3!9?KOaG?_OO?C#39C#6G#76C!7?G!7?C#59C#18G#122C#137!22?_#35!4?A???C#13C?@#20?G#71?O#57A#14O??C#28?C#118C#79C#42G#71G#40G!4?@#41@#94_!7?C#53!8?@#10@!8?C#73??C#27!58?_#52??C#102!15?@#36?G!9?W__?_???O#105!7?_#44@#36?G#94_??O!7?A$#61!145?G#129G#22G#21G!7?A#76!8?G#120G#56G#218!29?A#44S#5??y!7?C#94?@#69@!7?C#72O#18@#67G!6?A#87O#6C#19??G#51G#76G#212CA!4?CG#46!8?_?O?P#72AA#118A#65A#122G!8?_#20@???A!5?_!6?O???_#12!19?A!4?C???G!8?G???O???_#4O#69_#34@#20@#54_#77!14?O#18A!6?E#176!63?O#88??@#19!17?C#89__wWAB#5?A#97o!5?_?_???O?O#57!5?A#43A??@#67_#5A?O#153@@?C$#58!149?G#25@#18G#52O#130!45?_#25??D#124I#206!9?A!6?G#44???OG#15@#45@#14O!5?_#79!6?@!4?O#123!10?@#22???@#181?_#67O#94?A#139A#25A??C#13C#56?G#26@???A#43O#115A!8?G???O#66!20?C#108C!4?G#70!4?O#22A#44?C#182!4?G#58???O#1G!9?_???OO#51!7?O#174A!7?G#94!82?O#41WC?`@#90C#21?_#35@???A#142!16?G#221C#20C#91?@#41@@#35G!5?G$#65!150?O#116@#56!74?_#84_#52O#143@!8?A#8??@#16O#66O!4?_#87!14?_#18???S#8O#21G#101G#224G#54??O#98@!5?_#211@!4?@AC??C?O!7?_!7?A#80!5?O_G??_!5?_#87O#139!9?O#98O#10O#6_#28??_#114A#80!16?_#176?@#14_#13_!87?A#67A#34@!8?WKCMIMMKEICCC?CCA!5?G!8?O$#26!229?A#5O#115A#58!9?O#87@#12_?@#100!21?_#63_#19!6?G#97?O#48@#72@#138_#6C#118AA?A??C?CKG!5?O_#8!16?C!4?G#179!6?_#84!33?@#105!92?G#107A#33C???@#58?C!6?@!4?@@@#226!5?O#14!4?_#97A#13_#104_#188??G$#35!229?O#160?_#126!10?G#6C#5_#40!30?O#57??O#188A#210?@#77_#170?_#18!34?@???A!8?_#109!125?_#220!5?W?OGO!4?G?IIIMIIC#21!6?O#193?A#108G#196??o$#85!243?G#222O#115!74?G???@#134!134?O#69!5?C!7?A$#223!244?G#91!220?C_??OO-#0~ZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j\EB@AFDEBDMJLEJNT#53_#12J#43??_#96vz~KPiQ|iT^_eHl#6H#11~~!4?~~~#36m#0V}Tj}TznYtnYvl]jt^iv\mzTmz\uj\uzlVylv\j|VlyVl}jV|VE#44_???C!5?A!8?@???O???_#19c#96B?A?A?EC#131C#28C!9?_??A!9?@#20@???@#141@#217H#143@_!4?@!4?A#13@#12@!6?G@!7?CO!7?O???_#80@A???KO@??AAA@!5?_?GG#118_??G!7?@#55_??@@#25G#20G#210@A?FCB?W?K#211[?RopaPq?B!4?CG?C?G!7?_#41O?A#74@A#37@!4?CCDHEDCG?O#61O???__?_?o??O_?_?_#19A???_#20C#83?C#68C#6G#81G#22G???O#101O#19_#182_#15_#108_#10_#62_#4!21?C!4?O#65!9?_#56O!6?@!6?O!7?C???A?A#57?_#13G!8?C#109CA#36O#43O#56A#58?C?_#17?@#0FLzulZvylVynt]j|UzluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj]tzmTzny~$#1?cHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAHCA@?A@CA@CAHC?I#86M#25C#121??^#119GC?rmTlATi?^Gu#127Q#20c#12??~#22~@#21J#77???P#102g#1@iS@iCOdIOdGQ`SI_TGaPCiPCaHSaHCQgDQGaSAgQDgQ@SgAg#4O#16C#11w{[XPppp```!4BFFEEMMMK{{[WWWww!4o!5_nfow[KMNNxw!8owKEBB@#2_#48??_#210O?A?C?C??CCC#39O#11@`ppZNF!4E!4KGGWW[}vrp!4_#143G!4?A!5?OOHG!4?_!8?__OO??_???A?AA@AD#80@#44O#216G!6?O#92_#212G?GA#55?O?C!5?G#80GGOg__oo_O#18G!7?G#13G#7G#73AA#72G!9?G!5?G#13C#12C???G???O???C???G#2???G#13O#57O#79??O#86!26?A#5C??O#80_#5!10?_#11_w[MG?OO__?@AACC!4G?!9O???GGGCCEB@?__oOWKN[o_#1ACHQcGDQgDOI`SAhCQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHS`ICPiCOD$#22!59?_!6?G#87O???_#5_#52?_#16_#88O#136o#175!13?_?P#117??Q#90!4?S#139s#60!54?G#19O#129@#6A!7?O#18A_!5?@!7?_!9?O!4?OG???Q!5?G!8?_#5_#1O#36_#225O??_#55??_??AC_O?w_O!8?_#6@#21G???A#222_#16A#75A#40A?@#76@#121G#15C#118C?KI@C#13_#64G!5?_#210?@?@?E!9?GO!6?_#18G#58A???C#34C#40?C#21?G!7?_#118O!4?C??GD_QAGOo#11!4@!4BAEEECKKKGWWWO!4o!4_!6?!4@!5BFFEEMMMK[[[WWww!4o!5_#171!27?@#12A??_#4!12?C#20C??A!7?C#109G??@???C#106?_???G__#34?_??C#116C#12CG!8?G???AG#9G#7_$#12!60?_#11_!5o!4_!7?~~#94!21?i#68!55?_#51G#170C#8@#12@A!4?O!5?C!7?A!8?G!7?M?O??_!4?C!8?GC#13?G#99G#63G#206G#49!6?OO#211?A??c?G#107?_#5_!9?G!4?O??C#87_#90??G#116A#212C??A@#211O#7_#36_#83_#66_#49@ASJS?C#51_#11__oWKCB!4@BBBA!4ECKKKGWWw!5o___#141O!4?_#80!4?_#2???@#90@#143A_#12@???A!4?C!7?S???_#59??G#82G#25O!8?@#39O?[O_!4?O_#87@!9?_!6?O#73G#57!31?O??C#42!12?G#171@#18aOCG?_!5?C??C???W!9?OOG#19O#215_#91O#21A#25A???_???_???@?O#125O$#129!60?O#6O?G#20G!8?_#152??@#102!80?@#54@#189A#87?A?_#58G#216CC!8?O#114_#61_#71O!5?@#119@B?@@B@B@BHB#20O???C!5?_#21?C???G!9?A#40!10?@#71@#61A#62A#7@???A#25A??O#72_?O??__??_#86@#7C#175!5?G#10A#227A!4?O#112!8?c#141_#76?O#217A!7?_???_#5?@??G#48_#109O#57O#43O#2_#41_#51_#225???C#70G#99G#35?O#217C??O@??C?A#69!7?@#20@???A!6?@???A#0@!4?BBBF@@??HG?OOA#47GC!4?O???O#98G#36G#51G???O#3_#7A?_#1@??@A?@CA@CA@CI@SAGDOI`SAhCQGdOI`SAhCQHc!5?ASQHcQGdOI@K#87O#209A#130@??O#33C!5?G?O!9?@???@?CAABA?@?_???AB?@#100A#130OO#42?C$#68!61?G#36G#79C!9?O!84?A#5??_#25_!8?_!5?G#0__#42@#67@#83@#14A#91A#90A???C#124C#103C#7G#42G#56G??@!5?@#76@#106OO#25OA#22@#114@A!4?B@@!6?{SUN^lJPgQkO??g?G!9?o?@!4?@@!8?CAMDAQGQLIsiH?S!7?oo?O_oOOO_???@?@@@A?@A??E?BGNFNABNGFGTKDi[g{SMGos?o??G???O??_#34O#4@!5?C#20!4?O???_??@#4G_???G#48Oo??_#43??@#21@#0_??@@@?BBA@FEBDEJLMJT]J\Vynt]j|UzlvYnt]j|UzluZw!4?LjluZlvYnt]BB#12??@!7?A@!8?G#5G#104CC!8?_??_?O?O???C#21??_#110??A$#73!62?C#21??G#2?G#102G!5?O#36!88?C!9?_#22G#169_#43??@#97O#46_#191_#229???C#116?C#127A???C#175??A#6O#100A#44P???C??@!5?G!7?A#160O#116_#90C#70!13?@#76@#138??A#64C!8?_#28?O!6?A#19!5?@#45@#55C!4?LLT_!5?G#2??@#12G??G#18CA#13AA#44A???C!4?A#91?A#89A#12C#109!10?O#12_#5_#134?_#107_#72!11?_#66?A???C?O!6?O#62@#77A#43O#10A#30@!7?AE?AIE?CC#86A#71A#70A#35A#19A#28C#22C#81C#64G#10G#55???O#108O#77O!7?C#11!38?@~~#9@#58!15?_O?_#99C#25??_#134C!6?@@#91_#58??G!5?G#44?G!8?A!8?_$#13!68?O#57O#59O#28O#29O#35!90?A#59A#70A!4?C#76C!7?@#197O#136!6?_#69C#16!7?G#109G#5???@#70A#90?_#143_#211!4?A@???@#26G#118A!4?OCW?A!8?A???A!8?O?O#44?A#20A???C?_!6?O#8O#72G???O???_!8?A???O!4?GG!8?_!6?C#210!25?C?O#99?C#142C#14C#40O???_#25A#118?_#137_#115_#1?A#58_#2C#146!6?O#28O#54@!4?_#79?_#65?C#62?G#93!6?_#27?@#101@#107?_#42_#50A#26!41?_#51??G#91!16?_??G?O#140A#90?_?@PA@?_!4@?@!6?_?@#98_#111?_??GOG#128?G#181??@$#130!163?G#92C#221G#69A!8?G#134!21?C#43???A#108@#124!7?C#161C#80BBA!9?A!6?cgOG?G?O?K!8?_!5?@@#115_#92!7?G#206?@#98O#213O#42!14?G#41@#28A?O#94G#40G#32C#211O#133?C#42C#51C#119?G#20@#35G#98@!7?C#111!27?A#8A#217_#230?_#216?O#13C#44@#56G!7?_#8_#165C#44!9?_#31@??_#93O#146!18?A#117!42?G#77??A#97!16?@#41@??@CG!6?A???A?A#20gG_GG!5?O??G!9?A$#89!166?G???O#115O#13C!9?A!8?G???O!5?G?A#58!8?G!6?O#130?C#10!19?O#20O#36G#87IC#141_#41O???@#101@#59O?A??_#61!25?C#56C#8@#66_!4?CC???G???O!4?A!8?G#213!28?G#158G#21?G#121G!5?C#76C#55!10?O#53?@_#21!84?_!5?_!9?_#153???CC#147C#97???_!6?G_#35_#57@!4?_$#20!167?A!8?G#216!35?C#217C#55@A#227C#70C#56A!4?_#67!17?A#54C#68C#192C#51_!9?O!4?A#229!23?O#25?C#20@#87B!8?@#97?G#49_#71?O#136???O#36!40?@#175@#63@#38!18?G#17GA?C[?G!4?_??O!4?@???A#104!61?A???I?O#34?@?A???C#107A#231!4?_#105A@ABBC@???O!8?C$#213!167?C?G#106??_#143O??O#15!37?G#72C!8?CA?G#65!14?G#22!5?G#94G#69@???O#35!31?_#43O#128??C#70!9?@#213?@#52!65?_#21@#57!84?C#89ABM@SGO!5_!4?C?A???CC#94?@???@?@#14@#153G???C#188@$#96!167?G#66G?GGG!4?O#222!36?C#94G#48!38?_#132!32?A#60!80?A#13!86?G?O?@???A#44G#36O#57OC#130O#226!12?C??A#41?O#99?O#89?CDG?A@$#228!168?C#99C!4?_!8?@#65!70?@#74!113?C#116!94?G!8?_#130!8?O#108!8?G$#34!169?O#210??O#179G#211O#121!291?C#100_!7?@$#124!467?AA??A$#43!467?O-#0~ZulZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|VYNDA@#51A#76_#211_?_?K?_W_O_??O_#70G#57G#2_#44O#20??Q#119AtczCTn_YTGfPiD#6_#11~~!4?~~~#26G#0~lzUlzUlzUlzUlzVylvYnt]j|UzluZluZluZlvYlvZmtZmtZmzg_#11N[WWO!4o!4`BBBA!4EKMNK!4WOooo_```@!4B`ooWKEBB@!7?@@@!4BAEEEc{[KKGWWWw{}ub``_#114CELBBYcJF?N`A[i!8?_o_O!8?__!6?B@A@?F?A?HC?GA!4?@?OOgoG_O?WG_O_G?_?O!5?@B???AA?A@A@AGG?G?G!5?_?I?G!5?O!7?O??_#38@!9?D?C#73A??O!6?C#55C!8?O#7@#42O#51O?A#36A#16A???C#12G???O#62G#164O#59O!7?C#93_#73!7?o#20K??A#18AC!8?@??C!5?GGKKK?C??G!5?C#20@C??A!4?G?@#36O#52C??G#0]v|iVylvYlvZmtZmtZnyTnyVl}jT}j\uzlUzluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZm~$#1?cHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAGD?A@#13C#61@#186@#20O#118_?G?_!4?G#210OG??O_#6G#87H#58??d#96|IZCPi?YDgbOgD#28I#20S#12??N#22B@#57A???_#1?QChQChQChQChQCgDQGdOI`SAhCQHcQHcQHcQGdQGcPIcPIcPCO#12A!4?_!4?O???_??D!7?P#5C??_G??@?O#76A!4?C#50O#20O???O@#213_oo#55O?OGkG__?oO_#35C#211G#12D??_I?_O?S!7?OA#21O#48A???OO#10_#68!4?O#112?@#64aSMCE#7@#52CA#8O??C!6?@#43G!5?C#18@!9?_#72G?A!9?_#55__??C!5?O???_#228G#43@???A???C!8?O#80AD@D@BJECAO??C#115?@!8?G#122G?_#80_O__O#32O#17@???@!4?A!6?@#40@??_A#107A#77A#19?A#71C#22C!8?@#18A#19Q#28_#59_#57_#3A#20C#52C#65?C#6G#139G#165G#50G#88???O!6?@#121!9?_?G#91W_?@!9?G#120@#105@#67@#33@?@?@#97A!6?A#130G???A#8@!5?_!4?@_#43C#139O??O#1`GATgDQGdQGcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcP$#3!51?_#7_#11__ow{]MFB!7@!5BFFEE~~#116G#175!4?i?OD_ASGEO#103O#58B#136??o#59K#53O#69@#36???C#24!50?B#23O#13O#20@?_#50A??AC!6?G???O#28_???_A#57C#35_!7?O#13A?_#212G!8?O#143G!7?G!5?GOO!4?@!5?A?@!8?@O!4?_#39!5?@@#72O!7?O#68?G??_#64OO#76G???O#6O#161_#83_#15C#211A???A#217@A??A?A#22?_!7?_#41@#44@#66G!5?A#56A#76A#13A#133C#42C!4?G#118_!6?@?@???C#66G#210?C#94O???_#72O?!4_??_#65?A#11_ooWLLF!4BAAEEC!4KGWWWO!4o___!7?!4@!5BFFEEMMKK[[[WWww!4o!4_!4?^~}#7_#26!9?A#11~@??GO__??@@@!4A!7C???GGGK!6CAAAB@@@??_OGC??p{#2@$#181!53?O#87O!4?@??A#8A#216G??G???o_#154G#19??@#127!18?_#117G#70???_#67C#81C#52???R#102!50?C#117G#39_#6A#26_#41@!4?A???C#115G!8?_#75_#188?_#141@#10A!4?A#18P???_#115O!7?@#25G#120?C#118K?CGC?_?G???O?__!8?@!9?G#72GB#80O!7?Q_?_??@#87_???C!8?C!8?A#59A#21@#66C!8?O#20_!7?G???G???@?@#137!5?G#7C#5C#111?G#69@#20G#179@!7?C#5G#42?G#55@EL!4?A?C?YW?O{GS?KC!6?o?_?O_#42G!8?C#30A???D?C#0@HLGM]][Ks[wWwW_!4o_??_??@?@@AB@BEFDAFLEJL^!5?Y~it^iv\M#43O#12?A?@??O!5?A!7?G!6?C?C???G!7?A!5?_O?A??@#27A$#108!54?G#12G!5?C!6?A!4?C???_#109!22?O#90G#139W#136!55?C#98?_#71A#129A!6?G#19A#18A!8?A#21O#216???A#2@?C#80C!8?O#14_#58_#92G!4?O#122???_??_#14@???A#19A#54G#39G#115??G#56G!5?_??_!8?A#36@#2O#43_#7_#49G?C??O#146!6?_#84G?A!7?_G???O#41@#12I?A?O!8?O#35O#210?@???G@!4?@A!5?G?CC?C!5?O#39???O#66o#34_#58O#90A#28A#6_#21C!8?O#49?EAKC?@?CCG#118?O?O!7?_!9?_#22O#59A#47@@?B@A??A#61A?A!7?_#57!6?C#6C???G#13@!7?_!8?O#87??_!5?@#21O#67!9?@#5?S!7?@!9?G#153@#69A??O#109A??AA#104@#111@@?@#220O_???W_C#35??@!5?A#87M#181?C$#31!55?C#65A#19???G#114O_OCScOg?g??O?O#28O#94!24?a#186_#170!55?@#76??C#67C#44G??@#87@#133G???O!4?_#26@#44G#109O???@#120?C#83C!8?O#70C#34C?C#99C#130@?C#10_#214_#211???Kw_#36@!7?C#66???_!7?a#51C#70C#55@!9?G?CC@ZSgl?][#118???A!5?o?G#29O#15C#80o!4?_#82O#70O!4?_#57_#227A??C#41G#157G#98??O#25_#225??O#137GOD?C#21?C#120A!4?A#57?@#216!8?G#105???@#82?O#128A#214@#77??_#14_??G#98?G#18!4?_#211O!6?I?B@IC?A!7?o#49O#20C???G#12G!8?g#93A@#53G#129G#37@GC?C???A!6?_W#39G#12C??@G#108O#82?@#64@#44???C#87_#24!11?O#26_#108G???A#130!11?_#21cO!5?_#76A#43A!6?A#130??G#41@?@?@??@#140A#57??A??G!7?_???A#18A@??A#191_$#161!60?O#28G#217O_O!4?O#36C#35C#5C#111!88?@#22?@#36@???A!6?_!9?_#66?A#122A?A#41G#45A#22A#65KG#12A!4?A!5?C#43??@#17A#114C!4O?w?_?o#121??@#57@!8?_#19_#206A!5?C#212C#222G#217?A#42_#108_#53!11?O#11_oWWLF!6BAEEECKKMNXWWO!4o___!9?_oW[KEB@@!4?!4@BBBAEEECKk{w!4W!4o!4_#50O#13_#54O#39O#28_#46_#40@??B???_???C!7?O!9?A#51C???G#85C!5?AA#132_#36_#16_#51@???A#46!5?G#67G#52G#47O#102???_#123_#43!16?_#22?_#136_#52??G#44!12?@#156C?G#128AC?G?GO??@_#231?G#42!4?A#21?!4O#128OOO?_#13G#43A#91?WWG???COGG#13?C#25G#69?G$#107!62?C#41?A#109A#69A#80C!6?_#154!88?C#43G!9?C#71G??_O#152_#25@#127!5?@#56@#211AC#114C#55C#40C#59?O#28C#78G#51_#39O#227G#21?G#33@#106_!4?A#75A#67@#61A?AA#18@#64O!8?O#94@!8?C!7?O#210!4?G#107!11?@#28G!5?G#63??G#57C#5C!7?@!4?G#143C!5?GGDLCBUBGBBE@!4?O?oWg{_sGg?_?O!5?@???AA?@DF???GG!5?O#122?@@C?A@#107?@#70@#57@#13H!9?@???A#128?O#6O#25C#48A??@#39C#69G#4??A#35O#120O#18_#10O#41?@#52@#1?OG_?_!8?__!4?@??@?A?@?AD?AHCA!6?D?TI_TGa@#116!4?G#34_ADB]U{skwooWo_o_oqo!8_qOo_O__o_[wWMUFF??g#130@$#214!65?G#43?A#115C#33C#66??G#46!91?A#66C!5?G?G??O#20@!4?O!6?G@#175?G#213G#161?C#29G#206??G#63??C#48A#124A??G#41!4?@#78A#72?CC??G!5?O!6?_#114?B#211@#61A#35C#39@#146@#87@!4?_#12!16?O?_#94_!4?C#55??O___?_#31@#53@#209!4?C#19_#118BC?CCN?C?OO#133?_#49C?C!9?AA!4?C??O#72!12?@A#40C#139!9?_#112!11?O#146O#64E#206A!7?G#44C#71G#72O!4?_#133A#115_#56_#26_#58_#49C#74@#5???O#28??O#25_#44!4?@#27!35?C#13!18?O???_#220!5?G???O?O#89!4?@?@#56@#215!4?@#106A#148G#25??C#5@!4?@#44_#58O!4?_$#194!164?C#2A!4?C#94O!4?_#34G#172G#134@#181@#87!7?_#8@#91G#89!11?A#87G#0@#121A#5!9?@!7?C#8??G#20G#2@#6A#52A!7?A#5??C#63G#70!19?@#20G#19@#18@A#58G#44C!5?@!4?A#212!6?@#106G#69G!8?_#71??_#80O!9?C??A!5?O???o_??@#22!5?C#44_#139!22?_#98?G#5?_???C#63?G#66?G#57?@???A#211?_#136O#71??C#114!5?G#53!44?A#106!18?@??O#14@#20!5?@!4?A#134!6?A#90A!8?@#21???C??A#14!4?_#76O$#51!165?@#69G???O#42?C#7C#14_#13?@#94!26?C#161!12?A#48C#47C#49C#133C#76!5?_#59O#44O#232?@#53A#13O!7?G?O#110!20?C#40A#61?_#122!6?G#71G#20@#49?O#101@#112_#120!9?G???O#220!7?_#12_O?_?A!7?@!7?D???I???C!8?O#128!21?C#87O!6?@C#165?@#50@#123@#146!57?@#233!18?A_#126G#8G#58!6?C#25C?A#153!17?@$#106!165?G#234C#90G#40C?G!4?O#33G#100!40?A#222!13?@#48@#129!8?G#158C#109!32?G#100!26?O#32G#91???O#5?C#18A!8?A#129!42?A#69A???C#76C#143!5?_#171!58?O#57!19?C!7?C???G??A$#58!169?O???_!9?A#141!48?A#151!69?G#98!7?C#136!51?@#99_#18A!9?A$#138!169?C!4?O??O#48!186?_#7G$#35!169?A#235???O#120!190?O-#0~ZulZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|VyNDEB@@#12A!5?@#22@#230??C@?S?A@?AC#80???@CB#2O#12~#11~~#58N#96}^_DIqdI`GcOGc_#20^!9?P#40_#6OA!8?G!4?O#139O#56O#87_#13_#7_#183_#16_#68_#17!31?@#82@#59@#7@#13@???A#87A???@#5@#7@#42@#41@!5?_#69C#56@!4?G#5O!5?C!8?OC#36_#122@?A#114?@@B@A!7?KG?MId@_AGoGcS_O#118K?G!9?@!7?AA@AIG??O#7_#80@C@Q?GHB?@!7?WGO?W#14?C#58C#18@!8?_??G#55@??A!6?CA!9?_?A!4?_C?C#66{?O#51C#87@C!8?O#19C#42E#28C#118A?@C!5?O??W___!8?A!5?_??O!5?_#30@?@?@???C#15G#23G#12O???_!5?@#41A#52A#51A#19A???C#71G#5@?G?@#9@???_#1@#25C!6?GC?G!4?_AG???O?G!6?___#121?_#43?G!4?C#36_?O??G#13O#97C#91A#69C?o?_#35??U#0^zUlzUlz\uj\vynT}j\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZn~$#1?cHQcHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAgDOI@?A#53A#58_#6@#143_??GScp??_#216!7?ACOMO#115??G#121???o#127@#119_I_DGAsIRBcRYC#6_#11~~!4?~~~CKKK[[WWww!6o!4_#168O#60O#37!39?A#12@#11!4@BBBA!4E!4KGWWWOooo_```@!4BFEECKKKG!4W!4o___owGKEAB@#55O?@!4?G??CO?WG!6?_#14@#68_?_#3@#72_?@!4?CC!9?O#28_#49AC@FO#11_ooWKEFB@???@@!4BAEFFF!4KWww!5o!4_???_oWKMFB@#80_!5?SSwKgWw?w?WG!7?_#10_#98_#35??@#211C?A@AD???C???OISA?AaAK!9?_#63G!8?_#25OC#7C_#18G#73@??BB!4?O#2@#165@#125_#4_#102???C#86C#87A#36C#6C#68G#181?G#136@?G!4?O#52A#108A#58_#7C#8C#19A#44OC#20@A??@??O!6?C!4?Gg!8?g!5?O??A!4?A!5?C#57??_#1_ChQChQCaHSaGDOi@SaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcO$#52!44?_#18_#11_ow{[MNFB@#71A#225A#210???Cg?TGcR???K?EG#138?C#175!6?TI_DG@CCWJc@O#12???i!7?AAO??C!4?G!4?O#64!45?A#107A#34A#73C#10C#53C#21C#6C#136C!8?O#101AA???A!4?G??G#34_#12C!7?C!8?O!7?C#210_!4?D#216A#112_#137?O???A#72_Cc#93O#12A??G??G!6?O!8?O???_#65A?EG#40_#46G_?A#76O#211A!6?OG_#98A#34A??C!8?OA#21_#80@!8?G#34O#89O#10O!5?_#7@#118ooGC??A?A?A#13@#12@???A!5?O??A!7?_#25G#72C!8?O#100_#28_#216!4?G?O#40_#72OGC#58G#44_???C#47G#39G!8?_#0@!4?A?BF?CEJEJMYU]G[k{gWwgoOooo!5_?@@?@B#24@#106??G!4?_!6?A!9?G!6?G#18??OOG!8?@#139G#87?G#19C???G$#22!45?O#82G#13G!7?A#214!5?G!5?cO#141!7?@#103!7?O#28O???O#127!5?J#87???T!6?I#41@#10_#28_#52A#0@?@@AB@EFDEBDMJLFY^TMz\uj\vynT}j\uzlUzluZluZluZmtZlv[i}Swk[kwgWwgooo!6_#2@!9?G#15O#41C!7?O#58A#2_!6?C!6?C??@#6@#28G#47G#80O!5?A??O??GA#11!4@brr^MEEC!5K[^ZP!4o!4_#43?_#61O#55GB[@]!9?O?o#5@#143??__Wo?o?_O!8?B?A@@A@AHELA@??@!6?@@#216G???C#40O!5?G!7?_?@#37!4?A#65@#212B#222C#114ACIKHBIFZCNDIlV`?G!8?O?OO?_?__#84_!8?C#14G#40??G#6O???_#26_#139?@#58@#108!5?C#7!5?G#78O#10O!7?A#87_#95A#42??O!4?C!4?O#97O#52?_#220A?A!5?C???C??CC?C??A??@#58G!5?G??A#7G???@$#136!46?O#65C#139C#88?@#25O#41O#211_!7?A?_A@A?@G@A`Gr#158?a#71!10?O??_#22!9?OE!8?_#9A#58_#4A#1A@?A@?A@CI@CAGD?IPCaHSaGDOi@SaHCQhCQHcQHcQHcPIcQGaS?iCO_O?O_?O???O#19G#25A#31@!7?C#6@#32A#18@#45G#35A???C#145G#94_#152O???_#211@???A???C???G#71G#64@#8C#48@!4?__!8?A#61A#20@???A?O!8?A??A???A#5@#28@#206@?DD#29@#64BK@A!8?C#41C#25C!9?A#56C#216??G#44C!4?A??O#210?@??A@??CC#12??_!5?O#9O#109G#14C#211O!4?@C?g???_#20A!6?H!5?Q@??_!6?O???_#8_#217?A#49!7?O#36_#12_???@A!6?D???A#54@#52O#22A#28A#38@#146_#37B@A??C?@#1CHC?CG?S_O?O_?OG_#107!5?O#77O#12A!7?CG!6?_O!9?O#128_@?@?A?@?@?B?@??C???A#76_??O#43!4?O#51?@???G$#157!51?_#217?O?O_OKQ_OA?_OG???_#94!29?_`#21O!8?_#73@#43C#57C!4?G#146G#23G#86G#118!53?G#45G#15G#182G#61O#82@#20A#46@!8?CC!4?G?OO#42G#44@!9?_G!5?O#39?A#18s??@#70C#10?A#133@#49O_OGOd#141@#94@#139@#44?@#32A#142A#108_#13_!6?G#18A!5?A#58?_#87_#13G#35G#36G#63C#10G???O#59??_#141!4?_!4?A!9?C#92!4?G#99G#72O??_#118_?@#76?C#94C#158C#66C!8?O!8?C?@#217A#71??@#72A#57@!9?_!5?A#70A!8?G#83G#55@?AAC!5?O???W@!4?C!5?O?__?_!6?_#123A#120?C#19_#5G#69!5?O#56O???_#74?A#2!16?@#13Q!6?@!8?A?@#116?G#14??O!8?G#57!4G???_!5?O???@#52!5?A#236??@$#91!53?G#114o_GGAlZ?TJGcOGkpY`O_?{#70!24?I#33O#139g!4?O#101@#61@#102@#75?A#136_#59?C#18G#80C#88!63?O#22O#34A#13O???_!9?_!5?G#25A#134O#21A#100A#161@A#76C#40A#80B@B#143CC?CCA!4?OO??]_OGSN?eKo?G#122???C#83C#36G#5C#69_!7?A??_#116C#101C#211A#48?C#218G#6?O#77O#68C?G#3!7?CG#122@!4?_#8C#210_!6?_#137???O#97G#172G#138O#19@#20A#115_?A#25???G#116G#225CC#87O!6?O#108C#19C!4?A#28A#210_W?S?G??A?C???_#115_#30O#5@!7?O#44!8?O???_#210@?C@??@#115!5?@#46C#11_oOWLF!5BAEEEC!4KWWWO!4o!4_!7?!5@BBBFEEFFMMKKK[[WWwwfB?CGGOO``aACC!4G?!14O???GGGCCCAa_pOOGCEAB~$#20!54?C#66C#134!44?@#90G#34C???_#82!9?C#57!66?O#66@#12C???_#75A???C#115C?G#28O!6?@#213@#69O#234_#127A#65@#120?C#124C#34??G#49A#72C???@!6?C_#138!14?O#42?C#6??O!6?O#66_#8@#229??G#84!7?G#20!9?_#110C#36G#87G#58_A#12G???@?@!7?@??G!4?C#139!5?G#33G#2G#43O#112??@!4?@#38?_#225!4?A#97!4?@#11???!4@BBBAae}]!4KMNZXW!4o!4_#161O#56!13?@#25O#106@#5@#41_#8O#20G#175G#69C#42C#76C#6C#2G#13@???A#57A#51O#127?_#82??C#10!8?O!5?A#57!15?O#17@#49_#139?_#128!5?_???@#144AC#58??C?_#120??___#43??G#35_!7?G!6?C!6?C$#55!54?G#140!45?C#8?@#90!81?A#23A#43C???G#7G#44@#188A#14?O#19A#108O???G#107_#50O#31__#133???_#196_#55!5?A#107G#50G#25O#137@#56??A#5A#36_#32_#13??@#206!15?G#25!4?@???A#17_#7A#114_!8?A??E?BCL?O?_?O???A!4?g???o_O???o?_?__!5?AB??CA?@ALE?A@?@!5?_W[C{_w_?A#122?O#146A#98??C#42C#44?C#15O#8?@!7?_#66!6?G#80?@CG?G!5?O_CKDAA!5?__#206???G#64O#56G???O#17!16?@#37!21?_#51A#91!8?O@A???K!7?A?ACECC??C!6?C??_#77__!8?C$#220!102?A#114!82?_#28@#83@#10AA#76@#40C#88!4?C#8?C#20_!8?O???_??G!5?G!6?A#129!22?O#59@#10O#23O#22O#21O#54@#107?_!10?O#48!13?@#19O#35@??A#127A#161A#49??G??G#89!6?O#218@#51O#41A#72!12?G?G?A#6_A#179!14?A#119!7?G#106??_#43O#14OO!7?G#26!4?O#41O#67!14?O#28G#18?G#52A#84_#66O#72!6?O?O#75O#76!49?G??C?G!5?_!6?_#58??_#13__???_#5???G??O#44?C#130G#25?Ac@??`!5?O$#139!187?_#59C#87G???O???a!7?G#112!13?A#26!4?O#43G#151!25?_#80O#44G#75@#101!30?_#118_O#40?KCCCK#212!12?@#5!14?_!9?@#218!20?@#92@#63@#73@#29!29?A#26?C#87C#61!9?O!7?A!7?G#18!35?A!6?A!4?C???G#69!9?A???A#12?GO!8?A!4?G??c$#36!189?@??G?A#66!4?O!8?@??@#51!12?_#61O#64!27?_#216!31?@#88O#94G#18!34?_#48C!5?G#101!23?_#110?_#34!29?@#161?A#21!10?G#58G#87G#36!49?__@A!4?G??O!4?_#8!15?_??A?O??W!8?O$#133!189?C#57!13?G#71O!48?@#70!68?O#67G#136G#179A#81!72?@#94@#168@#130!49?C!4?@???C#5???C#233O#42!24?O??G??A@@$#129!203?_#166@#34!246?O?_!5?G@@R@@@DB?BABDBEBCF?B?bFB@@B_@@??C???_?oG$#159!452?_!4?G#21!31?G!5?`$#35!452?O#156O#21?A?CO@!5?C#6!23?_-#0~ZulZulZulZulZulZuntYnt]j|Vynt]j|VynTMJDB#10A#51A#144_#72__O#41C#143CE!4?A!4?_O?G#211!4?A?D_?VyT#103?_!5?O!4?COSAP???@#58q!8?_#70O#211AbFySKs_KGSGOGOC?o???_#139G#6G?@!6?_#17A#172C#41?C#18G!4?O#44_#24_#3!37?@#107@#77@#20@???A#141?C#57?C!7?A#14O??C???@!4?O!7?G#19G#40@#39@!4?A#72A??@!7?O??CO_W_???COKA!5?_!9?_#67O!4?_#70C!8?O#137@!4?@#20G???G#160G#18A#55gAO??O_OcGC?O#70C!4?@???_!8?G!9?A#65_!9?A#64A!4?O#76A??C?O!8?@#158_#94_#70C!8?O#18_#40C?C?_#65G!6?@#28@#63A???C?GG#79G#7C??_#51@#5G#16@#110@??A#1`IS`IPcAhS?SgCPIO??O#12AS!4?_!5?A!7?A#5A#42@@!6?@#12E!5?@???@?_!4?OG?A#146@$#1?cHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI@CA?@#60@#211??O!8?G#118!12?@G#214O#216?G#179!4?W!9?__#175C?@A?C#20??@???_O#34@???A#118D???@@?A?AG?G?CG#141C#143G!5?O#122O#71O#42O#27@#87A!5?_#152??C#5G#146?G#108G#88G#60G#17!42?A???C#13???C???G!5?C#209A!8?C!4?G!7?_#137@!4?@#35C#52A???O#118GCG@AO!4?COg#55?A??C!9?O#10G#43@#21@#211O!5?A??@!5?G#14O!4?_???C#90_#41@??C#109A#8@#127@#71@#118A#80C!5?o#98C!4?_#7G#107@#12A!7?_!8?_??A#212OG#40@???@???@!4?A#11@@@`pRZF!4EC!4KMZXWOooo!4_#59???_#71_#114O?DHOw}uow_?O??_oo_#95?O#102O!5?@#0@@]tj]tmZ|Uj~jVzmsm{o__#91@?@AGAI??_!4?G#69???_?_?_??_?_??o@#35?@!9?O#44O#43G#106C#71_#0_ooo^lzUlzVylvYnt]j|UzluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZn~$#171!36?_#6_#11__ow[]NFBB@#217O_?O?_O?O?O???C??DG_AC_???A#2@#12V??_#119GCD?@?@?@GC[oz_#6C#11~~???o~~^#91G#206w!7?A#20@!4?A#5A#53?C#21C#13C!8?OA#0@?@@AB@ABEDBEDZVi|Vynt]j|UzluZluZluZluZmt]ju\juZnzVzmuYyWg{oOwWwO__o?!4_#108A??@C!4?G??C#87A???C#140G#98?@#43?A#48@!6?A!7?A#61?OO#10_#84DOaG?C!6?A#20G???G!7?G@???@!5?G#72CC!6?@I@C!7?C?A!9?GGG!8?@!6?C!9?O#28_#211Q?H???@#31???@#108@#118Q?KsG!6?_o??__!9?FC??G???O?O?_?_C??@GCOS?G_O#6A#12A???C!4?A#6A#139A#27O#46!15?@#77@#87@!4?G#34AGF[S[[[{{woowxwO_Oo?o_Oo?owGwwoowW{s{]G[ANBB@#2O??A$#123!37?O#57O!4?@O#43G#114_oo_YSJO@czfILBdRp]jysVgRSg@i{#158A#87g#11~~#43A#96V?ICYCAGA??a@C#117?G#12??|?_#69A???@#114?Sg?iQIS_S?O_OgOo?ow_??__#81?@#57O#80_#2_#7A!8?G#176???O#19!42?@???A#79???G#12D!7?C!7?@!8?@???A!7?gG???O???_#36?_#64DIgJ?SziEzKAK#36@??C!9?G#26@??O#122__#213@#76C#55@!4?@#2!4?O#80O!4?C#210A!6?C!4?OCO#15A#20A#44A#21??C#18@!5?_#143@???AA#55@A?A@?A!8?MCwIYs[kskOkSO#28A???C#18G?G!4?A!4?P#116C#21_#13_!5?O???_#143?O#212???O??A#72@!6?CGG???O#87?@!4?_#53??G#22!17?A#11BEKGoo__???@@@?!5A??C?!7C???!6A@@@???__owKEB@$#18!39?O#12G!5?C#225G#80GGD#210HcFSIC?tAgOcI@C!4?G@?C?@#194C#58???[#106_#127@?@?OG`_!5?M#87???A#8O!5?C#212?GO??_?GO_?_!4?G#227?G#12?C???H!8?c#102!4?C#11!48?!4@!4BAEEECKKKGWWWO!4op```@BBBAEEECKKKGWWWOow{}eb`_#55GC#9?_#68??CC@??@?_#17_?G#11_oOXNF!4BA!4ENNLGGWWOOooo!4_!5?_oW[KEB@@!7?!4@BBBAAEEes[[KKWWWO!4o_owKKEB@@#21@#49!4?_ABB#97???@#35@!5?G!6?G#98@#5A??O#29???A#28@!7?O#64!9?@!6?C!6?_#187?_#19@#59O#26@#94!4?_#52!18?C??_#159BC#26C#57?@??A#18??@!5?EC?C!7?CC#36@??G#5?@#220_?G??O?G?C#14??@#108GC$#59!39?G#23C#19C#87_#141???G#42?A#14@#216?A?_#121!26?@#28?I?A?@??GCG#134!8?GG#13G#115???_#55???C!6?_#87@!4?A#210???O?_#118???_#64_#101@#30@#67_#1@??@?A@?@AC@ACgTAgDOI`SAhCQHcQHcQHcQHcPI`SHaSHcOCgCOGcCcS?Kg?_?_OO?o#154@!4?A!6?A#27A#133G!8?_?O#94O#69A???C#9C#143A?A!7?BG#54!8?O!4?A#13O#12@_#14A#34O#206_o#118G?GO!5?_!4?A??A??C?K#116??_#48OO!4?@#34O#211__#140!5?@#14@#43@!8?C#87C???G!7?G!4?O???A#10OG#59_#13!15?@???A#87A?C!9?A!8?O#80B@AB?D?LK!4?C#29?GAAK_?O!4?O#23???G#181G#136O#108!4?C#102!18?G#25@!4?O!6?A!4?CC#97?@?@#35G#142?@!4?@#130A#43???C#128??C!5?@C#87!5?C#1GK_QChQCgDQGdOI`SAhCQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcO$#118!51?_#230?G?@?G??CI??_O!5?A#57!10?_#8_#71GcIOA?o_@I?O#22!4?C#33C#191C#143!7?@#66??@#41@#52@!4?A#66!6?G#33G#136!7?O#26?_???C#28!51?A#70A???C#40??G#58@???A#46@#138@!6?C#152C!8?O#41G!8?_#8_#65?CC#37?@#165@#87@??@#22@#80!12?@#138@#4O#28O#39C#48C#87@!7?@!8?O#212B#69_#143A!5?CBIEFMDMAB@!4?GO!4?A???C?G#206???__#63O#25_#172O#66@!7?C#43G#76G!8?_#83C#70!17?a#44_!5?@???G#41O#14A#86@#213_!4?C#211A??CK?CC?I?AA@A#206!5?C??Gg_O#62C???G_#186!28?G#128@!8?_#76???C??@???G!8?G???@#57!6?A!7?A$#141!83?O#90_#94!15?B#41A#40!15?A#28A#11!5@!4BFFFEMMMKK[[[WWww!5o_#53!53?G#21G#94@!8?@#5G!4?O#7A#13A???C!9?C!8?C#25A#41O#66O#151!13?O#41@#173_#40G#195A#18GC#122?O#44C!7?G#5??A#12C!4?_!7?_!6?_?A#213O#12!9?@#99A#211O#115?C#118???G#6@??G#20?A!5?_!6?G#139C#210@!9?_!4?G#124!7?O#43O#12?_#34_#65_#7G#100G#55__??_!9?@B??HGJ?J?@QgQb#142!5?@#191@#84A!7?G?O#59!27?O#21A!6?_#44!4?@#8G???@?O??O?O??O!6?G!6?A?@$#113!84?O#188!16?@#173!15?@#217C#72CC!7?OO??_#183!5?A#82A#34!64?@#64?O#71O!4?@!4?A!6?GG!6?_#32_?_#114@?@!8?C??EG@A?@A?@#67!4?_#51?@#237?A#70_#160??G#114o___oO#64_?_#51?O#13OC#18??G!4?O#76!5?_#119?O#13O!4?@#66!9?A#64!8?O#76@#158O#210??@#26A#58O#19O#5C#57C#80@?D?@A@CB!8?ABPCG_OA#211!7?K#66C#92!4?O#121@#20@!4?Q!6?G#139G#122A??C??O!4?C?CG#223!6?A#13@!7?C#76!31?C#106G?O!9?@#21???G#140@!5?@?@#44A??C#21!8?_#221C#69A$#90!119?A#214_?_#87!83?G#234@??@!4?C!9?O#221_#31OO#220!4?O#20O???_!6?O???_#57!22?C#65O???_#28?O!4?_#127??C!4?G#228!8?G#91??A#127!20?G#146G#67!5?A#65_#96_#120_#94C#49??A??A@#18?o#57O#19@#13C#158!20?G#72!6?O#8@!7?A#58@#12g#206D#67?G#115G#7?O???_#10!15?A!7?G#36!32?@#20??_!6?C!8?IGG!9?C???A??@$#130!206?A#120?O#140A#19O#237@??A???CCCG?G!5?Oo_#67??A#2A#49A@#80?@#7!4?G#86G#115C#99A#7!25?C#58C#25C#98G#96!6?A#58???_#114B@BAB@?DGG!7?_?Oo?wk}{gMgG_w?_ooO!8?@@@?A?@??C!7?GCooCC!5?Ok?i_GC!9?O???_!5?A#49!5?A#136!19?@#11!4@BBBAEee}[{{#58!28?@??A???@C!8?AAA!8?@!6?_$#61!210?_#28_???A#20G#43@#109G#36?A???C!4?@#151!4?@#25O#206!10?G#63!26?G#25!14?G!4?O!6?_!6?C#212!24?_#141A#211A#118!5?CC!6?OGC#120!25?G#115?O#80@#36O#96!5?C#98!27?A#52A#61C#75C#94C#69!39?A#130!10?A#57?G#43A#70??@?@#25A!4?C!4?A$#59!212?_#129A??A!5?G#153S#82O#51_??@#92!59?C#217C???A#71!47?G#107G#140??A#89@#116G#54!32?@#130!77?@#106!17?GG#14G!7?C$#35!213?_#18G!8?_!7?G???C#34!54?G#94G#121!55?_#13!129?A$#142!213?C#44_!9?_#35C#196?_#205_$#8!215?@#69?G#42!4?O-#0~ZulZulZulZulZulZulZ|Uj|Vynt]j|vA@@#87A_#12?K#43G#35G#28AG???O#19_#217@??O???GA?CG@?@?G??C??`?OI?C_??o?O#36G#35G#19G#87G!8?_!5?A#44G#118__??@!9?_??CA?`?O?GC?a?BSdYIrZEDA#78A!9?@#0nz]tj]tznYtnY|Vj}Tzmv\iv\mzTmz\uj\uzlUzluZluZlv\iv^tj\vlZul]iv[uk[ms[k{gOwgwOoo!5_#38_#71`@!6?G!9?O#18A!5?A??G!7?_!9?_#11_oWKMFB@@?@@@!5BEECCKKKGwwwO!4o!4_owKMFB@#72C#217C#210_O_?O!6?C#11!4@bbr]MEEC!4KG!4Ww{}eb`_#41@#72?P?O#169_#211!5?iA[am??G_O_G_!4?G???_!4?`??@#28C#43G#55C#146GG#118AA#59A!9?A#28!21?@!6?C#25@???A#8@?@?@#41O#69A?A?!5A!8?@#35@#58@!5?@#87?A??G#164?G#59G#88G#4G#172O#26O#9O#40O#6_#81_#165_#168_#60_$#1?cHQcHQcHQcHQcHQcHQcAhSAgDOI`SAG@#11w{{]~rrpoo___#18_#40O#20_#210CA??DGBoSh??gcGE?@?AD?AgCO?O???_#119G!7?@!4?@#35C!8?@#66@#210??OgO?sHO!17?@#143??`#72C?@#11__ow{[NFf~~#19E#68O#1OC`IS`ICOdIOdAgS@iCPGaTGaPCiPCaHSaHCQhCQHcQHcQGaTG_ISaGQcHQ`TGaGQaOG_O?Og?O?_#51@#76G!7?C#205@!4?A#19O?A?_#35c#108?G???O!4?_#134_#12D?_!4?O#143G!6?G?O#2_#21_!4?A#56O#210_?o?s#217_CO?O!8?@!9?C#118C!8?Og#83A#55!4?_H_?Oi?SG???G#8O#87O!5?G#80@#3@#118_!5?A!6?GGNKBNRQCI@G@??@?AA???C???GOo?oo?O_#122@???A#29A!6?@@#18C#205_??G?A#7_#68_?G#17!21?C#11@~??@@!4A!5C!5K!6G!6KCCCEAAAB@@??~[ww!5o!4_#136_#102O$#7!32?O#62A#52A!4?C#39C#15G#118EAEBAA??O?O#230A!6?CA!4?A@#118C??_?OG??G?G??OO???_#100@#103?@?@??A#6E#18G?g#19@#72_#58C#114OS}Un`ADO@CAKTqNWhUKjduPyTHysIOcOGC#227GI#61C#41@#10A#21@#170A??G#25??h#73_#4!62?@#115@#22@#76@#6@#44@!8?@#56G#26@#90@#12A???O!7?@!7?D#20@!5?O?A???A!5?O???_#34_#55GCW?O#15?O#87O!8?@#143GG_Ogwoo?__!5?@A???EC#67G#211?E?C!6?C??JB@CA?AA#42@!7?C#35C#13G?O???A#7A#36A#55`??A?@@!9?G?K?ZSYtCW_KOOwcGgWoO_#56C#17G#13?C???G!8?_!8?@#19_#181C??@#0?_O~Tmz\uj\vylUzluZmt]t^o???k{WgwWoOoO!11_?!8_OooOwOw[ww!4?@BEDBFALNIFL]ZTNyVl}jT}j\vynT}j\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZn~$#17!32?C#191C#9?@#25@!4?@#41@#114G??DDMJLDIGfsLjAFiTAvp^kwHwUHD_Bi?o??O_!4?_#8@#133??_#109_!8?_#100O#141G#40CA#216!5?A#217G???_?G?a?`?O?GC?a?D?_I@C#66?_#48O#42O???A#5@#59_#6G#12O??O#79A#72!67?A#11!4@!4BAEEECKKKG!4W!4o```bBBBAEEEC!5K[YZP!4o___#114@??C???@?O!9?O?SOGg#76?C!7?A#114@???B?@?@?@@?AA!6?GySk[!6?A?_O?O#18A???@#115_??O!4?_#58C!7?O#65C#114C??AC??L_`c??D@!5?SC??GWo_?o!6?@@??@?AA@BB#46C#21C!5?A#35@#204A#10?O#1_?iPCaHSaGDQhCQHcPI`I_!4?O?_O?_?_?_#5G#35A#2O#71O#56?O#134O#70O!6?O#57!4A#20AG???C#146C#28C#121A#8A#40A#13_!5?G#19???O$#59!32?G#51!7?A#73C#143?C!4?OO!8?O???G#211??_?A_??OA?cOG?_???!4_#51@#76!4?A_#12C!5?CO#143?O#20A#211_?gOMTgfIO`@G?_@S?A?G?a?GC#57!8?_#67?G#44G#20C#35?_#167O#191_#102!4?K#127!68?A#15A#57A#19A#40C#94C#21C#13C???G#18G!7?_#34@!9?_#22_#41_#26@#56@#115@!9?A#48A!8?O#90_#40?_#10_#41???G#28C#12_O#139@#42G#216oG?G#90A???C#43?C#12C!7?S!8?O!5?O#22_#42G#66_!8?@!4?A#12@!6?C??G?A!4?S!7?O???_#106?_#227O#56_#80!6?O_???kCO#20@???A???C!8?O#44O#65@??@DA#17?C#58G#12_?A?C#172?G???G#9C#102!21?G#12E??@!5?CA???G#57A#18!4?C?!4C#33??O#108O#154O#2O#44G???C#7!6?O#25?@#61@#56C#65C$#182!32?_#5!10?O#72HC?G!5?_#80O#216!4?_O?O#214???O?OAGC!6?O#20C!8?O?A#127@#70A#98AA@#48!7?G#80G#214!8?ACQ?D???GOCA@?@?O?G#136!8?O#179C#142@#192???O#79!76?C#87!4?C!7?C#28A#129AA!9?O#94???G#50O#58G#101__?_#0@#49@#13??_#45C#25@#9@#118AA@?CCGDI?BC?M@CA@!9?_#25A!8?A???_!4?G!6?OG#5C#51A#107?_#14C#216OO???A#40@?A???C!4?C#20_#98?G#48???_???_#49@#94A???C#22C#20C!4?A#5@?_#122!11?A#40O!4?A#12@#11!4@!4BAEEEC!4KWWWOO!4oWGKEBbpwWMF#22@#110!21?A#20_!7?@???G#102O#72O#140!6?O!4?O#85!5?O#43A#12A???@???@#21G#136?_#63A$#212!43?@#14O#59O#48G#69??_#94_#211IdO#55!5?O#216!13?@?@#143C?G!9?_#13!4?_#43C?@#230!16?_#212G?A?O#161!21?@#114!87?G#102??O#16@#5A!7?G#31C!8?OO!5?_#143@#15A#87O#219??C#63?C#35G#222@@!5?O?O#79!6?C#39A#58C#49@#238_#211O#66G#228C#80K???C#71C#225??G#115G#18@?AG!7?g#36??G!8?@#227O#63G#136?@#80!4?YcWgcSWg?G#143C?OG!5?_#64__#120O#57O#121O#28A!4?A#35A#34?G!6?_#10!11?@!8?C#26?C#87??C???G!7?G_!5?O!6?C@#13!24?O?@#187A#69A#79C#18@#36C#58C???A#116A#87!7?C#42O??O!8?G#71G#114G#22!6?A#76??C$#227!45?G#2!5?_#71!24?@#25A!7?@???O!9?B#55!132?O#82@#8O???_#58_#237AC???C!4?W!4?_!4?_#78!6?C#61CC#72A@JGA??DOBI?MH@?@#83_#106??C#231A#111A#179A#57?A#109!6?G???O?_#71A!8?G#19O!8?A#222_#49!6?CSG?_?OcWG#45C#71!5?O#66O!6?A!4?@#18?@#144C#213G#2A#48A#28!15?@#59@#21@#66?A#107A#72C!4?G???O!4?_!7?C#63???@#16@#6G?O???O#5!24?G#98?A!7?G#91@?@#77!9?O#1_!8?_??_?g?_CC!4?A?@AC?DA?DGA@CIODgQ@Si@SaGDOi@SaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcO$#161!76?A#18@#11BBB!4FEMMMK[[[WWwwv~OKFB@#98!129?O#32@?@#43C#140?C#22@#2A#184A???C!6?O#81G#136?G#5A!8?G#120?G#28G#206CE?A!9?A#170?G#213A#214!5?_#48!9?oO#210O!4?@#66A???C#80?A???D@@#179A#78@#2!12?@#107@#7?@#5@#194A#41A#69A#43A!4?_@#76@#56@!6?_#26C!7?O#89O#194O#63!17?A#8???A#64C#44A#19!4?@!8?C#22_C#189!7?_#69O#193OG#209?C#81C#7!28?O#121??A#21???@!6?AA?A!7?A#91!6?@$#98!77?C#69C!8?O#71!5?@#35!140?A#209@!7?A#188G???O#28G?G??_#120??O#57O!4?_#211!6?G???O#35!28?H???O!7?G#115???G#20O???_#137!19?_#75_#25!7?G#158@#124O#211???@@?A#44_#214!7?C#158!28?G#51@#21G#41@#12A#63__#59A#45A#127_#14C#57_??G#192!6?_#188O#15!31?C#65!6?G#34@!4?@?!4@B!10@$#44!80?C!8?A#20!145?O!6?G#36G???O?C!9?A??@!9?O#175O!4?_#19!25?G#72_!7?A#2!6?G#56G???O!4?@#122!30?@!6?G#67!32?G#52@#101?@#6A#69O#206!4?A#26!42?G#52!8?G#36!12?O!7?@@!9?C$#213!80?G!8?_#142!145?A#108A#41???C#57?@#13@!7?C#224!5?@#51A#44?O#64!13?DI@A??C@#99!22?@#32O#40@#78_#70A???C#49@A@#124!6?C#69!38?_!4?@#212!35?_#115?O#94O#76A#35!47?_$#80!84?O#158O#67O#50!156?C#152C#59A#171GG#82G#114!9?@#19!15?_#92!30?@#58A#13?O#5?C#55@!5?BA?A??@#212!38?@!9?O!4?_???A$#14!246?A#23C#193C#61!57?_#106!4?C#127?C#43!48?_$#51!246?O-#0~ZulZulZulZulZulZulZuntYnt]j|Vy\#52K#11^~wwwoopp``bbBBBFFEEMMMK[[[WWwww!5o!4_#18_#19_#7_#15_#71_#66_#72_#216C??C@a?CG#72?@@?A#56@#118CA??O???_G?_?C?G!5?C??a@?GC!4?_??AC#69C#63@#6_@#81_G#189GC#57C!7?@#73!88?@!4?A#87@#11!4@BBBA!4E!4KGWWWOooo!5`BBBAEEEMNLGGGWWOO!4o___!4?_oWKEAB@!8?!4@!4BEee}[[KKK!4Wooow{ebb@#14@#55C?QH_?B@!6?_?C!6?o?O?_?_?@?@?@B@B@B@@CBEHIFAC!4?OG#12_!9?G?O?@#6C#44A#8?@#62@#7!25?@#19_!5?_#94_#17_#66!26?_#52_#25_#11__ow}B!6?!4@!4BFFEEMMKK[[[WWww!4o!5_#10O#6_#139_#27_#152_#73_$#1?cHQcHQcHQcHQcHQcHQcHOIdOI`SAgDa#57@#12_!4?@!7?_!4?@G???O???C_#55A@!8?D???C#48O#222???_#211?I!6?OG???cG_?GgA?G?PAC??OAG_aG@?_C?A#230???O#143???C?G#11_ow{[MFFbpww[MMFB@#125A#40!89?@!4?A#218A#69A???C#6C#12D!8?C???G#28A!5?G?GG!4?_???_#25O!4?G#143?C@@BLIFCKD!5?O?K??AGCgOc[G{cO!9?_@@?BAAB!8?OA@@?O`??R?K!4?GG#11_oPHNFBBBAEECC!4K!4WOooo!4_#87_#43_#57_#70_#107_#2_#66_#22??_#45O#11_ooWKEFbpoWKKEB@#16!28?G#11N{wO__#61O#122!30?O#8O#12O#46C@#87@!6?@???A???C!6?A#17@#28_#165_!8?G#87O#19O#51O#26O#16O#44_#37O$#82!32?_#87??C!7?A!4?C#36_#7G#45O#43@#71_?_#25A!8?G#210A?@A?CAC@C?CI?G?IDrGPHQoEOGC_!6?O!6?A?@?A!5?C???_O??c?A?@#136_!4?AO#18G#12_#172?G???@#1__O?_ODiODaGTaHCQhCQGdQGdQGaTGaSH_IT_IPcAhSAhCQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQGdQHcPI`SGcOI_GOG_GS?_O???O#8G#20G#205@!4?A#6C!4?@#71A??C!4?G#2OO???__#109A#19C???_#211C#90??G#127G#5O#72ADG@A?@A@!5?CQ_AQA!7?_!8?@_#13O#19C#42_#53C#12_!6?C#0G#72CCOQ??@#112?G?KgPqSw#22@#34@#5_#211G???_??GG#161G#104G#76G???A#70A#66_#10A#14C#19?_#5G!4?O#76O#67O#115O#72!8?O#122C#84C@A#51_!7?A#1_?_O?gQ@Si@SaHCQhCQHcQHcQGdQGdOA!5?ADGAPcIOIcQGaSAgQDgQChOIcPIcQHcQHCA?@???_?gOG_GO_O?_??O???_???@??@A?@A?@AC@AHCAHSAGDOI@SaHCQhCQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQGdQGdQGaG$#139!32?A#136??@???@#46C#20A#19A#6O??C#5C???G#108_#70O@#83@!8?C#161C#80@???G#116O#118G!9?o_#80??K_@A?A!6?A#49A#216?C?@!4?@A#212???C#55!16?C#71O#19O!7?O!8?A#56!91?@#52@#51@#19@#58???A#3C#9C#85?G#118G???O#5A#138@!9?C!7?O#12D#22G#16_#7@#87@!4?O#34C!4?G!8?O#48C#41C#2A#10_#40_#118_o?oK[c_?GO_o?O_OG#44C@???A#51A!5?_#49@#5G#43G??A#58P#36O#22C#118GG#8_#56_#49GA?W!5?@!4?A#13@#12@?C!5?@#72?O#13G!5?C#120_#45?C#40C#211C??@C@EDGLH]]^NnA#6?O#8G#68@#44C#108_!4?AA!5?A#22!27?C#12OA?_#18O#15O#129!33?G#43G#146A!8?A#68?C#183?C#191C#13C???G!4?A!8?G#81G#184?G#60G$#181!32?O#5??A#41A!6?C!7?_O#76@O#20O?A#77_#143@???A???CC??G!4?O??O?A???_!4?@!4?A#91@#106@#217CO???_G?o?C??S???_C@I_H?IdA@?K`?A#31?G#51G!6?C#173A#87@C?O@#0O_w[nyTny\vi\uzlUzlvYlvYlv\iv\ju^ti^tmZ|Uj|UzlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZlvYluZmt]jvZms]ums[sg{Wgwo__oo__#35A!8?G#19@#41G!8?_??O!4?_#36_#217A??@A#161??G#76O#94O#158O#58_!5?Q#88O#108G#120C#217O???O#59@#76@#13@#87@#56A#26A#43A!7?G#28@!4?A_#76C#80@#158C#84C#40C#47A#39@#66@???O?@#2?_#40_!8?@#71@!4?A#18gO!8?AG!8?_#35G#212A!8?A?@!4?B#65H#118C#87G#62@#13Q@!4?_#187_#18A???@#36!27?A#20?@#51C#13G#125G#19!36?C#7?_!7?A#170A#4???G#46G#53G???O#27@!8?C#152C#102C$#35!36?@#205A!8?O!9?_#49@#118@#14_??C#97C#6??G#126G#109G#28G!4?O#122O#230A#55!10?CGC???_#214G!7?OC?C??O?i?`QGQ?O???O#94!8?_#72??A#223A#100A#158@#192_OO#8??A#21@#5_#82_#94O#14G#6C#10C#136!99?A#37???O#13@!6?O#87O#98_#82AA??A???G#70O!4?_#121@#101O#88O#59?O#21O#96?@#212@#216B#35_??G#137!7?A@?A@#128_#210@#106@#222?G#21A#47A#45@#129@#32@#115???A#48?C#12?A#71C???G!4?_#52A#94A!7?C#141A#182?G#86G#107O#25_#20_#80???O#54!5?C!5?O#35@#46A#139G#97A_#57O#118_?o?_!4?_?_#71?_#8!5?G#80A!5?O!5?O#224!4?A#89C#175A#23@?OG#172A#19@#5C#209@#22O#0oOg{Uk}jT}j\uzlUzluZluZlvYlvYn|???@BDIF\MZtntZlv\j|VlyVlzUntZmtZluZLUJLFA???W}Ums[skWgwWoo_oo_?__??@@?@BA@BEDBELEJLEJ\VYnt}j\uzlUzluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZlvYlvYlv\v~$#76!36?C#33C#25G???O#179G#42C!4?G#189_#23???_#2?@#67_#139A#22A#114@@??AB?@AC@B?HMJHJDNSGDOGU?Q_@gcuZSWoSwcFhnQVaLZgxC`SHTDyiPZSkTAxmZr[ZGFD@@#186!8?A#25A#68???G#108!105?G#76@#146@#44G#45O#22O!5?C@#43G!9?C???G#157!4?A#213A#210?@?@C#121!8?_#18_O!4?D#116??@#63!10?G#222G#36C#20C#10_#7_#35@!4?O#57O#211_#55A#137!4?A#112@#239C#34!4?A#64!13?_?O#67_#50O#51O#69?C#44A??C??C???A???O#72!6?C#94G#12O#122G#118G#193!17?O!4?@#81?@#76G#17G#75C#95!28?_#65??A#78C#13!39?G#108@@#139@#58@#65A#23A???C#21!5?G#12@#136G!7?C_??G$#172!37?@#32C???C#21?OC#31G??O#237O#13!9?_C#216@?@?C#5???O#139?O#217A!4?O?BP#66!12?@#206?A#212G#43@#120@#240!30?O#183!13?@#129!113?@#102_#46@#79_#195@#184@#21_??@#36?G#56A#5O?A?_!9?@#67???C#114@?A@AE!4?W!9?_G_??GSeG#61!5?G#64O#47O#30O#146G#70@#114?@@???@!4?@!7?AGKCCMEs}_RaKICM??CC!6?_OO_?_?@?@??A?A??C!6?OO@??_?DGA#136!4?G#43_#21C#181G#53C#152!34?O#20!43?O#60C#173???@#6!12?@??O!5?C$#108!38?A#94A#186A#56G#71G#75?G#59O#13?_#33G#32!11?A#211A!5?A?@E#94??O#52!186?A#152@#213_#209A#23@#58_#18_???O???A!9?AC!5?_#145!9?O#49G#109G#130G#156C#206!19?_#49G#183?O#87O#25?_#229!10?G#39!20?A#68?C#43!6?G??C#91??@#49O#28O???A!8?G#188!19?_#146G#164O#184C#44!79?C#95A#86!16?O!7?A$#167!39?G#220G#145C#115???G#28?G#35_#57!211?O#188A#69??C#153@#32A???CK#14O#108C!4?G#128?G#12!9?G!8?_!7?G#72!57?A#127!6?O#99G#20C??@!5?O???_#65!5?A#52!121?@#139O!7?C$#213!39?C#194!7?O#152O#73!211?_#107!5?C#50CC#42??A???C#20_???@!4?O?C#118??AA??C?C#225!5?A#98!76?@#160@#109O!5?C#168!129?@#19O#35A#181A#16A#5_$#182!272?A#129?G!7?_#179!7?C#58!90?A#81O#68!135?_#57??_$#67!274?C#237OO!9?_#206!95?_$#205!274?O#191?C#8_-#0~ZulZulZulZulZulZulZulZ|Uj|VyntZmuYms[ks[gwWgw_Oo_O!5_#20A??_!4?@!8?C!6?@!8?C#77C#41C#114AA?@@ECFEAMMLAJSI@BGQO_?YOAhcPI?A@??@#139_!7?_!4?A#65?@#102!113?@#61!6?@#10@#56@#21@#20@???A!6?@!5?O!6?G#237C?CC!5?O#56_!6?A#18CO!7?O#69G#8C#87C??C#48G??_!8?AA#35@#137__#118GG#43A!7?G#12I!4?S#33_#18CAC#116?G#118C?AG@A?OOO?A??@A!4?AAA?O??_O#12A???OG?O???A?_?A#0__WsmYulZ|Uj|VylvYlvYluZluZlvYnt]j|Uzl]r#69C??@??G??_??O#22A#71A#1@??@?A@?A@??@??@#51A#128_?_!5?C#44?_#4_#0~|nYtnY|Vj}TzmtZlv\j|VzlvYku]uks[sgWgwW_oO?___??@@?@BA@B@EFDBENLIF\MZTmz\uj\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZmtZmtZnyTnyVl}jT}j|~$#1?cHQcHQcHQcHQcHQcHQcHQcAhSAgDOIcPGcOG_OG_O?_O?O_?O_#63O#28O#70O!8?@#21@#133A!4?C!8?_#94?O!4?_#217@???A!5?C?A??C@!7?_AHCA?CjCQ?EDA#11_oow[MNFbbpw{]MFBB@#62!126?A#12@???A!8?I???C!7?@O???_???@???A#22O#114@@??@@?BB@@B@B@!5?CG?Duo}iBagGsQOOC!5?_!5?@?@!9?CFMCN@MH\`FjC?IBH???kaGcw?C#82C!9?G#23C??@#1_?O_GOcHQcAhSAgDQGdQGdQHcQHcQGdOI`SAhCQ`K#7A#11~o??@@BAA!4CK!14GKCCCEAAB@@??|N#45G#1?AOdIOdAgS@iCPIcQGaSAgCQGcQG_GOG_GO_O?_O?__???_???@??@A?A@?ACH?ADGAPCIPCaHSaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcPIcPIcODiODgQ@Si@SA$#125!33?@#181@#57@!4?A!4?C!8?O!6?C#36C!4?G#129C!8?O??_#52O#7O??A#81_#98A#211A!9?@?@@??AL??@OGTCaXS_?O#212?G#72_#225O??C#136G?_???C!5?@#0_Ow[ui]vlZuntYnt]j|UzluZluZlvYlvZmtZmv\iv\mzTmz\vi\vylV|iv\ju^ti^tmZ|Uj|UzluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlVylv\j|UzmZvlZ|Ui}iYg{kWwgWwWo_oOo!4_#19O#23A@#133@?C#107??A!4?O#23G#51C#142_#171O#77G!8?_#51_#44_#80C#143C?ECA!8?On_@I?CWCS_AG?C#13_!5?G!4?A??O!9?O#94?O#55@!5?GG?I\CSSuSW?ScO?W?O#59C#63G#8O#87@!6?O!5?C#7??@#123@#15!34?G#19?@!5?@???G#87G#35?O!6?C???O#12C??G?A?C!6?A#46?O#4!25?@#50@!8?C#22C#57C#87?C???G!4?O???_!6?O???_#68O#51_#8_#9_#10_#74_$#51!36?@#17A!4?C???G#40G#56G#21G#6G#51?@#69@!4?_#98@!4?CA!8?G#56G?_!4?@#45_#80@!4?@@@#49@#210@A?A@!8?C@CG#141!12?_#143CCAA@#51A???O!4?@!5?@#211!126?A#11!4@BBBAAEEECKKKGGWWWOooo!4`!4B!4ECKKKGGWWW!4o_owwKEBB@#55O?OG?@???G?S??G??C!6?OO???@?@#107A#34_#8@#44_#211?C#5@#83G!7?_#80?SOSO__g_@Gc!6?G#64G#84G#65O#39G#22G!6?G???@#5@#2G#23!38?_#44?A!6?C#18A#20G!4?OOSC???CCO!9?C#25?A?@#21G#53??C#165!27?@#81@#13@!8?C???G@!7?_#51C#77C#9C#152C#24C#139G#165G#171G#5O???_#73O$!36?A#25@#11!5@!5BFFEEMMKKK[[WWww!4opp``bbBBBFFEEMMMKK[[[Wwww!5o!4_#87_#5_#118@!6?C??HCj?ChCQG?H#76O#42G#41C#44C#18?O#192_?G#87O!6?C#94C#16!129?A#42A#102C#17C#88C#15C#7C#18@!9?O???_#50??C#98G#82GGG!6?_???_#20O#5O!4?G#14G#146G#108G#98G#67??A#7O!4?@#210C?QGC??C#40@#108@!4?A#66OG#26G!5?@#90@#28@#40@#109OA#143_!8?C#10G!7?_#3???_#211?@?AG_?OGAG#11!4@BBbau]MMFb`pW[KEBB@#56!36?O#12?C#34K{{sowWoo_o_???_!6?_?___ooOoOwW{w{#57p#181??A#10!30?A#11!4@!5BFFEEMMKKK[[WWww!4o!4_#23O$#82!38?A#15A#13?A!4?C!4?@???O!9?@#50C???GG#32G#19?C!4?@#88?_#82_#141@#13A#216@#120A#118@#40@!8?G!8?_#216I?C#58!13?_#210@#49?@#75A#21?@#191O#6_???C??O#3O#1_?_GS`GQcHOIdOI`SAhCQHcQHcQGdQGcPIcPGaTGaPCiPCaGTaGDQgATGaSH_IT_IPcAhSAhCQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQgDQGaSAhCOcGQcAhS?ScS?Oc?O_?_?O?_#22@!6?_!5?GA#69A#6A#108C???G?_??O#40@#34A#211?@@#7C#72A#45C#217??A#28!5?@???_#217G!5?@!5?GC#11@@@`pz^M!4EC!4KGWW[Yrpoo___#84G?G#65@A#49!6?O#50???@#67@#77@#14@#20@!6?_???_???C#188?C!5?C#116!37?@#87?G#21o!6?G#13A!5?C!8?C!4?G#48@#41@#7@#91???C?A#12!33?@#108A#52A#172A#19A#115!4?G#94G#7G#12@???A!8?G#172G#95???G#7O#15O$#102!41?C#12A!7?@G!8?_!5?@???A??_!9?AO???_???G#55?@A!6?O!7?O?_#80!10?O#222G#5!6?G#34?G#181CA#59@#17?_#19G#129G#5!137?C#25@#218G#26G#58G#65O#71@??@@A!8?C???W???OO#28_??_#157A#118AA?B!5?C!5?OW#80_!8?O#42?@#19?@#115A#32_#69A#20O???O?@#80__#64_#98O#7A#48_#41A#50A#35?A#20_#130@#231?A#97G#61A#72@#12??_#213O#64E?CA?_#25!12?@#71A#72C__O#76C#19?C!7?G#34@#8A!4?A#36!39?AA!4?@#158@#102@!5?A!8?A#49A#87C!6?@!6?O#95!35?C#4!7?O#10O#139@O#6O#5A#164A?_#19C$#129!43?C#22C#87??C#18!6?A!8?G#234?C!9?O#2O#18?@#205!5?_#48!4?A???C#225C!9?O#83_#212O#72_#80O#214A!6?@???@#189!10?O#186?C#7A#172@A#79!141?G#40G#139?@#107?@#43A!9?@??O???_#57_#188?G#21@#35G#13G#87G#88_#52O#41??_#90?C#222???C#12!5?a#13H#72O!9?@!6?C#82???C#121C#76_!8?O!6?C!4?O#127?O#35?_#42_#66!16?A#143C#97A#6A???C#13?@#57@#77@??O#15?A#205A#94_#21O#13G#43!43?@#57A?C!6?O#12C#25C#8_?_?__?_?_???A???G#42!4?A#27!48?O#53@#50@#84@#28_#59_#23A#65A$#53!54?@#5A#23@#41_?A@!9?C??O!5?O#72!11?A#115C#76?G#22G#28G#19O#222GG???O#15_#206!4?_#173!24?G#87!144?C#108!4?O#34O!8?G#139???O#94OC#36C#120!4?@#99@#115@#116A#43???C#58!12?_#21_?A#211A#112A#49!5?O_#87!9?A#10??_#25@!9?C???G!7?_#101!23?_#108!5?_#51@!4?C#84??O#5!45?A#91G!8?_???_??_#6OC#57?O#76O!4?G??C?A#123!52?_#146?A$#215!55?@#49_#34A#71@!4?A!9?GO!4?_#232!15?C#34???O#143GG???O??_??_#76!173?A!4?_??@#209!6?G!4?O!6?_#65!13?O#160G#70_#62C#138?@#18!19?@#141O#49o!8?@#75@#115!4?A#124@#181!35?O#81G#58!54?C#0???@@@?@@AB@AB@AB@?@@?@#106G#173!58?O$#136!56?O#209@#134A#44C!4?G#14?G#138C#76A!6?_?G#154O#94!21?O#158O#14?_#82!181?@#28@???AA?A#154!7?O#129!5?_#218!20?C#139!24?G#14G#161?O#118_#72_#194??_#209!43?_#152O#139!58?A#40??A#48A#43??O#58!4O#32!4?A#69O!6?_!6?@$#43!60?C!4?G!8?_!8?O#146!202?A#33A#2_#14C#142C#5_#44G!6?A???C#182!102?_#220!61?_#7!4?CC#188!7?A$#108!60?A!8?G#6O!7?G!8?_!5?G!4?O#39!188?_#13C#67??@#32ACA$#22!61?@!9?C#109O#87??C#42g#188!214?C#42@$#32!61?A#45A#94C#188??A#140A#67G#25O!9?G!8?C$#58!69?A#69?OC!8?@-#0~ZulZulZulZulZulZulZulZuntYnt]j|Vynt]j|UzluZluZluZlvYlv\j|UymYuyk[kwkWgw_oo__o__?_#9@!8?C?A??G?C#77O#27O#12_C???G!4?O???C!6?@?C!4?A?G???@#22@#84!154?@#82@#120@#35@#17A???C!8?O#32@#59O#237@?@@!4?CC??C!4?OO#41_#14@#58G#88@#5A#39@!7?@#18A???@#49CA?D!9?O?@??C#18GO#21O!9?G???A#22A#80@?B@A@#84C#14G#28C#122A#53_??O#136O#6G#34C!4?C#7A#68A#125@#29!42?A#14O?A#34J~n~v^|}!4~|~~|~|~|vz|v|~l}\vn|vi~R??C#0Fj}tZmtZmv\iv\mzTnyVl}jT}j\vynT}j\uzlVyntZlv\ivZntZnyUmuWwg[sWwWw_oo!6_?@@@?B@AB@FADFJMLJU^TI^tmZ|Uj|UzluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZm~$#1?cHQcHQcHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAhCQHcQHcQHcQGdQGaSAhCOcGCO_OCO_O?G??OO???_#139O!8?@!4?A#13?O???C???G!4?O#66@!4?A#18G???O#52_???C#8A@#10?_#0_oOwwmZulZ|Vi|VylvYlv\iv\ju^ti^tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZlvYlvYlvYlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYlvYlvYlvYnt]j|VylvYlvYnt]j|Vylv]umu^umuWwk[kwgwgwoOoo!4_#22A???C#23A!7?GGG!8?_#13O!9?O#57O#55G??OJWEIPOHgkI?CG?A#20@#44@#143_#118__GW?G??O???@__!6?@??@#30@#152_O#108GC#146A#184A@#9@?G#74!46?C#44A?O#57_#128?O!9?A??A?A??GCA!4?@?G?AGT#106?_#58A?@#1wS@IcPIcPGaTGaPCiODgQ@Si@SaGDOi@SaHCQgDOIcQGaTGcOIcOCgOGcCS_G_?_?O??O!9?@?A@?A?DA?C@ACH?IT?IPcAhSAhCQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcP$#60!59?@#86@#108@#142@#7@#13@#10A#11!4@!5BFFFEEMMKKK[[WWwwooopp``bbbBBFFFEMMMKK[[[WWoow[KMFBbpww[MFFB@#88A#78!158?A#19@!8?C#28G#42G#34@#12GA???S???G!7?A???C???G!8?_??@#43C#31G#211G#54A!6?C??A??@#140?_!4?A#58?G#194G#217O!8?_#58A#69O!7?G#63?A#139?A#22@#58G#209?G#171C#81@#26_#60_#0_Ow{kUzluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZnw#5C#11~_#91C#221???G_A@#69!11?A???GA?Q?A#220!6?K#11o~#35A#60!52?@#10@!7?C#108C!8?O#77O???_#16A#52??C#9C#125C#6G#57G#189G#23G???O#3O#51_#52_#108_#168_#60_$#30!64?A#12@#107A#77A#20A!8?G?@??O?A#15_#171@@AA??A!5?GG??O#21_G#44?@#20@!4?A#8A#51_!7?O_#81OC#6I#44@#164A#19?O#23O#59G#1_?COcHQcAgTAgDQGdQGaTGaSH_IT_ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQGdQGdQGdQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGdQGdOI`SAgDQGdQGdOI`SAgDQG`HPH_GOGcCO_O?O?O??_#51?G#94@!8?@#52@#35@#13@#87P#59A???C???G#139G#146@#27?O#35A???C#114AA!9?HA?DHPgASOO?D??C!5?O??_OOO?O_???@!4?@AAF#52???O#176_#189!4?A#117O#13@???@#75!43?@#6G#20?G#220O#221!27?_?O#13!5?C#59?G#27!54?@#81@#6@???A!9?@#139@#53@#12A!8?G#84C#17???G#7O#146O$#19!69?A#50C#22C#37O#5C#87C!4?G??A?O!6?G?@??O#23G???O!5?_?_#87A!9?_A!6?C#173?@#57??C#13A#11!161?!5@BBBA!4ECKKKGWWWOooo_!4`!4B!4E!4K!5Ww{ur`___#66O#106_#8_#41_#2_!9?@#11_oOGLF!6BAEEECKKKGWWWO!4oW[MEB`pwWKEFB@#8!45?_#35?C#20!36?@#75?_#74!56?A#2A#11!4@!5BFFEEMMKKK[WWWww!4o!4_$#68!69?C#191??C#61G#46G#94G#69G#25?G!4?A#184@!5?AA?C!6?G#146??G#165???O#69@!8?C#72A@#14A#70@#13?G#176G#186G???@#102???G#29C#115!161?A#59A#7A#5A!5?@#82???O#129@#69A???C!7?A#6A???C#189_#46!4?@#52O#42A!5?C#77A#67@???A#59O#71O#143??O#64???A??E@?YGC#5O!5?C!5?@#20@!5?O???_?G???C#86!9?O#1_??OgCQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcO#18?@#76?@#44!36?G#108?O#136!57?@#53A#76A#12?A#8?C#51C!8?O!5?C$#44!78?@#10O#53O#146@#62_#12O???C#6C!7?A!5?_#152O#52!4?O#35O#71@#9_#118@???@B??@#182_#192?O#25?O#172?C#18!172?A???@!4?G#76?O!7?G#70G#153G#19O#51O#34O#9C#44_???@!7?C!8?A???_#112!5?CD?@Ac#46?A#12_??_CA!7?C!7?C!7?G_??@C!4?AG#64!155?G#87C!8?O?C?_!6?O???_$#73!78?O#76?@#64??_#129_#152@#182_#108A@!8?C!4?G??_O#94??@#205_#19A#139?_#56A#2A???A#10!180?C#41C#77C#20C??@???A???C?_#25_#58G#234??C#171C#53??O#20?_#186_#112!7?@#49@#2A#40A!8?C?C!5?_!6?_!4?A#109_#66?O#211?_?O_g_?_O#2O!7?C#65C#173!169?C#82G#70G#7G#13G!4?A#71_#181A#35_$#71!83?@#186?A#189A#19_!4?@#35G#59A!9?_!7?_#143@#217@#5_#136_?G!5?_#47!179?G#6!7?O#205AA??C!6?C?O?G?OOO?_??__#80@@!9?GEGCAO??_!5?OAA#34@#36C#91!4?C#22C#72G!7?_#49@#45?A#40A#26C#87?_!8?_A??C#44!161?@#3O???_???A$#18!88?_#165@!5?G#170?A#7O#142C#57C#212!14?@#43C#80?@#58C!9?_#48!182?_#211_#71_?A??A???G#21???C#191!8?O#55?@#165_#15C#16C!4?G#120??@#122@#68!7?G#65_#33!5?O#50G#35G#214!6?_#42C#76C#6C#158G#55_!9?A!4?@#60!170?O#136G#88??@#19O???c!8?O???_$#164!89?C#183C#117@#209C???C!9?_?_#90!9?C#50!193?@#209??B??A?A???G??O!7?_#21!4?_#6_#86A#87C#5?G#67!20?@#56!12?G!9?C#25G#17!179?@#164A$#5!92?G#82?C!6?G??OO#77!209?_#108@!4?AG!6?G?__o???A!9?C#120!32?@#107@#44A???O#43C#36_$#34!94?G#237C#154!222?C#143!22?@#135@#121!38?G#66@???_#46@$#18!382?G#90O#99???_-#0~ZulZulZulZulZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZlvYlvZmzUlv\j|Vlz^v\~]}[sW}W{[cwWwWg_ooO?!4_#5A#35A#59_A#108@A#51CC#136A#191??@#6@#0_?og[iu\ju^ti^tmZ|Uj|UzluZlvYnt]j|UzluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZlvYlv\iv\ju\mzUlzUntYnt]jv\myUm}k[k{oooWwoOo___#51AO!7?@#59G!4?C???_#138O?_???_#18A@A?G#98@#210C??ADA?D??O!8?@#108_!5?B?O#15G#1_OCgCPIcPI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQGdOI`SAhCQG_#11B~AECKGWOOOo!17_OOWGKKCEA~#7G#17@#37@#68!77?@!8?C#87A???C!6?A?O?C?_??G!7?_#4O#51_#77_#9_#168_#17_$#1?cHQcHQcHQcHQcHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQGdQGcPChQGaSAgQC_G_?_?aA_?_?_O?_?_OO??__#6@??O#39_#88_#184@#14_#196A#188@#193A#13@!7?C#171C#22A#139@#84@#73!186?@#65@#23@#142@#7@#5@???A#122C#41C#69C#20C?@#26G#43G#9@#19A??O!7?@?O#129G!4?G#12C???I#22O#10_#143@!5?A@C!4?G#80A?HMETLCC#6O???O!6?A#0_oWgwUzmtZmt]j|UzlvYnt]j|UzluZluZluZluZluZluZlvYnt]j|UzlvO???o___#220@?C#35G!4?O!9?O#58O!5?C?A#1OO!4?gQDgQChOIdOI`SAhCQHcQHcQHcQHcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaGT_IPcHQ`SHaGQcAgCgOG_S?O_O?_O?O???_!6?@??@A??@AC@GADGAPCIPCaHSaHCQhCPIcPIcODi$#102!84?A#73?@!9?C#87A!8?G??A?O???_??@CCcQ@#1_?O_SGaSH_IT_IPcAhSAhCQHcQGdOI`SAhCQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQGdQGaTGaSHaPChQChOIdOI`SGaOCgO?O_O??GG_??_#81@#79O#68O#71@#171@@???@A?C#184CC#237CC#7O#50G??W!4?O#115`!8?C#55A#114BB@G@??G!7?@#7G#8C#51_#44A#170G!4?C#2_#20@#7?C#84C#12@#27@#16!51?A!7?_#76_!7?O#21!6?O!7?C!5?G#77?_#82!80?@#146@#7@#13@#184A!8?G#13??G!4?A!8?G???O#7O#171?O#5_$#84!87?@#82@#37GE?C??G#19A!8?G!8?_C!4?A#42?_#77O#57G#65G#48!195?A#11!4@!4BAEEEC!4K!4WOooop```bBBBAEEEC!4K]XXO!4o!4_!9?_ow[KEBbpoWKMFB@#88A#94!52?@??O#57@?A#221@?C??@??C???G#57!5?O!8?O#23O#35?@#19_?A#93!83?A#12@#11!5@!4BFFEEMMKKK[WWWww!4o!4_$#22!89?@#76@#13@#49A#11!5@!4BFFFEEMMKKK[[WWwwwzwWKMFB@@#31!194?A#22A#14A#4C#12!4?@???I!4?C???G#36@#81G#193?G#69A!8?G!5?@!6?G#56G???O#12_#5_!6?_!5?@_#172O?@#13_!4?A#86!53?C#13O???A!4?G???O#20O#25!12?O#87O_#220C!4?@#171G#13C#139?O#41!85?A#34A#51A#19A#129C#22C???G#173?@!4?O#164A!8?G#59G???O$#136!92?@#108A#77A#35A#10?C#41C#139C!7?@#34O???A#209@#208??@#52A#60!6?O#85!200?G#87!4?C#107G???O#37_#34A#4_#23A!8?G#43A#77O#2GG!4?_!9?A#72???C#161G#211ACDG?A?@GA?@G@#70?A#94@#205OO#171G#164A#23A#82?@#151!57?G#12C!7?G???O#20!16?G_!4?G???C#57!91?C???G#79O#6@#9O#34O#20O!5?C#139C#56C#2C#62C#12??O#24G$#172!100?C#12C???@!8?C???C?@A!4?A#211!203?G#165??@#77??O#102_#53A#209@!6?A#87???A#41O#44_??@!7?O???_!4?O#8?O#216A?FS@WA?B#158O#143?C#53???_#136C!4?O#44!58?G???G#15O#58O#106C#128?A?GG!4?OO?O?O???C?A!4?A#14???O#5!94?C#136!4?G#81@#165@#88@#4@#71_#146A#82A!8?G$#48!101?G#45G#140G#7G#4O#75O#53O#146@#27@#173O#237@#129!226?@#152_#82BA?EAA???C#107C#71?O!6?O#75_#49@#141?_#5?C#6_#25@G#230???C#217?G#179?O#65O#35_#36_#41_#2_#49O#118OIE?B#165???G#192C#184C#59C#20!60?_?C#59G#34@@AAB@FEFNJNNNF^N^!4NJNLFBBB@@#61!97?G#152!4?O#68???_#181?_#7_#3A$#205!110?@#188!229?_?C#27@???A#34!4?C#20_??@???A?O!6?G???O#115!8?_#55G#212??A#186!6?G#87G#25!62?@???C#5??_#87_#5!19?G#53_#12O??A?@?@#19!105?_$#6!340?C#52C#13_?G#35!8?C!8?A#36??_#120C#96C#107!15?_#9!73?G#227?O#84!27?_#0!4_???}UlyVlzUntYnt]j|UzluZluZluZluZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\vi^tmZul]ju\vlZ|VyUmu[g{k[gwWgo_oo_?___?@@?@BA@BBEDBEFLIF\MZTMz\uj\uzlUzmtZmtZnyT~~$#76!341?_#108@#18_#76!10?_!6?A#231!4?A#21!90?_#44!142?C$#5!354?C#66O#94G#8@#89@!5?_$#145!354?O#108G#133_#152O#58G#212?@#128O-#0~ZulZulZulZulZulZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZlvYntZlvYntZmtZmv\ju\nzTnzUmu[j|Umy]um[snYvlZulZvylVynt]j|VylvYlv\iv\ju^ti^tmZ|Vi~Tmz\uj\uzlUzluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\ju^ti^tmZ|Vi~Tmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYluZluZlv\j|UnzVlz\ui]i{SksWwWgoOo_o__?_#44O!4?G?@!8?C#172_#87?_!6?@#1oOG_SGaPCiPCaHSaGDOi@SaHCQgDOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcO!4?@SHDOcGOGaQ?gO?O_OG_OGcGOGcPIcQ@!4?@gQDgQ@Si@SaHCQhCQHcQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaGDOi@SaHCQgDOI`SHaPCgQ?Si?SGaOCO_GOc?_?gO#2G#165G#139G#43G#136G!8?_??G???O#5O#37G#70O#16O#87_$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQGdOIcQGdOIcPIcPGaSHaOCiOChPHaSAgOC_GOaIOdGQcHQcGDQgDOI`SAgDQGdQGaTGaSH_IT_IPcAgT?iPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaSH_IT_IPcAgT?iPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQHcQHcQGaSAhOCgQCaGS_S?gOG_?_O?_?O???_#8A#104A#115a???C!4?C#57O#46G?O#40G#139_O!7?O#4O#29G#23C#15A#7@#78@#7!59?@???_#54_#31!4?@#33@#181@#35@#6@#5@#12@@???@?@#37A!7?@#53?_#12_#11_^N#3G#4!105?@#171@#94@#57@#6@???A#68C#87A???C!6?A?O#8A#1@??@?A?@A?C@I#101?O$#37!112?@#10??@#53@#57@#51@?@#59@#4@#10!220?@#165@#57@#13@!8?C???G#18A!8?_!6?A???@#136??O?O#59A#12_#22_#0__?gs]iv\mzTmz\uj\vynT}j\uzlVynt]j|UzlvYnt]j|UzluZluZluZluZluZluZn_??BMJuynZumu[k{Sk{k[ks[kuYumuZmsZLM???o}VlyVl}jT}j\uzlUzluZlvYnt]j|UzluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\vynT}j\uzlVynt]ju\mzVl~jT~ju[mym[skWwWwO_!4o!4_?@@?@BAB@BEDFBEDNN$#58!119?@#118!227?A#11!4@!4BAEEEC!4K!4WOoop!4`bBBAE}Mb`pW[MEBB@#23!61?G#11Nw_#62O#85!10?A#17A#3A#18@@@?@#123A!5?@#16!5?O#18O#19_#57O#22A#12!110?@???A!7?@!8?C#6C#139C???G#27G#168G#60G#191O$#136!347?@#28A#42A#7A???C#61G#87C???G#66@!4?B???A#128G#33A???C#41O#25_#210O#133G#58???C#19A!5?C#26!63?A#165_#19A#41G#86!14?A#75A#46A#10A#135A#44?@#13@#20@#52@#188@#27!7?C#95?_#108C#10!110?A#11!5@!4BFFEEMMKKK[[WWww!4o!5_$#25!351?A!9?A#20AO!6?G!8?c?G@#193?G#201C#184C#81@#86@#192@#51G#102!64?O#170O#87C#58O#68!32?@#146??@#9!111?A#52A#23??C#146C#191C#13C!4?@!7?_!4?G$#17!351?C#71C#70C#12??@#41G#69G???O#48@#143`#19C#22_#49A??C!7?G#204!5?O#205G#182?C#164A#146!66?C#172?@#61C#152!32?A#4!121?G#3!4?O!7?A#9??C#10C#102C$#137!356?G#43@#21@#90@#108@O#210@??@#35C#42C!9?C#76C#164!112?G#108!127?O!5?A$#118!360?O#32!6?@#5_!5?OA!5?@?@??G#7!232?@#59@#51O?A#56_#57_$#76!367?_#40A#122A!7?G#77!242?O#23@#19Q#152_$#67!368?@#34@#58@#137C#112C#195C!6?O!6?A#60!234?_$#98!368?C#141??A#134G#12O#50GC#142O#95!245?@$#36!373?A#7A#138G$#108!373?G-#0~ZulZulZulZulZulZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|VylvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZlvYlvYlvYlvYnt]j|UzluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\uzlUzluZluZluZluZlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvZmt]j|VymuZmu]uk[sk{Wwg__oOg{Smz\vlYvlZuntYnt]j|UzluZluZluZmtZmtZnyTny\vj]tzmV|iv\ju^ti^tmZ|Uj|Uzlv\ukwooo`@ba@BBEDFADFBEDBAB@a``poOwksYnt]j|UzluZluZluZmtZmtZnyTnyVl}jT}j\vynT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\vylUzluZlvYnt]ju\mzUzlvZmyUmu[skoooWwWo$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAgDQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQGdQGdQGdQGdOI`SAhCQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaHCQhCQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPI`SAgDPHcOG_GO_GO?_?OOO?_O?gOCaGQdGQcHOIdOI`SAhCQHcQHcQHcPIcPIcODiODaGS`ICPgATGaSH_IT_IPcAhSAhCQGaGO?G???_?@A??@A?DA?C@AC@?A@!4?_?OGcOI`SAhCQHcQHcQHcPIcPIcODiODgQ@Si@SaGDOi@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaGDQhCQHcQGdOI`SHaPChCQGcPCgOG_GOGGG_?_#37G$#17!368?@#71@#142@#7@#5@#12@???A???C#28G#5C#22C#3?A#129@#57!69?@#11@@AACCKGGGW!12OWGGGKCCAB@#152?@#24!133?@#31@#165@#57@???A!5?C$#38!372?A#115A#11!4@!7B@#52!72?A#2C!8?C#27_#36_#57_!5?G#58?G#12G!7?C??@#13!138?@???A#171C#41C#77C#139C$#67!374?A#57A!9?A#87!73?A?C#73@!6?C#42??G??G#176G#7_G!4?O#87C??A#182@#59C#54!140?A#136@???A#87A$#13!376?A!9?@#12!73?@#59@#26G#139A!7?G!6?_#142_#17C#88C#60_!5?G#129!142?A#11!5@BBB$#10!377?C#9C#69C#20C#46G#87C#80G#191!76?C#86G#173A#5G#82A#19C#20O!7?_!8?C#52O#23O#13G???A#94!141?A#60C#68C$#61!380?G#102!82?O#205O#77O#51C???G?_??__#108???_#135_#19O#86?A#27A#164A#10@???A$#25!467?O?G#146???GG#77!7?C#22!4?G$#37!467?_#115_#6!4?_$#70!467?C-#0~ZulZulZulZulZulZulZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmz\uj\vynT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZlvYnt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZlvYlvYlvYlvYnt]j|UzluZmt]ju\vlv\j|jVynZvzlVzlv\ju\j|UzlvYlvZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlVynt]j|UzmtZmv~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPCaHSaGDOi@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQGdQGdQGdQGdOI`SAhCQHcPI`SHaGQGaSASgDOcGCQgCQGaSHaSAhCQGdQGcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQgDOI`SAhCPIcPG-#0~ZulZulZulZulZulZulZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\vynT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZlvYnt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYnt]j|UzlvYlvYlvYluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluZluZluZluZluZluZmtZmtZnyTny\vlv~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaGDOi@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQGdQGdQGdQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODaGQG-#0~ZulZulZulZulZulZulZulZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTmzUlzUlzVylvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZlvYnt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]tzmV|iv\mzTmz\uj\uzlUzluZluZluz~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiPChQChQCgDQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`ICPgATGaPCiPCaHSaHCQhCQHcQHcQHC-#0~ZulZulZulZulZulZulZulZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZlvYnt]j|UzluZluZlvYnt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZlvYlvZmtZmv\iv\mzTny\vj]j~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGcPIcPGaTGaPCiODaGS`S-#0~ZulZulZulZulZulZulZulZulZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZlvYnt]j|UzluZluZlvYnt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZluZluZluZluZluZluZluZn~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcO-#0~ZulZulZulZulZulZulZulZulZulZulZulZulZ|Uj|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzlvYnt]j|UzluZluZlvYnt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT}j\uzlUzluZluZluZluZn~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcAhSAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQGdOI`SAhCQHcQHcQGdOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si@SaHCQhCQHcQHcQHcQHcO-#0~ZulZulZulZulZulZulZulZulZulZulZulZulZuntYnt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|Vynt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZlvYlvYlv\iv\ju^ti^tmZ|Uj|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}jT~iv\mzTmz\uj\uzlVynt]j|UzluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZlvYnt]j|UzluZluZluZluZluZlvYnt]j|UzlvYnt]j|UzluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZluZmtZmtZnyTnyVl}j~~$#1?cHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHQcHOIdOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAgDOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdQGdQGaTGaSH_IT_IPcAhSAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@Si?TGaPCiPCaHSaHCQgDOI`SAhCQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQGdOI`SAhCQHcQHcQHcQHcQHcQGdOI`SAhCQGdOI`SAhCQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcQHcPIcPIcODiODgQ@S-#0~zulzulzulzulzulzulzulzulzulzulzulzulzulz|uj|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|vynt}j|uzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzlvylvylv|iv|ju~ti~tmz|uj|vynt}j|uzlvynt}j|uzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzlvylvzmtzmv|iv|mztny|vi|vlyvlzuntynt}j|uzlvynt}j|uzlvynt}j|uzluzluzluzluzluzluzluzluzluzlvynt}j|uzluzluzluzluzluzlvynt}j|uzlvynt}j|uzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzluzm~$#1?CHQCHQCHQCHQCHQCHQCHQCHQCHQCHQCHQCHQCHQCAHSAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAGDOI@SAHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQGDQGDQGATGASH?IT?IPCAHSAGDOI@SAHCQGDOI@SAHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQGDQGCPICPGATGAPCIODAGTAGQDGQCHOIDOI@SAHCQGDOI@SAHCQGDOI@SAHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQGDOI@SAHCQHCQHCQHCQHCQHCQGDOI@SAHCQGDOI@SAHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCQHCP\ \ No newline at end of file diff --git a/.config/fastfetch/logo.txt b/.config/fastfetch/logo.txt new file mode 100644 index 0000000..d0fa957 --- /dev/null +++ b/.config/fastfetch/logo.txt @@ -0,0 +1,27 @@ +   +   +   +   +▆▅▄▃▂▂▁   +▃▂▁▁╺╶╴▇▇▆▅▄▃▂▂▁  + ▇▇▆▅▄▃▂▁▁ ╺╴▇▇▆▅▄▃▃▂▁  +    ▇▇▆▅▄▃▂▂▁╴╸─▇▇▆▅▅▄▃  +   ▗▄▃    ▇▇▆▅▄▃▃▁╻▊  +      ▝┊╴▆▇▇▎      ▍┃▊ ▃▄▖  +   ▇▇▝▅╺━▖   ▍┃▊  ▂▘▗▅▁▄  +     ▏▏▂▗▃▁▌     ▍┃▊  ▂▅▆▂▄▆  ▄▃▂▆▅▄▂▁  +     ▏▆▆ ▄▆▌      ▍┃▊ ▃▅▁▄▆  ▆▄▂▆▄▂ ▁▃▄  +    ▅▅▄▃▂▁▌   ▍┃▊ ▃▅▃▆   ▆▄▁▁▃▖▉  +       ▍┃▊ ▗▘▃▅  ▏ ▄▃▂▂   ▌▊  +▄▄▃▂▁▁       ▍┃ ▅▗▘ ▇▇▝▄▃▁▆▍ ▗▄▃▆▂▃▇▅  ▎▌  +▇▆▆▅▄▃▂▁▆▅▄▃▂▁▁  ▍┃▃▉▎ ▁▂▄▅▇▅▄▃▂▁  ▝▃ ▌╍╹▇▖▋ ▌▝  +  ▇▇▎▗▄▏▇▁▆▅▄▃▂▂▁   ▍┃╺╾┰▃▂ ╺╸ ┒▃▂▁╺┄╴▇▆▅▅▄▃▂▏▍▝▂     ▏▍  ▃▄▅▅▅▄▂  +  ▂▄▃▎▍ ▏ ▍ ▇▇▆▅▄▖▇▇▆▅▄▘╹ ╸ ▗▖ ╎▅ ╶─╴▇▆▅╺━─▃▂▁▁╸─ ▇▆▅▄▃▂▁▁▌▊ ▘╹ ▄━▘ ╴▖  +  ▁▄▆▃▆▆▎▍ ▏▄▆▅▄▃▂▂▁▝▄▃▂▁▁ ╵▅ ╶┬╴▇▆▁╺━ ▗▂ ▝╴ ┒▇▆▁ ━━╴ ▂▁ ╾╴ ▁▆▊┊┈┉  ╴▅▊  +  ▌ ▄▃▂▂▝▂▁▁▗ ▇▇▆╸ ▉  ▇▆▅▄▃▂▁▁ ▇ ▝╴ ▃ ╵▅ ╺╾╴▉▂▆ ┉━─▃▂▆╵ ▋ ▖┊▃▂▂▂▃ ▅▅▄▃▂▁  +  ▝▅▄▃▂▁▁ ▇▇▆▅▄▄▆╴▁▄▇ ▇▇▆▅▄▃▂▁ ▇▇ ━╸ ▃  ▅┉━╸▇▁▄▆ ▋╶▃▇▇▇▖▊ ▇▆▅▄▃▂▂▆▅▄▃▂▁▁  +   ▇▆▅▄▃▂▃▆  ▇▆▅▄▃▂▂▁ ▆╵ ▂▆  ┊╎▂▂▂╴▌  ▇▆▅▄▃▂▇▆▅▄▃ +   ▇▆▅▇ ▅▄▄▄▄▅ ▇▆▆ +   +   +   diff --git a/.config/fastfetch/logo_opaque.png b/.config/fastfetch/logo_opaque.png new file mode 100644 index 0000000..41cd92d Binary files /dev/null and b/.config/fastfetch/logo_opaque.png differ diff --git a/.config/fastfetch/sixel.jsonc b/.config/fastfetch/sixel.jsonc new file mode 100644 index 0000000..8f476fb --- /dev/null +++ b/.config/fastfetch/sixel.jsonc @@ -0,0 +1,30 @@ +{ + "$schema": "https://github.com/fastfetch-cli/fastfetch/raw/dev/doc/json_schema.json", + "logo": { + "type": "sixel", + "source": "/home/cianh/.config/fastfetch/logo.six", + "width": 64, + "height": 18 + }, + "modules": [ + "title", + "separator", + "os", + "host", + "kernel", + "uptime", + "packages", + "shell", + "de", + "wm", + "terminal", + "cpu", + "gpu", + "memory", + "swap", + "localip", + "battery", + "poweradapter", + "break" + ] +} diff --git a/.config/git/config b/.config/git/config new file mode 100644 index 0000000..e4dad0e --- /dev/null +++ b/.config/git/config @@ -0,0 +1,29 @@ +[user] + name = Cian Hughes + email = chughes000@gmail.com +[init] + defaultBranch = "main" +[credential] + helper = manager + credentialStore = gpg +[filter "lfs"] + clean = git-lfs clean -- %f + smudge = git-lfs smudge -- %f + process = git-lfs filter-process + required = true +[core] + pager = delta +[diff] + tool = delta +[difftool] + prompt = false + trustExitCode = true +[merge] + conflictstyle = diff3 + tool = meld +[interactive] + diffFilter = delta --color-only +[delta] + navigate = true + line-numbers = true + side-by-side = true diff --git a/.config/glamour/tokyo_night.json b/.config/glamour/tokyo_night.json new file mode 100644 index 0000000..8016b09 --- /dev/null +++ b/.config/glamour/tokyo_night.json @@ -0,0 +1,182 @@ +{ + "document": { + "block_prefix": "\n", + "block_suffix": "\n", + "color": "#a9b1d6", + "margin": 2 + }, + "block_quote": { + "indent": 1, + "indent_token": "│ " + }, + "paragraph": {}, + "list": { + "color": "#a9b1d6", + "level_indent": 2 + }, + "heading": { + "block_suffix": "\n", + "color": "#bb9af7", + "bold": true + }, + "h1": { + "prefix": "# ", + "bold": true + }, + "h2": { + "prefix": "## " + }, + "h3": { + "prefix": "### " + }, + "h4": { + "prefix": "#### " + }, + "h5": { + "prefix": "##### " + }, + "h6": { + "prefix": "###### " + }, + "text": {}, + "strikethrough": { + "crossed_out": true + }, + "emph": { + "italic": true + }, + "strong": { + "bold": true + }, + "hr": { + "color": "#565f89", + "format": "\n--------\n" + }, + "item": { + "block_prefix": "• " + }, + "enumeration": { + "block_prefix": ". ", + "color": "#7aa2f7" + }, + "task": { + "ticked": "[✓] ", + "unticked": "[ ] " + }, + "link": { + "color": "#7aa2f7", + "underline": true + }, + "link_text": { + "color": "#2ac3de" + }, + "image": { + "color": "#7aa2f7", + "underline": true + }, + "image_text": { + "color": "#2ac3de", + "format": "Image: {{.text}} →" + }, + "code": { + "color": "#9ece6a" + }, + "code_block": { + "color": "#ff9e64", + "margin": 2, + "chroma": { + "text": { + "color": "#a9b1d6" + }, + "error": { + "color": "#a9b1d6", + "background_color": "#f7768e" + }, + "comment": { + "color": "#565f89" + }, + "comment_preproc": { + "color": "#2ac3de" + }, + "keyword": { + "color": "#2ac3de" + }, + "keyword_reserved": { + "color": "#2ac3de" + }, + "keyword_namespace": { + "color": "#2ac3de" + }, + "keyword_type": { + "color": "#7aa2f7" + }, + "operator": { + "color": "#2ac3de" + }, + "punctuation": { + "color": "#a9b1d6" + }, + "name": { + "color": "#7aa2f7" + }, + "name_builtin": { + "color": "#7aa2f7" + }, + "name_tag": { + "color": "#2ac3de" + }, + "name_attribute": { + "color": "#9ece6a" + }, + "name_class": { + "color": "#7aa2f7" + }, + "name_constant": { + "color": "#bb9af7" + }, + "name_decorator": { + "color": "#9ece6a" + }, + "name_exception": {}, + "name_function": { + "color": "#9ece6a" + }, + "name_other": {}, + "literal": {}, + "literal_number": {}, + "literal_date": {}, + "literal_string": { + "color": "#e0af68" + }, + "literal_string_escape": { + "color": "#2ac3de" + }, + "generic_deleted": { + "color": "#f7768e" + }, + "generic_emph": { + "italic": true + }, + "generic_inserted": { + "color": "#9ece6a" + }, + "generic_strong": { + "bold": true + }, + "generic_subheading": { + "color": "#bb9af7" + }, + "background": { + "background_color": "#1a1b26" + } + } + }, + "table": {}, + "definition_list": {}, + "definition_term": {}, + "definition_description": { + "block_prefix": "\n🠶 " + }, + "html_block": {}, + "html_span": {} +} diff --git a/.config/glow/glow.yml b/.config/glow/glow.yml new file mode 100644 index 0000000..501cc53 --- /dev/null +++ b/.config/glow/glow.yml @@ -0,0 +1,10 @@ +# style name or JSON path (default "auto") +style: "auto" +# show local files only; no network (TUI-mode only) +local: false +# mouse support (TUI-mode only) +mouse: false +# use pager to display markdown +pager: false +# word-wrap at width +width: 80 diff --git a/.config/helix/config.toml b/.config/helix/config.toml new file mode 100644 index 0000000..326e8dd --- /dev/null +++ b/.config/helix/config.toml @@ -0,0 +1,12 @@ +theme = "tokyonight" + +[editor] +line-number = "relative" + +[editor.cursor-shape] +insert = "bar" +normal = "block" +select = "underline" + +[editor.file-picker] +hidden = false diff --git a/.config/hg/hgrc b/.config/hg/hgrc new file mode 100644 index 0000000..3aa16d8 --- /dev/null +++ b/.config/hg/hgrc @@ -0,0 +1,17 @@ +# example user config (see 'hg help config' for more info) +[ui] +# name and email, e.g. +username = Cian Hughes + +# We recommend enabling tweakdefaults to get slight improvements to +# the UI over time. Make sure to set HGPLAIN in the environment when +# writing scripts! +tweakdefaults = True + +[extensions] +# uncomment the lines below to enable some popular extensions +# (see 'hg help extensions' for more info) +# +# histedit = +# rebase = +# uncommit = diff --git a/.config/hypr/HomeManagerInit_inputs.conf b/.config/hypr/HomeManagerInit_inputs.conf new file mode 100644 index 0000000..71ddb74 --- /dev/null +++ b/.config/hypr/HomeManagerInit_inputs.conf @@ -0,0 +1,16 @@ +input { + kb_layout = us + kb_variant = + kb_model = + kb_options = + kb_rules = + + follow_mouse = 1 + + touchpad { + natural_scroll = true + } + + sensitivity = 0 # -1.0 - 1.0, 0 means no modification. +} + diff --git a/.config/hypr/appearance.conf b/.config/hypr/appearance.conf new file mode 100644 index 0000000..3bea209 --- /dev/null +++ b/.config/hypr/appearance.conf @@ -0,0 +1,2 @@ +# Animation preferences +bezier = easeInOutBack,0.05,0.9,0.1,1.1 diff --git a/.config/hypr/binds.conf b/.config/hypr/binds.conf new file mode 100644 index 0000000..40fd6a9 --- /dev/null +++ b/.config/hypr/binds.conf @@ -0,0 +1,75 @@ +# Example binds, see https://wiki.hyprland.org/Configuring/Binds/ for more +bind = $mainMod, Q, exec, $terminal +bind = $mainMod, W, exec, $browser +bind = $mainMod, E, exec, $fileManager +bind = $mainMod, R, exec, $menu +bind = $mainMod, T, exec, $screenshot +bind = $mainMod, ESCAPE, exec, $lockscreen +bind = $mainMod SHIFT, T, exec, $colorpicker +bind = $mainMod, ., exec, $emojipicker +bind = $mainMod, C, killactive, +bind = $mainMod, V, togglefloating, +bind = $mainMod, M, exit, +bind = $mainMod, P, pseudo, # dwindle +bind = $mainMod, ;, togglesplit, # dwindle + +# Move focus with mainMod + arrow keys +bind = $mainMod, left, movefocus, l +bind = $mainMod, down, movefocus, d +bind = $mainMod, up, movefocus, u +bind = $mainMod, right, movefocus, r +bind = $mainMod, H, movefocus, l +bind = $mainMod, J, movefocus, d +bind = $mainMod, K, movefocus, u +bind = $mainMod, L, movefocus, r + +# Move active window around workspaces with mainMod + SHIFT + arrow keys +bind = $mainMod SHIFT, left, movewindow, l +bind = $mainMod SHIFT, down, movetoworkspace, +1 +bind = $mainMod SHIFT, up, movetoworkspace, -1 +bind = $mainMod SHIFT, right, movewindow, r +bind = $mainMod SHIFT, H, movewindow, l +bind = $mainMod SHIFT, J, movetoworkspace, +1 +bind = $mainMod SHIFT, K, movetoworkspace, -1 +bind = $mainMod SHIFT, L, movewindow, r + +# Switch workspaces with mainMod + [0-9] +bind = $mainMod, 1, workspace, 1 +bind = $mainMod, 2, workspace, 2 +bind = $mainMod, 3, workspace, 3 +bind = $mainMod, 4, workspace, 4 +bind = $mainMod, 5, workspace, 5 +bind = $mainMod, 6, workspace, 6 +bind = $mainMod, 7, workspace, 7 +bind = $mainMod, 8, workspace, 8 +bind = $mainMod, 9, workspace, 9 +bind = $mainMod, 0, workspace, 10 + +# Move active window to a workspace with mainMod + SHIFT + [0-9] +bind = $mainMod SHIFT, 1, movetoworkspace, 1 +bind = $mainMod SHIFT, 2, movetoworkspace, 2 +bind = $mainMod SHIFT, 3, movetoworkspace, 3 +bind = $mainMod SHIFT, 4, movetoworkspace, 4 +bind = $mainMod SHIFT, 5, movetoworkspace, 5 +bind = $mainMod SHIFT, 6, movetoworkspace, 6 +bind = $mainMod SHIFT, 7, movetoworkspace, 7 +bind = $mainMod SHIFT, 8, movetoworkspace, 8 +bind = $mainMod SHIFT, 9, movetoworkspace, 9 +bind = $mainMod SHIFT, 0, movetoworkspace, 10 + +# Example special workspace (scratchpad) +bind = $mainMod, S, togglespecialworkspace, magic +bind = $mainMod SHIFT, S, movetoworkspace, special:magic + +# Scroll through existing workspaces with mainMod + scroll +bind = $mainMod, mouse_down, workspace, e+1 +bind = $mainMod, mouse_up, workspace, e-1 + +# Move/resize windows with mainMod + LMB/RMB and dragging +bindm = $mainMod, mouse:272, movewindow +bindm = $mainMod, mouse:273, resizewindow + +# Media key bindings +binde=, XF86AudioRaiseVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%+ +binde=, XF86AudioLowerVolume, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 5%- +binde=, XF86AudioMute, exec, wpctl set-volume -l 1.5 @DEFAULT_AUDIO_SINK@ 0% diff --git a/.config/hypr/hyprland.conf b/.config/hypr/hyprland.conf new file mode 100644 index 0000000..0f3ed0e --- /dev/null +++ b/.config/hypr/hyprland.conf @@ -0,0 +1,26 @@ +# Some default env vars. +env = SDL_VIDEODRIVER,wayland +env = CLUTTER_BACKEND,wayland +env = HYPRCURSOR_THEME,"phinger-cursor" +env = HYPRCURSOR_SIZE,28 + +$terminal = kitty +$fileManager = thunar +$browser = zen +$lockscreen = hyprlock +$colorpicker = hyprpicker +$emojipicker = smile +$screenshot = hyprshot --mode region -o ~/Pictures/Screenshot/ +$menu = wofi --show drun --normal window --prompt "Run application" +$mainMod = SUPER + +source = monitors.conf +source = variables.conf +source = rules.conf +source = binds.conf +source = inputs.conf +source = appearance.conf + +exec-once = pueued -d +exec-once = waybar +exec-once = hyprpaper diff --git a/.config/hypr/hyprlock.conf b/.config/hypr/hyprlock.conf new file mode 100644 index 0000000..c28e288 --- /dev/null +++ b/.config/hypr/hyprlock.conf @@ -0,0 +1,76 @@ +background { + monitor = + path = ~/Pictures/Wallpapers/City_1_Upscaled.png + color = rgba(25, 20, 20, 1.0) + + # all these options are taken from hyprland, see https://wiki.hyprland.org/Configuring/Variables/#blur for explanations + blur_passes = 0 # 0 disables blurring + blur_size = 7 + noise = 0.0117 + contrast = 0.8916 + brightness = 0.8172 + vibrancy = 0.1696 + vibrancy_darkness = 0.0 +} + +image { + monitor = + path = ~/Pictures/Avatars/Avatar.jpg + size = 192 # lesser side if not 1:1 ratio + rounding = -1 # negative values mean circle + border_size = 4 + border_color = rgb(7aa2f7) + rotate = 0 # degrees, counter-clockwise + reload_time = -1 # seconds between reloading, 0 to reload with SIGUSR2 + reload_cmd = # command to get new path. if empty, old path will be used. don't run "follow" commands like tail -F + + position = 0, 200 + halign = center + valign = center +} + +input-field { + monitor = + size = 420, 50 + outline_thickness = 3 + dots_size = 0.33 # Scale of input-field height, 0.2 - 0.8 + dots_spacing = 0.15 # Scale of dots' absolute size, 0.0 - 1.0 + dots_center = true + dots_rounding = -1 # -1 default circle, -2 follow input-field rounding + outer_color = rgb(7aa2f7) + inner_color = rgb(1a1b26) + font_color = rgb(c0caf5) + fade_on_empty = true + fade_timeout = 1000 # Milliseconds before fade_on_empty is triggered. + placeholder_text = Input Password... # Text rendered in the input box when it's empty. + hide_input = false + rounding = -1 # -1 means complete rounding (circle/oval) + check_color = rgb(204, 136, 34) + fail_color = rgb(204, 34, 34) # if authentication failed, changes outer_color and fail message color + fail_text = $FAIL ($ATTEMPTS) # can be set to empty + fail_timeout = 2000 # milliseconds before fail_text and fail_color disappears + fail_transition = 300 # transition time in ms between normal outer_color and fail_color + capslock_color = -1 + numlock_color = -1 + bothlock_color = -1 # when both locks are active. -1 means don't change outer color (same for above) + invert_numlock = false # change color if numlock is off + swap_font_color = false # see below + + position = 0, -20 + halign = center + valign = center +} + +label { + monitor = + text = Hi there, $USER + text_align = center # center/right or any value for default left. multi-line text alignment inside label container + color = rgb(c0caf5) + font_size = 25 + font_family = Noto Sans + rotate = 0 # degrees, counter-clockwise + + position = 0, 80 + halign = center + valign = center +} diff --git a/.config/hypr/hyprpaper.conf b/.config/hypr/hyprpaper.conf new file mode 100644 index 0000000..d3cbb71 --- /dev/null +++ b/.config/hypr/hyprpaper.conf @@ -0,0 +1,7 @@ +preload = ~/Pictures/Wallpapers/City_1_Upscaled.png +splash = true + +wallpaper = eDP-1,~/Pictures/Wallpapers/City_1_Upscaled.png +wallpaper = DP-4,~/Pictures/Wallpapers/City_1_Upscaled.png +wallpaper = DP-5,~/Pictures/Wallpapers/City_1_Upscaled.png +wallpaper = DP-6,~/Pictures/Wallpapers/City_1_Upscaled.png diff --git a/.config/hypr/kb_layouts.txt b/.config/hypr/kb_layouts.txt new file mode 100644 index 0000000..bb4b509 --- /dev/null +++ b/.config/hypr/kb_layouts.txt @@ -0,0 +1,2 @@ +ie +us diff --git a/.config/hypr/monitors.conf b/.config/hypr/monitors.conf new file mode 100644 index 0000000..3f828fc --- /dev/null +++ b/.config/hypr/monitors.conf @@ -0,0 +1,5 @@ +# See https://wiki.hyprland.org/Configuring/Monitors/ +monitor=,preferred,auto,auto +monitor=eDP-1,1920x1080@60,auto,1.2 +monitor=DP-6,1920x1080@60,auto,auto,transform,3 +monitor=DP-4,2560x1440@144,auto-left,auto diff --git a/.config/hypr/rules.conf b/.config/hypr/rules.conf new file mode 100644 index 0000000..b31d5e2 --- /dev/null +++ b/.config/hypr/rules.conf @@ -0,0 +1,2 @@ +windowrulev2 = stayfocused,class:(wofi) +windowrulev2 = noborder,class:(wofi) diff --git a/.config/hypr/utils/build_utils.sh b/.config/hypr/utils/build_utils.sh new file mode 100644 index 0000000..9b68f0b --- /dev/null +++ b/.config/hypr/utils/build_utils.sh @@ -0,0 +1,8 @@ +#! /usr/bin/env bash + +SCRIPT_PATH="$(realpath "$0")" +SCRIPT_DIR="$(dirname "$SCRIPT_PATH")" + +cd "$SCRIPT_DIR" + +go build -o ./cycle_kb_layout ./src/cycle_kb_layout.go diff --git a/.config/hypr/utils/cycle_kb_layout b/.config/hypr/utils/cycle_kb_layout new file mode 100644 index 0000000..f712491 Binary files /dev/null and b/.config/hypr/utils/cycle_kb_layout differ diff --git a/.config/hypr/utils/src/cycle_kb_layout.go b/.config/hypr/utils/src/cycle_kb_layout.go new file mode 100644 index 0000000..c699450 --- /dev/null +++ b/.config/hypr/utils/src/cycle_kb_layout.go @@ -0,0 +1,148 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "os" + "path/filepath" + "strings" +) + +const valueToChange = "kb_layout" + +func readLayouts(layoutFile string) ([]string, error) { + file, err := os.Open(layoutFile) + if err != nil { + return nil, err + } + defer file.Close() + + var layouts []string + scanner := bufio.NewScanner(file) + for scanner.Scan() { + layout := strings.TrimSpace(scanner.Text()) + if layout != "" { + layouts = append(layouts, layout) + } + } + + if err := scanner.Err(); err != nil { + return nil, err + } + + // To prevent index out of range error in toggleLine function + layouts = append(layouts, layouts[0]) // Cycle back to the first layout + + return layouts, nil +} + +func isTargetLine(line string) bool { + return strings.Contains(line, valueToChange) +} + +func readCurrentConfig(configFile string) ([]string, error) { + file, err := os.Open(configFile) + if err != nil { + return nil, err + } + defer file.Close() + + var lines []string + scanner := bufio.NewScanner(file) + for scanner.Scan() { + lines = append(lines, scanner.Text()) + } + + if err := scanner.Err(); err != nil { + return nil, err + } + + return lines, nil +} + +func writeNewConfig(lines []string, configFile string) error { + file, err := os.Create(configFile) + if err != nil { + return err + } + defer file.Close() + + for _, line := range lines { + _, err := file.WriteString(line + "\n") + if err != nil { + return err + } + } + return nil +} + +func toggleLine(line string, layouts []string) string { + var builder strings.Builder + + indentLength := len(line) - len(strings.TrimLeft(line, " \t")) + builder.Grow(len(line)) // Preallocate enough space to avoid multiple allocations + + builder.WriteString(strings.Repeat(" ", indentLength)) + + codeAndComments := strings.SplitN(line, "#", 2) + code := strings.TrimSpace(codeAndComments[0]) + tokens := strings.Fields(code) + currentLayout := tokens[len(tokens)-1] + index := (strings.Index(strings.Join(layouts, " "), currentLayout)/len(currentLayout) + 1) % len(layouts) + tokens[len(tokens)-1] = layouts[index] + builder.WriteString(strings.Join(tokens, " ")) + + if len(codeAndComments) > 1 { + builder.WriteString(" # ") + builder.WriteString(codeAndComments[1]) + } + + return builder.String() +} + +func cycleKbLayout(configFile, layoutFile string) error { + layouts, err := readLayouts(layoutFile) + if err != nil { + return err + } + + lines, err := readCurrentConfig(configFile) + if err != nil { + return err + } + + var newLines []string + for _, line := range lines { + if isTargetLine(line) { + line = toggleLine(line, layouts) + } + newLines = append(newLines, line) + } + + return writeNewConfig(newLines, configFile) +} + +// Define flags for the input files +var configFile = flag.String("c", "inputs.conf", "Path to the configuration file") +var layoutFile = flag.String("l", "kb_layouts.txt", "Path to the keyboard layout file") + +func main() { + // Parse command-line flags + flag.Parse() + + // Determine the absolute paths based on provided flags + hyprDir, err := filepath.Abs(filepath.Dir(os.Args[0])) + if err != nil { + fmt.Println("Error getting directory: %v", err) + } + + configFilePath := filepath.Join(hyprDir, *configFile) + layoutFilePath := filepath.Join(hyprDir, *layoutFile) + + // Call the cycleKbLayout function with the paths from the flags + if err := cycleKbLayout(configFilePath, layoutFilePath); err != nil { + fmt.Println("Error cycling keyboard layout: %v", err) + } +} + diff --git a/.config/hypr/utils/src/go.mod b/.config/hypr/utils/src/go.mod new file mode 100644 index 0000000..627ad48 --- /dev/null +++ b/.config/hypr/utils/src/go.mod @@ -0,0 +1,3 @@ +module cycle_kb_layout + +go 1.21.8 diff --git a/.config/hypr/variables.conf b/.config/hypr/variables.conf new file mode 100644 index 0000000..6674c75 --- /dev/null +++ b/.config/hypr/variables.conf @@ -0,0 +1,64 @@ +general { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + gaps_in = 6 + gaps_out = 6 + border_size = 2 + col.active_border = rgb(7aa2f7) + col.inactive_border = rgba(595959aa) + + layout = dwindle + + # Please see https://wiki.hyprland.org/Configuring/Tearing/ before you turn this on + allow_tearing = false +} + +decoration { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + + rounding = 8 + + blur { + enabled = true + size = 3 + passes = 1 + + vibrancy = 0.1696 + } + + drop_shadow = true + shadow_range = 4 + shadow_render_power = 3 + col.shadow = rgba(1a1a1aee) +} + +animations { + enabled = true + + # Some default animations, see https://wiki.hyprland.org/Configuring/Animations/ for more + + bezier = myBezier, 0.05, 0.9, 0.1, 1.05 + + animation = windows, 1, 7, myBezier + animation = windowsOut, 1, 7, default, popin 80% + animation = border, 1, 10, default + animation = borderangle, 1, 8, default + animation = fade, 1, 7, default + animation = workspaces, 1, 6, default +} + +dwindle { + # See https://wiki.hyprland.org/Configuring/Dwindle-Layout/ for more + pseudotile = true # master switch for pseudotiling. Enabling is bound to mainMod + P in the keybinds section below + preserve_split = true # you probably want this +} + +gestures { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + workspace_swipe = false +} + +misc { + # See https://wiki.hyprland.org/Configuring/Variables/ for more + force_default_wallpaper = -1 # Set to 0 or 1 to disable the anime mascot wallpapers +} diff --git a/.config/kitty/config/font.conf b/.config/kitty/config/font.conf new file mode 100644 index 0000000..c262917 --- /dev/null +++ b/.config/kitty/config/font.conf @@ -0,0 +1,10 @@ +font_family MonaspiceNeNFM-Regular +bold_font MonaspiceNeNFM-Bold +italic_font MonaspiceNeNFM-Italic +bold_italic_font MonaspiceNeNFM-BoldItalic +# calt (texture healing) needs to be disabled because it doesn;t render correctly right now +font_features MonaspiceNeNFM-Regular -calt +liga +ss01 +ss02 +ss03 +ss04 +ss05 +ss06 +ss07 +ss08 +font_features MonaspiceNeNFM-Bold -calt +liga +ss01 +ss02 +ss03 +ss04 +ss05 +ss06 +ss07 +ss08 +font_features MonaspiceNeNFM-Italic -calt +liga +ss01 +ss02 +ss03 +ss04 +ss05 +ss06 +ss07 +ss08 +font_features MonaspiceNeNFM-BoldItalic -calt +liga +ss01 +ss02 +ss03 +ss04 +ss05 +ss06 +ss07 +ss08 +font_size 16.0 diff --git a/.config/kitty/config/keybindings.conf b/.config/kitty/config/keybindings.conf new file mode 100644 index 0000000..034eb25 --- /dev/null +++ b/.config/kitty/config/keybindings.conf @@ -0,0 +1,36 @@ +# First, lets remove default keybindings i dont want to keep +map ctrl+shift+t discard_event +map ctrl+shift+left discard_event +map ctrl+shift+right discard_event +map ctrl+shift+enter discard_event +map ctrl+shift+l discard_event +map ctrl+shift+[ discard_event +map ctrl+shift+] discard_event +map ctrl+shift+n discard_event +map ctrl+shift+q discard_event +# I like the zellij bindings so lets make something similar here +map alt+n new_window +map alt+shift+n launch --cwd=current +map ctrl+alt+n new_os_window +map ctrl+alt+shift+n new_os_window_with_cwd +map alt+q close_window +map alt+l next_window +map alt+right next_window +map alt+h previous_window +map alt+left previous_window +map alt+shift+l move_window_forward +map alt+shift+right move_window_forward +map alt+shift+h move_window_backward +map alt+shift+left move_window_backward +map alt+r start_resizing_window +# Lets fill in the gaps with tab controls that make sense +map alt+t new_tab +map alt+shift+t set_tab_title +map alt+k next_tab +map alt+up next_tab +map alt+j previous_tab +map alt+down previous_tab +map alt+shift+k move_tab_forward +map alt+shift+up move_tab_forward +map alt+shift+j move_tab_backward +map alt+shift+down move_tab_backward diff --git a/.config/kitty/config/window.conf b/.config/kitty/config/window.conf new file mode 100644 index 0000000..948b26c --- /dev/null +++ b/.config/kitty/config/window.conf @@ -0,0 +1,5 @@ +hide_window_decorations yes +enabled_layouts Grid, Stack, Splits, Horizontal, Vertical, Fat, Tall +tab_bar_style powerline +tab_powerline_style slanted +# tab_activity_symbol "󰜎 " diff --git a/.config/kitty/current-theme.conf b/.config/kitty/current-theme.conf new file mode 100644 index 0000000..7ff8ff1 --- /dev/null +++ b/.config/kitty/current-theme.conf @@ -0,0 +1,45 @@ +# vim:ft=kitty + +## name: Tokyo Night +## license: MIT +## author: Folke Lemaitre +## upstream: https://github.com/folke/tokyonight.nvim/raw/main/extras/kitty_tokyonight_night.conf + + +background #1a1b26 +foreground #c0caf5 +selection_background #33467C +selection_foreground #c0caf5 +url_color #73daca +cursor #c0caf5 + +# Tabs +active_tab_background #7aa2f7 +active_tab_foreground #1f2335 +inactive_tab_background #292e42 +inactive_tab_foreground #545c7e +#tab_bar_background #15161E + +# normal +color0 #15161E +color1 #f7768e +color2 #9ece6a +color3 #e0af68 +color4 #7aa2f7 +color5 #bb9af7 +color6 #7dcfff +color7 #a9b1d6 + +# bright +color8 #414868 +color9 #f7768e +color10 #9ece6a +color11 #e0af68 +color12 #7aa2f7 +color13 #bb9af7 +color14 #7dcfff +color15 #c0caf5 + +# extended colors +color16 #ff9e64 +color17 #db4b4b diff --git a/.config/kitty/kitty.conf b/.config/kitty/kitty.conf new file mode 100644 index 0000000..d62ba49 --- /dev/null +++ b/.config/kitty/kitty.conf @@ -0,0 +1,6 @@ +globinclude config/*.conf + +# BEGIN_KITTY_THEME +# Tokyo Night +include current-theme.conf +# END_KITTY_THEME diff --git a/.config/kitty/themes/3024_Day.conf b/.config/kitty/themes/3024_Day.conf new file mode 100644 index 0000000..747996a --- /dev/null +++ b/.config/kitty/themes/3024_Day.conf @@ -0,0 +1,21 @@ +background #f7f7f7 +foreground #494542 +cursor #494542 +selection_background #a4a1a1 +color0 #090200 +color8 #5b5754 +color1 #da2c20 +color9 #e8bacf +color2 #00a152 +color10 #3a3332 +color3 #fcec02 +color11 #494542 +color4 #00a0e4 +color12 #7f7c7b +color5 #a06994 +color13 #d6d4d3 +color6 #b5e4f4 +color14 #ccab53 +color7 #a4a1a1 +color15 #f7f7f7 +selection_foreground #f7f7f7 diff --git a/.config/kitty/themes/3024_Night.conf b/.config/kitty/themes/3024_Night.conf new file mode 100644 index 0000000..2543819 --- /dev/null +++ b/.config/kitty/themes/3024_Night.conf @@ -0,0 +1,21 @@ +background #090200 +foreground #a4a1a1 +cursor #a4a1a1 +selection_background #494542 +color0 #090200 +color8 #5b5754 +color1 #da2c20 +color9 #e8bacf +color2 #00a152 +color10 #3a3332 +color3 #fcec02 +color11 #494542 +color4 #00a0e4 +color12 #7f7c7b +color5 #a06994 +color13 #d6d4d3 +color6 #b5e4f4 +color14 #ccab53 +color7 #a4a1a1 +color15 #f7f7f7 +selection_foreground #090200 diff --git a/.config/kitty/themes/AdventureTime.conf b/.config/kitty/themes/AdventureTime.conf new file mode 100644 index 0000000..e523a1a --- /dev/null +++ b/.config/kitty/themes/AdventureTime.conf @@ -0,0 +1,21 @@ +background #1e1c44 +foreground #f8dbc0 +cursor #eebf37 +selection_background #6f6a4e +color0 #050404 +color8 #4e7bbf +color1 #bc0013 +color9 #fc5e59 +color2 #49b117 +color10 #9dff6e +color3 #e6741d +color11 #efc11a +color4 #0f49c6 +color12 #1896c6 +color5 #665992 +color13 #9a5952 +color6 #6fa497 +color14 #c8f9f3 +color7 #f8dbc0 +color15 #f5f4fb +selection_foreground #1e1c44 diff --git a/.config/kitty/themes/Afterglow.conf b/.config/kitty/themes/Afterglow.conf new file mode 100644 index 0000000..2df3efd --- /dev/null +++ b/.config/kitty/themes/Afterglow.conf @@ -0,0 +1,21 @@ +background #202020 +foreground #d0d0d0 +cursor #d0d0d0 +selection_background #303030 +color0 #151515 +color8 #505050 +color1 #ac4142 +color9 #ac4142 +color2 #7e8d50 +color10 #7e8d50 +color3 #e5b566 +color11 #e5b566 +color4 #6c99ba +color12 #6c99ba +color5 #9e4e85 +color13 #9e4e85 +color6 #7dd5cf +color14 #7dd5cf +color7 #d0d0d0 +color15 #f5f5f5 +selection_foreground #202020 diff --git a/.config/kitty/themes/AlienBlood.conf b/.config/kitty/themes/AlienBlood.conf new file mode 100644 index 0000000..453ea80 --- /dev/null +++ b/.config/kitty/themes/AlienBlood.conf @@ -0,0 +1,21 @@ +background #0f160f +foreground #637d75 +cursor #73f990 +selection_background #1d4025 +color0 #112615 +color8 #3c4711 +color1 #7f2b26 +color9 #df8008 +color2 #2f7e25 +color10 #18e000 +color3 #707f23 +color11 #bde000 +color4 #2f697f +color12 #00a9df +color5 #47577e +color13 #0058df +color6 #317f76 +color14 #00dfc3 +color7 #647d75 +color15 #73f990 +selection_foreground #0f160f diff --git a/.config/kitty/themes/Alucard.conf b/.config/kitty/themes/Alucard.conf new file mode 100644 index 0000000..43665fe --- /dev/null +++ b/.config/kitty/themes/Alucard.conf @@ -0,0 +1,21 @@ +background #222330 +foreground #cef3ff +cursor #ffffff +selection_background #44475a +color0 #000000 +color8 #545454 +color1 #ff5555 +color9 #ff5454 +color2 #fa0074 +color10 #50fa7b +color3 #7f0a1f +color11 #f0fa8b +color4 #3282ff +color12 #1200f8 +color5 #1b3cff +color13 #ff78c5 +color6 #0037fc +color14 #8ae9fc +color7 #bbbbbb +color15 #ffffff +selection_foreground #222330 diff --git a/.config/kitty/themes/Apprentice.conf b/.config/kitty/themes/Apprentice.conf new file mode 100644 index 0000000..c8c0583 --- /dev/null +++ b/.config/kitty/themes/Apprentice.conf @@ -0,0 +1,26 @@ +# Apprentice by Romain Lafourcade, https://github.com/romainl +# This work is licensed under the terms of the MIT license. +# For a copy, see https://opensource.org/licenses/MIT. + +cursor #c7c7c7 +cursor_text_color #feffff +selection_foreground #3e3e3e +selection_background #c1ddff +foreground #c8c8c8 +background #323232 +color0 #252525 +color8 #555555 +color1 #be7472 +color9 #ff9900 +color2 #709772 +color10 #97bb98 +color3 #989772 +color11 #fefdbc +color4 #7199bc +color12 #9fbdde +color5 #727399 +color13 #989abc +color6 #719899 +color14 #6fbbbc +color7 #7f7f7f +color15 #feffff diff --git a/.config/kitty/themes/Argonaut.conf b/.config/kitty/themes/Argonaut.conf new file mode 100644 index 0000000..058186e --- /dev/null +++ b/.config/kitty/themes/Argonaut.conf @@ -0,0 +1,21 @@ +background #0d0f18 +foreground #fffaf3 +cursor #ff0017 +selection_background #002a3a +color0 #222222 +color8 #444444 +color1 #ff000f +color9 #ff273f +color2 #8ce00a +color10 #abe05a +color3 #ffb900 +color11 #ffd141 +color4 #008df8 +color12 #0092ff +color5 #6c43a5 +color13 #9a5feb +color6 #00d7eb +color14 #67ffef +color7 #ffffff +color15 #ffffff +selection_foreground #0d0f18 diff --git a/.config/kitty/themes/Arthur.conf b/.config/kitty/themes/Arthur.conf new file mode 100644 index 0000000..d3fb520 --- /dev/null +++ b/.config/kitty/themes/Arthur.conf @@ -0,0 +1,21 @@ +background #1c1c1c +foreground #ddeedd +cursor #e2bbef +selection_background #4d4d4d +color0 #3d352a +color8 #554444 +color1 #cd5c5c +color9 #cc5533 +color2 #86af80 +color10 #88aa22 +color3 #e8ae5b +color11 #ffa75d +color4 #6495ed +color12 #87ceeb +color5 #deb887 +color13 #996600 +color6 #b0c4de +color14 #b0c4de +color7 #bbaa99 +color15 #ddccbb +selection_foreground #1c1c1c diff --git a/.config/kitty/themes/AtelierSulphurpool.conf b/.config/kitty/themes/AtelierSulphurpool.conf new file mode 100644 index 0000000..05674b0 --- /dev/null +++ b/.config/kitty/themes/AtelierSulphurpool.conf @@ -0,0 +1,21 @@ +background #202745 +foreground #969cb3 +cursor #969cb3 +selection_background #5e6686 +color0 #202745 +color8 #6a7394 +color1 #c84821 +color9 #c76a28 +color2 #ab9639 +color10 #283256 +color3 #c08a2f +color11 #5e6686 +color4 #3d8ed0 +color12 #898ea3 +color5 #6678cc +color13 #dee1f0 +color6 #21a1c8 +color14 #9c6279 +color7 #969cb3 +color15 #f4f7ff +selection_foreground #202745 diff --git a/.config/kitty/themes/Atom.conf b/.config/kitty/themes/Atom.conf new file mode 100644 index 0000000..091c683 --- /dev/null +++ b/.config/kitty/themes/Atom.conf @@ -0,0 +1,21 @@ +background #161718 +foreground #c4c8c5 +cursor #d0d0d0 +selection_background #444444 +color0 #000000 +color8 #000000 +color1 #fc5ef0 +color9 #fc5ef0 +color2 #86c38a +color10 #94f936 +color3 #ffd6b1 +color11 #f5ffa7 +color4 #85befd +color12 #95cbfe +color5 #b9b5fc +color13 #b9b5fc +color6 #85befd +color14 #85befd +color7 #dfdfdf +color15 #dfdfdf +selection_foreground #161718 diff --git a/.config/kitty/themes/AtomOneLight.conf b/.config/kitty/themes/AtomOneLight.conf new file mode 100644 index 0000000..056ef3b --- /dev/null +++ b/.config/kitty/themes/AtomOneLight.conf @@ -0,0 +1,21 @@ +background #f8f8f8 +foreground #2a2b33 +cursor #bbbbbb +selection_background #ececec +color0 #000000 +color8 #000000 +color1 #de3d35 +color9 #de3d35 +color2 #3e953a +color10 #3e953a +color3 #d2b67b +color11 #d2b67b +color4 #2f5af3 +color12 #2f5af3 +color5 #950095 +color13 #a00095 +color6 #3e953a +color14 #3e953a +color7 #bbbbbb +color15 #ffffff +selection_foreground #f8f8f8 diff --git a/.config/kitty/themes/Batman.conf b/.config/kitty/themes/Batman.conf new file mode 100644 index 0000000..aef20e8 --- /dev/null +++ b/.config/kitty/themes/Batman.conf @@ -0,0 +1,21 @@ +background #1b1d1e +foreground #6e6e6e +cursor #fcee0b +selection_background #4d4f4c +color0 #1b1d1e +color8 #505354 +color1 #e6db43 +color9 #fff68d +color2 #c8be46 +color10 #fff27c +color3 #f3fd21 +color11 #feed6c +color4 #737074 +color12 #909495 +color5 #737271 +color13 #9a999d +color6 #615f5e +color14 #a2a2a5 +color7 #c5c5be +color15 #dadad5 +selection_foreground #1b1d1e diff --git a/.config/kitty/themes/Belafonte_Day.conf b/.config/kitty/themes/Belafonte_Day.conf new file mode 100644 index 0000000..56a8796 --- /dev/null +++ b/.config/kitty/themes/Belafonte_Day.conf @@ -0,0 +1,21 @@ +background #d4ccb9 +foreground #45363b +cursor #45363b +selection_background #958b83 +color0 #20111a +color8 #5e5252 +color1 #bd100d +color9 #bd100d +color2 #858062 +color10 #858062 +color3 #e9a448 +color11 #e9a448 +color4 #416978 +color12 #416978 +color5 #96522b +color13 #96522b +color6 #98999c +color14 #98999c +color7 #958b83 +color15 #d4ccb9 +selection_foreground #d4ccb9 diff --git a/.config/kitty/themes/Belafonte_Night.conf b/.config/kitty/themes/Belafonte_Night.conf new file mode 100644 index 0000000..fc51e9c --- /dev/null +++ b/.config/kitty/themes/Belafonte_Night.conf @@ -0,0 +1,21 @@ +background #20111a +foreground #958b83 +cursor #958b83 +selection_background #45363b +color0 #20111a +color8 #5e5252 +color1 #bd100d +color9 #bd100d +color2 #858062 +color10 #858062 +color3 #e9a448 +color11 #e9a448 +color4 #416978 +color12 #416978 +color5 #96522b +color13 #96522b +color6 #98999c +color14 #98999c +color7 #958b83 +color15 #d4ccb9 +selection_foreground #20111a diff --git a/.config/kitty/themes/BirdsOfParadise.conf b/.config/kitty/themes/BirdsOfParadise.conf new file mode 100644 index 0000000..df38e80 --- /dev/null +++ b/.config/kitty/themes/BirdsOfParadise.conf @@ -0,0 +1,21 @@ +background #2a1e1d +foreground #dfdab7 +cursor #573d25 +selection_background #563c27 +color0 #573d25 +color8 #9a6b49 +color1 #be2d26 +color9 #e84526 +color2 #6ba08a +color10 #94d7ba +color3 #e99c29 +color11 #d0d04f +color4 #5a86ac +color12 #b8d3ed +color5 #ab80a6 +color13 #d09dca +color6 #74a5ac +color14 #92ced6 +color7 #dfdab7 +color15 #fff9d4 +selection_foreground #2a1e1d diff --git a/.config/kitty/themes/Blazer.conf b/.config/kitty/themes/Blazer.conf new file mode 100644 index 0000000..f1dd601 --- /dev/null +++ b/.config/kitty/themes/Blazer.conf @@ -0,0 +1,21 @@ +background #0d1925 +foreground #d9e5f1 +cursor #d9e5f1 +color0 #000000 +color8 #252525 +color1 #b87979 +color9 #dabdbd +color2 #79b879 +color10 #bddabd +color3 #b8b879 +color11 #dadabd +color4 #7979b8 +color12 #bdbdda +color5 #b879b8 +color13 #dabdda +color6 #79b8b8 +color14 #bddada +color7 #d9d9d9 +color15 #ffffff +selection_foreground #0d1925 +selection_background #d9e6f2 diff --git a/.config/kitty/themes/Borland.conf b/.config/kitty/themes/Borland.conf new file mode 100644 index 0000000..c27cc83 --- /dev/null +++ b/.config/kitty/themes/Borland.conf @@ -0,0 +1,21 @@ +background #0000a3 +foreground #ffff4d +cursor #ffa460 +selection_background #a3a3a3 +color0 #4e4e4e +color8 #7c7c7c +color1 #ff6b60 +color9 #ffb6b0 +color2 #a7ff60 +color10 #ceffab +color3 #ffffb6 +color11 #ffffcb +color4 #96cafd +color12 #b5dcfe +color5 #ff73fd +color13 #ff9cfe +color6 #c6c4fd +color14 #dfdffe +color7 #eeeeee +color15 #ffffff +selection_foreground #0000a3 diff --git a/.config/kitty/themes/Bright_Lights.conf b/.config/kitty/themes/Bright_Lights.conf new file mode 100644 index 0000000..9b365f4 --- /dev/null +++ b/.config/kitty/themes/Bright_Lights.conf @@ -0,0 +1,21 @@ +background #191919 +foreground #b2c8d6 +cursor #f34a00 +selection_background #b2c8d6 +color0 #191919 +color8 #191919 +color1 #ff355b +color9 #ff355b +color2 #b6e875 +color10 #b6e875 +color3 #ffc150 +color11 #ffc150 +color4 #75d3ff +color12 #75d4ff +color5 #b975e6 +color13 #b975e6 +color6 #6cbeb5 +color14 #6cbeb5 +color7 #c1c8d6 +color15 #c1c8d6 +selection_foreground #191919 diff --git a/.config/kitty/themes/Broadcast.conf b/.config/kitty/themes/Broadcast.conf new file mode 100644 index 0000000..7844942 --- /dev/null +++ b/.config/kitty/themes/Broadcast.conf @@ -0,0 +1,21 @@ +background #2b2b2b +foreground #e5e1db +cursor #ffffff +selection_background #5a637e +color0 #000000 +color8 #323232 +color1 #da4839 +color9 #ff7b6a +color2 #509f50 +color10 #83d082 +color3 #ffd249 +color11 #ffff7b +color4 #6d9cbd +color12 #9fcef0 +color5 #cfcfff +color13 #ffffff +color6 #6d9cbd +color14 #a0cef0 +color7 #ffffff +color15 #ffffff +selection_foreground #2b2b2b diff --git a/.config/kitty/themes/Brogrammer.conf b/.config/kitty/themes/Brogrammer.conf new file mode 100644 index 0000000..41cc37b --- /dev/null +++ b/.config/kitty/themes/Brogrammer.conf @@ -0,0 +1,21 @@ +background #131313 +foreground #d6dae4 +cursor #b9b9b9 +selection_background #1f1f1f +color0 #1f1f1f +color8 #d6dae4 +color1 #f71118 +color9 #de342e +color2 #2cc55d +color10 #1dd260 +color3 #ecb90f +color11 #f2bd09 +color4 #2a84d2 +color12 #0f80d5 +color5 #4e59b7 +color13 #524fb9 +color6 #0f80d5 +color14 #0f7cda +color7 #d6dae4 +color15 #ffffff +selection_foreground #131313 diff --git a/.config/kitty/themes/C64.conf b/.config/kitty/themes/C64.conf new file mode 100644 index 0000000..70978d5 --- /dev/null +++ b/.config/kitty/themes/C64.conf @@ -0,0 +1,21 @@ +background #40318d +foreground #7869c4 +cursor #7869c4 +selection_background #7869c4 +color0 #090300 +color8 #000000 +color1 #883932 +color9 #883932 +color2 #55a049 +color10 #55a049 +color3 #bfce72 +color11 #bfce72 +color4 #40318d +color12 #40318d +color5 #8b3f96 +color13 #8a3e95 +color6 #67b6bd +color14 #67b6bd +color7 #ffffff +color15 #f7f7f7 +selection_foreground #40318d diff --git a/.config/kitty/themes/CLRS.conf b/.config/kitty/themes/CLRS.conf new file mode 100644 index 0000000..ddcb324 --- /dev/null +++ b/.config/kitty/themes/CLRS.conf @@ -0,0 +1,21 @@ +background #ffffff +foreground #262626 +cursor #6fd2fc +selection_background #6fd2fc +color0 #000000 +color8 #545753 +color1 #f72729 +color9 #fb0416 +color2 #32895c +color10 #2cc631 +color3 #f96f1c +color11 #fcd627 +color4 #125ccf +color12 #156ffe +color5 #9f00bc +color13 #e800b0 +color6 #32c2c0 +color14 #39d5ce +color7 #b2b2b2 +color15 #ededec +selection_foreground #ffffff diff --git a/.config/kitty/themes/Chalk.conf b/.config/kitty/themes/Chalk.conf new file mode 100644 index 0000000..7051698 --- /dev/null +++ b/.config/kitty/themes/Chalk.conf @@ -0,0 +1,21 @@ +background #2b2c2e +foreground #d2d8d9 +cursor #708183 +selection_background #e3e8ed +color0 #7c8a8f +color8 #888888 +color1 #b23a51 +color9 #f24840 +color2 #789a69 +color10 #80c46f +color3 #b9ab4a +color11 #ffeb62 +color4 #2a7fac +color12 #4095ff +color5 #bc4f5a +color13 #fb5175 +color6 #44a799 +color14 #52ccbd +color7 #d2d8d9 +color15 #d2d8d9 +selection_foreground #2b2c2e diff --git a/.config/kitty/themes/Chalkboard.conf b/.config/kitty/themes/Chalkboard.conf new file mode 100644 index 0000000..f0b7350 --- /dev/null +++ b/.config/kitty/themes/Chalkboard.conf @@ -0,0 +1,21 @@ +background #29262f +foreground #d9e6f2 +cursor #d9e6f2 +selection_background #073642 +color0 #000000 +color8 #323232 +color1 #c37372 +color9 #dbaaaa +color2 #72c373 +color10 #aadbaa +color3 #c2c372 +color11 #dadbaa +color4 #7372c3 +color12 #aaaadb +color5 #c372c2 +color13 #dbaada +color6 #72c2c3 +color14 #aadadb +color7 #d9d9d9 +color15 #ffffff +selection_foreground #29262f diff --git a/.config/kitty/themes/Ciapre.conf b/.config/kitty/themes/Ciapre.conf new file mode 100644 index 0000000..2b496fb --- /dev/null +++ b/.config/kitty/themes/Ciapre.conf @@ -0,0 +1,21 @@ +background #181c27 +foreground #ada37a +cursor #91805a +selection_background #172539 +color0 #181818 +color8 #555555 +color1 #800009 +color9 #ab3834 +color2 #48513b +color10 #a6a65d +color3 #cc8a3e +color11 #dcde7b +color4 #566d8c +color12 #2f97c6 +color5 #724c7c +color13 #d33060 +color6 #5b4f4a +color14 #f3dab1 +color7 #ada37e +color15 #f3f3f3 +selection_foreground #181c27 diff --git a/.config/kitty/themes/Cobalt2.conf b/.config/kitty/themes/Cobalt2.conf new file mode 100644 index 0000000..3ffcbe2 --- /dev/null +++ b/.config/kitty/themes/Cobalt2.conf @@ -0,0 +1,21 @@ +background #122637 +foreground #ffffff +cursor #f0cb09 +selection_background #18344f +color0 #000000 +color8 #545454 +color1 #ff0000 +color9 #f40d17 +color2 #37dd21 +color10 #3bcf1d +color3 #fee409 +color11 #ecc809 +color4 #1460d2 +color12 #5555ff +color5 #ff005d +color13 #ff55ff +color6 #00bbbb +color14 #6ae3f9 +color7 #bbbbbb +color15 #ffffff +selection_foreground #122637 diff --git a/.config/kitty/themes/Cobalt_Neon.conf b/.config/kitty/themes/Cobalt_Neon.conf new file mode 100644 index 0000000..02a66e5 --- /dev/null +++ b/.config/kitty/themes/Cobalt_Neon.conf @@ -0,0 +1,21 @@ +background #142838 +foreground #8ff586 +cursor #c4206f +selection_background #084fb0 +color0 #142630 +color8 #fff688 +color1 #ff2320 +color9 #d4312e +color2 #3aa5ff +color10 #8ff586 +color3 #e9e75c +color11 #e9f06d +color4 #8ff586 +color12 #3c7dd2 +color5 #781aa0 +color13 #8230a7 +color6 #8ff586 +color14 #6cbc67 +color7 #ba45b1 +color15 #8ff586 +selection_foreground #142838 diff --git a/.config/kitty/themes/CrayonPonyFish.conf b/.config/kitty/themes/CrayonPonyFish.conf new file mode 100644 index 0000000..068fab3 --- /dev/null +++ b/.config/kitty/themes/CrayonPonyFish.conf @@ -0,0 +1,21 @@ +background #140607 +foreground #685259 +cursor #685259 +selection_background #2a1a1c +color0 #2a1a1c +color8 #3c2a2e +color1 #90002a +color9 #c5245c +color2 #579523 +color10 #8dff56 +color3 #aa301b +color11 #c7371d +color4 #8b87af +color12 #cfc9ff +color5 #682e50 +color13 #fb6cb9 +color6 #e8a766 +color14 #ffceae +color7 #685259 +color15 #af949d +selection_foreground #140607 diff --git a/.config/kitty/themes/Dark_Pastel.conf b/.config/kitty/themes/Dark_Pastel.conf new file mode 100644 index 0000000..15083f7 --- /dev/null +++ b/.config/kitty/themes/Dark_Pastel.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #ffffff +cursor #bbbbbb +selection_background #b5d5ff +color0 #000000 +color8 #545454 +color1 #ff5555 +color9 #ff5555 +color2 #55ff55 +color10 #55ff55 +color3 #ffff55 +color11 #ffff55 +color4 #5555ff +color12 #5555ff +color5 #ff55ff +color13 #ff55ff +color6 #55ffff +color14 #55ffff +color7 #bbbbbb +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/Darkside.conf b/.config/kitty/themes/Darkside.conf new file mode 100644 index 0000000..10238d1 --- /dev/null +++ b/.config/kitty/themes/Darkside.conf @@ -0,0 +1,21 @@ +background #212324 +foreground #b9b9b9 +cursor #bbbbbb +selection_background #2f3333 +color0 #000000 +color8 #000000 +color1 #e8331c +color9 #df5a4f +color2 #68c156 +color10 #76b768 +color3 #f1d32b +color11 #eed64a +color4 #1c98e8 +color12 #387bd2 +color5 #8e69c8 +color13 #957bbd +color6 #1c98e8 +color14 #3d96e2 +color7 #b9b9b9 +color15 #b9b9b9 +selection_foreground #212324 diff --git a/.config/kitty/themes/Desert.conf b/.config/kitty/themes/Desert.conf new file mode 100644 index 0000000..5491a97 --- /dev/null +++ b/.config/kitty/themes/Desert.conf @@ -0,0 +1,21 @@ +background #333333 +foreground #ffffff +cursor #00ff00 +selection_background #b5d5ff +color0 #4d4d4d +color8 #545454 +color1 #ff2b2b +color9 #ff5555 +color2 #98fb98 +color10 #55ff55 +color3 #f0e68c +color11 #ffff55 +color4 #cd853f +color12 #87ceff +color5 #ffdead +color13 #ff55ff +color6 #ffa0a0 +color14 #ffd700 +color7 #f5deb3 +color15 #ffffff +selection_foreground #333333 diff --git a/.config/kitty/themes/DimmedMonokai.conf b/.config/kitty/themes/DimmedMonokai.conf new file mode 100644 index 0000000..99d7a83 --- /dev/null +++ b/.config/kitty/themes/DimmedMonokai.conf @@ -0,0 +1,21 @@ +background #1e1e1e +foreground #b8bcb9 +cursor #f83d19 +selection_background #292c31 +color0 #3a3c43 +color8 #888987 +color1 #be3e48 +color9 #fb001e +color2 #869a3a +color10 #0e712e +color3 #c4a535 +color11 #c37033 +color4 #4e76a1 +color12 #176ce3 +color5 #855b8d +color13 #fb0067 +color6 #568ea3 +color14 #2d6f6c +color7 #b8bcb9 +color15 #fcffb8 +selection_foreground #1e1e1e diff --git a/.config/kitty/themes/DotGov.conf b/.config/kitty/themes/DotGov.conf new file mode 100644 index 0000000..345cef9 --- /dev/null +++ b/.config/kitty/themes/DotGov.conf @@ -0,0 +1,21 @@ +background #252b35 +foreground #eaeaea +cursor #d9002f +selection_background #194080 +color0 #181818 +color8 #181818 +color1 #bf081d +color9 #bf081d +color2 #3d9751 +color10 #3d9751 +color3 #f6bb33 +color11 #f6bb33 +color4 #16b1df +color12 #16b1df +color5 #772fb0 +color13 #772fb0 +color6 #8bd1ed +color14 #8bd1ed +color7 #ffffff +color15 #ffffff +selection_foreground #252b35 diff --git a/.config/kitty/themes/Dracula.conf b/.config/kitty/themes/Dracula.conf new file mode 100644 index 0000000..9cf0ed6 --- /dev/null +++ b/.config/kitty/themes/Dracula.conf @@ -0,0 +1,21 @@ +background #1e1f28 +foreground #f8f8f2 +cursor #bbbbbb +selection_background #44475a +color0 #000000 +color8 #545454 +color1 #ff5555 +color9 #ff5454 +color2 #50fa7b +color10 #50fa7b +color3 #f0fa8b +color11 #f0fa8b +color4 #bd92f8 +color12 #bd92f8 +color5 #ff78c5 +color13 #ff78c5 +color6 #8ae9fc +color14 #8ae9fc +color7 #bbbbbb +color15 #ffffff +selection_foreground #1e1f28 diff --git a/.config/kitty/themes/Dumbledore.conf b/.config/kitty/themes/Dumbledore.conf new file mode 100644 index 0000000..c1ef032 --- /dev/null +++ b/.config/kitty/themes/Dumbledore.conf @@ -0,0 +1,21 @@ +background #422553 +foreground #c4c8c5 +cursor #c4c8c5 +selection_background #008aff +color0 #2b283d +color8 #413e53 +color1 #ae0000 +color9 #d3a624 +color2 #3e7c54 +color10 #aaaaaa +color3 #f0c75e +color11 #716254 +color4 #415baf +color12 #946a2c +color5 #9445ae +color13 #b294ba +color6 #008aff +color14 #25de50 +color7 #850000 +color15 #c9c9c9 +selection_foreground #422553 diff --git a/.config/kitty/themes/Duotone_Dark.conf b/.config/kitty/themes/Duotone_Dark.conf new file mode 100644 index 0000000..4867604 --- /dev/null +++ b/.config/kitty/themes/Duotone_Dark.conf @@ -0,0 +1,21 @@ +background #1f1c27 +foreground #b6a0ff +cursor #ff9738 +selection_background #353146 +color0 #1f1c27 +color8 #353146 +color1 #d8393d +color9 #d8393d +color2 #2dcc72 +color10 #2dcc72 +color3 #d8b76e +color11 #d8b76e +color4 #ffc183 +color12 #ffc183 +color5 #dd8d40 +color13 #dd8d40 +color6 #2388ff +color14 #2388ff +color7 #b6a0ff +color15 #e9e4ff +selection_foreground #1f1c27 diff --git a/.config/kitty/themes/ENCOM.conf b/.config/kitty/themes/ENCOM.conf new file mode 100644 index 0000000..7afc7ae --- /dev/null +++ b/.config/kitty/themes/ENCOM.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #00a595 +cursor #bbbbbb +selection_background #00a48c +color0 #000000 +color8 #545454 +color1 #9f0000 +color9 #ff0000 +color2 #008b00 +color10 #00ee00 +color3 #ffcf00 +color11 #ffff00 +color4 #0081ff +color12 #0000ff +color5 #bc00ca +color13 #ff00ff +color6 #008b8b +color14 #00cdcd +color7 #bbbbbb +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/Earthsong.conf b/.config/kitty/themes/Earthsong.conf new file mode 100644 index 0000000..50f0da8 --- /dev/null +++ b/.config/kitty/themes/Earthsong.conf @@ -0,0 +1,21 @@ +background #282420 +foreground #e5c6a8 +cursor #f6f6ec +selection_background #111417 +color0 #111417 +color8 #665e54 +color1 #c84134 +color9 #ff6459 +color2 #84c44b +color10 #97e035 +color3 #f4ae2e +color11 #dfd561 +color4 #1397b9 +color12 #5ed9ff +color5 #d0623c +color13 #ff9168 +color6 #4f9452 +color14 #83ef88 +color7 #e5c5a9 +color15 #f6f6ec +selection_foreground #282420 diff --git a/.config/kitty/themes/Elemental.conf b/.config/kitty/themes/Elemental.conf new file mode 100644 index 0000000..e24a3d3 --- /dev/null +++ b/.config/kitty/themes/Elemental.conf @@ -0,0 +1,21 @@ +background #21211c +foreground #807973 +cursor #facb7f +selection_background #403729 +color0 #3c3b30 +color8 #545444 +color1 #97280f +color9 #df502a +color2 #479942 +color10 #60e06f +color3 #7f7110 +color11 #d69827 +color4 #497f7d +color12 #78d8d8 +color5 #7e4e2e +color13 #cd7c53 +color6 #387f58 +color14 #58d598 +color7 #807974 +color15 #fff1e8 +selection_foreground #21211c diff --git a/.config/kitty/themes/Espresso.conf b/.config/kitty/themes/Espresso.conf new file mode 100644 index 0000000..373c178 --- /dev/null +++ b/.config/kitty/themes/Espresso.conf @@ -0,0 +1,27 @@ +# Theme ported from the Mac Terminal application. + +background #323232 +foreground #ffffff +cursor #d6d6d6 +selection_background #5b5b5b +selection_foreground #323232 +color0 #353535 +color8 #535353 +color1 #d25252 +color9 #f00c0c +color2 #a4c161 +color10 #c1df74 +color3 #ffc56d +color11 #e1e48a +color4 #6c99ba +color12 #8ab6d9 +color5 #d096d9 +color13 #efb5f7 +color6 #bdd6ff +color14 #dbf4ff +color7 #ededec +color15 #ffffff +active_tab_foreground #ffffff +active_tab_background #535353 +inactive_tab_foreground #ffffff +inactive_tab_background #353535 diff --git a/.config/kitty/themes/Espresso_Libre.conf b/.config/kitty/themes/Espresso_Libre.conf new file mode 100644 index 0000000..fa042b2 --- /dev/null +++ b/.config/kitty/themes/Espresso_Libre.conf @@ -0,0 +1,21 @@ +background #2a211c +foreground #b8a898 +cursor #ffffff +selection_background #c3dcff +color0 #000000 +color8 #545753 +color1 #cc0000 +color9 #ef2828 +color2 #1a921c +color10 #9aff87 +color3 #efe43a +color11 #fffa5c +color4 #0066ff +color12 #43a8ed +color5 #c5656b +color13 #ff8089 +color6 #05989a +color14 #34e2e2 +color7 #d3d7cf +color15 #ededec +selection_foreground #2a211c diff --git a/.config/kitty/themes/Fideloper.conf b/.config/kitty/themes/Fideloper.conf new file mode 100644 index 0000000..7e099fc --- /dev/null +++ b/.config/kitty/themes/Fideloper.conf @@ -0,0 +1,21 @@ +background #282f32 +foreground #dad9df +cursor #d35f5a +selection_background #eeb7ab +color0 #282f32 +color8 #092027 +color1 #ca1d2c +color9 #d35f5a +color2 #edb7ab +color10 #d35f5a +color3 #b7aa9a +color11 #a86571 +color4 #2e78c1 +color12 #7c84c4 +color5 #c0226e +color13 #5b5db2 +color6 #309185 +color14 #81908f +color7 #e9e2cd +color15 #fcf4de +selection_foreground #282f32 diff --git a/.config/kitty/themes/FishTank.conf b/.config/kitty/themes/FishTank.conf new file mode 100644 index 0000000..dce32a4 --- /dev/null +++ b/.config/kitty/themes/FishTank.conf @@ -0,0 +1,21 @@ +background #222436 +foreground #eceffd +cursor #fdcd5e +selection_background #fcf6e8 +color0 #03063c +color8 #6c5a30 +color1 #c60049 +color9 #d94a8a +color2 #abf157 +color10 #daffa8 +color3 #fdcd5e +color11 #fee6a8 +color4 #525fb8 +color12 #b1bdf9 +color5 #976f81 +color13 #fda4cc +color6 #968662 +color14 #a4bc86 +color7 #eceffc +color15 #f6ffec +selection_foreground #222436 diff --git a/.config/kitty/themes/Flat.conf b/.config/kitty/themes/Flat.conf new file mode 100644 index 0000000..036e563 --- /dev/null +++ b/.config/kitty/themes/Flat.conf @@ -0,0 +1,21 @@ +background #002240 +foreground #2bc45d +cursor #e5bd0c +selection_background #782b9c +color0 #212c3e +color8 #202b3b +color1 #a72320 +color9 #d3302e +color2 #32a448 +color10 #2c9440 +color3 #e58d11 +color11 #e5bd0c +color4 #3066ab +color12 #3b7cd2 +color5 #7819a0 +color13 #822fa7 +color6 #2b9270 +color14 #35b286 +color7 #afb6b9 +color15 #e6ecec +selection_foreground #002240 diff --git a/.config/kitty/themes/Flatland.conf b/.config/kitty/themes/Flatland.conf new file mode 100644 index 0000000..637b72d --- /dev/null +++ b/.config/kitty/themes/Flatland.conf @@ -0,0 +1,21 @@ +background #1c1e20 +foreground #b8daee +cursor #708183 +selection_background #2a2a24 +color0 #1c1d19 +color8 #1c1d19 +color1 #f18238 +color9 #d12a24 +color2 #9ed264 +color10 #a7d32c +color3 #f3ef6d +color11 #ff8948 +color4 #4f96be +color12 #61b8d0 +color5 #695abb +color13 #695abb +color6 #d53864 +color14 #d53864 +color7 #fefffe +color15 #fefffe +selection_foreground #1c1e20 diff --git a/.config/kitty/themes/Floraverse.conf b/.config/kitty/themes/Floraverse.conf new file mode 100644 index 0000000..6e6a06c --- /dev/null +++ b/.config/kitty/themes/Floraverse.conf @@ -0,0 +1,21 @@ +background #0e0c15 +foreground #dbd0b9 +cursor #bbbbbb +selection_background #f3e0b8 +color0 #08002e +color8 #331d4c +color1 #64002c +color9 #cf2062 +color2 #5d731a +color10 #b3ce58 +color3 #cd751c +color11 #fac357 +color4 #1d6da1 +color12 #40a4cf +color5 #b7077e +color13 #f02aae +color6 #42a38c +color14 #62caa8 +color7 #f3e0b8 +color15 #fff5db +selection_foreground #0e0c15 diff --git a/.config/kitty/themes/FrontEndDelight.conf b/.config/kitty/themes/FrontEndDelight.conf new file mode 100644 index 0000000..ccbf0d4 --- /dev/null +++ b/.config/kitty/themes/FrontEndDelight.conf @@ -0,0 +1,21 @@ +background #1b1b1d +foreground #acacac +cursor #cccccc +selection_background #e96153 +color0 #242426 +color8 #5eac6c +color1 #f8501a +color9 #f64319 +color2 #565746 +color10 #74eb4c +color3 #f9761d +color11 #fcc224 +color4 #2c70b7 +color12 #3393c9 +color5 #f02d4e +color13 #e75e4e +color6 #3ba0a5 +color14 #4ebce5 +color7 #acacac +color15 #8b735a +selection_foreground #1b1b1d diff --git a/.config/kitty/themes/FunForrest.conf b/.config/kitty/themes/FunForrest.conf new file mode 100644 index 0000000..df8f4ee --- /dev/null +++ b/.config/kitty/themes/FunForrest.conf @@ -0,0 +1,21 @@ +background #241200 +foreground #ddc165 +cursor #e5591c +selection_background #e5591c +color0 #000000 +color8 #7e6954 +color1 #d5252b +color9 #e4591b +color2 #909b00 +color10 #bfc659 +color3 #bd8a13 +color11 #ffca1b +color4 #4698a2 +color12 #7cc9ce +color5 #8c4231 +color13 #d16349 +color6 #d98112 +color14 #e6a96b +color7 #ddc165 +color15 #ffe9a3 +selection_foreground #241200 diff --git a/.config/kitty/themes/Galaxy.conf b/.config/kitty/themes/Galaxy.conf new file mode 100644 index 0000000..fab36a7 --- /dev/null +++ b/.config/kitty/themes/Galaxy.conf @@ -0,0 +1,21 @@ +background #1c2836 +foreground #ffffff +cursor #bbbbbb +selection_background #b4d5ff +color0 #000000 +color8 #545454 +color1 #f9555f +color9 #fa8b8e +color2 #20af89 +color10 #34bb99 +color3 #fdf029 +color11 #ffff55 +color4 #589cf5 +color12 #589cf5 +color5 #934d95 +color13 #e75598 +color6 #1e9ee6 +color14 #3978bb +color7 #bbbbbb +color15 #ffffff +selection_foreground #1c2836 diff --git a/.config/kitty/themes/Github.conf b/.config/kitty/themes/Github.conf new file mode 100644 index 0000000..22122d7 --- /dev/null +++ b/.config/kitty/themes/Github.conf @@ -0,0 +1,21 @@ +background #f4f4f4 +foreground #3e3e3e +cursor #3f3f3f +selection_background #a9c1e2 +color0 #3e3e3e +color8 #666666 +color1 #970b16 +color9 #de0000 +color2 #07962a +color10 #87d5a2 +color3 #f7edc7 +color11 #f0cf06 +color4 #003e8a +color12 #2e6cba +color5 #e94691 +color13 #ffa29f +color6 #89d1ec +color14 #1cfafe +color7 #ffffff +color15 #ffffff +selection_foreground #f4f4f4 diff --git a/.config/kitty/themes/Glacier.conf b/.config/kitty/themes/Glacier.conf new file mode 100644 index 0000000..08de697 --- /dev/null +++ b/.config/kitty/themes/Glacier.conf @@ -0,0 +1,21 @@ +background #0c1115 +foreground #ffffff +cursor #6c6c6c +selection_background #bd2523 +color0 #2e343c +color8 #404a55 +color1 #bd0f2f +color9 #bd0f2f +color2 #35a770 +color10 #49e998 +color3 #fb9435 +color11 #fddf6e +color4 #1f5872 +color12 #2a8bc1 +color5 #bd2523 +color13 #ea4727 +color6 #778397 +color14 #a0b6d3 +color7 #ffffff +color15 #ffffff +selection_foreground #0c1115 diff --git a/.config/kitty/themes/GoaBase.conf b/.config/kitty/themes/GoaBase.conf new file mode 100644 index 0000000..fcc6741 --- /dev/null +++ b/.config/kitty/themes/GoaBase.conf @@ -0,0 +1,21 @@ +background #2f0033 +foreground #f6ed00 +cursor #1a6500 +selection_background #100a24 +color0 #880041 +color8 #411a6d +color1 #f78000 +color9 #f800e1 +color2 #249000 +color10 #5743ff +color3 #f40000 +color11 #ea00d7 +color4 #000482 +color12 #b90003 +color5 #f43bff +color13 #9a5952 +color6 #3affff +color14 #c8f9f3 +color7 #000000 +color15 #f5f4fb +selection_foreground #2f0033 diff --git a/.config/kitty/themes/Grape.conf b/.config/kitty/themes/Grape.conf new file mode 100644 index 0000000..38b8a18 --- /dev/null +++ b/.config/kitty/themes/Grape.conf @@ -0,0 +1,21 @@ +background #161423 +foreground #9e9ea0 +cursor #a188f7 +selection_background #483d70 +color0 #2d283e +color8 #58506a +color1 #ec2160 +color9 #f0719a +color2 #1fa91b +color10 #52a95d +color3 #8ddc1f +color11 #b2dc87 +color4 #487cf4 +color12 #a9bbeb +color5 #8c35c8 +color13 #ac81c1 +color6 #3added +color14 #9ce3ea +color7 #9e9ea0 +color15 #a188f7 +selection_foreground #161423 diff --git a/.config/kitty/themes/Grass.conf b/.config/kitty/themes/Grass.conf new file mode 100644 index 0000000..ef9c321 --- /dev/null +++ b/.config/kitty/themes/Grass.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #12773d +foreground #fff0a4 +cursor #8b2800 +selection_background #b64825 +color0 #000000 +color8 #545454 +color1 #ba0000 +color9 #ba0000 +color2 #00ba00 +color10 #00ba00 +color3 #e6af00 +color11 #e6af00 +color4 #0000a3 +color12 #0000ba +color5 #950062 +color13 #ff54ff +color6 #00baba +color14 #54ffff +color7 #bababa +color15 #ffffff +selection_foreground #12773d diff --git a/.config/kitty/themes/Hardcore.conf b/.config/kitty/themes/Hardcore.conf new file mode 100644 index 0000000..9af78ea --- /dev/null +++ b/.config/kitty/themes/Hardcore.conf @@ -0,0 +1,21 @@ +background #121212 +foreground #a0a0a0 +cursor #bbbbbb +selection_background #453a39 +color0 #1b1d1e +color8 #505354 +color1 #f92672 +color9 #ff669d +color2 #a6e22e +color10 #beed5f +color3 #fd971f +color11 #e6db74 +color4 #66d9ef +color12 #66d9ef +color5 #9e6ffe +color13 #9e6ffe +color6 #5e7175 +color14 #a3babf +color7 #ccccc6 +color15 #f8f8f2 +selection_foreground #121212 diff --git a/.config/kitty/themes/Harper.conf b/.config/kitty/themes/Harper.conf new file mode 100644 index 0000000..2579aac --- /dev/null +++ b/.config/kitty/themes/Harper.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #a7a39c +cursor #a7a39c +selection_background #5a5753 +color0 #000000 +color8 #716d69 +color1 #f7b63e +color9 #f7b63e +color2 #7fb5e1 +color10 #7fb5e1 +color3 #d6da24 +color11 #d6da24 +color4 #489d48 +color12 #489d48 +color5 #b295c5 +color13 #b295c5 +color6 #f4bed6 +color14 #f4bed6 +color7 #a7a39c +color15 #fefbe9 +selection_foreground #000000 diff --git a/.config/kitty/themes/Highway.conf b/.config/kitty/themes/Highway.conf new file mode 100644 index 0000000..f0dfa4d --- /dev/null +++ b/.config/kitty/themes/Highway.conf @@ -0,0 +1,21 @@ +background #212224 +foreground #ededed +cursor #dfd9b8 +selection_background #384563 +color0 #000000 +color8 #5c4f49 +color1 #cf0d17 +color9 #ef7d17 +color2 #128033 +color10 #b1d130 +color3 #ffca3d +color11 #fff11f +color4 #006ab3 +color12 #4fc2fd +color5 #6a2674 +color13 #de0070 +color6 #384563 +color14 #5c4f49 +color7 #ededed +color15 #fefffe +selection_foreground #212224 diff --git a/.config/kitty/themes/Hipster_Green.conf b/.config/kitty/themes/Hipster_Green.conf new file mode 100644 index 0000000..26adfe7 --- /dev/null +++ b/.config/kitty/themes/Hipster_Green.conf @@ -0,0 +1,21 @@ +background #0f0a05 +foreground #84c137 +cursor #23ff18 +selection_background #083905 +color0 #000000 +color8 #666666 +color1 #b6204a +color9 #e50000 +color2 #00a600 +color10 #86a83e +color3 #bebe00 +color11 #e5e500 +color4 #246db2 +color12 #0000ff +color5 #b200b2 +color13 #e500e5 +color6 #00a6b2 +color14 #00e5e5 +color7 #bfbfbf +color15 #e5e5e5 +selection_foreground #0f0a05 diff --git a/.config/kitty/themes/Homebrew.conf b/.config/kitty/themes/Homebrew.conf new file mode 100644 index 0000000..d96bb72 --- /dev/null +++ b/.config/kitty/themes/Homebrew.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #000000 +foreground #00ff00 +cursor #23ff18 +selection_background #083905 +color0 #000000 +color8 #666666 +color1 #990000 +color9 #e50000 +color2 #00a600 +color10 #00d900 +color3 #999900 +color11 #e5e500 +color4 #0000b2 +color12 #0000ff +color5 #b200b2 +color13 #e500e5 +color6 #00a6b2 +color14 #00e5e5 +color7 #bebebe +color15 #e5e5e5 +selection_foreground #000000 diff --git a/.config/kitty/themes/Hurtado.conf b/.config/kitty/themes/Hurtado.conf new file mode 100644 index 0000000..1ca0421 --- /dev/null +++ b/.config/kitty/themes/Hurtado.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #dadbda +cursor #bbbbbb +selection_background #b4d5ff +color0 #575757 +color8 #252525 +color1 #ff1b00 +color9 #d41c00 +color2 #a5df55 +color10 #a5df55 +color3 #fbe74a +color11 #fbe749 +color4 #486387 +color12 #89bdff +color5 #fc5ef0 +color13 #bf00c0 +color6 #85e9fe +color14 #85e9fe +color7 #cbcbcb +color15 #dbdbdb +selection_foreground #000000 diff --git a/.config/kitty/themes/Hybrid.conf b/.config/kitty/themes/Hybrid.conf new file mode 100644 index 0000000..8f9dc50 --- /dev/null +++ b/.config/kitty/themes/Hybrid.conf @@ -0,0 +1,21 @@ +background #161718 +foreground #b7bcb9 +cursor #b7bcb9 +selection_background #1e1f22 +color0 #2a2e33 +color8 #1d1e21 +color1 #b74d50 +color9 #8c2d32 +color2 #b3be5a +color10 #788331 +color3 #e3b55e +color11 #e5894f +color4 #6d90b0 +color12 #4b6b88 +color5 #a07eab +color13 #6e4f79 +color6 #7fbeb3 +color14 #4d7b73 +color7 #b5b8b6 +color15 #5a6169 +selection_foreground #161718 diff --git a/.config/kitty/themes/IC_Green_PPL.conf b/.config/kitty/themes/IC_Green_PPL.conf new file mode 100644 index 0000000..35587dd --- /dev/null +++ b/.config/kitty/themes/IC_Green_PPL.conf @@ -0,0 +1,21 @@ +background #3a3c3e +foreground #d9eed2 +cursor #41ff58 +selection_background #2a9b34 +color0 #1e1e1e +color8 #03260f +color1 #fb0029 +color9 #a6ff3e +color2 #329b24 +color10 #9fff6d +color3 #649a25 +color11 #d1ff6d +color4 #149b45 +color12 #72ffb5 +color5 #53b82b +color13 #50ff3d +color6 #2bb767 +color14 #22ff71 +color7 #dffeee +color15 #daeed0 +selection_foreground #3a3c3e diff --git a/.config/kitty/themes/IC_Orange_PPL.conf b/.config/kitty/themes/IC_Orange_PPL.conf new file mode 100644 index 0000000..b8dead8 --- /dev/null +++ b/.config/kitty/themes/IC_Orange_PPL.conf @@ -0,0 +1,21 @@ +background #262626 +foreground #ffcb83 +cursor #fb521c +selection_background #c03f1f +color0 #000000 +color8 #6a4e29 +color1 #c03900 +color9 #ff8b67 +color2 #a3a900 +color10 #f6ff3f +color3 #caae00 +color11 #ffe36e +color4 #bd6c00 +color12 #ffbd54 +color5 #fb5d00 +color13 #fc874f +color6 #f79400 +color14 #c59752 +color7 #ffc88a +color15 #f9f9fe +selection_foreground #262626 diff --git a/.config/kitty/themes/IR_Black.conf b/.config/kitty/themes/IR_Black.conf new file mode 100644 index 0000000..5b8709b --- /dev/null +++ b/.config/kitty/themes/IR_Black.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #f1f1f1 +cursor #7f7f7f +selection_background #b4d5ff +color0 #4f4f4f +color8 #7b7b7b +color1 #fa6c5f +color9 #fcb6af +color2 #a8fe60 +color10 #ceffab +color3 #fffeb6 +color11 #fffecc +color4 #96cafd +color12 #b5dcfe +color5 #fa72fc +color13 #fb9bfe +color6 #c6c4fd +color14 #dfdffd +color7 #eeedee +color15 #fefffe +selection_foreground #000000 diff --git a/.config/kitty/themes/Jackie_Brown.conf b/.config/kitty/themes/Jackie_Brown.conf new file mode 100644 index 0000000..08a72e4 --- /dev/null +++ b/.config/kitty/themes/Jackie_Brown.conf @@ -0,0 +1,21 @@ +background #2c1c15 +foreground #ffcc2f +cursor #23ff18 +selection_background #ae8c20 +color0 #2c1d16 +color8 #666666 +color1 #ef5734 +color9 #e50000 +color2 #2baf2b +color10 #86a83e +color3 #bdbe00 +color11 #e5e500 +color4 #246db2 +color12 #0000ff +color5 #cf5ec0 +color13 #e500e5 +color6 #00acee +color14 #00e5e5 +color7 #bfbfbf +color15 #e5e5e5 +selection_foreground #2c1c15 diff --git a/.config/kitty/themes/Japanesque.conf b/.config/kitty/themes/Japanesque.conf new file mode 100644 index 0000000..c045273 --- /dev/null +++ b/.config/kitty/themes/Japanesque.conf @@ -0,0 +1,21 @@ +background #1d1d1d +foreground #f7f6ec +cursor #eccf4f +selection_background #165776 +color0 #343835 +color8 #585a58 +color1 #ce3e60 +color9 #d18ea6 +color2 #7bb75b +color10 #767e2b +color3 #e8b32a +color11 #77592e +color4 #4c99d3 +color12 #135879 +color5 #a57fc4 +color13 #5f4190 +color6 #389aac +color14 #76bbca +color7 #f9faf6 +color15 #b1b5ae +selection_foreground #1d1d1d diff --git a/.config/kitty/themes/Jellybeans.conf b/.config/kitty/themes/Jellybeans.conf new file mode 100644 index 0000000..bac5fb7 --- /dev/null +++ b/.config/kitty/themes/Jellybeans.conf @@ -0,0 +1,21 @@ +background #111111 +foreground #dedede +cursor #ffa460 +selection_background #464d91 +color0 #919191 +color8 #bdbdbd +color1 #e17373 +color9 #ffa0a0 +color2 #94b978 +color10 #bddeab +color3 #ffb97b +color11 #ffdba0 +color4 #96bddb +color12 #b1d7f6 +color5 #e1c0fa +color13 #fbdaff +color6 #00988e +color14 #19b2a7 +color7 #dedede +color15 #ffffff +selection_foreground #111111 diff --git a/.config/kitty/themes/JetBrains_Darcula.conf b/.config/kitty/themes/JetBrains_Darcula.conf new file mode 100644 index 0000000..64ac146 --- /dev/null +++ b/.config/kitty/themes/JetBrains_Darcula.conf @@ -0,0 +1,21 @@ +background #202020 +foreground #adadad +cursor #ffffff +selection_background #1a3272 +color0 #000000 +color8 #545454 +color1 #fa5355 +color9 #fb7172 +color2 #126e00 +color10 #67ff4f +color3 #c2c300 +color11 #ffff00 +color4 #4581eb +color12 #6d9df1 +color5 #fa54ff +color13 #fb82ff +color6 #33c2c1 +color14 #60d3d1 +color7 #adadad +color15 #eeeeee +selection_foreground #202020 diff --git a/.config/kitty/themes/Kibble.conf b/.config/kitty/themes/Kibble.conf new file mode 100644 index 0000000..3b13105 --- /dev/null +++ b/.config/kitty/themes/Kibble.conf @@ -0,0 +1,21 @@ +background #0e100a +foreground #f7f7f7 +cursor #9fda9c +selection_background #9ba686 +color0 #4d4d4d +color8 #5a5a5a +color1 #c70031 +color9 #f01578 +color2 #29cf13 +color10 #6ce05c +color3 #d8e30e +color11 #f3f79e +color4 #3449d1 +color12 #97a4f7 +color5 #8400ff +color13 #c495f0 +color6 #0798ab +color14 #68f2e0 +color7 #e2d1e3 +color15 #ffffff +selection_foreground #0e100a diff --git a/.config/kitty/themes/Later_This_Evening.conf b/.config/kitty/themes/Later_This_Evening.conf new file mode 100644 index 0000000..1354788 --- /dev/null +++ b/.config/kitty/themes/Later_This_Evening.conf @@ -0,0 +1,21 @@ +background #212121 +foreground #949494 +cursor #424242 +selection_background #424242 +color0 #2b2b2b +color8 #444747 +color1 #d35a5f +color9 #d3222e +color2 #afba66 +color10 #aabb39 +color3 #e5d289 +color11 #e4bd39 +color4 #a0b9d5 +color12 #6599d5 +color5 #bf92d5 +color13 #aa52d5 +color6 #91beb6 +color14 #5fbfad +color7 #3b3c3c +color15 #c0c2c2 +selection_foreground #212121 diff --git a/.config/kitty/themes/Lavandula.conf b/.config/kitty/themes/Lavandula.conf new file mode 100644 index 0000000..14aa7aa --- /dev/null +++ b/.config/kitty/themes/Lavandula.conf @@ -0,0 +1,21 @@ +background #050014 +foreground #736d7c +cursor #8b91fa +selection_background #36323b +color0 #230045 +color8 #362c45 +color1 #7c1525 +color9 #df5066 +color2 #337e6f +color10 #52e0c4 +color3 #7f6f49 +color11 #e0c286 +color4 #4f4a7f +color12 #8e86df +color5 #593f7e +color13 #a675df +color6 #57767f +color14 #9ad3df +color7 #736d7c +color15 #8b91fa +selection_foreground #050014 diff --git a/.config/kitty/themes/LiquidCarbon.conf b/.config/kitty/themes/LiquidCarbon.conf new file mode 100644 index 0000000..2f3a994 --- /dev/null +++ b/.config/kitty/themes/LiquidCarbon.conf @@ -0,0 +1,21 @@ +background #2f2f2f +foreground #afc2c2 +cursor #ffffff +selection_background #7cbeff +color0 #000000 +color8 #000000 +color1 #ff2f2f +color9 #ff2f2f +color2 #549a6f +color10 #549a6f +color3 #ccac00 +color11 #ccac00 +color4 #0099cc +color12 #0099cc +color5 #cc68c8 +color13 #cc68c8 +color6 #79c4cc +color14 #79c4cc +color7 #bccccc +color15 #bccccc +selection_foreground #2f2f2f diff --git a/.config/kitty/themes/LiquidCarbonTransparent.conf b/.config/kitty/themes/LiquidCarbonTransparent.conf new file mode 100644 index 0000000..41e5f89 --- /dev/null +++ b/.config/kitty/themes/LiquidCarbonTransparent.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #afc2c2 +cursor #ffffff +selection_background #7cbeff +color0 #000000 +color8 #000000 +color1 #ff2f2f +color9 #ff2f2f +color2 #549a6f +color10 #549a6f +color3 #ccac00 +color11 #ccac00 +color4 #0099cc +color12 #0099cc +color5 #cc68c8 +color13 #cc68c8 +color6 #79c4cc +color14 #79c4cc +color7 #bccccc +color15 #bccccc +selection_foreground #000000 diff --git a/.config/kitty/themes/LiquidCarbonTransparentInverse.conf b/.config/kitty/themes/LiquidCarbonTransparentInverse.conf new file mode 100644 index 0000000..d584624 --- /dev/null +++ b/.config/kitty/themes/LiquidCarbonTransparentInverse.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #afc2c2 +cursor #ffffff +selection_background #7cbeff +color0 #bbcbcc +color8 #ffffff +color1 #ff2f2f +color9 #ff2f2f +color2 #549a6f +color10 #549a6f +color3 #ccac00 +color11 #ccac00 +color4 #0099cc +color12 #0099cc +color5 #cc68c8 +color13 #cc68c8 +color6 #79c4cc +color14 #79c4cc +color7 #000000 +color15 #000000 +selection_foreground #000000 diff --git a/.config/kitty/themes/Man_Page.conf b/.config/kitty/themes/Man_Page.conf new file mode 100644 index 0000000..7c8aa38 --- /dev/null +++ b/.config/kitty/themes/Man_Page.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #fef49c +foreground #000000 +cursor #7f7f7f +selection_background #a4c9cd +color0 #000000 +color8 #666666 +color1 #cc0000 +color9 #e50000 +color2 #00a600 +color10 #00d900 +color3 #999900 +color11 #e5e500 +color4 #0000b2 +color12 #0000ff +color5 #b200b2 +color13 #e500e5 +color6 #00a6b2 +color14 #00e5e5 +color7 #cccccc +color15 #e5e5e5 +selection_foreground #fef49c diff --git a/.config/kitty/themes/Material.conf b/.config/kitty/themes/Material.conf new file mode 100644 index 0000000..ba38846 --- /dev/null +++ b/.config/kitty/themes/Material.conf @@ -0,0 +1,21 @@ +background #eaeaea +foreground #222221 +cursor #16aec9 +selection_background #c1c1c1 +color0 #212121 +color8 #424242 +color1 #b7141e +color9 #e83a3f +color2 #457b23 +color10 #7aba39 +color3 #f5971d +color11 #fee92e +color4 #134eb2 +color12 #53a4f3 +color5 #550087 +color13 #a94dbb +color6 #0e707c +color14 #26bad1 +color7 #eeeeee +color15 #d8d8d8 +selection_foreground #eaeaea diff --git a/.config/kitty/themes/MaterialDark.conf b/.config/kitty/themes/MaterialDark.conf new file mode 100644 index 0000000..e599021 --- /dev/null +++ b/.config/kitty/themes/MaterialDark.conf @@ -0,0 +1,21 @@ +background #222221 +foreground #e4e4e4 +cursor #16aec9 +selection_background #dedede +color0 #212121 +color8 #424242 +color1 #b7141e +color9 #e83a3f +color2 #457b23 +color10 #7aba39 +color3 #f5971d +color11 #fee92e +color4 #134eb2 +color12 #53a4f3 +color5 #550087 +color13 #a94dbb +color6 #0e707c +color14 #26bad1 +color7 #eeeeee +color15 #d8d8d8 +selection_foreground #222221 diff --git a/.config/kitty/themes/Mathias.conf b/.config/kitty/themes/Mathias.conf new file mode 100644 index 0000000..cd1ab14 --- /dev/null +++ b/.config/kitty/themes/Mathias.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #bbbbbb +cursor #bbbbbb +selection_background #545454 +color0 #000000 +color8 #545454 +color1 #e52222 +color9 #ff5555 +color2 #a6e32d +color10 #55ff55 +color3 #fc951e +color11 #ffff55 +color4 #c48dff +color12 #5555ff +color5 #fa2573 +color13 #ff55ff +color6 #67d9f0 +color14 #55ffff +color7 #f2f2f2 +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/Medallion.conf b/.config/kitty/themes/Medallion.conf new file mode 100644 index 0000000..0ad8805 --- /dev/null +++ b/.config/kitty/themes/Medallion.conf @@ -0,0 +1,21 @@ +background #1d1808 +foreground #cac296 +cursor #d3b92f +selection_background #616cab +color0 #000000 +color8 #5e5118 +color1 #b54c00 +color9 #ff9148 +color2 #7c8a16 +color10 #b1c93a +color3 #d2bd25 +color11 #ffe449 +color4 #606baf +color12 #abb8ff +color5 #8b5990 +color13 #fe9fff +color6 #906b25 +color14 #ffbb51 +color7 #c9c199 +color15 #fed597 +selection_foreground #1d1808 diff --git a/.config/kitty/themes/Misterioso.conf b/.config/kitty/themes/Misterioso.conf new file mode 100644 index 0000000..1960f9b --- /dev/null +++ b/.config/kitty/themes/Misterioso.conf @@ -0,0 +1,21 @@ +background #2d3743 +foreground #e1e1e0 +cursor #000000 +selection_background #2d37ff +color0 #000000 +color8 #545454 +color1 #ff4141 +color9 #ff3241 +color2 #74ae68 +color10 #74cc68 +color3 #ffac28 +color11 #ffb928 +color4 #338e86 +color12 #23d6d6 +color5 #9413e5 +color13 #ff37ff +color6 #23d6d6 +color14 #00ece1 +color7 #e1e1df +color15 #ffffff +selection_foreground #2d3743 diff --git a/.config/kitty/themes/Molokai.conf b/.config/kitty/themes/Molokai.conf new file mode 100644 index 0000000..cd35d1f --- /dev/null +++ b/.config/kitty/themes/Molokai.conf @@ -0,0 +1,21 @@ +background #121212 +foreground #bbbbbb +cursor #bbbbbb +selection_background #b4d5ff +color0 #121212 +color8 #545454 +color1 #fa2573 +color9 #f5669c +color2 #97e123 +color10 #b0e05e +color3 #dfd460 +color11 #fef26c +color4 #0f7fcf +color12 #00afff +color5 #8700ff +color13 #af87ff +color6 #42a7cf +color14 #50cdfe +color7 #bbbbbb +color15 #ffffff +selection_foreground #121212 diff --git a/.config/kitty/themes/MonaLisa.conf b/.config/kitty/themes/MonaLisa.conf new file mode 100644 index 0000000..3b1602d --- /dev/null +++ b/.config/kitty/themes/MonaLisa.conf @@ -0,0 +1,21 @@ +background #110b0d +foreground #f6d56a +cursor #c36c32 +selection_background #f6d56a +color0 #341a0d +color8 #874227 +color1 #9b281b +color9 #ff4230 +color2 #626132 +color10 #b3b163 +color3 #c26e27 +color11 #ff9565 +color4 #515b5c +color12 #9eb2b3 +color5 #9b1d29 +color13 #ff5b6a +color6 #588056 +color14 #89cc8e +color7 #f6d75c +color15 #ffe597 +selection_foreground #110b0d diff --git a/.config/kitty/themes/Monokai.conf b/.config/kitty/themes/Monokai.conf new file mode 100644 index 0000000..660c0cc --- /dev/null +++ b/.config/kitty/themes/Monokai.conf @@ -0,0 +1,41 @@ +# Monokai + +background #272822 +foreground #f8f8f2 +cursor #f8f8f2 +selection_background #f8f8f2 +selection_foreground #272822 +active_tab_background #75715e +active_tab_foreground #272822 +active_border_color #75715e +inactive_tab_background #272822 +inactive_tab_foreground #75715e +inactive_border_color #75715e +url_color #f8f8f2 + +# 16 Color Space + +# black +color0 #272822 +color8 #75715e +# red +color1 #f92672 +color9 #f92672 +# green +color2 #a6e22e +color10 #a6e22e +# yellow +color3 #e6db74 +color11 #e6db74 +# blue +color4 #66d9ef +color12 #66d9ef +# magenta +color5 #fd971f +color13 #fd971f +# cyan +color6 #ae81ff +color14 #ae81ff +# white +color7 #f8f8f2 +color15 #f8f8f2 diff --git a/.config/kitty/themes/Monokai_Classic.conf b/.config/kitty/themes/Monokai_Classic.conf new file mode 100644 index 0000000..9c74f40 --- /dev/null +++ b/.config/kitty/themes/Monokai_Classic.conf @@ -0,0 +1,47 @@ +background #3b3c35 +foreground #fdfff1 + +cursor #fdfff1 +cursor_text_color #000000 +selection_foreground #3b3c35 +selection_background #fdfff1 + +# dull black +color0 #3b3c35 +# light black +color8 #6e7066 + +# dull red +color1 #f82570 +# light red +color9 #f82570 + +# dull green +color2 #a6e12d +# light green +color10 #a6e12d + +# yellow +color3 #e4db73 +# light yellow +color11 #e4db73 + +# blue +color4 #fc961f +# light blue +color12 #fc961f + +# magenta +color5 #ae81ff +# light magenta +color13 #ae81ff + +# cyan +color6 #66d9ee +# light cyan +color14 #66d9ee + +# dull white +color7 #fdfff1 +# bright white +color15 #fdfff1 diff --git a/.config/kitty/themes/Monokai_Pro.conf b/.config/kitty/themes/Monokai_Pro.conf new file mode 100644 index 0000000..f5a2e8c --- /dev/null +++ b/.config/kitty/themes/Monokai_Pro.conf @@ -0,0 +1,47 @@ +background #403e41 +foreground #fcfcfa + +cursor #fcfcfa +cursor_text_color #000000 +selection_foreground #403e41 +selection_background #fcfcfa + +# dull black +color0 #403e41 +# light black +color8 #727072 + +# dull red +color1 #ff6188 +# light red +color9 #ff6188 + +# dull green +color2 #a9dc76 +# light green +color10 #a9dc76 + +# yellow +color3 #ffd866 +# light yellow +color11 #ffd866 + +# blue +color4 #fc9867 +# light blue +color12 #fc9867 + +# magenta +color5 #ab9df2 +# light magenta +color13 #ab9df2 + +# cyan +color6 #78dce8 +# light cyan +color14 #78dce8 + +# dull white +color7 #fcfcfa +# bright white +color15 #fcfcfa diff --git a/.config/kitty/themes/Monokai_Pro_(Filter_Machine).conf b/.config/kitty/themes/Monokai_Pro_(Filter_Machine).conf new file mode 100644 index 0000000..b46e1d3 --- /dev/null +++ b/.config/kitty/themes/Monokai_Pro_(Filter_Machine).conf @@ -0,0 +1,47 @@ +background #3a4449 +foreground #f2fffc + +cursor #f2fffc +cursor_text_color #000000 +selection_foreground #3a4449 +selection_background #f2fffc + +# dull black +color0 #3a4449 +# light black +color8 #6b7678 + +# dull red +color1 #ff6d7e +# light red +color9 #ff6d7e + +# dull green +color2 #a2e57b +# light green +color10 #a2e57b + +# yellow +color3 #ffed72 +# light yellow +color11 #ffed72 + +# blue +color4 #ffb270 +# light blue +color12 #ffb270 + +# magenta +color5 #baa0f8 +# light magenta +color13 #baa0f8 + +# cyan +color6 #7cd5f1 +# light cyan +color14 #7cd5f1 + +# dull white +color7 #f2fffc +# bright white +color15 #f2fffc diff --git a/.config/kitty/themes/Monokai_Pro_(Filter_Octagon).conf b/.config/kitty/themes/Monokai_Pro_(Filter_Octagon).conf new file mode 100644 index 0000000..3aee34a --- /dev/null +++ b/.config/kitty/themes/Monokai_Pro_(Filter_Octagon).conf @@ -0,0 +1,47 @@ +background #3a3d4b +foreground #eaf2f1 + +cursor #eaf2f1 +cursor_text_color #000000 +selection_foreground #3a3d4b +selection_background #eaf2f1 + +# dull black +color0 #3a3d4b +# light black +color8 #696d77 + +# dull red +color1 #ff657a +# light red +color9 #ff657a + +# dull green +color2 #bad761 +# light green +color10 #bad761 + +# yellow +color3 #ffd76d +# light yellow +color11 #ffd76d + +# blue +color4 #ff9b5e +# light blue +color12 #ff9b5e + +# magenta +color5 #c39ac9 +# light magenta +color13 #c39ac9 + +# cyan +color6 #9cd1bb +# light cyan +color14 #9cd1bb + +# dull white +color7 #eaf2f1 +# bright white +color15 #eaf2f1 diff --git a/.config/kitty/themes/Monokai_Pro_(Filter_Ristretto).conf b/.config/kitty/themes/Monokai_Pro_(Filter_Ristretto).conf new file mode 100644 index 0000000..599b0e1 --- /dev/null +++ b/.config/kitty/themes/Monokai_Pro_(Filter_Ristretto).conf @@ -0,0 +1,47 @@ +background #403838 +foreground #fff1f3 + +cursor #fff1f3 +cursor_text_color #000000 +selection_foreground #403838 +selection_background #fff1f3 + +# dull black +color0 #403838 +# light black +color8 #72696a + +# dull red +color1 #fd6883 +# light red +color9 #fd6883 + +# dull green +color2 #adda78 +# light green +color10 #adda78 + +# yellow +color3 #f9cc6c +# light yellow +color11 #f9cc6c + +# blue +color4 #f38d70 +# light blue +color12 #f38d70 + +# magenta +color5 #a8a9eb +# light magenta +color13 #a8a9eb + +# cyan +color6 #85dacc +# light cyan +color14 #85dacc + +# dull white +color7 #fff1f3 +# bright white +color15 #fff1f3 diff --git a/.config/kitty/themes/Monokai_Pro_(Filter_Spectrum).conf b/.config/kitty/themes/Monokai_Pro_(Filter_Spectrum).conf new file mode 100644 index 0000000..5617a6d --- /dev/null +++ b/.config/kitty/themes/Monokai_Pro_(Filter_Spectrum).conf @@ -0,0 +1,47 @@ +background #363537 +foreground #f7f1ff + +cursor #f7f1ff +cursor_text_color #000000 +selection_foreground #363537 +selection_background #f7f1ff + +# dull black +color0 #363537 +# light black +color8 #69676c + +# dull red +color1 #fc618d +# light red +color9 #fc618d + +# dull green +color2 #7bd88f +# light green +color10 #7bd88f + +# yellow +color3 #fce566 +# light yellow +color11 #fce566 + +# blue +color4 #fd9353 +# light blue +color12 #fd9353 + +# magenta +color5 #948ae3 +# light magenta +color13 #948ae3 + +# cyan +color6 #5ad4e6 +# light cyan +color14 #5ad4e6 + +# dull white +color7 #f7f1ff +# bright white +color15 #f7f1ff diff --git a/.config/kitty/themes/Monokai_Soda.conf b/.config/kitty/themes/Monokai_Soda.conf new file mode 100644 index 0000000..eb7a24d --- /dev/null +++ b/.config/kitty/themes/Monokai_Soda.conf @@ -0,0 +1,21 @@ +background #191919 +foreground #c4c4b5 +cursor #f6f6ec +selection_background #343434 +color0 #191919 +color8 #615e4b +color1 #f3005f +color9 #f3005f +color2 #97e023 +color10 #97e023 +color3 #fa8419 +color11 #dfd561 +color4 #9c64fe +color12 #9c64fe +color5 #f3005f +color13 #f3005f +color6 #57d1ea +color14 #57d1ea +color7 #c4c4b5 +color15 #f6f6ee +selection_foreground #191919 diff --git a/.config/kitty/themes/N0tch2k.conf b/.config/kitty/themes/N0tch2k.conf new file mode 100644 index 0000000..3e2bb6c --- /dev/null +++ b/.config/kitty/themes/N0tch2k.conf @@ -0,0 +1,21 @@ +background #222222 +foreground #a0a0a0 +cursor #a99075 +selection_background #4d4d4d +color0 #383838 +color8 #474747 +color1 #a95551 +color9 #a97775 +color2 #666666 +color10 #8c8c8c +color3 #a98051 +color11 #a99175 +color4 #657d3e +color12 #98bd5e +color5 #767676 +color13 #a3a3a3 +color6 #c9c9c9 +color14 #dcdcdc +color7 #d0b8a3 +color15 #d8c8bb +selection_foreground #222222 diff --git a/.config/kitty/themes/Neopolitan.conf b/.config/kitty/themes/Neopolitan.conf new file mode 100644 index 0000000..2c6ffce --- /dev/null +++ b/.config/kitty/themes/Neopolitan.conf @@ -0,0 +1,21 @@ +background #271f19 +foreground #ffffff +cursor #ffffff +selection_background #253b76 +color0 #000000 +color8 #000000 +color1 #800000 +color9 #800000 +color2 #61ce3c +color10 #61ce3c +color3 #fbde2d +color11 #fbde2d +color4 #253b76 +color12 #253b76 +color5 #ff0080 +color13 #ff0080 +color6 #8da6ce +color14 #8da6ce +color7 #f8f8f8 +color15 #f8f8f8 +selection_foreground #271f19 diff --git a/.config/kitty/themes/Neutron.conf b/.config/kitty/themes/Neutron.conf new file mode 100644 index 0000000..9f2fe4d --- /dev/null +++ b/.config/kitty/themes/Neutron.conf @@ -0,0 +1,21 @@ +background #1b1d22 +foreground #e6e8ee +cursor #f6f6ec +selection_background #2e353d +color0 #22252b +color8 #22252b +color1 #b53f36 +color9 #b53f36 +color2 #5ab977 +color10 #5ab977 +color3 #ddb566 +color11 #ddb566 +color4 #6a7b92 +color12 #6a7b92 +color5 #a3799d +color13 #a3799d +color6 #3f93a8 +color14 #3f93a8 +color7 #e6e8ee +color15 #ebedf2 +selection_foreground #1b1d22 diff --git a/.config/kitty/themes/NightLion_v1.conf b/.config/kitty/themes/NightLion_v1.conf new file mode 100644 index 0000000..1021c46 --- /dev/null +++ b/.config/kitty/themes/NightLion_v1.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #bbbbbb +cursor #bbbbbb +selection_background #b4d5ff +color0 #4c4c4c +color8 #545454 +color1 #bb0000 +color9 #ff5555 +color2 #5ede8f +color10 #55ff55 +color3 #f2f067 +color11 #ffff55 +color4 #266ad7 +color12 #5555ff +color5 #bb00bb +color13 #ff55ff +color6 #00d9df +color14 #55ffff +color7 #bbbbbb +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/NightLion_v2.conf b/.config/kitty/themes/NightLion_v2.conf new file mode 100644 index 0000000..aed7f8d --- /dev/null +++ b/.config/kitty/themes/NightLion_v2.conf @@ -0,0 +1,21 @@ +background #171717 +foreground #bbbbbb +cursor #bbbbbb +selection_background #b4d5ff +color0 #4c4c4c +color8 #545454 +color1 #bb0000 +color9 #ff5555 +color2 #03f622 +color10 #7df61c +color3 #f2f067 +color11 #ffff55 +color4 #63d0f0 +color12 #62cae7 +color5 #ce6fda +color13 #ff9af5 +color6 #00d9df +color14 #00ccd7 +color7 #bbbbbb +color15 #ffffff +selection_foreground #171717 diff --git a/.config/kitty/themes/Nova.conf b/.config/kitty/themes/Nova.conf new file mode 100644 index 0000000..c3f2da1 --- /dev/null +++ b/.config/kitty/themes/Nova.conf @@ -0,0 +1,21 @@ +background #3c4c54 +foreground #8798a3 +cursor #7fc1c9 +color0 #8799a4 +color8 #c4d3dc +color1 #efc08d +color9 #ef8358 +color2 #a6cb91 +color10 #a8ce93 +color3 #d7d690 +color11 #e5e77f +color4 #83afe4 +color12 #69c8ff +color5 #d460da +color13 #d18ec2 +color6 #7fc1b6 +color14 #00e59f +color7 #c4d3dc +color15 #e6eef3 +selection_foreground #3c4c54 +selection_background #7fc1ca diff --git a/.config/kitty/themes/Novel.conf b/.config/kitty/themes/Novel.conf new file mode 100644 index 0000000..03220e3 --- /dev/null +++ b/.config/kitty/themes/Novel.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #dfdbc3 +foreground #3b2322 +cursor #73635a +selection_background #a4a390 +color0 #000000 +color8 #7f7f7f +color1 #cc0000 +color9 #cc0000 +color2 #009600 +color10 #009600 +color3 #d06b00 +color11 #d06b00 +color4 #0000cc +color12 #0000cc +color5 #cc00cc +color13 #cc00cc +color6 #0087cc +color14 #0086cb +color7 #cccccc +color15 #ffffff +selection_foreground #dfdbc3 diff --git a/.config/kitty/themes/Obsidian.conf b/.config/kitty/themes/Obsidian.conf new file mode 100644 index 0000000..7265d44 --- /dev/null +++ b/.config/kitty/themes/Obsidian.conf @@ -0,0 +1,21 @@ +background #273032 +foreground #cccccc +cursor #c0cad0 +selection_background #3d4b4e +color0 #000000 +color8 #545454 +color1 #a50001 +color9 #ff0003 +color2 #00bb00 +color10 #92c763 +color3 #fecc22 +color11 #fef773 +color4 #399bda +color12 #a0d6ff +color5 #bb00bb +color13 #ff55ff +color6 #00bbbb +color14 #55ffff +color7 #bbbbbb +color15 #ffffff +selection_foreground #273032 diff --git a/.config/kitty/themes/Ocean.conf b/.config/kitty/themes/Ocean.conf new file mode 100644 index 0000000..ad6205a --- /dev/null +++ b/.config/kitty/themes/Ocean.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #214fbc +foreground #ffffff +cursor #7f7f7f +selection_background #216dff +color0 #000000 +color8 #666666 +color1 #990000 +color9 #e50000 +color2 #00a600 +color10 #00d900 +color3 #999900 +color11 #e5e500 +color4 #0000b2 +color12 #0000ff +color5 #b200b2 +color13 #e500e5 +color6 #00a6b2 +color14 #00e5e5 +color7 #bebebe +color15 #e5e5e5 +selection_foreground #214fbc diff --git a/.config/kitty/themes/OceanicMaterial.conf b/.config/kitty/themes/OceanicMaterial.conf new file mode 100644 index 0000000..9403518 --- /dev/null +++ b/.config/kitty/themes/OceanicMaterial.conf @@ -0,0 +1,21 @@ +background #1c262b +foreground #c1c8d6 +cursor #b2b8c3 +selection_background #6dc1b8 +color0 #000000 +color8 #767676 +color1 #ee2a29 +color9 #dc5b60 +color2 #3fa33f +color10 #70be71 +color3 #fee92e +color11 #fef063 +color4 #1d80ef +color12 #53a4f3 +color5 #8800a0 +color13 #a94dbb +color6 #16aec9 +color14 #42c6d9 +color7 #a4a4a4 +color15 #fffefe +selection_foreground #1c262b diff --git a/.config/kitty/themes/Ollie.conf b/.config/kitty/themes/Ollie.conf new file mode 100644 index 0000000..66eecf5 --- /dev/null +++ b/.config/kitty/themes/Ollie.conf @@ -0,0 +1,21 @@ +background #212024 +foreground #8a8dae +cursor #5b6da7 +selection_background #1e3965 +color0 #000000 +color8 #5a3625 +color1 #ab2e30 +color9 #ff3d48 +color2 #31ab60 +color10 #3bff99 +color3 #ab4200 +color11 #ff5e1e +color4 #2c56ab +color12 #4487ff +color5 #af8427 +color13 #ffc21c +color6 #1fa5ab +color14 #1efaff +color7 #8a8dab +color15 #5b6da7 +selection_foreground #212024 diff --git a/.config/kitty/themes/OneDark.conf b/.config/kitty/themes/OneDark.conf new file mode 100644 index 0000000..ad6cb4e --- /dev/null +++ b/.config/kitty/themes/OneDark.conf @@ -0,0 +1,25 @@ +# One Dark by Giuseppe Cesarano, https://github.com/GiuseppeCesarano +# This work is licensed under the terms of the GPL-2.0 license. +# For a copy, see https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html. + +foreground #979eab +background #282c34 +cursor #cccccc +color0 #282c34 +color1 #e06c75 +color2 #98c379 +color3 #e5c07b +color4 #61afef +color5 #be5046 +color6 #56b6c2 +color7 #979eab +color8 #393e48 +color9 #d19a66 +color10 #56b6c2 +color11 #e5c07b +color12 #61afef +color13 #be5046 +color14 #56b6c2 +color15 #abb2bf +selection_foreground #282c34 +selection_background #979eab diff --git a/.config/kitty/themes/Parasio_Dark.conf b/.config/kitty/themes/Parasio_Dark.conf new file mode 100644 index 0000000..4cc1e8d --- /dev/null +++ b/.config/kitty/themes/Parasio_Dark.conf @@ -0,0 +1,21 @@ +background #2f1d2e +foreground #a39d9b +cursor #a39d9b +selection_background #4f414c +color0 #2f1d2e +color8 #776d70 +color1 #ef6154 +color9 #ef6154 +color2 #48b685 +color10 #48b685 +color3 #fec418 +color11 #fec418 +color4 #05b6ef +color12 #05b6ef +color5 #805ba3 +color13 #805ba3 +color6 #5bc4be +color14 #5bc4be +color7 #a39d9b +color15 #e6e9da +selection_foreground #2f1d2e diff --git a/.config/kitty/themes/PaulMillr.conf b/.config/kitty/themes/PaulMillr.conf new file mode 100644 index 0000000..72cc95c --- /dev/null +++ b/.config/kitty/themes/PaulMillr.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #f1f1f1 +cursor #4c4c4c +selection_background #414141 +color0 #2a2a2a +color8 #666666 +color1 #ff0000 +color9 #ff007f +color2 #78ff0e +color10 #66ff66 +color3 #e6be00 +color11 #f3d64d +color4 #396ad6 +color12 #7099ec +color5 #b348bd +color13 #da66e5 +color6 #66ccff +color14 #79def1 +color7 #bababa +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/PencilDark.conf b/.config/kitty/themes/PencilDark.conf new file mode 100644 index 0000000..3926f6c --- /dev/null +++ b/.config/kitty/themes/PencilDark.conf @@ -0,0 +1,21 @@ +background #202020 +foreground #f0f0f0 +cursor #20bafb +selection_background #b6d6fc +color0 #202020 +color8 #414141 +color1 #c30670 +color9 #fb0079 +color2 #10a778 +color10 #5ed6ae +color3 #a79c14 +color11 #f3e42f +color4 #008ec4 +color12 #20bafb +color5 #523b78 +color13 #6854de +color6 #20a4b9 +color14 #4fb8cc +color7 #d9d9d9 +color15 #f0f0f0 +selection_foreground #202020 diff --git a/.config/kitty/themes/PencilLight.conf b/.config/kitty/themes/PencilLight.conf new file mode 100644 index 0000000..4311c70 --- /dev/null +++ b/.config/kitty/themes/PencilLight.conf @@ -0,0 +1,21 @@ +background #f0f0f0 +foreground #414141 +cursor #20bafb +selection_background #b6d6fc +color0 #202020 +color8 #414141 +color1 #c30670 +color9 #fb0079 +color2 #10a778 +color10 #5ed6ae +color3 #a79c14 +color11 #f3e42f +color4 #008ec4 +color12 #20bafb +color5 #523b78 +color13 #6854de +color6 #20a4b9 +color14 #4fb8cc +color7 #d9d9d9 +color15 #f0f0f0 +selection_foreground #f0f0f0 diff --git a/.config/kitty/themes/Piatto_Light.conf b/.config/kitty/themes/Piatto_Light.conf new file mode 100644 index 0000000..401fe91 --- /dev/null +++ b/.config/kitty/themes/Piatto_Light.conf @@ -0,0 +1,21 @@ +background #ffffff +foreground #414141 +cursor #5e76c7 +selection_background #6f6a4e +color0 #414141 +color8 #3e3e3e +color1 #b23670 +color9 #da3365 +color2 #66781d +color10 #829428 +color3 #cc6e33 +color11 #cc6e33 +color4 #3b5ea7 +color12 #3b5ea7 +color5 #a353b2 +color13 #a353b2 +color6 #66781d +color14 #829428 +color7 #ffffff +color15 #f1f1f1 +selection_foreground #ffffff diff --git a/.config/kitty/themes/Pnevma.conf b/.config/kitty/themes/Pnevma.conf new file mode 100644 index 0000000..1dda097 --- /dev/null +++ b/.config/kitty/themes/Pnevma.conf @@ -0,0 +1,21 @@ +background #1c1c1c +foreground #d0d0d0 +cursor #e3c8ae +selection_background #4d4d4d +color0 #2f2e2d +color8 #4a4845 +color1 #a36666 +color9 #d78787 +color2 #90a57d +color10 #afbea2 +color3 #d7af87 +color11 #e4c9af +color4 #7fa5bd +color12 #a1bdce +color5 #c79ec4 +color13 #d7beda +color6 #8adbb4 +color14 #b1e7dd +color7 #d0d0d0 +color15 #efefef +selection_foreground #1c1c1c diff --git a/.config/kitty/themes/Pro.conf b/.config/kitty/themes/Pro.conf new file mode 100644 index 0000000..6ffc047 --- /dev/null +++ b/.config/kitty/themes/Pro.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #000000 +foreground #f2f2f2 +cursor #4d4d4d +selection_background #414141 +color0 #000000 +color8 #666666 +color1 #990000 +color9 #e50000 +color2 #00a600 +color10 #00d900 +color3 #999900 +color11 #e5e500 +color4 #1f08db +color12 #0000ff +color5 #b200b2 +color13 #e500e5 +color6 #00a6b2 +color14 #00e5e5 +color7 #bfbfbf +color15 #e5e5e5 +selection_foreground #000000 diff --git a/.config/kitty/themes/Red_Alert.conf b/.config/kitty/themes/Red_Alert.conf new file mode 100644 index 0000000..020429a --- /dev/null +++ b/.config/kitty/themes/Red_Alert.conf @@ -0,0 +1,21 @@ +background #762423 +foreground #ffffff +cursor #ffffff +selection_background #073642 +color0 #000000 +color8 #262626 +color1 #d52e4d +color9 #e02453 +color2 #71be6b +color10 #aff08b +color3 #beb86b +color11 #dfddb7 +color4 #479bed +color12 #65a9f0 +color5 #e878d6 +color13 #ddb7df +color6 #6bbeb8 +color14 #b7dfdd +color7 #d6d6d6 +color15 #ffffff +selection_foreground #762423 diff --git a/.config/kitty/themes/Red_Sands.conf b/.config/kitty/themes/Red_Sands.conf new file mode 100644 index 0000000..a491f3d --- /dev/null +++ b/.config/kitty/themes/Red_Sands.conf @@ -0,0 +1,23 @@ +# Theme ported from the Mac Terminal application. + +background #79241d +foreground #d6c8a7 +cursor #ffffff +selection_background #a4a390 +color0 #000000 +color8 #545454 +color1 #ff3e00 +color9 #ba0000 +color2 #00ba00 +color10 #00ba00 +color3 #e6af00 +color11 #e6af00 +color4 #0071ff +color12 #0071ae +color5 #ba00ba +color13 #ff54ff +color6 #00baba +color14 #54ffff +color7 #bababa +color15 #ffffff +selection_foreground #79241d diff --git a/.config/kitty/themes/Relaxed_Afterglow.conf b/.config/kitty/themes/Relaxed_Afterglow.conf new file mode 100644 index 0000000..5988777 --- /dev/null +++ b/.config/kitty/themes/Relaxed_Afterglow.conf @@ -0,0 +1,25 @@ +# Relaxed Afterglow by Michael Kühnel , https://github.com/Relaxed-Theme/relaxed-terminal-themes +# This work is licensed under the terms of the MIT license. +# For a copy, see https://opensource.org/licenses/MIT. + +background #353a44 +foreground #d9d9d9 +cursor #d9d9d9 +selection_foreground #d8d8d8 +selection_background #6a7984 +color0 #151515 +color1 #bc5653 +color2 #909d63 +color3 #ebc17a +color4 #6a8799 +color5 #b06698 +color6 #c9dfff +color7 #d9d9d9 +color8 #636363 +color9 #bc5653 +color10 #a0ac77 +color11 #ebc17a +color12 #7eaac7 +color13 #b06698 +color14 #acbbd0 +color15 #f7f7f7 diff --git a/.config/kitty/themes/Renault_Style.conf b/.config/kitty/themes/Renault_Style.conf new file mode 100644 index 0000000..856818d --- /dev/null +++ b/.config/kitty/themes/Renault_Style.conf @@ -0,0 +1,22 @@ +background #3a3a3a +foreground #e9cb7b +cursor #7f7f7f +selection_background #958553 + +color0 #000000 +color1 #990000 +color2 #00A600 +color3 #999900 +color4 #0000B2 +color5 #B200B2 +color6 #00A6B2 +color7 #BFBFBF +color8 #666666 +color9 #E50000 +color10 #00d800 +color11 #E5E500 +color12 #0000FF +color13 #E500E5 +color14 #00e5e5 +color15 #E5E5E5 +selection_foreground #3a3a3a diff --git a/.config/kitty/themes/Renault_Style_Light.conf b/.config/kitty/themes/Renault_Style_Light.conf new file mode 100644 index 0000000..e08cd6a --- /dev/null +++ b/.config/kitty/themes/Renault_Style_Light.conf @@ -0,0 +1,21 @@ +background #3a3a3a +foreground #e9cb7b +cursor #7f7f7f +selection_background #958553 +color0 #000000 +color8 #323232 +color1 #da4839 +color9 #ff7b6a +color2 #509f50 +color10 #83d082 +color3 #ffd249 +color11 #ffff7b +color4 #46657d +color12 #9fcef0 +color5 #cfcfff +color13 #ffffff +color6 #87c1f1 +color14 #a4d4f8 +color7 #ffffff +color15 #ffffff +selection_foreground #3a3a3a diff --git a/.config/kitty/themes/Rippedcasts.conf b/.config/kitty/themes/Rippedcasts.conf new file mode 100644 index 0000000..20e9872 --- /dev/null +++ b/.config/kitty/themes/Rippedcasts.conf @@ -0,0 +1,21 @@ +background #2b2b2b +foreground #ffffff +cursor #7f7f7f +selection_background #5a637e +color0 #000000 +color8 #666666 +color1 #ccae95 +color9 #edcbac +color2 #a7ff60 +color10 #bced68 +color3 #beba1f +color11 #e5e500 +color4 #74a4af +color12 #86bdc8 +color5 #ff73fd +color13 #e500e5 +color6 #5a637e +color14 #8b9bc4 +color7 #bebebe +color15 #e5e5e5 +selection_foreground #2b2b2b diff --git a/.config/kitty/themes/Royal.conf b/.config/kitty/themes/Royal.conf new file mode 100644 index 0000000..0ebd236 --- /dev/null +++ b/.config/kitty/themes/Royal.conf @@ -0,0 +1,21 @@ +background #100814 +foreground #504868 +cursor #514965 +selection_background #1e1d2a +color0 #241f2a +color8 #312d3c +color1 #90274b +color9 #d4346c +color2 #23801c +color10 #2cd845 +color3 #b49d27 +color11 #fde83a +color4 #6480af +color12 #8fb9f9 +color5 #664d96 +color13 #a479e2 +color6 #8aaabd +color14 #abd3eb +color7 #514965 +color15 #9d8bbd +selection_foreground #100814 diff --git a/.config/kitty/themes/SeaShells.conf b/.config/kitty/themes/SeaShells.conf new file mode 100644 index 0000000..60a2968 --- /dev/null +++ b/.config/kitty/themes/SeaShells.conf @@ -0,0 +1,21 @@ +background #08131a +foreground #deb88d +cursor #fba02f +selection_background #1e4862 +color0 #17384c +color8 #424b52 +color1 #d05023 +color9 #d38677 +color2 #027b9b +color10 #618c98 +color3 #fba02f +color11 #fdd29e +color4 #1d4850 +color12 #1abcdd +color5 #68d3f0 +color13 #bbe3ee +color6 #50a3b5 +color14 #86abb3 +color7 #deb88d +color15 #fee3cd +selection_foreground #08131a diff --git a/.config/kitty/themes/Seafoam_Pastel.conf b/.config/kitty/themes/Seafoam_Pastel.conf new file mode 100644 index 0000000..c3e95a7 --- /dev/null +++ b/.config/kitty/themes/Seafoam_Pastel.conf @@ -0,0 +1,21 @@ +background #243335 +foreground #d3e6d3 +cursor #576379 +selection_background #ffffff +color0 #747474 +color8 #8a8a8a +color1 #825d4c +color9 #cf9279 +color2 #718b62 +color10 #98d9aa +color3 #aca06d +color11 #fae69c +color4 #4c7b82 +color12 #79c3cf +color5 #8a7166 +color13 #d6b2a0 +color6 #719494 +color14 #acdfdf +color7 #dfdfdf +color15 #dfdfdf +selection_foreground #243335 diff --git a/.config/kitty/themes/Seti.conf b/.config/kitty/themes/Seti.conf new file mode 100644 index 0000000..69c4105 --- /dev/null +++ b/.config/kitty/themes/Seti.conf @@ -0,0 +1,21 @@ +background #111213 +foreground #cacecd +cursor #e2be21 +selection_background #303233 +color0 #323232 +color8 #323232 +color1 #c22832 +color9 #c22832 +color2 #8ec43d +color10 #8ec43d +color3 #e0c64f +color11 #e0c64f +color4 #43a5d5 +color12 #43a5d5 +color5 #8b57b5 +color13 #8b57b5 +color6 #8ec43d +color14 #8ec43d +color7 #eeeeee +color15 #ffffff +selection_foreground #111213 diff --git a/.config/kitty/themes/Shaman.conf b/.config/kitty/themes/Shaman.conf new file mode 100644 index 0000000..a316711 --- /dev/null +++ b/.config/kitty/themes/Shaman.conf @@ -0,0 +1,21 @@ +background #001014 +foreground #405555 +cursor #49fcd5 +selection_background #415554 +color0 #012026 +color8 #374350 +color1 #b12f2c +color9 #ff4242 +color2 #00a940 +color10 #2aea5e +color3 #5d8aa9 +color11 #8dd3fd +color4 #449985 +color12 #61d4b9 +color5 #00599c +color13 #1298ff +color6 #5c7e19 +color14 #98cf28 +color7 #405554 +color15 #58fad6 +selection_foreground #001014 diff --git a/.config/kitty/themes/Slate.conf b/.config/kitty/themes/Slate.conf new file mode 100644 index 0000000..650e4ab --- /dev/null +++ b/.config/kitty/themes/Slate.conf @@ -0,0 +1,21 @@ +background #212121 +foreground #34b0d2 +cursor #87d2c3 +selection_background #0f3754 +color0 #212121 +color8 #ffffff +color1 #e1a7bf +color9 #ffccd8 +color2 #80d778 +color10 #bdffa8 +color3 #c4c9bf +color11 #d0cbc9 +color4 #254a49 +color12 #79afd2 +color5 #a380d3 +color13 #c4a7d8 +color6 #14ab9c +color14 #8bdee0 +color7 #02c4e0 +color15 #e0e0e0 +selection_foreground #212121 diff --git a/.config/kitty/themes/Smyck.conf b/.config/kitty/themes/Smyck.conf new file mode 100644 index 0000000..3c97251 --- /dev/null +++ b/.config/kitty/themes/Smyck.conf @@ -0,0 +1,21 @@ +background #1b1b1b +foreground #f7f7f7 +cursor #bbbbbb +selection_background #207383 +color0 #000000 +color8 #7a7a7a +color1 #b74131 +color9 #d6837b +color2 #7da900 +color10 #c4f036 +color3 #c4a400 +color11 #fee14d +color4 #62a3c4 +color12 #8dcff0 +color5 #b98acc +color13 #f799ff +color6 #207383 +color14 #69d9cf +color7 #a0a0a0 +color15 #f7f7f7 +selection_foreground #1b1b1b diff --git a/.config/kitty/themes/SoftServer.conf b/.config/kitty/themes/SoftServer.conf new file mode 100644 index 0000000..e7eb5fe --- /dev/null +++ b/.config/kitty/themes/SoftServer.conf @@ -0,0 +1,21 @@ +background #242626 +foreground #99a3a2 +cursor #d1dfde +selection_background #7f8786 +color0 #000000 +color8 #666c6b +color1 #a16869 +color9 #dc5b5f +color2 #99a569 +color10 #bfde54 +color3 #a29069 +color11 #deb35f +color4 #6a8fa3 +color12 #62b1df +color5 #6971a3 +color13 #5f6ede +color6 #6ba48f +color14 #64e39c +color7 #99a3a2 +color15 #d1dfde +selection_foreground #242626 diff --git a/.config/kitty/themes/Solarized_Darcula.conf b/.config/kitty/themes/Solarized_Darcula.conf new file mode 100644 index 0000000..0a845d4 --- /dev/null +++ b/.config/kitty/themes/Solarized_Darcula.conf @@ -0,0 +1,21 @@ +background #3d3f41 +foreground #d2d8d9 +cursor #708183 +selection_background #214283 +color0 #25292a +color8 #25292a +color1 #f24840 +color9 #f24840 +color2 #629655 +color10 #629655 +color3 #b68800 +color11 #b68800 +color4 #2074c7 +color12 #2074c7 +color5 #797fd4 +color13 #797fd4 +color6 #15968d +color14 #15968d +color7 #d2d8d9 +color15 #d2d8d9 +selection_foreground #3d3f41 diff --git a/.config/kitty/themes/Solarized_Dark.conf b/.config/kitty/themes/Solarized_Dark.conf new file mode 100644 index 0000000..8419426 --- /dev/null +++ b/.config/kitty/themes/Solarized_Dark.conf @@ -0,0 +1,21 @@ +background #001e26 +foreground #708183 +cursor #708183 +selection_background #002731 +color0 #002731 +color8 #001e26 +color1 #d01b24 +color9 #bd3612 +color2 #728905 +color10 #465a61 +color3 #a57705 +color11 #52676f +color4 #2075c7 +color12 #708183 +color5 #c61b6e +color13 #5856b9 +color6 #259185 +color14 #81908f +color7 #e9e2cb +color15 #fcf4dc +selection_foreground #001e26 diff --git a/.config/kitty/themes/Solarized_Dark_-_Patched.conf b/.config/kitty/themes/Solarized_Dark_-_Patched.conf new file mode 100644 index 0000000..37c3597 --- /dev/null +++ b/.config/kitty/themes/Solarized_Dark_-_Patched.conf @@ -0,0 +1,21 @@ +background #001e26 +foreground #708183 +cursor #708183 +selection_background #002731 +color0 #002731 +color8 #465a61 +color1 #d01b24 +color9 #bd3612 +color2 #728905 +color10 #465a61 +color3 #a57705 +color11 #52676f +color4 #2075c7 +color12 #708183 +color5 #c61b6e +color13 #5856b9 +color6 #259185 +color14 #81908f +color7 #e9e2cb +color15 #fcf4dc +selection_foreground #001e26 diff --git a/.config/kitty/themes/Solarized_Dark_Higher_Contrast.conf b/.config/kitty/themes/Solarized_Dark_Higher_Contrast.conf new file mode 100644 index 0000000..8477ea1 --- /dev/null +++ b/.config/kitty/themes/Solarized_Dark_Higher_Contrast.conf @@ -0,0 +1,21 @@ +background #001e26 +foreground #9bc1c2 +cursor #f34a00 +selection_background #003747 +color0 #002731 +color8 #006388 +color1 #d01b24 +color9 #f4153b +color2 #6bbe6c +color10 #50ee84 +color3 #a57705 +color11 #b17e28 +color4 #2075c7 +color12 #178dc7 +color5 #c61b6e +color13 #e14d8e +color6 #259185 +color14 #00b29e +color7 #e9e2cb +color15 #fcf4dc +selection_foreground #001e26 diff --git a/.config/kitty/themes/Solarized_Light.conf b/.config/kitty/themes/Solarized_Light.conf new file mode 100644 index 0000000..36e101b --- /dev/null +++ b/.config/kitty/themes/Solarized_Light.conf @@ -0,0 +1,21 @@ +background #fdf6e3 +foreground #52676f +cursor #52676f +selection_background #e9e2cb +color0 #e4e4e4 +color8 #ffffd7 +color1 #d70000 +color9 #d75f00 +color2 #5f8700 +color10 #585858 +color3 #af8700 +color11 #626262 +color4 #0087ff +color12 #808080 +color5 #af005f +color13 #5f5faf +color6 #00afaf +color14 #8a8a8a +color7 #262626 +color15 #1c1c1c +selection_foreground #fcf4dc diff --git a/.config/kitty/themes/Source_Code_X.conf b/.config/kitty/themes/Source_Code_X.conf new file mode 100644 index 0000000..d3aefa3 --- /dev/null +++ b/.config/kitty/themes/Source_Code_X.conf @@ -0,0 +1,21 @@ +foreground #000000 +background #1f1f24 +cursor #7F7F7F +color0 #4e596b +color8 #91a0b1 +color1 #fb695d +color7 #BFBFBF +color9 #fb695d +color2 #74b391 +color10 #aef37c +color3 #fc8e3e +color11 #fc8e3e +color4 #9586f4 +color12 #53a4fb +color5 #fb5ea3 +color13 #fb5ea3 +color6 #79c8b6 +color14 #83d2c0 +color15 #91a0b1 +selection_foreground #1f1f24 +selection_background #000000 diff --git a/.config/kitty/themes/SpaceGray.conf b/.config/kitty/themes/SpaceGray.conf new file mode 100644 index 0000000..ba9afeb --- /dev/null +++ b/.config/kitty/themes/SpaceGray.conf @@ -0,0 +1,21 @@ +background #20232c +foreground #b2b8c2 +cursor #b2b8c2 +selection_background #15171e +color0 #000000 +color8 #000000 +color1 #af4b57 +color9 #af4b57 +color2 #87b279 +color10 #87b279 +color3 #e5c078 +color11 #e5c078 +color4 #7c8fa3 +color12 #7c8fa3 +color5 #a37996 +color13 #a37996 +color6 #84a6a4 +color14 #84a6a4 +color7 #b2b8c2 +color15 #fffefe +selection_foreground #20232c diff --git a/.config/kitty/themes/SpaceGray_Eighties.conf b/.config/kitty/themes/SpaceGray_Eighties.conf new file mode 100644 index 0000000..8249a17 --- /dev/null +++ b/.config/kitty/themes/SpaceGray_Eighties.conf @@ -0,0 +1,21 @@ +background #212121 +foreground #bdb9ae +cursor #bbbbbb +selection_background #262e35 +color0 #15171c +color8 #545454 +color1 #ec5f67 +color9 #ff6973 +color2 #80a763 +color10 #93d393 +color3 #fdc253 +color11 #ffd156 +color4 #5485c0 +color12 #4d83d0 +color5 #bf83c0 +color13 #ff55ff +color6 #57c2c0 +color14 #83e8e4 +color7 #eeece7 +color15 #ffffff +selection_foreground #212121 diff --git a/.config/kitty/themes/SpaceGray_Eighties_Dull.conf b/.config/kitty/themes/SpaceGray_Eighties_Dull.conf new file mode 100644 index 0000000..eabf184 --- /dev/null +++ b/.config/kitty/themes/SpaceGray_Eighties_Dull.conf @@ -0,0 +1,21 @@ +background #212121 +foreground #c8c5bc +cursor #bbbbbb +selection_background #262e36 +color0 #15171c +color8 #545454 +color1 #b14956 +color9 #ec5f67 +color2 #91b377 +color10 #88e985 +color3 #c6725a +color11 #fdc253 +color4 #7b8fa4 +color12 #5485c0 +color5 #a5779e +color13 #bf83c0 +color6 #7fcccb +color14 #58c2c0 +color7 #b2b8c2 +color15 #ffffff +selection_foreground #212121 diff --git a/.config/kitty/themes/Spacedust.conf b/.config/kitty/themes/Spacedust.conf new file mode 100644 index 0000000..08b93c4 --- /dev/null +++ b/.config/kitty/themes/Spacedust.conf @@ -0,0 +1,21 @@ +background #0a1e24 +foreground #ecefc1 +cursor #708183 +selection_background #0a385c +color0 #6e5246 +color8 #674c31 +color1 #e35a00 +color9 #ff8a39 +color2 #5cab96 +color10 #adcab8 +color3 #e3cd7b +color11 #ffc777 +color4 #0e548b +color12 #67a0cd +color5 #e35a00 +color13 #ff8a39 +color6 #06afc7 +color14 #83a6b3 +color7 #f0f1ce +color15 #fefff0 +selection_foreground #0a1e24 diff --git a/.config/kitty/themes/Spiderman.conf b/.config/kitty/themes/Spiderman.conf new file mode 100644 index 0000000..a72bbca --- /dev/null +++ b/.config/kitty/themes/Spiderman.conf @@ -0,0 +1,21 @@ +background #1b1d1e +foreground #e2e2e2 +cursor #2b3fff +selection_background #070e4f +color0 #1b1d1e +color8 #505354 +color1 #e60712 +color9 #ff0325 +color2 #e22828 +color10 #ff3238 +color3 #e24655 +color11 #fe3935 +color4 #2b3fff +color12 #1d4fff +color5 #2435db +color13 #737bff +color6 #3255ff +color14 #6083ff +color7 #fffef6 +color15 #fefff9 +selection_foreground #1b1d1e diff --git a/.config/kitty/themes/Spring.conf b/.config/kitty/themes/Spring.conf new file mode 100644 index 0000000..4df6d1c --- /dev/null +++ b/.config/kitty/themes/Spring.conf @@ -0,0 +1,21 @@ +background #ffffff +foreground #4d4d4c +cursor #4d4d4c +selection_background #d6d6d6 +color0 #000000 +color8 #000000 +color1 #ff4c83 +color9 #ff0021 +color2 #1f8c3a +color10 #1fc231 +color3 #1fc95a +color11 #d4b706 +color4 #1cd2ee +color12 #15a9fd +color5 #8959a8 +color13 #8959a8 +color6 #3e999f +color14 #3e999f +color7 #fffefe +color15 #fffefe +selection_foreground #ffffff diff --git a/.config/kitty/themes/Square.conf b/.config/kitty/themes/Square.conf new file mode 100644 index 0000000..e5457a5 --- /dev/null +++ b/.config/kitty/themes/Square.conf @@ -0,0 +1,21 @@ +background #1a1a1a +foreground #acacab +cursor #fbfacc +selection_background #4d4d4d +color0 #050505 +color8 #141414 +color1 #e9897c +color9 #f99286 +color2 #b6377d +color10 #c3f786 +color3 #ecebbe +color11 #fcfbcc +color4 #a9cdeb +color12 #b6defb +color5 #75507b +color13 #ad7fa8 +color6 #c9caec +color14 #d7d9fc +color7 #f2f2f2 +color15 #e2e2e2 +selection_foreground #1a1a1a diff --git a/.config/kitty/themes/Sundried.conf b/.config/kitty/themes/Sundried.conf new file mode 100644 index 0000000..d5ff99d --- /dev/null +++ b/.config/kitty/themes/Sundried.conf @@ -0,0 +1,21 @@ +background #1a1818 +foreground #c8c8c8 +cursor #fffefe +selection_background #302b2a +color0 #302b2a +color8 #4d4d47 +color1 #a6463d +color9 #aa000c +color2 #577644 +color10 #128c20 +color3 #9c5f2a +color11 #fc6a20 +color4 #485a98 +color12 #7898f7 +color5 #854551 +color13 #fc89a0 +color6 #9c814e +color14 #fad384 +color7 #c8c8c8 +color15 #fffefe +selection_foreground #1a1818 diff --git a/.config/kitty/themes/Symfonic.conf b/.config/kitty/themes/Symfonic.conf new file mode 100644 index 0000000..9b5e0d3 --- /dev/null +++ b/.config/kitty/themes/Symfonic.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #ffffff +cursor #dc322f +selection_background #073642 +color0 #000000 +color8 #1b1d21 +color1 #dc322f +color9 #dc322f +color2 #56db3a +color10 #56db3a +color3 #ff8400 +color11 #ff8400 +color4 #0084d4 +color12 #0084d4 +color5 #b729d9 +color13 #b729d9 +color6 #ccccff +color14 #ccccff +color7 #ffffff +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/Tango_Dark.conf b/.config/kitty/themes/Tango_Dark.conf new file mode 100644 index 0000000..6a4673a --- /dev/null +++ b/.config/kitty/themes/Tango_Dark.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #ffffff +cursor #ffffff +selection_background #b4d5ff +color0 #000000 +color8 #545753 +color1 #cc0000 +color9 #ef2828 +color2 #4e9a05 +color10 #8ae234 +color3 #c4a000 +color11 #fce94e +color4 #3464a4 +color12 #719ecf +color5 #74507a +color13 #ad7ea7 +color6 #05989a +color14 #34e2e2 +color7 #d3d7cf +color15 #ededec +selection_foreground #000000 diff --git a/.config/kitty/themes/Tango_Light.conf b/.config/kitty/themes/Tango_Light.conf new file mode 100644 index 0000000..07f82bf --- /dev/null +++ b/.config/kitty/themes/Tango_Light.conf @@ -0,0 +1,21 @@ +background #ffffff +foreground #000000 +cursor #000000 +selection_background #b4d5ff +color0 #000000 +color8 #545753 +color1 #cc0000 +color9 #ef2828 +color2 #4e9a05 +color10 #8ae234 +color3 #c4a000 +color11 #fce94e +color4 #3464a4 +color12 #719ecf +color5 #74507a +color13 #ad7ea7 +color6 #05989a +color14 #34e2e2 +color7 #d3d7cf +color15 #ededec +selection_foreground #ffffff diff --git a/.config/kitty/themes/Teerb.conf b/.config/kitty/themes/Teerb.conf new file mode 100644 index 0000000..9e9cab7 --- /dev/null +++ b/.config/kitty/themes/Teerb.conf @@ -0,0 +1,21 @@ +background #262626 +foreground #d0d0d0 +cursor #e3c8ae +selection_background #4d4d4d +color0 #1c1c1c +color8 #1c1c1c +color1 #d68686 +color9 #d68686 +color2 #aed686 +color10 #aed686 +color3 #d7af87 +color11 #e4c9af +color4 #86aed6 +color12 #86aed6 +color5 #d6aed6 +color13 #d6aed6 +color6 #8adbb4 +color14 #b1e7dd +color7 #d0d0d0 +color15 #efefef +selection_foreground #262626 diff --git a/.config/kitty/themes/Thayer_Bright.conf b/.config/kitty/themes/Thayer_Bright.conf new file mode 100644 index 0000000..b74bc60 --- /dev/null +++ b/.config/kitty/themes/Thayer_Bright.conf @@ -0,0 +1,21 @@ +background #1b1d1e +foreground #f8f8f8 +cursor #fc971e +selection_background #4d4d4d +color0 #1b1d1e +color8 #505354 +color1 #f92672 +color9 #ff5995 +color2 #4df740 +color10 #b6e354 +color3 #f3fd21 +color11 #feed6c +color4 #2656d6 +color12 #3f78ff +color5 #8c54fe +color13 #9e6ffe +color6 #37c8b4 +color14 #23ced4 +color7 #ccccc6 +color15 #f8f8f2 +selection_foreground #1b1d1e diff --git a/.config/kitty/themes/The_Hulk.conf b/.config/kitty/themes/The_Hulk.conf new file mode 100644 index 0000000..81bd962 --- /dev/null +++ b/.config/kitty/themes/The_Hulk.conf @@ -0,0 +1,21 @@ +background #1b1d1e +foreground #b4b4b4 +cursor #15b61a +selection_background #4d4f4c +color0 #1b1d1e +color8 #505354 +color1 #259d1a +color9 #8dff2a +color2 #13ce2f +color10 #48ff76 +color3 #62e456 +color11 #3afe15 +color4 #2424f4 +color12 #4f6a95 +color5 #641e73 +color13 #72579d +color6 #378ca9 +color14 #3f85a5 +color7 #d8d8d0 +color15 #e5e5e0 +selection_foreground #1b1d1e diff --git a/.config/kitty/themes/Tomorrow.conf b/.config/kitty/themes/Tomorrow.conf new file mode 100644 index 0000000..23a8dfc --- /dev/null +++ b/.config/kitty/themes/Tomorrow.conf @@ -0,0 +1,21 @@ +background #ffffff +foreground #4c4c4c +cursor #4c4c4c +selection_background #d6d6d6 +color0 #000000 +color8 #000000 +color1 #c82828 +color9 #c82828 +color2 #708b00 +color10 #708b00 +color3 #e9b600 +color11 #e9b600 +color4 #4170ae +color12 #4170ae +color5 #8958a7 +color13 #8958a7 +color6 #3d999f +color14 #3d999f +color7 #fffefe +color15 #fffefe +selection_foreground #ffffff diff --git a/.config/kitty/themes/Tomorrow_Night.conf b/.config/kitty/themes/Tomorrow_Night.conf new file mode 100644 index 0000000..0bf3cf7 --- /dev/null +++ b/.config/kitty/themes/Tomorrow_Night.conf @@ -0,0 +1,21 @@ +background #1d1f21 +foreground #c4c8c5 +cursor #c4c8c5 +selection_background #363a41 +color0 #000000 +color8 #000000 +color1 #cc6666 +color9 #cc6666 +color2 #b5bd68 +color10 #b5bd68 +color3 #f0c574 +color11 #f0c574 +color4 #80a1bd +color12 #80a1bd +color5 #b294ba +color13 #b294ba +color6 #8abdb6 +color14 #8abdb6 +color7 #fffefe +color15 #fffefe +selection_foreground #1d1f21 diff --git a/.config/kitty/themes/Tomorrow_Night_Blue.conf b/.config/kitty/themes/Tomorrow_Night_Blue.conf new file mode 100644 index 0000000..b32cbfd --- /dev/null +++ b/.config/kitty/themes/Tomorrow_Night_Blue.conf @@ -0,0 +1,21 @@ +background #002450 +foreground #fffefe +cursor #fffefe +selection_background #003e8e +color0 #000000 +color8 #000000 +color1 #ff9ca3 +color9 #ff9ca3 +color2 #d0f0a8 +color10 #d0f0a8 +color3 #ffedac +color11 #ffedac +color4 #badaff +color12 #badaff +color5 #ebbaff +color13 #ebbaff +color6 #99ffff +color14 #99ffff +color7 #fffefe +color15 #fffefe +selection_foreground #002450 diff --git a/.config/kitty/themes/Tomorrow_Night_Bright.conf b/.config/kitty/themes/Tomorrow_Night_Bright.conf new file mode 100644 index 0000000..346f3dc --- /dev/null +++ b/.config/kitty/themes/Tomorrow_Night_Bright.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #e9e9e9 +cursor #e9e9e9 +selection_background #424242 +color0 #000000 +color8 #000000 +color1 #d44d53 +color9 #d44d53 +color2 #b9c949 +color10 #b9c949 +color3 #e6c446 +color11 #e6c446 +color4 #79a6da +color12 #79a6da +color5 #c396d7 +color13 #c396d7 +color6 #70c0b1 +color14 #70c0b1 +color7 #fffefe +color15 #fffefe +selection_foreground #000000 diff --git a/.config/kitty/themes/Tomorrow_Night_Eighties.conf b/.config/kitty/themes/Tomorrow_Night_Eighties.conf new file mode 100644 index 0000000..404efc7 --- /dev/null +++ b/.config/kitty/themes/Tomorrow_Night_Eighties.conf @@ -0,0 +1,21 @@ +background #2c2c2c +foreground #cccccc +cursor #cccccc +selection_background #505050 +color0 #000000 +color8 #000000 +color1 #f17779 +color9 #f17779 +color2 #99cc99 +color10 #99cc99 +color3 #ffcc66 +color11 #ffcc66 +color4 #6699cc +color12 #6699cc +color5 #cc99cc +color13 #cc99cc +color6 #66cccc +color14 #66cccc +color7 #fffefe +color15 #fffefe +selection_foreground #2c2c2c diff --git a/.config/kitty/themes/ToyChest.conf b/.config/kitty/themes/ToyChest.conf new file mode 100644 index 0000000..040cb8d --- /dev/null +++ b/.config/kitty/themes/ToyChest.conf @@ -0,0 +1,21 @@ +background #23364a +foreground #30cf7b +cursor #d4d4d4 +selection_background #5f207a +color0 #2c3f57 +color8 #326889 +color1 #be2d26 +color9 #dd5943 +color2 #199171 +color10 #30cf7b +color3 #da8e26 +color11 #e7d74b +color4 #325d96 +color12 #33a5d9 +color5 #8a5ddb +color13 #ad6bdc +color6 #35a08f +color14 #41c3ad +color7 #23d082 +color15 #d4d4d4 +selection_foreground #23364a diff --git a/.config/kitty/themes/Treehouse.conf b/.config/kitty/themes/Treehouse.conf new file mode 100644 index 0000000..940751e --- /dev/null +++ b/.config/kitty/themes/Treehouse.conf @@ -0,0 +1,21 @@ +background #191919 +foreground #776b53 +cursor #fac814 +selection_background #776b53 +color0 #321200 +color8 #423625 +color1 #b1270e +color9 #ed5c20 +color2 #44a900 +color10 #55f237 +color3 #a9810b +color11 #f1b731 +color4 #578499 +color12 #85cfec +color5 #96363c +color13 #e04b5a +color6 #b2591d +color14 #f07c14 +color7 #776b53 +color15 #ffc800 +selection_foreground #191919 diff --git a/.config/kitty/themes/Twilight.conf b/.config/kitty/themes/Twilight.conf new file mode 100644 index 0000000..452a4d2 --- /dev/null +++ b/.config/kitty/themes/Twilight.conf @@ -0,0 +1,21 @@ +background #141414 +foreground #feffd3 +cursor #ffffff +selection_background #303030 +color0 #141414 +color8 #262626 +color1 #c06c43 +color9 #dd7c4c +color2 #afb979 +color10 #cbd88c +color3 #c2a86c +color11 #e1c47d +color4 #444649 +color12 #5a5d61 +color5 #b4be7b +color13 #d0db8e +color6 #778284 +color14 #8a989a +color7 #feffd3 +color15 #feffd3 +selection_foreground #141414 diff --git a/.config/kitty/themes/Ubuntu.conf b/.config/kitty/themes/Ubuntu.conf new file mode 100644 index 0000000..96e9d09 --- /dev/null +++ b/.config/kitty/themes/Ubuntu.conf @@ -0,0 +1,21 @@ +background #300a24 +foreground #eeeeec +cursor #bbbbbb +selection_background #b4d5ff +color0 #2e3436 +color8 #555753 +color1 #cc0000 +color9 #ef2929 +color2 #4e9a06 +color10 #8ae234 +color3 #c4a000 +color11 #fce94f +color4 #3465a4 +color12 #729fcf +color5 #75507b +color13 #ad7fa8 +color6 #06989a +color14 #34e2e2 +color7 #d3d7cf +color15 #eeeeec +selection_foreground #300a24 diff --git a/.config/kitty/themes/Urple.conf b/.config/kitty/themes/Urple.conf new file mode 100644 index 0000000..a29dcad --- /dev/null +++ b/.config/kitty/themes/Urple.conf @@ -0,0 +1,21 @@ +background #1b1b23 +foreground #86799a +cursor #a062ea +selection_background #a062ea +color0 #000000 +color8 #5c3125 +color1 #af425b +color9 #ff6387 +color2 #37a315 +color10 #28e51f +color3 #ac5b41 +color11 #f08061 +color4 #554d9a +color12 #8579ed +color5 #6c3ba1 +color13 #a05dee +color6 #808080 +color14 #eaeaea +color7 #87799c +color15 #bfa3ff +selection_foreground #1b1b23 diff --git a/.config/kitty/themes/Vaughn.conf b/.config/kitty/themes/Vaughn.conf new file mode 100644 index 0000000..26d1885 --- /dev/null +++ b/.config/kitty/themes/Vaughn.conf @@ -0,0 +1,21 @@ +background #25234e +foreground #dcdccc +cursor #ff5555 +selection_background #b5d5ff +color0 #24234f +color8 #709080 +color1 #705050 +color9 #dca3a3 +color2 #60b48a +color10 #60b48a +color3 #dfaf8f +color11 #f0dfaf +color4 #5454ff +color12 #5454ff +color5 #f08cc3 +color13 #ec93d3 +color6 #8cd0d3 +color14 #93e0e3 +color7 #709080 +color15 #ffffff +selection_foreground #25234e diff --git a/.config/kitty/themes/VibrantInk.conf b/.config/kitty/themes/VibrantInk.conf new file mode 100644 index 0000000..5fbd281 --- /dev/null +++ b/.config/kitty/themes/VibrantInk.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #ffffff +cursor #ffffff +selection_background #b4d5ff +color0 #868686 +color8 #545454 +color1 #ff6600 +color9 #ff0000 +color2 #ccff04 +color10 #00ff00 +color3 #ffcc00 +color11 #ffff00 +color4 #44b3cc +color12 #0000ff +color5 #9933cc +color13 #ff00ff +color6 #44b3cc +color14 #00ffff +color7 #f4f4f4 +color15 #e5e5e5 +selection_foreground #000000 diff --git a/.config/kitty/themes/WarmNeon.conf b/.config/kitty/themes/WarmNeon.conf new file mode 100644 index 0000000..3256f5d --- /dev/null +++ b/.config/kitty/themes/WarmNeon.conf @@ -0,0 +1,21 @@ +background #3f3f3f +foreground #afdab6 +cursor #2fff24 +selection_background #b0ad21 +color0 #000000 +color8 #fdfcfc +color1 #e24345 +color9 #e86f71 +color2 #38b139 +color10 #9bc08f +color3 #dae145 +color11 #ddd979 +color4 #4260c5 +color12 #7a90d5 +color5 #f81ffb +color13 #f674b9 +color6 #29bad3 +color14 #5ed1e4 +color7 #d0b8a3 +color15 #d8c8bb +selection_foreground #3f3f3f diff --git a/.config/kitty/themes/Wez.conf b/.config/kitty/themes/Wez.conf new file mode 100644 index 0000000..11706ab --- /dev/null +++ b/.config/kitty/themes/Wez.conf @@ -0,0 +1,21 @@ +background #000000 +foreground #b3b3b3 +cursor #52ad70 +selection_background #4c52f8 +color0 #000000 +color8 #555555 +color1 #cc5555 +color9 #ff5555 +color2 #55cc55 +color10 #55ff55 +color3 #cdcd55 +color11 #ffff55 +color4 #5455cb +color12 #5555ff +color5 #cc55cc +color13 #ff55ff +color6 #7acaca +color14 #55ffff +color7 #cccccc +color15 #ffffff +selection_foreground #000000 diff --git a/.config/kitty/themes/WildCherry.conf b/.config/kitty/themes/WildCherry.conf new file mode 100644 index 0000000..a4bfa47 --- /dev/null +++ b/.config/kitty/themes/WildCherry.conf @@ -0,0 +1,21 @@ +background #1f1626 +foreground #d9faff +cursor #dd00ff +selection_background #002731 +color0 #000506 +color8 #009cc9 +color1 #d94085 +color9 #da6bab +color2 #2ab250 +color10 #f4dba5 +color3 #ffd06e +color11 #eac066 +color4 #873bdb +color12 #2f8bb9 +color5 #ececec +color13 #ae636b +color6 #c1b8b6 +color14 #ff919d +color7 #fff8dd +color15 #e4838d +selection_foreground #1f1626 diff --git a/.config/kitty/themes/Wombat.conf b/.config/kitty/themes/Wombat.conf new file mode 100644 index 0000000..d4616fc --- /dev/null +++ b/.config/kitty/themes/Wombat.conf @@ -0,0 +1,21 @@ +background #171717 +foreground #ded9ce +cursor #bbbbbb +selection_background #453a39 +color0 #000000 +color8 #313131 +color1 #ff605a +color9 #f58b7f +color2 #b1e869 +color10 #dcf88f +color3 #ead89c +color11 #eee5b2 +color4 #5da9f6 +color12 #a5c7ff +color5 #e86aff +color13 #ddaaff +color6 #82fff6 +color14 #b6fff9 +color7 #ded9ce +color15 #fefffe +selection_foreground #171717 diff --git a/.config/kitty/themes/Wryan.conf b/.config/kitty/themes/Wryan.conf new file mode 100644 index 0000000..73d758d --- /dev/null +++ b/.config/kitty/themes/Wryan.conf @@ -0,0 +1,21 @@ +background #101010 +foreground #999993 +cursor #9d9eca +selection_background #4d4d4d +color0 #333333 +color8 #3d3d3d +color1 #8c4665 +color9 #bf4d80 +color2 #287373 +color10 #53a6a6 +color3 #7c7c99 +color11 #9e9ecb +color4 #395573 +color12 #477ab3 +color5 #5e468c +color13 #7e62b3 +color6 #31658c +color14 #6096bf +color7 #899ca1 +color15 #c0c0c0 +selection_foreground #101010 diff --git a/.config/kitty/themes/Zenburn.conf b/.config/kitty/themes/Zenburn.conf new file mode 100644 index 0000000..032b99b --- /dev/null +++ b/.config/kitty/themes/Zenburn.conf @@ -0,0 +1,25 @@ +# Zenburn by jnurmine, https://github.com/jnurmine/Zenburn +# This work is licensed under the terms of the GNU GPL license. +# For a copy, see http://www.gnu.org/licenses/gpl.html. + +background #3f3f3f +foreground #dcdccc +cursor #73635a +selection_background #21322f +color0 #4d4d4d +color8 #709080 +color1 #705050 +color9 #dca3a3 +color2 #60b48a +color10 #c3bf9f +color3 #f0deae +color11 #dfcf9f +color4 #506070 +color12 #94bff3 +color5 #dc8cc3 +color13 #ec93d3 +color6 #8cd0d3 +color14 #93e0e3 +color7 #dcdccc +color15 #ffffff +selection_foreground #3f3f3f diff --git a/.config/kitty/themes/ayu.conf b/.config/kitty/themes/ayu.conf new file mode 100644 index 0000000..8030263 --- /dev/null +++ b/.config/kitty/themes/ayu.conf @@ -0,0 +1,21 @@ +background #0e1419 +foreground #e5e1cf +cursor #f19618 +selection_background #243340 +color0 #000000 +color8 #323232 +color1 #ff3333 +color9 #ff6565 +color2 #b8cc52 +color10 #e9fe83 +color3 #e6c446 +color11 #fff778 +color4 #36a3d9 +color12 #68d4ff +color5 #f07078 +color13 #ffa3aa +color6 #95e5cb +color14 #c7fffc +color7 #ffffff +color15 #ffffff +selection_foreground #0e1419 diff --git a/.config/kitty/themes/ayu_light.conf b/.config/kitty/themes/ayu_light.conf new file mode 100644 index 0000000..35c532c --- /dev/null +++ b/.config/kitty/themes/ayu_light.conf @@ -0,0 +1,21 @@ +background #fafafa +foreground #5b6673 +cursor #ff6900 +selection_background #f0ede4 +color0 #000000 +color8 #323232 +color1 #ff3333 +color9 #ff6565 +color2 #86b200 +color10 #b8e532 +color3 #f19618 +color11 #ffc849 +color4 #41a6d9 +color12 #73d7ff +color5 #f07078 +color13 #ffa3aa +color6 #4cbe99 +color14 #7ff0cb +color7 #ffffff +color15 #ffffff +selection_foreground #fafafa diff --git a/.config/kitty/themes/ayu_mirage.conf b/.config/kitty/themes/ayu_mirage.conf new file mode 100644 index 0000000..19d2e40 --- /dev/null +++ b/.config/kitty/themes/ayu_mirage.conf @@ -0,0 +1,21 @@ +background #212733 +foreground #d9d7ce +cursor #ffcc66 +selection_background #343f4c +color0 #191e2a +color8 #686868 +color1 #ed8274 +color9 #f28779 +color2 #a6cc70 +color10 #bae67e +color3 #fad07b +color11 #ffd580 +color4 #6dcbfa +color12 #73d0ff +color5 #cfbafa +color13 #d4bfff +color6 #90e1c6 +color14 #95e6cb +color7 #c7c7c7 +color15 #ffffff +selection_foreground #212733 diff --git a/.config/kitty/themes/gruvbox_dark.conf b/.config/kitty/themes/gruvbox_dark.conf new file mode 100644 index 0000000..369da8d --- /dev/null +++ b/.config/kitty/themes/gruvbox_dark.conf @@ -0,0 +1,49 @@ +# gruvbox dark by morhetz, https://github.com/morhetz/gruvbox +# This work is licensed under the terms of the MIT license. +# For a copy, see https://opensource.org/licenses/MIT. + +background #282828 +foreground #ebdbb2 + +cursor #928374 + +selection_foreground #928374 +selection_background #3c3836 + +color0 #282828 +color8 #928374 + +# red +color1 #cc241d +# light red +color9 #fb4934 + +# green +color2 #98971a +# light green +color10 #b8bb26 + +# yellow +color3 #d79921 +# light yellow +color11 #fabd2d + +# blue +color4 #458588 +# light blue +color12 #83a598 + +# magenta +color5 #b16286 +# light magenta +color13 #d3869b + +# cyan +color6 #689d6a +# lighy cyan +color14 #8ec07c + +# light gray +color7 #a89984 +# dark gray +color15 #928374 diff --git a/.config/kitty/themes/gruvbox_light.conf b/.config/kitty/themes/gruvbox_light.conf new file mode 100644 index 0000000..6d8b89b --- /dev/null +++ b/.config/kitty/themes/gruvbox_light.conf @@ -0,0 +1,49 @@ +# gruvbox light by morhetz, https://github.com/morhetz/gruvbox +# This work is licensed under the terms of the MIT license. +# For a copy, see https://opensource.org/licenses/MIT. + +background #fbf1c7 +foreground #3c3836 + +cursor #928374 + +selection_foreground #3c3836 +selection_background #928374 + +color0 #fbf1c7 +color8 #282828 + +# red +color1 #cc241d +# light red +color9 #9d0006 + +# green +color2 #98971a +# light green +color10 #79740e + +# yellow +color3 #d79921 +# light yellow +color11 #b57614 + +# blue +color4 #458588 +# light blue +color12 #076678 + +# magenta +color5 #b16286 +# light magenta +color13 #8f3f71 + +# cyan +color6 #689d6a +# lighy cyan +color14 #427b58 + +# light gray +color7 #7c6f64 +# dark gray +color15 #928374 diff --git a/.config/kitty/themes/idleToes.conf b/.config/kitty/themes/idleToes.conf new file mode 100644 index 0000000..941d4b2 --- /dev/null +++ b/.config/kitty/themes/idleToes.conf @@ -0,0 +1,21 @@ +background #323232 +foreground #ffffff +cursor #d6d6d6 +selection_background #5b5b5b +color0 #323232 +color8 #535353 +color1 #d25252 +color9 #f07070 +color2 #7fe173 +color10 #9dff90 +color3 #ffc66d +color11 #ffe48b +color4 #4098ff +color12 #5eb7f7 +color5 #f57fff +color13 #ff9dff +color6 #bed6ff +color14 #dcf4ff +color7 #eeeeec +color15 #ffffff +selection_foreground #323232 diff --git a/.config/kitty/themes/snazzy.conf b/.config/kitty/themes/snazzy.conf new file mode 100644 index 0000000..2ed5ff5 --- /dev/null +++ b/.config/kitty/themes/snazzy.conf @@ -0,0 +1,46 @@ +# snazzy by Connor Holyday (holyday.me) +# This work is licensed under the terms of the MIT license. +# For a copy, see https://opensource.org/licenses/MIT. + +# Snazzy Colorscheme for Kitty +# Based on https://github.com/sindresorhus/hyper-snazzy + +foreground #eff0eb +background #282a36 +selection_foreground #000000 +selection_background #FFFACD +url_color #0087BD +cursor #97979B +cursor_text_color #282A36 + +# black +color0 #282a36 +color8 #686868 + +# red +color1 #FF5C57 +color9 #FF5C57 + +# green +color2 #5AF78E +color10 #5AF78E + +# yellow +color3 #F3F99D +color11 #F3F99D + +# blue +color4 #57C7FF +color12 #57C7FF + +# magenta +color5 #FF6AC1 +color13 #FF6AC1 + +# cyan +color6 #9AEDFE +color14 #9AEDFE + +# white +color7 #F1F1F0 +color15 #EFF0EB diff --git a/.config/lazygit/config.yml b/.config/lazygit/config.yml new file mode 100644 index 0000000..56a52d1 --- /dev/null +++ b/.config/lazygit/config.yml @@ -0,0 +1,10 @@ +gui: + nerdFontsVersion: "3" + showFileIcons: true + border: "rounded" + spinner: + frames: + - "󰸸" + - "󰸷" + - "󰸴" + - "󰸵" diff --git a/.config/micro/bindings.json b/.config/micro/bindings.json new file mode 100644 index 0000000..9be2b66 --- /dev/null +++ b/.config/micro/bindings.json @@ -0,0 +1,10 @@ +{ + "Alt-/": "lua:comment.comment", + "Alt-d": "command:definition", + "Alt-f": "command:format", + "Alt-k": "command:hover", + "Alt-r": "command:references", + "CtrlSpace": "command:lspcompletion", + "CtrlUnderscore": "lua:comment.comment", + "CtrlRightSq": "command:tree" +} diff --git a/.config/micro/buffers/history b/.config/micro/buffers/history new file mode 100644 index 0000000..e2c5d0a Binary files /dev/null and b/.config/micro/buffers/history differ diff --git a/.config/micro/colorschemes/tokyo-night.micro b/.config/micro/colorschemes/tokyo-night.micro new file mode 100644 index 0000000..a771913 --- /dev/null +++ b/.config/micro/colorschemes/tokyo-night.micro @@ -0,0 +1,31 @@ +color-link default "#7aa2f7" +color-link comment "#4d526b" +color-link identifier "#7dcfff" +color-link constant "#e08f68" +color-link constant.string "#9ece6a" +color-link constant.string.char "#f7768e" +color-link statement "#ffffff" +color-link symbol.operator "#ffffff" +color-link preproc "#7dcfff" +color-link type "#7dcfff" +color-link special "#dec76e" +color-link underlined "#bb9af7" +color-link error "bold #f44747" +color-link todo "bold #bb9af7" +color-link hlsearch "#1f2335,#e6db74" +color-link statusline "#1f2335,#9ece6a" +color-link tabbar "#1f2335,#9ece6a" +color-link indent-char "#585858,#202437" +color-link line-number "#484b5c,#323232" +color-link current-line-number "#c0caf5",#1f2335" +color-link diff-added "#9ece6a" +color-link diff-modified "#dec76e" +color-link diff-deleted "#f7768e" +color-link gutter-error "#f77676,#1f2335" +color-link gutter-warning "#d79a42,#1f2335" +color-link cursor-line "#202437" +color-link color-column "#c0caf5" +#No extended types; Plain brackets. +color-link type.extended "default" +#color-link symbol.brackets "default" +color-link symbol.tag "#c0caf5,#1f2335" diff --git a/.config/micro/plug/filemanager/.editorconfig b/.config/micro/plug/filemanager/.editorconfig new file mode 100644 index 0000000..a34d753 --- /dev/null +++ b/.config/micro/plug/filemanager/.editorconfig @@ -0,0 +1,17 @@ +# EditorConfig is awesome: http://EditorConfig.org + +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +charset = utf-8 +end_of_line = lf +indent_style = tab +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +# Ignore .md files, because 2 spaces at end-of-line has meaning +[*.md] +trim_trailing_whitespace = false diff --git a/.config/micro/plug/filemanager/CHANGELOG.md b/.config/micro/plug/filemanager/CHANGELOG.md new file mode 100644 index 0000000..46d51c4 --- /dev/null +++ b/.config/micro/plug/filemanager/CHANGELOG.md @@ -0,0 +1,109 @@ +# Changelog + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [3.4.0] - 2018-10-22 + +### Fixed + +- Issues with Lua's `io.popen` on some systems by using Micro's built-in `RunShellCommand` instead, [thanks to @scottbilas](https://github.com/NicolaiSoeborg/filemanager-plugin/pull/38) + +### Added + +- Adds the option `filemanager-openonstart` to allow auto-opening the file tree when Micro is started (default OFF) + +### Changed + +- Update README's option's documentation + +## [3.3.1] - 2018-10-03 + +### Changed + +- Performance improvement by removing unnecessary refresh of the opened file, [thanks to @jackwilsdon](https://github.com/NicolaiSoeborg/filemanager-plugin/pull/37) + +## [3.3.0] - 2018-09-13 + +### Added + +- The ability to sort folders above files, [thanks to @cbrown1](https://github.com/NicolaiSoeborg/filemanager-plugin/pull/33) + +### Fixed + +- The displayed filenames are now correctly only showing their "basename" on Windows + +## [3.2.0] - 2018-02-15 + +### Added + +- The ability to go to parent directory with left arrow (when not minimizing). Thanks @avently +- The ability to jump to the `..` as a "parent directory". Thanks @avently + +## [3.1.2] - 2018-02-07 + +### Fixed + +- The minimum Micro version, which was incorrectly set to v1.4.0. Ref [issue #28](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/28) + +## [3.1.1] - 2018-02-04 + +### Fixed + +Ref https://github.com/zyedidia/micro/issues/992 for both of these fixes. + +- The syntax parser not loading correctly (mostly block comments) on opened files. **Requires Micro >= v1.4.0** +- An errant tab being inserted into the newly opened file. + +## [3.1.0] - 2018-01-30 + +### Added + +- The ability to hide dotfiles using the `filemanager-showdotfiles` option. +- The ability to hide files ignored in your VCS (aka `.gitignore`'d) using the `filemanager-showignored` option. Only works with Git at the moment. +- This `CHANGELOG.md` + +### Fixed + +- A bug with the `rm` command that caused weird, undefined behaviour to contents within the same dir as the file/dir deleted. +- Issue [#24](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/24) + +## [3.0.0] - 2018-01-10 + +### Fixed + +- Issues [#13](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/13), [#14](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/14), [#15](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/15), [#19](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/19), [#20](https://github.com/NicolaiSoeborg/filemanager-plugin/issues/20) +- The broken syntax highlighting + +### Added + +- Directory expansion/compression below itself for viewing more akin to a file tree. +- The `rm` command, which deletes the file/directory under the cursor. +- The `touch` command, which creates a file with the passed filename. +- The `mkdir` command, which creates a directory with the passed filename. +- An API, of sorts, for the user to rebind their keys to if they dislike the defaults. +- An [editorconfig](http://editorconfig.org/) file. + +### Changed + +- The view that it spawns in to read-only, which requires Micro version >= 1.3.5 +- The functionality of some keybindings (when in the view) so they work safetly, or at all, with the plugin. +- From the `enter` key to `tab` for opening/going into files/dirs (a side-effect of using the read-only setting) + +### Removed + +- The ability to use a lot of keybindings that would otherwise mess with the view, and have no benifit. +- The pointless `.gitignore` file. + +[unreleased]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.4.0...HEAD +[3.4.0]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.3.1...v3.4.0 +[3.3.1]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.3.0...v3.3.1 +[3.3.0]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.2.0...v3.3.0 +[3.2.0]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.1.2...v3.2.0 +[3.1.2]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.1.1...v3.1.2 +[3.1.1]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.1.0...v3.1.1 +[3.1.0]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v3.0.0...v3.1.0 +[3.0.0]: https://github.com/NicolaiSoeborg/filemanager-plugin/compare/v2.1.1...v3.0.0 diff --git a/.config/micro/plug/filemanager/LICENSE b/.config/micro/plug/filemanager/LICENSE new file mode 100644 index 0000000..ae6fb2f --- /dev/null +++ b/.config/micro/plug/filemanager/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2017 Nicolai Søborg + +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. diff --git a/.config/micro/plug/filemanager/README.md b/.config/micro/plug/filemanager/README.md new file mode 100644 index 0000000..79d983d --- /dev/null +++ b/.config/micro/plug/filemanager/README.md @@ -0,0 +1,56 @@ +# Filemanager Plugin + +A simple plugin that allows for easy navigation of a file tree. + +![Example picture](./example.jpg?raw=true "Example") + +**Installation:** run `plugin install filemanager` and restart Micro. + +## Basics + +The top line always has the current directory's path to show you where you are.\ +The `..` near the top is used to move back a directory, from your current position. + +All directories have a `/` added to the end of it, and are syntax-highlighted as a `special` character.\ +If the directory is expanded, there will be a `+` to the left of it. If it is collapsed there will be a `-` instead. + +**NOTE:** If you change files without using the plugin, it can't know what you did. The only fix is to close and open the tree. + +### Options + +| Option | Purpose | Default | +| :--------------------------- | :----------------------------------------------------------- | :------ | +| `filemanager-showdotfiles` | Show dotfiles (hidden if false) | `true` | +| `filemanager-showignored` | Show gitignore'd files (hidden if false) | `true` | +| `filemanager-compressparent` | Collapse the parent dir when left is pressed on a child file | `true` | +| `filemanager-foldersfirst` | Sorts folders above any files | `true` | +| `filemanager-openonstart` | Automatically open the file tree when starting Micro | `false` | + +### Commands and Keybindings + +The keybindings below are the equivalent to Micro's defaults, and not actually set by the plugin. If you've changed any of those keybindings, then that key is used instead. + +If you want to [keybind](https://github.com/zyedidia/micro/blob/master/runtime/help/keybindings.md#rebinding-keys) any of the operations/commands, bind to the labeled API in the table below. + +| Command | Keybinding(s) | What it does | API for `bindings.json` | +| :------- | :------------------------- | :------------------------------------------------------------------------------------------ | :------------------------------------ | +| `tree` | - | Open/close the tree | `filemanager.toggle_tree` | +| - | Tab & MouseLeft | Open a file, or go into the directory. Goes back a dir if on `..` | `filemanager.try_open_at_cursor` | +| - | | Expand directory in tree listing | `filemanager.uncompress_at_cursor` | +| - | | Collapse directory listing | `filemanager.compress_at_cursor` | +| - | Shift ⬆ | Go to the target's parent directory | `filemanager.goto_parent_dir` | +| - | Alt Shift { | Jump to the previous directory in the view | `filemanager.goto_next_dir` | +| - | Alt Shift } | Jump to the next directory in the view | `filemanager.goto_prev_dir` | +| `rm` | - | Prompt to delete the target file/directory your cursor is on | `filemanager.prompt_delete_at_cursor` | +| `rename` | - | Rename the file/directory your cursor is on, using the passed name | `filemanager.rename_at_cursor` | +| `touch` | - | Make a new file under/into the file/directory your cursor is on, using the passed name | `filemanager.new_file` | +| `mkdir` | - | Make a new directory under/into the file/directory your cursor is on, using the passed name | `filemanager.new_dir` | + +#### Notes + +- `rename`, `touch`, and `mkdir` require a name to be passed when calling.\ + Example: `rename newnamehere`, `touch filenamehere`, `mkdir dirnamehere`.\ + If the passed name already exists in the current dir, it will cancel instead of overwriting (for safety). + +- The Ctrl w keybinding is to switch which buffer your cursor is on.\ + This isn't specific to the plugin, it's just part of Micro, but many people seem to not know this. diff --git a/.config/micro/plug/filemanager/example.jpg b/.config/micro/plug/filemanager/example.jpg new file mode 100644 index 0000000..ab5bf1c Binary files /dev/null and b/.config/micro/plug/filemanager/example.jpg differ diff --git a/.config/micro/plug/filemanager/filemanager.lua b/.config/micro/plug/filemanager/filemanager.lua new file mode 100644 index 0000000..fef17d4 --- /dev/null +++ b/.config/micro/plug/filemanager/filemanager.lua @@ -0,0 +1,1387 @@ +VERSION = "3.5.1" + +local micro = import("micro") +local config = import("micro/config") +local shell = import("micro/shell") +local buffer = import("micro/buffer") +local os = import("os") +local filepath = import("path/filepath") + +-- Clear out all stuff in Micro's messenger +local function clear_messenger() + -- messenger:Reset() + -- messenger:Clear() +end + +-- Holds the micro.CurPane() we're manipulating +local tree_view = nil +-- Keeps track of the current working directory +local current_dir = os.Getwd() +-- Keep track of current highest visible indent to resize width appropriately +local highest_visible_indent = 0 +-- Holds a table of paths -- objects from new_listobj() calls +local scanlist = {} + +-- Get a new object used when adding to scanlist +local function new_listobj(p, d, o, i) + return { + ["abspath"] = p, + ["dirmsg"] = d, + ["owner"] = o, + ["indent"] = i, + -- Since decreasing/increasing is common, we include these with the object + ["decrease_owner"] = function(self, minus_num) + self.owner = self.owner - minus_num + end, + ["increase_owner"] = function(self, plus_num) + self.owner = self.owner + plus_num + end + } +end + +-- Repeats a string x times, then returns it concatenated into one string +local function repeat_str(str, len) + -- Do NOT try to concat in a loop, it freezes micro... + -- instead, use a temporary table to hold values + local string_table = {} + for i = 1, len do + string_table[i] = str + end + -- Return the single string of repeated characters + return table.concat(string_table) +end + +-- A check for if a path is a dir +local function is_dir(path) + -- Used for checking if dir + local golib_os = import("os") + -- Returns a FileInfo on the current file/path + local file_info, stat_error = golib_os.Stat(path) + -- Wrap in nil check for file/dirs without read permissions + if file_info ~= nil then + -- Returns true/false if it's a dir + return file_info:IsDir() + else + -- Couldn't stat the file/dir, usually because no read permissions + micro.InfoBar():Error("Error checking if is dir: ", stat_error) + -- Nil since we can't read the path + return nil + end +end + +-- Returns a list of files (in the target dir) that are ignored by the VCS system (if exists) +-- aka this returns a list of gitignored files (but for whatever VCS is found) +local function get_ignored_files(tar_dir) + -- True/false if the target dir returns a non-fatal error when checked with 'git status' + local function has_git() + local git_rp_results = shell.ExecCommand('git -C "' .. tar_dir .. '" rev-parse --is-inside-work-tree') + return git_rp_results:match("^true%s*$") + end + local readout_results = {} + -- TODO: Support more than just Git, such as Mercurial or SVN + if has_git() then + -- If the dir is a git dir, get all ignored in the dir + local git_ls_results = + shell.ExecCommand('git -C "' .. tar_dir .. '" ls-files . --ignored --exclude-standard --others --directory') + -- Cut off the newline that is at the end of each result + for split_results in string.gmatch(git_ls_results, "([^\r\n]+)") do + -- git ls-files adds a trailing slash if it's a dir, so we remove it (if it is one) + readout_results[#readout_results + 1] = + (string.sub(split_results, -1) == "/" and string.sub(split_results, 1, -2) or split_results) + end + end + + -- Make sure we return a table + return readout_results +end + +-- Returns the basename of a path (aka a name without leading path) +local function get_basename(path) + if path == nil then + micro.Log("Bad path passed to get_basename") + return nil + else + -- Get Go's path lib for a basename callback + local golib_path = import("filepath") + return golib_path.Base(path) + end +end + +-- Returns true/false if the file is a dotfile +local function is_dotfile(file_name) + -- Check if the filename starts with a dot + if string.sub(file_name, 1, 1) == "." then + return true + else + return false + end +end + +-- Structures the output of the scanned directory content to be used in the scanlist table +-- This is useful for both initial creation of the tree, and when nesting with uncompress_target() +local function get_scanlist(dir, ownership, indent_n) + local golib_ioutil = import("ioutil") + -- Gets a list of all the files in the current dir + local dir_scan, scan_error = golib_ioutil.ReadDir(dir) + + -- dir_scan will be nil if the directory is read-protected (no permissions) + if dir_scan == nil then + micro.InfoBar():Error("Error scanning dir: ", scan_error) + return nil + end + + -- The list of files to be returned (and eventually put in the view) + local results = {} + local files = {} + + local function get_results_object(file_name) + local abs_path = filepath.Join(dir, file_name) + -- Use "+" for dir's, "" for files + local dirmsg = (is_dir(abs_path) and "+" or "") + return new_listobj(abs_path, dirmsg, ownership, indent_n) + end + + -- Save so we don't have to rerun GetOption a bunch + local show_dotfiles = config.GetGlobalOption("filemanager.showdotfiles") + local show_ignored = config.GetGlobalOption("filemanager.showignored") + local folders_first = config.GetGlobalOption("filemanager.foldersfirst") + + -- The list of VCS-ignored files (if any) + -- Only bother getting ignored files if we're not showing ignored + local ignored_files = (not show_ignored and get_ignored_files(dir) or {}) + -- True/false if the file is an ignored file + local function is_ignored_file(filename) + for i = 1, #ignored_files do + if ignored_files[i] == filename then + return true + end + end + return false + end + + -- Hold the current scan's filename in most of the loops below + local filename + + for i = 1, #dir_scan do + local showfile = true + filename = dir_scan[i]:Name() + -- If we should not show dotfiles, and this is a dotfile, don't show + if not show_dotfiles and is_dotfile(filename) then + showfile = false + end + -- If we should not show ignored files, and this is an ignored file, don't show + if not show_ignored and is_ignored_file(filename) then + showfile = false + end + if showfile then + -- This file is good to show, proceed + if folders_first and not is_dir(filepath.Join(dir, filename)) then + -- If folders_first and this is a file, add it to (temporary) files + files[#files + 1] = get_results_object(filename) + else + -- Otherwise, add to results + results[#results + 1] = get_results_object(filename) + end + end + end + if #files > 0 then + -- Append any files to results, now that all folders have been added + -- files will be > 0 only if folders_first and there are files + for i = 1, #files do + results[#results + 1] = files[i] + end + end + + -- Return the list of scanned files + return results +end + +-- A short "get y" for when acting on the scanlist +-- Needed since we don't store the first 3 visible indicies in scanlist +local function get_safe_y(optional_y) + -- Default to 0 so we can check against and see if it's bad + local y = 0 + -- Make the passed y optional + if optional_y == nil then + -- Default to cursor's Y loc if nothing was passed, instead of declaring another y + optional_y = tree_view.Cursor.Loc.Y + end + -- 0/1/2 would be the top "dir, separator, .." so check if it's past + if optional_y > 2 then + -- -2 to conform to our scanlist, since zero-based Go index & Lua's one-based + y = tree_view.Cursor.Loc.Y - 2 + end + return y +end + +-- Joins the target dir's leading path to the passed name +local function dirname_and_join(path, join_name) + -- The leading path to the dir we're in + local leading_path = filepath.Dir(path) + -- Joins with OS-specific slashes + return filepath.Join(leading_path, join_name) +end + +-- Hightlights the line when you move the cursor up/down +local function select_line(last_y) + -- Make last_y optional + if last_y ~= nil then + -- Don't let them move past ".." by checking the result first + if last_y > 1 then + -- If the last position was valid, move back to it + tree_view.Cursor.Loc.Y = last_y + end + elseif tree_view.Cursor.Loc.Y < 2 then + -- Put the cursor on the ".." if it's above it + tree_view.Cursor.Loc.Y = 2 + end + + -- Puts the cursor back in bounds (if it isn't) for safety + tree_view.Cursor:Relocate() + + -- Makes sure the cursor is visible (if it isn't) + -- (false) means no callback + tree_view:Center() + + -- Highlight the current line where the cursor is + tree_view.Cursor:SelectLine() +end + +-- Simple true/false if scanlist is currently empty +local function scanlist_is_empty() + if next(scanlist) == nil then + return true + else + return false + end +end + +local function refresh_view() + clear_messenger() + + -- If it's less than 30, just use 30 for width. Don't want it too small + + if tree_view:GetView().Width < 30 then + tree_view:ResizePane(30) + end + + -- Delete everything in the view/buffer + tree_view.Buf.EventHandler:Remove(tree_view.Buf:Start(), tree_view.Buf:End()) + + -- Insert the top 3 things that are always there + -- Current dir + tree_view.Buf.EventHandler:Insert(buffer.Loc(0, 0), current_dir .. "\n") + -- An ASCII separator + tree_view.Buf.EventHandler:Insert(buffer.Loc(0, 1), repeat_str("─", tree_view:GetView().Width) .. "\n") + -- The ".." and use a newline if there are things in the current dir + tree_view.Buf.EventHandler:Insert(buffer.Loc(0, 2), (#scanlist > 0 and "..\n" or "..")) + + -- Holds the current basename of the path (purely for display) + local display_content + + -- NOTE: might want to not do all these concats in the loop, it can get slow + for i = 1, #scanlist do + -- The first 3 indicies are the dir/separator/"..", so skip them + if scanlist[i].dirmsg ~= "" then + -- Add the + or - to the left to signify if it's compressed or not + -- Add a forward slash to the right to signify it's a dir + display_content = scanlist[i].dirmsg .. " " .. get_basename(scanlist[i].abspath) .. "/" + else + -- Use the basename from the full path for display + -- Two spaces to align with any directories, instead of being "off" + display_content = " " .. get_basename(scanlist[i].abspath) + end + + if scanlist[i].owner > 0 then + -- Add a space and repeat it * the indent number + display_content = repeat_str(" ", 2 * scanlist[i].indent) .. display_content + end + + -- Newlines are needed for all inserts except the last + -- If you insert a newline on the last, it leaves a blank spot at the bottom + if i < #scanlist then + display_content = display_content .. "\n" + end + + -- Insert line-by-line to avoid out-of-bounds on big folders + -- +2 so we skip the 0/1/2 positions that hold the top dir/separator/.. + tree_view.Buf.EventHandler:Insert(buffer.Loc(0, i + 2), display_content) + end + + -- Resizes all views after messing with ours + tree_view:Tab():Resize() +end + +-- Moves the cursor to the ".." in tree_view +local function move_cursor_top() + -- 2 is the position of the ".." + tree_view.Cursor.Loc.Y = 2 + + -- select the line after moving + select_line() +end + +local function refresh_and_select() + -- Save the cursor position before messing with the view.. + -- because changing contents in the view causes the Y loc to move + local last_y = tree_view.Cursor.Loc.Y + -- Actually refresh + refresh_view() + -- Moves the cursor back to it's original position + select_line(last_y) +end + +-- Find everything nested under the target, and remove it from the scanlist +local function compress_target(y, delete_y) + -- Can't compress the top stuff, or if there's nothing there, so exit early + if y == 0 or scanlist_is_empty() then + return + end + -- Check if the target is a dir, since files don't have anything to compress + -- Also make sure it's actually an uncompressed dir by checking the gutter message + if scanlist[y].dirmsg == "-" then + local target_index, delete_index + -- Add the original target y to stuff to delete + local delete_under = {[1] = y} + local new_table = {} + local del_count = 0 + -- Loop through the whole table, looking for nested content, or stuff with ownership == y... + -- and delete matches. y+1 because we want to start under y, without actually touching y itself. + for i = 1, #scanlist do + delete_index = false + -- Don't run on y, since we don't always delete y + if i ~= y then + -- On each loop, check if the ownership matches + for x = 1, #delete_under do + -- Check for something belonging to a thing to delete + if scanlist[i].owner == delete_under[x] then + -- Delete the target if it has an ownership to our delete target + delete_index = true + -- Keep count of total deleted (can't use #delete_under because it's for deleted dir count) + del_count = del_count + 1 + -- Check if an uncompressed dir + if scanlist[i].dirmsg == "-" then + -- Add the index to stuff to delete, since it holds nested content + delete_under[#delete_under + 1] = i + end + -- See if we're on the "deepest" nested content + if scanlist[i].indent == highest_visible_indent and scanlist[i].indent > 0 then + -- Save the lower indent, since we're minimizing/deleting nested dirs + highest_visible_indent = highest_visible_indent - 1 + end + -- Nothing else to do, so break this inner loop + break + end + end + end + if not delete_index then + -- Save the index in our new table + new_table[#new_table + 1] = scanlist[i] + end + end + + scanlist = new_table + + if del_count > 0 then + -- Ownership adjusting since we're deleting an index + for i = y + 1, #scanlist do + -- Don't touch root file/dirs + if scanlist[i].owner > y then + -- Minus ownership, on everything below i, the number deleted + scanlist[i]:decrease_owner(del_count) + end + end + end + + -- If not deleting, then update the gutter message to be + to signify compressed + if not delete_y then + -- Update the dir message + scanlist[y].dirmsg = "+" + end + elseif config.GetGlobalOption("filemanager.compressparent") and not delete_y then + goto_parent_dir() + -- Prevent a pointless refresh of the view + return + end + + -- Put outside check above because we call this to delete targets as well + if delete_y then + local second_table = {} + -- Quickly remove y + for i = 1, #scanlist do + if i == y then + -- Reduce everything's ownership by 1 after y + for x = i + 1, #scanlist do + -- Don't touch root file/dirs + if scanlist[x].owner > y then + -- Minus 1 since we're just deleting y + scanlist[x]:decrease_owner(1) + end + end + else + -- Put everything but y into the temporary table + second_table[#second_table + 1] = scanlist[i] + end + end + -- Put everything (but y) back into scanlist, with adjusted ownership values + scanlist = second_table + end + + if tree_view:GetView().Width > (30 + highest_visible_indent) then + -- Shave off some width + tree_view:ResizePane(30 + highest_visible_indent) + end + + refresh_and_select() +end + +-- Prompts the user for deletion of a file/dir when triggered +-- Not local so Micro can access it +function prompt_delete_at_cursor() + local y = get_safe_y() + -- Don't let them delete the top 3 index dir/separator/.. + if y == 0 or scanlist_is_empty() then + micro.InfoBar():Error("You can't delete that") + -- Exit early if there's nothing to delete + return + end + + micro.InfoBar():YNPrompt("Do you want to delete the " .. (scanlist[y].dirmsg ~= "" and "dir" or "file") .. ' "' .. scanlist[y].abspath .. '"? ', function(yes, canceled) + if yes and not canceled then + -- Use Go's os.Remove to delete the file + local go_os = import("os") + -- Delete the target (if its a dir then the children too) + local remove_log = go_os.RemoveAll(scanlist[y].abspath) + if remove_log == nil then + micro.InfoBar():Message("Filemanager deleted: ", scanlist[y].abspath) + -- Remove the target (and all nested) from scanlist[y + 1] + -- true to delete y + compress_target(get_safe_y(), true) + else + micro.InfoBar():Error("Failed deleting file/dir: ", remove_log) + end + else + micro.InfoBar():Message("Nothing was deleted") + end + end) +end + +-- Changes the current dir in the top of the tree.. +-- then scans that dir, and prints it to the view +local function update_current_dir(path) + -- Clear the highest since this is a full refresh + highest_visible_indent = 0 + -- Set the width back to 30 + tree_view:ResizePane(30) + -- Update the current dir to the new path + current_dir = path + + -- Get the current working dir's files into our list of files + -- 0 ownership because this is a scan of the base dir + -- 0 indent because this is the base dir + local scan_results = get_scanlist(path, 0, 0) + -- Safety check with not-nil + if scan_results ~= nil then + -- Put in the new scan stuff + scanlist = scan_results + else + -- If nil, just empty it + scanlist = {} + end + + refresh_view() + -- Since we're going into a new dir, move cursor to the ".." by default + move_cursor_top() +end + +-- (Tries to) go back one "step" from the current directory +local function go_back_dir() + -- Use Micro's dirname to get everything but the current dir's path + local one_back_dir = filepath.Dir(current_dir) + -- Try opening, assuming they aren't at "root", by checking if it matches last dir + if one_back_dir ~= current_dir then + -- If filepath.Dir returns different, then they can move back.. + -- so we update the current dir and refresh + update_current_dir(one_back_dir) + end +end + +-- Tries to open the current index +-- If it's the top dir indicator, or separator, nothing happens +-- If it's ".." then it tries to go back a dir +-- If it's a dir then it moves into the dir and refreshes +-- If it's actually a file, open it in a new vsplit +-- THIS EXPECTS ZERO-BASED Y +local function try_open_at_y(y) + -- 2 is the zero-based index of ".." + if y == 2 then + go_back_dir() + elseif y > 2 and not scanlist_is_empty() then + -- -2 to conform to our scanlist "missing" first 3 indicies + y = y - 2 + if scanlist[y].dirmsg ~= "" then + -- if passed path is a directory, update the current dir to be one deeper.. + update_current_dir(scanlist[y].abspath) + else + -- If it's a file, then open it + micro.InfoBar():Message("Filemanager opened ", scanlist[y].abspath) + -- Opens the absolute path in new vertical view + micro.CurPane():VSplitIndex(buffer.NewBufferFromFile(scanlist[y].abspath), true) + -- Resizes all views after opening a file + -- tabs[curTab + 1]:Resize() + end + else + micro.InfoBar():Error("Can't open that") + end +end + +-- Opens the dir's contents nested under itself +local function uncompress_target(y) + -- Exit early if on the top 3 non-list items + if y == 0 or scanlist_is_empty() then + return + end + -- Only uncompress if it's a dir and it's not already uncompressed + if scanlist[y].dirmsg == "+" then + -- Get a new scanlist with results from the scan in the target dir + local scan_results = get_scanlist(scanlist[y].abspath, y, scanlist[y].indent + 1) + -- Don't run any of this if there's nothing in the dir we scanned, pointless + if scan_results ~= nil then + -- Will hold all the old values + new scan results + local new_table = {} + -- By not inserting in-place, some unexpected results can be avoided + -- Also, table.insert actually moves values up (???) instead of down + for i = 1, #scanlist do + -- Put the current val into our new table + new_table[#new_table + 1] = scanlist[i] + if i == y then + -- Fill in the scan results under y + for x = 1, #scan_results do + new_table[#new_table + 1] = scan_results[x] + end + -- Basically "moving down" everything below y, so ownership needs to increase on everything + for inner_i = y + 1, #scanlist do + -- When root not pushed by inserting, don't change its ownership + -- This also has a dual-purpose to make it not effect root file/dirs + -- since y is always >= 3 + if scanlist[inner_i].owner > y then + -- Increase each indicies ownership by the number of scan results inserted + scanlist[inner_i]:increase_owner(#scan_results) + end + end + end + end + + -- Update our scanlist with the new values + scanlist = new_table + end + + -- Change to minus to signify it's uncompressed + scanlist[y].dirmsg = "-" + + -- Check if we actually need to resize, or if we're nesting at the same indent + -- Also check if there's anything in the dir, as we don't need to expand on an empty dir + if scan_results ~= nil then + if scanlist[y].indent > highest_visible_indent and #scan_results >= 1 then + -- Save the new highest indent + highest_visible_indent = scanlist[y].indent + -- Increase the width to fit the new nested content + tree_view:ResizePane(tree_view:GetView().Width + scanlist[y].indent) + end + end + + refresh_and_select() + end +end + +-- Stat a path to check if it exists, returning true/false +local function path_exists(path) + local go_os = import("os") + -- Stat the file/dir path we created + -- file_stat should be non-nil, and stat_err should be nil on success + local file_stat, stat_err = go_os.Stat(path) + -- Check if what we tried to create exists + if stat_err ~= nil then + -- true/false if the file/dir exists + return go_os.IsExist(stat_err) + elseif file_stat ~= nil then + -- Assume it exists if no errors + return true + end + return false +end + +-- Prompts for a new name, then renames the file/dir at the cursor's position +-- Not local so Micro can use it +function rename_at_cursor(bp, args) + + if micro.CurPane() ~= tree_view then + micro.InfoBar():Message("Rename only works with the cursor in the tree!") + return + end + + -- Safety check they actually passed a name + if #args < 1 then + micro.InfoBar():Error('When using "rename" you need to input a new name') + return + end + + local new_name = args[1] + + -- +1 since Go uses zero-based indices + local y = get_safe_y() + -- Check if they're trying to rename the top stuff + if y == 0 then + -- Error since they tried to rename the top stuff + micro.InfoBar():Message("You can't rename that!") + return + end + + -- The old file/dir's path + local old_path = scanlist[y].abspath + -- Join the path into their supplied rename, so that we have an absolute path + local new_path = dirname_and_join(old_path, new_name) + -- Use Go's os package for renaming the file/dir + local golib_os = import("os") + -- Actually rename the file + local log_out = golib_os.Rename(old_path, new_path) + -- Output the log, if any, of the rename + if log_out ~= nil then + micro.Log("Rename log: ", log_out) + end + + -- Check if the rename worked + if not path_exists(new_path) then + micro.InfoBar():Error("Path doesn't exist after rename!") + return + end + + -- NOTE: doesn't alphabetically sort after refresh, but it probably should + -- Replace the old path with the new path + scanlist[y].abspath = new_path + -- Refresh the tree with our new name + refresh_and_select() +end + +-- Prompts the user for the file/dir name, then creates the file/dir using Go's os package +local function create_filedir(filedir_name, make_dir) + if micro.CurPane() ~= tree_view then + micro.InfoBar():Message("You can't create a file/dir if your cursor isn't in the tree!") + return + end + + -- Safety check they passed a name + if filedir_name == nil then + micro.InfoBar():Error('You need to input a name when using "touch" or "mkdir"!') + return + end + + -- The target they're trying to create on top of/in/at/whatever + local y = get_safe_y() + -- Holds the path passed to Go for the eventual new file/dir + local filedir_path + -- A true/false if scanlist is empty + local scanlist_empty = scanlist_is_empty() + + -- Check there's actually anything in the list, and that they're not on the ".." + if not scanlist_empty and y ~= 0 then + -- If they're inserting on a folder, don't strip its path + if scanlist[y].dirmsg ~= "" then + -- Join our new file/dir onto the dir + filedir_path = filepath.Join(scanlist[y].abspath, filedir_name) + else + -- The current index is a file, so strip its name and join ours onto it + filedir_path = dirname_and_join(scanlist[y].abspath, filedir_name) + end + else + -- if nothing in the list, or cursor is on top of "..", use the current dir + filedir_path = filepath.Join(current_dir, filedir_name) + end + + -- Check if the name is already taken by a file/dir + if path_exists(filedir_path) then + micro.InfoBar():Error("You can't create a file/dir with a pre-existing name") + return + end + + -- Use Go's os package for creating the files + local golib_os = import("os") + -- Create the dir or file + if make_dir then + -- Creates the dir + golib_os.Mkdir(filedir_path, golib_os.ModePerm) + micro.Log("Filemanager created directory: " .. filedir_path) + else + -- Creates the file + golib_os.Create(filedir_path) + micro.Log("Filemanager created file: " .. filedir_path) + end + + -- If the file we tried to make doesn't exist, fail + if not path_exists(filedir_path) then + micro.InfoBar():Error("The file/dir creation failed") + + return + end + + -- Creates a sort of default object, to be modified below + -- If creating a dir, use a "+" + local new_filedir = new_listobj(filedir_path, (make_dir and "+" or ""), 0, 0) + + -- Refresh with our new value(s) + local last_y + + -- Only insert to scanlist if not created into a compressed dir, since it'd be hidden if it was + -- Wrap the below checks so a y=0 doesn't break something + if not scanlist_empty and y ~= 0 then + -- +1 so it's highlighting the new file/dir + last_y = tree_view.Cursor.Loc.Y + 1 + + -- Only actually add the object to the list if it's not created on an uncompressed folder + if scanlist[y].dirmsg == "+" then + -- Exit early, since it was created into an uncompressed folder + + return + elseif scanlist[y].dirmsg == "-" then + -- Check if created on top of an uncompressed folder + -- Change ownership to the folder it was created on top of.. + -- otherwise, the ownership would be incorrect + new_filedir.owner = y + -- We insert under the folder, so increment the indent + new_filedir.indent = scanlist[y].indent + 1 + else + -- This triggers if the cursor is on top of a file... + -- so we copy the properties of it + new_filedir.owner = scanlist[y].owner + new_filedir.indent = scanlist[y].indent + end + + -- A temporary table for adding our new object, and manipulation + local new_table = {} + -- Insert the new file/dir, and update ownership of everything below it + for i = 1, #scanlist do + -- Don't use i as index, as it will be off by one on the next pass after below "i == y" + new_table[#new_table + 1] = scanlist[i] + if i == y then + -- Insert our new file/dir (below the last item) + new_table[#new_table + 1] = new_filedir + -- Increase ownership of everything below it, since we're inserting + -- Basically "moving down" everything below y, so ownership needs to increase on everything + for inner_i = y + 1, #scanlist do + -- When root not pushed by inserting, don't change its ownership + -- This also has a dual-purpose to make it not effect root file/dirs + -- since y is always >= 3 + if scanlist[inner_i].owner > y then + -- Increase each indicies ownership by 1 since we're only inserting 1 file/dir + scanlist[inner_i]:increase_owner(1) + end + end + end + end + -- Update the scanlist with the new object & updated ownerships + scanlist = new_table + else + -- The scanlist is empty (or cursor is on ".."), so we add on our new file/dir at the bottom + scanlist[#scanlist + 1] = new_filedir + -- Add current position so it takes into account where we are + last_y = #scanlist + tree_view.Cursor.Loc.Y + end + + refresh_view() + select_line(last_y) +end + +-- Triggered with "touch filename" +function new_file(bp, args) + + -- Safety check they actually passed a name + if #args < 1 then + micro.InfoBar():Error('When using "touch" you need to input a file name') + return + end + + local file_name = args[1] + + -- False because not a dir + create_filedir(file_name, false) +end + +-- Triggered with "mkdir dirname" +function new_dir(bp, args) + + -- Safety check they actually passed a name + if #args < 1 then + micro.InfoBar():Error('When using "mkdir" you need to input a dir name') + return + end + + local dir_name = args[1] + + -- True because dir + create_filedir(dir_name, true) +end + +-- open_tree setup's the view +local function open_tree() + -- Open a new Vsplit (on the very left) + micro.CurPane():VSplitIndex(buffer.NewBuffer("", "filemanager"), false) + -- Save the new view so we can access it later + tree_view = micro.CurPane() + + -- Set the width of tree_view to 30% & lock it + tree_view:ResizePane(30) + -- Set the type to unsavable + -- tree_view.Buf.Type = buffer.BTLog + tree_view.Buf.Type.Scratch = true + tree_view.Buf.Type.Readonly = true + + -- Set the various display settings, but only on our view (by using SetLocalOption instead of SetOption) + -- NOTE: Micro requires the true/false to be a string + -- Softwrap long strings (the file/dir paths) + tree_view.Buf:SetOptionNative("softwrap", true) + -- No line numbering + tree_view.Buf:SetOptionNative("ruler", false) + -- Is this needed with new non-savable settings from being "vtLog"? + tree_view.Buf:SetOptionNative("autosave", false) + -- Don't show the statusline to differentiate the view from normal views + tree_view.Buf:SetOptionNative("statusformatr", "") + tree_view.Buf:SetOptionNative("statusformatl", "filemanager") + tree_view.Buf:SetOptionNative("scrollbar", false) + + -- Fill the scanlist, and then print its contents to tree_view + update_current_dir(os.Getwd()) +end + +-- close_tree will close the tree plugin view and release memory. +local function close_tree() + if tree_view ~= nil then + tree_view:Quit() + tree_view = nil + clear_messenger() + end +end + +-- toggle_tree will toggle the tree view visible (create) and hide (delete). +function toggle_tree() + if tree_view == nil then + open_tree() + else + close_tree() + end +end + +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- Functions exposed specifically for the user to bind +-- Some are used in callbacks as well +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +function uncompress_at_cursor() + if micro.CurPane() == tree_view then + uncompress_target(get_safe_y()) + end +end + +function compress_at_cursor() + if micro.CurPane() == tree_view then + -- False to not delete y + compress_target(get_safe_y(), false) + end +end + +-- Goes up 1 visible directory (if any) +-- Not local so it can be bound +function goto_prev_dir() + if micro.CurPane() ~= tree_view or scanlist_is_empty() then + return + end + + local cur_y = get_safe_y() + -- If they try to run it on the ".." do nothing + if cur_y ~= 0 then + local move_count = 0 + for i = cur_y - 1, 1, -1 do + move_count = move_count + 1 + -- If a dir, stop counting + if scanlist[i].dirmsg ~= "" then + -- Jump to its parent (the ownership) + tree_view.Cursor:UpN(move_count) + select_line() + break + end + end + end +end + +-- Goes down 1 visible directory (if any) +-- Not local so it can be bound +function goto_next_dir() + if micro.CurPane() ~= tree_view or scanlist_is_empty() then + return + end + + local cur_y = get_safe_y() + local move_count = 0 + -- If they try to goto_next on "..", pretends the cursor is valid + if cur_y == 0 then + cur_y = 1 + move_count = 1 + end + -- Only do anything if it's even possible for there to be another dir + if cur_y < #scanlist then + for i = cur_y + 1, #scanlist do + move_count = move_count + 1 + -- If a dir, stop counting + if scanlist[i].dirmsg ~= "" then + -- Jump to its parent (the ownership) + tree_view.Cursor:DownN(move_count) + select_line() + break + end + end + end +end + +-- Goes to the parent directory (if any) +-- Not local so it can be keybound +function goto_parent_dir() + if micro.CurPane() ~= tree_view or scanlist_is_empty() then + return + end + + local cur_y = get_safe_y() + -- Check if the cursor is even in a valid location for jumping to the owner + if cur_y > 0 then + -- Jump to its parent (the ownership) + tree_view.Cursor:UpN(cur_y - scanlist[cur_y].owner) + select_line() + end +end + +function try_open_at_cursor() + if micro.CurPane() ~= tree_view or scanlist_is_empty() then + return + end + + try_open_at_y(tree_view.Cursor.Loc.Y) +end + +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- Shorthand functions for actions to reduce repeat code +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +-- Used to fail certain actions that we shouldn't allow on the tree_view +local function false_if_tree(view) + if view == tree_view then + return false + end +end + +-- Select the line at the cursor +local function selectline_if_tree(view) + if view == tree_view then + select_line() + end +end + +-- Move the cursor to the top, but don't allow the action +local function aftermove_if_tree(view) + if view == tree_view then + if tree_view.Cursor.Loc.Y < 2 then + -- If it went past the "..", move back onto it + tree_view.Cursor:DownN(2 - tree_view.Cursor.Loc.Y) + end + select_line() + end +end + +local function clearselection_if_tree(view) + if view == tree_view then + -- Clear the selection when doing a find, so it doesn't copy the current line + tree_view.Cursor:ResetSelection() + end +end + +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +-- All the events for certain Micro keys go below here +-- Other than things we flat-out fail +-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +-- Close current +function preQuit(view) + if view == tree_view then + -- A fake quit function + close_tree() + -- Don't actually "quit", otherwise it closes everything without saving for some reason + return false + end +end + +-- Close all +function preQuitAll(view) + close_tree() +end + +-- FIXME: Workaround for the weird 2-index movement on cursordown +function preCursorDown(view) + if view == tree_view then + tree_view.Cursor:Down() + select_line() + -- Don't actually go down, as it moves 2 indicies for some reason + return false + end +end + +-- Up +function onCursorUp(view) + selectline_if_tree(view) +end + +-- Alt-Shift-{ +-- Go to target's parent directory (if exists) +function preParagraphPrevious(view) + if view == tree_view then + goto_prev_dir() + -- Don't actually do the action + return false + end +end + +-- Alt-Shift-} +-- Go to next dir (if exists) +function preParagraphNext(view) + if view == tree_view then + goto_next_dir() + -- Don't actually do the action + return false + end +end + +-- PageUp +function onCursorPageUp(view) + aftermove_if_tree(view) +end + +-- Ctrl-Up +function onCursorStart(view) + aftermove_if_tree(view) +end + +-- PageDown +function onCursorPageDown(view) + selectline_if_tree(view) +end + +-- Ctrl-Down +function onCursorEnd(view) + selectline_if_tree(view) +end + +function onNextSplit(view) + selectline_if_tree(view) +end + +function onPreviousSplit(view) + selectline_if_tree(view) +end + +-- On click, open at the click's y +function preMousePress(view, event) + if view == tree_view then + local x, y = event:Position() + -- Fixes the y because softwrap messes with it + local new_x, new_y = tree_view:GetMouseClickLocation(x, y) + -- Try to open whatever is at the click's y index + -- Will go into/back dirs based on what's clicked, nothing gets expanded + try_open_at_y(new_y) + -- Don't actually allow the mousepress to trigger, so we avoid highlighting stuff + return false + end +end + +-- Up +function preCursorUp(view) + if view == tree_view then + -- Disallow selecting past the ".." in the tree + if tree_view.Cursor.Loc.Y == 2 then + return false + end + end +end + +-- Left +function preCursorLeft(view) + if view == tree_view then + -- +1 because of Go's zero-based index + -- False to not delete y + compress_target(get_safe_y(), false) + -- Don't actually move the cursor, as it messes with selection + return false + end +end + +-- Right +function preCursorRight(view) + if view == tree_view then + -- +1 because of Go's zero-based index + uncompress_target(get_safe_y()) + -- Don't actually move the cursor, as it messes with selection + return false + end +end + +-- Workaround for tab getting inserted into opened files +-- Ref https://github.com/zyedidia/micro/issues/992 +local tab_pressed = false + +-- Tab +function preIndentSelection(view) + if view == tree_view then + tab_pressed = true + -- Open the file + -- Using tab instead of enter, since enter won't work with Readonly + try_open_at_y(tree_view.Cursor.Loc.Y) + -- Don't actually insert a tab + return false + end +end + +-- Workaround for tab getting inserted into opened files +-- Ref https://github.com/zyedidia/micro/issues/992 +function preInsertTab(view) + if tab_pressed then + tab_pressed = false + return false + end +end +function preInsertNewline(view) + if view == tree_view then + return false + end + return true +end +-- CtrlL +function onJumpLine(view) + -- Highlight the line after jumping to it + -- Also moves you to index 3 (2 in zero-base) if you went to the first 2 lines + aftermove_if_tree(view) +end + +-- ShiftUp +function preSelectUp(view) + if view == tree_view then + -- Go to the file/dir's parent dir (if any) + goto_parent_dir() + -- Don't actually selectup + return false + end +end + +-- CtrlF +function preFind(view) + -- Since something is always selected, clear before a find + -- Prevents copying the selection into the find input + clearselection_if_tree(view) +end + +-- FIXME: doesn't work for whatever reason +function onFind(view) + -- Select the whole line after a find, instead of just the input txt + selectline_if_tree(view) +end + +-- CtrlN after CtrlF +function onFindNext(view) + selectline_if_tree(view) +end + +-- CtrlP after CtrlF +function onFindPrevious(view) + selectline_if_tree(view) +end + +-- NOTE: This is a workaround for "cd" not having its own callback +local precmd_dir + +function preCommandMode(view) + precmd_dir = os.Getwd() +end + +-- Update the current dir when using "cd" +function onCommandMode(view) + local new_dir = os.Getwd() + -- Only do anything if the tree is open, and they didn't cd to nothing + if tree_view ~= nil and new_dir ~= precmd_dir and new_dir ~= current_dir then + update_current_dir(new_dir) + end +end + +------------------------------------------------------------------ +-- Fail a bunch of useless actions +-- Some of these need to be removed (read-only makes some useless) +------------------------------------------------------------------ + +function preStartOfLine(view) + return false_if_tree(view) +end + +function preStartOfText(view) + return false_if_tree(view) +end + +function preEndOfLine(view) + return false_if_tree(view) +end + +function preMoveLinesDown(view) + return false_if_tree(view) +end + +function preMoveLinesUp(view) + return false_if_tree(view) +end + +function preWordRight(view) + return false_if_tree(view) +end + +function preWordLeft(view) + return false_if_tree(view) +end + +function preSelectDown(view) + return false_if_tree(view) +end + +function preSelectLeft(view) + return false_if_tree(view) +end + +function preSelectRight(view) + return false_if_tree(view) +end + +function preSelectWordRight(view) + return false_if_tree(view) +end + +function preSelectWordLeft(view) + return false_if_tree(view) +end + +function preSelectToStartOfLine(view) + return false_if_tree(view) +end + +function preSelectToStartOfText(view) + return false_if_tree(view) +end + +function preSelectToEndOfLine(view) + return false_if_tree(view) +end + +function preSelectToStart(view) + return false_if_tree(view) +end + +function preSelectToEnd(view) + return false_if_tree(view) +end + +function preDeleteWordLeft(view) + return false_if_tree(view) +end + +function preDeleteWordRight(view) + return false_if_tree(view) +end + +function preOutdentSelection(view) + return false_if_tree(view) +end + +function preOutdentLine(view) + return false_if_tree(view) +end + +function preSave(view) + return false_if_tree(view) +end + +function preCut(view) + return false_if_tree(view) +end + +function preCutLine(view) + return false_if_tree(view) +end + +function preDuplicateLine(view) + return false_if_tree(view) +end + +function prePaste(view) + return false_if_tree(view) +end + +function prePastePrimary(view) + return false_if_tree(view) +end + +function preMouseMultiCursor(view) + return false_if_tree(view) +end + +function preSpawnMultiCursor(view) + return false_if_tree(view) +end + +function preSelectAll(view) + return false_if_tree(view) +end + +function init() + -- Let the user disable showing of dotfiles like ".editorconfig" or ".DS_STORE" + config.RegisterCommonOption("filemanager", "showdotfiles", true) + -- Let the user disable showing files ignored by the VCS (i.e. gitignored) + config.RegisterCommonOption("filemanager", "showignored", true) + -- Let the user disable going to parent directory via left arrow key when file selected (not directory) + config.RegisterCommonOption("filemanager", "compressparent", true) + -- Let the user choose to list sub-folders first when listing the contents of a folder + config.RegisterCommonOption("filemanager", "foldersfirst", true) + -- Lets the user have the filetree auto-open any time Micro is opened + -- false by default, as it's a rather noticable user-facing change + config.RegisterCommonOption("filemanager", "openonstart", false) + + -- Open/close the tree view + config.MakeCommand("tree", toggle_tree, config.NoComplete) + -- Rename the file/dir under the cursor + config.MakeCommand("rename", rename_at_cursor, config.NoComplete) + -- Create a new file + config.MakeCommand("touch", new_file, config.NoComplete) + -- Create a new dir + config.MakeCommand("mkdir", new_dir, config.NoComplete) + -- Delete a file/dir, and anything contained in it if it's a dir + config.MakeCommand("rm", prompt_delete_at_cursor, config.NoComplete) + -- Adds colors to the ".." and any dir's in the tree view via syntax highlighting + -- TODO: Change it to work with git, based on untracked/changed/added/whatever + config.AddRuntimeFile("filemanager", config.RTSyntax, "syntax.yaml") + + -- NOTE: This must be below the syntax load command or coloring won't work + -- Just auto-open if the option is enabled + -- This will run when the plugin first loads + if config.GetGlobalOption("filemanager.openonstart") then + -- Check for safety on the off-chance someone's init.lua breaks this + if tree_view == nil then + open_tree() + -- Puts the cursor back in the empty view that initially spawns + -- This is so the cursor isn't sitting in the tree view at startup + micro.CurPane():NextSplit() + else + -- Log error so they can fix it + micro.Log( + "Warning: filemanager.openonstart was enabled, but somehow the tree was already open so the option was ignored." + ) + end + end +end diff --git a/.config/micro/plug/filemanager/repo.json b/.config/micro/plug/filemanager/repo.json new file mode 100644 index 0000000..4bd7de2 --- /dev/null +++ b/.config/micro/plug/filemanager/repo.json @@ -0,0 +1,45 @@ +[ + { + "Name": "filemanager", + "Description": "File manager for Micro", + "Tags": ["filetree", "filemanager", "file", "manager"], + "Website": "", + "Versions": [ + { + "Version": "2.1.1", + "Url": "https://github.com/NicolaiSoeborg/filemanager-plugin/archive/v2.1.1.zip", + "Require": { + "micro": ">=1.3.2" + } + }, + { + "Version": "3.1.0", + "Url": "https://github.com/NicolaiSoeborg/filemanager-plugin/archive/v3.1.0.zip", + "Require": { + "micro": ">=1.3.5" + } + }, + { + "Version": "3.4.0", + "Url": "https://github.com/NicolaiSoeborg/filemanager-plugin/archive/v3.4.0.zip", + "Require": { + "micro": ">=1.4.1" + } + }, + { + "Version": "3.5.0", + "Url": "https://github.com/micro-editor/updated-plugins/releases/download/v1.0.0/filemanager-3.5.0.zip", + "Require": { + "micro": ">=2.0.0-1" + } + }, + { + "Version": "3.5.1", + "Url": "https://github.com/micro-editor/updated-plugins/releases/download/v1.0.0/filemanager-3.5.1.zip", + "Require": { + "micro": ">=2.0.0-1" + } + } + ] + } +] diff --git a/.config/micro/plug/filemanager/syntax.yaml b/.config/micro/plug/filemanager/syntax.yaml new file mode 100644 index 0000000..da001cf --- /dev/null +++ b/.config/micro/plug/filemanager/syntax.yaml @@ -0,0 +1,9 @@ +filetype: filemanager + +detect: + filename: "^filemanager$" + +rules: + # The "..", the separator line thing, and directories + # Optionally, add this below to highlight the ascii line: "^─*$" + - special: "^\\.\\.$|\\-\\s.*|\\+\\s.*" diff --git a/.config/micro/plug/jlabbrev/LICENSE b/.config/micro/plug/jlabbrev/LICENSE new file mode 100644 index 0000000..9a82297 --- /dev/null +++ b/.config/micro/plug/jlabbrev/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2020 Łukasz "MasFlam" Drukała + +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. diff --git a/.config/micro/plug/jlabbrev/README.md b/.config/micro/plug/jlabbrev/README.md new file mode 100644 index 0000000..ca128f2 --- /dev/null +++ b/.config/micro/plug/jlabbrev/README.md @@ -0,0 +1,24 @@ +![GitHub release (latest by date)](https://img.shields.io/github/v/release/MasFlam/jlabbrev) +# jlabbrev +The package `jlabbrev` adds all the tab-completions from +the Julia prompt that are LaTeX symbol names. +There are currently **`2496`** abbreviations on the list. +Refer to the documentation page +[Unicode Input](https://docs.julialang.org/en/v1/manual/unicode-input) +of Julia if you want to get the full list. If all goes well, +all non-emoji completions from there should be supported by the plugin. + +# Features +Writing `\` and hitting `` will do one of the following: +* If `` is one of the supported abbreviations, + the whole sequence gets replaced with the corresponding symbol(s). +* If `` if a prefix of an abbreviation, autocompletion suggestion takes place +* Otherwise, the tab will be inserted + +# Installation +Until the plugin gets onto +[the official plugin channel](https://github.com/micro-editor/plugin-channel), +the you can install it by `cd`ing into your `~/.config/micro/plug` +and `git clone`ing this repository. +If jlabbrev ever gets onto the official plugin channel, the way +to install it will be running `micro -plugin install jlabbrev`. diff --git a/.config/micro/plug/jlabbrev/jlabbrev.lua b/.config/micro/plug/jlabbrev/jlabbrev.lua new file mode 100644 index 0000000..f2d2865 --- /dev/null +++ b/.config/micro/plug/jlabbrev/jlabbrev.lua @@ -0,0 +1,2598 @@ +VERSION = "1.0.1" + +local ABBREVS = {} +ABBREVS["1/8"] = "⅛" +ABBREVS["bscra"] = "𝓪" +ABBREVS["guilsinglright"] = "›" +ABBREVS["blacktriangleright"] = "▶" +ABBREVS["bisansc"] = "𝙘" +ABBREVS["^4"] = "⁴" +ABBREVS["Re"] = "ℜ" +ABBREVS["pitchfork"] = "⋔" +ABBREVS["bisanskappa"] = "𝞳" +ABBREVS["bbz"] = "𝕫" +ABBREVS["blockqtrshaded"] = "░" +ABBREVS["urcorner"] = "⌝" +ABBREVS["frakY"] = "𝔜" +ABBREVS["^2"] = "²" +ABBREVS["pi"] = "π" +ABBREVS["nless"] = "≮" +ABBREVS["sqsubseteq"] = "⊑" +ABBREVS["Updownarrow"] = "⇕" +ABBREVS["leftarrowbsimilar"] = "⭋" +ABBREVS["bbF"] = "𝔽" +ABBREVS["nrightarrow"] = "↛" +ABBREVS["bsansPi"] = "𝝥" +ABBREVS["sansseven"] = "𝟩" +ABBREVS["Theta"] = "Θ" +ABBREVS["rightmoon"] = "☽" +ABBREVS["bscrV"] = "𝓥" +ABBREVS["ttc"] = "𝚌" +ABBREVS["upsilon"] = "υ" +ABBREVS["bfrakq"] = "𝖖" +ABBREVS["copyright"] = "©" +ABBREVS["npreccurlyeq"] = "⋠" +ABBREVS["bfrakL"] = "𝕷" +ABBREVS["fltns"] = "⏥" +ABBREVS["bbN"] = "ℕ" +ABBREVS["smile"] = "⌣" +ABBREVS["bisansX"] = "𝙓" +ABBREVS["0/3"] = "↉" +ABBREVS["backsimeq"] = "⋍" +ABBREVS["bitau"] = "𝝉" +ABBREVS["bisansD"] = "𝘿" +ABBREVS["hvlig"] = "ƕ" +ABBREVS["lq"] = "‘" +ABBREVS["mapsfrom"] = "↤" +ABBREVS["blockrighthalf"] = "▐" +ABBREVS["perp"] = "⟂" +ABBREVS["biS"] = "𝑺" +ABBREVS["bscrB"] = "𝓑" +ABBREVS["ttn"] = "𝚗" +ABBREVS["bitheta"] = "𝜽" +ABBREVS["timesbar"] = "⨱" +ABBREVS["bik"] = "𝒌" +ABBREVS["bsanskappa"] = "𝝹" +ABBREVS["llcorner"] = "⌞" +ABBREVS["bigtimes"] = "⨉" +ABBREVS["circleddash"] = "⊝" +ABBREVS["bsansI"] = "𝗜" +ABBREVS["leftharpoondown"] = "↽" +ABBREVS["alpha"] = "α" +ABBREVS["between"] = "≬" +ABBREVS["^l"] = "ˡ" +ABBREVS["frown"] = "⌢" +ABBREVS["RoundImplies"] = "⥰" +ABBREVS["blockthreeqtrshaded"] = "▓" +ABBREVS["bsansthree"] = "𝟯" +ABBREVS["precneqq"] = "⪵" +ABBREVS["urblacktriangle"] = "◥" +ABBREVS["succeqq"] = "⪴" +ABBREVS["nsupseteq"] = "⊉" +ABBREVS["bfvarkappa"] = "𝛞" +ABBREVS["iota"] = "ι" +ABBREVS["overbrace"] = "⏞" +ABBREVS["danger"] = "☡" +ABBREVS["fraki"] = "𝔦" +ABBREVS["rightharpoondown"] = "⇁" +ABBREVS["tilde"] = "̃" +ABBREVS["upNu"] = "Ν" +ABBREVS["RRightarrow"] = "⭆" +ABBREVS["sansg"] = "𝗀" +ABBREVS["bisansh"] = "𝙝" +ABBREVS["itimath"] = "𝚤" +ABBREVS["bisansMu"] = "𝞛" +ABBREVS["isansZ"] = "𝘡" +ABBREVS["rightleftarrows"] = "⇄" +ABBREVS["impliedby"] = "⟸" +ABBREVS["succapprox"] = "⪸" +ABBREVS["Rsh"] = "↱" +ABBREVS["sumint"] = "⨋" +ABBREVS["bsansvarrho"] = "𝞎" +ABBREVS["pointint"] = "⨕" +ABBREVS["fdiagovnearrow"] = "⤯" +ABBREVS["plussubtwo"] = "⨧" +ABBREVS["original"] = "⊶" +ABBREVS["nvtwoheadleftarrow"] = "⬴" +ABBREVS["bfQ"] = "𝐐" +ABBREVS["biw"] = "𝒘" +ABBREVS["bsanspartial"] = "𝞉" +ABBREVS["bfo"] = "𝐨" +ABBREVS["nBumpeq"] = "≎̸" +ABBREVS["bisanssigma"] = "𝞼" +ABBREVS["frakD"] = "𝔇" +ABBREVS["nleftrightarrow"] = "↮" +ABBREVS["clockoint"] = "⨏" +ABBREVS["scrs"] = "𝓈" +ABBREVS["Im"] = "ℑ" +ABBREVS["bsansK"] = "𝗞" +ABBREVS["bisansvarrho"] = "𝟈" +ABBREVS["whtvertoval"] = "⬯" +ABBREVS["rarrx"] = "⥇" +ABBREVS["smallin"] = "∊" +ABBREVS["underleftarrow"] = "⃮" +ABBREVS["itx"] = "𝑥" +ABBREVS["measangledltosw"] = "⦯" +ABBREVS["eqqsim"] = "⩳" +ABBREVS["bij"] = "𝒋" +ABBREVS["ttW"] = "𝚆" +ABBREVS["leo"] = "♌" +ABBREVS["bfrakV"] = "𝖁" +ABBREVS["bfrakR"] = "𝕽" +ABBREVS["smallblacktriangleright"] = "▸" +ABBREVS["DownArrowBar"] = "⤓" +ABBREVS["surd"] = "√" +ABBREVS["leftwhitearrow"] = "⇦" +ABBREVS["bsansChi"] = "𝝬" +ABBREVS["ge"] = "≥" +ABBREVS["rttrnr"] = "ɻ" +ABBREVS["bbk"] = "𝕜" +ABBREVS["twoheaddownarrow"] = "↡" +ABBREVS["ointctrclockwise"] = "∳" +ABBREVS["squareulquad"] = "◰" +ABBREVS["amalg"] = "⨿" +ABBREVS["bagmember"] = "⋿" +ABBREVS["fraku"] = "𝔲" +ABBREVS["ElOr"] = "⩖" +ABBREVS["bfvarTheta"] = "𝚹" +ABBREVS["biKappa"] = "𝜥" +ABBREVS["turnangle"] = "⦢" +ABBREVS["Otimes"] = "⨷" +ABBREVS["wideutilde"] = "̰" +ABBREVS["isansp"] = "𝘱" +ABBREVS["trianglerightblack"] = "◮" +ABBREVS["bfr"] = "𝐫" +ABBREVS["frakM"] = "𝔐" +ABBREVS["frakS"] = "𝔖" +ABBREVS["uparrow"] = "↑" +ABBREVS["nvleftarrowtail"] = "⬹" +ABBREVS["frakG"] = "𝔊" +ABBREVS["_4"] = "₄" +ABBREVS["measangledrtose"] = "⦮" +ABBREVS["biXi"] = "𝜩" +ABBREVS["bisansvarpi"] = "𝟉" +ABBREVS["doubleplus"] = "⧺" +ABBREVS["plussim"] = "⨦" +ABBREVS["rvboxline"] = "⎹" +ABBREVS["bfnu"] = "𝛎" +ABBREVS["Game"] = "⅁" +ABBREVS["sterling"] = "£" +ABBREVS["bscrs"] = "𝓼" +ABBREVS["_x"] = "ₓ" +ABBREVS["sanseight"] = "𝟪" +ABBREVS["NestedGreaterGreater"] = "⪢" +ABBREVS["pentagon"] = "⬠" +ABBREVS["supmult"] = "⫂" +ABBREVS["bfu"] = "𝐮" +ABBREVS["sansLturned"] = "⅂" +ABBREVS["frakU"] = "𝔘" +ABBREVS["bumpeqq"] = "⪮" +ABBREVS["nVDash"] = "⊯" +ABBREVS["leftarrowtriangle"] = "⇽" +ABBREVS["itgamma"] = "𝛾" +ABBREVS["nvRightarrow"] = "⤃" +ABBREVS["lnsim"] = "⋦" +ABBREVS["downharpoonsleftright"] = "⥥" +ABBREVS["yen"] = "¥" +ABBREVS["bbB"] = "𝔹" +ABBREVS["isanss"] = "𝘴" +ABBREVS["theta"] = "θ" +ABBREVS["gnapprox"] = "⪊" +ABBREVS["itjmath"] = "𝚥" +ABBREVS["twoheaduparrowcircle"] = "⥉" +ABBREVS["bfZ"] = "𝐙" +ABBREVS["smallblacktriangleleft"] = "◂" +ABBREVS["bftau"] = "𝛕" +ABBREVS["male"] = "♂" +ABBREVS["LeftUpVectorBar"] = "⥘" +ABBREVS["NotLeftTriangleBar"] = "⧏̸" +ABBREVS["nRightarrow"] = "⇏" +ABBREVS["1/"] = "⅟" +ABBREVS["bfrakm"] = "𝖒" +ABBREVS["bigslopedvee"] = "⩗" +ABBREVS["blocklowhalf"] = "▄" +ABBREVS["veedoublebar"] = "⩣" +ABBREVS["forks"] = "⫝̸" +ABBREVS["Alpha"] = "Α" +ABBREVS["backepsilon"] = "϶" +ABBREVS["nsucccurlyeq"] = "⋡" +ABBREVS["scrc"] = "𝒸" +ABBREVS["bbK"] = "𝕂" +ABBREVS["psi"] = "ψ" +ABBREVS["biU"] = "𝑼" +ABBREVS["ng"] = "ŋ" +ABBREVS["eqdef"] = "≝" +ABBREVS["gesdotol"] = "⪄" +ABBREVS["botsemicircle"] = "◡" +ABBREVS["eqqslantless"] = "⪛" +ABBREVS["fraks"] = "𝔰" +ABBREVS["updownharpoonrightleft"] = "⥌" +ABBREVS["bisansj"] = "𝙟" +ABBREVS["Sampi"] = "Ϡ" +ABBREVS["l"] = "ł" +ABBREVS["bisansNu"] = "𝞜" +ABBREVS["olessthan"] = "⧀" +ABBREVS["star"] = "⋆" +ABBREVS["overleftarrow"] = "⃖" +ABBREVS["bsanseight"] = "𝟴" +ABBREVS["Downarrow"] = "⇓" +ABBREVS["lvertneqq"] = "≨︀" +ABBREVS["bfS"] = "𝐒" +ABBREVS["isansF"] = "𝘍" +ABBREVS["^J"] = "ᴶ" +ABBREVS["Longmapsto"] = "⟾" +ABBREVS["S"] = "§" +ABBREVS["gesdot"] = "⪀" +ABBREVS["bsansz"] = "𝘇" +ABBREVS["rtld"] = "ɖ" +ABBREVS["itrho"] = "𝜌" +ABBREVS["NotLessLess"] = "≪̸" +ABBREVS["backppprime"] = "‷" +ABBREVS["leftdotarrow"] = "⬸" +ABBREVS["omega"] = "ω" +ABBREVS["itNu"] = "𝛮" +ABBREVS["fisheye"] = "◉" +ABBREVS["NotSquareSubset"] = "⊏̸" +ABBREVS["bsansseven"] = "𝟳" +ABBREVS["boxcircle"] = "⧇" +ABBREVS["sbbrg"] = "̪" +ABBREVS["isansu"] = "𝘶" +ABBREVS["sansy"] = "𝗒" +ABBREVS["visiblespace"] = "␣" +ABBREVS["glE"] = "⪒" +ABBREVS["squarebotblack"] = "⬓" +ABBREVS["Bumpeq"] = "≎" +ABBREVS["gtreqless"] = "⋛" +ABBREVS["daleth"] = "ℸ" +ABBREVS["dottimes"] = "⨰" +ABBREVS["twocaps"] = "⩋" +ABBREVS["csub"] = "⫏" +ABBREVS["bscrA"] = "𝓐" +ABBREVS["recorder"] = "⌕" +ABBREVS["cupvee"] = "⩅" +ABBREVS["bsansTheta"] = "𝝝" +ABBREVS["biB"] = "𝑩" +ABBREVS["frakN"] = "𝔑" +ABBREVS["isansc"] = "𝘤" +ABBREVS["bbR"] = "ℝ" +ABBREVS["bbD"] = "𝔻" +ABBREVS["Elroang"] = "⦆" +ABBREVS["forksnot"] = "⫝" +ABBREVS["asteraccent"] = "⃰" +ABBREVS["leftharpoonupdash"] = "⥪" +ABBREVS["bfG"] = "𝐆" +ABBREVS["bsanstheta"] = "𝝷" +ABBREVS["^D"] = "ᴰ" +ABBREVS["bsansupsilon"] = "𝞄" +ABBREVS["Angle"] = "⦜" +ABBREVS["shuffle"] = "⧢" +ABBREVS["wedgemidvert"] = "⩚" +ABBREVS["dicev"] = "⚄" +ABBREVS["ReverseUpEquilibrium"] = "⥯" +ABBREVS["2/5"] = "⅖" +ABBREVS["_3"] = "₃" +ABBREVS["quotedblleft"] = "“" +ABBREVS["itC"] = "𝐶" +ABBREVS["bisansH"] = "𝙃" +ABBREVS["bisansL"] = "𝙇" +ABBREVS["ttK"] = "𝙺" +ABBREVS["scrk"] = "𝓀" +ABBREVS["bsansW"] = "𝗪" +ABBREVS["_phi"] = "ᵩ" +ABBREVS["clomeg"] = "ɷ" +ABBREVS["^)"] = "⁾" +ABBREVS["rightleftharpoons"] = "⇌" +ABBREVS["varisins"] = "⋳" +ABBREVS["blacksmiley"] = "☻" +ABBREVS["ddfnc"] = "⦙" +ABBREVS["bfgamma"] = "𝛄" +ABBREVS["bsansUpsilon"] = "𝝪" +ABBREVS["isansP"] = "𝘗" +ABBREVS["scrg"] = "ℊ" +ABBREVS["ttB"] = "𝙱" +ABBREVS["bigwhitestar"] = "☆" +ABBREVS["bigblacktriangleup"] = "▲" +ABBREVS["isanse"] = "𝘦" +ABBREVS["circlevertfill"] = "◍" +ABBREVS["rais"] = "˔" +ABBREVS["frakk"] = "𝔨" +ABBREVS["nVtwoheadleftarrow"] = "⬵" +ABBREVS["ttI"] = "𝙸" +ABBREVS["checkmark"] = "✓" +ABBREVS["bbh"] = "𝕙" +ABBREVS["itA"] = "𝐴" +ABBREVS["bfrakn"] = "𝖓" +ABBREVS["frakA"] = "𝔄" +ABBREVS["rl"] = "ɼ" +ABBREVS["sansone"] = "𝟣" +ABBREVS["leftarrowplus"] = "⥆" +ABBREVS["bisansXi"] = "𝞝" +ABBREVS["bbt"] = "𝕥" +ABBREVS["nsubseteqq"] = "⫅̸" +ABBREVS["mars"] = "♂" +ABBREVS["ngtr"] = "≯" +ABBREVS["bfrho"] = "𝛒" +ABBREVS["sansZ"] = "𝖹" +ABBREVS["hksearow"] = "⤥" +ABBREVS["acidfree"] = "♾" +ABBREVS["bbiD"] = "ⅅ" +ABBREVS["bisansB"] = "𝘽" +ABBREVS["lesssim"] = "≲" +ABBREVS["parallelogramblack"] = "▰" +ABBREVS["isansl"] = "𝘭" +ABBREVS["angles"] = "⦞" +ABBREVS["scrn"] = "𝓃" +ABBREVS["isansd"] = "𝘥" +ABBREVS["boxquestion"] = "⍰" +ABBREVS["Sqcap"] = "⩎" +ABBREVS["obar"] = "⌽" +ABBREVS["bisansg"] = "𝙜" +ABBREVS["^W"] = "ᵂ" +ABBREVS["bbeight"] = "𝟠" +ABBREVS["Colon"] = "∷" +ABBREVS["ltphi"] = "ɸ" +ABBREVS["frakO"] = "𝔒" +ABBREVS["3/4"] = "¾" +ABBREVS["bsansomega"] = "𝞈" +ABBREVS["sagittarius"] = "♐" +ABBREVS["prurel"] = "⊰" +ABBREVS["biN"] = "𝑵" +ABBREVS["rvbull"] = "◘" +ABBREVS["bsansk"] = "𝗸" +ABBREVS["sansv"] = "𝗏" +ABBREVS["dot"] = "̇" +ABBREVS["Omega"] = "Ω" +ABBREVS["ttG"] = "𝙶" +ABBREVS["upoldKoppa"] = "Ϙ" +ABBREVS["verts"] = "ˈ" +ABBREVS["perthousand"] = "‰" +ABBREVS["bfK"] = "𝐊" +ABBREVS["looparrowright"] = "↬" +ABBREVS["scrY"] = "𝒴" +ABBREVS["scrt"] = "𝓉" +ABBREVS["Vert"] = "‖" +ABBREVS["isansy"] = "𝘺" +ABBREVS["bisansR"] = "𝙍" +ABBREVS["bsansDelta"] = "𝝙" +ABBREVS["fdiagovrdiag"] = "⤬" +ABBREVS["itchi"] = "𝜒" +ABBREVS["ngeqslant"] = "⩾̸" +ABBREVS["^1"] = "¹" +ABBREVS["bivarTheta"] = "𝜭" +ABBREVS["itl"] = "𝑙" +ABBREVS["bfrakJ"] = "𝕵" +ABBREVS["ocommatopright"] = "̕" +ABBREVS["bfLambda"] = "𝚲" +ABBREVS["_k"] = "ₖ" +ABBREVS["biNu"] = "𝜨" +ABBREVS["perspcorrespond"] = "⩞" +ABBREVS["twoheadrightarrow"] = "↠" +ABBREVS["plustrif"] = "⨨" +ABBREVS["biV"] = "𝑽" +ABBREVS["pluseqq"] = "⩲" +ABBREVS["beta"] = "β" +ABBREVS["blkhorzoval"] = "⬬" +ABBREVS["bsanslambda"] = "𝝺" +ABBREVS["bfpartial"] = "𝛛" +ABBREVS["c"] = "̧" +ABBREVS["blackpointerleft"] = "◄" +ABBREVS["twonotes"] = "♫" +ABBREVS["mdblkdiamond"] = "⬥" +ABBREVS["ttnine"] = "𝟿" +ABBREVS["upwhitearrow"] = "⇧" +ABBREVS["bsansvarpi"] = "𝞏" +ABBREVS["itOmega"] = "𝛺" +ABBREVS["approxnotequal"] = "≆" +ABBREVS["bft"] = "𝐭" +ABBREVS["isansx"] = "𝘹" +ABBREVS["sqrt"] = "√" +ABBREVS["plusdot"] = "⨥" +ABBREVS["bigodot"] = "⨀" +ABBREVS["subsetneqq"] = "⫋" +ABBREVS["bsimilarleftarrow"] = "⭁" +ABBREVS["nvtwoheadrightarrowtail"] = "⤗" +ABBREVS["varTheta"] = "ϴ" +ABBREVS["bisansY"] = "𝙔" +ABBREVS["bbQ"] = "ℚ" +ABBREVS["neg"] = "¬" +ABBREVS["bscrx"] = "𝔁" +ABBREVS["bfxi"] = "𝛏" +ABBREVS["barwedge"] = "⊼" +ABBREVS["itmu"] = "𝜇" +ABBREVS["^m"] = "ᵐ" +ABBREVS["biLambda"] = "𝜦" +ABBREVS["sansL"] = "𝖫" +ABBREVS["ltcc"] = "⪦" +ABBREVS["medblackstar"] = "⭑" +ABBREVS["itU"] = "𝑈" +ABBREVS["Rightarrow"] = "⇒" +ABBREVS["bfkappa"] = "𝛋" +ABBREVS["leftbkarrow"] = "⤌" +ABBREVS["nvtwoheadleftarrowtail"] = "⬼" +ABBREVS["bsansvarkappa"] = "𝞌" +ABBREVS["scra"] = "𝒶" +ABBREVS["Cap"] = "⋒" +ABBREVS["itp"] = "𝑝" +ABBREVS["bsanss"] = "𝘀" +ABBREVS["^I"] = "ᴵ" +ABBREVS["aleph"] = "ℵ" +ABBREVS["bsansnabla"] = "𝝯" +ABBREVS["frakb"] = "𝔟" +ABBREVS["xi"] = "ξ" +ABBREVS["lessapprox"] = "⪅" +ABBREVS["bfz"] = "𝐳" +ABBREVS["ddddot"] = "⃜" +ABBREVS["bisansnu"] = "𝞶" +ABBREVS["_j"] = "ⱼ" +ABBREVS["longrightarrow"] = "⟶" +ABBREVS["bbW"] = "𝕎" +ABBREVS["to"] = "→" +ABBREVS["itPsi"] = "𝛹" +ABBREVS["varcarriagereturn"] = "⏎" +ABBREVS["dottedsquare"] = "⬚" +ABBREVS["tti"] = "𝚒" +ABBREVS["^o"] = "ᵒ" +ABBREVS["lmoustache"] = "⎰" +ABBREVS["^h"] = "ʰ" +ABBREVS["upoldkoppa"] = "ϙ" +ABBREVS["Equiv"] = "≣" +ABBREVS["pm"] = "±" +ABBREVS["scrN"] = "𝒩" +ABBREVS["ttr"] = "𝚛" +ABBREVS["prec"] = "≺" +ABBREVS["disjquant"] = "⨈" +ABBREVS["capwedge"] = "⩄" +ABBREVS["bfXi"] = "𝚵" +ABBREVS["accurrent"] = "⏦" +ABBREVS["draftingarrow"] = "➛" +ABBREVS["bbGamma"] = "ℾ" +ABBREVS["measuredangleleft"] = "⦛" +ABBREVS["DH"] = "Ð" +ABBREVS["circleonleftarrow"] = "⬰" +ABBREVS["bfJ"] = "𝐉" +ABBREVS["egsdot"] = "⪘" +ABBREVS["bsansS"] = "𝗦" +ABBREVS["ttU"] = "𝚄" +ABBREVS["bbv"] = "𝕧" +ABBREVS["bfraks"] = "𝖘" +ABBREVS["bsansLambda"] = "𝝠" +ABBREVS["itc"] = "𝑐" +ABBREVS["openbracketright"] = "⟧" +ABBREVS["vec"] = "⃗" +ABBREVS["bivartheta"] = "𝝑" +ABBREVS["ttC"] = "𝙲" +ABBREVS["bisansmu"] = "𝞵" +ABBREVS["downharpoonleft"] = "⇃" +ABBREVS["phi"] = "ϕ" +ABBREVS["sansw"] = "𝗐" +ABBREVS["bscrn"] = "𝓷" +ABBREVS["lozenge"] = "◊" +ABBREVS["circledparallel"] = "⦷" +ABBREVS["bfrake"] = "𝖊" +ABBREVS["L"] = "Ł" +ABBREVS["ni"] = "∋" +ABBREVS["nvleftrightarrow"] = "⇹" +ABBREVS["itF"] = "𝐹" +ABBREVS["ito"] = "𝑜" +ABBREVS["itvarkappa"] = "𝜘" +ABBREVS["vardiamondsuit"] = "♦" +ABBREVS["isansA"] = "𝘈" +ABBREVS["itUpsilon"] = "𝛶" +ABBREVS["itt"] = "𝑡" +ABBREVS["ttH"] = "𝙷" +ABBREVS["leftrightharpoonsdown"] = "⥧" +ABBREVS["invv"] = "ʌ" +ABBREVS["subseteqq"] = "⫅" +ABBREVS["profsurf"] = "⌓" +ABBREVS["_v"] = "ᵥ" +ABBREVS["blockfull"] = "█" +ABBREVS["bialpha"] = "𝜶" +ABBREVS["widebridgeabove"] = "⃩" +ABBREVS["sphericalangleup"] = "⦡" +ABBREVS["bfb"] = "𝐛" +ABBREVS["bisansTau"] = "𝞣" +ABBREVS["bsansAlpha"] = "𝝖" +ABBREVS["frakq"] = "𝔮" +ABBREVS["heartsuit"] = "♡" +ABBREVS["bsansvarphi"] = "𝞍" +ABBREVS["bsansH"] = "𝗛" +ABBREVS["circledstar"] = "✪" +ABBREVS["subset"] = "⊂" +ABBREVS["bsanstau"] = "𝞃" +ABBREVS["venus"] = "♀" +ABBREVS["supsetplus"] = "⫀" +ABBREVS["bsansP"] = "𝗣" +ABBREVS["thinspace"] = " " +ABBREVS["fallingdotseq"] = "≒" +ABBREVS["bisansr"] = "𝙧" +ABBREVS["partialmeetcontraction"] = "⪣" +ABBREVS["bivarepsilon"] = "𝝐" +ABBREVS["bbp"] = "𝕡" +ABBREVS["NotNestedLessLess"] = "⪡̸" +ABBREVS["bfL"] = "𝐋" +ABBREVS["sqlozenge"] = "⌑" +ABBREVS["squarecrossfill"] = "▩" +ABBREVS["frakC"] = "ℭ" +ABBREVS["approx"] = "≈" +ABBREVS["bscrO"] = "𝓞" +ABBREVS["ttfour"] = "𝟺" +ABBREVS["gtrless"] = "≷" +ABBREVS["ntriangleleft"] = "⋪" +ABBREVS["barvee"] = "⊽" +ABBREVS["invwhitelowerhalfcircle"] = "◛" +ABBREVS["partial"] = "∂" +ABBREVS["pluto"] = "♇" +ABBREVS["wedgedoublebar"] = "⩠" +ABBREVS["twoheadleftdbkarrow"] = "⬷" +ABBREVS["eqqslantgtr"] = "⪜" +ABBREVS["turnednot"] = "⌙" +ABBREVS["wedgedot"] = "⟑" +ABBREVS["kappa"] = "κ" +ABBREVS["similarleftarrow"] = "⭉" +ABBREVS["bsansu"] = "𝘂" +ABBREVS["rtlz"] = "ʐ" +ABBREVS["mdsmwhtsquare"] = "◽" +ABBREVS["frakx"] = "𝔵" +ABBREVS["lescc"] = "⪨" +ABBREVS["sanso"] = "𝗈" +ABBREVS["whthorzoval"] = "⬭" +ABBREVS["isansY"] = "𝘠" +ABBREVS["blocklefthalf"] = "▌" +ABBREVS["bisansU"] = "𝙐" +ABBREVS["bisansvarepsilon"] = "𝟄" +ABBREVS["sansq"] = "𝗊" +ABBREVS["vardoublebarwedge"] = "⌆" +ABBREVS["Vvdash"] = "⊪" +ABBREVS["invwhiteupperhalfcircle"] = "◚" +ABBREVS["hspace"] = " " +ABBREVS["sansE"] = "𝖤" +ABBREVS["rightdotarrow"] = "⤑" +ABBREVS["leqslant"] = "⩽" +ABBREVS["questeq"] = "≟" +ABBREVS["trnr"] = "ɹ" +ABBREVS["wp"] = "℘" +ABBREVS["bfomicron"] = "𝛐" +ABBREVS["frake"] = "𝔢" +ABBREVS["bsanschi"] = "𝞆" +ABBREVS["wedgeonwedge"] = "⩕" +ABBREVS["bisansgamma"] = "𝞬" +ABBREVS["ttO"] = "𝙾" +ABBREVS["fullouterjoin"] = "⟗" +ABBREVS["bscrD"] = "𝓓" +ABBREVS["isansj"] = "𝘫" +ABBREVS["bfrakS"] = "𝕾" +ABBREVS["lmrk"] = "ː" +ABBREVS["nHuparrow"] = "⇞" +ABBREVS["gamma"] = "γ" +ABBREVS["NotGreaterGreater"] = "≫̸" +ABBREVS["simgE"] = "⪠" +ABBREVS["bsansB"] = "𝗕" +ABBREVS["bsansX"] = "𝗫" +ABBREVS["bflambda"] = "𝛌" +ABBREVS["varstar"] = "✶" +ABBREVS["Doteq"] = "≑" +ABBREVS["ttD"] = "𝙳" +ABBREVS["LLeftarrow"] = "⭅" +ABBREVS["trnmlr"] = "ɰ" +ABBREVS["bbn"] = "𝕟" +ABBREVS["nsubset"] = "⊄" +ABBREVS["Equal"] = "⩵" +ABBREVS["varhexagon"] = "⬡" +ABBREVS["sansr"] = "𝗋" +ABBREVS["bsansMu"] = "𝝡" +ABBREVS["1/6"] = "⅙" +ABBREVS["bkarow"] = "⤍" +ABBREVS["bisanso"] = "𝙤" +ABBREVS["ttz"] = "𝚣" +ABBREVS["bfrakw"] = "𝖜" +ABBREVS["bscrq"] = "𝓺" +ABBREVS["intcup"] = "⨚" +ABBREVS["P"] = "¶" +ABBREVS["lneq"] = "⪇" +ABBREVS["bfrakF"] = "𝕱" +ABBREVS["^e"] = "ᵉ" +ABBREVS["napprox"] = "≉" +ABBREVS["sansA"] = "𝖠" +ABBREVS["ttT"] = "𝚃" +ABBREVS["^delta"] = "ᵟ" +ABBREVS["varheartsuit"] = "♥" +ABBREVS["ltquest"] = "⩻" +ABBREVS["bigstar"] = "★" +ABBREVS["bisansk"] = "𝙠" +ABBREVS["bsansGamma"] = "𝝘" +ABBREVS["lesseqgtr"] = "⋚" +ABBREVS["smeparsl"] = "⧤" +ABBREVS["smblkdiamond"] = "⬩" +ABBREVS["tdcol"] = "⫶" +ABBREVS["ngeq"] = "≱" +ABBREVS["varnothing"] = "∅" +ABBREVS["bisansx"] = "𝙭" +ABBREVS["rppolint"] = "⨒" +ABBREVS["supseteq"] = "⊇" +ABBREVS["cirfr"] = "◑" +ABBREVS["bisansG"] = "𝙂" +ABBREVS["eta"] = "η" +ABBREVS["bisansa"] = "𝙖" +ABBREVS["bsansU"] = "𝗨" +ABBREVS["varrho"] = "ϱ" +ABBREVS["itXi"] = "𝛯" +ABBREVS["neptune"] = "♆" +ABBREVS["^gamma"] = "ᵞ" +ABBREVS["lgblkcircle"] = "⬤" +ABBREVS["Vdash"] = "⊩" +ABBREVS["dots"] = "…" +ABBREVS["^G"] = "ᴳ" +ABBREVS["longleftrightarrow"] = "⟷" +ABBREVS["scrH"] = "ℋ" +ABBREVS["bipsi"] = "𝝍" +ABBREVS["Join"] = "⨝" +ABBREVS["gemini"] = "♊" +ABBREVS["isins"] = "⋴" +ABBREVS["bivarsigma"] = "𝝇" +ABBREVS["bff"] = "𝐟" +ABBREVS["bsansIota"] = "𝝞" +ABBREVS["_1"] = "₁" +ABBREVS["nsupset"] = "⊅" +ABBREVS["gescc"] = "⪩" +ABBREVS["supsetneqq"] = "⫌" +ABBREVS["threedangle"] = "⟀" +ABBREVS["sansB"] = "𝖡" +ABBREVS["lesdotor"] = "⪃" +ABBREVS["dotequiv"] = "⩧" +ABBREVS["bfvarrho"] = "𝛠" +ABBREVS["_o"] = "ₒ" +ABBREVS["bfrakG"] = "𝕲" +ABBREVS["biTau"] = "𝜯" +ABBREVS["bigtriangleup"] = "△" +ABBREVS["diagup"] = "╱" +ABBREVS["underbar"] = "̲" +ABBREVS["isansi"] = "𝘪" +ABBREVS["ttj"] = "𝚓" +ABBREVS["itL"] = "𝐿" +ABBREVS["rightwavearrow"] = "↝" +ABBREVS["nexists"] = "∄" +ABBREVS["nVleftarrowtail"] = "⬺" +ABBREVS["bimu"] = "𝝁" +ABBREVS["image"] = "⊷" +ABBREVS["underbrace"] = "⏟" +ABBREVS["circleurquadblack"] = "◔" +ABBREVS["ita"] = "𝑎" +ABBREVS["biEpsilon"] = "𝜠" +ABBREVS["bsansZeta"] = "𝝛" +ABBREVS["supdsub"] = "⫘" +ABBREVS["boxplus"] = "⊞" +ABBREVS["sansfour"] = "𝟦" +ABBREVS["^x"] = "ˣ" +ABBREVS["smashtimes"] = "⨳" +ABBREVS["Zeta"] = "Ζ" +ABBREVS["nisd"] = "⋺" +ABBREVS["biR"] = "𝑹" +ABBREVS["DDownarrow"] = "⟱" +ABBREVS["oplusrhrim"] = "⨮" +ABBREVS["biChi"] = "𝜲" +ABBREVS["ultriangle"] = "◸" +ABBREVS["bigamma"] = "𝜸" +ABBREVS["bsansG"] = "𝗚" +ABBREVS["OE"] = "Œ" +ABBREVS["circledcirc"] = "⊚" +ABBREVS["capricornus"] = "♑" +ABBREVS["diameter"] = "⌀" +ABBREVS["underbracket"] = "⎵" +ABBREVS["subsim"] = "⫇" +ABBREVS["bfN"] = "𝐍" +ABBREVS["house"] = "⌂" +ABBREVS["bisansJ"] = "𝙅" +ABBREVS["bsanstwo"] = "𝟮" +ABBREVS["bfpsi"] = "𝛙" +ABBREVS["towa"] = "⤪" +ABBREVS["itM"] = "𝑀" +ABBREVS["bsansv"] = "𝘃" +ABBREVS["schwa"] = "ə" +ABBREVS["in"] = "∈" +ABBREVS["bfe"] = "𝐞" +ABBREVS["bscrH"] = "𝓗" +ABBREVS["bfrakk"] = "𝖐" +ABBREVS["^0"] = "⁰" +ABBREVS["enclosecircle"] = "⃝" +ABBREVS["bscrQ"] = "𝓠" +ABBREVS["modtwosum"] = "⨊" +ABBREVS["chi"] = "χ" +ABBREVS["biiota"] = "𝜾" +ABBREVS["^alpha"] = "ᵅ" +ABBREVS["measanglerutone"] = "⦨" +ABBREVS["itD"] = "𝐷" +ABBREVS["sansLmirrored"] = "⅃" +ABBREVS["nvrightarrow"] = "⇸" +ABBREVS["biD"] = "𝑫" +ABBREVS["pes"] = "₧" +ABBREVS["bsansR"] = "𝗥" +ABBREVS["mapsdown"] = "↧" +ABBREVS["bsanspsi"] = "𝞇" +ABBREVS["imath"] = "ı" +ABBREVS["bfa"] = "𝐚" +ABBREVS["sanstwo"] = "𝟤" +ABBREVS["squareurquad"] = "◳" +ABBREVS["bfrakU"] = "𝖀" +ABBREVS["biZeta"] = "𝜡" +ABBREVS["bisanst"] = "𝙩" +ABBREVS["smwhtlozenge"] = "⬫" +ABBREVS["^V"] = "ⱽ" +ABBREVS["frakL"] = "𝔏" +ABBREVS["bbzero"] = "𝟘" +ABBREVS["rightthreearrows"] = "⇶" +ABBREVS["bsansxi"] = "𝝽" +ABBREVS["ttzero"] = "𝟶" +ABBREVS["scrU"] = "𝒰" +ABBREVS["bsansb"] = "𝗯" +ABBREVS["bfiota"] = "𝛊" +ABBREVS["bfrakg"] = "𝖌" +ABBREVS["QED"] = "∎" +ABBREVS["^b"] = "ᵇ" +ABBREVS["bisansl"] = "𝙡" +ABBREVS["boxbar"] = "◫" +ABBREVS["bbfive"] = "𝟝" +ABBREVS["Ldsh"] = "↲" +ABBREVS["bisansalpha"] = "𝞪" +ABBREVS["angdnr"] = "⦟" +ABBREVS["scrm"] = "𝓂" +ABBREVS["its"] = "𝑠" +ABBREVS["Xi"] = "Ξ" +ABBREVS["sansH"] = "𝖧" +ABBREVS["RightUpVectorBar"] = "⥔" +ABBREVS["veebar"] = "⊻" +ABBREVS["nsuccsim"] = "≿̸" +ABBREVS["itX"] = "𝑋" +ABBREVS["bsansN"] = "𝗡" +ABBREVS["bisansy"] = "𝙮" +ABBREVS["tto"] = "𝚘" +ABBREVS["tts"] = "𝚜" +ABBREVS["verymuchless"] = "⋘" +ABBREVS["bsanspi"] = "𝝿" +ABBREVS["frakr"] = "𝔯" +ABBREVS["leftdasharrow"] = "⇠" +ABBREVS["bfrakQ"] = "𝕼" +ABBREVS["rrbracket"] = "⟧" +ABBREVS["triangletimes"] = "⨻" +ABBREVS["dicei"] = "⚀" +ABBREVS["closedvarcup"] = "⩌" +ABBREVS["bbH"] = "ℍ" +ABBREVS["squarenwsefill"] = "▧" +ABBREVS["_gamma"] = "ᵧ" +ABBREVS["triangleq"] = "≜" +ABBREVS["lrtriangle"] = "◿" +ABBREVS["bfc"] = "𝐜" +ABBREVS["ogreaterthan"] = "⧁" +ABBREVS["congdot"] = "⩭" +ABBREVS["Beta"] = "Β" +ABBREVS["minusrdots"] = "⨬" +ABBREVS["bscrf"] = "𝓯" +ABBREVS["bisansSigma"] = "𝞢" +ABBREVS["ast"] = "∗" +ABBREVS["bigsqcup"] = "⨆" +ABBREVS["bsansq"] = "𝗾" +ABBREVS["bfbeta"] = "𝛃" +ABBREVS["bsansF"] = "𝗙" +ABBREVS["eqqplus"] = "⩱" +ABBREVS["bisansp"] = "𝙥" +ABBREVS["enclosesquare"] = "⃞" +ABBREVS["barleftarrow"] = "⇤" +ABBREVS["bscrr"] = "𝓻" +ABBREVS["isansN"] = "𝘕" +ABBREVS["bsansOmicron"] = "𝝤" +ABBREVS["ttsix"] = "𝟼" +ABBREVS["itLambda"] = "𝛬" +ABBREVS["nequiv"] = "≢" +ABBREVS["equivDD"] = "⩸" +ABBREVS["lat"] = "⪫" +ABBREVS["isansS"] = "𝘚" +ABBREVS["ttb"] = "𝚋" +ABBREVS["ncong"] = "≇" +ABBREVS["bbthree"] = "𝟛" +ABBREVS["^theta"] = "ᶿ" +ABBREVS["biM"] = "𝑴" +ABBREVS["Succ"] = "⪼" +ABBREVS["_schwa"] = "ₔ" +ABBREVS["Finv"] = "Ⅎ" +ABBREVS["ttf"] = "𝚏" +ABBREVS["bsansEta"] = "𝝜" +ABBREVS["_0"] = "₀" +ABBREVS["dddot"] = "⃛" +ABBREVS["scri"] = "𝒾" +ABBREVS["implies"] = "⟹" +ABBREVS["bfg"] = "𝐠" +ABBREVS["bfeta"] = "𝛈" +ABBREVS["itw"] = "𝑤" +ABBREVS["dotminus"] = "∸" +ABBREVS["bscrN"] = "𝓝" +ABBREVS["oint"] = "∮" +ABBREVS["bsanst"] = "𝘁" +ABBREVS["circlearrowleft"] = "↺" +ABBREVS["bscrE"] = "𝓔" +ABBREVS["blackinwhitediamond"] = "◈" +ABBREVS["diamondleftblack"] = "⬖" +ABBREVS["nHdownarrow"] = "⇟" +ABBREVS["bbJ"] = "𝕁" +ABBREVS["diamondsuit"] = "♢" +ABBREVS["frakg"] = "𝔤" +ABBREVS["isansO"] = "𝘖" +ABBREVS["bsansL"] = "𝗟" +ABBREVS["bsansnu"] = "𝝼" +ABBREVS["nLeftarrow"] = "⇍" +ABBREVS["bie"] = "𝒆" +ABBREVS["smalltriangleleft"] = "◃" +ABBREVS["rightleftharpoonsdown"] = "⥩" +ABBREVS["acute"] = "́" +ABBREVS["llbracket"] = "⟦" +ABBREVS["UUparrow"] = "⟰" +ABBREVS["Nearrow"] = "⇗" +ABBREVS["biu"] = "𝒖" +ABBREVS["bsansl"] = "𝗹" +ABBREVS["bigtriangledown"] = "▽" +ABBREVS["bfphi"] = "𝛟" +ABBREVS["Longleftarrow"] = "⟸" +ABBREVS["nsucc"] = "⊁" +ABBREVS["square"] = "□" +ABBREVS["succ"] = "≻" +ABBREVS["circledrightdot"] = "⚆" +ABBREVS["bfd"] = "𝐝" +ABBREVS["sansh"] = "𝗁" +ABBREVS["bbgamma"] = "ℽ" +ABBREVS["isansv"] = "𝘷" +ABBREVS["biomicron"] = "𝝄" +ABBREVS["bisansIota"] = "𝞘" +ABBREVS["bbT"] = "𝕋" +ABBREVS["scrC"] = "𝒞" +ABBREVS["pscrv"] = "ʋ" +ABBREVS["bsansdelta"] = "𝝳" +ABBREVS["neovnwarrow"] = "⤱" +ABBREVS["isanso"] = "𝘰" +ABBREVS["twoheadmapsto"] = "⤅" +ABBREVS["langle"] = "⟨" +ABBREVS["DownRightVectorBar"] = "⥗" +ABBREVS["Longmapsfrom"] = "⟽" +ABBREVS["Yup"] = "⅄" +ABBREVS["scrZ"] = "𝒵" +ABBREVS["itvarrho"] = "𝜚" +ABBREVS["clubsuit"] = "♣" +ABBREVS["elsdot"] = "⪗" +ABBREVS["Stigma"] = "Ϛ" +ABBREVS["biEta"] = "𝜢" +ABBREVS["xor"] = "⊻" +ABBREVS["rightangle"] = "∟" +ABBREVS["backsim"] = "∽" +ABBREVS["5/8"] = "⅝" +ABBREVS["minhat"] = "⩟" +ABBREVS["isansJ"] = "𝘑" +ABBREVS["bfmu"] = "𝛍" +ABBREVS["bsansC"] = "𝗖" +ABBREVS["downdownarrows"] = "⇊" +ABBREVS["measeq"] = "≞" +ABBREVS["^f"] = "ᶠ" +ABBREVS["lowint"] = "⨜" +ABBREVS["emptyset"] = "∅" +ABBREVS["sansM"] = "𝖬" +ABBREVS["varphi"] = "φ" +ABBREVS["bsansp"] = "𝗽" +ABBREVS["blacklozenge"] = "⧫" +ABBREVS["Tau"] = "Τ" +ABBREVS["itAlpha"] = "𝛢" +ABBREVS["itvarphi"] = "𝜙" +ABBREVS["bisansn"] = "𝙣" +ABBREVS["looparrowleft"] = "↫" +ABBREVS["isansV"] = "𝘝" +ABBREVS["nVtwoheadrightarrow"] = "⤁" +ABBREVS["ttp"] = "𝚙" +ABBREVS["beth"] = "ℶ" +ABBREVS["isansX"] = "𝘟" +ABBREVS["itj"] = "𝑗" +ABBREVS["sansj"] = "𝗃" +ABBREVS["nsim"] = "≁" +ABBREVS["ocirc"] = "̊" +ABBREVS["div"] = "÷" +ABBREVS["sansJ"] = "𝖩" +ABBREVS["bfrakt"] = "𝖙" +ABBREVS["itpi"] = "𝜋" +ABBREVS["sansG"] = "𝖦" +ABBREVS["longmapsfrom"] = "⟻" +ABBREVS["_-"] = "₋" +ABBREVS["bfsigma"] = "𝛔" +ABBREVS["squarehvfill"] = "▦" +ABBREVS["bfv"] = "𝐯" +ABBREVS["leftrightharpoonupdown"] = "⥊" +ABBREVS["turnk"] = "ʞ" +ABBREVS["bigcupdot"] = "⨃" +ABBREVS["And"] = "⩓" +ABBREVS["itE"] = "𝐸" +ABBREVS["bisansTheta"] = "𝞗" +ABBREVS["bbsum"] = "⅀" +ABBREVS["iiint"] = "∭" +ABBREVS["threeunderdot"] = "⃨" +ABBREVS["frakF"] = "𝔉" +ABBREVS["lvboxline"] = "⎸" +ABBREVS["bscrC"] = "𝓒" +ABBREVS["cancer"] = "♋" +ABBREVS["midbarwedge"] = "⩜" +ABBREVS["sqcup"] = "⊔" +ABBREVS["lrblacktriangle"] = "◢" +ABBREVS["Longrightarrow"] = "⟹" +ABBREVS["bikappa"] = "𝜿" +ABBREVS["subsetneq"] = "⊊" +ABBREVS["itBeta"] = "𝛣" +ABBREVS["ovhook"] = "̉" +ABBREVS["equalleftarrow"] = "⭀" +ABBREVS["bscrg"] = "𝓰" +ABBREVS["enclosetriangle"] = "⃤" +ABBREVS["dagger"] = "†" +ABBREVS["supsetdot"] = "⪾" +ABBREVS["frakf"] = "𝔣" +ABBREVS["scrI"] = "ℐ" +ABBREVS["rightouterjoin"] = "⟖" +ABBREVS["bfrakZ"] = "𝖅" +ABBREVS["twoheadmapsfrom"] = "⬶" +ABBREVS["bbf"] = "𝕗" +ABBREVS["itP"] = "𝑃" +ABBREVS["bsansalpha"] = "𝝰" +ABBREVS["bisansE"] = "𝙀" +ABBREVS["binu"] = "𝝂" +ABBREVS["itz"] = "𝑧" +ABBREVS["^g"] = "ᵍ" +ABBREVS["Sqcup"] = "⩏" +ABBREVS["biq"] = "𝒒" +ABBREVS["scrO"] = "𝒪" +ABBREVS["bfrakI"] = "𝕴" +ABBREVS["isansa"] = "𝘢" +ABBREVS["bfOmicron"] = "𝚶" +ABBREVS["leftwavearrow"] = "↜" +ABBREVS["notlessgreater"] = "≸" +ABBREVS["rightrightarrows"] = "⇉" +ABBREVS["DownRightTeeVector"] = "⥟" +ABBREVS["supsetapprox"] = "⫊" +ABBREVS["ttP"] = "𝙿" +ABBREVS["allequal"] = "≌" +ABBREVS["bfV"] = "𝐕" +ABBREVS["del"] = "∇" +ABBREVS["blackpointerright"] = "►" +ABBREVS["3/5"] = "⅗" +ABBREVS["bbC"] = "ℂ" +ABBREVS["female"] = "♀" +ABBREVS["cdotp"] = "·" +ABBREVS["bfvarphi"] = "𝛗" +ABBREVS["bsansc"] = "𝗰" +ABBREVS["bfnabla"] = "𝛁" +ABBREVS["^T"] = "ᵀ" +ABBREVS["itOmicron"] = "𝛰" +ABBREVS["capdot"] = "⩀" +ABBREVS["biY"] = "𝒀" +ABBREVS["italpha"] = "𝛼" +ABBREVS["ntrianglerighteq"] = "⋭" +ABBREVS["notbackslash"] = "⍀" +ABBREVS["nni"] = "∌" +ABBREVS["blacktriangle"] = "▴" +ABBREVS["mdblkcircle"] = "⚫" +ABBREVS["saturn"] = "♄" +ABBREVS["DownLeftRightVector"] = "⥐" +ABBREVS["ordmasculine"] = "º" +ABBREVS["curlyeqsucc"] = "⋟" +ABBREVS["bsansBeta"] = "𝝗" +ABBREVS["DownLeftTeeVector"] = "⥞" +ABBREVS["rdiagovfdiag"] = "⤫" +ABBREVS["mapsto"] = "↦" +ABBREVS["veemidvert"] = "⩛" +ABBREVS["^R"] = "ᴿ" +ABBREVS["maltese"] = "✠" +ABBREVS["rightarrowdiamond"] = "⤞" +ABBREVS["bfsix"] = "𝟔" +ABBREVS["leftouterjoin"] = "⟕" +ABBREVS["hslash"] = "ℏ" +ABBREVS["bisanszeta"] = "𝞯" +ABBREVS["bbid"] = "ⅆ" +ABBREVS["nVleftarrow"] = "⇺" +ABBREVS["circleonrightarrow"] = "⇴" +ABBREVS["bfraki"] = "𝖎" +ABBREVS["ttY"] = "𝚈" +ABBREVS["blockhalfshaded"] = "▒" +ABBREVS["brokenbar"] = "¦" +ABBREVS["blacksquare"] = "■" +ABBREVS["mdlgblkdiamond"] = "◆" +ABBREVS["circlellquad"] = "◵" +ABBREVS["upuparrows"] = "⇈" +ABBREVS["taurus"] = "♉" +ABBREVS["planck"] = "ℎ" +ABBREVS["bisansi"] = "𝙞" +ABBREVS["frakW"] = "𝔚" +ABBREVS["bbd"] = "𝕕" +ABBREVS["bsansRho"] = "𝝦" +ABBREVS["bfq"] = "𝐪" +ABBREVS["vDash"] = "⊨" +ABBREVS["conjquant"] = "⨇" +ABBREVS["4/5"] = "⅘" +ABBREVS["biPi"] = "𝜫" +ABBREVS["varclubsuit"] = "♧" +ABBREVS["bscrX"] = "𝓧" +ABBREVS["sim"] = "∼" +ABBREVS["bisanspi"] = "𝞹" +ABBREVS["^8"] = "⁸" +ABBREVS["RuleDelayed"] = "⧴" +ABBREVS["^p"] = "ᵖ" +ABBREVS["scrJ"] = "𝒥" +ABBREVS["sum"] = "∑" +ABBREVS["bfepsilon"] = "𝛆" +ABBREVS["rightarrowbsimilar"] = "⭌" +ABBREVS["aquarius"] = "♒" +ABBREVS["sansS"] = "𝖲" +ABBREVS["ggg"] = "⋙" +ABBREVS["uranus"] = "♅" +ABBREVS["biepsilon"] = "𝜺" +ABBREVS["isinvb"] = "⋸" +ABBREVS["rightthreetimes"] = "⋌" +ABBREVS["oturnedcomma"] = "̒" +ABBREVS["bscrR"] = "𝓡" +ABBREVS["O"] = "Ø" +ABBREVS["bfvarepsilon"] = "𝛜" +ABBREVS["nbumpeq"] = "≏̸" +ABBREVS["dashv"] = "⊣" +ABBREVS["bbie"] = "ⅇ" +ABBREVS["curlywedge"] = "⋏" +ABBREVS["tth"] = "𝚑" +ABBREVS["itTau"] = "𝛵" +ABBREVS["mdlgwhtdiamond"] = "◇" +ABBREVS["itk"] = "𝑘" +ABBREVS["biZ"] = "𝒁" +ABBREVS["biGamma"] = "𝜞" +ABBREVS["bsansKappa"] = "𝝟" +ABBREVS["underleftharpoondown"] = "⃭" +ABBREVS["gg"] = "≫" +ABBREVS["circleulquad"] = "◴" +ABBREVS["ngtrsim"] = "≵" +ABBREVS["_s"] = "ₛ" +ABBREVS["smwhitestar"] = "⭒" +ABBREVS["bfrakB"] = "𝕭" +ABBREVS["glj"] = "⪤" +ABBREVS["sqsupset"] = "⊐" +ABBREVS["frakt"] = "𝔱" +ABBREVS["nprec"] = "⊀" +ABBREVS["_n"] = "ₙ" +ABBREVS["diamond"] = "⋄" +ABBREVS["Lap"] = "⧊" +ABBREVS["otimesrhrim"] = "⨵" +ABBREVS["leftrightarrows"] = "⇆" +ABBREVS["LeftUpTeeVector"] = "⥠" +ABBREVS["itphi"] = "𝜑" +ABBREVS["hexagon"] = "⎔" +ABBREVS["biSigma"] = "𝜮" +ABBREVS["eighthnote"] = "♪" +ABBREVS["risingdotseq"] = "≓" +ABBREVS["RightUpTeeVector"] = "⥜" +ABBREVS["bbrktbrk"] = "⎶" +ABBREVS["^("] = "⁽" +ABBREVS["1/2"] = "½" +ABBREVS["bfEpsilon"] = "𝚬" +ABBREVS["iint"] = "∬" +ABBREVS["nleqslant"] = "⩽̸" +ABBREVS["leftrightarrowtriangle"] = "⇿" +ABBREVS["squarelrquad"] = "◲" +ABBREVS["measanglerdtose"] = "⦪" +ABBREVS["eparsl"] = "⧣" +ABBREVS["nprecsim"] = "≾̸" +ABBREVS["btimes"] = "⨲" +ABBREVS["bia"] = "𝒂" +ABBREVS["bisansLambda"] = "𝞚" +ABBREVS["oe"] = "œ" +ABBREVS["forall"] = "∀" +ABBREVS["bbl"] = "𝕝" +ABBREVS["ttu"] = "𝚞" +ABBREVS["bisansDelta"] = "𝞓" +ABBREVS["bfDigamma"] = "𝟊" +ABBREVS["rightarrowtriangle"] = "⇾" +ABBREVS["bbw"] = "𝕨" +ABBREVS["leftarrowx"] = "⬾" +ABBREVS["bba"] = "𝕒" +ABBREVS["supset"] = "⊃" +ABBREVS["supsim"] = "⫈" +ABBREVS["bfrakP"] = "𝕻" +ABBREVS["ordfeminine"] = "ª" +ABBREVS["equiv"] = "≡" +ABBREVS["sharp"] = "♯" +ABBREVS["bsansY"] = "𝗬" +ABBREVS["sbrhr"] = "˒" +ABBREVS["_2"] = "₂" +ABBREVS["bbo"] = "𝕠" +ABBREVS["epsilon"] = "ϵ" +ABBREVS["Nwarrow"] = "⇖" +ABBREVS["bfMu"] = "𝚳" +ABBREVS["bsansmu"] = "𝝻" +ABBREVS["itlambda"] = "𝜆" +ABBREVS["isansE"] = "𝘌" +ABBREVS["ae"] = "æ" +ABBREVS["nrleg"] = "ƞ" +ABBREVS["infty"] = "∞" +ABBREVS["dualmap"] = "⧟" +ABBREVS["_="] = "₌" +ABBREVS["eqgtr"] = "⋝" +ABBREVS["bigotimes"] = "⨂" +ABBREVS["bsansn"] = "𝗻" +ABBREVS["nvleftarrow"] = "⇷" +ABBREVS["Swarrow"] = "⇙" +ABBREVS["vrecto"] = "▯" +ABBREVS["isinE"] = "⋹" +ABBREVS["leftharpoonaccent"] = "⃐" +ABBREVS["bbb"] = "𝕓" +ABBREVS["inversewhitecircle"] = "◙" +ABBREVS["commaminus"] = "⨩" +ABBREVS["bisansf"] = "𝙛" +ABBREVS["whitearrowupfrombar"] = "⇪" +ABBREVS["bisansChi"] = "𝞦" +ABBREVS["btdl"] = "ɬ" +ABBREVS["vrectangleblack"] = "▮" +ABBREVS["bsansO"] = "𝗢" +ABBREVS["scrQ"] = "𝒬" +ABBREVS["eqslantgtr"] = "⪖" +ABBREVS["strike"] = "̶" +ABBREVS["smblksquare"] = "▪" +ABBREVS["scpolint"] = "⨓" +ABBREVS["sansK"] = "𝖪" +ABBREVS["lrcorner"] = "⌟" +ABBREVS["bsansV"] = "𝗩" +ABBREVS["birho"] = "𝝆" +ABBREVS["nwarrow"] = "↖" +ABBREVS["bfzero"] = "𝟎" +ABBREVS["^M"] = "ᴹ" +ABBREVS["_p"] = "ₚ" +ABBREVS["simlE"] = "⪟" +ABBREVS["_8"] = "₈" +ABBREVS["scry"] = "𝓎" +ABBREVS["bfvartheta"] = "𝛝" +ABBREVS["leqq"] = "≦" +ABBREVS["lfloor"] = "⌊" +ABBREVS["cirfb"] = "◒" +ABBREVS["bit"] = "𝒕" +ABBREVS["bscrk"] = "𝓴" +ABBREVS["urtriangle"] = "◹" +ABBREVS["rightsquigarrow"] = "⇝" +ABBREVS["leftarrow"] = "←" +ABBREVS["sphericalangle"] = "∢" +ABBREVS["revemptyset"] = "⦰" +ABBREVS["nVtwoheadleftarrowtail"] = "⬽" +ABBREVS["biP"] = "𝑷" +ABBREVS["rLarr"] = "⥄" +ABBREVS["boxtimes"] = "⊠" +ABBREVS["ttm"] = "𝚖" +ABBREVS["_i"] = "ᵢ" +ABBREVS["dottedcircle"] = "◌" +ABBREVS["bisansvarsigma"] = "𝞻" +ABBREVS["hkswarow"] = "⤦" +ABBREVS["bfl"] = "𝐥" +ABBREVS["gtquest"] = "⩼" +ABBREVS["bisansq"] = "𝙦" +ABBREVS["frakK"] = "𝔎" +ABBREVS["^r"] = "ʳ" +ABBREVS["wedgeodot"] = "⩑" +ABBREVS["isansC"] = "𝘊" +ABBREVS["interleave"] = "⫴" +ABBREVS["^B"] = "ᴮ" +ABBREVS["doublebarvee"] = "⩢" +ABBREVS["circledwhitebullet"] = "⦾" +ABBREVS["complement"] = "∁" +ABBREVS["biL"] = "𝑳" +ABBREVS["itEta"] = "𝛨" +ABBREVS["ttw"] = "𝚠" +ABBREVS["bfzeta"] = "𝛇" +ABBREVS["isansG"] = "𝘎" +ABBREVS["simless"] = "⪝" +ABBREVS["biOmega"] = "𝜴" +ABBREVS["sqsubsetneq"] = "⋤" +ABBREVS["Ddownarrow"] = "⤋" +ABBREVS["sansx"] = "𝗑" +ABBREVS["bih"] = "𝒉" +ABBREVS["measanglelutonw"] = "⦩" +ABBREVS["_rho"] = "ᵨ" +ABBREVS["neqsim"] = "≂̸" +ABBREVS["smwhtsquare"] = "▫" +ABBREVS["itIota"] = "𝛪" +ABBREVS["leftarrowapprox"] = "⭊" +ABBREVS["upMu"] = "Μ" +ABBREVS["nVrightarrow"] = "⇻" +ABBREVS["bscrU"] = "𝓤" +ABBREVS["Koppa"] = "Ϟ" +ABBREVS["itnu"] = "𝜈" +ABBREVS["isansq"] = "𝘲" +ABBREVS["minusfdots"] = "⨫" +ABBREVS["gggnest"] = "⫸" +ABBREVS["angle"] = "∠" +ABBREVS["bfF"] = "𝐅" +ABBREVS["diceiv"] = "⚃" +ABBREVS["scrT"] = "𝒯" +ABBREVS["itSigma"] = "𝛴" +ABBREVS["Eta"] = "Η" +ABBREVS["ll"] = "≪" +ABBREVS["underrightarrow"] = "⃯" +ABBREVS["vartriangle"] = "▵" +ABBREVS["bfrakv"] = "𝖛" +ABBREVS["Leftarrow"] = "⇐" +ABBREVS["lrtriangleeq"] = "⧡" +ABBREVS["asymp"] = "≍" +ABBREVS["defas"] = "⧋" +ABBREVS["varointclockwise"] = "∲" +ABBREVS["bscrL"] = "𝓛" +ABBREVS["times"] = "×" +ABBREVS["wr"] = "≀" +ABBREVS["twoheadrightarrowtail"] = "⤖" +ABBREVS["bsansiota"] = "𝝸" +ABBREVS["llblacktriangle"] = "◣" +ABBREVS["_u"] = "ᵤ" +ABBREVS["ddotseq"] = "⩷" +ABBREVS["lltriangle"] = "◺" +ABBREVS["ss"] = "ß" +ABBREVS["bii"] = "𝒊" +ABBREVS["upOmicron"] = "Ο" +ABBREVS["boxupcaret"] = "⍓" +ABBREVS["suphsub"] = "⫗" +ABBREVS["approxeqq"] = "⩰" +ABBREVS["intcap"] = "⨙" +ABBREVS["^k"] = "ᵏ" +ABBREVS["openbracketleft"] = "⟦" +ABBREVS["circleurquad"] = "◷" +ABBREVS["gtcc"] = "⪧" +ABBREVS["droang"] = "̚" +ABBREVS["simgtr"] = "⪞" +ABBREVS["isansK"] = "𝘒" +ABBREVS["bfGamma"] = "𝚪" +ABBREVS["leftarrowbackapprox"] = "⭂" +ABBREVS["barrightarrowdiamond"] = "⤠" +ABBREVS["triangleleft"] = "◁" +ABBREVS["nvdash"] = "⊬" +ABBREVS["biv"] = "𝒗" +ABBREVS["bfTheta"] = "𝚯" +ABBREVS["bscrS"] = "𝓢" +ABBREVS["bisansm"] = "𝙢" +ABBREVS["dotsminusdots"] = "∺" +ABBREVS["ttg"] = "𝚐" +ABBREVS["oiiint"] = "∰" +ABBREVS["scrV"] = "𝒱" +ABBREVS["questiondown"] = "¿" +ABBREVS["forkv"] = "⫙" +ABBREVS["updownarrowbar"] = "↨" +ABBREVS["upepsilon"] = "ε" +ABBREVS["itN"] = "𝑁" +ABBREVS["pertenthousand"] = "‱" +ABBREVS["precnsim"] = "⋨" +ABBREVS["profline"] = "⌒" +ABBREVS["bfdigamma"] = "𝟋" +ABBREVS["itupsilon"] = "𝜐" +ABBREVS["reapos"] = "‛" +ABBREVS["ttA"] = "𝙰" +ABBREVS["sansfive"] = "𝟧" +ABBREVS["succneq"] = "⪲" +ABBREVS["UpEquilibrium"] = "⥮" +ABBREVS["ttk"] = "𝚔" +ABBREVS["biC"] = "𝑪" +ABBREVS["scrE"] = "ℰ" +ABBREVS["bfrakd"] = "𝖉" +ABBREVS["underleftrightarrow"] = "͍" +ABBREVS["ttQ"] = "𝚀" +ABBREVS["aries"] = "♈" +ABBREVS["intercal"] = "⊺" +ABBREVS["bbs"] = "𝕤" +ABBREVS["Zbar"] = "Ƶ" +ABBREVS["emptysetoarrl"] = "⦴" +ABBREVS["itMu"] = "𝛭" +ABBREVS["ntrianglelefteq"] = "⋬" +ABBREVS["bigvee"] = "⋁" +ABBREVS["minus"] = "−" +ABBREVS["nleftarrow"] = "↚" +ABBREVS["scrL"] = "ℒ" +ABBREVS["bfp"] = "𝐩" +ABBREVS["itvarepsilon"] = "𝜖" +ABBREVS["mho"] = "℧" +ABBREVS["bigwedge"] = "⋀" +ABBREVS["benzenr"] = "⏣" +ABBREVS["submult"] = "⫁" +ABBREVS["sanss"] = "𝗌" +ABBREVS["sinewave"] = "∿" +ABBREVS["bbii"] = "ⅈ" +ABBREVS["leftrightarrowcircle"] = "⥈" +ABBREVS["diamondbotblack"] = "⬙" +ABBREVS["fourthroot"] = "∜" +ABBREVS["curlyvee"] = "⋎" +ABBREVS["eth"] = "ð" +ABBREVS["itK"] = "𝐾" +ABBREVS["bisansF"] = "𝙁" +ABBREVS["bsolhsub"] = "⟈" +ABBREVS["bisansQ"] = "𝙌" +ABBREVS["lsime"] = "⪍" +ABBREVS["lesseqqgtr"] = "⪋" +ABBREVS["dshfnc"] = "┆" +ABBREVS["blackcircledrightdot"] = "⚈" +ABBREVS["bbu"] = "𝕦" +ABBREVS["bsansXi"] = "𝝣" +ABBREVS["bsansf"] = "𝗳" +ABBREVS["bsansj"] = "𝗷" +ABBREVS["itI"] = "𝐼" +ABBREVS["scorpio"] = "♏" +ABBREVS["upharpoonright"] = "↾" +ABBREVS["circlelrquad"] = "◶" +ABBREVS["twocups"] = "⩊" +ABBREVS["ttx"] = "𝚡" +ABBREVS["bisanspartial"] = "𝟃" +ABBREVS["lessdot"] = "⋖" +ABBREVS["subsetplus"] = "⪿" +ABBREVS["bfP"] = "𝐏" +ABBREVS["sansm"] = "𝗆" +ABBREVS["blackcircledtwodots"] = "⚉" +ABBREVS["bfk"] = "𝐤" +ABBREVS["bsansvartheta"] = "𝞋" +ABBREVS["rsolbar"] = "⧷" +ABBREVS["sqfr"] = "◨" +ABBREVS["increment"] = "∆" +ABBREVS["sansa"] = "𝖺" +ABBREVS["bftwo"] = "𝟐" +ABBREVS["ttseven"] = "𝟽" +ABBREVS["isansI"] = "𝘐" +ABBREVS["leftrightharpoonsup"] = "⥦" +ABBREVS["fraky"] = "𝔶" +ABBREVS["nVtwoheadrightarrowtail"] = "⤘" +ABBREVS["ttX"] = "𝚇" +ABBREVS["bisanstau"] = "𝞽" +ABBREVS["otimeshat"] = "⨶" +ABBREVS["1/5"] = "⅕" +ABBREVS["ularc"] = "◜" +ABBREVS["bsansNu"] = "𝝢" +ABBREVS["_6"] = "₆" +ABBREVS["coprod"] = "∐" +ABBREVS["sansF"] = "𝖥" +ABBREVS["aa"] = "å" +ABBREVS["1/9"] = "⅑" +ABBREVS["dblarrowupdown"] = "⇅" +ABBREVS["isanst"] = "𝘵" +ABBREVS["^epsilon"] = "ᵋ" +ABBREVS["cupdot"] = "⊍" +ABBREVS["Lsh"] = "↰" +ABBREVS["itnabla"] = "𝛻" +ABBREVS["trianglelefteq"] = "⊴" +ABBREVS["scurel"] = "⊱" +ABBREVS["emptysetoarr"] = "⦳" +ABBREVS["degree"] = "°" +ABBREVS["xrat"] = "℞" +ABBREVS["dicevi"] = "⚅" +ABBREVS["triangleminus"] = "⨺" +ABBREVS["ddot"] = "̈" +ABBREVS["topbot"] = "⌶" +ABBREVS["updownharpoonleftright"] = "⥍" +ABBREVS["blacklefthalfcircle"] = "◖" +ABBREVS["hexagonblack"] = "⬣" +ABBREVS["fraka"] = "𝔞" +ABBREVS["bbone"] = "𝟙" +ABBREVS["isansR"] = "𝘙" +ABBREVS["ddagger"] = "‡" +ABBREVS["scrA"] = "𝒜" +ABBREVS["bscrc"] = "𝓬" +ABBREVS["itvarpi"] = "𝜛" +ABBREVS["bigcap"] = "⋂" +ABBREVS["itW"] = "𝑊" +ABBREVS["bibeta"] = "𝜷" +ABBREVS["gesles"] = "⪔" +ABBREVS["circeq"] = "≗" +ABBREVS["Phi"] = "Φ" +ABBREVS["guilsinglleft"] = "‹" +ABBREVS["bisansA"] = "𝘼" +ABBREVS["AE"] = "Æ" +ABBREVS["check"] = "̌" +ABBREVS["hlmrk"] = "ˑ" +ABBREVS["intx"] = "⨘" +ABBREVS["bfNu"] = "𝚴" +ABBREVS["parallelogram"] = "▱" +ABBREVS["Upsilon"] = "Υ" +ABBREVS["bsansD"] = "𝗗" +ABBREVS["arceq"] = "≘" +ABBREVS["LeftUpDownVector"] = "⥑" +ABBREVS["Dashv"] = "⫤" +ABBREVS["sansb"] = "𝖻" +ABBREVS["overbracket"] = "⎴" +ABBREVS["sanse"] = "𝖾" +ABBREVS["bfchi"] = "𝛘" +ABBREVS["ltimes"] = "⋉" +ABBREVS["bbseven"] = "𝟟" +ABBREVS["leftrightarrow"] = "↔" +ABBREVS["biI"] = "𝑰" +ABBREVS["^P"] = "ᴾ" +ABBREVS["rightarrowbackapprox"] = "⭈" +ABBREVS["varspadesuit"] = "♤" +ABBREVS["bfSigma"] = "𝚺" +ABBREVS["Mapsto"] = "⤇" +ABBREVS["bbg"] = "𝕘" +ABBREVS["bivarpi"] = "𝝕" +ABBREVS["Prec"] = "⪻" +ABBREVS["mid"] = "∣" +ABBREVS["subsetapprox"] = "⫉" +ABBREVS["varisinobar"] = "⋶" +ABBREVS["sansT"] = "𝖳" +ABBREVS["bfU"] = "𝐔" +ABBREVS["bivarrho"] = "𝝔" +ABBREVS["tricolon"] = "⁝" +ABBREVS["hookleftarrow"] = "↩" +ABBREVS["sqfnw"] = "┙" +ABBREVS["LeftTriangleBar"] = "⧏" +ABBREVS["isansD"] = "𝘋" +ABBREVS["bisansK"] = "𝙆" +ABBREVS["^="] = "⁼" +ABBREVS["bfDelta"] = "𝚫" +ABBREVS["swarrow"] = "↙" +ABBREVS["wideangleup"] = "⦧" +ABBREVS["bar"] = "̄" +ABBREVS["csube"] = "⫑" +ABBREVS["bfrako"] = "𝖔" +ABBREVS["rtlt"] = "ʈ" +ABBREVS["natural"] = "♮" +ABBREVS["mp"] = "∓" +ABBREVS["niobar"] = "⋾" +ABBREVS["invnot"] = "⌐" +ABBREVS["biK"] = "𝑲" +ABBREVS["biQ"] = "𝑸" +ABBREVS["subseteq"] = "⊆" +ABBREVS["squareneswfill"] = "▨" +ABBREVS["isansT"] = "𝘛" +ABBREVS["postalmark"] = "〒" +ABBREVS["NG"] = "Ŋ" +ABBREVS["LeftRightVector"] = "⥎" +ABBREVS["frakc"] = "𝔠" +ABBREVS["biG"] = "𝑮" +ABBREVS["bfrakW"] = "𝖂" +ABBREVS["bfrakN"] = "𝕹" +ABBREVS["ittheta"] = "𝜃" +ABBREVS["gtreqqless"] = "⪌" +ABBREVS["isansr"] = "𝘳" +ABBREVS["bisansT"] = "𝙏" +ABBREVS["Longleftrightarrow"] = "⟺" +ABBREVS["tildelow"] = "˜" +ABBREVS["vdots"] = "⋮" +ABBREVS["dashrightharpoondown"] = "⥭" +ABBREVS["^H"] = "ᴴ" +ABBREVS["bigbot"] = "⟘" +ABBREVS["gimel"] = "ℷ" +ABBREVS["iiiint"] = "⨌" +ABBREVS["bip"] = "𝒑" +ABBREVS["varbarwedge"] = "⌅" +ABBREVS["twoheadleftarrowtail"] = "⬻" +ABBREVS["ttq"] = "𝚚" +ABBREVS["smte"] = "⪬" +ABBREVS["bisansRho"] = "𝞠" +ABBREVS["bisansepsilon"] = "𝞮" +ABBREVS["whitepointerright"] = "▻" +ABBREVS["nvLeftrightarrow"] = "⤄" +ABBREVS["TH"] = "Þ" +ABBREVS["mapsup"] = "↥" +ABBREVS["revangleubar"] = "⦥" +ABBREVS["scrz"] = "𝓏" +ABBREVS["clwintegral"] = "∱" +ABBREVS["sansthree"] = "𝟥" +ABBREVS["_9"] = "₉" +ABBREVS["circledbullet"] = "⦿" +ABBREVS["ttN"] = "𝙽" +ABBREVS["bisansv"] = "𝙫" +ABBREVS["Lleftarrow"] = "⇚" +ABBREVS["bfdelta"] = "𝛅" +ABBREVS["hat"] = "̂" +ABBREVS["nearrow"] = "↗" +ABBREVS["vartheta"] = "ϑ" +ABBREVS["bscrP"] = "𝓟" +ABBREVS["varnis"] = "⋻" +ABBREVS["Iota"] = "Ι" +ABBREVS["varlrtriangle"] = "⊿" +ABBREVS["bfy"] = "𝐲" +ABBREVS["backpprime"] = "‶" +ABBREVS["th"] = "þ" +ABBREVS["frakX"] = "𝔛" +ABBREVS["itS"] = "𝑆" +ABBREVS["bscrZ"] = "𝓩" +ABBREVS["kernelcontraction"] = "∻" +ABBREVS["ntriangleright"] = "⋫" +ABBREVS["frakT"] = "𝔗" +ABBREVS["Searrow"] = "⇘" +ABBREVS["tte"] = "𝚎" +ABBREVS["bfrakz"] = "𝖟" +ABBREVS["breve"] = "̆" +ABBREVS["angleubar"] = "⦤" +ABBREVS["hatapprox"] = "⩯" +ABBREVS["bisansEta"] = "𝞖" +ABBREVS["itvartheta"] = "𝜗" +ABBREVS["trnt"] = "ʇ" +ABBREVS["closedvarcupsmashprod"] = "⩐" +ABBREVS["succeq"] = "⪰" +ABBREVS["isansU"] = "𝘜" +ABBREVS["enspace"] = " " +ABBREVS["itq"] = "𝑞" +ABBREVS["nwovnearrow"] = "⤲" +ABBREVS["isansQ"] = "𝘘" +ABBREVS["bsansfive"] = "𝟱" +ABBREVS["bigcirc"] = "○" +ABBREVS["suphsol"] = "⟉" +ABBREVS["plushat"] = "⨣" +ABBREVS["bisansZ"] = "𝙕" +ABBREVS["sigma"] = "σ" +ABBREVS["itvarTheta"] = "𝛳" +ABBREVS["leftharpoonup"] = "↼" +ABBREVS["bisansOmicron"] = "𝞞" +ABBREVS["^L"] = "ᴸ" +ABBREVS["^w"] = "ʷ" +ABBREVS["int"] = "∫" +ABBREVS["curlyeqprec"] = "⋞" +ABBREVS["barleftarrowrightarrowbar"] = "↹" +ABBREVS["rightwhitearrow"] = "⇨" +ABBREVS["rightarrowplus"] = "⥅" +ABBREVS["bbA"] = "𝔸" +ABBREVS["sansY"] = "𝖸" +ABBREVS["bsansrho"] = "𝞀" +ABBREVS["sqrtbottom"] = "⎷" +ABBREVS["bscrv"] = "𝓿" +ABBREVS["nVrightarrowtail"] = "⤕" +ABBREVS["neovsearrow"] = "⤮" +ABBREVS["bscrW"] = "𝓦" +ABBREVS["Leftrightarrow"] = "⇔" +ABBREVS["rightharpoonsupdown"] = "⥤" +ABBREVS["lceil"] = "⌈" +ABBREVS["UpArrowBar"] = "⤒" +ABBREVS["bfAlpha"] = "𝚨" +ABBREVS["bfi"] = "𝐢" +ABBREVS["bfrakH"] = "𝕳" +ABBREVS["ne"] = "≠" +ABBREVS["varsubsetneqq"] = "⊊︀" +ABBREVS["bfs"] = "𝐬" +ABBREVS["bullet"] = "•" +ABBREVS["bfrakf"] = "𝖋" +ABBREVS["^+"] = "⁺" +ABBREVS["itpsi"] = "𝜓" +ABBREVS["lgE"] = "⪑" +ABBREVS["bffive"] = "𝟓" +ABBREVS["trnh"] = "ɥ" +ABBREVS["boxbslash"] = "⧅" +ABBREVS["equalparallel"] = "⋕" +ABBREVS["cirfnint"] = "⨐" +ABBREVS["biz"] = "𝒛" +ABBREVS["subedot"] = "⫃" +ABBREVS["bbi"] = "𝕚" +ABBREVS["itRho"] = "𝛲" +ABBREVS["nLeftrightarrow"] = "⇎" +ABBREVS["itepsilon"] = "𝜀" +ABBREVS["itomega"] = "𝜔" +ABBREVS["dashleftharpoondown"] = "⥫" +ABBREVS["hrectangle"] = "▭" +ABBREVS["bbM"] = "𝕄" +ABBREVS["ttd"] = "𝚍" +ABBREVS["bsansM"] = "𝗠" +ABBREVS["bfX"] = "𝐗" +ABBREVS["bisansvarkappa"] = "𝟆" +ABBREVS["itkappa"] = "𝜅" +ABBREVS["precnapprox"] = "⪹" +ABBREVS["scrj"] = "𝒿" +ABBREVS["nsqsupseteq"] = "⋣" +ABBREVS["precapprox"] = "⪷" +ABBREVS["pentagonblack"] = "⬟" +ABBREVS["curvearrowright"] = "↷" +ABBREVS["bfrakA"] = "𝕬" +ABBREVS["sqspne"] = "⋥" +ABBREVS["bfm"] = "𝐦" +ABBREVS["bisansW"] = "𝙒" +ABBREVS["top"] = "⊤" +ABBREVS["sansi"] = "𝗂" +ABBREVS["bbZ"] = "ℤ" +ABBREVS["itiota"] = "𝜄" +ABBREVS["blacktriangledown"] = "▾" +ABBREVS["squoval"] = "▢" +ABBREVS["rasp"] = "ʼ" +ABBREVS["downharpoonright"] = "⇂" +ABBREVS["bsanssix"] = "𝟲" +ABBREVS["sqsubset"] = "⊏" +ABBREVS["squarellblack"] = "⬕" +ABBREVS["underrightharpoondown"] = "⃬" +ABBREVS["succsim"] = "≿" +ABBREVS["dashV"] = "⫣" +ABBREVS["itzeta"] = "𝜁" +ABBREVS["emdash"] = "—" +ABBREVS["biA"] = "𝑨" +ABBREVS["itPhi"] = "𝛷" +ABBREVS["biJ"] = "𝑱" +ABBREVS["bisansOmega"] = "𝞨" +ABBREVS["scrM"] = "ℳ" +ABBREVS["bin"] = "𝒏" +ABBREVS["delta"] = "δ" +ABBREVS["rfloor"] = "⌋" +ABBREVS["eqslantless"] = "⪕" +ABBREVS["twoheaduparrow"] = "↟" +ABBREVS["bsansJ"] = "𝗝" +ABBREVS["bisansM"] = "𝙈" +ABBREVS["^phi"] = "ᵠ" +ABBREVS["bisansd"] = "𝙙" +ABBREVS["^i"] = "ⁱ" +ABBREVS["eqcolon"] = "≕" +ABBREVS["bfvarsigma"] = "𝛓" +ABBREVS["bfrakM"] = "𝕸" +ABBREVS["nsubseteq"] = "⊈" +ABBREVS["bisansomega"] = "𝟂" +ABBREVS["wedge"] = "∧" +ABBREVS["^N"] = "ᴺ" +ABBREVS["cdots"] = "⋯" +ABBREVS["7/8"] = "⅞" +ABBREVS["smblklozenge"] = "⬪" +ABBREVS["spadesuit"] = "♠" +ABBREVS["bfChi"] = "𝚾" +ABBREVS["trapezium"] = "⏢" +ABBREVS["bullseye"] = "◎" +ABBREVS["scro"] = "ℴ" +ABBREVS["tildetrpl"] = "≋" +ABBREVS["leftrightsquigarrow"] = "↭" +ABBREVS["^t"] = "ᵗ" +ABBREVS["dbkarow"] = "⤏" +ABBREVS["Sigma"] = "Σ" +ABBREVS["longmapsto"] = "⟼" +ABBREVS["DownArrowUpArrow"] = "⇵" +ABBREVS["intbar"] = "⨍" +ABBREVS["nasymp"] = "≭" +ABBREVS["npreceq"] = "⪯̸" +ABBREVS["isansM"] = "𝘔" +ABBREVS["bbnine"] = "𝟡" +ABBREVS["itdelta"] = "𝛿" +ABBREVS["virgo"] = "♍" +ABBREVS["bfPhi"] = "𝚽" +ABBREVS["isansL"] = "𝘓" +ABBREVS["boxast"] = "⧆" +ABBREVS["bbV"] = "𝕍" +ABBREVS["sansc"] = "𝖼" +ABBREVS["bfUpsilon"] = "𝚼" +ABBREVS["csupe"] = "⫒" +ABBREVS["drbkarrow"] = "⤐" +ABBREVS["bfrakC"] = "𝕮" +ABBREVS["bscrl"] = "𝓵" +ABBREVS["ell"] = "ℓ" +ABBREVS["bfrakY"] = "𝖄" +ABBREVS["squaretopblack"] = "⬒" +ABBREVS["sansN"] = "𝖭" +ABBREVS["isansB"] = "𝘉" +ABBREVS["bisansPsi"] = "𝞧" +ABBREVS["tau"] = "τ" +ABBREVS["Vvert"] = "⦀" +ABBREVS["circledS"] = "Ⓢ" +ABBREVS["bsanse"] = "𝗲" +ABBREVS["bbtwo"] = "𝟚" +ABBREVS["boxdot"] = "⊡" +ABBREVS["sanszero"] = "𝟢" +ABBREVS["twoheadleftarrow"] = "↞" +ABBREVS["barovernorthwestarrow"] = "↸" +ABBREVS["mdwhtlozenge"] = "⬨" +ABBREVS["bsansE"] = "𝗘" +ABBREVS["bscrd"] = "𝓭" +ABBREVS["Uparrow"] = "⇑" +ABBREVS["squarevfill"] = "▥" +ABBREVS["bfeight"] = "𝟖" +ABBREVS["LeftVectorBar"] = "⥒" +ABBREVS["_7"] = "₇" +ABBREVS["rightdasharrow"] = "⇢" +ABBREVS["itO"] = "𝑂" +ABBREVS["sanst"] = "𝗍" +ABBREVS["bisansu"] = "𝙪" +ABBREVS["isansz"] = "𝘻" +ABBREVS["sansO"] = "𝖮" +ABBREVS["smwhtcircle"] = "◦" +ABBREVS["nolinebreak"] = "⁠" +ABBREVS["rangle"] = "⟩" +ABBREVS["rightarrowgtr"] = "⭃" +ABBREVS["libra"] = "♎" +ABBREVS["Lambda"] = "Λ" +ABBREVS["esh"] = "ʃ" +ABBREVS["ttfive"] = "𝟻" +ABBREVS["dsol"] = "⧶" +ABBREVS["sqsupseteq"] = "⊒" +ABBREVS["_r"] = "ᵣ" +ABBREVS["tieconcat"] = "⁀" +ABBREVS["itGamma"] = "𝛤" +ABBREVS["itg"] = "𝑔" +ABBREVS["odot"] = "⊙" +ABBREVS["supseteqq"] = "⫆" +ABBREVS["csup"] = "⫐" +ABBREVS["bsansm"] = "𝗺" +ABBREVS["bisansS"] = "𝙎" +ABBREVS["boxminus"] = "⊟" +ABBREVS["Rdsh"] = "↳" +ABBREVS["varveebar"] = "⩡" +ABBREVS["bfrakx"] = "𝖝" +ABBREVS["k"] = "̨" +ABBREVS["bfBeta"] = "𝚩" +ABBREVS["bilambda"] = "𝝀" +ABBREVS["nparallel"] = "∦" +ABBREVS["Pi"] = "Π" +ABBREVS["^n"] = "ⁿ" +ABBREVS["conictaper"] = "⌲" +ABBREVS["biBeta"] = "𝜝" +ABBREVS["^z"] = "ᶻ" +ABBREVS["gtrapprox"] = "⪆" +ABBREVS["lessgtr"] = "≶" +ABBREVS["scrw"] = "𝓌" +ABBREVS["frakE"] = "𝔈" +ABBREVS["bix"] = "𝒙" +ABBREVS["ttthree"] = "𝟹" +ABBREVS["overleftrightarrow"] = "⃡" +ABBREVS["mdwhtcircle"] = "⚪" +ABBREVS["bisansrho"] = "𝞺" +ABBREVS["dotsim"] = "⩪" +ABBREVS["bfrakX"] = "𝖃" +ABBREVS["coloneq"] = "≔" +ABBREVS["trademark"] = "™" +ABBREVS["pisces"] = "♓" +ABBREVS["bscrY"] = "𝓨" +ABBREVS["bbfour"] = "𝟜" +ABBREVS["rightarrowsupset"] = "⭄" +ABBREVS["itu"] = "𝑢" +ABBREVS["preceqq"] = "⪳" +ABBREVS["bio"] = "𝒐" +ABBREVS["eqcirc"] = "≖" +ABBREVS["quarternote"] = "♩" +ABBREVS["measangleldtosw"] = "⦫" +ABBREVS["RightVectorBar"] = "⥓" +ABBREVS["vysmblksquare"] = "⬝" +ABBREVS["bscrz"] = "𝔃" +ABBREVS["frakJ"] = "𝔍" +ABBREVS["lgwhtsquare"] = "⬜" +ABBREVS["sansf"] = "𝖿" +ABBREVS["bsansvarepsilon"] = "𝞊" +ABBREVS["bfnine"] = "𝟗" +ABBREVS["upharpoonleft"] = "↿" +ABBREVS["sansl"] = "𝗅" +ABBREVS["wedgeq"] = "≙" +ABBREVS["itChi"] = "𝛸" +ABBREVS["^U"] = "ᵁ" +ABBREVS["hrectangleblack"] = "▬" +ABBREVS["hookrightarrow"] = "↪" +ABBREVS["supsetneq"] = "⊋" +ABBREVS["nis"] = "⋼" +ABBREVS["bisansI"] = "𝙄" +ABBREVS["biIota"] = "𝜤" +ABBREVS["5/6"] = "⅚" +ABBREVS["bbX"] = "𝕏" +ABBREVS["bisansdelta"] = "𝞭" +ABBREVS["succneqq"] = "⪶" +ABBREVS["precneq"] = "⪱" +ABBREVS["frakw"] = "𝔴" +ABBREVS["diamondleftarrow"] = "⤝" +ABBREVS["bbY"] = "𝕐" +ABBREVS["bisansbeta"] = "𝞫" +ABBREVS["bisansKappa"] = "𝞙" +ABBREVS["bfIota"] = "𝚰" +ABBREVS["bfTau"] = "𝚻" +ABBREVS["rtll"] = "ɭ" +ABBREVS["bim"] = "𝒎" +ABBREVS["sout"] = "̶" +ABBREVS["precsim"] = "≾" +ABBREVS["invw"] = "ʍ" +ABBREVS["bsansZ"] = "𝗭" +ABBREVS["^E"] = "ᴱ" +ABBREVS["biphi"] = "𝝋" +ABBREVS["upkoppa"] = "ϟ" +ABBREVS["trnsa"] = "ɒ" +ABBREVS["^d"] = "ᵈ" +ABBREVS["Gamma"] = "Γ" +ABBREVS["preceq"] = "⪯" +ABBREVS["bscrM"] = "𝓜" +ABBREVS["bfraka"] = "𝖆" +ABBREVS["isansH"] = "𝘏" +ABBREVS["tosa"] = "⤩" +ABBREVS["otimeslhrim"] = "⨴" +ABBREVS["bsansOmega"] = "𝝮" +ABBREVS["notin"] = "∉" +ABBREVS["inglst"] = "ʖ" +ABBREVS["frakl"] = "𝔩" +ABBREVS["^u"] = "ᵘ" +ABBREVS["ulblacktriangle"] = "◤" +ABBREVS["bil"] = "𝒍" +ABBREVS["_beta"] = "ᵦ" +ABBREVS["sansR"] = "𝖱" +ABBREVS["euro"] = "€" +ABBREVS["circ"] = "∘" +ABBREVS["bisansnabla"] = "𝞩" +ABBREVS["prime"] = "′" +ABBREVS["biH"] = "𝑯" +ABBREVS["itomicron"] = "𝜊" +ABBREVS["biTheta"] = "𝜣" +ABBREVS["mdwhtsquare"] = "◻" +ABBREVS["Angstrom"] = "Å" +ABBREVS["isansh"] = "𝘩" +ABBREVS["cdot"] = "⋅" +ABBREVS["uplus"] = "⊎" +ABBREVS["blockuphalf"] = "▀" +ABBREVS["leftthreearrows"] = "⬱" +ABBREVS["bid"] = "𝒅" +ABBREVS["leftdbkarrow"] = "⤎" +ABBREVS["itb"] = "𝑏" +ABBREVS["rtimes"] = "⋊" +ABBREVS["bisansvarTheta"] = "𝞡" +ABBREVS["numero"] = "№" +ABBREVS["carriagereturn"] = "↵" +ABBREVS["gsiml"] = "⪐" +ABBREVS["scrK"] = "𝒦" +ABBREVS["circledtwodots"] = "⚇" +ABBREVS["nmid"] = "∤" +ABBREVS["DJ"] = "Đ" +ABBREVS["bsanso"] = "𝗼" +ABBREVS["scrq"] = "𝓆" +ABBREVS["sansnine"] = "𝟫" +ABBREVS["trianglecdot"] = "◬" +ABBREVS["bfOmega"] = "𝛀" +ABBREVS["bfZeta"] = "𝚭" +ABBREVS["trny"] = "ʎ" +ABBREVS["^3"] = "³" +ABBREVS["^j"] = "ʲ" +ABBREVS["bsansh"] = "𝗵" +ABBREVS["bfrakE"] = "𝕰" +ABBREVS["ldots"] = "…" +ABBREVS["scrx"] = "𝓍" +ABBREVS["DownLeftVectorBar"] = "⥖" +ABBREVS["Supset"] = "⋑" +ABBREVS["mdblklozenge"] = "⬧" +ABBREVS["itvarsigma"] = "𝜍" +ABBREVS["barcup"] = "⩂" +ABBREVS["bftheta"] = "𝛉" +ABBREVS["bif"] = "𝒇" +ABBREVS["simrdots"] = "⩫" +ABBREVS["pgamma"] = "ɣ" +ABBREVS["ttM"] = "𝙼" +ABBREVS["midbarvee"] = "⩝" +ABBREVS["RightUpDownVector"] = "⥏" +ABBREVS["enclosediamond"] = "⃟" +ABBREVS["bisansAlpha"] = "𝞐" +ABBREVS["^5"] = "⁵" +ABBREVS["rightleftharpoonsup"] = "⥨" +ABBREVS["ltcir"] = "⩹" +ABBREVS["varhexagonlrbonds"] = "⌬" +ABBREVS["upharpoonsleftright"] = "⥣" +ABBREVS["varpi"] = "ϖ" +ABBREVS["scrR"] = "ℛ" +ABBREVS["bfH"] = "𝐇" +ABBREVS["circledast"] = "⊛" +ABBREVS["cap"] = "∩" +ABBREVS["bir"] = "𝒓" +ABBREVS["bscrh"] = "𝓱" +ABBREVS["Kappa"] = "Κ" +ABBREVS["vdash"] = "⊢" +ABBREVS["bib"] = "𝒃" +ABBREVS["smalltriangleright"] = "▹" +ABBREVS["because"] = "∵" +ABBREVS["barcap"] = "⩃" +ABBREVS["^beta"] = "ᵝ" +ABBREVS["bigtop"] = "⟙" +ABBREVS["elinters"] = "⏧" +ABBREVS["frakh"] = "𝔥" +ABBREVS["bfvarpi"] = "𝛡" +ABBREVS["bipi"] = "𝝅" +ABBREVS["_chi"] = "ᵪ" +ABBREVS["scrf"] = "𝒻" +ABBREVS["Times"] = "⨯" +ABBREVS["sqfse"] = "◪" +ABBREVS["rightharpoonupdash"] = "⥬" +ABBREVS["varniobar"] = "⋽" +ABBREVS["^iota"] = "ᶥ" +ABBREVS["biguplus"] = "⨄" +ABBREVS["nVleftrightarrow"] = "⇼" +ABBREVS["^a"] = "ᵃ" +ABBREVS["^v"] = "ᵛ" +ABBREVS["itr"] = "𝑟" +ABBREVS["bisansV"] = "𝙑" +ABBREVS["eqsim"] = "≂" +ABBREVS["whiteinwhitetriangle"] = "⟁" +ABBREVS["pupsil"] = "ʊ" +ABBREVS["lrarc"] = "◞" +ABBREVS["frakQ"] = "𝔔" +ABBREVS["isansg"] = "𝘨" +ABBREVS["tona"] = "⤧" +ABBREVS["setminus"] = "∖" +ABBREVS["nsqsubseteq"] = "⋢" +ABBREVS["doublepipe"] = "ǂ" +ABBREVS["lesdot"] = "⩿" +ABBREVS["isansw"] = "𝘸" +ABBREVS["bsansone"] = "𝟭" +ABBREVS["scrl"] = "𝓁" +ABBREVS["bbO"] = "𝕆" +ABBREVS["therefore"] = "∴" +ABBREVS["leftarrowtail"] = "↢" +ABBREVS["scre"] = "ℯ" +ABBREVS["smallni"] = "∍" +ABBREVS["rightanglearc"] = "⊾" +ABBREVS["measuredangle"] = "∡" +ABBREVS["iti"] = "𝑖" +ABBREVS["LeftTeeVector"] = "⥚" +ABBREVS["bfrakK"] = "𝕶" +ABBREVS["bisansvarphi"] = "𝟇" +ABBREVS["sansk"] = "𝗄" +ABBREVS["blkvertoval"] = "⬮" +ABBREVS["scrr"] = "𝓇" +ABBREVS["bisansPi"] = "𝞟" +ABBREVS["longleftarrow"] = "⟵" +ABBREVS["reglst"] = "ʕ" +ABBREVS["dj"] = "đ" +ABBREVS["downzigzagarrow"] = "↯" +ABBREVS["supedot"] = "⫄" +ABBREVS["biW"] = "𝑾" +ABBREVS["ppprime"] = "‴" +ABBREVS["biX"] = "𝑿" +ABBREVS["scrd"] = "𝒹" +ABBREVS["intprod"] = "⨼" +ABBREVS["notgreaterless"] = "≹" +ABBREVS["frakn"] = "𝔫" +ABBREVS["mdsmblksquare"] = "◾" +ABBREVS["bsansg"] = "𝗴" +ABBREVS["whitepointerleft"] = "◅" +ABBREVS["bfomega"] = "𝛚" +ABBREVS["bsansnine"] = "𝟵" +ABBREVS["^A"] = "ᴬ" +ABBREVS["bisansxi"] = "𝞷" +ABBREVS["_5"] = "₅" +ABBREVS["scrF"] = "ℱ" +ABBREVS["measangleurtone"] = "⦬" +ABBREVS["bscrI"] = "𝓘" +ABBREVS["3/8"] = "⅜" +ABBREVS["biy"] = "𝒚" +ABBREVS["bisansz"] = "𝙯" +ABBREVS["rtlr"] = "ɽ" +ABBREVS["subsub"] = "⫕" +ABBREVS["frakz"] = "𝔷" +ABBREVS["sansQ"] = "𝖰" +ABBREVS["strns"] = "⏤" +ABBREVS["gtrsim"] = "≳" +ABBREVS["uparrowbarred"] = "⤉" +ABBREVS["^Phi"] = "ᶲ" +ABBREVS["bidelta"] = "𝜹" +ABBREVS["adots"] = "⋰" +ABBREVS["downdasharrow"] = "⇣" +ABBREVS["rho"] = "ρ" +ABBREVS["dh"] = "ð" +ABBREVS["bscrK"] = "𝓚" +ABBREVS["gla"] = "⪥" +ABBREVS["itxi"] = "𝜉" +ABBREVS["bfpi"] = "𝛑" +ABBREVS["bfthree"] = "𝟑" +ABBREVS["mdsmwhtcircle"] = "⚬" +ABBREVS["bfEta"] = "𝚮" +ABBREVS["eqdot"] = "⩦" +ABBREVS["bfrakh"] = "𝖍" +ABBREVS["emptysetobar"] = "⦱" +ABBREVS["ittau"] = "𝜏" +ABBREVS["leftthreetimes"] = "⋋" +ABBREVS["bfrakc"] = "𝖈" +ABBREVS["jupiter"] = "♃" +ABBREVS["tta"] = "𝚊" +ABBREVS["_a"] = "ₐ" +ABBREVS["biPsi"] = "𝜳" +ABBREVS["bsansPsi"] = "𝝭" +ABBREVS["bumpeq"] = "≏" +ABBREVS["oiint"] = "∯" +ABBREVS["bigblacktriangledown"] = "▼" +ABBREVS["dotplus"] = "∔" +ABBREVS["bbS"] = "𝕊" +ABBREVS["opluslhrim"] = "⨭" +ABBREVS["searrow"] = "↘" +ABBREVS["mdwhtdiamond"] = "⬦" +ABBREVS["nvtwoheadrightarrow"] = "⤀" +ABBREVS["bfrakj"] = "𝖏" +ABBREVS["biDelta"] = "𝜟" +ABBREVS["itT"] = "𝑇" +ABBREVS["scrh"] = "𝒽" +ABBREVS["diamondtopblack"] = "⬘" +ABBREVS["diceii"] = "⚁" +ABBREVS["ttE"] = "𝙴" +ABBREVS["cirfl"] = "◐" +ABBREVS["bbj"] = "𝕛" +ABBREVS["bfA"] = "𝐀" +ABBREVS["bsansa"] = "𝗮" +ABBREVS["VDash"] = "⊫" +ABBREVS["upomicron"] = "ο" +ABBREVS["bscro"] = "𝓸" +ABBREVS["bsansT"] = "𝗧" +ABBREVS["bisansC"] = "𝘾" +ABBREVS["frakV"] = "𝔙" +ABBREVS["rsqhook"] = "⫎" +ABBREVS["palh"] = "̡" +ABBREVS["longleftsquigarrow"] = "⬳" +ABBREVS["trnm"] = "ɯ" +ABBREVS["^6"] = "⁶" +ABBREVS["boxdiag"] = "⧄" +ABBREVS["bic"] = "𝒄" +ABBREVS["bscry"] = "𝔂" +ABBREVS["quotedblright"] = "”" +ABBREVS["upsampi"] = "ϡ" +ABBREVS["bfrakD"] = "𝕯" +ABBREVS["itDelta"] = "𝛥" +ABBREVS["itKappa"] = "𝛫" +ABBREVS["linefeed"] = "↴" +ABBREVS["ttJ"] = "𝙹" +ABBREVS["geqqslant"] = "⫺" +ABBREVS["varsigma"] = "ς" +ABBREVS["bfrakO"] = "𝕺" +ABBREVS["bisanseta"] = "𝞰" +ABBREVS["dyogh"] = "ʤ" +ABBREVS["bsansfour"] = "𝟰" +ABBREVS["^y"] = "ʸ" +ABBREVS["mdblksquare"] = "◼" +ABBREVS["binabla"] = "𝜵" +ABBREVS["bisansupsilon"] = "𝞾" +ABBREVS["scrB"] = "ℬ" +ABBREVS["rtls"] = "ʂ" +ABBREVS["sqrint"] = "⨖" +ABBREVS["itQ"] = "𝑄" +ABBREVS["bfPi"] = "𝚷" +ABBREVS["nu"] = "ν" +ABBREVS["leftrightharpoons"] = "⇋" +ABBREVS["preccurlyeq"] = "≼" +ABBREVS["ddots"] = "⋱" +ABBREVS["nvrightarrowtail"] = "⤔" +ABBREVS["bipartial"] = "𝝏" +ABBREVS["flat"] = "♭" +ABBREVS["otimes"] = "⊗" +ABBREVS["bfE"] = "𝐄" +ABBREVS["lnapprox"] = "⪉" +ABBREVS["npolint"] = "⨔" +ABBREVS["bfM"] = "𝐌" +ABBREVS["bscre"] = "𝓮" +ABBREVS["sansu"] = "𝗎" +ABBREVS["astrosun"] = "☉" +ABBREVS["_t"] = "ₜ" +ABBREVS["itTheta"] = "𝛩" +ABBREVS["bichi"] = "𝝌" +ABBREVS["vartriangleleft"] = "⊲" +ABBREVS["bisansiota"] = "𝞲" +ABBREVS["simplus"] = "⨤" +ABBREVS["NotSquareSuperset"] = "⊐̸" +ABBREVS["scrS"] = "𝒮" +ABBREVS["bsansEpsilon"] = "𝝚" +ABBREVS["bisansEpsilon"] = "𝞔" +ABBREVS["bsanszeta"] = "𝝵" +ABBREVS["ltlmr"] = "ɱ" +ABBREVS["Psi"] = "Ψ" +ABBREVS["upvarbeta"] = "ϐ" +ABBREVS["bisansomicron"] = "𝞸" +ABBREVS["squareurblack"] = "⬔" +ABBREVS["mdlgblkcircle"] = "●" +ABBREVS["scrb"] = "𝒷" +ABBREVS["RightDownVectorBar"] = "⥕" +ABBREVS["odiv"] = "⨸" +ABBREVS["late"] = "⪭" +ABBREVS["ominus"] = "⊖" +ABBREVS["bscrt"] = "𝓽" +ABBREVS["bbm"] = "𝕞" +ABBREVS["grave"] = "̀" +ABBREVS["odotslashdot"] = "⦼" +ABBREVS["scrv"] = "𝓋" +ABBREVS["sansD"] = "𝖣" +ABBREVS["bbq"] = "𝕢" +ABBREVS["rightpentagonblack"] = "⭓" +ABBREVS["isinobar"] = "⋷" +ABBREVS["bsansepsilon"] = "𝝴" +ABBREVS["eqeqeq"] = "⩶" +ABBREVS["bfone"] = "𝟏" +ABBREVS["neuter"] = "⚲" +ABBREVS["lesges"] = "⪓" +ABBREVS["bowtie"] = "⋈" +ABBREVS["frakH"] = "ℌ" +ABBREVS["squareulblack"] = "◩" +ABBREVS["bbU"] = "𝕌" +ABBREVS["prod"] = "∏" +ABBREVS["bfraku"] = "𝖚" +ABBREVS["isansn"] = "𝘯" +ABBREVS["leftharpoonsupdown"] = "⥢" +ABBREVS["biUpsilon"] = "𝜰" +ABBREVS["lgblksquare"] = "⬛" +ABBREVS["sansn"] = "𝗇" +ABBREVS["downwhitearrow"] = "⇩" +ABBREVS["big"] = "𝒈" +ABBREVS["succcurlyeq"] = "≽" +ABBREVS["geqslant"] = "⩾" +ABBREVS["^c"] = "ᶜ" +ABBREVS["bscrw"] = "𝔀" +ABBREVS["awint"] = "⨑" +ABBREVS["scrW"] = "𝒲" +ABBREVS["LeftDownVectorBar"] = "⥙" +ABBREVS["_)"] = "₎" +ABBREVS["not"] = "̸" +ABBREVS["frako"] = "𝔬" +ABBREVS["bisanspsi"] = "𝟁" +ABBREVS["bigoplus"] = "⨁" +ABBREVS["circledequal"] = "⊜" +ABBREVS["veeeq"] = "≚" +ABBREVS["rightanglemdot"] = "⦝" +ABBREVS["biAlpha"] = "𝜜" +ABBREVS["itPi"] = "𝛱" +ABBREVS["ohm"] = "Ω" +ABBREVS["nsucceq"] = "⪰̸" +ABBREVS["obslash"] = "⦸" +ABBREVS["bsansd"] = "𝗱" +ABBREVS["^K"] = "ᴷ" +ABBREVS["H"] = "̋" +ABBREVS["bsansvarsigma"] = "𝞁" +ABBREVS["bisanschi"] = "𝟀" +ABBREVS["2/3"] = "⅔" +ABBREVS["squarellquad"] = "◱" +ABBREVS["bfR"] = "𝐑" +ABBREVS["upstigma"] = "ϛ" +ABBREVS["digamma"] = "ϝ" +ABBREVS["bsanseta"] = "𝝶" +ABBREVS["sansV"] = "𝖵" +ABBREVS["bisansPhi"] = "𝞥" +ABBREVS["vartriangleright"] = "⊳" +ABBREVS["bisansBeta"] = "𝞑" +ABBREVS["nsupseteqq"] = "⫆̸" +ABBREVS["bfrakr"] = "𝖗" +ABBREVS["bisansUpsilon"] = "𝞤" +ABBREVS["subsup"] = "⫓" +ABBREVS["NestedLessLess"] = "⪡" +ABBREVS["bfseven"] = "𝟕" +ABBREVS["biT"] = "𝑻" +ABBREVS["o"] = "ø" +ABBREVS["divideontimes"] = "⋇" +ABBREVS["bixi"] = "𝝃" +ABBREVS["triangleright"] = "▷" +ABBREVS["bfw"] = "𝐰" +ABBREVS["bbG"] = "𝔾" +ABBREVS["disin"] = "⋲" +ABBREVS["gsime"] = "⪎" +ABBREVS["NotNestedGreaterGreater"] = "⪢̸" +ABBREVS["jmath"] = "ȷ" +ABBREVS["lgwhtcircle"] = "◯" +ABBREVS["blackinwhitesquare"] = "▣" +ABBREVS["bbE"] = "𝔼" +ABBREVS["diagdown"] = "╲" +ABBREVS["doteq"] = "≐" +ABBREVS["bfraky"] = "𝖞" +ABBREVS["bsansgamma"] = "𝝲" +ABBREVS["geq"] = "≥" +ABBREVS["ttS"] = "𝚂" +ABBREVS["bigslopedwedge"] = "⩘" +ABBREVS["supsup"] = "⫖" +ABBREVS["upint"] = "⨛" +ABBREVS["urarc"] = "◝" +ABBREVS["bscrT"] = "𝓣" +ABBREVS["bigcup"] = "⋃" +ABBREVS["simeq"] = "≃" +ABBREVS["vysmblkcircle"] = "∙" +ABBREVS["bbL"] = "𝕃" +ABBREVS["gvertneqq"] = "≩︀" +ABBREVS["bsansr"] = "𝗿" +ABBREVS["bfKappa"] = "𝚱" +ABBREVS["rightarrowtail"] = "↣" +ABBREVS["bisanstheta"] = "𝞱" +ABBREVS["diceiii"] = "⚂" +ABBREVS["bis"] = "𝒔" +ABBREVS["bfrakp"] = "𝖕" +ABBREVS["^chi"] = "ᵡ" +ABBREVS["multimap"] = "⊸" +ABBREVS["triangleleftblack"] = "◭" +ABBREVS["Delta"] = "Δ" +ABBREVS["varhexagonblack"] = "⬢" +ABBREVS["bfT"] = "𝐓" +ABBREVS["llarc"] = "◟" +ABBREVS["bscri"] = "𝓲" +ABBREVS["iff"] = "⟺" +ABBREVS["Rho"] = "Ρ" +ABBREVS["leqqslant"] = "⫹" +ABBREVS["lllnest"] = "⫷" +ABBREVS["bfh"] = "𝐡" +ABBREVS["backprime"] = "‵" +ABBREVS["bfj"] = "𝐣" +ABBREVS["isansm"] = "𝘮" +ABBREVS["topsemicircle"] = "◠" +ABBREVS["itpartial"] = "𝜕" +ABBREVS["lambda"] = "λ" +ABBREVS["highminus"] = "¯" +ABBREVS["LeftDownTeeVector"] = "⥡" +ABBREVS["ttt"] = "𝚝" +ABBREVS["itR"] = "𝑅" +ABBREVS["starequal"] = "≛" +ABBREVS["blanksymbol"] = "␢" +ABBREVS["nvLeftarrow"] = "⤂" +ABBREVS["triangledown"] = "▿" +ABBREVS["bisansZeta"] = "𝞕" +ABBREVS["circlearrowright"] = "↻" +ABBREVS["frakZ"] = "ℨ" +ABBREVS["closedvarcap"] = "⩍" +ABBREVS["itd"] = "𝑑" +ABBREVS["scrp"] = "𝓅" +ABBREVS["bfrakT"] = "𝕿" +ABBREVS["pbgam"] = "ɤ" +ABBREVS["isindot"] = "⋵" +ABBREVS["blacktriangleleft"] = "◀" +ABBREVS["bscrG"] = "𝓖" +ABBREVS["bfrakb"] = "𝖇" +ABBREVS["succnsim"] = "⋩" +ABBREVS["eqqless"] = "⪙" +ABBREVS["bfn"] = "𝐧" +ABBREVS["bfrakl"] = "𝖑" +ABBREVS["cong"] = "≅" +ABBREVS["sansX"] = "𝖷" +ABBREVS["bisansb"] = "𝙗" +ABBREVS["iteta"] = "𝜂" +ABBREVS["varsupsetneq"] = "⊋︀" +ABBREVS["bsanssigma"] = "𝞂" +ABBREVS["bsansPhi"] = "𝝫" +ABBREVS["isansk"] = "𝘬" +ABBREVS["pppprime"] = "⁗" +ABBREVS["bsansw"] = "𝘄" +ABBREVS["bisanss"] = "𝙨" +ABBREVS["low"] = "˕" +ABBREVS["eqvparsl"] = "⧥" +ABBREVS["medwhitestar"] = "⭐" +ABBREVS["quad"] = " " +ABBREVS["eqqgtr"] = "⪚" +ABBREVS["measangleultonw"] = "⦭" +ABBREVS["bigsqcap"] = "⨅" +ABBREVS["supsub"] = "⫔" +ABBREVS["sun"] = "☼" +ABBREVS["bfI"] = "𝐈" +ABBREVS["isansb"] = "𝘣" +ABBREVS["ity"] = "𝑦" +ABBREVS["ltln"] = "ɲ" +ABBREVS["lazysinv"] = "∾" +ABBREVS["RightTriangleBar"] = "⧐" +ABBREVS["rh"] = "̢" +ABBREVS["asteq"] = "⩮" +ABBREVS["Subset"] = "⋐" +ABBREVS["itV"] = "𝑉" +ABBREVS["vysmwhtsquare"] = "⬞" +ABBREVS["bsansbeta"] = "𝝱" +ABBREVS["biE"] = "𝑬" +ABBREVS["Rlarr"] = "⥂" +ABBREVS["leftmoon"] = "☾" +ABBREVS["_+"] = "₊" +ABBREVS["bisansGamma"] = "𝞒" +ABBREVS["bfY"] = "𝐘" +ABBREVS["sqcap"] = "⊓" +ABBREVS["succnapprox"] = "⪺" +ABBREVS["nleq"] = "≰" +ABBREVS["bbsix"] = "𝟞" +ABBREVS["bfW"] = "𝐖" +ABBREVS["biPhi"] = "𝜱" +ABBREVS["pprime"] = "″" +ABBREVS["bfO"] = "𝐎" +ABBREVS["vee"] = "∨" +ABBREVS["bivarkappa"] = "𝝒" +ABBREVS["bbe"] = "𝕖" +ABBREVS["^s"] = "ˢ" +ABBREVS["frakv"] = "𝔳" +ABBREVS["isansf"] = "𝘧" +ABBREVS["ttL"] = "𝙻" +ABBREVS["^9"] = "⁹" +ABBREVS["approxeq"] = "≊" +ABBREVS["RightTeeVector"] = "⥛" +ABBREVS["_h"] = "ₕ" +ABBREVS["ttR"] = "𝚁" +ABBREVS["rightharpoonup"] = "⇀" +ABBREVS["dlcorn"] = "⎣" +ABBREVS["rightarrowbar"] = "⇥" +ABBREVS["hermitconjmatrix"] = "⊹" +ABBREVS["notslash"] = "⌿" +ABBREVS["rightarrow"] = "→" +ABBREVS["bisigma"] = "𝝈" +ABBREVS["upand"] = "⅋" +ABBREVS["frakB"] = "𝔅" +ABBREVS["geqq"] = "≧" +ABBREVS["rightpentagon"] = "⭔" +ABBREVS["Mapsfrom"] = "⤆" +ABBREVS["itB"] = "𝐵" +ABBREVS["circletophalfblack"] = "◓" +ABBREVS["rmoustache"] = "⎱" +ABBREVS["u"] = "˘" +ABBREVS["bbpi"] = "ℼ" +ABBREVS["intBar"] = "⨎" +ABBREVS["Epsilon"] = "Ε" +ABBREVS["1/10"] = "⅒" +ABBREVS["1/3"] = "⅓" +ABBREVS["leftrightharpoondownup"] = "⥋" +ABBREVS["rightharpoonaccent"] = "⃑" +ABBREVS["itJ"] = "𝐽" +ABBREVS["_l"] = "ₗ" +ABBREVS["RightDownTeeVector"] = "⥝" +ABBREVS["viewdata"] = "⌗" +ABBREVS["overbar"] = "̅" +ABBREVS["bisansw"] = "𝙬" +ABBREVS["mu"] = "μ" +ABBREVS["sansI"] = "𝖨" +ABBREVS["ttv"] = "𝚟" +ABBREVS["diamondleftarrowbar"] = "⤟" +ABBREVS["bisansO"] = "𝙊" +ABBREVS["zeta"] = "ζ" +ABBREVS["1/7"] = "⅐" +ABBREVS["diamondrightblack"] = "⬗" +ABBREVS["bbPi"] = "ℿ" +ABBREVS["bfx"] = "𝐱" +ABBREVS["exclamdown"] = "¡" +ABBREVS["biRho"] = "𝜬" +ABBREVS["itv"] = "𝑣" +ABBREVS["gneq"] = "⪈" +ABBREVS["itn"] = "𝑛" +ABBREVS["curvearrowleft"] = "↶" +ABBREVS["nlesssim"] = "≴" +ABBREVS["frakp"] = "𝔭" +ABBREVS["mercury"] = "☿" +ABBREVS["^O"] = "ᴼ" +ABBREVS["lpargt"] = "⦠" +ABBREVS["le"] = "≤" +ABBREVS["bscrF"] = "𝓕" +ABBREVS["leftcurvedarrow"] = "⬿" +ABBREVS["bscrm"] = "𝓶" +ABBREVS["bfD"] = "𝐃" +ABBREVS["isansW"] = "𝘞" +ABBREVS["^7"] = "⁷" +ABBREVS["tttwo"] = "𝟸" +ABBREVS["bfupsilon"] = "𝛖" +ABBREVS["hermaphrodite"] = "⚥" +ABBREVS["candra"] = "̐" +ABBREVS["triangleplus"] = "⨹" +ABBREVS["ulcorner"] = "⌜" +ABBREVS["bbI"] = "𝕀" +ABBREVS["hbar"] = "ħ" +ABBREVS["itZ"] = "𝑍" +ABBREVS["sansP"] = "𝖯" +ABBREVS["bffour"] = "𝟒" +ABBREVS["tteight"] = "𝟾" +ABBREVS["varepsilon"] = "ε" +ABBREVS["tty"] = "𝚢" +ABBREVS["bsansTau"] = "𝝩" +ABBREVS["bisanslambda"] = "𝞴" +ABBREVS["yogh"] = "ʒ" +ABBREVS["bsansi"] = "𝗶" +ABBREVS["glst"] = "ʔ" +ABBREVS["intprodr"] = "⨽" +ABBREVS["annuity"] = "⃧" +ABBREVS["bsimilarrightarrow"] = "⭇" +ABBREVS["sanssix"] = "𝟨" +ABBREVS["blackrighthalfcircle"] = "◗" +ABBREVS["downarrow"] = "↓" +ABBREVS["eulermascheroni"] = "ℇ" +ABBREVS["minusdot"] = "⨪" +ABBREVS["revangle"] = "⦣" +ABBREVS["gtrdot"] = "⋗" +ABBREVS["circledR"] = "®" +ABBREVS["nVdash"] = "⊮" +ABBREVS["downarrowbarred"] = "⤈" +ABBREVS["veeodot"] = "⩒" +ABBREVS["leq"] = "≤" +ABBREVS["sansC"] = "𝖢" +ABBREVS["biupsilon"] = "𝝊" +ABBREVS["nsime"] = "≄" +ABBREVS["parallel"] = "∥" +ABBREVS["squarehfill"] = "▤" +ABBREVS["NotRightTriangleBar"] = "⧐̸" +ABBREVS["scru"] = "𝓊" +ABBREVS["Digamma"] = "Ϝ" +ABBREVS["bsansSigma"] = "𝝨" +ABBREVS["PropertyLine"] = "⅊" +ABBREVS["leftleftarrows"] = "⇇" +ABBREVS["nvDash"] = "⊭" +ABBREVS["frakm"] = "𝔪" +ABBREVS["bfC"] = "𝐂" +ABBREVS["verti"] = "ˌ" +ABBREVS["Rrightarrow"] = "⇛" +ABBREVS["eqless"] = "⋜" +ABBREVS["itsigma"] = "𝜎" +ABBREVS["bsansphi"] = "𝞅" +ABBREVS["toea"] = "⤨" +ABBREVS["itf"] = "𝑓" +ABBREVS["bbc"] = "𝕔" +ABBREVS["frakd"] = "𝔡" +ABBREVS["seovnearrow"] = "⤭" +ABBREVS["openo"] = "ɔ" +ABBREVS["gneqq"] = "≩" +ABBREVS["updasharrow"] = "⇡" +ABBREVS["bisansP"] = "𝙋" +ABBREVS["bsansx"] = "𝘅" +ABBREVS["^-"] = "⁻" +ABBREVS["dingasterisk"] = "✽" +ABBREVS["sansz"] = "𝗓" +ABBREVS["bfRho"] = "𝚸" +ABBREVS["1/4"] = "¼" +ABBREVS["ttZ"] = "𝚉" +ABBREVS["oplus"] = "⊕" +ABBREVS["rceil"] = "⌉" +ABBREVS["lesdoto"] = "⪁" +ABBREVS["uminus"] = "⩁" +ABBREVS["leftarrowonoplus"] = "⬲" +ABBREVS["ttV"] = "𝚅" +ABBREVS["bivarphi"] = "𝝓" +ABBREVS["itH"] = "𝐻" +ABBREVS["updownarrow"] = "↕" +ABBREVS["itG"] = "𝐺" +ABBREVS["sansW"] = "𝖶" +ABBREVS["cup"] = "∪" +ABBREVS["upin"] = "⟒" +ABBREVS["ringplus"] = "⨢" +ABBREVS["lsimg"] = "⪏" +ABBREVS["itm"] = "𝑚" +ABBREVS["itbeta"] = "𝛽" +ABBREVS["Or"] = "⩔" +ABBREVS["longrightsquigarrow"] = "⟿" +ABBREVS["rdiagovsearrow"] = "⤰" +ABBREVS["gtcir"] = "⩺" +ABBREVS["_e"] = "ₑ" +ABBREVS["lsqhook"] = "⫍" +ABBREVS["tesh"] = "ʧ" +ABBREVS["bscrp"] = "𝓹" +ABBREVS["varkappa"] = "ϰ" +ABBREVS["bbP"] = "ℙ" +ABBREVS["bbr"] = "𝕣" +ABBREVS["cbrt"] = "∛" +ABBREVS["trianglerighteq"] = "⊵" +ABBREVS["biF"] = "𝑭" +ABBREVS["emptysetocirc"] = "⦲" +ABBREVS["Coloneq"] = "⩴" +ABBREVS["scrG"] = "𝒢" +ABBREVS["euler"] = "ℯ" +ABBREVS["bscru"] = "𝓾" +ABBREVS["sansd"] = "𝖽" +ABBREVS["AA"] = "Å" +ABBREVS["frakj"] = "𝔧" +ABBREVS["bfalpha"] = "𝛂" +ABBREVS["biOmicron"] = "𝜪" +ABBREVS["bisansphi"] = "𝞿" +ABBREVS["ttone"] = "𝟷" +ABBREVS["_("] = "₍" +ABBREVS["bfB"] = "𝐁" +ABBREVS["exists"] = "∃" +ABBREVS["fhr"] = "ɾ" +ABBREVS["bscrJ"] = "𝓙" +ABBREVS["Uuparrow"] = "⤊" +ABBREVS["biMu"] = "𝜧" +ABBREVS["bsansomicron"] = "𝝾" +ABBREVS["thickspace"] = " " +ABBREVS["endash"] = "–" +ABBREVS["sansU"] = "𝖴" +ABBREVS["bisansN"] = "𝙉" +ABBREVS["blackcircleulquadwhite"] = "◕" +ABBREVS["ttl"] = "𝚕" +ABBREVS["bisansvartheta"] = "𝟅" +ABBREVS["bsansQ"] = "𝗤" +ABBREVS["bizeta"] = "𝜻" +ABBREVS["bsansvarTheta"] = "𝝧" +ABBREVS["bbsemi"] = "⨟" +ABBREVS["gesdoto"] = "⪂" +ABBREVS["bieta"] = "𝜼" +ABBREVS["oslash"] = "⊘" +ABBREVS["itZeta"] = "𝛧" +ABBREVS["itEpsilon"] = "𝛦" +ABBREVS["smt"] = "⪪" +ABBREVS["scrP"] = "𝒫" +ABBREVS["bscrb"] = "𝓫" +ABBREVS["sansp"] = "𝗉" +ABBREVS["trna"] = "ɐ" +ABBREVS["itY"] = "𝑌" +ABBREVS["bisanse"] = "𝙚" +ABBREVS["wideangledown"] = "⦦" +ABBREVS["bsanszero"] = "𝟬" +ABBREVS["bby"] = "𝕪" +ABBREVS["sblhr"] = "˓" +ABBREVS["simminussim"] = "⩬" +ABBREVS["subsetdot"] = "⪽" +ABBREVS["turnediota"] = "℩" +ABBREVS["bsansA"] = "𝗔" +ABBREVS["join"] = "⨝" +ABBREVS["bscrj"] = "𝓳" +ABBREVS["bot"] = "⊥" +ABBREVS["scrD"] = "𝒟" +ABBREVS["frakP"] = "𝔓" +ABBREVS["gnsim"] = "⋧" +ABBREVS["Chi"] = "Χ" +ABBREVS["biO"] = "𝑶" +ABBREVS["sqfl"] = "◧" +ABBREVS["vertoverlay"] = "⃒" +ABBREVS["tripleplus"] = "⧻" +ABBREVS["nabla"] = "∇" +ABBREVS["scrX"] = "𝒳" +ABBREVS["_m"] = "ₘ" +ABBREVS["models"] = "⊧" +ABBREVS["lneqq"] = "≨" +ABBREVS["trnrl"] = "ɺ" +ABBREVS["Cup"] = "⋓" +ABBREVS["propto"] = "∝" +ABBREVS["rtln"] = "ɳ" +ABBREVS["bbx"] = "𝕩" +ABBREVS["bfPsi"] = "𝚿" +ABBREVS["ite"] = "𝑒" +ABBREVS["biomega"] = "𝝎" +ABBREVS["bbij"] = "ⅉ" +ABBREVS["ttF"] = "𝙵" +ABBREVS["rq"] = "’" +ABBREVS["mlcp"] = "⫛" +ABBREVS["leftsquigarrow"] = "⇜" +ABBREVS["bsansy"] = "𝘆" + + + +local lastBackslashX = -1 +local lastBackslashY = -1 + +function cplen(c) + if c >= 192 and c < 224 then + return 2 + elseif c >= 224 and c < 240 then + return 3 + elseif c >= 240 and c < 248 then + return 4 + end + return 1 +end + +-- 1-based, [b, e] inclusive range +function utf8substring(s, b, e) + local accum = "" + local pos = 1 + local i = 1 + + while i <= #s do + local c = string.byte(string.sub(s, i, i)) + + if pos > e then + break + end + + if pos >= b then + accum = accum .. string.sub(s, i, i + cplen(c) - 1) + end + + i = i + cplen(c) + pos = pos + 1 + end + + return accum +end + +function abbrevCompleter(buf) + local cur = buf:GetActiveCursor() + + local completions = {} + local suggestions = {} + + if lastBackslashX ~= -1 and cur.X - lastBackslashX > 0 and lastBackslashY == cur.Y then + local curLine = buf:Line(cur.Y) + local abbrev = utf8substring(curLine, lastBackslashX + 1, cur.X) + + for a, s in pairs(ABBREVS) do + local i, j = string.find(a, abbrev, 1, true) + if i == 1 then + suggestions[#suggestions+1] = a + completions[#completions+1] = string.sub(a, j + 1) + end + end + end + + return completions, suggestions +end + +function onRune(bp, r) + if r == "\\" then + lastBackslashX = bp.Cursor.X + lastBackslashY = bp.Cursor.Y + elseif lastBackslashX == bp.Cursor.X then + lastBackslashX = lastBackslashX + 1 + end +end + +function preInsertTab(bp) + if lastBackslashX ~= -1 and bp.Cursor.X - lastBackslashX > 0 and lastBackslashY == bp.Cursor.Y then + local curLine = bp.Buf:Line(bp.Cursor.Y) + local abbrev = utf8substring(curLine, lastBackslashX + 1, bp.Cursor.X) + local substitution = ABBREVS[abbrev] + + if substitution ~= nil then + local abbrevlen = bp.Cursor.X - lastBackslashX + + -- +1 for the backslash + for i = 1,abbrevlen+1 do + bp:Backspace() + end + + -- the `-` is here to dereference a pointer, blah blah + -- look at the autoclose plugin (autoclose.lua, line 32) + bp.Buf:Insert(-bp.Cursor.Loc, substitution) + + return false + else + if bp.Buf:Autocomplete(abbrevCompleter) then + return false + end + end + end + return true +end diff --git a/.config/micro/plug/jlabbrev/repo.json b/.config/micro/plug/jlabbrev/repo.json new file mode 100644 index 0000000..91f9c82 --- /dev/null +++ b/.config/micro/plug/jlabbrev/repo.json @@ -0,0 +1,19 @@ +[{ + "Name": "jlabbrev", + "Description": "Julia backslash abbreviations in micro", + "Website": "https://github.com/MasFlam/jlabbrev", + "Tags": ["julia", "util"], + "Versions": [{ + "Version": "1.0.0", + "Url": "https://github.com/MasFlam/jlabbrev/archive/v1.0.0.zip", + "Require": { + "micro": ">=2.0" + } + }, { + "Version": "1.0.1", + "Url": "https://github.com/MasFlam/jlabbrev/archive/v1.0.1.zip", + "Require": { + "micro": ">=2.0" + } + }] +}] diff --git a/.config/micro/plug/lsp/LICENSE b/.config/micro/plug/lsp/LICENSE new file mode 100644 index 0000000..62df372 --- /dev/null +++ b/.config/micro/plug/lsp/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Robert Kunze + +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. diff --git a/.config/micro/plug/lsp/README.md b/.config/micro/plug/lsp/README.md new file mode 100644 index 0000000..758ac8b --- /dev/null +++ b/.config/micro/plug/lsp/README.md @@ -0,0 +1,93 @@ +# Micro Plugin LSP Client + +**Please note:** This software is very much not finished. It is more like a +proof of concept and might break if you call it names. + +Provides LSP methods as actions to Micro that can subsequently be mapped to key +bindings. + +Currently implemented methods: + +- textDocument/hover +- textDocument/definition +- textDocument/completion +- textDocument/formatting +- textDocument/references + +If possible, this plugin will register the following shortcuts: + +- Alt-k for hover +- Alt-d for definition lookup +- Alt-f for formatting +- Alt-r for looking up references +- Ctrl-space for completion + +## Installation + +Clone this repo into micro's plug folder: + +``` +$ git clone https://github.com/AndCake/micro-plugin-lsp ~/.config/micro/plug/lsp +``` + +## Configuration + +In your `settings.json`, you add the `lsp.server` option in order to enable +using it for your languages' server. + +Example: + +``` +{ + "lsp.server": "python=pyls,go=gopls,typescript=deno lsp,rust=rls", + "lsp.formatOnSave": true, + "lsp.ignoreMessages": "LS message1 to ignore|LS message 2 to ignore|...", + "lsp.tabcompletion": true, + "lsp.ignoreTriggerCharacters": "completion,signature", + "lsp.autocompleteDetails": false +} +``` + +The format for the `lsp.server` value is a comma-separated list for each file +type you want to boot up a language server: + +``` +=[=][,...] +``` + +You can also use an environment variable called `MICRO_LSP` to define the same +information. If set, it will override the `lsp.server` from the `settings.json`. +You can add a line such as the following to your shell profile (e.g. .bashrc): + +``` +export MICRO_LSP='python=pyls,go=gopls,typescript=deno lsp={"importMap":"import_map.json"},rust=rls' +``` + +If neither the MICRO_LSP nor the lsp.server is set, then the plugin falls back +to the following settings: + +``` +python=pylsp,go=gopls,typescript=deno lsp,javascript=deno lsp,markdown=deno lsp,json=deno lsp,jsonc=deno lsp,rust=rls,lua=lua-lsp,c++=clangd +``` + +The option `lsp.autocompleteDetails` allows for showing all auto-completions in +a horizontally split buffer view (true) instead of the status line (false). + +## Testing + +This plugin has been tested briefly with the following language servers: + +- C++ [clangd](https://clangd.llvm.org) / + [ccls](https://github.com/MaskRay/ccls) +- go: [gopls](https://pkg.go.dev/golang.org/x/tools/gopls#section-readme) +- markdown, JSON, typescript, javascript (including JSX/TSX): + [deno](https://deno.land/) +- python: pyls, [pylsp](https://github.com/python-lsp/python-lsp-server) +- rust: [rls](https://github.com/rust-lang/rls) +- lua: [lua-lsp](https://github.com/Alloyed/lua-lsp) +- zig: [zls](https://github.com/zigtools/zls) + +## Known issues + +Not all possible types of modification events to the file are currently being +sent to the language server. Saving the file will re-synchronize it, though. diff --git a/.config/micro/plug/lsp/help/lsp.md b/.config/micro/plug/lsp/help/lsp.md new file mode 100644 index 0000000..dfc148a --- /dev/null +++ b/.config/micro/plug/lsp/help/lsp.md @@ -0,0 +1,315 @@ +# Micro Plugin LSP Client + +LSP is a Language Server Protocol client. Features include function signatures +and jump to definition. + +This help page can be viewed in Micro editor with Ctrl-E 'help lsp' + +## Features and Shortcuts + +- Show function signature on status bar (alt-K) (textDocument/hover) +- Open function definition in a new tab (alt-D) (textDocument/definition) +- Format document (alt-F) (textDocument/formatting) +- Show references to the current symbol in a buffer (alt-R) + (textDocument/references), pressing return on the reference line, the + reference's location is opened in a new tab + +There is initial support for completion (ctrl-space) (textDocument/completion). + +## Supported languages + +Installation instructions for Go and Python are provided below. LSP Plugin has +been briefly tested with + +- C++: [clangd](https://clangd.llvm.org) / + [ccls](https://github.com/MaskRay/ccls) +- go: [gopls](https://pkg.go.dev/golang.org/x/tools/gopls#section-readme) +- markdown, JSON, typescript, javascript (including JSX/TSX): + [deno](https://deno.land/) +- python: pyls and [pylsp](https://github.com/python-lsp/python-lsp-server) +- rust: [rls](https://github.com/rust-lang/rls) +- lua: [lua-lsp](https://github.com/Alloyed/lua-lsp) + +## Install LSP plugin + + $ micro --plugin install lsp + +To configure the LSP Plugin, you can add two lines to settings.json + + $ micro settings.json + +Add lines + +```json +{ + "lsp.server": "python=pylsp,go=gopls,typescript=deno lsp={\"importMap\": \"./import_map.json\"}", + "lsp.formatOnSave": true +} +``` + +Remember to add comma to previous line. Depending on the language server, +automatic code formating can be quite opinionated. In that case, you can simply +set lsp.formatOnSave to false. + +For Python language server, the currently maintained fork is 'pylsp'. If you +wish to use the Palantir version (last updated in 2020) instead, set +"python=pyls" in lsp.server. + +If your lsp.server settings are autoremoved, you can + + $ export MICRO_LSP='python=pylsp,go=gopls,typescript=deno lsp={"importMap":"import_map.json"},rust=rls' + +The lsp.server default settings (if no others are defined) are: + +``` +python=pylsp,go=gopls,typescript=deno lsp,javascript=deno lsp,markdown=deno lsp,json=deno lsp,jsonc=deno lsp,rust=rls,lua=lua-lsp,c++=clangd +``` + +## Install Language Server + +To support each language, LSP plugin uses language servers. To use LSP plugin, +you must install at least one language server. + +If you want to quickly test LSP plugin, Go language server gopls is simple to +install. + +### gopls, Go language server + +You will need command 'gopls' + + $ gopls version + golang.org/x/tools/gopls v0.7.3 + +In Debian, this is installed with + + $ sudo apt-get update + $ sudo apt-get -y install golang-go gopls + +To test it, write a short go program + + $ micro hello.go + +```go +package main + +import "fmt" + +func main() { + fmt.Println("hello world") +} +``` + +Move cursor over Println and press alt-k. The function signature is shown on the +bottom of the screen, in Micro status bar. It shows you what parameters the +function can take. The signature should look similar to this: "func +fmt.Println(a ...interface{}) (n int, err error)Println formats using the +default formats..." + +Can you see the function signature with alt-k? If you can, you have succesfully +installed Micro LSP plugin and GoPLS language server. + +Keep your cursor over Println, and press alt-d. The file defining Println opens. +In this case, it's fmt/print.go. As Go reference documentation is in code +comments, this is very convenient. You can navigate between tabs with atl-, +(alt-comma) and alt-. (alt - full stop). To close the tab, press Ctrl-Q. + +### Markdown, JSON/JSONC, Typescript, Javascript + +The Deno LSP server will provide full support for Typescript and Javascript. +Additionally, it supports formatting for Markdown and JSON files. The +installation of this is fairly straight forward: + +On Mac/Linux: + + $ curl -fsSL https://deno.land/install.sh | sh + +On Powershell: + + $ iwr https://deno.land/install.ps1 -useb | iex + +### typescript-language-server + +This LSP server will allow for Javascript as well as Typescript support. For +using it, you first need to install it using NPM: + + $ npm install -g typescript-language-server typescript + +Once it has been installed, you can use it like so: + + $ micro hello.js + +Press ctrl-e and type in: + + set lsp.server "typescript=typescript-language-server --stdio,javascript=typescript-language-server --stdio" + +After you restarted micro, you can use the features for typescript and +javascript accordingly. + +### pylsp, Python language server + +Installing Python language server PyLSP is a bit more involved. + +You will need 'virtualenv' command to create virtual environments and 'pip' to +install Python packages. You can also use one of the many other commands for +keeping your 'pip' packages in order. + +In Debian, these are installed with + + $ sudo apt-get update + $ sudo apt-get install python-pip virtualenv + +Create a new virtual environment + + $ mkdir somePythonProject; cd somePythonProject + $ virtualenv -p python3 env/ + $ source env/bin/activate + +Your prompt likely shows "(env)" to confirm you're inside your virtual +environment. + +List the packages you want installed. + + $ micro requirements.txt + +This list is to provide the most useful suggestions. If you would like to get a +lot more opinionated advice, such as adding two empty lines between functions, +you could use "python-lsp-server[all]". The mypy package provides optional +static type checking. requirements.txt: + +``` +python-lsp-server[rope,pyflakes,mccabe,pylsp-mypy] +pylsp-mypy +``` + +And actually install + + $ pip install -r requirements.txt + +No you can test your Python environment + + $ micro hello.py + +```python +def helloWorld(): + return a +``` + +Save with Ctrl-S. A red warning sign ">>" lists up in the gutter, on the left +side of Micro. Move cursor to the line "return a". The status bar shows the +warning: "undefined name 'a'". Well done, you have now installed Python LSP +support for Micro. + +MyPy provides optional static type setting. You can write normally, and type +checking is ignored. You can define types for some functions, and you get +automatic warnings for incorrect use of types. This is how types are marked: + +```python +def square(x: int) -> int: + return x*x +``` + +Depending on your project, taste and installed linters, pylsp sometimes shows +warnings you would like to hide. Hiding messages is possible using +lsp.ignoreMessages, explained in later in this help document. + +### lua-lsp, Lua language server + +These are the initial installation instructions. This installation will support +linter messages in the gutter (on the left of editing area) and jump to +definition inside the same file (alt-D). All LSP features are not yet supported +with Lua. + +Install 'luarocks' command using your package manager. For example, on Debian + + $ sudo apt-get update + $ sudo apt-get -y install luarocks + +Use luarocks to install helper packages used by lua-lsp + + $ sudo luarocks install luacheck + $ sudo luarocks install Formatter + $ sudo luarocks install lcf + +Install lua-lsp, the Lua language server + + $ sudo luarocks install --server=ssh://luarocks.org/dev lua-lsp + +This command uses different URL from official lua-lsp instructions due to +[a change in how packages are downloaded](https://github.com/Alloyed/lua-lsp/issues/45). +This command uses ssh instead of http. + +To test it, open a Lua file + + $ micro $HOME/.config/micro/plug/lsp/main.lua + +Can you see some linter warnings ">>" in the gutter? Can you jump to functions +inside the same file with Alt-D? Well done, you've installed Lua LSP support for +micro. + +All features don't work yet with Lua LSP. + +### zls, ZIG language server + +The ZIG language server provides formatting, goto definition, auto-completion as +well as hover and references. It can be installed by following +[these instruction](https://github.com/zigtools/zls). + +Once installed, open micro, press ctrl+e and type the following command: + + set lsp.server zig=zls + +Close micro again and open a zig file. + +## Ignoring unhelpful messages + +In addition to providing assistance while coding, some language servers can show +spurious, unnecessary or too oppinionated messages. Sometimes, it's not obvious +how these messages are disable using language server settings. + +This plugin allows you to selectively ignore unwanted warnings while keeping +others. This is done my matching the start of the message. By default, nothing +is ignored. + +Consider a case where you're working with an external Python project that +indents with tabs. When joining an existing project, you might not want to +impose your own conventions to every code file. On the other hand, LSP support +is not useful if nearly every line is marked with a warning. + +Moving the cursor to a line with the warning, you see that the line starts with +"W191 indentation contains tabs". This, and similar unhelpful messages (in the +context of your current project) can be ignored by editing +~/.config/micro/settings.json + +```json +{ + "lsp.ignoreMessages": "Skipping analyzing |W191 indentation contains tabs|E101 indentation contains mixed spaces and tabs|See https://mypy.readthedocs.io/en" +} +``` + +As you now open the same file, you can see that warning "W191 indentation +contains tabs" is no longer shown. Also the warning mark ">>" in the gutter is +gone. Try referring to a variable that does not exist, and you can see a helpful +warning appear. You have now disabled the warnings you don't need, while keeping +the useful ones. + +## See also + +[Official repostory](https://github.com/AndCake/micro-plugin-lsp) + +[Usage examples with screenshots](https://terokarvinen.com/2022/micro-editor-lsp-support-python-and-go-jump-to-definition-show-function-signature/) + +[Language Server Protocol](https://microsoft.github.io/language-server-protocol/) + +[gopls - the Go language server](https://pkg.go.dev/golang.org/x/tools/gopls) + +[pylsp - Python LSP Server](https://github.com/python-lsp/python-lsp-server) + +[mypy - Optional Static Typing for Python](http://mypy-lang.org/) + +[rls - Rust Language Server](https://github.com/rust-lang/rls) + +[deno](https://deno.land/) + +[typescript-language-server](https://www.npmjs.com/package/typescript-language-server) + +[lua-lsp - A Lua language server](https://github.com/Alloyed/lua-lsp) diff --git a/.config/micro/plug/lsp/main.lua b/.config/micro/plug/lsp/main.lua new file mode 100644 index 0000000..a0fa4c9 --- /dev/null +++ b/.config/micro/plug/lsp/main.lua @@ -0,0 +1,933 @@ +VERSION = "0.6.2" + +local micro = import("micro") +local config = import("micro/config") +local shell = import("micro/shell") +local util = import("micro/util") +local buffer = import("micro/buffer") +local fmt = import("fmt") +local go_os = import("os") +local path = import("path") +local filepath = import("path/filepath") + +local cmd = {} +local id = {} +local version = {} +local currentAction = {} +local capabilities = {} +local filetype = '' +local rootUri = '' +local message = '' +local completionCursor = 0 +local lastCompletion = {} +local splitBP = nil +local tabCount = 0 + +local json = {} + +function toBytes(str) + local result = {} + for i=1,#str do + local b = str:byte(i) + if b < 32 then + table.insert(result, b) + end + end + return result +end + +function getUriFromBuf(buf) + if buf == nil then return; end + local file = buf.AbsPath + local uri = fmt.Sprintf("file://%s", file) + return uri +end + +function mysplit (inputstr, sep) + if sep == nil then + sep = "%s" + end + local t={} + for str in string.gmatch(inputstr, "([^"..sep.."]+)") do + table.insert(t, str) + end + return t +end + +function parseOptions(inputstr) + local t = {} + inputstr = inputstr:gsub("[%w+_-]+=[^=,]+={.-}", function (str) + table.insert(t, str) + return ''; + end) + inputstr = inputstr:gsub("[%w+_-]+=[^=,]+", function (str) + table.insert(t, str) + return ''; + end) + return t +end + +function startServer(filetype, callback) + local wd, _ = go_os.Getwd() + rootUri = fmt.Sprintf("file://%s", wd) + local envSettings, _ = go_os.Getenv("MICRO_LSP") + local settings = config.GetGlobalOption("lsp.server") + local fallback = "python=pylsp,go=gopls,typescript=deno lsp,javascript=deno lsp,markdown=deno lsp,json=deno lsp,jsonc=deno lsp,rust=rls,lua=lua-lsp,c++=clangd" + if envSettings ~= nil and #envSettings > 0 then + settings = envSettings + end + if settings ~= nil and #settings > 0 then + settings = settings .. "," .. fallback + else + settings = fallback + end + local server = parseOptions(settings) + micro.Log("Server Options", server) + for i in pairs(server) do + local part = mysplit(server[i], "=") + local run = mysplit(part[2], "%s") + local initOptions = part[3] or '{}' + local runCmd = table.remove(run, 1) + local args = run + if filetype == part[1] then + local send = withSend(part[1]) + if cmd[part[1]] ~= nil then return; end + id[part[1]] = 0 + micro.Log("Starting server", part[1]) + cmd[part[1]] = shell.JobSpawn(runCmd, args, onStdout(part[1]), onStderr, onExit(part[1]), {}) + currentAction[part[1]] = { method = "initialize", response = function (bp, data) + send("initialized", "{}", true) + capabilities[filetype] = data.result and data.result.capabilities or {} + callback(bp.Buf, filetype) + end } + send(currentAction[part[1]].method, fmt.Sprintf('{"processId": %.0f, "rootUri": "%s", "workspaceFolders": [{"name": "root", "uri": "%s"}], "initializationOptions": %s, "capabilities": {"textDocument": {"hover": {"contentFormat": ["plaintext", "markdown"]}, "publishDiagnostics": {"relatedInformation": false, "versionSupport": false, "codeDescriptionSupport": true, "dataSupport": true}, "signatureHelp": {"signatureInformation": {"documentationFormat": ["plaintext", "markdown"]}}}}}', go_os.Getpid(), rootUri, rootUri, initOptions)) + return + end + end +end + +function init() + config.RegisterCommonOption("lsp", "server", "python=pylsp,go=gopls,typescript=deno lsp,javascript=deno lsp,markdown=deno lsp,json=deno lsp,jsonc=deno lsp,rust=rls,lua=lua-lsp,c++=clangd") + config.RegisterCommonOption("lsp", "formatOnSave", true) + config.RegisterCommonOption("lsp", "autocompleteDetails", false) + config.RegisterCommonOption("lsp", "ignoreMessages", "") + config.RegisterCommonOption("lsp", "tabcompletion", true) + config.RegisterCommonOption("lsp", "ignoreTriggerCharacters", "completion") + -- example to ignore all LSP server message starting with these strings: + -- "lsp.ignoreMessages": "Skipping analyzing |See https://" + + config.MakeCommand("hover", hoverAction, config.NoComplete) + config.MakeCommand("definition", definitionAction, config.NoComplete) + config.MakeCommand("lspcompletion", completionAction, config.NoComplete) + config.MakeCommand("format", formatAction, config.NoComplete) + config.MakeCommand("references", referencesAction, config.NoComplete) + + config.TryBindKey("Alt-k", "command:hover", false) + config.TryBindKey("Alt-d", "command:definition", false) + config.TryBindKey("Alt-f", "command:format", false) + config.TryBindKey("Alt-r", "command:references", false) + config.TryBindKey("CtrlSpace", "command:lspcompletion", false) + + config.AddRuntimeFile("lsp", config.RTHelp, "help/lsp.md") + + -- @TODO register additional actions here +end + +function withSend(filetype) + return function (method, params, isNotification) + if cmd[filetype] == nil then + return + end + + local msg = fmt.Sprintf('{"jsonrpc": "2.0", %s"method": "%s", "params": %s}', not isNotification and fmt.Sprintf('"id": %.0f, ', id[filetype]) or "", method, params) + id[filetype] = id[filetype] + 1 + msg = fmt.Sprintf("Content-Length: %.0f\r\n\r\n%s", #msg, msg) + --micro.Log("send", filetype, "sending", method or msg, msg) + shell.JobSend(cmd[filetype], msg) + end +end + +function preRune(bp, r) + if splitBP ~= nil then + pcall(function () splitBP:Unsplit(); end) + splitBP = nil + local cur = bp.Buf:GetActiveCursor() + cur:Deselect(false); + cur:GotoLoc(buffer.Loc(cur.X + 1, cur.Y)) + end +end + +-- when a new character is types, the document changes +function onRune(bp, r) + local filetype = bp.Buf:FileType() + if cmd[filetype] == nil then + return + end + if splitBP ~= nil then + pcall(function () splitBP:Unsplit(); end) + splitBP = nil + end + + local send = withSend(filetype) + local uri = getUriFromBuf(bp.Buf) + if r ~= nil then + lastCompletion = {} + end + -- allow the document contents to be escaped properly for the JSON string + local content = util.String(bp.Buf:Bytes()):gsub("\\", "\\\\"):gsub("\n", "\\n"):gsub("\r", "\\r"):gsub('"', '\\"'):gsub("\t", "\\t") + -- increase change version + version[uri] = (version[uri] or 0) + 1 + send("textDocument/didChange", fmt.Sprintf('{"textDocument": {"version": %.0f, "uri": "%s"}, "contentChanges": [{"text": "%s"}]}', version[uri], uri, content), true) + local ignored = mysplit(config.GetGlobalOption("lsp.ignoreTriggerCharacters") or '', ",") + if r and capabilities[filetype] then + if not contains(ignored, "completion") and capabilities[filetype].completionProvider and capabilities[filetype].completionProvider.triggerCharacters and contains(capabilities[filetype].completionProvider.triggerCharacters, r) then + completionAction(bp) + elseif not contains(ignored, "signature") and capabilities[filetype].signatureHelpProvider and capabilities[filetype].signatureHelpProvider.triggerCharacters and contains(capabilities[filetype].signatureHelpProvider.triggerCharacters, r) then + hoverAction(bp) + end + end +end + +-- alias functions for any kind of change to the document +-- @TODO: add missing ones +function onBackspace(bp) onRune(bp); end +function onCut(bp) onRune(bp); end +function onCutLine(bp) onRune(bp); end +function onDuplicateLine(bp) onRune(bp); end +function onDeleteLine(bp) onRune(bp); end +function onDelete(bp) onRune(bp); end +function onUndo(bp) onRune(bp); end +function onRedo(bp) onRune(bp); end +function onIndent(bp) onRune(bp); end +function onIndentSelection(bp) onRune(bp); end +function onPaste(bp) onRune(bp); end +function onSave(bp) onRune(bp); end + +function onEscape(bp) + if splitBP ~= nil then + pcall(function () splitBP:Unsplit(); end) + splitBP = nil + end +end + +function preInsertNewline(bp) + if bp.Buf.Path == "References found" then + local cur = bp.Buf:GetActiveCursor() + cur:SelectLine() + local data = util.String(cur:GetSelection()) + local file, line, character = data:match("(./[^:]+):([^:]+):([^:]+)") + local doc, _ = file:gsub("^file://", "") + buf, _ = buffer.NewBufferFromFile(doc) + bp:AddTab() + micro.CurPane():OpenBuffer(buf) + buf:GetActiveCursor():GotoLoc(buffer.Loc(character * 1, line * 1)) + micro.CurPane():Center() + return false + end +end + +function preSave(bp) + if config.GetGlobalOption("lsp.formatOnSave") then + onRune(bp) + formatAction(bp, function () + bp:Save() + end) + end +end + +function handleInitialized(buf, filetype) + if cmd[filetype] == nil then return; end + micro.Log("Found running lsp server for ", filetype, "firing textDocument/didOpen...") + local send = withSend(filetype) + local uri = getUriFromBuf(buf) + local content = util.String(buf:Bytes()):gsub("\\", "\\\\"):gsub("\n", "\\n"):gsub("\r", "\\r"):gsub('"', '\\"'):gsub("\t", "\\t") + send("textDocument/didOpen", fmt.Sprintf('{"textDocument": {"uri": "%s", "languageId": "%s", "version": 1, "text": "%s"}}', uri, filetype, content), true) +end + +function onBufferOpen(buf) + local filetype = buf:FileType() + micro.Log("ONBUFFEROPEN", filetype) + if filetype ~= "unknown" and rootUri == "" and not cmd[filetype] then return startServer(filetype, handleInitialized); end + if cmd[filetype] then + handleInitialized(buf, filetype) + end +end + +function contains(list, x) + for _, v in pairs(list) do + if v == x then return true; end + end + return false +end + +function string.starts(String, Start) + return string.sub(String, 1, #Start) == Start +end + +function string.ends(String, End) + return string.sub(String, #String - (#End - 1), #String) == End +end + +function string.random(CharSet, Length, prefix) + + local _CharSet = CharSet or '.' + + if _CharSet == '' then + return '' + else + local Result = prefix or "" + math.randomseed(os.time()) + for Loop = 1,Length do + local char = math.random(1, #CharSet) + Result = Result .. CharSet:sub(char,char) + end + + return Result + end +end + +function string.parse(text) + if not text:find('"jsonrpc":') then return {}; end + local start,fin = text:find("\n%s*\n") + local cleanedText = text + if fin ~= nil then + cleanedText = text:sub(fin) + end + local status, res = pcall(json.parse, cleanedText) + if status then + return res + end + return false +end + +function isIgnoredMessage(msg) + -- Return true if msg matches one of the ignored starts of messages + -- Useful for linters that show spurious, hard to disable warnings + local ignoreList = mysplit(config.GetGlobalOption("lsp.ignoreMessages"), "|") + for i, ignore in pairs(ignoreList) do + if string.match(msg, ignore) then -- match from start of string + micro.Log("Ignore message: '", msg, "', because it matched: '", ignore, "'.") + return true -- ignore this message, dont show to user + end + end + return false -- show this message to user +end + +function onStdout(filetype) + return function (text) + if text:starts("Content-Length:") then + message = text + else + message = message .. text + end + if not text:ends("}") then + return + end + local data = message:parse() + if data == false then + return + end + + if data.method == "workspace/configuration" then + -- actually needs to respond with the same ID as the received JSON + local message = fmt.Sprintf('{"jsonrpc": "2.0", "id": %.0f, "result": [{"enable": true}]}', data.id) + shell.JobSend(cmd[filetype], fmt.Sprintf('Content-Length: %.0f\n\n%s', #message, message)) + elseif data.method == "textDocument/publishDiagnostics" or data.method == "textDocument\\/publishDiagnostics" then + -- react to server-published event + local bp = micro.CurPane().Buf + bp:ClearMessages("lsp") + bp:AddMessage(buffer.NewMessage("lsp", "", buffer.Loc(0, 10000000), buffer.Loc(0, 10000000), buffer.MTInfo)) + local uri = getUriFromBuf(bp) + if data.params.uri == uri then + for _, diagnostic in ipairs(data.params.diagnostics) do + local type = buffer.MTInfo + if diagnostic.severity == 1 then + type = buffer.MTError + elseif diagnostic.severity == 2 then + type = buffer.MTWarning + end + local mstart = buffer.Loc(diagnostic.range.start.character, diagnostic.range.start.line) + local mend = buffer.Loc(diagnostic.range["end"].character, diagnostic.range["end"].line) + + if not isIgnoredMessage(diagnostic.message) then + msg = buffer.NewMessage("lsp", diagnostic.message, mstart, mend, type) + bp:AddMessage(msg) + end + end + end + elseif currentAction[filetype] and currentAction[filetype].method and not data.method and currentAction[filetype].response and data.jsonrpc then -- react to custom action event + local bp = micro.CurPane() + micro.Log("Received message for ", filetype, data) + currentAction[filetype].response(bp, data) + currentAction[filetype] = {} + elseif data.method == "window/showMessage" or data.method == "window\\/showMessage" then + if filetype == micro.CurPane().Buf:FileType() then + micro.InfoBar():Message(data.params.message) + else + micro.Log(filetype .. " message " .. data.params.message) + end + elseif data.method == "window/logMessage" or data.method == "window\\/logMessage" then + micro.Log(data.params.message) + elseif message:starts("Content-Length:") then + if message:find('"') and not message:find('"result":null') then + micro.Log("Unhandled message 1", filetype, message) + end + else + -- enable for debugging purposes + micro.Log("Unhandled message 2", filetype, message) + end + end +end + +function onStderr(text) + micro.Log("ONSTDERR", text) + --micro.InfoBar():Message(text) +end + +function onExit(filetype) + return function (str) + currentAction[filetype] = nil + cmd[filetype] = nil + micro.Log("ONEXIT", filetype, str) + end +end + +-- the actual hover action request and response +-- the hoverActionResponse is hooked up in +function hoverAction(bp) + local filetype = bp.Buf:FileType() + if cmd[filetype] ~= nil then + local send = withSend(filetype) + local file = bp.Buf.AbsPath + local line = bp.Buf:GetActiveCursor().Y + local char = bp.Buf:GetActiveCursor().X + currentAction[filetype] = { method = "textDocument/hover", response = hoverActionResponse } + send(currentAction[filetype].method, fmt.Sprintf('{"textDocument": {"uri": "file://%s"}, "position": {"line": %.0f, "character": %.0f}}', file, line, char)) + end +end + +function hoverActionResponse(buf, data) + if data.result and data.result.contents ~= nil and data.result.contents ~= "" then + if data.result.contents.value then + micro.InfoBar():Message(data.result.contents.value) + elseif #data.result.contents > 0 then + micro.InfoBar():Message(data.result.contents[1].value) + end + end +end + +-- the definition action request and response +function definitionAction(bp) + local filetype = bp.Buf:FileType() + if cmd[filetype] == nil then return; end + + local send = withSend(filetype) + local file = bp.Buf.AbsPath + local line = bp.Buf:GetActiveCursor().Y + local char = bp.Buf:GetActiveCursor().X + currentAction[filetype] = { method = "textDocument/definition", response = definitionActionResponse } + send(currentAction[filetype].method, fmt.Sprintf('{"textDocument": {"uri": "file://%s"}, "position": {"line": %.0f, "character": %.0f}}', file, line, char)) +end + +function definitionActionResponse(bp, data) + local results = data.result or data.partialResult + if results == nil then return; end + local file = bp.Buf.AbsPath + if results.uri ~= nil then + -- single result + results = { results } + end + if #results <= 0 then return; end + local uri = (results[1].uri or results[1].targetUri) + local doc = uri:gsub("^file://", "") + local buf = bp.Buf + if file ~= doc then + -- it's from a different file, so open it as a new tab + buf, _ = buffer.NewBufferFromFile(doc) + bp:AddTab() + micro.CurPane():OpenBuffer(buf) + -- shorten the displayed name in status bar + name = buf:GetName() + local wd, _ = go_os.Getwd() + if name:starts(wd) then + buf:SetName("." .. name:sub(#wd + 1, #name + 1)) + else + if #name > 30 then + buf:SetName("..." .. name:sub(-30, #name + 1)) + end + end + end + local range = results[1].range or results[1].targetSelectionRange + buf:GetActiveCursor():GotoLoc(buffer.Loc(range.start.character, range.start.line)) + bp:Center() +end + +function completionAction(bp) + local filetype = bp.Buf:FileType() + local send = withSend(filetype) + local file = bp.Buf.AbsPath + local line = bp.Buf:GetActiveCursor().Y + local char = bp.Buf:GetActiveCursor().X + + if lastCompletion[1] == file and lastCompletion[2] == line and lastCompletion[3] == char then + completionCursor = completionCursor + 1 + else + completionCursor = 0 + if bp.Cursor:HasSelection() then + -- we have a selection + -- assume we want to indent the selection + bp:IndentSelection() + return + end + if char == 0 then + -- we are at the very first character of a line + -- assume we want to indent + bp:IndentLine() + return + end + local cur = bp.Buf:GetActiveCursor() + cur:SelectLine() + local lineContent = util.String(cur:GetSelection()) + cur:ResetSelection() + cur:GotoLoc(buffer.Loc(char, line)) + local startOfLine = "" .. lineContent:sub(1, char) + if startOfLine:match("^%s+$") then + -- we are at the beginning of a line + -- assume we want to indent the line + bp:IndentLine() + return + end + end + if cmd[filetype] == nil then return; end + lastCompletion = {file, line, char} + currentAction[filetype] = { method = "textDocument/completion", response = completionActionResponse } + send(currentAction[filetype].method, fmt.Sprintf('{"textDocument": {"uri": "file://%s"}, "position": {"line": %.0f, "character": %.0f}}', file, line, char)) +end + +table.filter = function(t, filterIter) + local out = {} + + for k, v in pairs(t) do + if filterIter(v, k, t) then table.insert(out, v) end + end + + return out +end + +function findCommon(input, list) + local commonLen = 0 + local prefixList = {} + local str = input.textEdit and input.textEdit.newText or input.label + for i = 1,#str,1 do + local prefix = str:sub(1, i) + prefixList[prefix] = 0 + for idx, entry in ipairs(list) do + local currentEntry = entry.textEdit and entry.textEdit.newText or entry.label + if currentEntry:starts(prefix) then + prefixList[prefix] = prefixList[prefix] + 1 + end + end + end + local longest = "" + for idx, entry in pairs(prefixList) do + if entry >= #list then + if #longest < #idx then + longest = idx + end + end + end + if #list == 1 then + return list[1].textEdit and list[1].textEdit.newText or list[1].label + end + return longest +end + +function completionActionResponse(bp, data) + local results = data.result + if results == nil then + return + end + if results.items then + results = results.items + end + + local xy = buffer.Loc(bp.Cursor.X, bp.Cursor.Y) + local start = xy + if bp.Cursor:HasSelection() then + bp.Cursor:DeleteSelection() + end + + local found = false + local prefix = "" + local reversed = "" + -- if we have no defined ranges in the result + -- try to find out what our prefix is we want to filter against + if not results[1] or not results[1].textEdit or not results[1].textEdit.range then + if capabilities[bp.Buf:FileType()] and capabilities[bp.Buf:FileType()].completionProvider and capabilities[bp.Buf:FileType()].completionProvider.triggerCharacters then + local cur = bp.Buf:GetActiveCursor() + cur:SelectLine() + local lineContent = util.String(cur:GetSelection()) + reversed = string.reverse(lineContent:gsub("\r?\n$", ""):sub(1, xy.X)) + local triggerChars = capabilities[bp.Buf:FileType()].completionProvider.triggerCharacters + for i = 1,#reversed,1 do + local char = reversed:sub(i,i) + -- try to find a trigger character or any other non-word character + if contains(triggerChars, char) or contains({" ", ":", "/", "-", "\t", ";"}, char) then + found = true + start = buffer.Loc(#reversed - (i - 1), bp.Cursor.Y) + bp.Cursor:SetSelectionStart(start) + bp.Cursor:SetSelectionEnd(xy) + prefix = util.String(cur:GetSelection()) + bp.Cursor:DeleteSelection() + bp.Cursor:ResetSelection() + break + end + end + if not found then + prefix = lineContent:gsub("\r?\n$", '') + end + end + -- if we have found a prefix + if prefix ~= "" then + -- filter it down to what is suggested by the prefix + results = table.filter(results, function (entry) + return entry.label:starts(prefix) + end) + end + end + + table.sort(results, function (left, right) + return (left.sortText or left.label) < (right.sortText or right.label) + end) + + entry = results[(completionCursor % #results) + 1] + -- if no matching results are found + if entry == nil then + -- reposition cursor and stop + bp.Cursor:GotoLoc(xy) + return + end + local commonStart = '' + local toInsert = entry.textEdit and entry.textEdit.newText or entry.label + local isTabCompletion = config.GetGlobalOption("lsp.tabcompletion") + if isTabCompletion and not entry.textEdit then + commonStart = findCommon(entry, results) + bp.Buf:Insert(start, commonStart) + if prefix ~= commonStart then + return + end + start = buffer.Loc(start.X + #prefix, start.Y) + else + prefix = '' + end + + if entry.textEdit and entry.textEdit.range then + start = buffer.Loc(entry.textEdit.range.start.character, entry.textEdit.range.start.line) + bp.Cursor:SetSelectionStart(start) + bp.Cursor:SetSelectionEnd(xy) + bp.Cursor:DeleteSelection() + bp.Cursor:ResetSelection() + elseif capabilities[bp.Buf:FileType()] and capabilities[bp.Buf:FileType()].completionProvider and capabilities[bp.Buf:FileType()].completionProvider.triggerCharacters then + if not found then + -- we found nothing - so assume we need the beginning of the line + if reversed:starts(" ") or reversed:starts("\t") then + -- if we end with some indentation, keep it + start = buffer.Loc(#reversed, bp.Cursor.Y) + else + start = buffer.Loc(0, bp.Cursor.Y) + end + bp.Cursor:SetSelectionStart(start) + bp.Cursor:SetSelectionEnd(xy) + bp.Cursor:DeleteSelection() + bp.Cursor:ResetSelection() + end + end + local inserting = "" .. toInsert:gsub(prefix, "") + bp.Buf:Insert(start, inserting) + + if #results > 1 then + if entry.textEdit then + bp.Cursor:GotoLoc(start) + bp.Cursor:SetSelectionStart(start) + else + -- if we had to calculate everything outselves + -- go back to the original location + bp.Cursor:GotoLoc(xy) + bp.Cursor:SetSelectionStart(xy) + end + bp.Cursor:SetSelectionEnd(buffer.Loc(start.X + #toInsert, start.Y)) + else + bp.Cursor:GotoLoc(buffer.Loc(start.X + #inserting, start.Y)) + end + + local startLoc = buffer.Loc(0, 0) + local endLoc = buffer.Loc(0, 0) + local msg = '' + local insertion = '' + if entry.detail or entry.documentation then + insertion = fmt.Sprintf("%s", entry.detail or entry.documentation or '') + for idx, result in ipairs(results) do + if #msg > 0 then + msg = msg .. "\n" + end + local insertion = fmt.Sprintf("%s %s", result.detail or '', result.documentation or '') + if idx == (completionCursor % #results) + 1 then + local msglines = mysplit(msg, "\n") + startLoc = buffer.Loc(0, #msglines) + endLoc = buffer.Loc(#insertion - 1, #msglines) + end + msg = msg .. insertion + end + else + insertion = entry.label + for idx, result in ipairs(results) do + if #msg > 0 then + local msglines = mysplit(msg, "\n") + local lastLine = msglines[#msglines] + local len = #result.label + 4 + if #lastLine + len >= bp:GetView().Width then + msg = msg .. "\n " + else + msg = msg .. ' ' + end + else + msg = " " + end + if idx == (completionCursor % #results) + 1 then + local msglines = mysplit(msg, "\n") + local prefixLen = 0 + if #msglines > 0 then + prefixLen = #msglines[#msglines] + else + prefixLen = #msg + end + startLoc = buffer.Loc(prefixLen or 0, #msglines - 1) + endLoc = buffer.Loc(prefixLen + #result.label, #msglines - 1) + end + msg = msg .. result.label + end + end + if config.GetGlobalOption("lsp.autocompleteDetails") then + if not splitBP then + local tmpName = ("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"):random(32) + local logBuf = buffer.NewBuffer(msg, tmpName) + splitBP = bp:HSplitBuf(logBuf) + bp:NextSplit() + else + splitBP:SelectAll() + splitBP.Cursor:DeleteSelection() + splitBP.Cursor:ResetSelection() + splitBP.Buf:insert(buffer.Loc(1, 1), msg) + end + splitBP.Cursor:ResetSelection() + splitBP.Cursor:SetSelectionStart(startLoc) + splitBP.Cursor:SetSelectionEnd(endLoc) + else + if entry.detail or entry.documentation then + micro.InfoBar():Message(insertion) + else + local cleaned = " " .. msg:gsub("%s+", " ") + local replaced, _ = cleaned:gsub(".*%s" .. insertion .. "%s?", " [" .. insertion .. "] ") + micro.InfoBar():Message(replaced) + end + end +end + +function formatAction(bp, callback) + local filetype = bp.Buf:FileType() + if cmd[filetype] == nil then return; end + local send = withSend(filetype) + local file = bp.Buf.AbsPath + + currentAction[filetype] = { method = "textDocument/formatting", response = formatActionResponse(callback) } + send(currentAction[filetype].method, fmt.Sprintf('{"textDocument": {"uri": "file://%s"}, "options": {"tabSize": 4, "insertSpaces": true}}', file)) +end + +function formatActionResponse(callback) + return function (bp, data) + if data.result == nil then return; end + local edits = data.result + -- make sure we apply the changes from back to front + -- this allows for changes to not need position updates + table.sort(edits, function (left, right) + -- go by lines first + return left.range['end'].line > right.range['end'].line or + -- if lines match, go by end character + left.range['end'].line == right.range['end'].line and left.range['end'].character > right.range['end'].character or + -- if they match too, go by start character + left.range['end'].line == right.range['end'].line and left.range['end'].character == right.range['end'].character and left.range.start.line == left.range['end'].line and left.range.start.character > right.range.start.character + end) + + -- save original cursor position + local xy = buffer.Loc(bp.Cursor.X, bp.Cursor.Y) + for _idx, edit in ipairs(edits) do + rangeStart = buffer.Loc(edit.range.start.character, edit.range.start.line) + rangeEnd = buffer.Loc(edit.range['end'].character, edit.range['end'].line) + -- apply each change + bp.Cursor:GotoLoc(rangeStart) + bp.Cursor:SetSelectionStart(rangeStart) + bp.Cursor:SetSelectionEnd(rangeEnd) + bp.Cursor:DeleteSelection() + bp.Cursor:ResetSelection() + + if edit.newText ~= "" then + bp.Buf:insert(rangeStart, edit.newText) + end + end + -- put the cursor back where it was + bp.Cursor:GotoLoc(xy) + -- if any changes were applied + if #edits > 0 then + -- tell the server about the changed document + onRune(bp) + end + + if callback ~= nil then + callback(bp) + end + end +end + +-- the references action request and response +function referencesAction(bp) + local filetype = bp.Buf:FileType() + if cmd[filetype] == nil then return; end + + local send = withSend(filetype) + local file = bp.Buf.AbsPath + local line = bp.Buf:GetActiveCursor().Y + local char = bp.Buf:GetActiveCursor().X + currentAction[filetype] = { method = "textDocument/references", response = referencesActionResponse } + send(currentAction[filetype].method, fmt.Sprintf('{"textDocument": {"uri": "file://%s"}, "position": {"line": %.0f, "character": %.0f}, "context": {"includeDeclaration":true}}', file, line, char)) +end + +function referencesActionResponse(bp, data) + if data.result == nil then return; end + local results = data.result or data.partialResult + if results == nil or #results <= 0 then return; end + + local file = bp.Buf.AbsPath + + local msg = '' + for _idx, ref in ipairs(results) do + if msg ~= '' then msg = msg .. '\n'; end + local doc = (ref.uri or ref.targetUri) + msg = msg .. "." .. doc:sub(#rootUri + 1, #doc) .. ":" .. ref.range.start.line .. ":" .. ref.range.start.character + end + + local logBuf = buffer.NewBuffer(msg, "References found") + local splitBP = bp:HSplitBuf(logBuf) +end + +-- +-- @TODO implement additional functions here... +-- + + + +-- +-- JSON +-- +-- Internal functions. + +local function kind_of(obj) + if type(obj) ~= 'table' then return type(obj) end + local i = 1 + for _ in pairs(obj) do + if obj[i] ~= nil then i = i + 1 else return 'table' end + end + if i == 1 then return 'table' else return 'array' end +end + +local function escape_str(s) + local in_char = {'\\', '"', '/', '\b', '\f', '\n', '\r', '\t'} + local out_char = {'\\', '"', '/', 'b', 'f', 'n', 'r', 't'} + for i, c in ipairs(in_char) do + s = s:gsub(c, '\\' .. out_char[i]) + end + return s +end + +-- Returns pos, did_find; there are two cases: +-- 1. Delimiter found: pos = pos after leading space + delim; did_find = true. +-- 2. Delimiter not found: pos = pos after leading space; did_find = false. +-- This throws an error if err_if_missing is true and the delim is not found. +local function skip_delim(str, pos, delim, err_if_missing) + pos = pos + #str:match('^%s*', pos) + if str:sub(pos, pos) ~= delim then + if err_if_missing then + error('Expected ' .. delim .. ' near position ' .. pos) + end + return pos, false + end + return pos + 1, true +end + +-- Expects the given pos to be the first character after the opening quote. +-- Returns val, pos; the returned pos is after the closing quote character. +local function parse_str_val(str, pos, val) + val = val or '' + local early_end_error = 'End of input found while parsing string.' + if pos > #str then error(early_end_error) end + local c = str:sub(pos, pos) + if c == '"' then return val, pos + 1 end + if c ~= '\\' then return parse_str_val(str, pos + 1, val .. c) end + -- We must have a \ character. + local esc_map = {b = '\b', f = '\f', n = '\n', r = '\r', t = '\t'} + local nextc = str:sub(pos + 1, pos + 1) + if not nextc then error(early_end_error) end + return parse_str_val(str, pos + 2, val .. (esc_map[nextc] or nextc)) +end + +-- Returns val, pos; the returned pos is after the number's final character. +local function parse_num_val(str, pos) + local num_str = str:match('^-?%d+%.?%d*[eE]?[+-]?%d*', pos) + local val = tonumber(num_str) + if not val then error('Error parsing number at position ' .. pos .. '.') end + return val, pos + #num_str +end + +json.null = {} -- This is a one-off table to represent the null value. + +function json.parse(str, pos, end_delim) + pos = pos or 1 + if pos > #str then error('Reached unexpected end of input.' .. str) end + local pos = pos + #str:match('^%s*', pos) -- Skip whitespace. + local first = str:sub(pos, pos) + if first == '{' then -- Parse an object. + local obj, key, delim_found = {}, true, true + pos = pos + 1 + while true do + key, pos = json.parse(str, pos, '}') + if key == nil then return obj, pos end + if not delim_found then error('Comma missing between object items.') end + pos = skip_delim(str, pos, ':', true) -- true -> error if missing. + obj[key], pos = json.parse(str, pos) + pos, delim_found = skip_delim(str, pos, ',') + end + elseif first == '[' then -- Parse an array. + local arr, val, delim_found = {}, true, true + pos = pos + 1 + while true do + val, pos = json.parse(str, pos, ']') + if val == nil then return arr, pos end + if not delim_found then error('Comma missing between array items.') end + arr[#arr + 1] = val + pos, delim_found = skip_delim(str, pos, ',') + end + elseif first == '"' then -- Parse a string. + return parse_str_val(str, pos + 1) + elseif first == '-' or first:match('%d') then -- Parse a number. + return parse_num_val(str, pos) + elseif first == end_delim then -- End of an object or array. + return nil, pos + 1 + else -- Parse true, false, or null. + local literals = {['true'] = true, ['false'] = false, ['null'] = json.null} + for lit_str, lit_val in pairs(literals) do + local lit_end = pos + #lit_str - 1 + if str:sub(pos, lit_end) == lit_str then return lit_val, lit_end + 1 end + end + local pos_info_str = 'position ' .. pos .. ': ' .. str:sub(pos, pos + 10) + error('Invalid json syntax starting at ' .. pos_info_str .. ': ' .. str) + end +end diff --git a/.config/micro/plug/lsp/repo.json b/.config/micro/plug/lsp/repo.json new file mode 100644 index 0000000..15ad866 --- /dev/null +++ b/.config/micro/plug/lsp/repo.json @@ -0,0 +1,78 @@ +[{ + "Name": "lsp", + "Description": "Generic LSP Client for Micro", + "Website": "https://github.com/AndCake/micro-plugin-lsp", + "Tags": ["lsp"], + "Versions": [ + { + "Version": "0.4.1", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.4.1.zip", + "Require": { + "micro": ">=2.0.10" + } + }, + { + "Version": "0.4.2", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.4.2.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.4.3", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.4.3.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.5.0", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.5.0.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.5.1", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.5.1.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.5.2", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.5.2.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.5.3", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.5.3.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.6.0", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.6.0.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.6.1", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.6.1.zip", + "Require": { + "micro": ">=2.0.8" + } + }, + { + "Version": "0.6.2", + "Url": "https://github.com/AndCake/micro-plugin-lsp/archive/v0.6.2.zip", + "Require": { + "micro": ">=2.0.8" + } + } + ] +}] diff --git a/.config/micro/settings.json b/.config/micro/settings.json new file mode 100644 index 0000000..f6271de --- /dev/null +++ b/.config/micro/settings.json @@ -0,0 +1,3 @@ +{ + "colorscheme": "tokyo-night" +} diff --git a/.config/nushell/aliases.nu b/.config/nushell/aliases.nu new file mode 100644 index 0000000..6e123a2 --- /dev/null +++ b/.config/nushell/aliases.nu @@ -0,0 +1,44 @@ +# aliases for modern unix rebindings +export alias cat = bat +# export alias ls = lsd +export alias du = dust +export alias df = duf +export alias grep = rg +export alias cp = xcp +export alias find = fd +export alias top = btm +export alias htop = btm +export alias burn = rm # sometimes, you ACTUALLY need rm +export alias rm = rip + +# Personal convenience aliases +export alias free = free -m +export alias npkg = nano -w PKGBUILD +export alias q = exit +export alias ':q' = exit +export alias c = clear +export alias h = history +export alias lsa = ls -a +export alias lsl = ls -l +export alias lsla = ls -la +export alias .. = cd .. +export alias ... = cd ../.. +export alias .... = cd ../../.. +export alias ..... = cd ../../../.. +# export alias pip = python -m pip +export alias pip-upgrade = python -m pip install --upgrade pip +export alias pypy = pypy3 +export alias poem = poetry run python +export alias bashpoem = poetry run bash +export alias nupoem = poetry run nu +export alias jupyterpoem = poetry run jupyter + +# Aliases for custom git commands +export alias git-ammend = git commit -a --amend -C HEAD + +# Who even uses vim or *especially* vi in this day and age? +export alias vim = nvim +export alias vi = nvim + +# NixOS specific aliases +export alias nix-nu = nix-shell --command nu diff --git a/.config/nushell/completions/atuin.nu b/.config/nushell/completions/atuin.nu new file mode 100644 index 0000000..f1dd34f --- /dev/null +++ b/.config/nushell/completions/atuin.nu @@ -0,0 +1,73 @@ +# Source this in your ~/.config/nushell/config.nu +$env.ATUIN_SESSION = (atuin uuid) +hide-env -i ATUIN_HISTORY_ID + +# Magic token to make sure we don't record commands run by keybindings +let ATUIN_KEYBINDING_TOKEN = $"# (random uuid)" + +let _atuin_pre_execution = {|| + if ($nu | get -i history-enabled) == false { + return + } + let cmd = (commandline) + if ($cmd | is-empty) { + return + } + if not ($cmd | str starts-with $ATUIN_KEYBINDING_TOKEN) { + $env.ATUIN_HISTORY_ID = (atuin history start -- $cmd) + } +} + +let _atuin_pre_prompt = {|| + let last_exit = $env.LAST_EXIT_CODE + if 'ATUIN_HISTORY_ID' not-in $env { + return + } + with-env { ATUIN_LOG: error } { + do { atuin history end $'--exit=($last_exit)' -- $env.ATUIN_HISTORY_ID } | complete + + } + hide-env ATUIN_HISTORY_ID +} + +def _atuin_search_cmd [...flags: string] { + let nu_version = ($env.NU_VERSION | split row '.' | each { || into int }) + [ + $ATUIN_KEYBINDING_TOKEN, + ([ + `with-env { ATUIN_LOG: error, ATUIN_QUERY: (commandline) } {`, + (if $nu_version.0 <= 0 and $nu_version.1 <= 90 { 'commandline' } else { 'commandline edit' }), + (if $nu_version.1 >= 92 { '(run-external atuin search' } else { '(run-external --redirect-stderr atuin search' }), + ($flags | append [--interactive] | each {|e| $'"($e)"'}), + (if $nu_version.1 >= 92 { ' e>| str trim)' } else {' | complete | $in.stderr | str substring ..-1)'}), + `}`, + ] | flatten | str join ' '), + ] | str join "\n" +} + +$env.config = ($env | default {} config).config +$env.config = ($env.config | default {} hooks) +$env.config = ( + $env.config | upsert hooks ( + $env.config.hooks + | upsert pre_execution ( + $env.config.hooks | get -i pre_execution | default [] | append $_atuin_pre_execution) + | upsert pre_prompt ( + $env.config.hooks | get -i pre_prompt | default [] | append $_atuin_pre_prompt) + ) +) + +$env.config = ($env.config | default [] keybindings) + +$env.config = ( + $env.config | upsert keybindings ( + $env.config.keybindings + | append { + name: atuin + modifier: control + keycode: char_r + mode: [vi_insert, vi_normal, emacs] + event: { send: executehostcommand cmd: (_atuin_search_cmd) } + } + ) +) diff --git a/.config/nushell/completions/nu_scripts.nu b/.config/nushell/completions/nu_scripts.nu new file mode 100644 index 0000000..da3d548 --- /dev/null +++ b/.config/nushell/completions/nu_scripts.nu @@ -0,0 +1,22 @@ +source ~/.config/nushell/nu_scripts/custom-completions/bitwarden-cli/bitwarden-cli-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/btm/btm-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/cargo/cargo-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/curl/curl-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/docker/docker-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/flutter/flutter-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/gh/gh-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/git/git-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/glow/glow-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/man/man-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/mix/mix-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/nano/nano-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/nix/nix-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/poetry/poetry-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/pre-commit/pre-commit-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/pytest/pytest-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/rg/rg-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/rustup/rustup-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/rye/rye-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/tealdeer/tldr-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/vscode/vscode-completions.nu +source ~/.config/nushell/nu_scripts/custom-completions/zellij/zellij-completions.nu diff --git a/.config/nushell/completions/zoxide.nu b/.config/nushell/completions/zoxide.nu new file mode 100644 index 0000000..c247196 --- /dev/null +++ b/.config/nushell/completions/zoxide.nu @@ -0,0 +1,60 @@ +# Code generated by zoxide. DO NOT EDIT. + +# ============================================================================= +# +# Hook configuration for zoxide. +# + +# Initialize hook to add new entries to the database. +if (not ($env | default false __zoxide_hooked | get __zoxide_hooked)) { + $env.__zoxide_hooked = true + $env.config = ($env | default {} config).config + $env.config = ($env.config | default {} hooks) + $env.config = ($env.config | update hooks ($env.config.hooks | default {} env_change)) + $env.config = ($env.config | update hooks.env_change ($env.config.hooks.env_change | default [] PWD)) + $env.config = ($env.config | update hooks.env_change.PWD ($env.config.hooks.env_change.PWD | append {|_, dir| + zoxide add -- $dir + })) +} + +# ============================================================================= +# +# When using zoxide with --no-cmd, alias these internal functions as desired. +# + +# Jump to a directory using only keywords. +def --env __zoxide_z [...rest:string] { + let arg0 = ($rest | append '~').0 + let path = if (($rest | length) <= 1) and ($arg0 == '-' or ($arg0 | path expand | path type) == dir) { + $arg0 + } else { + (zoxide query --exclude $env.PWD -- ...$rest | str trim -r -c "\n") + } + cd $path +} + +# Jump to a directory using interactive search. +def --env __zoxide_zi [...rest:string] { + cd $'(zoxide query --interactive -- ...$rest | str trim -r -c "\n")' +} + +# ============================================================================= +# +# Commands for zoxide. Disable these using --no-cmd. +# + +alias cd = __zoxide_z +alias cdi = __zoxide_zi + +# ============================================================================= +# +# Add this to your env file (find it by running `$nu.env-path` in Nushell): +# +# zoxide init nushell | save -f ~/.zoxide.nu +# +# Now, add this to the end of your config file (find it by running +# `$nu.config-path` in Nushell): +# +# source ~/.zoxide.nu +# +# Note: zoxide only supports Nushell v0.89.0+. diff --git a/.config/nushell/config.nu b/.config/nushell/config.nu new file mode 100644 index 0000000..125ec21 --- /dev/null +++ b/.config/nushell/config.nu @@ -0,0 +1,17 @@ +# Imports of custom modules from init to help keep my config file clean +use ~/.config/nushell/default_config.nu +use ~/.config/nushell/init.nu * +# Combine config records to create the final config +$env.config = ( + (default_config) | merge (theme) | merge (my_config) +) +# Initialise the plugins +source ~/.config/nushell/nu_scripts.nu +# initialise the completion plugins +source ~/.config/nushell/completions/atuin.nu +source ~/.config/nushell/completions/zoxide.nu +source ~/.config/nushell/completions/nu_scripts.nu +# import nushell libs +use task.nu +# Finally, we run a system info fetch +sysfetch diff --git a/.config/nushell/config_nofetch.nu b/.config/nushell/config_nofetch.nu new file mode 100644 index 0000000..086f278 --- /dev/null +++ b/.config/nushell/config_nofetch.nu @@ -0,0 +1,13 @@ +# Imports of custom modules from init to help keep my config file clean +use ~/.config/nushell/default_config.nu +use ~/.config/nushell/init.nu * +# Combine config records to create the final config +$env.config = ( + (default_config) | merge (theme) | merge (my_config) +) +# Initialise the plugins +source ~/.config/nushell/nu_scripts.nu +# Finally, initialise the completion plugins +source ~/.config/nushell/completions/atuin.nu +source ~/.config/nushell/completions/zoxide.nu +source ~/.config/nushell/completions/nu_scripts.nu diff --git a/.config/nushell/default_config.nu b/.config/nushell/default_config.nu new file mode 100644 index 0000000..f9dda71 --- /dev/null +++ b/.config/nushell/default_config.nu @@ -0,0 +1,620 @@ +# The default config record. This is where much of your global configuration is setup. +export def main [] { + { + show_banner: true # true or false to enable or disable the welcome banner at startup + + ls: { + use_ls_colors: true # use the LS_COLORS environment variable to colorize output + clickable_links: true # enable or disable clickable links. Your terminal has to support links. + } + + rm: { + always_trash: false # always act as if -t was given. Can be overridden with -p + } + + table: { + mode: rounded # basic, compact, compact_double, light, thin, with_love, rounded, reinforced, heavy, none, other + index_mode: always # "always" show indexes, "never" show indexes, "auto" = show indexes when a table has "index" column + show_empty: true # show 'empty list' and 'empty record' placeholders for command output + padding: { left: 1, right: 1 } # a left right padding of each column in a table + trim: { + methodology: wrapping # wrapping or truncating + wrapping_try_keep_words: true # A strategy used by the 'wrapping' methodology + truncating_suffix: "..." # A suffix used by the 'truncating' methodology + } + header_on_separator: false # show header text on separator/border line + # abbreviated_row_count: 10 # limit data rows from top and bottom after reaching a set point + } + + error_style: "fancy" # "fancy" or "plain" for screen reader-friendly error messages + + # datetime_format determines what a datetime rendered in the shell would look like. + # Behavior without this configuration point will be to "humanize" the datetime display, + # showing something like "a day ago." + datetime_format: { + # normal: '%a, %d %b %Y %H:%M:%S %z' # shows up in displays of variables or other datetime's outside of tables + # table: '%m/%d/%y %I:%M:%S%p' # generally shows up in tabular outputs such as ls. commenting this out will change it to the default human readable datetime format + } + + explore: { + status_bar_background: {fg: "#1D1F21", bg: "#C4C9C6"}, + command_bar_text: {fg: "#C4C9C6"}, + highlight: {fg: "black", bg: "yellow"}, + status: { + error: {fg: "white", bg: "red"}, + warn: {} + info: {} + }, + table: { + split_line: {fg: "#404040"}, + selected_cell: {bg: light_blue}, + selected_row: {}, + selected_column: {}, + }, + } + + history: { + max_size: 100_000 # Session has to be reloaded for this to take effect + sync_on_enter: true # Enable to share history between multiple sessions, else you have to close the session to write history to file + file_format: "plaintext" # "sqlite" or "plaintext" + isolation: false # only available with sqlite file_format. true enables history isolation, false disables it. true will allow the history to be isolated to the current session using up/down arrows. false will allow the history to be shared across all sessions. + } + + completions: { + case_sensitive: false # set to true to enable case-sensitive completions + quick: true # set this to false to prevent auto-selecting completions when only one remains + partial: true # set this to false to prevent partial filling of the prompt + algorithm: "prefix" # prefix or fuzzy + external: { + enable: true # set to false to prevent nushell looking into $env.PATH to find more suggestions, `false` recommended for WSL users as this look up may be very slow + max_results: 100 # setting it lower can improve completion performance at the cost of omitting some options + completer: null # check 'carapace_completer' above as an example + } + } + + filesize: { + metric: false # true => KB, MB, GB (ISO standard), false => KiB, MiB, GiB (Windows standard) + format: "auto" # b, kb, kib, mb, mib, gb, gib, tb, tib, pb, pib, eb, eib, auto + } + + cursor_shape: { + emacs: line # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (line is the default) + vi_insert: block # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (block is the default) + vi_normal: underscore # block, underscore, line, blink_block, blink_underscore, blink_line, inherit to skip setting cursor shape (underscore is the default) + } + + # color_config: dark_theme # if you want a more interesting theme, you can replace the empty record with `$dark_theme`, `$light_theme` or another custom record + footer_mode: "auto" # always, never, auto + float_precision: 2 # the precision for displaying floats in tables + buffer_editor: "" # command that will be used to edit the current line buffer with ctrl+o, if unset fallback to $env.EDITOR and $env.VISUAL + use_ansi_coloring: true + bracketed_paste: true # enable bracketed paste, currently useless on windows + edit_mode: emacs # emacs, vi + shell_integration: false # enables terminal shell integration. Off by default, as some terminals have issues with this. + render_right_prompt_on_last_line: false # true or false to enable or disable right prompt to be rendered on last line of the prompt. + use_kitty_protocol: false # enables keyboard enhancement protocol implemented by kitty console, only if your terminal support this. + # highlight_resolved_externals: false # true enables highlighting of external commands in the repl resolved by which. + + hooks: { + pre_prompt: [{ null }] # run before the prompt is shown + pre_execution: [{ null }] # run before the repl input is run + env_change: { + PWD: [{|before, after| null }] # run if the PWD environment is different since the last repl input + } + display_output: "if (term size).columns >= 100 { table -e } else { table }" # run to display the output of a pipeline + command_not_found: { null } # return an error message when a command is not found + } + + menus: [ + # Configuration for default nushell menus + # Note the lack of source parameter + { + name: completion_menu + only_buffer_difference: false + marker: "| " + type: { + layout: columnar + columns: 4 + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + { + name: history_menu + only_buffer_difference: true + marker: "? " + type: { + layout: list + page_size: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + { + name: help_menu + only_buffer_difference: true + marker: "? " + type: { + layout: description + columns: 4 + col_width: 20 # Optional value. If missing all the screen width is used to calculate column width + col_padding: 2 + selection_rows: 4 + description_rows: 10 + } + style: { + text: green + selected_text: green_reverse + description_text: yellow + } + } + ] + + keybindings: [ + { + name: completion_menu + modifier: none + keycode: tab + mode: [emacs vi_normal vi_insert] + event: { + until: [ + { send: menu name: completion_menu } + { send: menunext } + { edit: complete } + ] + } + } + { + name: history_menu + modifier: control + keycode: char_r + mode: [emacs, vi_insert, vi_normal] + event: { send: menu name: history_menu } + } + { + name: help_menu + modifier: none + keycode: f1 + mode: [emacs, vi_insert, vi_normal] + event: { send: menu name: help_menu } + } + { + name: completion_previous_menu + modifier: shift + keycode: backtab + mode: [emacs, vi_normal, vi_insert] + event: { send: menuprevious } + } + { + name: next_page_menu + modifier: control + keycode: char_x + mode: emacs + event: { send: menupagenext } + } + { + name: undo_or_previous_page_menu + modifier: control + keycode: char_z + mode: emacs + event: { + until: [ + { send: menupageprevious } + { edit: undo } + ] + } + } + { + name: escape + modifier: none + keycode: escape + mode: [emacs, vi_normal, vi_insert] + event: { send: esc } # NOTE: does not appear to work + } + { + name: cancel_command + modifier: control + keycode: char_c + mode: [emacs, vi_normal, vi_insert] + event: { send: ctrlc } + } + { + name: quit_shell + modifier: control + keycode: char_d + mode: [emacs, vi_normal, vi_insert] + event: { send: ctrld } + } + { + name: clear_screen + modifier: control + keycode: char_l + mode: [emacs, vi_normal, vi_insert] + event: { send: clearscreen } + } + { + name: search_history + modifier: control + keycode: char_q + mode: [emacs, vi_normal, vi_insert] + event: { send: searchhistory } + } + { + name: open_command_editor + modifier: control + keycode: char_o + mode: [emacs, vi_normal, vi_insert] + event: { send: openeditor } + } + { + name: move_up + modifier: none + keycode: up + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menuup} + {send: up} + ] + } + } + { + name: move_down + modifier: none + keycode: down + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menudown} + {send: down} + ] + } + } + { + name: move_left + modifier: none + keycode: left + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menuleft} + {send: left} + ] + } + } + { + name: move_right_or_take_history_hint + modifier: none + keycode: right + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintcomplete} + {send: menuright} + {send: right} + ] + } + } + { + name: move_one_word_left + modifier: control + keycode: left + mode: [emacs, vi_normal, vi_insert] + event: {edit: movewordleft} + } + { + name: move_one_word_right_or_take_history_hint + modifier: control + keycode: right + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintwordcomplete} + {edit: movewordright} + ] + } + } + { + name: move_to_line_start + modifier: none + keycode: home + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolinestart} + } + { + name: move_to_line_start + modifier: control + keycode: char_a + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolinestart} + } + { + name: move_to_line_end_or_take_history_hint + modifier: none + keycode: end + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintcomplete} + {edit: movetolineend} + ] + } + } + { + name: move_to_line_end_or_take_history_hint + modifier: control + keycode: char_e + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: historyhintcomplete} + {edit: movetolineend} + ] + } + } + { + name: move_to_line_start + modifier: control + keycode: home + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolinestart} + } + { + name: move_to_line_end + modifier: control + keycode: end + mode: [emacs, vi_normal, vi_insert] + event: {edit: movetolineend} + } + { + name: move_up + modifier: control + keycode: char_p + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menuup} + {send: up} + ] + } + } + { + name: move_down + modifier: control + keycode: char_t + mode: [emacs, vi_normal, vi_insert] + event: { + until: [ + {send: menudown} + {send: down} + ] + } + } + { + name: delete_one_character_backward + modifier: none + keycode: backspace + mode: [emacs, vi_insert] + event: {edit: backspace} + } + { + name: delete_one_word_backward + modifier: control + keycode: backspace + mode: [emacs, vi_insert] + event: {edit: backspaceword} + } + { + name: delete_one_character_forward + modifier: none + keycode: delete + mode: [emacs, vi_insert] + event: {edit: delete} + } + { + name: delete_one_character_forward + modifier: control + keycode: delete + mode: [emacs, vi_insert] + event: {edit: delete} + } + { + name: delete_one_character_forward + modifier: control + keycode: char_h + mode: [emacs, vi_insert] + event: {edit: backspace} + } + { + name: delete_one_word_backward + modifier: control + keycode: char_w + mode: [emacs, vi_insert] + event: {edit: backspaceword} + } + { + name: move_left + modifier: none + keycode: backspace + mode: vi_normal + event: {edit: moveleft} + } + { + name: newline_or_run_command + modifier: none + keycode: enter + mode: emacs + event: {send: enter} + } + { + name: move_left + modifier: control + keycode: char_b + mode: emacs + event: { + until: [ + {send: menuleft} + {send: left} + ] + } + } + { + name: move_right_or_take_history_hint + modifier: control + keycode: char_f + mode: emacs + event: { + until: [ + {send: historyhintcomplete} + {send: menuright} + {send: right} + ] + } + } + { + name: redo_change + modifier: control + keycode: char_g + mode: emacs + event: {edit: redo} + } + { + name: undo_change + modifier: control + keycode: char_z + mode: emacs + event: {edit: undo} + } + { + name: paste_before + modifier: control + keycode: char_y + mode: emacs + event: {edit: pastecutbufferbefore} + } + { + name: cut_word_left + modifier: control + keycode: char_w + mode: emacs + event: {edit: cutwordleft} + } + { + name: cut_line_to_end + modifier: control + keycode: char_k + mode: emacs + event: {edit: cuttoend} + } + { + name: cut_line_from_start + modifier: control + keycode: char_u + mode: emacs + event: {edit: cutfromstart} + } + { + name: swap_graphemes + modifier: control + keycode: char_t + mode: emacs + event: {edit: swapgraphemes} + } + { + name: move_one_word_left + modifier: alt + keycode: left + mode: emacs + event: {edit: movewordleft} + } + { + name: move_one_word_right_or_take_history_hint + modifier: alt + keycode: right + mode: emacs + event: { + until: [ + {send: historyhintwordcomplete} + {edit: movewordright} + ] + } + } + { + name: move_one_word_left + modifier: alt + keycode: char_b + mode: emacs + event: {edit: movewordleft} + } + { + name: move_one_word_right_or_take_history_hint + modifier: alt + keycode: char_f + mode: emacs + event: { + until: [ + {send: historyhintwordcomplete} + {edit: movewordright} + ] + } + } + { + name: delete_one_word_forward + modifier: alt + keycode: delete + mode: emacs + event: {edit: deleteword} + } + { + name: delete_one_word_backward + modifier: alt + keycode: backspace + mode: emacs + event: {edit: backspaceword} + } + { + name: delete_one_word_backward + modifier: alt + keycode: char_m + mode: emacs + event: {edit: backspaceword} + } + { + name: cut_word_to_right + modifier: alt + keycode: char_d + mode: emacs + event: {edit: cutwordright} + } + { + name: upper_case_word + modifier: alt + keycode: char_u + mode: emacs + event: {edit: uppercaseword} + } + { + name: lower_case_word + modifier: alt + keycode: char_l + mode: emacs + event: {edit: lowercaseword} + } + { + name: capitalize_char + modifier: alt + keycode: char_c + mode: emacs + event: {edit: capitalizechar} + } + ] + } +} diff --git a/.config/nushell/env.nu b/.config/nushell/env.nu new file mode 100644 index 0000000..dd0ee1f --- /dev/null +++ b/.config/nushell/env.nu @@ -0,0 +1,87 @@ +# Nushell Environment Config File +# +# version = "0.89.0" + +use ~/.config/nushell/prompt.nu * + +# Use nushell functions to define your right and left prompt +$env.PROMPT_COMMAND = {|| create_left_prompt } +$env.PROMPT_COMMAND_RIGHT = {|| create_right_prompt } + +# Variables that represent the state of the prompt +$env.PROMPT_INDICATOR = {|| "" } +$env.PROMPT_INDICATOR_VI_INSERT = {|| ": " } +$env.PROMPT_INDICATOR_VI_NORMAL = {|| "> " } +$env.PROMPT_MULTILINE_INDICATOR = {|| create_continuation_prompt } + +$env.TRANSIENT_PROMPT_COMMAND = {|| create_transient_prompt_left } +$env.TRANSIENT_PROMPT_INDICATOR = {|| create_transient_prompt_indicator } +# $env.TRANSIENT_PROMPT_INDICATOR_VI_INSERT = {|| "" } +# $env.TRANSIENT_PROMPT_INDICATOR_VI_NORMAL = {|| "" } +# $env.TRANSIENT_PROMPT_MULTILINE_INDICATOR = {|| "" } +# $env.TRANSIENT_PROMPT_COMMAND_RIGHT = {|| "" } + +# Specifies how environment variables are: +# - converted from a string to a value on Nushell startup (from_string) +# - converted from a value back to a string when running external commands (to_string) +# Note: The conversions happen *after* config.nu is loaded +$env.ENV_CONVERSIONS = { + "PATH": { + from_string: { |s| $s | split row (char esep) | path expand --no-symlink } + to_string: { |v| $v | path expand --no-symlink | str join (char esep) } + } + "Path": { + from_string: { |s| $s | split row (char esep) | path expand --no-symlink } + to_string: { |v| $v | path expand --no-symlink | str join (char esep) } + } +} + +# Directories to search for scripts when calling source or use +# The default for this is $nu.default-config-dir/scripts +$env.NU_LIB_DIRS = [ + ($nu.default-config-dir | path join "scripts"), # add /scripts +] + +# Directories to search for plugin binaries when calling register +# The default for this is $nu.default-config-dir/plugins +$env.NU_PLUGIN_DIRS = [ + ($nu.default-config-dir | path join "plugins"), # add /plugins +] + +# Personal env vars +$env.EDITOR = "nvim" +$env.GIT_EDITOR = "nvim" +$env.PIPENV_VERBOSITY = -1 +$env.MAKEFLAGS = $"-j((nproc | into int) + 1)" +$env.JULIA_NUM_THREADS = $"(nproc)" +$env.BAT_THEME = "tokyonight_night" +$env.YAOURT_COLORS = "nb=1:pkg=1:ver=1;32:lver=1;45:installed=1;42:grp=1;34:od=1;41;5:votes=1;44:dsc=0:other=1;35" +$env.XDG_CONFIG_HOME = $"($env.HOME)/.config" +$env.GPG_TTY = $"(/usr/bin/env tty)" +$env.PASSWORD_STORE_DIR = $"($env.HOME)/.cache/password-store" +$env.GLAMOUR_STYLE = $"($env.XDG_CONFIG_HOME)/glamour/tokyo_night.json" +$env.RYE_HOME = $"($env.XDG_CONFIG_HOME)/.rye" +# Config for less +$env.LESS_TERMCAP_mb = (ansi --escape "01;31m") # begin blinking +$env.LESS_TERMCAP_md = (ansi --escape "01;31m") # begin bold +$env.LESS_TERMCAP_me = (ansi --escape "0m") # end mode +$env.LESS_TERMCAP_so = (ansi --escape "01;44;36m") # begin standout-mode (bottom of screen) +$env.LESS_TERMCAP_se = (ansi --escape "0m") # end standout-mode +$env.LESS_TERMCAP_us = (ansi --escape "00;36m") # begin underline +$env.LESS_TERMCAP_ue = (ansi --escape "0m") # end underline +# Set a custom copy of TERM so that shells under multiplexors behave correctly +if not ("MAIN_TERM" in $env) { + $env.MAIN_TERM = $env.TERM +} + +# Finally, add session path variables +$env.PATH = ( + $env.PATH + | split row (char esep) + | append ( + open $"($nu.default-config-dir)/path.env" + | from csv --noheaders --trim all + | get "column0" + | path expand --no-symlink + ) +) diff --git a/.config/nushell/init.nu b/.config/nushell/init.nu new file mode 100644 index 0000000..bf55506 --- /dev/null +++ b/.config/nushell/init.nu @@ -0,0 +1,5 @@ +export use utils.nu * # utility functions +export use aliases.nu * # aliases for common functions +# Then we have the various config records that will be combined in config.nu +export use theme.nu +export use my_config.nu diff --git a/.config/nushell/my_config.nu b/.config/nushell/my_config.nu new file mode 100644 index 0000000..6a585a3 --- /dev/null +++ b/.config/nushell/my_config.nu @@ -0,0 +1,49 @@ +export def main [] { + { + show_banner: false # disable the welcome banner at startup + # For some reason wezterm adds a newline every keypress + shell_integration: { + osc2: true + osc7: true + osc8: true + # OSC9.9 causes swaync to notify end of every command under kitty + osc9_9: (not (("TERM" in $env) and ("kitty" in $env.TERM))) + osc133: true + osc633: true + reset_application_mode: true + } + # use kitty protocol when running inside kitty or wezterm + use_kitty_protocol: ( + ( + ("TERM" in $env) and ("kitty" in $env.TERM) + ) or ( + not ("WEZTERM_EXECUTABLE" in $env) + ) + ) + history: { + file_format: "sqlite" + } + render_right_prompt_on_last_line: true + hooks: { + env_change: { + PWD: [ + {|before, after| # This hook runs onefetch when the current directory is a git repository + if ".git\n" in ($after | ls -a | str join) { + print (^onefetch) + } + }, + {|| + if (exists direnv) { + direnv export json | from json | default {} | load-env + } + } + ] + } + } + cursor_shape: { + emacs: line + vi_normal: blink_block + vi_insert: blink_line + } + } +} diff --git a/.config/nushell/nu_scripts.nu b/.config/nushell/nu_scripts.nu new file mode 100644 index 0000000..f826865 --- /dev/null +++ b/.config/nushell/nu_scripts.nu @@ -0,0 +1,9 @@ +source ~/.config/nushell/nu_scripts/modules/background_task/task.nu +source ~/.config/nushell/nu_scripts/modules/nix/nix.nu +use ~/.config/nushell/nu_scripts/modules/nvim/mod.nu [ + tcd, + nvim-lua, + nve, + nvc, + nvs, +] diff --git a/.config/nushell/nu_scripts/.gitattributes b/.config/nushell/nu_scripts/.gitattributes new file mode 100644 index 0000000..71fd44c --- /dev/null +++ b/.config/nushell/nu_scripts/.gitattributes @@ -0,0 +1,2 @@ +# Example of a `.gitattributes` file which reclassifies `.nu` files as Nushell: +*.nu linguist-language=Nushell diff --git a/.config/nushell/nu_scripts/.github/workflows/ci.yml b/.config/nushell/nu_scripts/.github/workflows/ci.yml new file mode 100644 index 0000000..8890aa0 --- /dev/null +++ b/.config/nushell/nu_scripts/.github/workflows/ci.yml @@ -0,0 +1,27 @@ +on: + pull_request: + +env: + NUSHELL_CARGO_PROFILE: ci + NU_LOG_LEVEL: DEBUG + +jobs: + nu-check: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + - name: "Fetch main branch" + run: | + git fetch origin main --depth 1 + - uses: hustcer/setup-nu@v3.9 + with: + version: "*" + check-latest: true + # features: full # dataframe and extra included + - name: toolkit check pr + shell: nu {0} + # nix STUB_IDE_CHECK when nushell/nushell#12208 fixed + run: | + use ${{ github.workspace }}/toolkit.nu * + STUB_IDE_CHECK=true check pr --and-exit diff --git a/.config/nushell/nu_scripts/.github/workflows/image-actions.yml b/.config/nushell/nu_scripts/.github/workflows/image-actions.yml new file mode 100644 index 0000000..195761b --- /dev/null +++ b/.config/nushell/nu_scripts/.github/workflows/image-actions.yml @@ -0,0 +1,38 @@ +name: Compress Images on Push to main branch +on: + push: + branches: + - main + paths: + - '**.jpg' + - '**.jpeg' + - '**.png' + - '**.webp' +jobs: + build: + name: calibreapp/image-actions + runs-on: ubuntu-latest + steps: + - name: Checkout Repo + uses: actions/checkout@v4.1.2 + - name: Compress Images + id: calibre + uses: calibreapp/image-actions@main + with: + pngQuality: '90' + webpQuality: '90' + jpegQuality: '90' + compressOnly: true + jpegProgressive: false + # ignorePaths: 'node_modules/**,build' + # The `GITHUB_TOKEN` is automatically generated by GitHub and scoped only to the repository that is currently running the action. By default, the action can’t update Pull Requests initiated from forked repositories. + # See https://docs.github.com/en/actions/reference/authentication-in-a-workflow and https://help.github.com/en/articles/virtual-environments-for-github-actions#token-permissions + githubToken: ${{ secrets.GITHUB_TOKEN }} + - name: Create New Pull Request If Needed + if: steps.calibre.outputs.markdown != '' + uses: peter-evans/create-pull-request@v6.0.3 + with: + title: Compressed Images + branch-suffix: timestamp + commit-message: Compressed Images + body: ${{ steps.calibre.outputs.markdown }} diff --git a/.config/nushell/nu_scripts/.gitignore b/.config/nushell/nu_scripts/.gitignore new file mode 100644 index 0000000..0ac21c7 --- /dev/null +++ b/.config/nushell/nu_scripts/.gitignore @@ -0,0 +1,8 @@ +.DS_Store + +# ignore the git mailmap file +.mailmap + +check-files.nu + +.vscode/ diff --git a/.config/nushell/nu_scripts/LICENSE b/.config/nushell/nu_scripts/LICENSE new file mode 100644 index 0000000..25623d0 --- /dev/null +++ b/.config/nushell/nu_scripts/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Nushell Project + +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. diff --git a/.config/nushell/nu_scripts/README.md b/.config/nushell/nu_scripts/README.md new file mode 100644 index 0000000..42a1454 --- /dev/null +++ b/.config/nushell/nu_scripts/README.md @@ -0,0 +1,24 @@ +# Nushell Scripts + +This is a place to share Nushell scripts with each other. If you'd like to share your scripts, fork this repository, and [create a PR](https://github.com/nushell/nu_scripts/compare) that adds it to the repo. + +## Sections + +- [aliases](./aliases/) +- [benchmarks](./benchmarks/) +- [cool-oneliners](./sourced/cool-oneliners/) +- [custom-completions](./custom-completions/) - collection of custom completions for external commands. +- [custom-menus](./custom-menus/) - collection of custom nushell menus +- [example-config](./example-config/) +- [nu-hooks](./nu-hooks/) +- [modules](./modules/) - This has its dedicated [readme](./modules/README.md) +- [nu_101](./sourced/nu_101/) - Beginner introduction to nushell concepts. +- [prompt](./modules/prompt/) +- [themes](./themes/) + +## Running Scripts + +You can run nushell scripts in a few different ways. + +1. You can type `nu