diff --git a/aoc-utils.sh b/awk/aoc-utils.sh
similarity index 100%
rename from aoc-utils.sh
rename to awk/aoc-utils.sh
diff --git a/day-1/awk/part-1.awk b/awk/day-1/part-1.awk
similarity index 100%
rename from day-1/awk/part-1.awk
rename to awk/day-1/part-1.awk
diff --git a/day-1/awk/part-2.awk b/awk/day-1/part-2.awk
similarity index 100%
rename from day-1/awk/part-2.awk
rename to awk/day-1/part-2.awk
diff --git a/day-1/awk/test.sh b/awk/day-1/test.sh
similarity index 74%
rename from day-1/awk/test.sh
rename to awk/day-1/test.sh
index d2d9c27..96ef6f8 100755
--- a/day-1/awk/test.sh
+++ b/awk/day-1/test.sh
@@ -19,10 +19,10 @@ set -e
PATH="$(pwd):${PATH}"
-source ../../aoc-utils.sh
+source ../aoc-utils.sh
-aoc_expect part-1.awk ../test-input.txt 24000
-aoc_expect part-2.awk ../test-input.txt 45000
+aoc_expect part-1.awk ../../input/day-1-example.txt 24000
+aoc_expect part-2.awk ../../input/day-1-example.txt 45000
-aoc_expect part-1.awk ../input.txt 68292
-aoc_expect part-2.awk ../input.txt 203203
+aoc_expect part-1.awk ../../input/day-1.txt 68292
+aoc_expect part-2.awk ../../input/day-1.txt 203203
diff --git a/aoc.el b/elisp/advent-of-code.el
similarity index 82%
rename from aoc.el
rename to elisp/advent-of-code.el
index e04637e..f874ab5 100644
--- a/aoc.el
+++ b/elisp/advent-of-code.el
@@ -25,7 +25,13 @@
(defmacro aoc-debug (expr)
`(let ((e ,expr))
- (debug e)
+ (princ (format "%s\n\n" e) 'external-debugging-output)
+ (unless noninteractive
+ (debug e))
e))
-(provide 'aoc)
+(provide 'advent-of-code)
+
+;; Local Variables:
+;; read-symbol-shorthands: (("aoc-" . "advent-of-code-"))
+;; End:
diff --git a/day-1/elisp/solution.el b/elisp/day-1/solution.el
similarity index 94%
rename from day-1/elisp/solution.el
rename to elisp/day-1/solution.el
index 2b416c5..11ef9c4 100755
--- a/day-1/elisp/solution.el
+++ b/elisp/day-1/solution.el
@@ -17,15 +17,15 @@
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see .
-(add-to-list 'load-path "../../")
+(add-to-list 'load-path "../")
(require 'ert)
(require 'cl-lib)
(require 'aoc)
-(defvar input-file "../input.txt")
+(defvar input-file "../../input/day-1.txt")
-(defvar test-input-file "../test-input.txt")
+(defvar test-input-file "../../input/day-1-example.txt")
(defun eat (data)
(let ((lines (string-lines data)))
diff --git a/elisp/day-2/solution.el b/elisp/day-2/solution.el
new file mode 100755
index 0000000..763736c
--- /dev/null
+++ b/elisp/day-2/solution.el
@@ -0,0 +1,141 @@
+#!/usr/bin/env -S emacs --script
+
+;; -*- lexical-binding: t; -*-
+
+;; Copyright (C) 2022 notroot
+
+;; 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 .
+
+(add-to-list 'load-path "../")
+
+(require 'ert)
+(require 'advent-of-code)
+
+(defvar solution-example-input
+ "../../input/day-2-example.txt")
+
+(defvar solution-input
+ "../../input/day-2.txt")
+
+(defvar solution-shapes
+ '(rock paper scissors))
+
+(defvar solution-outcomes
+ '(win lose draw))
+
+(defvar solution-opponent-letter-to-shape-alist
+ '(("A" . rock)
+ ("B" . paper)
+ ("C" . scissors)))
+
+(defvar solution-player-letter-to-shape-alist
+ '(("X" . rock)
+ ("Y". paper)
+ ("Z" . scissors)))
+
+(defvar solution-player-letter-to-outcome-alist
+ '(("X" . lose)
+ ("Y" . draw)
+ ("Z" . win)))
+
+(defvar solution-shape-score-alist
+ '((rock . 1)
+ (paper . 2)
+ (scissors . 3)))
+
+(defvar solution-outcome-score-alist
+ '((win . 6)
+ (draw . 3)
+ (lose . 0)))
+
+;; Each shape points to another shape creating a cyclical list.
+;; Each shape points to the shape that it beats, so deciding a game
+;; outcome is a simple list search!
+
+(defvar solution-shape-outcome-alist
+ '((rock . scissors)
+ (scissors . paper)
+ (paper . rock)))
+
+(defun solution-decide-game (a b)
+ (cond ((equal a b)
+ 'draw)
+ ((equal (cdr (assoc a solution-shape-outcome-alist)) b)
+ 'win)
+ (t
+ 'lose)))
+
+(defun solution-shape-for-outcome (a outcome)
+ (pcase outcome
+ ('lose
+ (cdr (assoc a solution-shape-outcome-alist)))
+ ('draw
+ a)
+ ('win
+ (car (seq-find (lambda (c)
+ (equal (cdr c) a))
+ solution-shape-outcome-alist)))))
+
+(defun solution-part-1 (input)
+ (let ((rows (seq-map (lambda (s)
+ (string-split s " " t))
+ input)))
+ (seq-reduce (lambda (acc row)
+ (let* ((their-shape (cdr (assoc (nth 0 row) solution-opponent-letter-to-shape-alist)))
+ (our-shape (cdr (assoc (nth 1 row) solution-player-letter-to-shape-alist)))
+ (outcome (solution-decide-game our-shape their-shape)))
+ (+ acc
+ (cdr (assoc our-shape solution-shape-score-alist))
+ (cdr (assoc outcome solution-outcome-score-alist)))))
+ rows
+ 0)))
+
+(defun solution-part-2 (input)
+ (let ((rows (seq-map (lambda (s)
+ (string-split s " " t))
+ input)))
+ (seq-reduce (lambda (acc row)
+ (let* ((their-shape (cdr (assoc (nth 0 row) solution-opponent-letter-to-shape-alist)))
+ (desired-outcome (cdr (assoc (nth 1 row) solution-player-letter-to-outcome-alist)))
+ (our-shape (solution-shape-for-outcome their-shape desired-outcome)))
+ (+ acc
+ (cdr (assoc our-shape solution-shape-score-alist))
+ (cdr (assoc desired-outcome solution-outcome-score-alist)))))
+ rows
+ 0)))
+
+
+(ert-deftest solution-test-decide-game ()
+ (should (equal (solution-decide-game 'rock 'paper) 'lose))
+ (should (equal (solution-decide-game 'paper 'rock) 'win))
+ (should (equal (solution-decide-game 'rock 'rock) 'draw)))
+
+(ert-deftest solution-test-part-1-example ()
+ (should (equal (solution-part-1 (aoc-read-file-lines solution-example-input)) 15)))
+
+(ert-deftest solution-test-part-1-input ()
+ (should (equal (solution-part-1 (aoc-read-file-lines solution-input)) 12740)))
+
+(ert-deftest solution-test-part-2-example ()
+ (should (equal (solution-part-2 (aoc-read-file-lines solution-example-input)) 12)))
+
+(ert-deftest solution-test-part-2 ()
+ (should (equal (solution-part-2 (aoc-read-file-lines solution-input)) 11980)))
+
+(when noninteractive
+ (ert-run-tests-batch-and-exit))
+
+;; Local Variables:
+;; read-symbol-shorthands: (("solution-" . "advent-of-code-day-2-") ("aoc-" . "advent-of-code-"))
+;; End:
diff --git a/day-1/test-input.txt b/input/day-1-example.txt
similarity index 100%
rename from day-1/test-input.txt
rename to input/day-1-example.txt
diff --git a/day-1/input.txt b/input/day-1.txt
similarity index 100%
rename from day-1/input.txt
rename to input/day-1.txt
diff --git a/input/day-2-example.txt b/input/day-2-example.txt
new file mode 100644
index 0000000..25097e8
--- /dev/null
+++ b/input/day-2-example.txt
@@ -0,0 +1,3 @@
+A Y
+B X
+C Z
\ No newline at end of file
diff --git a/input/day-2.txt b/input/day-2.txt
new file mode 100644
index 0000000..41022db
--- /dev/null
+++ b/input/day-2.txt
@@ -0,0 +1,2500 @@
+B Y
+A X
+B Y
+A Y
+A Z
+B Y
+B Z
+C Y
+A X
+C X
+A X
+B Y
+C Y
+B Y
+B Z
+C X
+C Z
+A X
+B Y
+C Z
+C Y
+B X
+B Y
+A X
+B Z
+B Z
+B Y
+C Z
+B X
+B Z
+C X
+B Y
+B Y
+B Y
+B Y
+C X
+C X
+B Z
+C X
+B Z
+C X
+B Y
+C X
+B X
+B Z
+B Y
+C Y
+B Y
+A X
+B Y
+B Y
+C Y
+B Z
+B Y
+B Z
+C Y
+B Y
+A X
+C X
+C Y
+B Y
+A Z
+A Z
+A X
+B Z
+A X
+A X
+B Z
+C Y
+C Z
+B Z
+B X
+C Y
+B Y
+C Y
+C X
+C Z
+A X
+B X
+B Y
+B Z
+B Y
+A X
+B Z
+B Y
+B Z
+B Z
+B Y
+A X
+B Y
+C X
+A X
+B Y
+C X
+A X
+C Y
+B Y
+C Z
+A X
+B X
+C X
+B Z
+A X
+B X
+B Y
+B Y
+B X
+B Z
+B Y
+C Y
+B Y
+B Y
+A X
+C Y
+C X
+B Y
+B Y
+C Y
+B Y
+B X
+B Z
+B Y
+B Y
+C Y
+B Z
+B Y
+B X
+A X
+B Z
+A X
+A X
+B X
+B Z
+B X
+B Y
+B Y
+B Y
+B Y
+C Y
+C X
+C Y
+B Y
+B Z
+B X
+B Z
+C Z
+C X
+B Z
+C X
+B Y
+C X
+C Y
+B Z
+C X
+C X
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A X
+A X
+B Y
+C X
+B Y
+B Z
+B X
+B Z
+A Z
+A X
+C X
+B X
+A X
+A X
+C Z
+A Z
+B Y
+A X
+C X
+C Y
+C Y
+A X
+B Y
+A X
+B Z
+C X
+B Z
+B Y
+B Y
+A X
+C X
+C X
+B Y
+A X
+A X
+C X
+B Z
+B Y
+A X
+A X
+B Y
+B Y
+B Y
+B Y
+C X
+B Z
+B Y
+B Y
+A Y
+B Y
+B Z
+A Y
+B Y
+C Y
+B Z
+B Y
+B Y
+C Z
+A X
+B Z
+C X
+C X
+B Y
+B Z
+B X
+A X
+B X
+B Y
+B Z
+B Z
+B Z
+B X
+B Y
+B Y
+C Z
+A X
+C X
+B Y
+B X
+C Y
+B Y
+B Y
+A X
+B Z
+B Z
+B Y
+B Y
+B Z
+B Y
+C Y
+C Y
+B Y
+B Y
+B Y
+A X
+A X
+C Y
+C Z
+C Z
+A Y
+C Y
+B Z
+B Y
+B Y
+C Y
+A X
+B X
+A Z
+A Y
+B Y
+C X
+B X
+B X
+A X
+B Y
+B X
+C Y
+B Y
+B Y
+B Y
+B Y
+B X
+B Y
+C X
+C X
+A X
+B X
+B X
+B Y
+C Y
+B Z
+C Y
+B X
+C X
+C Y
+B Z
+C Z
+A Y
+B Y
+A Z
+B Z
+C Y
+A Z
+B Y
+C X
+B Y
+B Z
+B Y
+A X
+B Y
+B Y
+C Y
+C Y
+A X
+B Y
+A X
+C Y
+B Y
+C X
+A X
+C X
+B Z
+B X
+B Y
+B Y
+B Y
+B Y
+B Y
+C Y
+A Z
+C X
+B X
+B Z
+B Y
+B Y
+B X
+B Y
+B Z
+B Y
+C Y
+B Y
+B Y
+B Y
+B X
+B Y
+B X
+A Z
+B Z
+C Y
+B Y
+B Z
+B X
+B Z
+A X
+B Y
+A X
+B Z
+B Z
+C Z
+B Y
+B Y
+B X
+B Y
+B Y
+C X
+B Z
+B Z
+B Y
+B Z
+B Y
+B Z
+A X
+C X
+C X
+B Y
+C Z
+B X
+B X
+B Y
+C X
+C Y
+B Y
+C X
+C Y
+B X
+B Z
+A X
+B Z
+B Z
+C Y
+B Z
+C X
+B Y
+C X
+A X
+A X
+C Z
+C X
+B Y
+C Y
+B Z
+C X
+A X
+C Y
+B Z
+B Y
+C X
+C Z
+B X
+A X
+B Y
+A X
+B Y
+C X
+B Z
+C Y
+C X
+B Z
+B Z
+B X
+C Z
+B Y
+B Z
+C X
+B Y
+B Y
+B Y
+C Z
+B Y
+B X
+B X
+C Z
+B Z
+A X
+B Y
+B Z
+B Z
+C Y
+C Z
+A Y
+B Y
+B Y
+A X
+B Y
+C Z
+A X
+C X
+B Z
+C X
+B Y
+B X
+B Y
+B Y
+C Y
+A Z
+B Y
+C Z
+B Z
+C Z
+B Z
+A Y
+A X
+B Z
+B Y
+B X
+B Y
+B X
+C X
+C X
+C X
+B Y
+C Y
+B X
+B Y
+B X
+C Y
+A Z
+B Z
+B Y
+B Y
+B Y
+B Y
+C X
+C X
+A X
+B Y
+B Z
+B Z
+C Y
+B Y
+A X
+C Y
+C Y
+B X
+B X
+A X
+C X
+C Y
+B Z
+A X
+B Z
+C X
+B Y
+B Y
+C Y
+B Y
+C Y
+A Y
+B Y
+B Y
+B Z
+A X
+B Y
+B Z
+C X
+B Z
+B Z
+B Y
+B Y
+B X
+B Y
+C Z
+B Z
+B Y
+B Y
+A X
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+C Y
+B Z
+B Y
+C Y
+A Z
+C Y
+B Y
+C X
+C Y
+C Y
+B Z
+B Z
+C Y
+C X
+B Z
+B Y
+B X
+A X
+A X
+C X
+B Z
+C X
+B Z
+A X
+B Y
+B Y
+C Y
+A X
+B Y
+B Y
+A X
+A X
+A Z
+C Z
+C X
+A X
+B Z
+B Y
+C Y
+C Y
+C Z
+B Y
+A X
+B X
+B Y
+C X
+C Y
+B Z
+C Y
+B Y
+B Y
+B Y
+B Z
+B Z
+B Y
+B Y
+C X
+A X
+B X
+B Y
+A X
+B Y
+B Z
+B X
+C X
+B Y
+B Y
+B X
+B Y
+C Y
+C Y
+B Y
+B Y
+B Y
+A X
+C Y
+B Y
+B X
+C Y
+A X
+B Y
+A Y
+A Z
+B Z
+B X
+A X
+C Y
+C Y
+B Z
+A Y
+B X
+B Y
+A X
+C X
+B Y
+C X
+B Z
+B Z
+C X
+B Y
+B Z
+B Y
+B Y
+B Z
+B Y
+B X
+B Z
+C X
+A X
+C Y
+C Y
+B Y
+B Z
+A X
+B X
+C Y
+A X
+A X
+A X
+C X
+B Z
+B Y
+C Z
+B Y
+B Y
+C X
+B Y
+A X
+A X
+B Y
+B Z
+C X
+C X
+C X
+A X
+B X
+C Z
+C Y
+B Y
+C X
+C X
+B Y
+B Y
+C Z
+A Z
+A X
+B Y
+B X
+A X
+A X
+B Y
+B X
+B Y
+C Y
+A Y
+C X
+B Y
+B Z
+B Y
+B Z
+C Z
+B X
+B Y
+A X
+B Y
+B Y
+C Z
+A X
+B Y
+B Y
+B Y
+A X
+C Y
+A X
+B Y
+C X
+C Y
+C X
+B Y
+B Z
+B Y
+B Y
+C X
+C Y
+B Y
+C X
+C Y
+B Y
+B Z
+A X
+A Z
+B Y
+C X
+B X
+B Y
+C X
+A X
+A X
+C Y
+C Z
+C X
+C Y
+A Y
+C Y
+C Z
+C X
+B Y
+C X
+A Z
+B X
+C X
+B Y
+B Z
+B Z
+B Y
+C Y
+B Z
+B Y
+B Z
+A X
+C X
+B Z
+C X
+B Z
+C X
+C Y
+C Y
+C Y
+B X
+C Z
+B Y
+B Z
+B Y
+C Y
+B Y
+A X
+B Y
+C X
+A Y
+A Z
+A X
+B Y
+C X
+B Z
+B Z
+C X
+A X
+B Y
+A Z
+B Y
+C X
+B Z
+B Y
+C X
+A X
+B X
+C Y
+C Z
+C Y
+C Y
+A X
+B X
+B Y
+C Y
+B Y
+A X
+B Y
+B X
+B Y
+A X
+B Y
+B X
+C Z
+B Y
+C X
+B Y
+A X
+B X
+B Z
+B Y
+A X
+C X
+B X
+C X
+B Y
+A X
+C X
+B Y
+A X
+B Y
+B Y
+A X
+B Y
+B Z
+A X
+B Y
+B X
+C Y
+B X
+B Z
+C X
+B Y
+C Z
+B Y
+C X
+C X
+A X
+B Y
+C Z
+B Z
+B Y
+B Y
+B Z
+B Y
+B X
+B X
+B Z
+C Y
+C Z
+B Y
+A X
+B Y
+B Y
+C X
+C X
+B Z
+A X
+B Y
+B Y
+B Y
+C X
+B Y
+B Y
+C Y
+B Z
+C X
+B Z
+B X
+B Y
+C X
+C X
+A X
+C X
+B Y
+C Y
+B Y
+C Z
+A X
+B Z
+B Y
+B Y
+B Y
+C X
+C Y
+B Y
+B X
+C X
+B Y
+A X
+B Y
+C X
+A X
+A X
+C Y
+B X
+B X
+B Z
+B Z
+B X
+C Y
+B Y
+B Y
+B Y
+C X
+C Y
+B Z
+B Z
+C Z
+B Y
+B Y
+A Z
+C Y
+C X
+B Z
+A X
+A X
+C X
+A X
+B X
+B Y
+B Z
+B Y
+A X
+B Z
+B Z
+B Y
+B Y
+C Z
+A X
+C Y
+B Y
+B Y
+B Z
+B Y
+C X
+B Z
+A X
+B X
+A X
+B Y
+C X
+A X
+C X
+B Y
+A X
+C X
+B Y
+A X
+B X
+A Y
+B Y
+B Z
+C Z
+B Y
+B Z
+C X
+B Z
+B Y
+C X
+B Y
+B Y
+B X
+A X
+A Y
+A X
+B Y
+B X
+C X
+B Y
+B Y
+B Z
+C Y
+A X
+B Z
+A X
+A X
+A X
+A X
+C Y
+B X
+C X
+C X
+A X
+B Y
+C Y
+A X
+A X
+C Y
+C X
+C Y
+B Y
+B Z
+A X
+B Y
+B Y
+B Z
+B Y
+B X
+C Y
+C X
+C Y
+C X
+B Y
+A X
+B Y
+A X
+C Y
+C X
+C Y
+C X
+C Y
+B Y
+B Y
+A Z
+A X
+A X
+B Z
+A X
+B Y
+B Y
+A X
+A X
+C Y
+C Y
+C Y
+A X
+B X
+C X
+B Y
+A X
+B X
+B Y
+C Y
+A X
+B X
+B Y
+B Y
+B Y
+C X
+C X
+B Y
+B Y
+A Z
+B Y
+A X
+B Y
+B Y
+B Y
+B Y
+A X
+B Z
+C X
+B Z
+B Z
+C Y
+B Z
+A X
+A X
+B Y
+A Y
+A X
+A Z
+C Y
+C X
+C X
+C Z
+C X
+C Y
+B X
+B Y
+A X
+B Y
+A X
+C X
+B Y
+A Y
+B Y
+B X
+B Y
+A X
+B Y
+B Z
+B Z
+B X
+B Z
+C X
+A X
+B Y
+B Y
+B Y
+A X
+C X
+C X
+C X
+B Y
+C Y
+A X
+B Y
+C Y
+B X
+B Z
+A X
+B Y
+A X
+C X
+C Y
+C Y
+B Y
+C Y
+C X
+B Z
+B Y
+B Y
+A X
+A X
+B Y
+B Y
+B Z
+C X
+C X
+C Y
+C X
+C Z
+A Z
+C X
+B Y
+A Z
+B Y
+A X
+B Y
+C X
+B Y
+B Y
+B Z
+C Y
+B Y
+A Z
+A X
+A X
+C X
+A Y
+B Y
+B Y
+A X
+A X
+B Z
+B Z
+B Y
+C X
+C Y
+C Z
+A Z
+B Z
+A X
+A Z
+A X
+C Y
+C X
+A X
+A X
+C Z
+C X
+A X
+C Y
+C X
+A X
+B Z
+B Z
+B Y
+B Y
+B Y
+B Y
+B Y
+C Y
+C X
+B X
+C X
+B Y
+B Y
+A X
+B Y
+A X
+A Y
+B Z
+B Y
+A X
+A Y
+B X
+B Y
+C Y
+B Y
+C X
+C Z
+B X
+B Z
+B Y
+C Z
+B Y
+C Y
+A X
+B Y
+B Y
+B Y
+B Z
+C Y
+A Z
+C X
+B Y
+B Z
+C X
+B Y
+A X
+C Y
+B X
+C X
+A X
+B Y
+B Y
+C X
+B X
+B Y
+B Z
+B Y
+A X
+B Y
+B X
+A X
+A X
+A X
+B Y
+C Y
+C X
+B Y
+A X
+A Z
+B Z
+A X
+C X
+B Y
+B Y
+C Y
+B Z
+B Y
+C X
+C Y
+B Y
+C Y
+B Y
+B Y
+C X
+A X
+A X
+A X
+B Y
+B Y
+B Y
+C X
+A Z
+B Y
+B Z
+B X
+B Z
+B Y
+B Y
+C X
+A X
+B Y
+B Y
+B X
+B X
+C X
+C X
+A X
+C Y
+B Y
+C X
+B Y
+C Y
+C X
+B Y
+C X
+B Y
+A X
+B Z
+C Z
+C Y
+A X
+B Z
+A X
+C Y
+C Y
+B Z
+B Z
+A X
+C X
+B Y
+C Z
+B X
+B Z
+B Y
+B Y
+B Y
+C Y
+B Y
+C X
+A X
+B Y
+C Y
+B Y
+A X
+B Y
+B Y
+C X
+A X
+B X
+B X
+B Z
+C Z
+B Y
+C Y
+C Y
+B X
+C X
+C X
+B Z
+B Z
+C X
+C X
+B Y
+C X
+B Y
+B Y
+B Z
+B Y
+B X
+B Y
+C X
+C Y
+C Y
+B Y
+A X
+B Y
+A X
+C Y
+C Z
+C X
+C Y
+B Y
+B Y
+B Z
+B Z
+A Y
+C X
+B Y
+B Z
+A Z
+B X
+C X
+B Y
+B Z
+B Y
+C X
+A X
+B Z
+C X
+B Z
+B Z
+B Z
+B Y
+C X
+B Y
+B Y
+B Y
+A Z
+B Y
+B X
+C X
+B Y
+C Y
+A Z
+B Z
+A X
+A X
+B Z
+A X
+B Z
+A X
+A X
+C X
+C X
+A Z
+C X
+B Z
+B Z
+B Y
+B X
+B Y
+B Y
+B Z
+B Y
+C Y
+A X
+C Y
+B X
+B Y
+B Z
+C X
+A Z
+A X
+B Y
+A X
+A X
+C X
+A X
+B Y
+A Z
+B Y
+C Y
+A X
+B Y
+A X
+B Z
+A Z
+C X
+B Z
+B Y
+B Z
+B X
+A X
+B Z
+C X
+B X
+B Z
+B Z
+C X
+C X
+C X
+B Y
+B Z
+C X
+B X
+B Y
+C Y
+B Z
+A Z
+C X
+B Z
+B Z
+B X
+C Y
+B Z
+B Y
+A X
+B Y
+B X
+B Y
+B Y
+B Y
+B Y
+B Z
+A X
+B Y
+B Y
+B Y
+B Y
+C Y
+A Z
+C X
+B X
+A Y
+B Y
+A X
+A X
+B Y
+A X
+C Z
+B Z
+C Z
+B Y
+C Y
+A X
+C Y
+C Y
+C Y
+B Y
+C Y
+B X
+B X
+C Y
+A X
+C Y
+C X
+C X
+B Y
+B Z
+B X
+B Z
+B Z
+B Y
+C Y
+B Y
+C Y
+B Y
+B Z
+B Y
+A X
+B Y
+C Z
+B X
+B Y
+C Z
+C X
+B Y
+C Y
+C X
+A X
+B Y
+A X
+B X
+B Z
+B Y
+B Z
+C X
+B Y
+A X
+B Z
+B Y
+B Z
+B X
+B Z
+B Z
+A X
+A Z
+B Y
+C Y
+A X
+B Z
+B X
+A X
+A X
+C X
+B Y
+C X
+C Z
+B Z
+B Z
+B Y
+C Y
+C X
+B Y
+B Y
+A X
+B Y
+C Z
+B Y
+B Y
+C Y
+B X
+B Y
+B Y
+B Z
+B X
+B Y
+B X
+B Y
+B Z
+B Z
+B Z
+B Z
+B Z
+C Y
+B Y
+C Y
+A Y
+C Y
+C Z
+A X
+B Y
+C Y
+B Y
+A X
+C Y
+B Z
+A X
+A X
+B Z
+C Y
+B Y
+C X
+B Z
+B Y
+A X
+B Y
+C X
+B Y
+B Z
+A X
+C X
+B X
+B Y
+A Y
+C Y
+C X
+B Z
+C Z
+B X
+B X
+C Y
+A X
+A X
+B Y
+C Y
+C X
+C Y
+B Z
+C X
+B Y
+B X
+B Y
+C X
+B Z
+B Z
+B Y
+C X
+C Z
+B Y
+B Z
+B Z
+B Z
+A Y
+B Y
+A X
+B Z
+C X
+C Z
+A X
+B Y
+C X
+A X
+C Y
+C Y
+B Y
+B Y
+B Y
+B X
+B Y
+B Y
+C X
+A X
+B X
+B Z
+C X
+B Y
+C X
+C Y
+B Y
+A X
+B Y
+B Y
+A X
+B Y
+A X
+C X
+A X
+B Y
+A Y
+A X
+B Y
+C X
+C Y
+B Z
+A X
+B Y
+C X
+A X
+B Z
+C Y
+A X
+C X
+B Y
+C X
+C Z
+B Y
+B Z
+C Z
+C Y
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+A X
+A X
+B X
+A X
+C Y
+B Z
+B Y
+B Y
+B Y
+B Y
+C X
+B Z
+A X
+A X
+B X
+B Y
+B Z
+B Z
+B Y
+C X
+A X
+B Y
+B Y
+B Y
+B Y
+A X
+B Z
+C Z
+B Z
+B Y
+A X
+A X
+B Z
+B Y
+B Y
+B Y
+C X
+B Z
+B Y
+B Y
+B Y
+B Z
+C X
+A X
+B Z
+C X
+B Z
+A X
+A X
+A X
+C X
+C X
+B Z
+C X
+C X
+C X
+B Y
+B Y
+C X
+A X
+C X
+C Y
+B Z
+B Y
+B Z
+A X
+B Y
+B Z
+B Y
+A X
+B Z
+B Y
+B Z
+A X
+B Y
+B X
+C Y
+C Y
+B Y
+C Y
+C X
+B Z
+B Z
+C Y
+A X
+B Y
+B Y
+C Y
+C Y
+A Z
+B Y
+B X
+C X
+B Y
+C X
+C Z
+C X
+C X
+C Y
+A X
+C Z
+C Z
+B Z
+B Y
+A X
+B Y
+B Z
+B Z
+C Y
+C Y
+B Y
+B X
+B Z
+A X
+C X
+C X
+A X
+B Y
+C Y
+C X
+B Y
+B Z
+A Y
+B Y
+B Y
+B Y
+B Y
+C Y
+B Y
+C Y
+B Z
+C Y
+B Y
+B Z
+B Y
+B Y
+C X
+C X
+B Z
+B Z
+B Z
+B Y
+B Z
+A X
+A Y
+C X
+B Z
+A X
+A X
+A X
+C Y
+A X
+B Y
+A Y
+B Y
+B Y
+C X
+B Y
+B Y
+A X
+B X
+A X
+B Y
+B Y
+B X
+A X
+B X
+B Z
+C X
+A X
+B Y
+B Z
+C Y
+C Z
+B Y
+C Y
+C Z
+B X
+B Y
+C Y
+A X
+B Y
+C Y
+C X
+B X
+C X
+A X
+C Y
+C Z
+B Y
+A X
+C Z
+C X
+B Y
+B Y
+C Y
+C Z
+C Y
+A X
+A X
+C Y
+A Y
+A Z
+A Y
+C X
+C Y
+B Z
+B Y
+B Y
+B Z
+A X
+C X
+C X
+B Y
+A Z
+B Y
+B X
+B Y
+B Y
+C Y
+C Z
+A Y
+B Y
+B Y
+B Y
+B Z
+B Y
+C Y
+B X
+B Y
+C X
+A X
+B X
+B Y
+B Y
+A X
+B Z
+C Z
+C X
+B Y
+A X
+A X
+C Y
+B Y
+A X
+B Y
+B Y
+C Z
+A X
+A X
+B Z
+C Y
+B Y
+B Y
+A X
+B Z
+A X
+C Z
+B Y
+A Z
+B Y
+A Z
+C Z
+B Z
+B Y
+C Z
+B Y
+C Y
+A X
+B Y
+B Z
+C Y
+A X
+C Y
+C Z
+B Z
+A Z
+B X
+A Z
+C Z
+A X
+C X
+B Y
+B Y
+B Y
+B Y
+B Y
+B Y
+C X
+B X
+B Y
+C X
+B Y
+C Y
+A X
+B Y
+C X
+A X
+B Z
+B Y
+A X
+B Y
+C X
+C X
+B Y
+A X
+B Y
+C X
+C X
+B Y
+B Y
+B X
+C Y
+B X
+C X
+A X
+B Y
+A Z
+B X
+B Z
+A Z
+A X
+B Y
+C Y
+B Y
+B Y
+B Y
+C Z
+A X
+B Z
+C Y
+C Y
+C X
+A Z
+B X
+C X
+C Z
+B Y
+B Y
+C Y
+C X
+B Y
+C Y
+B Y
+C Y
+B Z
+C X
+B X
+B X
+C Y
+B Z
+B Y
+B Y
+B Z
+B Y
+A X
+C Y
+B Y
+B Y
+B Z
+B Y
+C X
+B Y
+C X
+B X
+A X
+A X
+C X
+B X
+B Y
+B X
+A X
+C X
+B X
+B Z
+B Y
+A X
+A Y
+B Y
+C Y
+B Y
+A Z
+B Y
+B Y
+C Y
+A X
+C Y
+B Z
+C X
+C X
+A X
+C Y
+C Y
+A Y
+B Y
+B Z
+B Y
+C X
+B X
+C Y
+C Y
+A Y
+C Y
+B Y
+B X
+B Y
+C Y
+B Z
+C X
+B Y
+C Y
+B Y
+B Y
+B Y
+A X
+C Y
+A X
+B X
+B X
+C X
+C Y
+B Y
+A Z
+B Y
+A X
+B Z
+B Y
+C Z
+B Y
+C X
+C X
+C X
+C X
+B X
+C X
+B Z
+A X
+C Z
+B Y
+A X
+C Y
+A Z
+B Y
+C Y
+B Y
+B Z
+A X
+B Y
+B Y
+B Y
+A X
+B Z
+C Y
+B Y
+B Y
+B X
+B Y
+B Y
+A Z
+C Y
+B X
+C X
+B Y
+B Z
+B Y
+B Y
+C X
+B Z
+B Y
+C Y
+B Y
+B Y
+A X
+C X
+A X
+B Z
+A X
+C X
+B Z
+A X
+B Z
+C Z
+A X
+B Z
+C X
+B Y
+B Y
+B Y
+C X
+B X
+A X
+B Y
+B Z
+C X
+B X
+B Z
+C Y
+B X
+B Y
+C Y
+B Y
+C X
+B Z
+A Z
+B Y
+B Z
+C X
+B Z
+B Y
+C Y
+C Y
+A X
+C Y
+B Y
+A Z
+C X
+C X
+C X
+B Y
+C X
+B X
+B Y
+B Y
+A X
+A X
+B Z
+A X
+C Y
+C X
+B Y
+C Z
+B Y
+B Y
+C X
+B Z
+C Y
+A X
+B Y
+A X
+A X
+B Y
+B Y
+B Y
+B Z
+A Z
+B Z
+B Y
+A X
+C X
+A X
+A Z
+C Y
+A X
+C X
+C X
+A X
+C Z
+B Y
+B Y
+B X
+B Y
+C X
+A X
+A X
+B Y
+A Z
+C Z
+B Z
+B Y
+B Y
+B Y
+C Y
+C Y
+B Y
+A X
+B Y
+B Y
+C Z
+B Y
+A X
+C Z
+B Y
+C X
+B X
+B Y
+B Z
+C X
+C Y
+B Y
+B Z
+B Z
+A X
+A X
+B Y
+B Y
+C Y
+C X
+C X
+A Z
+C Z
+B Y
+B Y
+A X
+B Y
+B Y
+A X
+C Y
+C X
+C X
+C Y
+C Y
+B X
+B Z
+C X
+B Y
+C Y
+B X
+B Y
+A X
+C Z
+C Y
+C Y
+A X
+C Z
+C X
+B Y
+B Y
+C Y
+C X
+C X
+C X
+C Z
+C Y
+A X
+B Y
+C X
+B Y
+B X
+C X
+B Z
+C X
+C Z
+B Z
+B Y
+A X
+B Z
+B X
+C Y
+B X
+B Y
+B Z
+B Y
+A Y
+B Y
+A X
+A X
+B Y
+A X
+C X
+C Z
+B Z
+B Y
+B Y
+B Y
+A X
+C Z
+B Y
+C Z
+C X
+A X
+B Y
+A X
+B Y
+C Y
+B Y
+A X
+B Y
+C Z
+B Z
+A Y
+C X
+A X
+A Z
+C X
+B X
+B Y
+B X
+C Y
+B Y
+B Y
+C Y
+C Y
+B Y
+A X
+B Y
+B Y
+B Y
+C X
+C Y
+B X
+B X
+B X
+A X
+B Z
+B Y
+C Y
+B Y
+C X
+B X
+C X
+C X
+B Y
+C X
+B Z
+B Z
+C X
+B Y
+B Y
+B Z
+C X
+C Z
+B Y
+A X
+A X
+A Y
+C X
+B Z
+B X
+B Y
+B Y
+C X
+B Z
+A X
+C X
+A Y
+A X
+C X
+C Z
+B Y
+B Y
+B Z
+C X
+B Z
+B X
+A Z
+C Z
+A X
+B Y
+A X
+B Z
+A X
+B X
+B Z
+B Y
+B Y
+C X
+B Y
+B Y
+A X
+B Z
+C Y
+C X
+B Y
+C X
+A Y
+B Y
+B Y
+B Y
+B Z
+C Y
+B Y
+C X
+B Y
+A Z
+C X
+B X
+A X
+C Z
+B Y
+A X
+B Z
+B Z
+C X
+A Y
+A X
+B Z
+B Z
+B X
+B Z
+C Z
+C Y
+B Y
+C X
+B X
+B Y
+A Y
+C X
+B Z
+B Y
+C X
+B X
+C X
+A X
+B Z