├── .gitignore
├── Brewfile
├── README.md
├── _files
├── .gitconfig
├── JetBrainsMono-Regular.ttf
├── JetBrainsMonoNerdFontPropo-Medium.ttf
├── fnando.itermexport
├── fnando.itermkeymap
├── fnando.terminal
├── macOS.sh
├── timemachine.sh
└── windows-terminal.json
├── fnando
├── .bin
│ ├── adb-send-input
│ ├── backup-brew
│ ├── backup-ccc
│ ├── bolt-hud
│ ├── current-ip
│ ├── data-url
│ ├── decrypt
│ ├── docker
│ ├── encrypt
│ ├── ffmpeg-loudness
│ ├── ffmpeg-slow-down-audio
│ ├── ffmpeg-split-audio-channels
│ ├── format-git-message
│ ├── gh-action-status
│ ├── git-buster
│ ├── git-current
│ ├── git-empty
│ ├── git-track
│ ├── git-undo
│ ├── git-view
│ ├── git-wip
│ ├── imgcat
│ ├── instagram-slice
│ ├── list-ios-simulators
│ ├── pretty_html
│ ├── prince
│ ├── restart-dns
│ ├── rscp
│ ├── rtf
│ ├── server
│ ├── slim-vid
│ ├── spoof
│ ├── tmignore
│ ├── tunnel
│ ├── vectorize
│ ├── whatsapp-media
│ ├── whatsapp-vid
│ └── yt
├── .config
│ ├── gh
│ │ └── config.yml
│ ├── ghostty
│ │ └── config
│ ├── irb
│ │ ├── irbrc
│ │ └── shell_command.rb
│ ├── ll.toml
│ ├── safari.css
│ ├── starship.toml
│ ├── tmux
│ │ └── tmux.conf
│ ├── zed
│ │ ├── keymap.json
│ │ └── settings.json
│ ├── zsh-user
│ │ ├── after.sample.sh
│ │ └── before.sample.sh
│ └── zsh
│ │ ├── 1password.sh
│ │ ├── aliases.sh
│ │ ├── android-studio.sh
│ │ ├── bundler.sh
│ │ ├── cd.sh
│ │ ├── exports.sh
│ │ ├── fzf.sh
│ │ ├── git.sh
│ │ ├── init.sh
│ │ ├── keybindings.sh
│ │ ├── md.sh
│ │ ├── mise.sh
│ │ ├── options.sh
│ │ ├── psgrep.sh
│ │ ├── starship.sh
│ │ ├── sublime-text.sh
│ │ ├── tmux.sh
│ │ ├── utils.sh
│ │ ├── vscode.sh
│ │ └── zinit.sh
├── .default-gems
├── .default-npm-packages
├── .dockerignore
├── .editorconfig
├── .eslintrc
├── .gemrc
├── .gitattributes
├── .gitignore
├── .hushlogin
├── .inputrc
├── .my.cnf
├── .psqlrc
├── .railsrc
├── .rubocop.yml
├── .screenrc
├── .sqliterc
├── .ssh
│ └── config
├── .stow-global-ignore
├── .vimrc
├── .vundle.vim
├── .yarnrc.yml
├── .zshrc
└── Library
│ ├── Application Support
│ └── iTerm2
│ │ └── DynamicProfiles
│ │ └── iterm-profiles.json
│ └── LaunchAgents
│ └── com.fnando.backup-brew.plist
├── install
├── terminal.png
└── update
/.gitignore:
--------------------------------------------------------------------------------
1 | fnando/.config/gh/hosts.yml
2 | fnando/.config/zsh/user.sh
3 | fnando/.config/tpm/plugins/
4 | fnando/.config/tmux/plugins/
5 | fnando/.bin/mailhog
6 |
--------------------------------------------------------------------------------
/Brewfile:
--------------------------------------------------------------------------------
1 | tap "1password/tap"
2 | tap "akeru-inc/tap"
3 | tap "amiaopensource/amiaos"
4 | tap "aws/tap"
5 | tap "cdalvaro/tap"
6 | tap "cloudflare/cloudflare"
7 | tap "codeclimate/formulae"
8 | tap "fermyon/tap"
9 | tap "fnando/tap"
10 | tap "gobuffalo/tap"
11 | tap "goreleaser/tap"
12 | tap "hashicorp/tap"
13 | tap "heroku/brew"
14 | tap "homebrew-ffmpeg/ffmpeg"
15 | tap "homebrew/bundle"
16 | tap "homebrew/command-not-found"
17 | tap "homebrew/services"
18 | tap "jakehilborn/jakehilborn"
19 | tap "jonof/kenutils"
20 | tap "pls-rs/pls"
21 | tap "puma/puma"
22 | tap "russellbanks/tap"
23 | tap "sergiobenitez/osxct"
24 | tap "sidneys/homebrew"
25 | tap "stellar/tap"
26 | tap "stripe/stripe-cli"
27 | tap "wix/brew"
28 | # Search tool like grep, but optimized for programmers
29 | brew "ack"
30 | # Run your GitHub Actions locally
31 | brew "act"
32 | # Recompression utilities for .PNG, .MNG, .ZIP, and .GZ files
33 | brew "advancecomp"
34 | # Library for manipulating PNG images
35 | brew "libpng"
36 | # Zstandard is a real-time compression algorithm
37 | brew "zstd"
38 | # Image format providing lossless and lossy compression for web images
39 | brew "webp"
40 | # New file format for still image compression
41 | brew "jpeg-xl"
42 | # Codec library for encoding and decoding AV1 video streams
43 | brew "aom"
44 | # Software library to render fonts
45 | brew "freetype"
46 | # GNU internationalization (i18n) and localization (l10n) library
47 | brew "gettext"
48 | # Cryptography and SSL/TLS Toolkit
49 | brew "openssl@3"
50 | # Core application library for C
51 | brew "glib"
52 | # OpenType text shaping engine
53 | brew "harfbuzz"
54 | # Development kit for the Java programming language
55 | brew "openjdk"
56 | # Tool for reverse engineering 3rd party, closed, binary Android apps
57 | brew "apktool"
58 | # C library implementing the SSH2 protocol
59 | brew "libssh2"
60 | # Download with resuming and segmented downloading
61 | brew "aria2"
62 | # Record and share terminal sessions
63 | brew "asciinema"
64 | # Ogg Bitstream Library
65 | brew "libogg"
66 | # Free lossless audio codec
67 | brew "flac"
68 | # GNU multiple precision arithmetic library
69 | brew "gmp"
70 | # GNU compiler collection
71 | brew "gcc"
72 | # High quality MPEG Audio Layer III (MP3) encoder
73 | brew "lame"
74 | # Audio codec
75 | brew "opus"
76 | # Optimized BLAS library
77 | brew "openblas"
78 | # Package for scientific computing with Python
79 | brew "numpy"
80 | # Extract annotations from audio signals
81 | brew "aubio"
82 | # Automatic configure script builder
83 | brew "autoconf"
84 | # Shell extension to jump to frequently used directories
85 | brew "autojump"
86 | # Tool for generating GNU Standards-compliant Makefiles
87 | brew "automake"
88 | # Official Amazon AWS command-line interface
89 | brew "awscli"
90 | # Bourne-Again SHell, a UNIX command interpreter
91 | brew "bash"
92 | # Programmable completion for Bash 3.2
93 | brew "bash-completion"
94 | # Regular expressions library
95 | brew "oniguruma"
96 | # Clone of cat(1) with syntax highlighting and Git integration
97 | brew "bat"
98 | # Garbage collector for C and C++
99 | brew "bdw-gc"
100 | # Parser generator
101 | brew "bison"
102 | # Collection of portable C++ source libraries
103 | brew "boost"
104 | # Command-line tool to manipulate Android App Bundles
105 | brew "bundletool"
106 | # Freely available high-quality data compressor
107 | brew "bzip2"
108 | # Extract files from Microsoft cabinet files
109 | brew "cabextract"
110 | # Powerful, enterprise-ready, open source web server with automatic HTTPS
111 | brew "caddy", restart_service: true
112 | # Cargo subcommand for displaying when Rust dependencies are out of date
113 | brew "cargo-outdated"
114 | # CD/DVD/Blu-ray premastering and recording software
115 | brew "cdrtools"
116 | # Statistics utility to count lines of code
117 | brew "cloc"
118 | # Cross-platform make
119 | brew "cmake"
120 | # Unit testing framework for C
121 | brew "cmocka"
122 | # Minimalistic plugin API for video effects
123 | brew "frei0r"
124 | # Asynchronous event library
125 | brew "libevent"
126 | # Validating, recursive, caching DNS resolver
127 | brew "unbound"
128 | # GNU Transport Layer Security (TLS) Library
129 | brew "gnutls"
130 | # Image processing and image analysis library
131 | brew "leptonica"
132 | # Subtitle renderer for the ASS/SSA subtitle format
133 | brew "libass"
134 | # NaCl networking and cryptography library
135 | brew "libsodium"
136 | # Audio codecs extracted from Android open source project
137 | brew "opencore-amr"
138 | # Framework for layout and rendering of i18n text
139 | brew "pango"
140 | # Fastest and safest AV1 video encoder
141 | brew "rav1e"
142 | # OCR (Optical Character Recognition) engine
143 | brew "tesseract"
144 | # Open video compression format
145 | brew "theora"
146 | # High-performance, high-quality MPEG-4 video library
147 | brew "xvid"
148 | # Play, record, convert, and stream audio and video
149 | brew "ffmpeg"
150 | # Music player with an ncurses based interface
151 | brew "cmus"
152 | # Container runtimes on MacOS (and Linux) with minimal setup
153 | brew "colima"
154 | # Color-highlighted diff(1) output
155 | brew "colordiff"
156 | # Like tail(1), but with various colors for specified output
157 | brew "colortail"
158 | # GNU File, Shell, and Text utilities
159 | brew "coreutils"
160 | # Unit testing framework handling automated tests in C++
161 | brew "cpptest"
162 | # YAML Parser
163 | brew "libyaml"
164 | # Next-gen compiler infrastructure
165 | brew "llvm"
166 | # Package compiler and linker metadata toolkit
167 | brew "pkgconf"
168 | # Fast and statically typed, compiled language with Ruby-like syntax
169 | brew "crystal"
170 | # Clean Docker containers, images, networks, and volumes
171 | brew "docker-clean"
172 | # Isolated development environments using Docker
173 | brew "docker-compose"
174 | # Utilities for the ext2, ext3, and ext4 file systems
175 | brew "e2fsprogs"
176 | # Collection of reusable C++ library artifacts developed at Facebook
177 | brew "folly"
178 | # C++14 implementation of the TLS-1.3 standard
179 | brew "fizz"
180 | # Modular, composable client/server abstractions framework
181 | brew "wangle"
182 | # Facebook's branch of Apache Thrift, including a new C++ server
183 | brew "fbthrift"
184 | # Thrift functions for querying information from a service
185 | brew "fb303"
186 | # Shared library for Watchman and Eden projects
187 | brew "edencommon"
188 | # Validate EPUB files, version 2.0 and later
189 | brew "epubcheck"
190 | # Extremely fast JavaScript bundler and minifier
191 | brew "esbuild"
192 | # Text to speech, software speech synthesizer
193 | brew "espeak"
194 | # Perl lib for reading and writing EXIF metadata
195 | brew "exiftool"
196 | # ISO AAC audio encoder
197 | brew "faac"
198 | # Like neofetch, but much faster because written mostly in C
199 | brew "fastfetch"
200 | # Standalone library of the Fraunhofer FDK AAC code from Android
201 | brew "fdk-aac"
202 | # Play, record, convert, and stream audio and video
203 | brew "ffmpeg@4"
204 | # User-friendly command-line shell for UNIX-like operating systems
205 | brew "fish"
206 | # Infamous electronic fortune-cookie generator
207 | brew "fortune"
208 | # Library for FreeImage, a dependency-free graphics library
209 | brew "freeimage"
210 | # Generic library support script
211 | brew "libtool"
212 | # ODBC 3 connectivity for UNIX
213 | brew "unixodbc"
214 | # Libraries to talk to Microsoft SQL Server and Sybase databases
215 | brew "freetds"
216 | # Platform built on V8 to build network applications
217 | brew "node"
218 | # Terminal JSON viewer
219 | brew "fx"
220 | # Command-line fuzzy finder written in Go
221 | brew "fzf"
222 | # Graphics library to dynamically manipulate images
223 | brew "gd"
224 | # WebDriver <-> Marionette proxy
225 | brew "geckodriver"
226 | # GitHub command-line tool
227 | brew "gh"
228 | # JBIG2 decoder and library (for monochrome documents)
229 | brew "jbig2dec"
230 | # Interpreter for PostScript and PDF
231 | brew "ghostscript"
232 | # GIF image/animation creator/editor
233 | brew "gifsicle"
234 | # Distributed revision control system
235 | brew "git"
236 | # Syntax-highlighting pager for git and diff output
237 | brew "git-delta"
238 | # GNU implementation of the famous stream editor
239 | brew "gnu-sed"
240 | # Common error values for all GnuPG components
241 | brew "libgpg-error"
242 | # X.509 and CMS library
243 | brew "libksba"
244 | # Passphrase entry dialog utilizing the Assuan protocol
245 | brew "pinentry"
246 | # GNU Pretty Good Privacy (PGP) package
247 | brew "gnupg"
248 | # Generate introspection data for GObject libraries
249 | brew "gobject-introspection"
250 | # GNU grep, egrep and fgrep
251 | brew "grep"
252 | # Fulltext search engine and column store
253 | brew "groonga"
254 | # Library for reading and writing H264 video streams
255 | brew "h264bitstream"
256 | # Smarter Dockerfile linter to validate best practices
257 | brew "hadolint"
258 | # File format designed to store large amounts of data
259 | brew "hdf5"
260 | # Advanced HTML-to-text converter
261 | brew "html2text"
262 | # User-friendly cURL replacement (command-line HTTP client)
263 | brew "httpie"
264 | # Curl statistics made simple
265 | brew "httpstat"
266 | # Improved colored diff
267 | brew "icdiff"
268 | # ISO/IEC 23008-12:2017 HEIF file format decoder and encoder
269 | brew "libheif"
270 | # Tools and libraries to manipulate images in many formats
271 | brew "imagemagick"
272 | # EXIF parsing library
273 | brew "libexif"
274 | # Library to render SVG files using Cairo
275 | brew "librsvg"
276 | # Libraries for security-enabled client and server applications
277 | brew "nss"
278 | # C library to read whole-slide images (a.k.a. virtual slides)
279 | brew "openslide"
280 | # PDF rendering library (based on the xpdf-3.0 code base)
281 | brew "poppler"
282 | # Image processing library
283 | brew "vips"
284 | # Fast and secure server for resizing and converting remote images
285 | brew "imgproxy"
286 | # Install and debug iPhone apps from the command-line
287 | brew "ios-deploy"
288 | # Modular IRC client
289 | brew "irssi"
290 | # Implementation of malloc emphasizing fragmentation avoidance
291 | brew "jemalloc"
292 | # Extract Digicam setting info from EXIF JPEG headers
293 | brew "jhead"
294 | # Image manipulation library
295 | brew "jpeg"
296 | # Utility to optimize JPEG files
297 | brew "jpegoptim"
298 | # Lightweight and flexible command-line JSON processor
299 | brew "jq"
300 | # Implementations for atomic memory update operations
301 | brew "libatomic_ops"
302 | # BSD-style licensed readline alternative
303 | brew "libedit"
304 | # Conversion library
305 | brew "libiconv"
306 | # Implementation of the file(1) command
307 | brew "libmagic"
308 | # Extensible, open standard container format for audio/video
309 | brew "libmatroska"
310 | # VisualOn AAC encoder library
311 | brew "libvo-aacenc"
312 | # C library for reading, creating, and modifying zip archives
313 | brew "libzip"
314 | # LZMA-based compression program similar to gzip or bzip2
315 | brew "lzip"
316 | # Creates dependencies in makefiles
317 | brew "makedepend"
318 | # CLI for Node.js style checker and lint tool for Markdown files
319 | brew "markdownlint-cli"
320 | # High performance, distributed memory object caching system
321 | brew "memcached"
322 | # Minimalist GNU for Windows and GCC cross-compilers
323 | brew "mingw-w64"
324 | # Polyglot runtime manager (asdf rust clone)
325 | brew "mise"
326 | # Simple tool to make locally trusted development certificates
327 | brew "mkcert"
328 | # QUIC transport protocol implementation
329 | brew "mvfst"
330 | # General-purpose lossless data-compression library
331 | brew "zlib"
332 | # Open source relational database management system
333 | brew "mysql"
334 | # Open source relational database management system
335 | brew "mysql-client"
336 | # Small build system for use with gyp or CMake
337 | brew "ninja"
338 | # Port scanning utility for large networks
339 | brew "nmap"
340 | # Retrieves currently playing media, and simulates media actions
341 | brew "nowplaying-cli"
342 | # PNG file optimizer
343 | brew "optipng"
344 | # Oil Runtime Compiler (ORC)
345 | brew "orc"
346 | # Clean C library for processing UTF-8 Unicode data
347 | brew "utf8proc"
348 | # Terminal multiplexer
349 | brew "tmux"
350 | # Process manager for Procfile-based applications and tmux
351 | brew "overmind"
352 | # Multithreaded PNG optimizer written in Rust
353 | brew "oxipng"
354 | # CLI for Postgres with auto-completion and syntax highlighting
355 | brew "pgcli"
356 | # Granddaddy of HTML tools, with support for modern standards
357 | brew "tidy-html5"
358 | # General-purpose scripting language
359 | brew "php"
360 | # Tool to automatically fix PHP coding standards issues
361 | brew "php-cs-fixer"
362 | # General-purpose scripting language
363 | brew "php@8.1"
364 | # Pinentry for GPG on Mac
365 | brew "pinentry-mac"
366 | # Python dependency management tool
367 | brew "pipenv"
368 | # Optimizer for PNG files
369 | brew "pngcrush"
370 | # PNG image optimizing utility
371 | brew "pngquant"
372 | # Object-relational database system
373 | brew "postgresql@17", link: true
374 | # Convert bitmaps to vector graphics
375 | brew "potrace"
376 | # Pretty-print tabular data in Python
377 | brew "python-tabulate"
378 | # Generic machine emulator and virtualizer
379 | brew "qemu"
380 | # Cross-platform application and UI framework
381 | brew "qt"
382 | # Sampling profiler for Ruby
383 | brew "rbspy"
384 | # Generate C-based recognizers from regular expressions
385 | brew "re2c"
386 | # Reattach process (e.g., tmux) to background
387 | brew "reattach-to-user-namespace"
388 | # Persistent key-value database, with built-in net interface
389 | brew "redis"
390 | # Readline wrapper: adds readline support to tools that lack it
391 | brew "rlwrap"
392 | # Utility that provides fast incremental file transfer
393 | brew "rsync"
394 | # Ruby autoformatter
395 | brew "rubyfmt"
396 | # Command-line tool for the Amazon S3 service
397 | brew "s3cmd"
398 | # Fast and accurate code counter with complexity and COCOMO estimates
399 | brew "scc"
400 | # High-speed implementation of the Dirac codec
401 | brew "schroedinger"
402 | # Substitute for classic 'make' tool with autoconf/automake functionality
403 | brew "scons"
404 | # SDL 1.2 compatibility layer that uses SDL 2.0 behind the scenes
405 | brew "sdl12-compat"
406 | # Easily detect and prevent bugs and anti-patterns in your codebase
407 | brew "semgrep"
408 | # Static analysis and lint tool, for (ba)sh scripts
409 | brew "shellcheck"
410 | # Autoformat shell script source code
411 | brew "shfmt"
412 | # HTTP regression testing and benchmarking utility
413 | brew "siege"
414 | # SOund eXchange: universal sound sample translator
415 | brew "sox"
416 | # SQL linter and auto-formatter for Humans
417 | brew "sqlfluff"
418 | # Add a public key to a remote machine's authorized_keys file
419 | brew "ssh-copy-id"
420 | # Proxy server that works as a poor man's VPN
421 | brew "sshuttle"
422 | # Test SSL/TLS enabled services to discover supported cipher suites
423 | brew "sslscan"
424 | # Cross-shell prompt for astronauts
425 | brew "starship"
426 | # Stellar command-line tool for interacting with the Stellar network
427 | brew "stellar-cli"
428 | # Organize software neatly under a single directory tree (e.g. /usr/local)
429 | brew "stow"
430 | # Nodejs-based tool for optimizing SVG vector graphics files
431 | brew "svgo"
432 | # Formatting tool for reformatting Swift code
433 | brew "swiftformat"
434 | # Tool to enforce Swift style and conventions
435 | brew "swiftlint"
436 | # User interface to the TELNET protocol
437 | brew "telnet"
438 | # Send macOS User Notifications from the command-line
439 | brew "terminal-notifier"
440 | # Program that allows you to count code, quickly
441 | brew "tokei"
442 | # Anonymizing overlay network for TCP
443 | brew "tor"
444 | # Display directories as trees (with optional color/HTML output)
445 | brew "tree"
446 | # Command-line unarchiving tools supporting multiple formats
447 | brew "unar"
448 | # Compress/expand executable files
449 | brew "upx"
450 | # URI parsing library (strictly RFC 3986 compliant)
451 | brew "uriparser"
452 | # Syntax-aware linter for prose
453 | brew "vale"
454 | # Command-line tool for Vapor (Server-side Swift web framework)
455 | brew "vapor"
456 | # Executes a program periodically, showing output fullscreen
457 | brew "watch"
458 | # Watch files and take action when they change
459 | brew "watchman"
460 | # Internet file retriever
461 | brew "wget"
462 | # Library to create, extract, and modify Windows Imaging files
463 | brew "wimlib"
464 | # Linter for YAML files
465 | brew "yamllint"
466 | # Feature-rich command-line audio/video downloader
467 | brew "yt-dlp"
468 | # Pluggable terminal workspace, with terminal multiplexer as the base feature
469 | brew "zellij"
470 | # Flexible and fast Zsh plugin manager
471 | brew "zinit"
472 | # UNIX shell (command interpreter)
473 | brew "zsh"
474 | # Fish-like fast/unobtrusive autosuggestions for zsh
475 | brew "zsh-autosuggestions"
476 | # Feature-rich syntax highlighting for Zsh
477 | brew "zsh-fast-syntax-highlighting"
478 | # Fish shell like syntax highlighting for zsh
479 | brew "zsh-syntax-highlighting"
480 | # ZSH plugin that reminds you to use existing aliases for commands you just typed
481 | brew "zsh-you-should-use"
482 | # macOS app notarization helper
483 | brew "akeru-inc/tap/xcnotary"
484 | # Open-source tool for building and running serverless WebAssembly applications
485 | brew "fermyon/tap/spin"
486 | # A prettier terminal's ls command, with color and https://www.nerdfonts.com/ icons.
487 | brew "fnando/tap/ll"
488 | # A command-line tool to retrieve secrets from 1Password, with custom output to several formats. Depends on 1Password's own `op` command.
489 | brew "fnando/tap/op-env"
490 | brew "gobuffalo/tap/buffalo"
491 | # Everything you need to get started with Heroku
492 | brew "heroku/brew/heroku"
493 | # Ken Silverman's PNG optimisation utility
494 | brew "jonof/kenutils/pngout"
495 | # Komac - Community Manifest Creator for Windows Package Manager (WinGet)
496 | brew "russellbanks/tap/komac"
497 | # x86_64 Linux GNU Toolchain
498 | brew "sergiobenitez/osxct/x86_64-unknown-linux-gnu"
499 | # Extract, view, and test RAR archives
500 | brew "sidneys/homebrew/unrar"
501 | # Stripe CLI utility
502 | brew "stripe/stripe-cli/stripe"
503 | # Apple simulator utilities
504 | brew "wix/brew/applesimutils"
505 | # Command-line interface for 1Password
506 | cask "1password-cli"
507 | # Application launcher and productivity software
508 | cask "alfred"
509 | # User-friendly GUI app for Homebrew
510 | cask "applite"
511 | # Tool to uninstall unwanted applications and their support files
512 | cask "appzapper"
513 | # Menu bar icon organiser
514 | cask "bartender"
515 | # E-books management software
516 | cask "calibre"
517 | # Automated testing of webapps for Google Chrome
518 | cask "chromedriver"
519 | # Application window manager focusing on simplicity
520 | cask "divvy"
521 | # App to build and share containerised applications and microservices
522 | cask "docker"
523 | # Web browser
524 | cask "firefox"
525 | # Dreamcast, Naomi and Atomiswave emulator
526 | cask "flycast"
527 | cask "font-jetbrains-mono"
528 | cask "font-jetbrains-mono-nerd-font"
529 | # Web browser
530 | cask "google-chrome"
531 | # Utility to hide menu bar items
532 | cask "hiddenbar"
533 | # Terminal emulator as alternative to Apple's Terminal app
534 | cask "iterm2"
535 | # Tool to control external monitor brightness & volume
536 | cask "monitorcontrol"
537 | # Music tagger
538 | cask "musicbrainz-picard"
539 | # Retro video game emulation
540 | cask "openemu"
541 | # Thumbnails, static previews, cover art and metadata for video files
542 | cask "qlvideo"
543 | # Tool that provides consistent, highly configurable symbols for apps
544 | cask "sf-symbols"
545 | # Digital design and prototyping platform
546 | cask "sketch"
547 | # Team communication and collaboration software
548 | cask "slack"
549 | # Control your Sonos system
550 | cask "sonos"
551 | # System monitor for the menu bar
552 | cask "stats"
553 | # Text editor for code, markup and prose
554 | cask "sublime-text"
555 | # Native GUI tool for relational databases
556 | cask "tableplus"
557 | # Unpacks archive files
558 | cask "the-unarchiver"
559 | # Virtual machines UI using QEMU
560 | cask "utm"
561 | # Open-source code editor
562 | cask "visual-studio-code", args: { appdir: "/Applications" }
563 | # Multimedia player
564 | cask "vlc"
565 | # Alternative and privacy-friendly YouTube frontend
566 | cask "yattee"
567 | # Multiplayer code editor
568 | cask "zed"
569 | # Video communication and virtual meeting platform
570 | cask "zoom"
571 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Dotfiles
2 |
3 | 
4 |
5 | Welcome to my dotfiles! It features:
6 |
7 | - Light theme
8 | - ZSH configuration
9 | - [mise](https://mise.jdx.dev/) as runtime manager
10 |
11 | ## Requirements
12 |
13 | ### Install dependencies
14 |
15 | On macOS:
16 |
17 | ```bash
18 | brew install stow git zsh starship jq fnando/tap/ll fnando/tap/op-env
19 | brew install iterm2 --cask
20 | ```
21 |
22 | ### Install ZSH
23 |
24 | Make it available:
25 |
26 | ```bash
27 | grep -q -f $(which zsh) /etc/shells || echo $(which zsh) | sudo tee -a /etc/shells
28 | ```
29 |
30 | Finally, set it as the default shell:
31 |
32 | ```bash
33 | chsh -s $(which zsh)
34 | ```
35 |
36 | On macOS you may want to disable the line that sets the `PATH` on
37 | `/etc/zprofile`.
38 |
39 | ### Install Dotfiles
40 |
41 | 1. Clone https://github.com/fnando/dotfiles somewhere, like `~/.dotfiles`.
42 | 2. Go to `~/.dotfiles` then run `./install`.
43 | 3. Now run `stow fnando -t $HOME` to symlink all config files.
44 | 4. Restart your terminal.
45 |
46 | How it works: most of the configuration is managed by
47 | [stow](https://www.gnu.org/software/stow/), which symlinks files to the right
48 | places. That means you can easily add or remove configurations by adding or
49 | changing files on the `~/.dotfiles` directory. Then you can commit and push
50 | these changes to your own repo.
51 |
52 | ### Install Nerd Fonts
53 |
54 | Install a [Nerd Font](https://github.com/ryanoasis/nerd-fonts) and activate it
55 | on your terminal profile. I personally like
56 | [JetBrains Mono](https://www.jetbrains.com/lp/mono/)'s variant.
57 |
58 | ## License
59 |
60 | Copyright (c) 2014 Nando Vieira
61 |
62 | MIT License
63 |
64 | Permission is hereby granted, free of charge, to any person obtaining a copy of
65 | this software and associated documentation files (the "Software"), to deal in
66 | the Software without restriction, including without limitation the rights to
67 | use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
68 | the Software, and to permit persons to whom the Software is furnished to do so,
69 | subject to the following conditions:
70 |
71 | The above copyright notice and this permission notice shall be included in all
72 | copies or substantial portions of the Software.
73 |
74 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
75 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
76 | FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
77 | COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
78 | IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
79 | CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
80 |
--------------------------------------------------------------------------------
/_files/.gitconfig:
--------------------------------------------------------------------------------
1 | [color]
2 | branch = auto
3 | diff = auto
4 | status = auto
5 | ui = true
6 | [color "diff"]
7 | commit = yellow
8 | frag = cyan
9 | meta = yellow
10 | new = green
11 | old = red
12 | plain = black
13 | whitespace = red reverse
14 | [commit]
15 | verbose = true
16 | [alias]
17 | b = branch
18 | ca = commit --amend
19 | ci = commit
20 | co = checkout
21 | dw = diff --word-diff
22 | fl = log -p
23 | lg = log --oneline --decorate
24 | sb = status -sb
25 | sh = !git-sh
26 | st = status
27 | who = shortlog -s --
28 | [help]
29 | autocorrect = 1
30 | [branch]
31 | autosetuprebase = always
32 | sort = -committerdate
33 | [push]
34 | default = current
35 | autosetupremote = true
36 | [core]
37 | excludesfile = ~/.gitignore
38 | attributesfile = ~/.gitattributes
39 | [merge]
40 | ff = only
41 | [fetch]
42 | prune = true
43 | pruneTags = true
44 | all = true
45 | [color "diff-highlight"]
46 | newHighlight = green reverse
47 | newNormal = green
48 | oldHighlight = red reverse
49 | oldNormal = red
50 | [init]
51 | defaultBranch = main
52 | [rebase]
53 | autosquash = true
54 | updaterefs = true
55 | [pull]
56 | rebase = true
57 | [tag]
58 | sort = version:refname
59 | [diff]
60 | colormoved = plain
61 | renames = true
62 | mnemonicprefix = true
63 | algorithm = histogram
64 |
--------------------------------------------------------------------------------
/_files/JetBrainsMono-Regular.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fnando/dotfiles/74c14ad646669d9bb4c9d4153cf034025da04192/_files/JetBrainsMono-Regular.ttf
--------------------------------------------------------------------------------
/_files/JetBrainsMonoNerdFontPropo-Medium.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fnando/dotfiles/74c14ad646669d9bb4c9d4153cf034025da04192/_files/JetBrainsMonoNerdFontPropo-Medium.ttf
--------------------------------------------------------------------------------
/_files/fnando.itermexport:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fnando/dotfiles/74c14ad646669d9bb4c9d4153cf034025da04192/_files/fnando.itermexport
--------------------------------------------------------------------------------
/_files/fnando.itermkeymap:
--------------------------------------------------------------------------------
1 | {
2 | "Touch Bar Items": [],
3 | "Key Mappings": {
4 | "0xf728-0x80000": {
5 | "Action": 10,
6 | "Text": "d"
7 | },
8 | "0xf702-0x280000": {
9 | "Action": 10,
10 | "Text": "b"
11 | },
12 | "0xf70d-0x20000": {
13 | "Action": 10,
14 | "Text": "[21;2~"
15 | },
16 | "0x7f-0x80000": {
17 | "Action": 11,
18 | "Text": "0x1b 0x7f"
19 | },
20 | "0xf708-0x20000": {
21 | "Action": 10,
22 | "Text": "[15;2~"
23 | },
24 | "0x33-0x40000": {
25 | "Action": 11,
26 | "Text": "0x1b"
27 | },
28 | "0xf703-0x260000": {
29 | "Action": 10,
30 | "Text": "[1;6C"
31 | },
32 | "0xf729-0x20000": {
33 | "Action": 10,
34 | "Text": "[1;2H"
35 | },
36 | "0xf702-0x260000": {
37 | "Action": 10,
38 | "Text": "[1;6D"
39 | },
40 | "0x38-0x40000": {
41 | "Action": 11,
42 | "Text": "0x7f"
43 | },
44 | "0xf72b-0x40000": {
45 | "Action": 10,
46 | "Text": "[1;5F"
47 | },
48 | "0xf70c-0x20000": {
49 | "Action": 10,
50 | "Text": "[20;2~"
51 | },
52 | "0xf701-0x260000": {
53 | "Action": 10,
54 | "Text": "[1;6B"
55 | },
56 | "0x32-0x40000": {
57 | "Action": 11,
58 | "Text": "0x00"
59 | },
60 | "0xf707-0x20000": {
61 | "Action": 10,
62 | "Text": "[1;2S"
63 | },
64 | "0xf703-0x240000": {
65 | "Text": "f",
66 | "Action": 10
67 | },
68 | "0xf700-0x260000": {
69 | "Action": 10,
70 | "Text": "[1;6A"
71 | },
72 | "0xf702-0x240000": {
73 | "Text": "b",
74 | "Action": 10
75 | },
76 | "0xf703-0x300000": {
77 | "Action": 11,
78 | "Text": "0x5"
79 | },
80 | "0x37-0x40000": {
81 | "Action": 11,
82 | "Text": "0x1f"
83 | },
84 | "0x3-0x200000": {
85 | "Action": 11,
86 | "Text": "0xd"
87 | },
88 | "0xf701-0x240000": {
89 | "Action": 10,
90 | "Text": "[1;5B"
91 | },
92 | "0xf702-0x300000": {
93 | "Action": 11,
94 | "Text": "0x1"
95 | },
96 | "0xf703-0x220000": {
97 | "Action": 10,
98 | "Text": "[1;2C"
99 | },
100 | "0xf739-0x0": {
101 | "Action": 13,
102 | "Text": ""
103 | },
104 | "0xf70b-0x20000": {
105 | "Action": 10,
106 | "Text": "[19;2~"
107 | },
108 | "0xf728-0x0": {
109 | "Action": 11,
110 | "Text": "0x4"
111 | },
112 | "0xf706-0x20000": {
113 | "Action": 10,
114 | "Text": "[1;2R"
115 | },
116 | "0xf700-0x240000": {
117 | "Action": 10,
118 | "Text": "[1;5A"
119 | },
120 | "0xf702-0x220000": {
121 | "Action": 10,
122 | "Text": "[1;2D"
123 | },
124 | "0x36-0x40000": {
125 | "Action": 11,
126 | "Text": "0x1e"
127 | },
128 | "0xf70f-0x20000": {
129 | "Action": 10,
130 | "Text": "[24;2~"
131 | },
132 | "0xf701-0x220000": {
133 | "Action": 10,
134 | "Text": "[1;2B"
135 | },
136 | "0xf70a-0x20000": {
137 | "Action": 10,
138 | "Text": "[18;2~"
139 | },
140 | "0xf729-0x40000": {
141 | "Action": 10,
142 | "Text": "[1;5H"
143 | },
144 | "0xf72b-0x20000": {
145 | "Action": 10,
146 | "Text": "[1;2F"
147 | },
148 | "0xf700-0x220000": {
149 | "Action": 10,
150 | "Text": "[1;2A"
151 | },
152 | "0x30-0x200000": {
153 | "Action": 12,
154 | "Text": "0"
155 | },
156 | "0xf705-0x20000": {
157 | "Action": 10,
158 | "Text": "[1;2Q"
159 | },
160 | "0x31-0x200000": {
161 | "Action": 12,
162 | "Text": "1"
163 | },
164 | "0x33-0x200000": {
165 | "Action": 12,
166 | "Text": "3"
167 | },
168 | "0x35-0x40000": {
169 | "Action": 11,
170 | "Text": "0x1d"
171 | },
172 | "0x34-0x200000": {
173 | "Action": 12,
174 | "Text": "4"
175 | },
176 | "0x32-0x200000": {
177 | "Action": 12,
178 | "Text": "2"
179 | },
180 | "0x35-0x200000": {
181 | "Action": 12,
182 | "Text": "5"
183 | },
184 | "0x36-0x200000": {
185 | "Action": 12,
186 | "Text": "6"
187 | },
188 | "0x37-0x200000": {
189 | "Action": 12,
190 | "Text": "7"
191 | },
192 | "0x2d-0x40000": {
193 | "Action": 11,
194 | "Text": "0x1f"
195 | },
196 | "0x38-0x200000": {
197 | "Action": 12,
198 | "Text": "8"
199 | },
200 | "0x2a-0x200000": {
201 | "Action": 12,
202 | "Text": "*"
203 | },
204 | "0x39-0x200000": {
205 | "Action": 12,
206 | "Text": "9"
207 | },
208 | "0x2b-0x200000": {
209 | "Action": 12,
210 | "Text": "+"
211 | },
212 | "0xf70e-0x20000": {
213 | "Action": 10,
214 | "Text": "[23;2~"
215 | },
216 | "0x2e-0x200000": {
217 | "Action": 12,
218 | "Text": "."
219 | },
220 | "0x2d-0x200000": {
221 | "Action": 12,
222 | "Text": "-"
223 | },
224 | "0xf709-0x20000": {
225 | "Action": 10,
226 | "Text": "[17;2~"
227 | },
228 | "0x7f-0x100000": {
229 | "Action": 11,
230 | "Text": "0x15"
231 | },
232 | "0x2f-0x200000": {
233 | "Action": 12,
234 | "Text": "/"
235 | },
236 | "0xf704-0x20000": {
237 | "Action": 10,
238 | "Text": "[1;2P"
239 | },
240 | "0x34-0x40000": {
241 | "Action": 11,
242 | "Text": "0x1c"
243 | },
244 | "0xf703-0x280000": {
245 | "Action": 10,
246 | "Text": "f"
247 | }
248 | }
249 | }
250 |
251 |
--------------------------------------------------------------------------------
/_files/fnando.terminal:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | ANSIBlackColor
6 |
7 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
8 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
9 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs
10 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
11 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
12 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
13 |
14 | ANSIBlueColor
15 |
16 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
17 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T
18 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjIwNjE3NDMx
19 | NCAwLjQ3OTM5NzQ0NTkgMC41NTg5OTIzMjYzIDFPECUwLjE2NDc1MTQxMDUgMC40MDQ0
20 | MjE3NDY3IDAuNDg1MzgwNTkAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF0hoN
21 | GxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABh
22 | Y3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAA
23 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAAB
24 | UAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA
25 | ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2
26 | dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNo
27 | AAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAA
28 | AENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA
29 | AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIu
30 | MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
31 | WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABv
32 | ogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rl
33 | c2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRw
34 | Oi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
35 | AAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91
36 | ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdC
37 | IGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAA
38 | AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAA
39 | AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA
40 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAE
41 | EwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAA
42 | AAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ
43 | AB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
44 | mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEf
45 | ASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB
46 | 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB
47 | AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD
48 | 7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ
49 | BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG
50 | 9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjS
51 | COcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvML
52 | CwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10
53 | DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQ
54 | QxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxND
55 | E2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8W
56 | shbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpR
57 | GncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAe
58 | ah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKv
59 | It0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kn
60 | eierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxu
61 | LKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox
62 | 8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec
63 | N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9
64 | 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH
65 | RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL
66 | U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8
67 | UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4Wgda
68 | VlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJ
69 | Ypxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q
70 | 92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4
71 | dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9
72 | QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobX
73 | hzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaR
74 | P5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuv
75 | nByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum
76 | /adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJL
77 | ssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+
78 | hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3
79 | yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX
80 | 4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T8
81 | 5YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz
82 | GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+ABNIe
83 | HyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRhWE5T
84 | T2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05TQ29s
85 | b3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcAPwBF
86 | AFAAXQBjAHAAhQCMALYA3gDgAOIA5ADrAPAA9gD4APoA/AEBAQkNVQ1XDVwNZw1wDX4N
87 | gg2JDZINlw2kDacNtA25DcENxA3WDdkN3gAAAAAAAAIBAAAAAAAAAC8AAAAAAAAAAAAA
88 | AAAAAA3g
89 |
90 | ANSIBrightBlackColor
91 |
92 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
93 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
94 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs
95 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
96 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
97 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
98 |
99 | ANSIBrightBlueColor
100 |
101 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
102 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T
103 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECcwLjIwNjE3NDMx
104 | NCAwLjQ3OTM5NzQ0NTkgMC41NTg5OTIzMjYzIDFPECUwLjE2NDc1MTQxMDUgMC40MDQ0
105 | MjE3NDY3IDAuNDg1MzgwNTkAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF0hoN
106 | GxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAxAABh
107 | Y3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAAAAAA
108 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0AAAB
109 | UAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAACGAAA
110 | ABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAAAIh2
111 | dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0ZWNo
112 | AAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0AAAA
113 | AENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAA
114 | AAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIu
115 | MQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
116 | WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABv
117 | ogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z2Rl
118 | c2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBodHRw
119 | Oi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
120 | AAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91
121 | ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdC
122 | IGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAAAAAA
123 | AAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAAAAAA
124 | AAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEA
125 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAE
126 | EwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAA
127 | AAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZ
128 | AB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUA
129 | mgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEf
130 | ASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB
131 | 2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB
132 | AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPTA+AD
133 | 7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsFOgVJ
134 | BVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbRBuMG
135 | 9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoIvgjS
136 | COcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrcCvML
137 | CwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUANWg10
138 | DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJECYQ
139 | QxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMTIxND
140 | E2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8W
141 | shbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpR
142 | GncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAe
143 | ah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKv
144 | It0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kn
145 | eierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxu
146 | LKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox
147 | 8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec
148 | N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1hPaE9
149 | 4D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BEA0RH
150 | RIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrESwxL
151 | U0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZSMVJ8
152 | UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4Wgda
153 | VlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh9WJJ
154 | Ypxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q
155 | 92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4
156 | dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9
157 | QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobX
158 | hzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaR
159 | P5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuv
160 | nByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum
161 | /adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJL
162 | ssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+
163 | hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3
164 | yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY11zX
165 | 4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vkc+T8
166 | 5YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/8ozz
167 | GfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+ABNIe
168 | HyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRhWE5T
169 | T2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05TQ29s
170 | b3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcAPwBF
171 | AFAAXQBjAHAAhQCMALYA3gDgAOIA5ADrAPAA9gD4APoA/AEBAQkNVQ1XDVwNZw1wDX4N
172 | gg2JDZINlw2kDacNtA25DcENxA3WDdkN3gAAAAAAAAIBAAAAAAAAAC8AAAAAAAAAAAAA
173 | AAAAAA3g
174 |
175 | ANSIBrightGreenColor
176 |
177 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
178 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
179 | LjI2NjY2NjY2NjcgMC40MzEzNzI1NDkgMC4wNzg0MzEzNzI1NQAQAYAC0hAREhNaJGNs
180 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
181 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
182 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
183 |
184 | ANSIBrightMagentaColor
185 |
186 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
187 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBsw
188 | LjQwMDAwMDAwNiAwIDAuNTUyOTQxMjAzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xh
189 | c3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SA
190 | AQgRGiMtMjc7QUhOW2KAgoSJlJ2lqLHDxssAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAA
191 | AAAAAAAAzQ==
192 |
193 | ANSIBrightRedColor
194 |
195 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
196 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw
197 | Ljg5NDExNzY1MzQgMC4xODAzOTIxNjEgMC4xNDExNzY0NzcxABABgALSEBESE1okY2xh
198 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2
199 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA
200 | ABkAAAAAAAAAAAAAAAAAAADY
201 |
202 | ANSIBrightWhiteColor
203 |
204 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
205 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T
206 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjc0NDI2OTg3
207 | MjEgMC43NDQyNjk4NzIxIDAuNzQ0MjY5ODcyMSAxTxAnMC42OTA2NDc2MDIxIDAuNjkw
208 | NjI2OTE5MyAwLjY5MDYzODYwMTgAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF
209 | 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx
210 | AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA
211 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0
212 | AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC
213 | GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA
214 | AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0
215 | ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0
216 | AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz
217 | YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2
218 | LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
219 | AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA
220 | AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2
221 | z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo
222 | dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
223 | AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv
224 | bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg
225 | UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA
226 | AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA
227 | AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y
228 | LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt
229 | zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA
230 | AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A
231 | FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ
232 | AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB
233 | GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ
234 | AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC
235 | tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT
236 | A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF
237 | OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR
238 | BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI
239 | vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc
240 | CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN
241 | Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ
242 | ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT
243 | IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs
244 | Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa
245 | KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W
246 | HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi
247 | giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY
248 | J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs
249 | OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC
250 | Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3
251 | YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h
252 | PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE
253 | A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE
254 | SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS
255 | MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4
256 | WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh
257 | 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI
258 | ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz
259 | XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB
260 | fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G
261 | cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu
262 | kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb
263 | QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa
264 | poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx
265 | 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P
266 | vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK
267 | OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY
268 | 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk
269 | c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/
270 | 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A
271 | BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh
272 | WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T
273 | Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA
274 | PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z
275 | DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA
276 | AAAAAAAAAA3j
277 |
278 | ANSIBrightYellowColor
279 |
280 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
281 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECkw
282 | Ljk3NjQ3MDY0OTIgMC42ODIzNTI5NjAxIDAuMDA3ODQzMTM3NzE5ABACgALSEBESE1ok
283 | Y2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJj
284 | aGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYo6Qkpeiq7O2v9HU2QAAAAAAAAEBAAAA
285 | AAAAABkAAAAAAAAAAAAAAAAAAADb
286 |
287 | ANSIGreenColor
288 |
289 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
290 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
291 | LjI2NjY2NjY2NjcgMC40MzEzNzI1NDkgMC4wNzg0MzEzNzI1NQAQAYAC0hAREhNaJGNs
292 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
293 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
294 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
295 |
296 | ANSIMagentaColor
297 |
298 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
299 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPEBsw
300 | LjQwMDAwMDAwNiAwIDAuNTUyOTQxMjAzMQAQAYAC0hAREhNaJGNsYXNzbmFtZVgkY2xh
301 | c3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hpdmVy0RcYVHJvb3SA
302 | AQgRGiMtMjc7QUhOW2KAgoSJlJ2lqLHDxssAAAAAAAABAQAAAAAAAAAZAAAAAAAAAAAA
303 | AAAAAAAAzQ==
304 |
305 | ANSIRedColor
306 |
307 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
308 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECYw
309 | Ljg5NDExNzY1MzQgMC4xODAzOTIxNjEgMC4xNDExNzY0NzcxABABgALSEBESE1okY2xh
310 | c3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJjaGl2
311 | ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYouNj5SfqLCzvM7R1gAAAAAAAAEBAAAAAAAA
312 | ABkAAAAAAAAAAAAAAAAAAADY
313 |
314 | ANSIWhiteColor
315 |
316 | YnBsaXN0MDDUAQIDBAUGKyxYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
317 | AAGGoKcHCBMZHSQoVSRudWxs1QkKCwwNDg8QERJcTlNDb21wb25lbnRzVU5TUkdCXE5T
318 | Q29sb3JTcGFjZV8QEk5TQ3VzdG9tQ29sb3JTcGFjZVYkY2xhc3NPECgwLjYyMzA1ODgw
319 | NDYgMC42MjMwNTg4MDQ2IDAuNjIzMDU4ODA0NiAxTxAnMC41NTQ2NTM0MDYxIDAuNTU0
320 | NjM2ODk1NyAwLjU1NDY0NjI1MzYAEAGAAoAG0xQVDRYXGFROU0lEVU5TSUNDEAeAA4AF
321 | 0hoNGxxXTlMuZGF0YU8RDEgAAAxITGlubwIQAABtbnRyUkdCIFhZWiAHzgACAAkABgAx
322 | AABhY3NwTVNGVAAAAABJRUMgc1JHQgAAAAAAAAAAAAAAAAAA9tYAAQAAAADTLUhQICAA
323 | AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABFjcHJ0
324 | AAABUAAAADNkZXNjAAABhAAAAGx3dHB0AAAB8AAAABRia3B0AAACBAAAABRyWFlaAAAC
325 | GAAAABRnWFlaAAACLAAAABRiWFlaAAACQAAAABRkbW5kAAACVAAAAHBkbWRkAAACxAAA
326 | AIh2dWVkAAADTAAAAIZ2aWV3AAAD1AAAACRsdW1pAAAD+AAAABRtZWFzAAAEDAAAACR0
327 | ZWNoAAAEMAAAAAxyVFJDAAAEPAAACAxnVFJDAAAEPAAACAxiVFJDAAAEPAAACAx0ZXh0
328 | AAAAAENvcHlyaWdodCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVz
329 | YwAAAAAAAAASc1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2
330 | LTIuMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
331 | AAAAWFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA
332 | AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2
333 | z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAFklFQyBo
334 | dHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
335 | AAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQgUkdCIGNv
336 | bG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERlZmF1bHQg
337 | UkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZGVzYwAA
338 | AAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0aW9uIGluIElFQzYxOTY2LTIuMQAA
339 | AAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5nIENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0y
340 | LjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPt
341 | zAAEEwsAA1yeAAAAAVhZWiAAAAAAAEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAA
342 | AAAAAAAAAAAAAAAAAo8AAAACc2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8A
343 | FAAZAB4AIwAoAC0AMgA3ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQ
344 | AJUAmgCfAKQAqQCuALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMB
345 | GQEfASUBKwEyATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJ
346 | AdEB2QHhAekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwC
347 | tgLBAssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT
348 | A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUcBSsF
349 | OgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAadBq8GwAbR
350 | BuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRghaCG4IggiWCKoI
351 | vgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpUCmoKgQqYCq4KxQrc
352 | CvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyODKcMwAzZDPMNDQ0mDUAN
353 | Wg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8JDyUPQQ9eD3oPlg+zD88P7BAJ
354 | ECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJEegSBxImEkUSZBKEEqMSwxLjEwMT
355 | IxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTOFPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZs
356 | Fo8WshbWFvoXHRdBF2UXiReuF9IX9xgbGEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQa
357 | KhpRGncanhrFGuwbFBs7G2MbihuyG9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4W
358 | HkAeah6UHr4e6R8THz4faR+UH78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUi
359 | giKvIt0jCiM4I2YjlCPCI/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcY
360 | J0kneierJ9woDSg/KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUs
361 | OSxuLKIs1y0MLUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGC
362 | Mbox8jIqMmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3
363 | YDecN9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h
364 | PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9Q8BE
365 | A0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnwSjdKfUrE
366 | SwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7UQZRUFGbUeZS
367 | MVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfgWC9YfVjLWRpZaVm4
368 | WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19hX7NgBWBXYKpg/GFPYaJh
369 | 9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9Z5Nn6Wg/aJZo7GlDaZpp8WpI
370 | ap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94b9FwK3CGcOBxOnGVcfByS3KmcwFz
371 | XXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gReG54zHkqeYl553pGeqV7BHtje8J8IXyB
372 | fOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEKgWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6G
373 | cobXhzuHn4gEiGmIzokziZmJ/opkisqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBu
374 | kNaRP5GokhGSepLjk02TtpQglIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWb
375 | QpuvnByciZz3nWSd0p5Anq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYa
376 | poum/adup+CoUqjEqTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx
377 | 1rJLssKzOLOutCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2P
378 | vgq+hL7/v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnK
379 | OMq3yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY
380 | 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj4+vk
381 | c+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY8OXxcvH/
382 | 8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26/kv+3P9t//+A
383 | BNIeHyAhWiRjbGFzc25hbWVYJGNsYXNzZXNdTlNNdXRhYmxlRGF0YaMgIiNWTlNEYXRh
384 | WE5TT2JqZWN00h4fJSZcTlNDb2xvclNwYWNloicjXE5TQ29sb3JTcGFjZdIeHykqV05T
385 | Q29sb3KiKSNfEA9OU0tleWVkQXJjaGl2ZXLRLS5Ucm9vdIABAAgAEQAaACMALQAyADcA
386 | PwBFAFAAXQBjAHAAhQCMALcA4QDjAOUA5wDuAPMA+QD7AP0A/wEEAQwNWA1aDV8Nag1z
387 | DYENhQ2MDZUNmg2nDaoNtw28DcQNxw3ZDdwN4QAAAAAAAAIBAAAAAAAAAC8AAAAAAAAA
388 | AAAAAAAAAA3j
389 |
390 | ANSIYellowColor
391 |
392 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
393 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECkw
394 | Ljk3NjQ3MDY0OTIgMC42ODIzNTI5NjAxIDAuMDA3ODQzMTM3NzE5ABACgALSEBESE1ok
395 | Y2xhc3NuYW1lWCRjbGFzc2VzV05TQ29sb3KiEhRYTlNPYmplY3RfEA9OU0tleWVkQXJj
396 | aGl2ZXLRFxhUcm9vdIABCBEaIy0yNztBSE5bYo6Qkpeiq7O2v9HU2QAAAAAAAAEBAAAA
397 | AAAAABkAAAAAAAAAAAAAAAAAAADb
398 |
399 | Bell
400 |
401 | BellBounceCritical
402 |
403 | BlinkText
404 |
405 | CursorBlink
406 |
407 | CursorColor
408 |
409 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
410 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
411 | LjMwNzUwNjYzMzMgMC4zMDc1MDY2MzMzIDAuMzA3NTA2NjMzMwAQAYAC0hAREhNaJGNs
412 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
413 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
414 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
415 |
416 | CursorType
417 | 0
418 | DisableANSIColor
419 |
420 | EscapeNonASCIICharacters
421 |
422 | Font
423 |
424 | YnBsaXN0MDDUAQIDBAUGGBlYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
425 | AAGGoKQHCBESVSRudWxs1AkKCwwNDg8QVk5TU2l6ZVhOU2ZGbGFnc1ZOU05hbWVWJGNs
426 | YXNzI0AwAAAAAAAAEBCAAoADXxAcSGFja05lcmRGb250Q29tcGxldGUtUmVndWxhctIT
427 | FBUWWiRjbGFzc25hbWVYJGNsYXNzZXNWTlNGb250ohUXWE5TT2JqZWN0XxAPTlNLZXll
428 | ZEFyY2hpdmVy0RobVHJvb3SAAQgRGiMtMjc8QktSW2JpcnR2eJecp7C3usPV2N0AAAAA
429 | AAABAQAAAAAAAAAcAAAAAAAAAAAAAAAAAAAA3w==
430 |
431 | FontAntialias
432 |
433 | FontHeightSpacing
434 | 1.2
435 | FontWidthSpacing
436 | 1
437 | Linewrap
438 |
439 | ProfileCurrentVersion
440 | 2.0600000000000001
441 | ShowActiveProcessArgumentsInTitle
442 |
443 | ShowActiveProcessInTabTitle
444 |
445 | ShowActiveProcessInTitle
446 |
447 | ShowCommandKeyInTitle
448 |
449 | ShowComponentsWhenTabHasCustomTitle
450 |
451 | ShowDimensionsInTitle
452 |
453 | ShowRepresentedURLPathInTitle
454 |
455 | ShowShellCommandInTitle
456 |
457 | ShowWindowSettingsNameInTitle
458 |
459 | TextBoldColor
460 |
461 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
462 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
463 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs
464 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
465 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
466 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
467 |
468 | TextColor
469 |
470 | YnBsaXN0MDDUAQIDBAUGFRZYJHZlcnNpb25YJG9iamVjdHNZJGFyY2hpdmVyVCR0b3AS
471 | AAGGoKMHCA9VJG51bGzTCQoLDA0OVU5TUkdCXE5TQ29sb3JTcGFjZVYkY2xhc3NPECcw
472 | LjEzMzMzMzMzMzMgMC4xMzMzMzMzMzMzIDAuMTMzMzMzMzMzMwAQAYAC0hAREhNaJGNs
473 | YXNzbmFtZVgkY2xhc3Nlc1dOU0NvbG9yohIUWE5TT2JqZWN0XxAPTlNLZXllZEFyY2hp
474 | dmVy0RcYVHJvb3SAAQgRGiMtMjc7QUhOW2KMjpCVoKmxtL3P0tcAAAAAAAABAQAAAAAA
475 | AAAZAAAAAAAAAAAAAAAAAAAA2Q==
476 |
477 | UseBoldFonts
478 |
479 | UseBrightBold
480 |
481 | VisualBell
482 |
483 | WindowTitle
484 | Terminal
485 | columnCount
486 | 191
487 | keyMapBoundKeys
488 |
489 | $F708
490 | [25~
491 | $F709
492 | [26~
493 | $F70A
494 | [28~
495 | $F70B
496 | [29~
497 | $F70C
498 | [31~
499 | $F70D
500 | [22~
501 | $F70E
502 | [33~
503 | $F70F
504 | [34~
505 | F704
506 | OP
507 | F705
508 | OQ
509 | F706
510 | OR
511 | F707
512 | OS
513 | F708
514 | [15~
515 | F709
516 | [17~
517 | F70A
518 | [18~
519 | F70B
520 | [19~
521 | F70C
522 | [20~
523 | F70D
524 | [21~
525 | F70E
526 | [23~
527 | F70F
528 | [24~
529 | F710
530 | [25~
531 | F711
532 | [26~
533 | F712
534 | [28~
535 | F713
536 | [29~
537 | F714
538 | [31~
539 | F715
540 | [32~
541 | F716
542 | [33~
543 | F717
544 | [34~
545 | F728
546 | [3~
547 | ^F702
548 | b
549 | ^F703
550 | f
551 | ~F702
552 | b
553 | ~F703
554 | f
555 | ~F704
556 | [17~
557 | ~F705
558 | [18~
559 | ~F706
560 | [19~
561 | ~F707
562 | [20~
563 | ~F708
564 | [21~
565 | ~F709
566 | [23~
567 | ~F70A
568 | [24~
569 | ~F70B
570 | [25~
571 | ~F70C
572 | [26~
573 | ~F70D
574 | [28~
575 | ~F70E
576 | [29~
577 | ~F70F
578 | [31~
579 | ~F710
580 | [32~
581 | ~F711
582 | [33~
583 | ~F712
584 | [34~
585 |
586 | name
587 | fnando
588 | rowCount
589 | 44
590 | type
591 | Window Settings
592 |
593 |
594 |
--------------------------------------------------------------------------------
/_files/macOS.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | # Disable menu bar transparency
4 | defaults write NSGlobalDomain AppleEnableMenuBarTransparency -bool false
5 |
6 | # Show remaining battery time; hide percentage
7 | defaults write com.apple.menuextra.battery ShowPercent -string "NO"
8 | defaults write com.apple.menuextra.battery ShowTime -string "YES"
9 |
10 | # Increase window resize speed for Cocoa applications
11 | defaults write NSGlobalDomain NSWindowResizeTime -float 0.001
12 |
13 | # Enable subpixel font rendering on non-Apple LCDs
14 | defaults write NSGlobalDomain AppleFontSmoothing -int 2
15 |
16 | # Show all filename extensions in Finder
17 | defaults write NSGlobalDomain AppleShowAllExtensions -bool true
18 |
19 | # Allow text selection in Quick Look
20 | defaults write com.apple.finder QLEnableTextSelection -bool true
21 |
22 | # Show item info below desktop icons
23 | /usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:showItemInfo true" ~/Library/Preferences/com.apple.finder.plist
24 |
25 | # Enable snap-to-grid for desktop icons
26 | /usr/libexec/PlistBuddy -c "Set :DesktopViewSettings:IconViewSettings:arrangeBy grid" ~/Library/Preferences/com.apple.finder.plist
27 |
28 | # Expand save panel by default
29 | defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode -bool true
30 | defaults write NSGlobalDomain NSNavPanelExpandedStateForSaveMode2 -bool true
31 |
32 | # Expand print panel by default
33 | defaults write NSGlobalDomain PMPrintingExpandedStateForPrint -bool true
34 | defaults write NSGlobalDomain PMPrintingExpandedStateForPrint2 -bool true
35 |
36 | # Automatically quit printer app once the print jobs complete
37 | defaults write com.apple.print.PrintingPrefs "Quit When Finished" -bool true
38 |
39 | # Disable the “Are you sure you want to open this application?” dialog
40 | defaults write com.apple.LaunchServices LSQuarantine -bool false
41 |
42 | # Check for software updates daily, not just once per week
43 | defaults write com.apple.SoftwareUpdate ScheduleFrequency -int 1
44 |
45 | # Trackpad: enable tap to click for this user and for the login screen
46 | defaults write com.apple.driver.AppleBluetoothMultitouch.trackpad Clicking -bool true
47 | defaults -currentHost write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
48 | defaults write NSGlobalDomain com.apple.mouse.tapBehavior -int 1
49 |
50 | # Set up trackpad behavior.
51 | defaults write com.apple.AppleMultitouchTrackpad Clicking -int 1
52 | defaults write com.apple.AppleMultitouchTrackpad DragLock -int 0
53 | defaults write com.apple.AppleMultitouchTrackpad Dragging -int 1
54 |
55 | # Set mouse speed.
56 | defaults write -g com.apple.mouse.scaling 2
57 |
58 | # Disable shake mouse pointer to locate.
59 | defaults write -g CGDisableCursorLocationMagnification -int 1
60 |
61 | # Increase sound quality for Bluetooth headphones/headsets
62 | defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Max (editable)" -int 80
63 | defaults write com.apple.BluetoothAudioAgent "Apple Bitpool Min (editable)" -int 80
64 | defaults write com.apple.BluetoothAudioAgent "Apple Initial Bitpool (editable)" -int 80
65 | defaults write com.apple.BluetoothAudioAgent "Apple Initial Bitpool Min (editable)" -int 80
66 | defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool" -int 80
67 | defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool Max" -int 80
68 | defaults write com.apple.BluetoothAudioAgent "Negotiated Bitpool Min" -int 80
69 |
70 | # Enable full keyboard access for all controls
71 | # (e.g. enable Tab in modal dialogs)
72 | defaults write NSGlobalDomain AppleKeyboardUIMode -int 3
73 |
74 | # Faster key repetition
75 | defaults write NSGlobalDomain InitialKeyRepeat -int 15
76 | defaults write NSGlobalDomain KeyRepeat -int 2
77 |
78 | # Disable press-and-hold for keys in favor of key repeat
79 | defaults write NSGlobalDomain ApplePressAndHoldEnabled -bool false
80 |
81 | # Set language and text formats
82 | # Note: if you’re in the US, replace `EUR` with `USD`, `Centimeters` with
83 | # `Inches`, `en_GB` with `en_US`, and `true` with `false`.
84 | defaults write NSGlobalDomain AppleLanguages -array "en" "pt-BR"
85 | defaults write NSGlobalDomain AppleLocale -string "en_CA@currency=CAD"
86 | defaults write NSGlobalDomain AppleMeasurementUnits -string "Centimeters"
87 | defaults write NSGlobalDomain AppleMetricUnits -bool true
88 |
89 | # Disable auto-correct
90 | defaults write NSGlobalDomain NSAutomaticSpellingCorrectionEnabled -bool false
91 |
92 | # Disables auto capitalization
93 | defaults write NSGlobalDomain NSAutomaticCapitalizationEnabled -bool false
94 |
95 | # Disables "smart" dashes
96 | defaults write NSGlobalDomain NSAutomaticDashSubstitutionEnabled -bool false
97 |
98 | # Disables automatic period substitutions
99 | defaults write NSGlobalDomain NSAutomaticPeriodSubstitutionEnabled -bool false
100 |
101 | # Disables smart quotes
102 | defaults write NSGlobalDomain NSAutomaticQuoteSubstitutionEnabled -bool false
103 |
104 | # Require password immediately after sleep or screen saver begins
105 | defaults write com.apple.screensaver askForPassword -int 1
106 | defaults write com.apple.screensaver askForPasswordDelay -int 0
107 |
108 | # Save screenshots in PNG format (other options: BMP, GIF, JPG, PDF, TIFF)
109 | defaults write com.apple.screencapture type -string "png"
110 |
111 | # Save screenshots to downloads folder.
112 | defaults write com.apple.screencapture location -string "${HOME}/Downloads"
113 |
114 | # allow quitting Finder via ⌘ + Q; doing so will also hide desktop icons
115 | defaults write com.apple.finder QuitMenuItem -bool false
116 |
117 | # Disable window animations and Get Info animations
118 | defaults write com.apple.finder DisableAllAnimations -bool true
119 |
120 | # Disable shadow in screenshots
121 | defaults write com.apple.screencapture disable-shadow -bool true
122 |
123 | # Set default Finder path.
124 | # For desktop, use `PfDe`.
125 | # For other paths, use `PfLo` and `file:///full/path/here/`
126 | defaults write com.apple.finder NewWindowTarget -string "PfHm"
127 | defaults write com.apple.finder NewWindowTargetPath -string "file://${HOME}/"
128 |
129 | # Show icons for hard drives, servers, and removable media on the desktop
130 | defaults write com.apple.finder ShowExternalHardDrivesOnDesktop -bool true
131 | defaults write com.apple.finder ShowHardDrivesOnDesktop -bool false
132 | defaults write com.apple.finder ShowMountedServersOnDesktop -bool true
133 | defaults write com.apple.finder ShowRemovableMediaOnDesktop -bool true
134 |
135 | # Show all filename extensions
136 | defaults write NSGlobalDomain AppleShowAllExtensions -bool true
137 |
138 | # Show status bar on Finder
139 | defaults write com.apple.finder ShowStatusBar -bool true
140 |
141 | # Show path bar on Finder
142 | defaults write com.apple.finder ShowPathbar -bool true
143 |
144 | # Show sidebar on Finder
145 | defaults write com.apple.finder ShowSidebar -bool true
146 |
147 | # Display full POSIX path as Finder window title
148 | defaults write com.apple.finder _FXShowPosixPathInTitle -bool true
149 |
150 | # When performing a search, search the current folder by default
151 | defaults write com.apple.finder FXDefaultSearchScope -string "SCcf"
152 |
153 | # Disable the warning when changing a file extension
154 | defaults write com.apple.finder FXEnableExtensionChangeWarning -bool false
155 |
156 | # Group files by name
157 | defaults write com.apple.finder FXPreferredGroupBy -string "Name"
158 |
159 | # Enable spring loading for directories
160 | defaults write NSGlobalDomain com.apple.springing.enabled -bool true
161 |
162 | # Remove the spring loading delay for directories
163 | defaults write NSGlobalDomain com.apple.springing.delay -float 0
164 |
165 | # Avoid creating .DS_Store files on network volumes
166 | defaults write com.apple.desktopservices DSDontWriteNetworkStores -bool true
167 |
168 | # Disable disk image verification
169 | defaults write com.apple.frameworks.diskimages skip-verify -bool true
170 | defaults write com.apple.frameworks.diskimages skip-verify-locked -bool true
171 | defaults write com.apple.frameworks.diskimages skip-verify-remote -bool true
172 |
173 | # Automatically open a new Finder window when a volume is mounted
174 | defaults write com.apple.frameworks.diskimages auto-open-ro-root -bool true
175 | defaults write com.apple.frameworks.diskimages auto-open-rw-root -bool true
176 | defaults write com.apple.finder OpenWindowForNewRemovableDisk -bool true
177 |
178 | # Use list view in all Finder windows by default
179 | # Four-letter codes for the other view modes: `icnv`, `clmv`, `Flwv`
180 | defaults write com.apple.finder FXPreferredViewStyle -string "Nlsv"
181 |
182 | # Disable the warning before emptying the Trash
183 | defaults write com.apple.finder WarnOnEmptyTrash -bool false
184 |
185 | # Empty Trash securely by default
186 | defaults write com.apple.finder EmptyTrashSecurely -bool true
187 |
188 | # Show the ~/Library folder
189 | chflags nohidden ~/Library
190 |
191 | # Expand the following File Info panes:
192 | # “General”, “Open with”, and “Sharing & Permissions”
193 | defaults write com.apple.finder FXInfoPanesExpanded -dict \
194 | General -bool true \
195 | OpenWith -bool true \
196 | Privileges -bool true
197 |
198 | # Enable highlight hover effect for the grid view of a stack (Dock)
199 | defaults write com.apple.dock mouse-over-hilite-stack -bool true
200 |
201 | # Set the icon size of Dock items to 36 pixels
202 | defaults write com.apple.dock tilesize -int 36
203 |
204 | # Change minimize/maximize window effect
205 | defaults write com.apple.dock mineffect -string "scale"
206 |
207 | # Minimize windows into their application’s icon
208 | defaults write com.apple.dock minimize-to-application -bool true
209 |
210 | # Enable spring loading for all Dock items
211 | defaults write com.apple.dock enable-spring-load-actions-on-all-items -bool true
212 |
213 | # Show indicator lights for open applications in the Dock
214 | defaults write com.apple.dock show-process-indicators -bool true
215 |
216 | # Disable Dashboard
217 | defaults write com.apple.dashboard mcx-disabled -bool true
218 |
219 | # Don’t show Dashboard as a Space
220 | defaults write com.apple.dock dashboard-in-overlay -bool true
221 |
222 | # Don’t automatically rearrange Spaces based on most recent use
223 | defaults write com.apple.dock mru-spaces -bool false
224 |
225 | # Automatically hide and show the Dock
226 | defaults write com.apple.dock autohide -bool true
227 |
228 | # Remove the auto-hiding Dock delay
229 | defaults write com.apple.dock autohide-delay -float 0
230 |
231 | # Use Dock on the left
232 | defaults write com.apple.dock orientation -string "left"
233 |
234 | # Enable the 2D Dock
235 | defaults write com.apple.dock no-glass -bool true
236 |
237 | # Set Dock zoom size
238 | defaults write com.apple.dock magnification -int 1
239 |
240 | # Remove the animation when hiding/showing the Dock
241 | defaults write com.apple.dock autohide-time-modifier -float 0
242 |
243 | # Press Tab to highlight each item on a web page
244 | defaults write com.apple.Safari WebKitTabToLinksPreferenceKey -bool true
245 | defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2TabsToLinks -bool true
246 |
247 | # Tell Safari to open new window links in tabs
248 | defaults write com.apple.Safari TargetedClicksCreateTabs -bool true
249 |
250 | # Reduce delay when rendering pages
251 | defaults write com.apple.Safari WebKitInitialTimedLayoutDelay 0.1
252 |
253 | # Show the full URL in the address bar (note: this still hides the scheme)
254 | defaults write com.apple.Safari ShowFullURLInSmartSearchField -bool true
255 |
256 | # Disable Safari's AutoFill.
257 | defaults write com.apple.Safari AutoFillFromAddressBook -bool false
258 | defaults write com.apple.Safari AutoFillPasswords -bool false
259 | defaults write com.apple.Safari AutoFillCreditCardData -bool false
260 | defaults write com.apple.Safari AutoFillMiscellaneousForms -bool false
261 |
262 | # Set Safari’s home page to `about:blank` for faster loading
263 | defaults write com.apple.Safari HomePage -string "about:blank"
264 |
265 | # Prevent Safari from opening ‘safe’ files automatically after downloading
266 | defaults write com.apple.Safari AutoOpenSafeDownloads -bool false
267 |
268 | # Allow hitting the Backspace key to go to the previous page in history
269 | defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2BackspaceKeyNavigationEnabled -bool false
270 |
271 | # Hide Safari’s bookmarks bar by default
272 | defaults write com.apple.Safari ShowFavoritesBar -bool false
273 |
274 | # Hide Safari’s sidebar in Top Sites
275 | defaults write com.apple.Safari ShowSidebarInTopSites -bool false
276 |
277 | # Disable Safari’s thumbnail cache for History and Top Sites
278 | defaults write com.apple.Safari DebugSnapshotsUpdatePolicy -int 2
279 |
280 | # Enable Safari’s debug menu
281 | defaults write com.apple.Safari IncludeInternalDebugMenu -bool true
282 |
283 | # Make Safari’s search banners default to Contains instead of Starts With
284 | defaults write com.apple.Safari FindOnPageMatchesWordStartsOnly -bool false
285 |
286 | # Remove useless icons from Safari’s bookmarks bar
287 | defaults write com.apple.Safari ProxiesInBookmarksBar "()"
288 |
289 | # Enable the Develop menu and the Web Inspector in Safari
290 | defaults write com.apple.Safari IncludeDevelopMenu -bool true
291 | defaults write com.apple.Safari WebKitDeveloperExtrasEnabledPreferenceKey -bool true
292 | defaults write com.apple.Safari com.apple.Safari.ContentPageGroupIdentifier.WebKit2DeveloperExtrasEnabled -bool true
293 |
294 | # Add a context menu item for showing the Web Inspector in web views
295 | defaults write NSGlobalDomain WebKitDeveloperExtras -bool true
296 |
297 | # Copy email addresses as `foo@example.com` instead of `Foo Bar ` in Mail.app
298 | defaults write com.apple.mail AddressesIncludeNameOnPasteboard -bool false
299 |
300 | # Add the keyboard shortcut ⌘ + Enter to send an email in Mail.app
301 | defaults write com.apple.mail NSUserKeyEquivalents -dict-add "Send" -string "@\\U21a9"
302 |
303 | # Add ⌘ + D to archive messages
304 | defaults write com.apple.mail NSUserKeyEquivalents -dict-add "Archive" -string "@d"
305 |
306 | # Display emails in threaded mode, sorted by date (oldest at the top)
307 | defaults write com.apple.mail DraftsViewerAttributes -dict-add "DisplayInThreadedMode" -string "yes"
308 | defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortedDescending" -string "yes"
309 | defaults write com.apple.mail DraftsViewerAttributes -dict-add "SortOrder" -string "received-date"
310 |
311 | # Disable inline attachments (just show the icons)
312 | defaults write com.apple.mail DisableInlineAttachmentViewing -bool true
313 |
314 | # Disable automatic spell checking
315 | defaults write com.apple.mail SpellCheckingBehavior -string "NoSpellCheckingEnabled"
316 |
317 | # Sort messages in thread from oldest to newest
318 | defaults write com.apple.mail ConversationViewSortDescending -int 0
319 |
320 | # Disable contact photos
321 | defaults write com.apple.mail EnableContactPhotos -int 0
322 |
323 | # Only use UTF-8 in Terminal.app
324 | defaults write com.apple.terminal StringEncodings -array 4
325 |
326 | # Prevent Time Machine from prompting to use new hard drives as backup volume
327 | defaults write com.apple.TimeMachine DoNotOfferNewDisksForBackup -bool true
328 |
329 | # Show the main window when launching Activity Monitor
330 | defaults write com.apple.ActivityMonitor OpenMainWindow -bool true
331 |
332 | # Visualize CPU usage in the Activity Monitor Dock icon
333 | defaults write com.apple.ActivityMonitor IconType -int 5
334 |
335 | # Show all processes in Activity Monitor
336 | defaults write com.apple.ActivityMonitor ShowCategory -int 0
337 |
338 | # Sort Activity Monitor results by CPU usage
339 | defaults write com.apple.ActivityMonitor SortColumn -string "CPUUsage"
340 | defaults write com.apple.ActivityMonitor SortDirection -int 0
341 |
342 | # Disable automatic emoji substitution (i.e. use plain text smileys)
343 | defaults write com.apple.messageshelper.MessageController SOInputLineSettings -dict-add "automaticEmojiSubstitutionEnablediMessage" -bool false
344 |
345 | # Disable t.co urls on Tweetbot
346 | defaults write com.tapbots.TweetbotMac OpenURLsDirectly -bool true
347 |
348 | # Don't automatically open Photos.app when connecting iPhone/iTunes
349 | defaults -currentHost write com.apple.ImageCapture disableHotPlug -bool true
350 | defaults write com.apple.iTunes dontAutomaticallySyncIPods -bool true
351 |
352 | # Disable backups on iTunes
353 | defaults write com.apple.iTunes DeviceBackupsDisabled -bool true
354 |
355 | # Disable Mission Control and Quick Note shortcuts.
356 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 118 "
357 |
358 | enabled
359 |
360 |
361 | value
362 |
363 | type
364 | standard
365 |
366 | parameters
367 |
368 | 65535
369 | 18
370 | 262144
371 |
372 |
373 |
374 | "
375 |
376 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 190 "
377 |
378 | enabled
379 |
380 |
381 | value
382 |
383 | type
384 | standard
385 |
386 | parameters
387 |
388 | 113
389 | 12
390 | 8388608
391 |
392 |
393 |
394 | "
395 |
396 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 79 "
397 |
398 | enabled
399 |
400 |
401 | value
402 |
403 | type
404 | standard
405 |
406 | parameters
407 |
408 | 65535
409 | 123
410 | 8650752
411 |
412 |
413 |
414 | "
415 |
416 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 80 "
417 |
418 | enabled
419 |
420 |
421 | value
422 |
423 | type
424 | standard
425 |
426 | parameters
427 |
428 | 65535
429 | 123
430 | 8781824
431 |
432 |
433 |
434 | "
435 |
436 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 81 "
437 |
438 | enabled
439 |
440 |
441 | value
442 |
443 | type
444 | standard
445 |
446 | parameters
447 |
448 | 65535
449 | 124
450 | 8650752
451 |
452 |
453 |
454 | "
455 |
456 | defaults write com.apple.symbolichotkeys.plist AppleSymbolicHotKeys -dict-add 82 "
457 |
458 | enabled
459 |
460 |
461 | value
462 |
463 | type
464 | standard
465 |
466 | parameters
467 |
468 | 65535
469 | 124
470 | 8781824
471 |
472 |
473 |
474 | "
475 |
476 | # Play feedback when volume is changed
477 | defaults write NSGlobalDomain com.apple.sound.beep.feedback -bool false
478 |
479 | # Set 1Password's Archive shortcut to cmd-d.
480 | defaults write com.agilebits.onepassword7 NSUserKeyEquivalents -dict-add "Archive" -string "@d"
481 |
482 | # Save Simulator's screenshots to ~/Downloads
483 | defaults write com.apple.iphonesimulator ScreenShotSaveLocation -string ~/Downloads
484 |
485 | echo "OSX Hacks Done. Note that some of these changes require a logout/restart to take effect."
486 |
--------------------------------------------------------------------------------
/_files/timemachine.sh:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | set -e
4 |
5 | # This file sets exclusions for Time Machine backups.
6 | # You must run this file with `sudo timemachine.sh`.
7 |
8 | tmutil addexclusion -p /Applications
9 | tmutil addexclusion -p /Library
10 | tmutil addexclusion -p /opt/homebrew
11 | tmutil addexclusion -p /private
12 | tmutil addexclusion -p /System
13 | tmutil addexclusion -p /usr/local
14 | tmutil addexclusion -p ~/.android
15 | tmutil addexclusion -p ~/.asdf
16 | tmutil addexclusion -p ~/.bundle
17 | tmutil addexclusion -p ~/.cache
18 | tmutil addexclusion -p ~/.cocoapods
19 | tmutil addexclusion -p ~/.composer
20 | tmutil addexclusion -p ~/.electron
21 | tmutil addexclusion -p ~/.gradle
22 | tmutil addexclusion -p ~/.kerl
23 | tmutil addexclusion -p ~/.local
24 | tmutil addexclusion -p ~/.m2
25 | tmutil addexclusion -p ~/.node-gyp
26 | tmutil addexclusion -p ~/.npm
27 | tmutil addexclusion -p ~/.nvm
28 | tmutil addexclusion -p ~/.solargraph
29 | tmutil addexclusion -p ~/.vagrant.d
30 | tmutil addexclusion -p ~/.vpython-root
31 | tmutil addexclusion -p ~/.vscode
32 | tmutil addexclusion -p ~/.vscode-insiders
33 | tmutil addexclusion -p ~/Downloads
34 | tmutil addexclusion -p ~/Library/Android
35 | tmutil addexclusion -p ~/Library/Application\ Support/Adobe
36 | tmutil addexclusion -p ~/Library/Application\ Support/Bartalina
37 | tmutil addexclusion -p ~/Library/Application\ Support/Blackmagic\ Design
38 | tmutil addexclusion -p ~/Library/Application\ Support/BraveSoftware
39 | tmutil addexclusion -p ~/Library/Application\ Support/Caches
40 | tmutil addexclusion -p ~/Library/Application\ Support/CleanShot
41 | tmutil addexclusion -p ~/Library/Application\ Support/Code\ -\ Insiders
42 | tmutil addexclusion -p ~/Library/Application\ Support/com.sonos.macController
43 | tmutil addexclusion -p ~/Library/Application\ Support/com.sonos.macController2
44 | tmutil addexclusion -p ~/Library/Application\ Support/Dash
45 | tmutil addexclusion -p ~/Library/Application\ Support/discord
46 | tmutil addexclusion -p ~/Library/Application\ Support/Firefox
47 | tmutil addexclusion -p ~/Library/Application\ Support/Google
48 | tmutil addexclusion -p ~/Library/Application\ Support/Imaging\ Edge\ Desktop
49 | tmutil addexclusion -p ~/Library/Application\ Support/InVision\ Studio
50 | tmutil addexclusion -p ~/Library/Application\ Support/JetBrains
51 | tmutil addexclusion -p ~/Library/Application\ Support/Keybase
52 | tmutil addexclusion -p ~/Library/Application\ Support/Knowledge
53 | tmutil addexclusion -p ~/Library/Application\ Support/kotlin
54 | tmutil addexclusion -p ~/Library/Application\ Support/Ledger\ Live
55 | tmutil addexclusion -p ~/Library/Application\ Support/Mozilla
56 | tmutil addexclusion -p ~/Library/Application\ Support/now
57 | tmutil addexclusion -p ~/Library/Application\ Support/nwjs
58 | tmutil addexclusion -p ~/Library/Application\ Support/OpenEmu
59 | tmutil addexclusion -p ~/Library/Application\ Support/org.videolan.vlc
60 | tmutil addexclusion -p ~/Library/Application\ Support/React\ Native\ Debugger
61 | tmutil addexclusion -p ~/Library/Application\ Support/Slack
62 | tmutil addexclusion -p ~/Library/Application\ Support/Sonos
63 | tmutil addexclusion -p ~/Library/Application\ Support/SonosV2
64 | tmutil addexclusion -p ~/Library/Application\ Support/Spotify
65 | tmutil addexclusion -p ~/Library/Application\ Support/zoom.us
66 | tmutil addexclusion -p ~/Library/Caches
67 | tmutil addexclusion -p ~/Library/Containers
68 | tmutil addexclusion -p ~/Library/Detox
69 | tmutil addexclusion -p ~/Library/Developer
70 | tmutil addexclusion -p ~/Library/Group\ Containers
71 | tmutil addexclusion -p ~/Library/Logs
72 | tmutil addexclusion -p ~/Library/Java
73 | tmutil addexclusion -p ~/Library/Mail
74 | tmutil addexclusion -p ~/Library/Messages
75 | tmutil addexclusion -p ~/Library/Metadata
76 | tmutil addexclusion -p ~/Library/Mobile\ Documents
77 | tmutil addexclusion -p ~/Library/Safari
78 | tmutil addexclusion -p ~/Library/SafariTechnologyPreview
79 | tmutil addexclusion -p ~/Library/Screen\ Savers
80 | tmutil addexclusion -p ~/Library/WebKit
81 | tmutil addexclusion -p ~/Movies
82 | tmutil addexclusion -p ~/VirtualBox\ VMs
83 | tmutil addexclusion -p ~/.local/share/mise
84 |
85 | tmignore
86 |
--------------------------------------------------------------------------------
/_files/windows-terminal.json:
--------------------------------------------------------------------------------
1 | {
2 | "$help": "https://aka.ms/terminal-documentation",
3 | "$schema": "https://aka.ms/terminal-profiles-schema",
4 | "actions": [
5 | {
6 | "command": {
7 | "action": "copy",
8 | "singleLine": false
9 | },
10 | "keys": "ctrl+c"
11 | },
12 | {
13 | "command": "paste",
14 | "keys": "ctrl+v"
15 | },
16 | {
17 | "command": {
18 | "action": "splitPane",
19 | "split": "auto",
20 | "splitMode": "duplicate"
21 | },
22 | "keys": "alt+shift+d"
23 | },
24 | {
25 | "command": "find",
26 | "keys": "ctrl+shift+f"
27 | }
28 | ],
29 | "copyFormatting": "none",
30 | "copyOnSelect": false,
31 | "defaultProfile": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
32 | "newTabMenu": [
33 | {
34 | "type": "remainingProfiles"
35 | }
36 | ],
37 | "profiles": {
38 | "defaults": {
39 | "colorScheme": "fnando"
40 | },
41 | "list": [
42 | {
43 | "commandline": "%SystemRoot%\\System32\\WindowsPowerShell\\v1.0\\powershell.exe",
44 | "guid": "{61c54bbd-c2c6-5271-96e7-009a87ff44bf}",
45 | "hidden": false,
46 | "name": "Windows PowerShell"
47 | },
48 | {
49 | "commandline": "%SystemRoot%\\System32\\cmd.exe",
50 | "guid": "{0caa0dad-35be-5f56-a8ff-afceeeaa6101}",
51 | "hidden": false,
52 | "name": "Command Prompt"
53 | },
54 | {
55 | "colorScheme": "fnando",
56 | "font": {
57 | "cellHeight": "1.5",
58 | "face": "JetBrainsMono Nerd Font Propo",
59 | "size": 14.0,
60 | "weight": "semi-bold"
61 | },
62 | "guid": "{574e775e-4f2a-5b96-ac1e-a2962a402336}",
63 | "hidden": false,
64 | "name": "PowerShell",
65 | "source": "Windows.Terminal.PowershellCore"
66 | },
67 | {
68 | "guid": "{b453ae62-4e3d-5e58-b989-0a998ec441b8}",
69 | "hidden": false,
70 | "name": "Azure Cloud Shell",
71 | "source": "Windows.Terminal.Azure"
72 | }
73 | ]
74 | },
75 | "schemes": [
76 | {
77 | "background": "#0C0C0C",
78 | "black": "#0C0C0C",
79 | "blue": "#0037DA",
80 | "brightBlack": "#767676",
81 | "brightBlue": "#3B78FF",
82 | "brightCyan": "#61D6D6",
83 | "brightGreen": "#16C60C",
84 | "brightPurple": "#B4009E",
85 | "brightRed": "#E74856",
86 | "brightWhite": "#F2F2F2",
87 | "brightYellow": "#F9F1A5",
88 | "cursorColor": "#FFFFFF",
89 | "cyan": "#3A96DD",
90 | "foreground": "#CCCCCC",
91 | "green": "#13A10E",
92 | "name": "Campbell",
93 | "purple": "#881798",
94 | "red": "#C50F1F",
95 | "selectionBackground": "#FFFFFF",
96 | "white": "#CCCCCC",
97 | "yellow": "#C19C00"
98 | },
99 | {
100 | "background": "#012456",
101 | "black": "#0C0C0C",
102 | "blue": "#0037DA",
103 | "brightBlack": "#767676",
104 | "brightBlue": "#3B78FF",
105 | "brightCyan": "#61D6D6",
106 | "brightGreen": "#16C60C",
107 | "brightPurple": "#B4009E",
108 | "brightRed": "#E74856",
109 | "brightWhite": "#F2F2F2",
110 | "brightYellow": "#F9F1A5",
111 | "cursorColor": "#FFFFFF",
112 | "cyan": "#3A96DD",
113 | "foreground": "#CCCCCC",
114 | "green": "#13A10E",
115 | "name": "Campbell Powershell",
116 | "purple": "#881798",
117 | "red": "#C50F1F",
118 | "selectionBackground": "#FFFFFF",
119 | "white": "#CCCCCC",
120 | "yellow": "#C19C00"
121 | },
122 | {
123 | "background": "#282C34",
124 | "black": "#282C34",
125 | "blue": "#61AFEF",
126 | "brightBlack": "#5A6374",
127 | "brightBlue": "#61AFEF",
128 | "brightCyan": "#56B6C2",
129 | "brightGreen": "#98C379",
130 | "brightPurple": "#C678DD",
131 | "brightRed": "#E06C75",
132 | "brightWhite": "#DCDFE4",
133 | "brightYellow": "#E5C07B",
134 | "cursorColor": "#FFFFFF",
135 | "cyan": "#56B6C2",
136 | "foreground": "#DCDFE4",
137 | "green": "#98C379",
138 | "name": "One Half Dark",
139 | "purple": "#C678DD",
140 | "red": "#E06C75",
141 | "selectionBackground": "#FFFFFF",
142 | "white": "#DCDFE4",
143 | "yellow": "#E5C07B"
144 | },
145 | {
146 | "background": "#FAFAFA",
147 | "black": "#383A42",
148 | "blue": "#0184BC",
149 | "brightBlack": "#4F525D",
150 | "brightBlue": "#61AFEF",
151 | "brightCyan": "#56B5C1",
152 | "brightGreen": "#98C379",
153 | "brightPurple": "#C577DD",
154 | "brightRed": "#DF6C75",
155 | "brightWhite": "#FFFFFF",
156 | "brightYellow": "#E4C07A",
157 | "cursorColor": "#4F525D",
158 | "cyan": "#0997B3",
159 | "foreground": "#383A42",
160 | "green": "#50A14F",
161 | "name": "One Half Light",
162 | "purple": "#A626A4",
163 | "red": "#E45649",
164 | "selectionBackground": "#4F525D",
165 | "white": "#FAFAFA",
166 | "yellow": "#C18301"
167 | },
168 | {
169 | "background": "#002B36",
170 | "black": "#002B36",
171 | "blue": "#268BD2",
172 | "brightBlack": "#073642",
173 | "brightBlue": "#839496",
174 | "brightCyan": "#93A1A1",
175 | "brightGreen": "#586E75",
176 | "brightPurple": "#6C71C4",
177 | "brightRed": "#CB4B16",
178 | "brightWhite": "#FDF6E3",
179 | "brightYellow": "#657B83",
180 | "cursorColor": "#FFFFFF",
181 | "cyan": "#2AA198",
182 | "foreground": "#839496",
183 | "green": "#859900",
184 | "name": "Solarized Dark",
185 | "purple": "#D33682",
186 | "red": "#DC322F",
187 | "selectionBackground": "#FFFFFF",
188 | "white": "#EEE8D5",
189 | "yellow": "#B58900"
190 | },
191 | {
192 | "background": "#FDF6E3",
193 | "black": "#002B36",
194 | "blue": "#268BD2",
195 | "brightBlack": "#073642",
196 | "brightBlue": "#839496",
197 | "brightCyan": "#93A1A1",
198 | "brightGreen": "#586E75",
199 | "brightPurple": "#6C71C4",
200 | "brightRed": "#CB4B16",
201 | "brightWhite": "#FDF6E3",
202 | "brightYellow": "#657B83",
203 | "cursorColor": "#002B36",
204 | "cyan": "#2AA198",
205 | "foreground": "#657B83",
206 | "green": "#859900",
207 | "name": "Solarized Light",
208 | "purple": "#D33682",
209 | "red": "#DC322F",
210 | "selectionBackground": "#073642",
211 | "white": "#EEE8D5",
212 | "yellow": "#B58900"
213 | },
214 | {
215 | "background": "#000000",
216 | "black": "#000000",
217 | "blue": "#3465A4",
218 | "brightBlack": "#555753",
219 | "brightBlue": "#729FCF",
220 | "brightCyan": "#34E2E2",
221 | "brightGreen": "#8AE234",
222 | "brightPurple": "#AD7FA8",
223 | "brightRed": "#EF2929",
224 | "brightWhite": "#EEEEEC",
225 | "brightYellow": "#FCE94F",
226 | "cursorColor": "#FFFFFF",
227 | "cyan": "#06989A",
228 | "foreground": "#D3D7CF",
229 | "green": "#4E9A06",
230 | "name": "Tango Dark",
231 | "purple": "#75507B",
232 | "red": "#CC0000",
233 | "selectionBackground": "#FFFFFF",
234 | "white": "#D3D7CF",
235 | "yellow": "#C4A000"
236 | },
237 | {
238 | "background": "#FFFFFF",
239 | "black": "#000000",
240 | "blue": "#3465A4",
241 | "brightBlack": "#555753",
242 | "brightBlue": "#729FCF",
243 | "brightCyan": "#34E2E2",
244 | "brightGreen": "#8AE234",
245 | "brightPurple": "#AD7FA8",
246 | "brightRed": "#EF2929",
247 | "brightWhite": "#EEEEEC",
248 | "brightYellow": "#FCE94F",
249 | "cursorColor": "#000000",
250 | "cyan": "#06989A",
251 | "foreground": "#555753",
252 | "green": "#4E9A06",
253 | "name": "Tango Light",
254 | "purple": "#75507B",
255 | "red": "#CC0000",
256 | "selectionBackground": "#555753",
257 | "white": "#D3D7CF",
258 | "yellow": "#C4A000"
259 | },
260 | {
261 | "background": "#000000",
262 | "black": "#000000",
263 | "blue": "#000080",
264 | "brightBlack": "#808080",
265 | "brightBlue": "#0000FF",
266 | "brightCyan": "#00FFFF",
267 | "brightGreen": "#00FF00",
268 | "brightPurple": "#FF00FF",
269 | "brightRed": "#FF0000",
270 | "brightWhite": "#FFFFFF",
271 | "brightYellow": "#FFFF00",
272 | "cursorColor": "#FFFFFF",
273 | "cyan": "#008080",
274 | "foreground": "#C0C0C0",
275 | "green": "#008000",
276 | "name": "Vintage",
277 | "purple": "#800080",
278 | "red": "#800000",
279 | "selectionBackground": "#FFFFFF",
280 | "white": "#C0C0C0",
281 | "yellow": "#808000"
282 | },
283 | {
284 | "background": "#FFFFFF",
285 | "black": "#212121",
286 | "blue": "#4397CB",
287 | "brightBlack": "#212121",
288 | "brightBlue": "#4397CB",
289 | "brightCyan": "#49A3AF",
290 | "brightGreen": "#6B9C57",
291 | "brightPurple": "#5C0E87",
292 | "brightRed": "#D35A34",
293 | "brightWhite": "#777777",
294 | "brightYellow": "#EDB13D",
295 | "cursorColor": "#4795DA",
296 | "cyan": "#49A3AF",
297 | "foreground": "#212121",
298 | "green": "#6B9C57",
299 | "name": "fnando",
300 | "purple": "#5C0E87",
301 | "red": "#D35A34",
302 | "selectionBackground": "#c6dcfc",
303 | "white": "#777777",
304 | "yellow": "#EDB13D"
305 | }
306 | ],
307 | "theme": "light",
308 | "themes": []
309 | }
310 |
--------------------------------------------------------------------------------
/fnando/.bin/adb-send-input:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 |
3 | require "shellwords"
4 |
5 | words = `pbpaste`
6 | .chomp
7 | .split("%s")
8 | .flat_map {|word| [word.gsub(" ", "%s"), "%", "s"] }
9 | .slice(0..-3)
10 |
11 | words.each do |word|
12 | system "adb", "shell", "input", "text", word
13 | end
14 |
--------------------------------------------------------------------------------
/fnando/.bin/backup-brew:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | PATH="$PATH:$HOME/.local/bin:/opt/homebrew/bin:/usr/local/bin"
4 |
5 | cd $HOME
6 | brew bundle dump
7 | mv Brewfile .Brewfile
8 |
9 | terminal-notifier \
10 | -message "Brew package list has been backed up to ~/.Brewfile" \
11 | -title 'Homebrew Backup' \
12 | -group homebrew \
13 | &> /dev/null
14 |
--------------------------------------------------------------------------------
/fnando/.bin/backup-ccc:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | PATH="$PATH:$HOME/.local/bin:/usr/local/bin"
4 |
5 | terminal-notifier \
6 | -message "CCC has finished a backup routine" \
7 | -ignoreDnD \
8 | -title "Carbon Copy Clone" \
9 | -group CCC \
10 | &> /dev/null
11 |
--------------------------------------------------------------------------------
/fnando/.bin/bolt-hud:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | icon=checkmark.circle
4 | summary="Finished in $BOLT_ELAPSED, $BOLT_TEST_COUNT tests"
5 |
6 | if [[ "$BOLT_FAIL_COUNT" != "0" ]]; then
7 | icon=exclamationmark.triangle
8 | summary="$summary, $BOLT_FAIL_COUNT failed"
9 | fi
10 |
11 | if [[ "$BOLT_SKIP_COUNT" != "0" ]]; then
12 | summary="$summary, $BOLT_SKIP_COUNT skipped"
13 | fi
14 |
15 | http --form --ignore-stdin POST http://127.0.0.1:32323/hud title="$BOLT_TITLE" message="$summary" symbolName=$icon
16 |
--------------------------------------------------------------------------------
/fnando/.bin/current-ip:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | if [[ "$(uname)" == "Darwin" ]]; then
4 | interface=${1:-en0}
5 | ifconfig $interface | grep 'inet ' | cut -d' ' -f2
6 | else
7 | interface=${1:-eth0}
8 | ifconfig $interface | grep 'inet addr' | sed -E 's/[^:]+:([^ ]+).*$/\1/'
9 | fi
10 |
--------------------------------------------------------------------------------
/fnando/.bin/data-url:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "optparse"
5 | require "base64"
6 |
7 | options = {}
8 | OptionParser.new do |parser|
9 | parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
10 |
11 | parser.on("-e=EXTENSION", "--extension=EXTENSION",
12 | "Set file extension (to be used with stdin)") do |extension|
13 | options[:extension] = extension
14 | end
15 |
16 | parser.on("-i=INPUT", "--input=INPUT",
17 | "Set file that will be used. Use `-` for stdin") do |input|
18 | options[:input] = input
19 | end
20 | end.parse!
21 |
22 | if options[:input] == "-"
23 | contents = $stdin.read
24 | extension = options.fetch(:extension) do
25 | puts "ERROR: Extension hasn't been set with stdin"
26 | exit 1
27 | end
28 | elsif options[:input] && File.file?(options[:input])
29 | contents = File.read(options[:input])
30 | extension = File.extname(options[:input]).to_s
31 | else
32 | puts "ERROR: Input hasn't been set"
33 | exit 1
34 | end
35 |
36 | content_types = {
37 | "svg" => "image/svg+xml",
38 | "png" => "image/png",
39 | "jpg" => "image/jpeg",
40 | "jpeg" => "image/jpeg",
41 | "webp" => "image/webp",
42 | "gif" => "image/gif"
43 | }
44 |
45 | extension = extension.delete(".").downcase
46 | content_type = content_types.fetch(extension) do
47 | puts "ERROR: #{extension.inspect} is not a valid extension"
48 | end
49 |
50 | puts "data:#{content_type};base64,#{Base64.strict_encode64(contents)}"
51 |
--------------------------------------------------------------------------------
/fnando/.bin/decrypt:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | input=$1
3 | output=${2:-${input%.*}}
4 |
5 | usage() {
6 | echo "Usage: decrypt INPUT_FILE OUTPUT_FILE"
7 | }
8 |
9 | if [[ "$input" == "" ]]; then
10 | usage
11 | exit 1
12 | fi
13 |
14 | if [[ "$output" == "" ]]; then
15 | usage
16 | exit 1
17 | fi
18 |
19 | openssl enc -aes-256-cbc -pbkdf2 -salt -d -in "$input" -out "$output"
20 |
--------------------------------------------------------------------------------
/fnando/.bin/docker:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | podman $@
4 |
--------------------------------------------------------------------------------
/fnando/.bin/encrypt:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | input=$1
3 | output=${2:-$input.encrypted}
4 |
5 | usage() {
6 | echo "Usage: encrypt INPUT_FILE OUTPUT_FILE"
7 | }
8 |
9 | if [[ "$input" == "" ]]; then
10 | usage
11 | exit 1
12 | fi
13 |
14 | if [[ "$output" == "" ]]; then
15 | usage
16 | exit 1
17 | fi
18 |
19 | openssl enc -aes-256-cbc -pbkdf2 -salt -pbkdf2 -in "$input" -out "$output"
20 |
--------------------------------------------------------------------------------
/fnando/.bin/ffmpeg-loudness:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | ffmpeg -i "$1" -af ebur128=framelog=verbose -f null - 2>&1 | awk '/I:/{print $2}'
4 |
--------------------------------------------------------------------------------
/fnando/.bin/ffmpeg-slow-down-audio:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | input = ARGV[0]
5 | rate = (ARGV[1] || 0.75).to_f
6 | dirname = File.dirname(input)
7 | basename = File.basename(input, ".*")
8 | percentage = (rate * 100).to_i
9 | output = File.join(dirname, "#{basename} (Slowed by #{percentage}%).mp3")
10 |
11 | command = [
12 | "ffmpeg",
13 | "-i",
14 | input,
15 | "-filter:a",
16 | "atempo=#{rate}",
17 | "-vn",
18 | output
19 | ]
20 |
21 | system(*command)
22 |
--------------------------------------------------------------------------------
/fnando/.bin/ffmpeg-split-audio-channels:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | input = ARGV[0]
5 | dirname = File.dirname(input)
6 | basename = File.basename(input, ".*")
7 |
8 | left_channel_output = File.join(dirname, "#{basename} (Left).mp3")
9 | right_channel_output = File.join(dirname, "#{basename} (Right).mp3")
10 |
11 | command = [
12 | "ffmpeg",
13 | "-i",
14 | input,
15 | "-map_channel",
16 | "0.0.0",
17 | left_channel_output,
18 | "-map_channel",
19 | "0.0.1",
20 | right_channel_output
21 | ]
22 |
23 | system(*command)
24 |
--------------------------------------------------------------------------------
/fnando/.bin/format-git-message:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "open3"
5 |
6 | file = ARGV.last
7 |
8 | exit(1) unless File.file?(file)
9 |
10 | content = File.read(file)
11 | number_of_lines = 0
12 | lines = content.lines.map(&:chomp)
13 |
14 | lines.each do |line|
15 | break if line.include?("# Please enter the commit message")
16 |
17 | number_of_lines += 1
18 | end
19 |
20 | message_lines = lines.shift(number_of_lines).map {|line| line.chomp.rstrip }
21 |
22 | formatted = message_lines.each_with_object([]) do |line, buffer|
23 | line = line.chomp
24 | prefix = " " * line[/^(([-*]|[a-z\d]+[.)])\s+)/, 1].to_s.size
25 |
26 | if line.size <= 72 || line.count(" ") <= 1
27 | buffer << line
28 | else
29 | words = line.split
30 | new_line = ""
31 |
32 | words.each do |word|
33 | new_line = if new_line.size + word.size < 72
34 | "#{new_line}#{word} "
35 | else
36 | buffer << new_line unless new_line.empty?
37 | "#{prefix}#{word} "
38 | end
39 | end
40 |
41 | buffer << new_line.rstrip
42 | end
43 | end
44 |
45 | puts lines.unshift(*formatted).join("\n")
46 |
--------------------------------------------------------------------------------
/fnando/.bin/gh-action-status:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "English"
5 | require "json"
6 |
7 | data = JSON.parse(`gh run list --json databaseId,name`, symbolize_names: true)
8 | run_id = data.select {|action| action[:name] == ARGV[0] }
9 | .map {|action| action[:databaseId] }
10 | .max
11 |
12 | system "gh", "run", "view", run_id.to_s, "--exit-status"
13 |
14 | failed = $CHILD_STATUS.exitstatus.nonzero?
15 |
16 | system "gh", "run", "view", run_id.to_s, "--log-failed" if failed
17 |
--------------------------------------------------------------------------------
/fnando/.bin/git-buster:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | file="$1"
4 |
5 | [ "$file" == "" ] && echo "Usage: git buster FILE" > /dev/stderr && exit 1
6 |
7 | git filter-branch -f --prune-empty --tag-name-filter cat --tree-filter "rm -f $file" -- --all
8 | git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
9 | git reflog expire --expire=now --all && git gc --prune=now --aggressive
10 | echo "$file" >> .gitignore
11 |
--------------------------------------------------------------------------------
/fnando/.bin/git-current:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | echo `git branch 2> /dev/null | grep \* | sed 's/* //'`
4 |
5 |
--------------------------------------------------------------------------------
/fnando/.bin/git-empty:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | git symbolic-ref HEAD "refs/heads/$1"
4 | rm .git/index
5 | git clean -fdx
6 |
--------------------------------------------------------------------------------
/fnando/.bin/git-track:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | branch=`git branch 2> /dev/null | grep \* | sed 's/* //'`
3 | git config branch.$branch.remote origin
4 | git config branch.$branch.merge refs/heads/$branch
5 | echo "tracking origin/$branch"
6 |
--------------------------------------------------------------------------------
/fnando/.bin/git-undo:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | git reset --soft HEAD^1
--------------------------------------------------------------------------------
/fnando/.bin/git-view:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "json"
5 |
6 | def command_json(command)
7 | JSON.parse(command, symbolize_names: true)
8 | end
9 |
10 | repo = command_json(`gh repo view --json nameWithOwner`).fetch(:nameWithOwner)
11 | branch = `git b --show-current`.chomp
12 | commit = `git rev-parse HEAD`.chomp if branch.empty?
13 |
14 | if branch
15 | pull_request = command_json(`gh pr list --json headRefName,number`)
16 | .find {|pr| pr[:headRefName] == branch }
17 | end
18 |
19 | url = if pull_request
20 | "https://github.com/#{repo}/pull/#{pull_request[:number]}"
21 | elsif branch != ""
22 | "https://github.com/#{repo}/tree/#{branch}"
23 | elsif commit != ""
24 | "https://github.com/#{repo}/tree/#{commit}"
25 | else
26 | "https://github.com/#{repo}"
27 | end
28 |
29 | system "open", url
30 |
--------------------------------------------------------------------------------
/fnando/.bin/git-wip:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 | git add .
3 | git commit --no-verify --all --message "WIP"
4 |
--------------------------------------------------------------------------------
/fnando/.bin/imgcat:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | # tmux requires unrecognized OSC sequences to be wrapped with DCS tmux;
4 | # ST, and for all ESCs in to be replaced with ESC ESC. It
5 | # only accepts ESC backslash for ST. We use TERM instead of TMUX because TERM
6 | # gets passed through ssh.
7 | function print_osc() {
8 | if [[ $TERM == screen* ]]; then
9 | printf "\033Ptmux;\033\033]"
10 | else
11 | printf "\033]"
12 | fi
13 | }
14 |
15 | # More of the tmux workaround described above.
16 | function print_st() {
17 | if [[ $TERM == screen* ]]; then
18 | printf "\a\033\\"
19 | else
20 | printf "\a"
21 | fi
22 | }
23 |
24 | function load_version() {
25 | if [ -z ${IMGCAT_BASE64_VERSION+x} ]; then
26 | IMGCAT_BASE64_VERSION=$(base64 --version 2>&1)
27 | export IMGCAT_BASE64_VERSION
28 | fi
29 | }
30 |
31 | function b64_encode() {
32 | load_version
33 | if [[ $IMGCAT_BASE64_VERSION =~ GNU ]]; then
34 | # Disable line wrap
35 | base64 -w0
36 | else
37 | base64
38 | fi
39 | }
40 |
41 | function b64_decode() {
42 | load_version
43 | if [[ $IMGCAT_BASE64_VERSION =~ fourmilab ]]; then
44 | BASE64ARG=-d
45 | elif [[ $IMGCAT_BASE64_VERSION =~ GNU ]]; then
46 | BASE64ARG=-di
47 | else
48 | BASE64ARG=-D
49 | fi
50 | base64 $BASE64ARG
51 | }
52 |
53 | # print_image filename inline base64contents print_filename
54 | # filename: Filename to convey to client
55 | # inline: 0 or 1
56 | # base64contents: Base64-encoded contents
57 | # print_filename: If non-empty, print the filename
58 | # before outputting the image
59 | function print_image() {
60 | print_osc
61 | printf '1337;File='
62 | if [[ -n $1 ]]; then
63 | printf "name=%s;" "$(printf "%s" "$1" | b64_encode)"
64 | fi
65 |
66 | printf "%s" "$3" | b64_decode | wc -c | awk '{printf "size=%d",$1}'
67 | printf ";inline=%s" "$2"
68 | printf ":"
69 | printf "%s" "$3"
70 | print_st
71 | printf '\n'
72 | if [[ -n $4 ]]; then
73 | echo "$1"
74 | fi
75 | }
76 |
77 | function error() {
78 | echo "ERROR: $*" 1>&2
79 | }
80 |
81 | function show_help() {
82 | echo "Usage: imgcat [-p] filename ..." 1>&2
83 | echo " or: cat filename | imgcat" 1>&2
84 | }
85 |
86 | function check_dependency() {
87 | if ! (builtin command -V "$1" >/dev/null 2>&1); then
88 | echo "imgcat: missing dependency: can't find $1" 1>&2
89 | exit 1
90 | fi
91 | }
92 |
93 | ## Main
94 |
95 | if [ -t 0 ]; then
96 | has_stdin=f
97 | else
98 | has_stdin=t
99 | fi
100 |
101 | # Show help if no arguments and no stdin.
102 | if [ $has_stdin = f ] && [ $# -eq 0 ]; then
103 | show_help
104 | exit
105 | fi
106 |
107 | check_dependency awk
108 | check_dependency base64
109 | check_dependency wc
110 |
111 | # Look for command line flags.
112 | while [ $# -gt 0 ]; do
113 | case "$1" in
114 | -h | --h | --help)
115 | show_help
116 | exit
117 | ;;
118 | -p | --p | --print)
119 | print_filename=1
120 | ;;
121 | -u | --u | --url)
122 | check_dependency curl
123 | encoded_image=$(curl -s "$2" | b64_encode) || (
124 | error "No such file or url $2"
125 | exit 2
126 | )
127 | has_stdin=f
128 | print_image "$2" 1 "$encoded_image" "$print_filename"
129 | set -- "${@:1:1}" "-u" "${@:3}"
130 | if [ "$#" -eq 2 ]; then
131 | exit
132 | fi
133 | ;;
134 | -*)
135 | error "Unknown option flag: $1"
136 | show_help
137 | exit 1
138 | ;;
139 | *)
140 | if [ -r "$1" ]; then
141 | has_stdin=f
142 | print_image "$1" 1 "$(b64_encode <"$1")" "$print_filename"
143 | else
144 | error "imgcat: $1: No such file or directory"
145 | exit 2
146 | fi
147 | ;;
148 | esac
149 | shift
150 | done
151 |
152 | # Read and print stdin
153 | if [ $has_stdin = t ]; then
154 | print_image "" 1 "$(cat | b64_encode)" ""
155 | fi
156 |
157 | exit 0
158 |
--------------------------------------------------------------------------------
/fnando/.bin/instagram-slice:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 |
3 | require "fileutils"
4 | require "json"
5 |
6 | input_path = File.expand_path(ARGV[0])
7 | input_dir = File.dirname(input_path)
8 | file_name = File.basename(input_path, ".*")
9 | output_dir = File.join(input_dir, file_name)
10 |
11 | meta = JSON.parse(`ffprobe -v error -show_format -show_entries stream=width,height -i #{input_path.inspect} -print_format json`)
12 | duration = Float(meta.dig("format", "duration"))
13 |
14 | slices_count = (duration / 60).ceil
15 | FileUtils.mkdir_p(output_dir)
16 |
17 | slices_count.times do |index|
18 | start_time = "00:0#{index}:00.00"
19 | output_path = File.join(output_dir, "#{file_name}-#{index + 1}.mp4")
20 | system "ffmpeg", "-i", input_path, "-ss", start_time, "-t", "59.99", "-c", "copy", "-v", "quiet", "-y", output_path
21 | FileUtils.touch output_path, mtime: Time.now - 30 + index
22 | end
23 |
--------------------------------------------------------------------------------
/fnando/.bin/list-ios-simulators:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | xcrun simctl list --json devices available | jq '.devices | to_entries[] | (.key | capture("com\\.apple\\.CoreSimulator\\.SimRuntime\\.iOS-(?.+)")) as {$version} | .value[] | {name: "\(.name)", version: $version | sub("-"; "."), udid}'
4 |
--------------------------------------------------------------------------------
/fnando/.bin/pretty_html:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | gem "nokogiri"
5 | require "nokogiri"
6 |
7 | path = File.expand_path(ARGV[0]) if ARGV.any?
8 |
9 | contents = if $stdin.tty?
10 | File.read(path)
11 | else
12 | $stdin.read
13 | end
14 |
15 | html = Nokogiri::HTML(contents).to_xhtml(indent: 2)
16 |
17 | if path
18 | File.open(path, "w") do |io|
19 | io << html
20 | end
21 | else
22 | puts html
23 | end
24 |
--------------------------------------------------------------------------------
/fnando/.bin/prince:
--------------------------------------------------------------------------------
1 | #! /bin/sh
2 |
3 | exec "$HOME/.local/princexml/lib/prince/bin/prince" --prefix="$HOME/.local/princexml/lib/prince" "$@"
4 |
--------------------------------------------------------------------------------
/fnando/.bin/restart-dns:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | sudo dscacheutil -flushcache
4 | sudo killall -HUP mDNSResponder
5 |
--------------------------------------------------------------------------------
/fnando/.bin/rscp:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | if [ -z "$1" ]; then
4 | echo "Usage: rscp "
5 | exit 1
6 | fi
7 |
8 | rsync -vr --partial --progress -e ssh $1 $2
9 |
--------------------------------------------------------------------------------
/fnando/.bin/rtf:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | if [[ "$#" = 0 ]]; then
4 | echo "Usage: rtf LEXER [theme=tango]"
5 | exit
6 | fi
7 |
8 | lexer="$1"
9 | theme="${2:-tango}"
10 |
11 | pygmentize -l "$lexer" -f rtf -O style="$theme",fontsize=40,fontface=Hack |
12 | sed -E 's/\\b / /g' | # remove bold
13 | sed -E 's/\\f0/\\f0\\sl288\\slmult1/g' # add 1.2 line height
14 |
--------------------------------------------------------------------------------
/fnando/.bin/server:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | gem "rack"
5 | gem "rackup"
6 | gem "puma"
7 | require "rack"
8 | require "rackup"
9 | require "yaml"
10 | require "optparse"
11 |
12 | options = {root: Dir.pwd, index: true}
13 |
14 | OptionParser.new do |opts|
15 | opts.banner = "Usage: #{$PROGRAM_NAME} [options]"
16 |
17 | opts.on("-r", "--root=DIR",
18 | "Set root directory. Defaults to current directory.") do |root|
19 | options[:root] = File.expand_path(root)
20 | end
21 |
22 | opts.on("-i", "--index", "Use index files. Defaults to true.") do |index|
23 | options[:index] = index
24 | end
25 |
26 | opts.on("-p", "--port=PORT", "Defaults to 1234.") do |port|
27 | options[:port] = port
28 | end
29 |
30 | opts.on("-b", "--binding=BINDING", "Defaults to 127.0.0.1.") do |binding|
31 | options[:binding] = binding
32 | end
33 |
34 | opts.on("-h", "--help", "Prints this help") do
35 | puts opts
36 | exit
37 | end
38 | end.parse!
39 |
40 | app = Rack::Builder.app do
41 | use Rack::ContentLength
42 | use Rack::CommonLogger
43 | use Rack::Deflater
44 |
45 | if options[:index]
46 | use Rack::Static,
47 | urls: {"/" => "index.html"},
48 | root: options[:root]
49 | end
50 |
51 | run lambda {|env|
52 | directory_app = Rack::Directory.new(options[:root])
53 | response = directory_app.call(env)
54 |
55 | return response if response.first == 200
56 |
57 | index_file = File.join(options[:root], "index.html")
58 |
59 | if File.file?(index_file)
60 | return [200, {"Content-Type" => "text/html"}, [File.read(index_file)]]
61 | end
62 |
63 | response
64 | }
65 | end
66 |
67 | handler = Rackup::Handler.pick(%w[puma])
68 | handler.run app,
69 | Port: options.fetch(:port, 1234),
70 | Host: options.fetch(:binding, "127.0.0.1")
71 |
--------------------------------------------------------------------------------
/fnando/.bin/slim-vid:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "fileutils"
5 | require "securerandom"
6 | require "active_support"
7 | require "optparse"
8 | require "shellwords"
9 |
10 | helpers = Object.new.extend(ActiveSupport::NumberHelper)
11 | keep_audio = false
12 | verbose = false
13 |
14 | OptionParser.new do |parser|
15 | parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
16 |
17 | parser.on("-a", "--audio", "Keep audio track") do |value|
18 | keep_audio = value
19 | end
20 |
21 | parser.on("-v", "--verbose", "Verbose output") do |value|
22 | verbose = value
23 | end
24 | end.parse!
25 |
26 | input = ARGV.first
27 |
28 | if !input || !File.file?(input)
29 | puts "ERROR: Please provide a valid video file"
30 | exit 1
31 | end
32 |
33 | input = File.expand_path(input)
34 | name = File.basename(input, ".*")
35 | dir = File.dirname(input)
36 | ext = File.extname(input)
37 | id = SecureRandom.hex(10)
38 | output = File.join(dir, "#{name}.#{id}#{ext}")
39 | cmd = [
40 | "ffmpeg",
41 | verbose ? nil : ["-loglevel", "quiet"],
42 | "-i", input,
43 | keep_audio ? nil : "-an",
44 | output
45 | ].flatten.compact
46 |
47 | cmd_str = cmd.map {|arg| Shellwords.escape(arg) }.join(" ")
48 | puts "=> Command: #{cmd_str}"
49 |
50 | system(*cmd)
51 |
52 | original_size = File.size(input)
53 | slim_size = File.size(output)
54 |
55 | puts "Original file: #{helpers.number_to_human_size(original_size)}"
56 | puts "Slim file: #{helpers.number_to_human_size(slim_size)}"
57 |
58 | FileUtils.move(input, File.join(dir, "#{name}.original.#{id}.#{ext}"))
59 | FileUtils.move(output, input)
60 |
--------------------------------------------------------------------------------
/fnando/.bin/spoof:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | default_eth_device=$(system_profiler SPAirPortDataType | grep -E ' en\d:' | tr -d ' ' | tr -d ':')
4 |
5 | if [[ "$@" =~ "-h" ]]; then
6 | echo "Usage: spoof [ETHERNET_INTERFACE]"
7 | echo
8 | echo "ETHERNET_INTERFACE defaults to $default_eth_device."
9 | exit
10 | fi
11 |
12 | current-mac() {
13 | eth_device=$1
14 | ifconfig $eth_device | grep '\tether ' | cut -d' ' -f2
15 | }
16 |
17 | eth_device=${1:-$default_eth_device}
18 | echo "from: $(current-mac $eth_device)"
19 | mac=$(openssl rand -hex 1 | tr '[:lower:]' '[:upper:]' | xargs echo "obase=2;ibase=16;" | bc | cut -c1-6 | sed 's/$/00/' | xargs echo "obase=16;ibase=2;" | bc | sed "s/$/:$(openssl rand -hex 5 | sed 's/\(..\)/\1:/g; s/.$//' | tr '[:lower:]' '[:upper:]')/")
20 | sudo ifconfig $eth_device ether $mac
21 | echo " to: $(current-mac $eth_device)"
22 |
--------------------------------------------------------------------------------
/fnando/.bin/tmignore:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env bash
2 |
3 | find $HOME/Projects -name 'node_modules' -type d -depth 3 -exec tmutil addexclusion -p {} \;
4 | find $HOME/Projects -name '.gradle' -type d -depth 4 -exec tmutil addexclusion -p {} \;
5 | find $HOME/Projects -regex '.*/android/app/build' -type d -depth 5 -exec tmutil addexclusion -p {} \;
6 | find $HOME/Projects -regex '.*/target' -type d -depth 3 -exec tmutil addexclusion -p {} \;
7 | find $HOME/Projects -regex '.*/Pods' -type d -depth 4 -exec tmutil addexclusion -p {} \;
8 |
--------------------------------------------------------------------------------
/fnando/.bin/tunnel:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "securerandom"
5 | require "optparse"
6 | require "bundler/inline"
7 |
8 | gemfile do
9 | source "https://rubygems.org"
10 | gem "net-ssh"
11 | gem "net-scp"
12 | gem "ed25519"
13 | gem "haikunate"
14 | gem "bcrypt_pbkdf"
15 | end
16 |
17 | require "net/ssh"
18 | require "net/scp"
19 | require "haikunate"
20 |
21 | # There are a few puts on this class that cannot be disabled by setting the log.
22 | # Let's override `puts` so the console it's clean!
23 | Net::SSH::Service::Forward.class_eval do
24 | def puts(*)
25 | end
26 | end
27 |
28 | options = {
29 | local_port: 3000,
30 | remote_port: 0,
31 | subdomain: Haiku.call,
32 | verbose: false
33 | }
34 |
35 | OptionParser.new do |parser|
36 | parser.banner = "Usage: #{$PROGRAM_NAME} [options]"
37 |
38 | parser.on("-p", "--port=PORT", "Set local port. Defaults to 3000.") do |port|
39 | options[:local_port] = port.to_i
40 | end
41 |
42 | parser.on(
43 | "-r",
44 | "--remote-port=PORT",
45 | "Set remote port. Defaults to the next available port."
46 | ) do |port|
47 | options[:remote_port] = port.to_i
48 | end
49 |
50 | parser.on("-v", "--verbose", "Run in verbose mode") do |verbose|
51 | options[:verbose] = verbose
52 | end
53 |
54 | parser.on(
55 | "-s",
56 | "--subdomain=SUBDOMAIN",
57 | "Set subdomain. Defaults to random."
58 | ) do |subdomain|
59 | options[:subdomain] = subdomain
60 | end
61 | end.parse!
62 |
63 | puts "=> options: #{options}" if options[:verbose]
64 |
65 | stop = false
66 |
67 | trap("INT") do
68 | stop = true
69 | puts "\n⚙️ Shutting down https://#{options[:subdomain]}.t.fnando.dev"
70 | end
71 |
72 | reload_cmd = "service caddy restart"
73 | verbose = options[:verbose] ? Logger::DEBUG : nil
74 | logger = Logger.new(verbose ? $stdout : StringIO.new)
75 | options => {local_port:, remote_port:}
76 |
77 | run = lambda do
78 | Net::SSH.start(
79 | "ssh.t.fnando.dev",
80 | "root",
81 | use_agent: true,
82 | verbose:,
83 | logger:
84 | ) do |ssh|
85 | assigned_port = nil
86 |
87 | session = ssh.forward.remote(local_port, "localhost", remote_port) do |port|
88 | assigned_port = port
89 | end
90 |
91 | session.loop { !assigned_port }
92 |
93 | contents = <<~CADDYFILE
94 | #{options[:subdomain]}.t.fnando.dev {
95 | \treverse_proxy :#{assigned_port}
96 | }
97 | CADDYFILE
98 |
99 | caddyfile = "/tmp/caddyfile"
100 | remote_caddyfile = "/etc/caddy/sites-enabled/#{options[:subdomain]}.conf"
101 |
102 | File.open(caddyfile, "w+") {|io| io << contents }
103 |
104 | ssh.scp.upload(caddyfile, remote_caddyfile)
105 | sleep 0.1
106 | ssh.exec reload_cmd
107 |
108 | puts
109 | puts "⚡️ localhost:#{local_port} ➡️ localhost:#{assigned_port}"
110 | puts "⚡️ https://#{options[:subdomain]}.t.fnando.dev"
111 | puts "🙅♂️ Press ctrl-c to stop"
112 |
113 | ssh.loop { !stop }
114 | ssh.exec "rm -rf #{remote_caddyfile}"
115 | ssh.exec reload_cmd
116 | puts "👋 Bye!"
117 | end
118 | end
119 |
120 | loop do
121 | break if stop
122 |
123 | run.call unless stop
124 | rescue Errno::ECONNREFUSED
125 | puts "⚠️ localhost:#{local_port} is not running... waiting!"
126 |
127 | loop do
128 | break if stop
129 |
130 | Socket.tcp("localhost", local_port, connect_timeout: 1).close
131 | break
132 | rescue Errno::ECONNREFUSED
133 | sleep 1
134 | end
135 | end
136 |
--------------------------------------------------------------------------------
/fnando/.bin/vectorize:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "shellwords"
5 | require "tempfile"
6 |
7 | tmpfile = File.join(Dir.tmpdir, "file.bmp")
8 | input = ARGV.first.to_s.strip
9 |
10 | if input.empty?
11 | $stderr << "USAGE: #{$PROGRAM_NAME} [IMAGE_PATH]\n"
12 | exit 1
13 | end
14 |
15 | unless File.file?(input)
16 | $stderr << "ERROR: #{input.inspect} is not a valid file.\n"
17 | exit 1
18 | end
19 |
20 | system "convert",
21 | Shellwords.shellescape(input),
22 | "-alpha",
23 | "remove",
24 | "-alpha",
25 | "off",
26 | "-auto-threshold",
27 | "otsu",
28 | tmpfile
29 |
30 | output = File.join(File.dirname(input), "#{File.basename(input, '.*')}.svg")
31 | bgcolor = `convert #{Shellwords.shellescape(tmpfile)} -format "%[pixel:u.p{0,0}]" info:`.chomp
32 | has_black_bgcolor = bgcolor == "srgb(0,0,0)"
33 |
34 | system(
35 | *[
36 | "potrace",
37 | Shellwords.shellescape(tmpfile),
38 | has_black_bgcolor ? "--invert" : nil,
39 | "--svg",
40 | "--output",
41 | Shellwords.shellescape(output)
42 | ].compact
43 | )
44 |
--------------------------------------------------------------------------------
/fnando/.bin/whatsapp-media:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env ruby
2 | # frozen_string_literal: true
3 |
4 | require "time"
5 | require "fileutils"
6 |
7 | files = ARGV.filter do |file|
8 | next unless file.match?(/\.(jp?eg|mp4)$/i)
9 |
10 | true
11 | end
12 |
13 | counter = Hash.new {|h, k| h[k] = -1 }
14 |
15 | files.each do |file|
16 | matches =
17 | file.match(/(?\d{4}-\d{2}-\d{2}).*?(?