diff --git a/advent-of-code-2022.csproj b/advent-of-code-2022.csproj
index dc831a9..cede580 100644
--- a/advent-of-code-2022.csproj
+++ b/advent-of-code-2022.csproj
@@ -74,6 +74,8 @@
+
+
diff --git a/inputs/18.txt b/inputs/18.txt
index 889631d..b6dc3e6 100644
--- a/inputs/18.txt
+++ b/inputs/18.txt
@@ -1,100 +1,2742 @@
-[3,[5,[7,[3,9]]]]
-[[[[7,0],0],[2,[2,8]]],[[[7,8],1],3]]
-[[[[2,7],0],7],4]
-[[2,1],[9,0]]
-[[[[7,1],[3,2]],[[9,8],5]],[2,7]]
-[[[8,9],[[8,7],0]],[[[8,7],[6,3]],[[1,7],[8,9]]]]
-[[8,6],[[9,[1,7]],[6,[3,9]]]]
-[[2,[[5,6],6]],[[4,[5,9]],[3,[4,5]]]]
-[[[[2,0],[1,1]],[6,6]],[[1,9],[[2,7],[6,8]]]]
-[[[4,6],[[6,3],[3,9]]],[[[2,6],[6,1]],[[9,9],[1,5]]]]
-[[[4,[3,1]],3],6]
-[[0,[[5,2],8]],[1,[9,[4,3]]]]
-[[[[8,6],[2,1]],[2,[8,6]]],[[[7,1],[3,9]],0]]
-[[[[4,7],[2,7]],[[8,9],2]],[[[2,4],[7,2]],[3,7]]]
-[[5,[2,2]],[[1,6],[[9,1],[5,0]]]]
-[[5,[[1,2],[6,4]]],[6,8]]
-[[[5,[1,7]],7],[7,[8,1]]]
-[[1,9],[[0,3],[[6,7],[2,4]]]]
-[1,[7,[[0,6],0]]]
-[[[[5,7],9],[[3,2],7]],[[5,1],[9,9]]]
-[[[[0,4],[9,6]],[[8,3],[7,4]]],[7,[6,2]]]
-[[[[1,6],0],[[8,0],[3,4]]],[[3,[0,3]],4]]
-[4,[[7,8],[4,[9,7]]]]
-[[[2,[3,7]],5],[0,[9,9]]]
-[[[2,0],[[5,8],[7,6]]],[[9,[6,2]],[3,2]]]
-[[[3,1],3],[[[3,7],6],[9,8]]]
-[[7,[[2,5],5]],[5,[3,[4,5]]]]
-[[[6,7],6],[2,[[9,3],9]]]
-[[[[5,6],7],[[3,2],5]],[[9,[4,3]],[3,8]]]
-[0,7]
-[[[4,6],[2,9]],[[[7,6],[5,1]],7]]
-[[0,5],[[1,[4,1]],[[7,3],9]]]
-[[[2,[3,8]],5],[[[5,9],8],[7,0]]]
-[[[6,[8,6]],[[3,6],7]],[[2,1],[6,[7,5]]]]
-[[2,[[6,3],[8,9]]],[[[5,6],4],[[7,0],1]]]
-[[[[7,1],[5,6]],8],[[[8,9],4],[8,3]]]
-[[[9,2],[1,0]],0]
-[[5,[5,[8,5]]],4]
-[[3,[5,[4,9]]],3]
-[[8,[[7,7],6]],5]
-[[4,[[5,1],1]],[1,[1,[9,8]]]]
-[[[7,[3,6]],[[2,8],[4,7]]],[[[8,8],[4,0]],[2,4]]]
-[[[[3,6],3],[0,9]],2]
-[[2,8],[[8,[8,6]],[[1,1],[4,5]]]]
-[[2,[1,[1,0]]],[[[6,2],[7,4]],[[7,1],6]]]
-[3,[8,[7,[8,6]]]]
-[[1,0],[[[0,4],[0,5]],[1,5]]]
-[[[[5,0],4],[[7,8],[8,8]]],[[1,7],0]]
-[1,[[[4,1],7],[6,[9,0]]]]
-[[[1,8],2],[[5,5],[8,5]]]
-[[4,[9,[0,6]]],[[[8,9],[4,5]],4]]
-[[[[5,4],[1,7]],[[3,1],[7,9]]],[[[0,8],[4,7]],[[5,9],6]]]
-[[[[8,0],9],4],[[7,[1,3]],5]]
-[[[[5,0],6],[[6,1],8]],[[9,1],7]]
-[[9,[6,[8,8]]],[7,[[7,1],6]]]
-[[[5,[1,5]],[3,[4,2]]],[[[5,2],7],[[6,9],[2,8]]]]
-[[[5,[5,5]],[5,7]],[4,[[2,9],7]]]
-[[[[0,4],0],[[0,6],[3,0]]],[0,[[8,1],2]]]
-[[[7,[4,6]],[[7,2],[4,6]]],[[[9,3],[4,9]],6]]
-[[6,7],7]
-[[[4,1],[8,[1,5]]],[[4,6],0]]
-[[[4,[5,5]],5],[[0,[2,7]],[1,1]]]
-[[[[0,1],3],[6,7]],[4,7]]
-[[4,[6,4]],[[[9,8],1],[9,3]]]
-[[[4,9],0],[[[7,0],[0,9]],[1,[1,0]]]]
-[[[7,9],[[9,5],[6,9]]],[[0,[3,0]],[0,[5,9]]]]
-[9,[[0,0],[[1,9],9]]]
-[[[5,[0,5]],[[9,8],[9,5]]],[[0,[2,5]],7]]
-[[[[5,8],6],9],[[[2,7],7],[[7,8],5]]]
-[[8,[[4,7],6]],2]
-[[[[7,1],[9,0]],[9,[1,7]]],[[8,[6,7]],[2,5]]]
-[[4,[2,9]],8]
-[[[[7,6],[5,3]],[5,[9,7]]],[[6,[8,1]],[[6,4],9]]]
-[[7,[[7,8],4]],[[1,3],[4,[9,7]]]]
-[[[6,[6,7]],[[2,8],3]],[7,[6,[0,3]]]]
-[[9,8],[[0,[4,8]],[[9,1],1]]]
-[[[[4,0],[5,9]],7],[6,[[5,9],[9,6]]]]
-[[8,1],[1,[9,[8,3]]]]
-[[[1,[5,1]],[6,7]],[[5,9],[2,[6,7]]]]
-[[[3,7],[[7,8],1]],[[0,[6,3]],[8,0]]]
-[[5,[[9,3],[1,2]]],7]
-[[[1,[9,9]],3],[[6,4],[4,1]]]
-[[6,[1,[3,6]]],[2,9]]
-[[2,[0,2]],[5,[[9,4],[5,0]]]]
-[[4,[[3,1],[7,0]]],[[9,1],[[5,5],[6,7]]]]
-[[3,[[7,1],[3,4]]],[7,[9,[9,4]]]]
-[[9,9],[[5,4],[[9,7],4]]]
-[[[5,1],8],[[6,7],9]]
-[[[0,[9,5]],[4,3]],[3,2]]
-[[[6,[4,1]],[[8,7],[5,3]]],[[[1,2],5],[[9,2],5]]]
-[[[[7,4],[9,0]],[[1,8],[2,9]]],[[5,[1,9]],[4,0]]]
-[[[4,[3,8]],[[3,3],[2,8]]],[[[1,3],9],[[8,5],6]]]
-[[[[6,4],[7,9]],[[7,6],8]],[7,[9,8]]]
-[[7,[3,5]],7]
-[[[[5,0],[2,3]],[3,7]],[[4,[6,3]],[7,[4,4]]]]
-[[6,[3,[7,6]]],[[[5,8],[8,1]],[3,[1,5]]]]
-[[8,[9,[5,2]]],2]
-[[1,[5,4]],[[7,[8,0]],8]]
-[[[[2,7],4],3],[[1,4],[8,4]]]
-[3,[9,2]]
\ No newline at end of file
+13,6,3
+13,5,16
+11,2,10
+7,6,15
+8,11,3
+5,6,15
+6,11,3
+5,14,15
+11,18,8
+9,16,7
+2,10,11
+8,3,11
+5,7,6
+18,14,15
+10,5,5
+17,6,14
+6,4,7
+9,2,14
+3,11,16
+7,18,14
+14,12,4
+7,14,3
+12,16,4
+16,5,7
+14,7,3
+9,3,14
+14,14,16
+4,17,12
+17,16,14
+8,10,20
+16,10,17
+10,5,4
+11,5,4
+13,16,4
+12,2,12
+3,8,14
+8,5,14
+17,14,7
+16,7,3
+7,7,3
+15,15,7
+6,3,9
+5,6,5
+8,3,13
+16,14,4
+19,9,11
+5,8,5
+13,15,17
+15,7,16
+18,9,9
+4,6,8
+11,4,8
+9,19,12
+17,8,4
+13,4,16
+13,20,12
+9,17,12
+17,12,8
+14,11,2
+12,4,16
+3,7,8
+12,9,3
+14,16,4
+14,3,14
+4,16,9
+7,2,10
+12,5,5
+19,9,8
+17,11,3
+14,17,17
+13,12,19
+14,17,5
+11,13,20
+6,18,10
+12,1,10
+6,5,7
+2,8,8
+13,4,14
+5,3,13
+14,16,5
+12,17,7
+6,14,4
+5,10,17
+9,8,2
+13,4,5
+13,7,18
+5,19,8
+18,11,14
+1,10,9
+16,16,7
+5,5,8
+3,5,10
+6,3,8
+5,16,7
+6,9,4
+10,16,3
+18,7,13
+5,4,10
+9,14,18
+18,13,12
+19,11,15
+14,17,8
+15,6,13
+16,15,6
+3,15,10
+17,14,9
+14,15,16
+10,14,1
+10,2,15
+9,18,13
+2,10,9
+5,17,8
+14,9,3
+3,14,15
+12,3,13
+4,16,13
+7,6,17
+4,4,8
+13,3,10
+4,4,12
+11,19,14
+9,10,4
+14,10,16
+6,18,13
+9,4,4
+20,9,11
+3,11,5
+5,13,15
+2,14,11
+5,12,17
+10,20,12
+10,2,6
+14,5,15
+14,11,19
+9,20,13
+10,2,11
+17,16,12
+17,7,16
+3,8,10
+3,15,12
+4,7,14
+3,13,12
+19,12,12
+10,20,9
+10,1,12
+12,2,9
+17,16,15
+14,20,11
+6,17,6
+5,16,11
+6,19,9
+11,15,2
+11,8,2
+3,11,10
+10,4,5
+10,15,16
+7,4,7
+3,5,13
+2,13,8
+18,6,7
+19,8,12
+15,15,5
+17,12,5
+6,15,16
+7,12,18
+13,17,15
+15,4,7
+12,18,11
+18,12,14
+6,16,7
+13,12,4
+1,11,10
+10,14,3
+8,6,18
+14,4,9
+18,10,5
+5,16,14
+13,3,14
+5,6,6
+10,7,4
+7,7,16
+19,12,13
+11,4,15
+10,14,16
+18,8,13
+10,8,18
+3,13,10
+4,7,16
+15,3,14
+12,14,19
+6,7,4
+11,3,4
+18,9,12
+3,5,12
+9,3,6
+19,13,13
+4,7,13
+7,19,10
+2,11,6
+5,5,10
+8,16,17
+5,4,14
+18,7,15
+5,7,13
+9,11,2
+3,16,13
+16,4,8
+15,17,6
+10,4,4
+6,4,11
+2,13,14
+13,6,17
+7,3,12
+13,19,12
+10,19,16
+16,11,4
+12,15,18
+17,11,5
+4,12,13
+3,16,9
+12,3,10
+8,1,12
+18,12,15
+6,2,14
+16,6,14
+17,15,9
+14,13,3
+13,1,9
+16,13,17
+15,18,13
+7,13,18
+4,13,16
+6,4,13
+9,4,13
+11,19,10
+7,4,4
+9,7,18
+18,16,11
+3,12,12
+12,2,14
+7,10,18
+17,16,11
+11,13,2
+11,3,5
+11,3,14
+3,10,15
+16,18,11
+4,15,7
+11,11,20
+4,14,17
+8,12,19
+4,15,10
+10,16,7
+10,6,17
+19,12,11
+16,5,10
+10,4,6
+17,5,10
+16,10,4
+8,11,19
+7,5,17
+14,18,14
+12,2,10
+9,4,6
+6,9,3
+7,15,11
+6,4,10
+15,8,2
+3,7,13
+4,4,7
+14,19,14
+11,8,20
+14,8,3
+16,16,12
+18,13,8
+5,17,10
+17,14,15
+15,8,18
+7,3,8
+8,7,3
+15,11,4
+8,4,14
+19,11,10
+6,11,5
+10,9,1
+4,14,15
+11,1,12
+13,16,8
+4,10,17
+11,14,18
+8,10,3
+6,14,16
+4,6,11
+5,16,10
+7,17,12
+12,17,16
+16,10,3
+12,2,8
+3,11,7
+2,12,11
+17,17,13
+17,9,14
+17,18,13
+7,17,16
+9,17,15
+5,18,9
+11,4,17
+5,8,16
+14,11,3
+14,6,17
+17,8,11
+12,9,2
+9,18,7
+10,3,13
+8,6,19
+12,16,5
+18,5,9
+1,11,8
+12,7,2
+9,19,8
+11,3,7
+6,8,15
+6,13,18
+14,13,16
+6,8,4
+16,3,14
+6,17,12
+17,12,17
+11,11,19
+12,14,2
+11,3,13
+15,17,7
+15,14,3
+13,17,17
+9,10,3
+13,7,19
+16,6,5
+6,1,11
+17,8,14
+2,14,6
+15,4,14
+12,5,15
+17,4,7
+18,10,7
+9,14,3
+13,18,7
+15,8,4
+6,5,5
+7,17,6
+7,8,18
+4,17,10
+16,7,12
+10,18,11
+8,6,17
+8,13,1
+12,18,8
+4,14,7
+17,7,7
+10,7,18
+3,12,13
+10,2,12
+16,13,4
+10,2,8
+15,10,4
+18,12,5
+15,19,10
+8,7,2
+17,11,6
+7,4,9
+14,3,16
+14,9,18
+11,6,18
+4,8,10
+15,3,11
+17,17,10
+19,10,13
+6,16,16
+16,13,3
+10,1,10
+15,15,4
+18,9,5
+3,15,9
+9,19,9
+14,14,4
+11,4,16
+4,11,14
+13,18,16
+12,18,13
+15,4,11
+20,12,11
+6,3,6
+8,18,15
+10,3,11
+12,14,3
+13,18,5
+10,15,4
+10,5,17
+11,12,20
+4,8,5
+6,2,12
+7,4,5
+16,6,17
+6,12,3
+10,4,14
+18,11,15
+19,13,12
+3,11,15
+17,6,9
+16,6,7
+14,8,17
+1,9,10
+1,10,10
+15,8,16
+4,9,16
+8,11,2
+14,19,11
+12,20,13
+5,11,16
+4,12,16
+9,3,5
+15,13,18
+10,18,15
+3,15,11
+10,3,5
+11,12,2
+10,13,19
+20,9,10
+16,8,16
+7,14,16
+3,13,15
+8,7,5
+2,15,9
+6,10,3
+20,11,11
+7,12,19
+8,15,17
+15,9,20
+5,14,4
+7,11,2
+11,10,2
+5,17,13
+14,3,8
+4,6,6
+13,10,19
+12,17,3
+9,10,19
+3,9,8
+6,16,8
+9,13,2
+8,19,15
+16,8,11
+10,9,18
+17,4,10
+17,8,13
+9,10,20
+5,4,12
+19,13,14
+8,5,8
+14,3,10
+9,19,10
+4,12,15
+12,2,13
+9,16,3
+15,2,12
+13,10,2
+9,2,9
+11,12,19
+14,10,3
+8,8,2
+12,7,16
+16,12,16
+8,14,19
+5,13,3
+17,5,8
+11,17,4
+19,11,6
+7,19,12
+15,5,17
+17,6,15
+12,5,16
+5,6,8
+5,5,6
+2,13,12
+8,19,10
+3,14,8
+15,16,7
+13,12,18
+10,9,2
+6,4,6
+3,8,11
+10,18,13
+17,4,8
+18,15,9
+5,9,16
+10,19,9
+3,9,6
+17,3,11
+6,10,4
+12,5,17
+5,6,9
+6,5,13
+19,11,11
+18,11,7
+16,4,14
+15,5,4
+14,4,7
+12,8,4
+6,3,7
+5,4,7
+16,11,17
+2,9,8
+13,20,11
+5,10,15
+15,5,15
+10,12,18
+7,5,6
+5,14,6
+8,7,15
+19,13,8
+18,12,11
+10,3,16
+13,8,18
+17,7,5
+8,14,17
+6,15,7
+7,10,19
+15,2,11
+11,11,2
+14,5,4
+14,15,15
+12,16,16
+7,5,16
+9,9,1
+14,13,17
+17,16,10
+10,17,5
+18,14,8
+3,8,6
+3,11,6
+9,16,17
+3,7,9
+6,4,8
+5,12,18
+6,16,17
+16,14,16
+20,11,7
+14,18,9
+15,13,17
+13,16,17
+4,3,7
+1,12,13
+5,17,15
+13,19,9
+12,3,14
+9,15,4
+18,12,13
+3,14,12
+13,9,2
+16,14,6
+10,4,11
+6,17,8
+5,11,17
+7,5,4
+2,9,9
+8,3,15
+2,11,11
+6,17,11
+7,3,13
+15,3,7
+6,14,5
+16,16,11
+12,9,19
+18,16,10
+11,14,4
+2,14,9
+4,6,9
+12,4,4
+18,5,15
+8,9,19
+3,10,17
+8,1,11
+8,16,15
+10,12,4
+15,14,17
+1,13,7
+8,12,3
+7,7,17
+9,7,3
+10,15,17
+17,12,15
+14,4,15
+12,14,17
+19,14,9
+17,10,5
+8,13,2
+15,8,3
+4,16,14
+17,14,12
+2,11,9
+15,6,7
+18,13,15
+5,10,3
+9,14,16
+18,15,15
+10,1,7
+13,2,12
+11,13,19
+11,5,3
+13,15,3
+6,14,6
+14,19,8
+18,17,13
+10,7,3
+12,4,14
+10,2,5
+4,7,6
+10,17,7
+13,5,3
+8,14,4
+8,3,5
+15,18,9
+4,14,5
+14,17,15
+4,14,4
+15,13,3
+12,10,19
+1,9,9
+18,5,8
+12,12,17
+8,6,3
+15,7,18
+18,12,16
+17,13,8
+4,12,6
+11,18,13
+18,10,8
+16,8,6
+6,5,15
+6,15,4
+8,19,11
+12,19,11
+12,12,3
+12,16,18
+15,6,18
+14,11,1
+10,6,20
+3,6,7
+9,5,18
+15,12,3
+5,9,8
+9,1,11
+6,7,5
+7,10,17
+13,6,16
+15,16,10
+4,12,5
+5,13,19
+12,4,6
+8,6,4
+7,16,3
+7,4,14
+10,6,15
+8,14,2
+15,11,19
+6,5,10
+18,8,14
+3,4,13
+16,16,15
+5,5,16
+13,5,15
+15,18,11
+16,8,13
+11,10,18
+18,7,8
+6,17,14
+4,13,17
+16,10,18
+6,5,6
+2,8,10
+13,16,2
+15,18,10
+6,16,13
+17,5,14
+17,6,13
+20,7,10
+19,7,13
+9,16,4
+5,18,10
+11,6,4
+15,14,4
+14,12,3
+11,10,3
+19,11,7
+7,3,11
+4,8,6
+10,10,20
+18,8,18
+4,15,13
+12,14,18
+18,9,13
+16,3,10
+15,6,4
+12,5,3
+7,13,16
+12,11,20
+4,4,11
+14,17,16
+19,10,15
+15,3,12
+5,4,9
+6,16,5
+15,17,10
+13,10,5
+18,9,11
+12,19,10
+10,4,16
+9,14,4
+11,5,18
+7,5,7
+9,3,13
+7,8,4
+19,12,8
+15,6,17
+16,9,4
+6,18,8
+13,14,17
+3,12,6
+18,16,12
+9,4,12
+14,4,4
+11,17,14
+16,16,6
+5,6,16
+11,3,6
+4,6,10
+13,4,18
+12,19,9
+10,3,8
+2,13,9
+9,18,10
+2,13,10
+8,2,11
+6,15,6
+16,16,14
+17,15,12
+10,3,14
+3,13,14
+18,16,9
+8,14,5
+9,9,17
+5,17,6
+5,18,14
+18,8,11
+10,5,13
+11,19,11
+14,5,16
+8,7,18
+18,5,10
+4,17,5
+18,15,14
+6,4,9
+8,8,19
+4,11,6
+14,5,6
+11,6,2
+20,12,12
+8,10,2
+3,7,10
+13,4,15
+14,7,18
+10,16,16
+2,11,16
+18,8,15
+8,5,17
+20,12,7
+6,17,16
+6,10,17
+12,4,8
+10,17,17
+10,16,5
+3,10,8
+14,2,10
+9,9,18
+19,13,10
+8,9,2
+4,11,8
+15,11,17
+16,12,6
+16,15,14
+16,16,16
+15,4,15
+7,9,3
+18,10,14
+11,14,3
+17,6,10
+9,8,4
+2,10,17
+7,9,4
+4,9,5
+17,11,15
+4,6,13
+7,16,17
+5,5,14
+9,19,15
+10,5,19
+5,5,15
+4,15,16
+19,9,9
+3,14,7
+14,14,17
+17,14,4
+19,5,11
+17,16,8
+8,19,13
+11,18,9
+6,18,14
+15,17,9
+15,9,4
+18,6,9
+18,14,7
+13,2,13
+4,8,7
+19,10,11
+14,4,14
+9,18,6
+8,15,18
+5,12,5
+8,17,9
+17,8,8
+17,6,5
+2,6,9
+2,8,11
+8,9,6
+17,9,8
+6,6,14
+17,4,9
+10,18,7
+19,7,9
+16,14,5
+4,13,4
+11,6,3
+17,4,14
+14,16,17
+5,7,4
+18,11,12
+12,15,5
+3,9,11
+5,11,4
+12,18,9
+7,16,5
+5,5,5
+11,1,13
+14,14,3
+5,17,7
+17,9,5
+9,2,15
+10,11,2
+6,11,14
+7,2,9
+14,2,8
+8,18,7
+11,19,13
+6,3,11
+13,5,18
+15,14,5
+6,3,15
+7,9,19
+16,5,8
+8,2,12
+14,9,4
+13,19,7
+14,13,18
+14,7,17
+7,8,19
+6,9,16
+12,10,3
+6,15,17
+12,18,14
+4,14,16
+6,13,2
+18,11,8
+4,11,13
+18,13,9
+18,17,11
+17,5,13
+2,8,13
+1,14,8
+7,12,3
+9,6,3
+17,15,6
+9,20,9
+15,5,12
+6,6,5
+11,16,4
+7,3,5
+16,17,14
+4,17,8
+5,5,7
+6,18,12
+11,7,3
+15,4,8
+20,10,12
+7,18,10
+17,8,5
+2,11,12
+3,6,10
+15,6,16
+15,10,17
+2,7,6
+18,15,7
+14,9,2
+2,12,7
+10,3,17
+14,12,2
+13,12,20
+20,11,13
+7,10,2
+1,9,11
+17,9,16
+3,9,4
+16,5,5
+14,9,19
+7,3,9
+7,13,3
+17,6,6
+15,11,18
+16,4,12
+10,12,3
+5,16,5
+18,7,11
+11,16,16
+2,6,8
+10,16,15
+16,9,5
+5,15,15
+10,8,19
+3,8,15
+13,15,4
+11,19,12
+15,12,18
+12,19,12
+12,15,19
+19,9,12
+3,10,14
+15,3,8
+4,5,5
+16,5,13
+5,13,17
+14,6,5
+11,19,15
+15,17,16
+3,14,9
+10,2,13
+9,4,16
+10,18,14
+9,3,15
+14,11,18
+13,13,3
+18,15,5
+18,7,6
+10,15,2
+9,18,11
+10,2,14
+13,11,1
+19,8,11
+11,10,19
+2,6,11
+8,8,4
+16,12,4
+14,15,13
+19,16,10
+10,2,9
+9,18,12
+7,4,15
+5,7,8
+12,9,18
+15,6,15
+4,14,6
+11,8,19
+14,18,8
+14,17,13
+6,13,3
+8,17,15
+8,2,14
+13,14,19
+3,5,9
+13,18,6
+18,7,7
+13,12,2
+5,9,3
+13,11,19
+5,4,11
+11,3,17
+3,5,8
+8,16,6
+13,10,20
+13,18,14
+7,17,15
+14,16,12
+8,12,2
+17,4,13
+10,11,20
+12,10,2
+11,2,8
+9,2,10
+12,1,9
+8,5,16
+12,8,3
+20,15,9
+6,8,16
+10,17,16
+16,14,8
+12,17,5
+4,8,16
+7,15,18
+9,5,14
+13,16,5
+10,8,1
+11,20,12
+17,7,8
+7,2,12
+14,19,12
+10,10,19
+7,17,8
+15,7,6
+9,11,3
+14,6,15
+5,9,5
+20,14,11
+6,17,10
+17,11,16
+8,19,9
+17,13,16
+18,14,14
+3,12,9
+16,17,12
+14,7,5
+14,17,9
+19,9,14
+10,2,10
+16,15,4
+15,10,2
+11,2,14
+8,7,6
+8,19,6
+12,2,7
+16,3,12
+14,6,4
+4,8,4
+8,4,10
+14,15,4
+12,19,13
+10,6,18
+18,6,8
+2,9,10
+11,15,3
+16,13,16
+8,9,3
+10,18,8
+11,17,15
+17,13,5
+7,2,11
+17,13,15
+8,4,9
+18,7,14
+6,17,9
+12,12,18
+4,13,12
+19,7,10
+11,10,20
+13,19,13
+15,6,11
+4,5,15
+8,11,1
+12,7,18
+13,5,5
+6,7,16
+4,6,7
+15,16,9
+6,3,14
+18,15,13
+12,13,19
+17,17,8
+12,19,7
+15,5,5
+5,6,13
+19,6,11
+14,12,5
+2,12,9
+9,4,5
+15,5,11
+3,17,10
+16,17,11
+14,13,2
+20,9,8
+17,10,16
+2,9,15
+14,4,10
+7,4,16
+13,13,17
+12,9,16
+10,7,2
+9,8,19
+13,3,6
+11,7,18
+4,8,9
+17,10,18
+10,3,7
+16,8,4
+7,6,5
+1,7,11
+5,13,18
+3,6,11
+8,11,18
+17,12,6
+8,8,3
+18,14,13
+11,9,18
+5,13,13
+15,6,6
+7,14,19
+7,12,4
+9,7,2
+13,3,13
+15,17,11
+10,17,4
+8,17,18
+12,19,14
+19,8,9
+6,16,12
+8,7,4
+4,7,7
+13,3,15
+10,20,11
+7,14,4
+18,10,9
+17,14,8
+16,7,7
+15,4,13
+18,11,5
+4,8,15
+2,9,11
+1,13,12
+2,8,9
+6,19,10
+14,8,18
+11,18,12
+16,7,4
+4,10,16
+10,18,17
+3,11,8
+12,15,17
+17,5,11
+19,9,10
+19,8,16
+2,11,13
+20,9,12
+14,4,16
+5,13,9
+15,4,9
+18,10,11
+3,12,7
+4,9,12
+4,13,5
+11,15,18
+7,13,2
+12,1,12
+5,9,11
+2,8,12
+17,7,15
+14,5,12
+12,5,18
+3,14,11
+5,13,4
+17,8,7
+15,5,6
+19,8,7
+13,16,16
+5,11,15
+3,10,11
+8,6,16
+19,8,15
+6,18,7
+18,7,10
+14,3,9
+10,16,4
+15,19,13
+8,16,16
+17,14,17
+3,13,8
+4,5,11
+9,18,3
+5,17,14
+7,9,18
+6,16,6
+9,6,18
+6,9,19
+6,7,3
+9,19,13
+16,15,5
+14,16,7
+12,17,17
+18,9,17
+12,11,19
+16,7,17
+13,4,6
+3,6,12
+13,17,5
+8,18,14
+5,14,5
+15,18,12
+13,2,10
+5,5,9
+18,6,10
+9,13,18
+3,10,9
+6,6,18
+17,15,7
+4,9,7
+3,11,17
+15,6,8
+4,7,15
+11,12,1
+12,7,17
+6,14,3
+15,15,15
+17,14,11
+6,6,7
+13,20,13
+15,9,2
+12,2,11
+5,6,7
+13,8,3
+2,7,10
+19,10,12
+6,10,16
+16,17,6
+13,8,17
+17,13,4
+7,2,7
+11,9,3
+12,11,2
+13,8,16
+5,10,2
+10,19,7
+8,4,6
+17,5,9
+13,1,10
+16,4,13
+13,6,1
+6,11,4
+18,14,6
+12,13,17
+17,15,10
+7,12,1
+6,4,12
+4,7,9
+16,7,15
+6,9,6
+5,12,3
+4,14,14
+14,13,20
+15,18,15
+19,14,11
+16,18,12
+10,15,15
+6,6,17
+9,5,6
+14,18,11
+13,2,11
+7,19,8
+19,14,8
+18,11,11
+13,6,4
+1,10,8
+9,14,17
+16,17,13
+4,7,17
+10,1,11
+9,2,13
+4,10,7
+4,8,13
+8,15,3
+13,10,3
+10,9,20
+19,12,6
+3,14,10
+1,12,10
+7,9,2
+9,17,16
+9,1,12
+18,8,6
+6,5,4
+6,14,7
+12,19,8
+14,10,19
+17,6,7
+8,5,15
+11,19,7
+13,18,9
+18,6,13
+8,17,16
+10,7,14
+18,11,4
+15,17,8
+1,7,10
+10,19,12
+16,5,6
+9,11,18
+17,16,7
+6,7,8
+5,9,4
+6,4,14
+16,9,16
+13,4,13
+11,3,9
+12,13,2
+11,3,16
+5,6,17
+13,3,7
+9,4,7
+5,15,9
+16,10,5
+15,13,14
+15,11,3
+7,17,11
+11,5,5
+7,3,15
+4,16,10
+11,9,19
+15,12,2
+16,6,16
+19,11,14
+13,3,8
+15,17,14
+1,8,9
+19,13,9
+10,11,18
+7,1,10
+13,4,7
+12,1,16
+5,6,10
+13,18,11
+10,10,1
+5,11,2
+19,9,13
+4,17,13
+19,14,10
+15,16,6
+7,12,2
+10,11,1
+8,17,4
+10,15,1
+7,16,4
+3,15,14
+11,9,2
+19,8,14
+4,11,4
+10,13,20
+3,15,13
+15,16,18
+16,18,13
+14,13,4
+1,10,12
+11,20,13
+12,6,4
+5,12,4
+17,4,12
+4,10,3
+5,9,6
+5,15,12
+16,11,16
+5,7,10
+15,6,14
+3,10,10
+5,16,17
+18,10,16
+11,4,13
+9,5,16
+11,2,9
+12,5,8
+3,14,14
+6,11,6
+15,6,3
+8,11,20
+9,15,3
+12,4,3
+17,12,4
+6,9,18
+7,11,18
+4,18,10
+6,5,8
+3,13,6
+14,2,11
+7,11,19
+1,10,13
+4,15,14
+8,16,3
+16,7,6
+13,8,19
+15,17,5
+5,8,8
+17,10,7
+15,7,5
+14,5,3
+16,15,12
+1,9,13
+2,9,13
+11,1,9
+16,5,14
+2,12,13
+3,6,16
+5,16,8
+10,3,12
+3,14,16
+12,2,15
+5,12,6
+12,3,16
+8,3,7
+16,4,11
+5,8,17
+11,2,11
+13,17,13
+11,4,18
+3,16,10
+3,12,8
+2,10,13
+18,15,11
+18,5,12
+2,7,11
+14,3,6
+15,6,5
+14,10,2
+2,12,14
+6,13,4
+15,16,16
+8,19,12
+2,10,8
+15,9,19
+14,6,6
+15,4,10
+17,14,16
+2,11,14
+9,16,5
+8,18,9
+10,7,1
+16,5,9
+18,6,16
+15,13,16
+5,15,7
+16,4,15
+15,16,14
+6,8,6
+14,5,10
+16,5,15
+9,5,15
+6,3,13
+8,16,18
+16,3,11
+7,3,7
+9,13,19
+16,14,13
+12,3,8
+9,9,3
+2,11,10
+17,14,13
+14,16,6
+20,12,14
+10,5,16
+13,9,4
+12,5,4
+1,13,8
+17,17,14
+3,10,7
+10,13,2
+15,9,17
+14,19,10
+4,5,12
+7,10,3
+13,16,6
+16,7,9
+3,16,12
+4,9,4
+16,8,18
+2,11,5
+13,17,6
+7,17,5
+6,19,14
+5,16,6
+10,17,13
+3,8,13
+3,7,15
+12,4,7
+4,6,4
+11,14,19
+9,18,16
+8,3,6
+9,2,12
+13,2,7
+8,4,13
+8,17,14
+19,10,10
+10,15,5
+15,15,6
+18,15,10
+5,9,18
+10,20,13
+12,17,14
+19,7,12
+6,8,18
+16,2,10
+2,7,12
+7,13,4
+17,15,14
+8,15,5
+12,17,6
+18,9,8
+16,12,3
+11,9,1
+10,18,16
+16,10,16
+12,5,7
+15,19,11
+12,8,20
+10,9,3
+6,12,17
+1,14,9
+8,7,17
+13,5,4
+13,14,1
+9,13,4
+7,16,10
+9,17,18
+15,16,4
+5,8,15
+3,6,13
+7,11,3
+19,11,12
+10,11,3
+4,9,3
+12,7,4
+10,19,11
+17,8,3
+10,17,3
+6,12,2
+9,17,9
+6,7,15
+8,14,7
+15,10,18
+4,8,14
+19,14,7
+13,1,8
+18,14,12
+14,14,18
+13,15,15
+6,5,14
+10,15,18
+14,2,9
+12,13,3
+7,15,7
+14,4,5
+11,1,8
+16,14,15
+18,10,13
+4,16,12
+5,5,13
+4,15,5
+17,9,7
+14,5,17
+6,10,14
+11,17,5
+20,8,10
+14,17,7
+11,13,4
+9,3,8
+9,16,18
+2,7,14
+5,3,9
+6,11,18
+14,5,11
+8,2,7
+7,14,5
+7,3,6
+6,2,13
+9,18,9
+1,11,15
+3,7,4
+4,12,18
+16,9,18
+9,18,14
+3,7,14
+7,18,11
+19,7,8
+5,11,3
+6,12,4
+17,12,7
+13,5,7
+16,18,10
+7,18,12
+5,8,7
+9,2,5
+9,2,11
+10,2,7
+13,19,8
+12,19,16
+3,6,14
+16,7,14
+16,15,16
+18,8,9
+5,13,14
+5,7,17
+3,10,13
+6,2,11
+3,9,5
+6,13,19
+16,16,5
+9,9,19
+10,16,17
+15,17,15
+11,2,5
+11,19,9
+8,5,18
+5,16,15
+15,8,5
+19,11,13
+20,12,10
+9,13,20
+14,18,16
+12,17,12
+13,15,14
+6,6,4
+14,8,6
+18,12,8
+6,6,6
+16,4,9
+11,20,11
+9,3,10
+5,9,17
+18,11,9
+4,10,5
+4,13,9
+17,8,16
+9,17,17
+7,13,19
+19,13,11
+14,8,5
+7,18,6
+9,12,18
+4,16,7
+2,10,12
+17,9,15
+12,12,20
+17,12,14
+2,13,7
+5,15,5
+5,15,17
+11,3,10
+16,3,6
+12,16,17
+4,7,10
+11,2,12
+16,4,10
+17,6,11
+9,4,17
+8,4,15
+15,10,19
+15,17,12
+9,3,7
+15,15,3
+9,16,16
+11,11,18
+16,5,4
+14,16,15
+2,15,7
+9,7,19
+2,9,12
+14,11,4
+16,13,15
+10,6,4
+20,13,9
+5,2,10
+19,9,7
+3,8,16
+2,13,11
+7,18,8
+16,18,14
+12,3,17
+5,7,11
+10,19,6
+7,6,18
+4,5,6
+19,8,8
+5,6,4
+7,18,5
+19,17,10
+4,5,14
+17,10,3
+16,13,14
+13,9,3
+10,6,2
+11,19,6
+9,6,19
+7,19,9
+18,9,4
+14,7,6
+8,18,10
+15,6,12
+11,18,6
+11,17,18
+18,9,14
+19,15,10
+14,5,5
+7,19,11
+3,7,11
+9,16,14
+4,5,7
+4,18,13
+17,7,12
+15,8,6
+17,17,11
+3,8,5
+11,5,17
+8,10,18
+10,8,2
+16,2,12
+5,10,16
+17,8,12
+16,11,5
+4,12,7
+15,10,3
+8,4,4
+14,1,12
+8,3,8
+10,7,19
+16,7,5
+4,13,13
+8,4,16
+6,13,17
+18,9,7
+15,7,4
+8,14,18
+9,7,14
+16,12,17
+1,8,11
+1,14,12
+14,5,8
+16,15,13
+18,6,11
+3,13,9
+10,4,15
+19,6,13
+6,6,8
+15,16,5
+9,15,18
+7,4,6
+8,5,10
+8,2,13
+5,11,5
+6,13,15
+13,3,12
+17,9,10
+6,5,11
+11,18,5
+6,6,16
+14,5,18
+17,10,17
+11,12,3
+11,4,4
+11,18,10
+16,16,13
+11,17,7
+10,19,10
+2,10,15
+7,4,17
+8,10,19
+11,17,9
+15,18,6
+2,15,8
+18,13,4
+3,7,7
+2,12,15
+6,6,9
+7,16,16
+5,5,4
+15,14,18
+8,20,13
+7,11,4
+18,10,17
+17,9,9
+14,3,15
+5,14,3
+14,3,7
+6,8,17
+4,15,12
+17,15,11
+13,11,17
+4,9,15
+15,4,5
+8,17,10
+18,14,11
+7,18,13
+15,12,4
+14,4,11
+16,5,12
+2,10,7
+15,9,5
+2,14,16
+16,15,9
+8,4,5
+19,12,10
+8,6,7
+7,1,9
+10,12,2
+17,9,3
+5,3,14
+6,11,16
+7,4,13
+14,15,5
+11,7,2
+12,4,5
+5,13,5
+4,10,9
+16,7,13
+4,10,8
+7,8,3
+4,10,14
+8,3,18
+3,14,13
+6,17,5
+3,8,7
+16,7,16
+4,6,15
+15,17,13
+6,4,4
+12,3,6
+8,4,17
+6,3,10
+15,8,17
+19,10,9
+7,4,8
+19,15,11
+18,4,9
+10,3,15
+13,19,14
+4,15,9
+9,19,11
+9,2,8
+17,6,8
+18,9,6
+17,8,6
+4,13,8
+16,17,10
+9,2,7
+7,10,16
+18,12,6
+9,8,18
+7,17,13
+14,5,9
+10,19,14
+17,12,16
+8,17,8
+16,15,8
+11,16,5
+8,18,12
+10,13,1
+15,18,7
+15,13,4
+8,3,14
+17,15,15
+5,17,9
+18,9,15
+4,3,11
+8,17,6
+5,3,10
+18,8,12
+18,8,16
+17,7,9
+4,4,14
+9,12,19
+13,5,14
+5,18,12
+8,2,10
+12,3,11
+11,12,4
+11,8,17
+13,14,4
+10,18,12
+17,13,10
+17,15,16
+2,7,8
+12,6,16
+5,7,14
+7,16,15
+13,13,4
+13,5,17
+13,17,9
+17,13,13
+10,3,18
+13,18,15
+8,19,14
+9,3,12
+4,12,4
+17,10,15
+11,7,17
+7,17,7
+17,10,14
+13,6,6
+2,9,7
+13,7,4
+7,7,14
+4,12,14
+8,14,16
+13,14,3
+17,16,16
+5,16,12
+18,16,13
+13,13,18
+4,16,8
+9,10,1
+5,3,11
+12,18,12
+3,12,15
+14,10,18
+4,5,13
+6,5,16
+7,16,14
+17,16,6
+11,18,11
+16,6,12
+14,6,16
+8,4,7
+5,12,8
+15,19,14
+15,15,17
+13,16,7
+15,14,6
+5,14,7
+8,15,2
+13,8,2
+15,2,10
+18,10,6
+5,15,3
+9,4,15
+12,11,4
+9,17,4
+20,10,15
+11,2,7
+20,8,13
+9,17,5
+9,5,17
+11,18,7
+11,1,10
+10,14,17
+17,3,7
+9,1,8
+14,5,13
+13,9,1
+10,20,7
+17,13,6
+13,2,9
+10,19,8
+12,17,11
+12,13,4
+4,15,15
+10,13,16
+13,11,18
+15,5,13
+5,10,5
+11,15,6
+5,18,11
+14,7,4
+5,17,11
+7,7,20
+6,16,14
+7,8,17
+12,3,5
+13,19,6
+3,13,7
+9,10,16
+12,16,3
+12,9,1
+6,15,14
+12,3,12
+15,3,13
+7,15,16
+4,11,17
+2,7,9
+8,19,5
+2,12,8
+16,11,2
+14,3,11
+4,14,9
+15,15,16
+4,16,15
+9,5,5
+3,13,5
+10,6,5
+15,10,14
+16,4,16
+18,12,7
+8,18,13
+7,19,13
+14,19,9
+10,14,2
+13,16,3
+12,4,17
+12,17,15
+19,11,5
+8,6,5
+10,10,3
+11,20,10
+17,7,14
+13,17,16
+13,20,10
+8,18,5
+7,5,3
+2,14,10
+3,8,9
+14,6,18
+6,10,2
+14,16,8
+9,20,14
+18,5,11
+9,4,14
+5,17,12
+7,18,15
+7,5,13
+17,7,13
+9,5,4
+18,13,16
+7,18,9
+7,15,6
+3,10,6
+12,17,4
+12,12,19
+13,17,8
+12,3,3
+5,15,13
+4,10,6
+16,3,9
+6,16,4
+7,19,14
+3,11,13
+10,10,18
+4,5,8
+11,15,4
+14,12,19
+17,16,9
+9,11,17
+18,11,16
+10,16,19
+10,1,13
+13,8,1
+19,12,7
+5,14,16
+10,14,5
+7,2,8
+15,15,10
+12,8,2
+7,15,17
+8,12,17
+2,16,8
+10,16,6
+7,6,7
+5,17,5
+7,8,16
+11,17,6
+5,6,14
+4,4,9
+11,20,9
+2,13,13
+18,3,10
+11,5,15
+18,7,12
+12,12,2
+4,16,11
+19,12,9
+14,18,13
+19,12,14
+8,20,8
+9,3,16
+8,19,8
+11,13,18
+15,16,3
+13,12,3
+2,6,10
+8,18,6
+15,4,6
+5,14,17
+6,14,17
+2,14,12
+11,6,19
+20,8,12
+1,9,14
+18,10,4
+13,6,15
+7,14,2
+3,15,8
+13,7,2
+4,13,6
+10,17,8
+5,5,11
+10,0,10
+10,9,19
+18,13,6
+13,7,15
+13,7,17
+7,15,3
+7,16,6
+14,15,7
+9,10,2
+10,10,17
+3,8,17
+15,13,2
+9,18,17
+9,13,1
+12,3,15
+12,6,18
+17,12,11
+7,3,10
+4,4,10
+16,14,18
+15,16,17
+10,18,9
+17,7,17
+1,8,12
+7,6,16
+13,1,11
+15,16,15
+17,13,7
+10,17,15
+19,9,16
+2,14,14
+14,16,16
+6,15,5
+3,4,9
+12,16,20
+3,12,16
+1,9,12
+11,16,17
+19,5,12
+14,17,14
+13,6,5
+8,4,12
+5,7,5
+12,7,3
+16,12,18
+6,19,11
+11,19,8
+8,17,17
+15,2,13
+15,16,8
+19,11,9
+13,9,17
+5,13,16
+4,10,4
+4,4,13
+4,6,5
+15,9,16
+14,14,19
+19,9,5
+4,7,5
+13,19,15
+12,12,1
+12,1,13
+9,12,20
+9,11,19
+11,13,3
+13,17,10
+6,19,12
+16,6,13
+2,13,6
+18,5,13
+20,9,9
+3,6,9
+9,20,12
+5,6,12
+15,16,11
+19,10,6
+10,13,3
+16,12,15
+18,11,17
+1,12,11
+6,18,9
+5,12,14
+5,14,18
+6,7,18
+9,6,4
+12,1,11
+11,3,12
+13,4,4
+13,7,3
+18,9,16
+3,17,13
+18,13,11
+14,6,3
+16,15,15
+12,14,16
+11,1,14
+9,12,2
+1,11,12
+4,7,8
+10,18,6
+11,3,8
+8,17,5
+9,9,20
+11,7,4
+2,15,10
+11,4,14
+7,16,9
+3,4,7
+4,18,9
+13,10,17
+17,5,12
+12,8,18
+13,9,19
+14,6,7
+12,13,20
+6,12,19
+13,8,20
+17,11,17
+8,13,20
+16,17,7
+14,17,6
+16,16,8
+15,4,12
+4,11,16
+11,12,18
+15,19,7
+16,5,11
+2,7,13
+15,7,17
+13,19,11
+18,10,10
+15,9,3
+7,7,4
+11,18,14
+5,12,13
+11,13,16
+12,10,1
+5,12,2
+2,10,14
+19,8,10
+6,9,17
+15,3,15
+10,15,3
+3,5,14
+2,11,7
+12,4,10
+13,10,18
+10,12,19
+8,9,20
+6,12,18
+14,12,18
+18,15,6
+13,20,14
+7,16,18
+13,4,10
+16,11,10
+8,2,8
+4,12,17
+5,7,12
+11,14,17
+7,8,20
+18,6,6
+16,8,17
+4,12,8
+11,1,11
+15,12,16
+14,4,17
+11,6,17
+9,3,11
+19,9,6
+13,18,12
+12,3,4
+14,4,6
+16,17,8
+4,13,15
+3,8,8
+1,12,8
+16,4,7
+12,6,19
+13,6,18
+12,8,1
+3,4,8
+4,5,10
+12,18,7
+14,18,10
+18,4,12
+15,7,15
+16,7,11
+17,15,5
+16,14,14
+17,13,14
+11,11,1
+5,11,18
+16,11,3
+20,10,6
+15,10,16
+17,13,11
+6,19,7
+9,8,3
+4,13,7
+14,11,17
+10,1,8
+15,18,14
+3,5,7
+14,7,16
+3,15,7
+7,8,2
+13,14,5
+2,14,8
+15,5,7
+3,12,14
+14,13,5
+10,8,3
+8,15,4
+12,7,19
+4,14,10
+2,12,10
+13,11,4
+18,12,17
+14,15,17
+17,6,12
+14,19,7
+6,9,2
+17,11,8
+15,3,9
+13,13,19
+9,9,2
+18,5,14
+18,10,15
+18,9,10
+17,14,5
+4,9,14
+5,7,16
+4,6,14
+14,2,12
+7,4,11
+6,17,7
+14,9,17
+14,15,8
+16,9,7
+10,6,19
+19,13,7
+4,10,15
+4,15,4
+7,17,4
+3,10,5
+4,17,11
+6,17,15
+7,14,18
+3,9,12
+10,18,5
+9,15,19
+10,16,2
+14,4,12
+16,9,17
+15,4,16
+19,16,12
+17,8,17
+5,6,11
+14,18,7
+1,10,11
+12,14,4
+17,8,10
+5,10,18
+7,4,10
+8,13,4
+17,12,12
+6,11,19
+18,12,9
+3,12,11
+3,7,12
+16,13,12
+16,11,18
+5,4,13
+13,1,13
+6,14,20
+18,15,8
+17,9,11
+16,8,3
+5,4,8
+5,13,8
+20,10,7
+11,13,1
+4,11,7
+14,15,18
+12,20,14
+12,7,5
+6,6,15
+11,1,7
+5,8,3
+13,4,17
+14,8,2
+11,3,15
+8,15,15
+4,9,6
+16,9,15
+15,19,12
+6,2,9
+12,18,10
+5,18,7
+8,1,8
+14,3,5
+8,5,2
+18,13,13
+10,17,6
+10,6,3
+14,6,2
+6,7,17
+12,19,15
+10,18,10
+13,18,13
+9,10,18
+16,14,7
+3,9,17
+20,11,8
+19,6,9
+9,6,14
+7,13,17
+11,0,11
+9,18,8
+15,11,16
+18,7,9
+11,15,19
+16,17,16
+18,8,8
+18,13,14
+11,18,15
+5,8,12
+5,19,11
+8,7,19
+6,16,10
+6,15,15
+4,15,8
+14,17,4
+3,13,16
+12,10,4
+19,7,14
+2,14,7
+14,18,12
+21,10,10
+20,10,10
+8,18,4
+10,16,14
+5,15,10
+10,20,10
+16,4,6
+17,15,4
+7,2,15
+7,17,9
+4,13,14
+12,6,3
+8,9,18
+4,5,9
+13,17,7
+18,14,5
+8,13,19
+19,9,15
+2,8,15
+17,10,4
+12,16,6
+19,8,13
+8,18,16
+10,19,15
+6,12,5
+5,4,6
+7,14,17
+4,8,17
+20,13,10
+11,18,4
+11,8,1
+7,19,6
+12,7,8
+10,8,20
+17,11,4
+9,20,7
+4,14,11
+11,7,19
+12,4,15
+19,14,12
+13,19,10
+11,14,2
+2,9,6
+18,8,10
+9,17,11
+16,14,3
+7,11,17
+13,16,10
+13,18,8
+6,15,3
+12,20,10
+15,14,16
+13,11,2
+8,16,5
+8,13,18
+17,15,13
+3,11,12
+17,7,6
+6,12,16
+3,3,12
+16,3,15
+3,9,15
+6,18,11
+9,3,9
+4,7,11
+14,12,17
+7,15,4
+14,10,17
+5,19,12
+6,6,3
+7,7,18
+10,16,18
+13,17,11
+12,8,17
+9,19,6
+15,17,17
+13,11,3
+5,12,15
+2,14,13
+9,18,4
+3,8,12
+17,14,14
+2,8,7
+19,10,8
+6,5,9
+12,17,18
+18,12,10
+8,4,8
+17,11,10
+3,12,10
+7,9,16
+13,3,9
+5,8,18
+3,11,9
+7,17,10
+11,15,16
+2,10,10
+16,9,3
+9,14,19
+2,11,15
+14,15,3
+11,14,5
+5,10,14
+18,15,12
+8,3,4
+9,19,7
+8,20,12
+10,5,18
+5,12,16
+9,11,4
+20,10,8
+5,15,11
+19,6,10
+18,6,14
+11,20,8
+15,8,13
+8,5,4
+5,18,8
+19,8,6
+15,12,17
+14,8,19
+14,8,20
+10,14,19
+13,15,18
+9,16,19
+17,6,17
+11,18,16
+12,11,1
+19,12,15
+4,14,13
+17,18,11
+3,4,10
+11,5,19
+13,2,15
+8,8,17
+4,12,3
+16,8,5
+3,7,5
+16,12,5
+5,15,14
+4,12,9
+18,13,7
+10,6,6
+10,14,18
+5,8,6
+1,11,13
+8,7,16
+2,16,11
+10,3,9
+8,3,9
+18,16,6
+16,6,15
+15,5,8
+12,5,6
+9,16,8
+7,17,17
+2,12,12
+9,6,2
+10,5,3
+10,14,20
+17,18,10
+13,6,2
+9,17,6
+6,15,8
+16,9,6
+3,6,8
+17,12,18
+3,10,16
+10,17,14
+7,6,11
+15,9,18
+10,16,13
+13,1,12
+15,15,19
+17,16,13
+13,17,4
+14,17,12
+7,7,5
+20,10,9
+10,13,18
+10,19,5
+3,15,15
+10,6,16
+14,1,7
+7,7,19
+19,15,12
+13,1,7
+1,12,14
+3,7,6
+6,13,16
+2,9,16
+3,14,6
+13,13,2
+11,17,17
+5,16,16
+13,15,5
+5,7,15
+2,10,6
+11,15,17
+3,16,14
+18,13,10
+17,10,6
+13,20,9
+13,3,5
+4,3,10
+10,4,18
+1,10,14
+12,13,18
+7,14,14
+18,8,7
+8,5,3
+11,17,16
+15,7,2
+4,5,16
+3,12,5
+11,19,16
+14,4,8
+5,3,12
+18,14,9
+16,13,13
+15,13,5
+12,11,18
+14,4,13
+8,10,1
+2,8,6
+16,7,18
+3,5,11
+18,13,17
+14,15,6
+8,11,4
+3,9,9
+15,8,15
+16,6,8
+13,14,2
+15,7,14
+17,9,6
+18,13,5
+15,18,8
+11,6,20
+15,11,2
+18,16,7
+8,20,9
+2,11,8
+14,11,6
+9,17,13
+17,16,5
+12,3,9
+7,10,5
+13,3,11
+1,8,10
+17,9,18
+4,17,15
+2,9,14
+9,8,17
+11,9,20
+4,15,6
+16,11,15
+17,13,9
+12,4,13
+18,12,12
+9,14,2
+8,11,16
+9,7,4
+5,3,7
+10,18,4
+5,15,4
+6,14,18
+17,7,4
+8,18,11
+14,18,6
+16,15,10
+18,17,12
+4,14,8
+12,15,3
+6,3,12
+10,11,4
+9,5,7
+5,5,17
+5,2,11
+15,5,14
+10,4,13
+10,5,14
+6,5,17
+5,16,13
+13,9,18
+14,5,14
+17,15,8
+1,13,10
+12,6,15
+1,12,12
+14,17,10
+10,4,17
+6,18,6
+12,19,6
+14,2,13
+19,15,9
+15,7,3
+17,17,15
+14,9,5
+14,14,2
\ No newline at end of file
diff --git a/inputs/18a.txt b/inputs/18a.txt
new file mode 100644
index 0000000..4b33e3b
--- /dev/null
+++ b/inputs/18a.txt
@@ -0,0 +1,2 @@
+1,1,1
+2,1,1
\ No newline at end of file
diff --git a/inputs/18b.txt b/inputs/18b.txt
new file mode 100644
index 0000000..b2206d1
--- /dev/null
+++ b/inputs/18b.txt
@@ -0,0 +1,13 @@
+2,2,2
+1,2,2
+3,2,2
+2,1,2
+2,3,2
+2,2,1
+2,2,3
+2,2,4
+2,2,6
+1,2,5
+3,2,5
+2,1,5
+2,3,5
\ No newline at end of file
diff --git a/src/18.cs b/src/18.cs
new file mode 100644
index 0000000..84813c9
--- /dev/null
+++ b/src/18.cs
@@ -0,0 +1,57 @@
+using aoc2022.Util;
+
+namespace aoc2022;
+
+internal class Day18 : Day
+{
+ private readonly List cubes = new();
+ internal override void Parse()
+ {
+ cubes.AddRange(Parsing.ReadAllLines("18").Select(ivec3.Parse));
+ }
+
+ internal override string Part1()
+ {
+ var totalSides = 6 * cubes.Count;
+ var coveredSides = cubes.Sum(c => cubes.Count(c2 => c != c2 && c.IsTouching(c2)));
+
+ return $"Exposed faces: <+white>{totalSides - coveredSides}";
+ }
+
+ internal override string Part2()
+ {
+ var set = new HashSet(cubes);
+ var minv = cubes.Min(c => c.MinElement) - 1;
+ var maxv = cubes.Max(c => c.MaxElement) + 1;
+ var min = new ivec3(minv, minv, minv);
+ var max = new ivec3(maxv, maxv, maxv);
+
+ HashSet visited = new();
+ Queue q = new();
+ var total = 0;
+ q.Enqueue(min);
+ visited.Add(min);
+ while (q.Count > 0)
+ {
+ var v = q.Dequeue();
+ foreach (var neighbor in v.GetNeighbors(min, max))
+ {
+ if (visited.Contains(neighbor))
+ {
+ continue;
+ }
+
+ if (set.Contains(neighbor))
+ {
+ total++;
+ continue;
+ }
+
+ visited.Add(neighbor);
+ q.Enqueue(neighbor);
+ }
+ }
+
+ return $"Exterior exposed faces: <+white>{total}";
+ }
+}
diff --git a/src/Util/Vec3.cs b/src/Util/Vec3.cs
new file mode 100644
index 0000000..7e1eabc
--- /dev/null
+++ b/src/Util/Vec3.cs
@@ -0,0 +1,173 @@
+namespace aoc2022.Util;
+
+public struct ivec3 : IEquatable, IComparable, IComparable
+{
+ public long x = 0;
+ public long y = 0;
+ public long z = 0;
+
+ public static readonly ivec3 ZERO = new ivec3(0, 0, 0);
+ public static readonly ivec3 ONE = new ivec3(1, 1, 1);
+
+ public static readonly ivec3 LEFT = new ivec3(-1, 0, 0);
+ public static readonly ivec3 RIGHT = new ivec3(1, 0, 0);
+ public static readonly ivec3 UP = new ivec3(0, -1, 0);
+ public static readonly ivec3 DOWN = new ivec3(0, 1, 0);
+ public static readonly ivec3 FORWARD = new ivec3(0, 0, 1);
+ public static readonly ivec3 BACKWARD = new ivec3(0, 0, -1);
+ public static readonly ivec3[] DIRECTIONS = {LEFT, RIGHT, UP, DOWN, FORWARD, BACKWARD};
+
+ public ivec3(long xv, long yv, long zv)
+ {
+ x = xv;
+ y = yv;
+ z = zv;
+ }
+
+ public bool IsZero() => x == 0 && y == 0 && z == 0;
+ public long Sum => x + y + z;
+ public long Product => x * y * z;
+ public long MaxElement => System.Math.Max(x, System.Math.Max(y, z));
+ public long MinElement => System.Math.Min(x, System.Math.Min(y, z));
+
+ public ivec3 GetRotatedLeft() => new ivec3(y, -x, z);
+ public void RotateLeft() => this = GetRotatedLeft();
+
+ public ivec3 GetRotatedRight() => new ivec3(-y, x, z);
+ public void RotateRight() => this = GetRotatedRight();
+
+ public long Dot(ivec3 v) => (x * v.x) + (y * v.y) + (z * v.z);
+ public long LengthSquared => (x * x) + (y * y) + (z * z);
+ public float Length => MathF.Sqrt(LengthSquared);
+
+ public long ManhattanDistance => Abs(this).Sum;
+ public long ManhattanDistanceTo(ivec3 other) => System.Math.Abs(x - other.x) + System.Math.Abs(y - other.y) + System.Math.Abs(z - other.z);
+
+ public bool IsTouching(ivec3 other) => ManhattanDistanceTo(other) == 1;
+
+ public IEnumerable GetNeighbors(ivec3? min = null, ivec3? max = null)
+ {
+ foreach (var d in DIRECTIONS)
+ {
+ var n = this + d;
+ if ((min == null || n >= min) && (max == null || n <= max))
+ {
+ yield return n;
+ }
+ }
+ }
+
+ public ivec3 GetBestDirectionTo(ivec3 p)
+ {
+ ivec3 diff = p - this;
+ if (diff.IsZero())
+ {
+ return ZERO;
+ }
+
+ ivec3 dir = diff / Abs(diff).MaxElement;
+ return Sign(dir);
+ }
+
+ // get a point in the 8 cells around me closest to p
+ public ivec3 GetNearestNeighbor(ivec3 p)
+ {
+ ivec3 dir = GetBestDirectionTo(p);
+ return this + dir;
+ }
+
+ public long this[long i] => (i == 0) ? x : (i == 1) ? y : z;
+
+ public static ivec3 operator +(ivec3 v) => v;
+ public static ivec3 operator -(ivec3 v) => new ivec3(-v.x, -v.y, -v.z);
+ public static ivec3 operator +(ivec3 a, ivec3 b) => new ivec3(a.x + b.x, a.y + b.y, a.z + b.z);
+ public static ivec3 operator -(ivec3 a, ivec3 b) => new ivec3(a.x - b.x, a.y - b.y, a.z - b.z);
+ public static ivec3 operator *(ivec3 a, ivec3 b) => new ivec3(a.x * b.x, a.y * b.y, a.z * b.z);
+ public static ivec3 operator *(long a, ivec3 v) => new ivec3(a * v.x, a * v.y, a * v.z);
+ public static ivec3 operator *(ivec3 v, long a) => new ivec3(a * v.x, a * v.y, a * v.z);
+ public static ivec3 operator /(ivec3 v, long a) => new ivec3(v.x / a, v.y / a, v.z / a);
+ public static bool operator ==(ivec3 a, ivec3 b) => (a.x == b.x) && (a.y == b.y) && (a.z == b.z);
+ public static bool operator !=(ivec3 a, ivec3 b) => (a.x != b.x) || (a.y != b.y) || (a.z != b.z);
+ public static bool operator <(ivec3 a, ivec3 b) => (a.x < b.x) && (a.y < b.y) && (a.z < b.z);
+ public static bool operator <=(ivec3 a, ivec3 b) => (a.x <= b.x) && (a.y <= b.y) && (a.z <= b.z);
+ public static bool operator >(ivec3 a, ivec3 b) => (a.x > b.x) && (a.y > b.y) && (a.z > b.z);
+ public static bool operator >=(ivec3 a, ivec3 b) => (a.x >= b.x) && (a.y >= b.y) && (a.z >= b.z);
+
+ public bool Equals(ivec3 other)
+ {
+ return x == other.x && y == other.y && z == other.z;
+ }
+
+ public override bool Equals(object? obj)
+ {
+ return obj is ivec3 other && Equals(other);
+ }
+
+ public int CompareTo(ivec3 other)
+ {
+ if (this < other)
+ {
+ return -1;
+ }
+
+ if (this > other)
+ {
+ return 1;
+ }
+
+ return 0;
+ }
+
+ public int CompareTo(object? obj)
+ {
+ if (ReferenceEquals(null, obj)) return 1;
+ return obj is ivec3 other ? CompareTo(other) : throw new ArgumentException($"Object must be of type {nameof(ivec3)}");
+ }
+
+ public static ivec3 Sign(ivec3 v) => new ivec3(System.Math.Sign(v.x), System.Math.Sign(v.y), System.Math.Sign(v.z));
+ public static ivec3 Min(ivec3 a, ivec3 b) => new ivec3(System.Math.Min(a.x, b.x), System.Math.Min(a.y, b.y), System.Math.Min(a.z, b.z));
+ public static ivec3 Max(ivec3 a, ivec3 b) => new ivec3(System.Math.Max(a.x, b.x), System.Math.Max(a.y, b.y), System.Math.Max(a.z, b.z));
+
+ public static ivec3 Clamp(ivec3 v, ivec3 lh, ivec3 rh) => Min(rh, Max(lh, v));
+
+ public static ivec3 Abs(ivec3 v) => new ivec3(System.Math.Abs(v.x), System.Math.Abs(v.y), System.Math.Abs(v.z));
+
+ public static ivec3 Mod(ivec3 val, long den)
+ {
+ long x = val.x % den;
+ long y = val.y % den;
+ long z = val.z % den;
+
+ if (x < 0)
+ {
+ x += den;
+ }
+
+ if (y < 0)
+ {
+ y += den;
+ }
+
+ if (z < 0)
+ {
+ z += den;
+ }
+
+ return new ivec3(x, y, z);
+ }
+
+ public static long Dot(ivec3 a, ivec3 b) => (a.x * b.x) + (a.y * b.y) + (a.z * b.z);
+
+ public static ivec3 Parse(string s)
+ {
+ string[] parts = s.Split(',', 3);
+ long x = long.Parse(parts[0]);
+ long y = long.Parse(parts[1]);
+ long z = long.Parse(parts[2]);
+ return new ivec3(x, y, z);
+ }
+
+ public override int GetHashCode() => HashCode.Combine(x, y, z);
+
+ public override string ToString() => $"{x},{y},{z}";
+}