aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-12-03 19:35:10 +0100
committerMinteck <contact@minteck.org>2022-12-03 19:35:10 +0100
commit6a4c207dfa4041e164bb1012c6561f75f11b9653 (patch)
treebe8d1542b3283cb7e370ffa54de0913b28d59942
parentb2d3425705eb6dcc2523497ec23961e4c305be0d (diff)
downloadaoc2022-6a4c207dfa4041e164bb1012c6561f75f11b9653.tar.gz
aoc2022-6a4c207dfa4041e164bb1012c6561f75f11b9653.tar.bz2
aoc2022-6a4c207dfa4041e164bb1012c6561f75f11b9653.zip
Day 3
-rw-r--r--02/.idea/workspace.xml16
-rw-r--r--03/.gitkeep0
-rw-r--r--03/.idea/.gitignore8
-rw-r--r--03/.idea/03.iml12
-rw-r--r--03/.idea/discord.xml7
-rw-r--r--03/.idea/jsLibraryMappings.xml6
-rw-r--r--03/.idea/modules.xml8
-rw-r--r--03/.idea/vcs.xml6
-rw-r--r--03/README.md44
-rw-r--r--03/index.js155
-rw-r--r--03/input-cloudburst.txt300
-rw-r--r--03/input-raindrops.txt300
12 files changed, 848 insertions, 14 deletions
diff --git a/02/.idea/workspace.xml b/02/.idea/workspace.xml
index bfa1301..18f742f 100644
--- a/02/.idea/workspace.xml
+++ b/02/.idea/workspace.xml
@@ -1,19 +1,7 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ChangeListManager">
- <list default="true" id="8d88c33e-b4f0-40cd-a1dd-b98263e170c7" name="Changes" comment="">
- <change afterPath="$PROJECT_DIR$/.idea/.gitignore" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/.idea/02.iml" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/.idea/kotlinc.xml" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/.idea/libraries/KotlinJavaRuntime.xml" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/.idea/misc.xml" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/.idea/modules.xml" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/.idea/vcs.xml" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/README.md" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/input-cloudburst.txt" afterDir="false" />
- <change afterPath="$PROJECT_DIR$/input-raindrops.txt" afterDir="false" />
- <change beforePath="$PROJECT_DIR$/.gitkeep" beforeDir="false" />
- </list>
+ <list default="true" id="8d88c33e-b4f0-40cd-a1dd-b98263e170c7" name="Changes" comment="" />
<list id="86b02e76-2acb-4fba-bd2e-38176a8fec1c" name="Changes by cloudburst" comment="" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
@@ -72,7 +60,7 @@
<updated>1670000570349</updated>
<workItem from="1670000571433" duration="12000" />
<workItem from="1670000585429" duration="79000" />
- <workItem from="1670000676493" duration="2541000" />
+ <workItem from="1670000676493" duration="2832000" />
</task>
<servers />
</component>
diff --git a/03/.gitkeep b/03/.gitkeep
deleted file mode 100644
index e69de29..0000000
--- a/03/.gitkeep
+++ /dev/null
diff --git a/03/.idea/.gitignore b/03/.idea/.gitignore
new file mode 100644
index 0000000..13566b8
--- /dev/null
+++ b/03/.idea/.gitignore
@@ -0,0 +1,8 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Editor-based HTTP Client requests
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
diff --git a/03/.idea/03.iml b/03/.idea/03.iml
new file mode 100644
index 0000000..0c8867d
--- /dev/null
+++ b/03/.idea/03.iml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+ <component name="NewModuleRootManager">
+ <content url="file://$MODULE_DIR$">
+ <excludeFolder url="file://$MODULE_DIR$/temp" />
+ <excludeFolder url="file://$MODULE_DIR$/.tmp" />
+ <excludeFolder url="file://$MODULE_DIR$/tmp" />
+ </content>
+ <orderEntry type="inheritedJdk" />
+ <orderEntry type="sourceFolder" forTests="false" />
+ </component>
+</module> \ No newline at end of file
diff --git a/03/.idea/discord.xml b/03/.idea/discord.xml
new file mode 100644
index 0000000..30bab2a
--- /dev/null
+++ b/03/.idea/discord.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="DiscordProjectSettings">
+ <option name="show" value="ASK" />
+ <option name="description" value="" />
+ </component>
+</project> \ No newline at end of file
diff --git a/03/.idea/jsLibraryMappings.xml b/03/.idea/jsLibraryMappings.xml
new file mode 100644
index 0000000..d23208f
--- /dev/null
+++ b/03/.idea/jsLibraryMappings.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="JavaScriptLibraryMappings">
+ <includedPredefinedLibrary name="Node.js Core" />
+ </component>
+</project> \ No newline at end of file
diff --git a/03/.idea/modules.xml b/03/.idea/modules.xml
new file mode 100644
index 0000000..f0d13bc
--- /dev/null
+++ b/03/.idea/modules.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="ProjectModuleManager">
+ <modules>
+ <module fileurl="file://$PROJECT_DIR$/.idea/03.iml" filepath="$PROJECT_DIR$/.idea/03.iml" />
+ </modules>
+ </component>
+</project> \ No newline at end of file
diff --git a/03/.idea/vcs.xml b/03/.idea/vcs.xml
new file mode 100644
index 0000000..6c0b863
--- /dev/null
+++ b/03/.idea/vcs.xml
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+ <component name="VcsDirectoryMappings">
+ <mapping directory="$PROJECT_DIR$/.." vcs="Git" />
+ </component>
+</project> \ No newline at end of file
diff --git a/03/README.md b/03/README.md
new file mode 100644
index 0000000..8a29232
--- /dev/null
+++ b/03/README.md
@@ -0,0 +1,44 @@
+# [December 3nd](https://adventofcode.com/2022/day/3)
+
+> Language: JavaScript
+
+## Subject
+
+### First part
+One Elf has the important job of loading all of the rucksacks with supplies for the jungle journey. Unfortunately, that Elf didn't quite follow the packing instructions, and so a few items now need to be rearranged.
+
+Each rucksack has two large compartments. All items of a given type are meant to go into exactly one of the two compartments. The Elf that did the packing failed to follow this rule for exactly one item type per rucksack.
+
+The Elves have made a list of all of the items currently in each rucksack (your puzzle input), but they need your help finding the errors. Every item type is identified by a single lowercase or uppercase letter (that is, a and A refer to different types of items).
+
+The list of items for each rucksack is given as characters all on a single line. A given rucksack always has the same number of items in each of its two compartments, so the first half of the characters represent items in the first compartment, while the second half of the characters represent items in the second compartment.
+
+To help prioritize item rearrangement, every item type can be converted to a priority:
+
+- Lowercase item types a through z have priorities 1 through 26.
+- Uppercase item types A through Z have priorities 27 through 52.
+
+In the above example, the priority of the item type that appears in both compartments of each rucksack is 16 (p), 38 (L), 42 (P), 22 (v), 20 (t), and 19 (s); the sum of these is 157.
+
+Find the item type that appears in both compartments of each rucksack. What is the sum of the priorities of those item types?
+
+### Second part
+As you finish identifying the misplaced items, the Elves come to you with another issue.
+
+For safety, the Elves are divided into groups of three. Every Elf carries a badge that identifies their group. For efficiency, within each group of three Elves, the badge is the only item type carried by all three Elves. That is, if a group's badge is item type B, then all three Elves will have item type B somewhere in their rucksack, and at most two of the Elves will be carrying any other item type.
+
+The problem is that someone forgot to put this year's updated authenticity sticker on the badges. All of the badges need to be pulled out of the rucksacks so the new authenticity stickers can be attached.
+
+Additionally, nobody wrote down which item type corresponds to each group's badges. The only way to tell which item type is the right one is by finding the one item type that is common between all three Elves in each group.
+
+Priorities for these items must still be found to organize the sticker attachment efforts: here, they are 18 (r) for the first group and 52 (Z) for the second group. The sum of these is 70.
+
+Find the item type that corresponds to the badges of each three-Elf group. What is the sum of the priorities of those item types?
+
+## Answers
+* `input-cloudburst.txt`
+ * First part: `7701`
+ * Second part: `2644`
+* `input-raindrops.txt`
+ * First part: `7793`
+ * Second part: `2499` \ No newline at end of file
diff --git a/03/index.js b/03/index.js
new file mode 100644
index 0000000..bf24b5c
--- /dev/null
+++ b/03/index.js
@@ -0,0 +1,155 @@
+'use strict';
+const fs = require('node:fs');
+
+class Backpack extends String {
+ constructor(...args) {
+ super(...args);
+ }
+
+ chop() {
+ let halfLength = this.length / 2;
+
+ let firstHalf = this.substring(0, halfLength);
+ let secondHalf = this.substring(halfLength);
+
+ return [ new Compartment(firstHalf), new Compartment(secondHalf) ];
+ }
+}
+
+class CompartmentItem {
+ letter;
+ priority;
+
+ constructor(letter) {
+ this.letter = letter;
+
+ switch (letter) {
+ case "a": this.priority = 1; break;
+ case "b": this.priority = 2; break;
+ case "c": this.priority = 3; break;
+ case "d": this.priority = 4; break;
+ case "e": this.priority = 5; break;
+ case "f": this.priority = 6; break;
+ case "g": this.priority = 7; break;
+ case "h": this.priority = 8; break;
+ case "i": this.priority = 9; break;
+ case "j": this.priority = 10; break;
+ case "k": this.priority = 11; break;
+ case "l": this.priority = 12; break;
+ case "m": this.priority = 13; break;
+ case "n": this.priority = 14; break;
+ case "o": this.priority = 15; break;
+ case "p": this.priority = 16; break;
+ case "q": this.priority = 17; break;
+ case "r": this.priority = 18; break;
+ case "s": this.priority = 19; break;
+ case "t": this.priority = 20; break;
+ case "u": this.priority = 21; break;
+ case "v": this.priority = 22; break;
+ case "w": this.priority = 23; break;
+ case "x": this.priority = 24; break;
+ case "y": this.priority = 25; break;
+ case "z": this.priority = 26; break;
+
+ case "a".toUpperCase(): this.priority = 1 + 26; break;
+ case "b".toUpperCase(): this.priority = 2 + 26; break;
+ case "c".toUpperCase(): this.priority = 3 + 26; break;
+ case "d".toUpperCase(): this.priority = 4 + 26; break;
+ case "e".toUpperCase(): this.priority = 5 + 26; break;
+ case "f".toUpperCase(): this.priority = 6 + 26; break;
+ case "g".toUpperCase(): this.priority = 7 + 26; break;
+ case "h".toUpperCase(): this.priority = 8 + 26; break;
+ case "i".toUpperCase(): this.priority = 9 + 26; break;
+ case "j".toUpperCase(): this.priority = 10 + 26; break;
+ case "k".toUpperCase(): this.priority = 11 + 26; break;
+ case "l".toUpperCase(): this.priority = 12 + 26; break;
+ case "m".toUpperCase(): this.priority = 13 + 26; break;
+ case "n".toUpperCase(): this.priority = 14 + 26; break;
+ case "o".toUpperCase(): this.priority = 15 + 26; break;
+ case "p".toUpperCase(): this.priority = 16 + 26; break;
+ case "q".toUpperCase(): this.priority = 17 + 26; break;
+ case "r".toUpperCase(): this.priority = 18 + 26; break;
+ case "s".toUpperCase(): this.priority = 19 + 26; break;
+ case "t".toUpperCase(): this.priority = 20 + 26; break;
+ case "u".toUpperCase(): this.priority = 21 + 26; break;
+ case "v".toUpperCase(): this.priority = 22 + 26; break;
+ case "w".toUpperCase(): this.priority = 23 + 26; break;
+ case "x".toUpperCase(): this.priority = 24 + 26; break;
+ case "y".toUpperCase(): this.priority = 25 + 26; break;
+ case "z".toUpperCase(): this.priority = 26 + 26; break;
+ }
+ }
+
+ toString() {
+ return this.letter;
+ }
+}
+
+class Compartment extends Backpack {
+ constructor(...args) {
+ super(...args);
+ }
+
+ get items() {
+ return this.split("").map(i => new CompartmentItem(i));
+ }
+
+ findSharedItem(compartment) {
+ let itemsInOtherCompartment = compartment.items.map(i => i.letter);
+ let sharedItems = [];
+
+ for (let item of this.items.map(i => i.letter)) {
+ if (itemsInOtherCompartment.includes(item)) {
+ sharedItems.push(item);
+ }
+ }
+
+ return sharedItems;
+ }
+}
+
+for (let fileName of [ "input-cloudburst.txt", "input-raindrops.txt" ]) {
+ console.log(fileName);
+ let file = fs.readFileSync(fileName).toString().trim();
+
+ function firstPart() {
+ let backpacks = file.split("\n");
+ let sum = 0;
+
+ for (let _backpack of backpacks) {
+ let backpack = new Backpack(_backpack);
+ let compartments = backpack.chop();
+
+ let commons = [...new Set(compartments[0].findSharedItem(compartments[1]))];
+
+ for (let common of commons) {
+ sum += (new CompartmentItem(common)).priority;
+ }
+ }
+
+ return sum;
+ }
+
+ function secondPart() {
+ let sum = 0;
+
+ for (let i = 0; i < file.split("\n").length; i += 3) {
+ const group = file.split("\n").slice(i, i + 3).map(c => new Compartment(c));
+ let letters = [];
+
+ for (let item of group[0].items.map(i => i.letter)) {
+ if (group[1].items.map(i => i.letter).includes(item) && group[2].items.map(i => i.letter).includes(item)) {
+ if (!letters.includes(item)) {
+ sum += (new CompartmentItem(item)).priority;
+ letters.push(item);
+ }
+ }
+ }
+
+ }
+
+ return sum;
+ }
+
+ console.log(" Result: first part: " + firstPart() + "; second part: " + secondPart());
+} \ No newline at end of file
diff --git a/03/input-cloudburst.txt b/03/input-cloudburst.txt
new file mode 100644
index 0000000..1496b62
--- /dev/null
+++ b/03/input-cloudburst.txt
@@ -0,0 +1,300 @@
+MVWpzTTrTFNNLtssjV
+hRJncnJCnhPCnBSbCQRhhQRPFHmsbHLzbLNHsjNNFmGGGsGF
+lSBQJBBBBcnccnQvBnPQznfrgwlrTZfDwTfWqrrpgMpw
+sRPgrzSgrSbfTrgspBPsDWWTmdnvdZWZwTmwvdmd
+tVGpCGqCGjlHcNGVNHZDmnZMWdWMWCdZDvnZ
+HqpQptLlclLGtlpcjHNhQqfRhrSBrrbfbrSRrsPfBSgg
+JpjLbQbFPBjDBBJLWltglfBfhhlcctht
+vNFmsdFsnmzGtWvgzhzc
+rqwRCCqmCTqHCnqRNTNFsJVMQSjLRbbVVbjQVLbLSV
+mLNNCNDwBwDnmCwnJwLRvdlqZclRccsgvcZndc
+QWMtVWbpVlgHHcgMHs
+VsTVWhThsVQWzjtQPpVWjWbpwJNCJDCzSNNCCCSfmfBCSGLL
+NbSfHnwDvwwfHwwQsHbWPgrsZsZjRPLRgLWhWP
+lmMlTGFzVmzqjGLLZWWGhrCh
+qFclMprqmrvbcnwDQtNQ
+tWQZFvvtWQWbqQQggZZLvpLrpzDrmGDmmDHPzPzHrfnHTG
+NMlhlTMccTCVBlRNHzJnzDDmnJmnGGBf
+NMMSSSSSlNVMdjdNSNNhFwTbvbLqjbtLwWQwZqgg
+jPwcJwRmmhJpbhNJVgDbrHzzzQzzBQHg
+tdZqlCnnnlvZCqlnlCSqZdFCHGDBgzsDzssBtHGLQtrHsssL
+TZZFSdrdlZMFZRMwMPmNcwNmwm
+nsdhzmDBGQWQPvJPjbbW
+gCgBqCNpMHTwgwqMPRJJTtWjbFRJFJvP
+ZlCwBrwgmzhGzDrd
+sTBHfcnBTnqHRvqPgFFbLtrQTPLjjm
+GWzpwSJSpbwbNNGJPQrrtrrrrgzLtjzm
+NNSlCCdplWwplCwSndnssdZfqVbHvfqc
+rrfHgqnlllRrDgrCbQfszMPtmzPQzFsFMQ
+JJLGVGjcwVcPQNNNtRPmLM
+WThVJJWJBdGwBpBTqDrSRCCggShqbSCb
+TbCqzqzmbCffzDbHRddLbdRFRS
+ZmvZJPjPwwWNZJGtWSDRRDFWSLhhhMVVWL
+ZwplGwmptNjZnjvnGGPjJlZppTrTsCczfggBgfgfggCsBrqr
+gMBBbfBbBMfnMsvRvWJhDsQW
+ZZqHLzczjjsLzlpjqTprNJvhQpRvtRJJQrtQtJ
+llZlzZZzPZZqsTZscHczfnSwSPSwwgSBwwSnPwnf
+chMtcPPgQtthqgvczhMTcCSBLBlGpsFnBnnsGvLplSFG
+bhRmJWDRmHSmFGBnGBps
+jdDZWbrDdDbbdbDrRRWwRjZRVqztCzqtcThcTQtgqVMMVzjq
+flNmNHgcZwTzRLzMLRPlzz
+nntqBJtFbbCbBVCnBtFjJjhVhLzLvRLvgRRvPvpMpvpp
+CgJWjJQDjgBtnGNGfcssNfcwNW
+MrMpMrGBznjPMGCmCrrjdwndfJLQNfdLQNdNggdL
+sJVcZqvhZtVqhDFFsDJslcdwgwvwQwwQNbbTbwfLLTgL
+RDDRcsSsstJstVDDqctszzmRmGjpjBRHPmmGHGrj
+tdplZtlrBGwTlLQQ
+sfsPPvNhWLQBhGQG
+zPVfzVbbMcscvVfzzNgcJHnJZgtrrndJqjJqndrL
+nglLjRCCHLLCnNCLHQnFNQmmVMbVmwMwlMwMMMWwBTsT
+cqtfcqZpzhSvvBfWwbvrbT
+PPqpDSqcSJPdPhtPtqZcpPtGjFRFFFNLJFGRgjFbGRNbHn
+gjtRSLMqLdSgLMCltTSDQcQQqhDcfcfrWDhWrr
+GwFZCwNzFJsPmFFmZmPPNhvDDfDWWmpvQWWfVDQppW
+swNGZbPBGwnCgBBlBljl
+BsrDsnQGwFFQQtfNTBNSffBgBt
+VJlhWVLlRppLQZTCbtZTttgJ
+ppLqqRhQdRPhqPVhdPjhljqHFnGnzFrjFFDznHFHrmwwnH
+CJMmmJLmlshCCdmzjHjPWztgdnjttt
+GwZvGwrgTcFpzHWjnT
+GbqrvrRwbrbGbwwZBbgfhmJMmsDJhNRfLChhCh
+CfgfjCLCgfgFgBhBsccswQwtsQHvBBtc
+SbSMGbnmDMGJWmRmDmvzwtcscWtQzsrPsvHc
+DbJdNpJSnMSJmpSSNVqgqgTTFVQTFqdZLq
+MBMCmlllPSSlmmPPjCMpPgggJcnZgntJsDvHsDZt
+hrNzhrRNbrhbGRbfpVLRGNqqngvnttngJctgDZJGcZvHvZnc
+LTTzVqppSmwdTmQW
+mmlBQmLbsbmRnFnwlqqprF
+dZScZSZSdHcNMDcJwLqRfppzpzfTpHfF
+JLWJLJJJdMmGtgCWjQjt
+PPMzpVDblwGVMMzDLLjrcrjdzjdTzLjd
+RRcCJRcNQRBqtCFBRJJsZWBWrjLWLHZZWndBLWjh
+qQQtttNqsqqtJRgqQfcpcgDcbggplGbfMp
+QmmSTQPmLSmjpczMJtwPzg
+BHHHdwdvDpllvctjZv
+HdrDHNfrrBDGGBhBNfHNsLFqmbRQSwqmGTLnTbSF
+gcMmgRQPqqPPsgjFSvctCHvHllSSHcvd
+JTWfZwhTwzbWwTFTrZnTrDDlDSVtVHLVShtvSHvlHL
+bWbWBfzTfwrWJNbTrnzfTwJFpmMQgqsFRsQGqRMggPmPBG
+GqCWpGGLpmpWjbSDGjGGmwCzZlvMBTrCvsrlwwswCl
+FPFHFVdJgQHJZnslrgvsTrwMlNgw
+hQVchcdcZZpZqcDG
+JbBRgBsRffgPPFQttQvQQMvG
+dmNZgmZVtGTNtNGC
+ZqqndLZnccqRbsrgpggsBc
+DDvMVmTjwFWPBBTzBF
+cqnggcbNNCqbQQqbZbpfQpqgRWlFhLRBhRzRPLFJhlJBfPLh
+dpscpcncbbqcpMVSvSrPDMsrjr
+hGCGZmVRRcMVsGMtmZWssmFLzbFblnnzfmqbfnzNNb
+wjrSPBJdSjjDrggpSJpdrSnlFNlzLTnqNLqqpbqqfMln
+dMwPBHPPJHDdvrBBhshWCGcsQRcHRZGV
+vdHwhqdtLdVnHBZbFBFzbBPS
+TmNCLNDpWfCNmpCgTWNTDMMZlzSggBMzlZlMBlBbZZ
+NQfWcscDNQrhqvGLrdhVjh
+lZLqzzqvgrCRcQcCLD
+HSVVwNTJzwVNTDQrRrrdrBwdhd
+TpNTzsfSTVsSpHVppzFpgvvlqZWZPMvMjPPGGsgP
+BCMLshLdLDDCgwFRwHHqqRqRWd
+QnSqQlGSfpQzTQJNTPNwNPFRFcccHc
+mfJJmztnQpGpvnSzGrsqgrhrBBhqjBrthL
+BSlmzmlvdNnlQlQQJnJHRVFVFVVqMtqRMfSfCw
+WBPsDPBBjfssFHMRRq
+DLWpGhbPjbhZrhZDnBQgdNZmQNgmvdzg
+WWvgBFgHWChBzgBFbjbtPtnPrsHlsRMrwRrMRR
+SGfNpfdGfVpVSGGppSDdwRwclMlfPMwccsntPqPw
+TVdpQDSpQZJpVpDQQFBbthvmWzmgvhbjzJ
+VVCCbzqdbzhFHvbdhZFPmhCPSNRNGSrPJfTNRSGJfGwPST
+LngtBnlcnDvLcTTRfTTwRtGNTG
+DpnBjMpLlLDQWDgvpLvbqzmbjzVjVHqbFFqbFq
+SbzMbNQQSDdmvqqzdSlWFpwZnvpFWWllpFww
+CjLPTPjjLCPtBCLJjBLPLBTFsFFgfwwpZgplpgFnWWRl
+nPncrBHGnmrbdmdmNN
+FnlblGlTTbNVLVtRvQQvgqRQBCvgNr
+DPMDMpMHmnzjPqDhQWvvQvhghq
+zMMcddznsjFTldVGlFGT
+cLSNGLhmRRVmlVCq
+HvzbQBzBMQMpQDpCSlSVZRSCqV
+QwWznWnTbQSMMJQHnvwbWjrhNhLFgsGNNrFLNnFNhd
+dBrWNQWWcTNqqnNN
+bPlmgRgRghlCVlbhwZccCZjZqvmqvmTTvGqmJTvqnGTGvLLJ
+DCDZhjllcpDMrSQS
+ddtNNTFTwRzGRGCwqnBMjlqMHMfqnB
+hDpPsQLLSprhnHVhqhVfHM
+QWLWDQZpgpWbQgfspGGRdcGcCcCcztTGZC
+GGHFdGwFlswcFtnvTfjMjBFfNBjNBZ
+JWmSJLPSRprWWPWVMMVQpZfBvvfQtj
+RzPSPDbDDhbhPDLRhCgGHHccsqGCqqtHzG
+dbSdptWddDMNtdFvttFclqMTZJlJTlMZqJTJTqjC
+BzfwRzrwPzfzLNGmZZCZBTGBqqlH
+hVNVQPNQQQVLPwhRrQwgWWvFdDsFWSbdWgdFSFDb
+hhSnmhtZSFSqZBJSSqqmJJRHPPLgHtPcGGGcWGtvvHwgvG
+fCMpfTQjTrzrzCQMsQdHGHvPGPwLppPRvWPLLc
+MdTzCsCMzNzDCTjlmNhRmRnZBllRVh
+RrFglccgBVVvFNvCvWlgmDbbDfQDtCdjjDbDwmZD
+STnMqSLHJhHHnqLqtnBndbBdfQQZDtZD
+GHJPTBsTSsMMSpSBHJFNlWzcvFlzsVzvzgsv
+lplNdrVrVrWMMVcJfcDDzbqCCpDL
+SSSgvBRSjggPgzvTTRHTvFnfJLbcLsCDLnCLDCcJBsJq
+GmHjjRwvHSjHTRjrlZrNMzVMhVrmVW
+gdtFtgStSbHCbHMPZrFLPLrVlrVZrP
+hQnjMGfDqTvzvpBjVVjPRLRRjJ
+QmsQmhvvMtssHtWw
+RNjTGSCLJCGdRqMRFvMrfzMvzz
+ZpcWcVDpWBmWQMZZpZDpwBcznrshtntvfvhfFtzmvnzvhf
+WHHHcVWgQVCbCllbgMLN
+ZjjdJHSdSzvcZFMhhhDqDHtthw
+rNTlNqVWTmRPlshsDPDlph
+WbTNGNmQBRQbRNQgNGmCLdvvjzcCSBqLcLnScL
+bZwpSpBvSHCBqNzpdFffqQft
+nWRnGRnVnljmlDnzdPfQfdcQPWWfNq
+dmRDGMMlDmnVjgMlhBSwCbCgwHbBHhvv
+NwqLgLBLgnwNNBGpgsQsddhhpQQg
+JcztcZnzVtZvnVcJMTvTJtWtppsQHGdQhhHHQsPhWdPS
+fJTJnMmvZvMvRDqFblNBNNjlBf
+drZVzZzzNWWzwwTWTZrjWcLCqnRqNnLNLqCqnsPPRL
+JhlBgvHBBLnwMBqDwC
+GmGFSHmhJSGJwgFJmwJhJhgQVWVdbSWZQzZTrWtZzjzjTz
+wPGRPpnzgwwGgLddFBFrnrnJdc
+jCsVclQWmCTrJJddrdFs
+lWjlCqfmlWccpGPPSgcf
+hCThCzTdPcPhzqTzMfVfHrhMMmhVHgVM
+lJSJNqwJsZBSsSBFsMprDmFmFDfDDHgHDf
+JNGQsSSNGsbZZZSBwZLPtdLjttnqPCbtPbjC
+vnlWNpbrNrpShhQDLRLB
+MzCjPgffVTVgCJSRQhBdRdJS
+VPHcfcBfTzVMTttMzMfgzMfHvrllWvlnvNvlmGwWNwwNmw
+BwwsqPJqwBssLlFqLRCDzWwzDGRGGWfSRG
+vTtmmthvpphpnNgNvvpvRrDCddDQrCQCzCDrCfnf
+pppccNpTVVlqssHHVzBH
+HWHphZWVWvMZNvpMtfJZgssffsjJgBlslJ
+RLmrFFnGFrFFrrFCRwCrLNPwqfjSJjqJSJBbsqjbbsblfq
+LnFLPPGLrGNRQPmndLzPmPmpcDcMHhcMhVHvczcpHHchcV
+zwqqvNDVggwqVfNQRlszFBsCCJFtFlFPsz
+MSrrGTZPGSSMSjPbTmtlHBBFrFHFsHlsJsct
+MnmMPMSZZGSZWmSjnWgfqdgVQDvnqvRDggDV
+SQCSBShsQnSsSJswsNpVppPPMVpGpnDVgg
+WWjHvmtWZrwvtzzjTTRPrRRrMVNVVGgVGpGR
+lTvWjWLfWwbJCQqBSlbB
+cjPChhswrNVtMZJjVM
+pfvTFvTzLBFndGTlJmVJZmNlCMGtCJ
+nfvFTfpbBFdSFpTLswsWDbchwHCWHrbw
+lNdNPLJJLHHHlpPJcvtVcsBBrrBvBqrVrC
+wDTbwTQRZTMWsVWtmWhhTr
+nzRMbSZtMQDnpzzJHLHNflHP
+HrwwmwcRbmwcbrrTbwwcrTJWLlPshllhLccqLhnnlljhZhjZ
+GMFMSNSpCBSFSdGpNFpBznLlzzhzshlGhhqPhGGL
+nFFSCCSSfttBdddDQNDBQpSSrbrmWJwrHfJHWJrbVwWHrgVr
+SdddNNCmpNNDhMswhsmbhvHM
+frtzqqqFjgrWfgfqtthsnvRHZRRvFlhnvRZb
+rtrgqzzrbWtqLGLLtBWzfGcTNCCVGpSNDppTJJVddNpPSG
+WWJvJvBgpHSHScQRQSVQLzqL
+ddZTlZGZVfQhZRLLMqsR
+rPfwrGGrFjjNTGNCCVBggDJHmNDvbmmpmNJJ
+bbGrJPRVPtfsVfFlMjBV
+WQzhQQQNZQCWNnQDhzWdNjFZggmlHjjmMmMFjFHpMs
+CzQCSWDTWhNhzWhTGJwtRRqTblwcclvP
+HLDvZgZldDTnLLsswMpVLn
+FNVQzQSPznCMmpBwCF
+SqfJPfttqffjJPVlhvhZZtvdVDRZ
+jVsLvHvvdrSjpJFsGzmnmltnml
+nTNTRCTBTmmmFPMJ
+CQnCggWQDgBrrSqHjDDfSS
+ZpNlrZNcmctZbcZlmcmZhhpPvPHvwBMHJPMTMHBTFJvJ
+zmdCnGzGRnLDjQnzPvMFVHMVMLTVwMJv
+GGjqssqgzCnCzQsshcffmrbNrrNZtW
+DNpTwhpLlWMDWNMhbJjGttJFHgDcjtjG
+wqQrdCdqbFtCtJtJ
+vffdrwfPrsmqVBBWRVlRRlTSTWSTlR
+ZqTCTQQTFvsDSsBDvWBd
+hfBLzRLtHHLDDWRRWWDNbd
+pHhhnPzLfJcJhzHLzZjcmwCTqTQgwBqqwg
+WJHgqgFqrVrqgqCHwsJHHVFZzppZFGGfTtpcfbdpzzpd
+RvNMQlMBhwMdMfcpbM
+LLRQNBDSSNSwmDDBQRBRBCHsgrgHLVnJVqLsJsnCPJ
+BFhGsDsDsBtsPGtQDrrMdbdrffrffbJbRt
+cVVqScVSWWvVWgVZjnrHJgLfdrLrnrLLLQ
+WmvqNZzzzZSvVzqvcccSzSmqFGCDTGBPQGDhwCDhNDCwPBQp
+RqTlHHTTrQqHlTqsrVDqHbrZFZwhpBhphZBFhZpDpLLLfB
+nSzGCGdvzdGNPBQQBfhLZfFwFN
+WPPPCJMtJSQMJQCCWMJslRrrRgrMRbRqVqqTRR
+BMtfLsLZfTPmCtGWZrZqJNJqvpZdWr
+bRwgHhhRhbbSRbjSglcgwHHJWPcJdPrnNWrnqnWVVqpdnq
+bgjlSgDljHhjgwMPCLPFDMFPGGBC
+zJWjczcWjSWghZgzgSSSZflTqwlfqTTbnQwhdTnMdl
+NrGVCmNpHFPsrJFbFQMJbJdQTn
+JvrtpHHmrCGJCJmNvNpVCsHVgzWgWDDcjjgjDRStWWDLSgzz
+HzdFsBBVsfnTfsPmPtDcZqtMhDDz
+wrjjRQLlwwwrJQLQbCrbwlJDSlcSDtPZmPSDclWDtcDqWh
+RwgprLbNLrLbCCpRCrJLRLFfsGTNNZHBZnnBvvfffnvd
+MlqqlWZclnPtZtDSSvwQQjgQpNQSRM
+rLJTsBrsJBhshTNNwSQBWNvNgNSg
+JbbbChCHsJzHzbWdGHThlFnnPqlPlGPPGncPtFlD
+WcMVvwNNvjRcwTQwVcpNRcspPCFtbPztbCTFmtPtCJtbCzmz
+grrgDhrnDLnLrdfdLZlLZhmCqzlCbtJlSSStFmttqsJJ
+GHHDdgnLDDhrrrgZrZgLNVVVVcRNvcwjWvpWGcRs
+qhGhPSJtGhGtJtvNjnJjnvmNQQmj
+sRBFlbZsrdBRRGbVGBDwDMDQwQwMNDjjjVNV
+CzCflffbBszdBCbdbrtLcfhhgHLGgPccLSPh
+zShhHFzgJWFVFFHFHhRPNjwqPLPtLbtrbwVjjr
+ssnvTmvCDfpCZTnsfCqwNLNPwbJqNJPwrjZw
+vDvpmcnmnBDnsnJTJmQWMHMWzScFggRFRFSW
+nnVHHPLrnpssLnrpLRnHtHrjJcCdzCjcDzMzdqwRdjdDcJ
+WWTGQQzSGWlTmBbDJJjwMJjcvvlDjw
+TGTWBTWmTbgzghZhgzBgpVNrZPPfntfNrVLNNnZP
+TqhQnqqLnnqddttNqQWdtqQmppSSFFClRmzmFZFLSmSlFF
+BcHjGclVPPBrVrcjrGGDrMgcmmRJbRCFzpZmSDRpRZJJmRzz
+ccGjMgvPvsHMgvBHWlhQdqwtllwNdThs
+WjddwRGgHRRdMbrwHRwWjHDtDZplslnJnZrsDvCprJPJ
+QSLLFqQBffCFststlFnn
+CSSmSqzmVVjWMdMjVWgT
+lTfQRhVpRzjThpRQTTTlvHrvBvHnPMHgHqHJvn
+cGDctCwCdDCGSFcJsFJsFBvgnMBrHvvrqngHgmgssg
+SCbSDSFScNpfbRVVJf
+RrwmdwMVjMjMTghDWNTJDpWfWG
+SbPvNbvbSsPbSvZsPJtJWhHpGGGgJWgJ
+lSFvsLNcqzqLrwnFQMnVdmnn
+FgCJFTWntWTFtPLmJmmQJmCMMpljWZBwlGMljjjlwvwBvZ
+SDSbVbdScSDzbLZMBrjlZpVrZp
+ccsSDhSDffzbLNscfcfDcgqhPgTntqmnQmCgtgQCTJ
+VnCnrHnPPrCwHmVWtqfMQQqzCqffCZ
+DDbDcJJJbpJDGppFpqGZRWfGfddzMWtfWM
+tTTglDcgFjwNPHPPwHlH
+bMGbqqgPqqVVMGnbVqSMmRfPcJmCTPDDLJDTCmDm
+FFjjZvFRsFCctmtvtJWD
+wwFhHjQjwQhZrFjQbngglGbRMnSzgbRH
+GPTTJSgTPrPPmcTPpdJsGGGjqbRvqlztqlRqMzGjRv
+LwnfWLNwwHHQwHnjbbMMjWttqtMmMj
+mhwfBDhnQTpJBcBJps
+HQQHwMfwlltzMlVljQhVjjHPPPFGPFcCGprPTPPfDrDcGf
+pRLdvRvJgqLRBSJCcvFnCDTPTcTGnT
+LBLSJbRSLSqbSdBdgJRRqRbwjHHblQttlwtwhzpjMlwhpw
+NWLNSNSDtgSgghgdcwccmwGntwclnT
+FRCQzJRsvfVVjvzFJfQnffwCcmdwmHmmHmTwmCmdGBcq
+sjfJvjfzPRPzvPPVFMssvSLhSSWrMZnSDNrDDhSLZZ
+FvLpSLtCfPCWhRSZZMZJSW
+jbbjwbHjQmHjHsQrQFMnwTnJznwRzhJRnNTM
+gVrjqGqjgrgsFGLDtDBLLfLB
+cgTvRWWLVScRWflNJJDfVJmVlG
+nPPnnmqjmZHCHBHFdfwNsDhzzfJznhsfhw
+bddmQqQjpdFCQWtLQMMSvMMQRS
+wjnmPwCgjPnRlwnmvmvvPnTwbSSLLvsLDWdbbWzvsLzWbzbz
+NqrGqFHqJlfhhJGbszdWQzzLNtQDzz
+FfHFpphrJqJrpGBffcTnBjCnVTMjMRCnVljT
+SrfSJGJpSgMprMHdhBGhsdsshdGsmm
+nRTRPvQllQlblwvCjTwLTnvBqdhmHDPVsmDmdqshDVhNsP
+lbRFHvRwlnlLbnbjLbLjLCzggSpWfMFzSZpzZFJJWpJr
+vNLlFldlvPtHFPHQRt
+jcpRsScDgshzjqzfVStntBTPMTnmWttntMpp
+fSssgVjDsbqSVbCJClLRJLCZRZZb
+wnHmCJccDDcrNnrNMRDtTzpTlMpTzpBp
+PjSPPGjWjLzTjjMtzzMj
+hWvLLFWvHvczVcVn
+jgtngnnhMthcnLjMgCZvChDsmdNCvNNZDN
+bWqFPbFbLzRFfZBNDNNPZsNd
+RbJzGpzVLLLWHHQgTMwcTptQ
+sJBhsMWQnhhrFBsFhlQQMfrDCDpLlVCddjTdDDpqDLTLdj
+tZHHSRmNHcgmNzpDPJtttqjLqdpL
+HbNbZmcHQJbsFWvs
+VgPNWGbgSjGjfhRRFfzThtmtzF
+qLCQJBqqcPPmLHhHFz
+CcJvplQswNgZlNPSbS \ No newline at end of file
diff --git a/03/input-raindrops.txt b/03/input-raindrops.txt
new file mode 100644
index 0000000..e5d47fd
--- /dev/null
+++ b/03/input-raindrops.txt
@@ -0,0 +1,300 @@
+LLBPGtltrGPBMMsLcLMMVMpVRhhfCDTwRwRdTfwDllRRRDhC
+gNFJHJFgtZFJjZJHNNFWZWZwwDjCwSDhfCDbdwjfwDTTDT
+gmQNZnZNHWnqmQpLtVLMBsPpBqrL
+HlHldQtHlctzppdQtjdczHhJRnnhGNVmVRJmVjCVFCNh
+LgWNgggZJZGFhCZr
+DbqPswwMvDPqzlBNHtzfHdwd
+tJgtJwwCtNvPHHPtHzDsdRTsBRDDWgWTgT
+QhLQjLGjZQFlFZmnmGLDrzWfRldrTrzTBRWTzs
+bFFmFZjhSFHvBCvCvJpb
+MSGcvnvMGMJgWJDpdndZwBnppfCp
+VPVfQQVbshZNZwdNDwNs
+LtLbjmQRLmVhQtTbfgWjJgFFcrqqrGSqWg
+fHfCNCwwHfGhcntntrrgHrQnrn
+FVqpSpbPpjSVMjqvVmVvMzlzwJnbtnnlzQQlrWzJgt
+PTqqRRPSRSmqSpPpSpRZwGCLGscCNLZZZTNdNZ
+pQQQslVSVzzCQnZSlplzbLcHZHcrrrbZqFbZjbFm
+gWtvPgdMDDtFDHHjJJbbccbrLW
+MhNvwwDfDfdtvRQnpFNNTlSRSn
+ZTnSnTTzqvFmVzvWWm
+ClpCgltHNrtgsHdpLCHtDCNLVvQvVwVmwcsWQGMMQvcGcFcv
+JmrgCHCNJtlmHmNhnJjnnnjJhPfhSJ
+BgRRZTgHHvRTRmRNLNNhQWlmGFfJlWlhsQshpF
+qPqSSttwnnzqqqwtVrPwMthFsJllJJlGhpJhWJQlhVQd
+MjMwScnDPzcwjtqDtztnctrvgNZTTvCvLgvQbLbvjTBvBg
+SWQSbbqTTbPcfMZSwZZwwn
+dghjghmNDmGsGgdnfmtMRCLCCRncfc
+pJDJNdsNMMhpssgdprBTBzWlpBWlllWb
+TwNLNZTwWCWLwWCSTZSLzWHGrDHHPmGdDHvndGdNfvMm
+BgpjtpgjBjVbRjQRhVsDnvgGgPnGdrmvnMDfrf
+rhRjRssQJplRtVbpthblbbLSLzFCJZFqLLFWCzqcqzLL
+PBrdPMtBPvCQBVBjCfWPqSHbszhGGnsfSG
+JpmDwJgWJgNzmShhmfSGzh
+pRwNcNpFZNZRWgcNplpjVCMVjdvdMQtCMLZjMZ
+lDrcnnlLqLRcDDZRLjFVTHzGCLGVPzGPVWGB
+pNwHpdmsNJsbpwsbzJTCPWTVFzzQTWCQ
+vbhswdtdwfdsmtNSssHwvllvMcZjnjcnZqlgMDZglM
+GVVtJGtzVFsVsDTH
+mQRgcBRmRLnBjrtFjCCrHmFF
+gqpBnlRpgZcvdSdlMdSvMt
+tMSCNGSflffNhnnGqlPPsrzWPrTrVpWr
+bZHbmDBQmbDZQdbDcRFZZBTTWWWwqVzszWjrFPVwrzqq
+HQBLHmQVQLDdCggMfgMNLvNG
+HHNDzNJPJPmdPcNGGGhnhwnVhCQBwBjQ
+bsSbLfrLtRSLRSRRRsBwhCpfpCzlwCBVjlCV
+zvvsvqLtZqLtzRsqTrggRMHJNWJgHHHNJcgWNPdHcH
+qgbNvqbgmmZgZLvZqgnZzlpzpzHtVPzttGPrrnnl
+jwswGjQDMsQMjdBwdcjCHVtcPVpCVCrPlVSrpc
+GsFWBfhGBfDFDFWqNbLNqbgvqbbvfN
+HgwWqtcqHNWgnHcNNCfvJCCJJfJGvnPfrR
+sbDhZSmdBbsSdmSDdrjjffRvdjPrprCd
+vvZbSFFlFHtqFqqWNc
+ZRjnbRsHlncZGjTRTfFVSQBQppQvvFBHpF
+zrLwMdhDhqJJttDQSldQVPQSlSfPlV
+hCWWCzqWnmcZlRRW
+HfgfQflHjWgRQRdRBWVsnbvvscbbbwvmbHncSc
+tJGLtPPGZPwVvSSPhw
+CLGTLZqJtMGqLDFFDZZJFZJpWjRpVNRWpllDpjlBfgVjlp
+rhhGZZhLNhPmfJqvfLlq
+dHRTHRHQQWcTCRTHmmjJgfqqlGmgWgql
+CCwRzTRRdCCRSQwzRcppprZtrMhGBMZMnDSt
+WfffvnSnfSBshwsjhlvGlh
+ZHpFNTmppVmNzVVmmFMZzbwwjHGrGlPhCGrljbgHsg
+pLZMmqVsZVMMVVscDfdtSSStqcRRdn
+RhRbLzRLHLCPmzznHLbzCRTJhdTVSJJVSjdFFNFFNTJv
+MGgMfpMsBgpnMtGfnfwBtDBjFVdNSSSFdvJSQSpTJdJjNv
+lMsBgDMsblmRblnz
+ClNcJZttLfLvvRQzQWwRQN
+hrpMdqMspsrGDdMphhdMMMMHBmRWmSVrRVzVTzQBQvSmzVWV
+ppHDMGhMMDbGMdDMGbgFbgbMlJJnjjZtZfLPcfcngZfPPfCR
+ZRslLRgCclZLZzQghQhfrbfGbJ
+pVSHpBBBBDVDqDBldVzfrMzQbfSTSJrzzJrJ
+DqqHnBDlpNDVVnpnjtDtNjCvFLcsFFPZRcPsNNmPcFcP
+LmLWSmSRNdcpcRHFHrWzWHbMbwZlZlPSbTjlwPbTPJTf
+DttBsvhnhqvGGBhGtBVNBVqJlPwslMMPJwTjZbbZPTfbPs
+CDthQvVNVFCHHWCFdr
+RRtCWSzQZdRMrtRWrSztMggcGDfQTcfFTGqTLgGDLc
+bnVhnvPHhhdJJBTLDGcDTcBvvD
+pmbnhmPPmHwdCjmdrRtCdj
+lTPzwhzmHpTvrDCDHJnsNN
+tdgtbMMBbWdFbtqJCnsrqnMMDsrq
+FjWdtgLSWttWtLSWtDWBjGGmwGlzTRwPTQGhlQQm
+wcbnTtTppNLrntznTBBccCGrVldRrZqdqRCZdFZCVZ
+JfHDgjgPPfRRgRlLRddR
+jhDhhLMfmJjMjDbNSTzbbbtmttmN
+CfGlvzpvpTjzzCWjvDlfvbbJbCRSdSRhsSQCMhdbhR
+wqrSmrLHHNcLqrrLBNsndssnnhPshnsQwbnJ
+NtcmBLcNVDWzjSvWtv
+vZPCSCvCJffvVvmCmPqCSlDSscczHDRcwcHzRlRHHs
+LFGFNnGrdQttNMFpzpMRRDslsJwsJH
+gjtLnFBJrLvhZvCbZhqB
+DBcjVFjDhQMSJVZbHZbl
+nfmsqppnLfTnfmMmzppwgllSrbSHHtllqbtSwZ
+TRzTnfRWnfdzWssfnRfRpncQPBhdDjjDCPcMQcCBGPPj
+NSjWCHjNHjpPWPpSFWdtqBMBBFVBvqvJGJwqBt
+gQllgDrnhQQDGRshRsZfVtVMRqwMtccVJcBtvRqw
+DQrzrDzhQgrsZLrZjWSSHNTWCjjNGTLH
+CgdcCFcbTbBzPgmNRmpptP
+rsZtsvVvHZZzPmqVNPzNmV
+HZjrwrjnjtHSHwDGdFhCdhWWJnWchCFJ
+RMTqQMRJqPtBtGBPtWjN
+ssHfSfShCwwbhsbHhhsmSfhSGNpCpNCjBBBLptcGtpzBBBWW
+HnwrSFwffHsFwrSSjfHglJJlTgZdFdgZRZTDDM
+pDLDWlDSlJDmzSJnDScRPLGGvqFqLPccGLgv
+CZHfwNMVNjsHNNqPgcbcBbRQGQ
+dCffZCjVCdCHHTmnlSgTlTSrlStp
+bFtlLCvLlVjpCGPJndrrMMCDDCnrMg
+hRsTwcZcBjZRJrfMDnsHrJnH
+mNZqcTSSBTScNzVQFtGtjpFtjmGG
+bjHdLrHjRWpDCtLzhzps
+lZcGfTvQcQfvlqqcNCcBvVwtGzmzthmwmpthMDmswgMt
+NcqflNQTBTTvvQSvqSVvQJbHPHbHCRJdndJPSHjWHb
+CVmRncrRVrhcmsBgfmtfdJsJmt
+bZHvZZDJwpWtdZgtGNGd
+vSbwHDMFMJqPQqQvvSPQqpSwjRcTVTLjLRhVCLFLjLFnFzCC
+mtffsmBwfwBDBmmsLsHqtpftGrMVMPSMPsVvhNvFrGPMvjNV
+TQTQCRWjJcdcQQSPrhhPSvVGPF
+cTRJCnldWJZlTgbWgbdbpqfqmppjmtljpqzmjpLw
+NNPmrmPWmrSSNNPmnglghmCvLCCflh
+LFbsDQMQFtQFHbQHqhvnngCftpcllptJgJ
+bDjsGqLLdRVjPZPP
+tgrbBQlbtRblwtRGrbCNswDDCsvFszpssCss
+SJVMhSZfHvpdhphN
+SMLpWZSSZMjfgGBgRtbQgljQ
+HsHHNDDHzHDDjsVBBZqtWBrSNcPwQvccvvdhPclSrQSc
+fGCFCgpgTfnTmgTFLFgccclhwQhwrzSwSwrCrr
+pmLJGfMRpFmfFMzmgGmRpgmVqWJDqZqqHtjBBVDBBqqssJ
+mBTfcfCCmpBCCSzNQScQSTfddhdtwgttjghNwGtGdgwGtd
+HvvqbvMLnFZVVPjJGRGzGRjZtwgw
+VFHFbsFHHSmzQBmsmT
+ZNmZCmNHHzzmPPzlbplvhbQh
+GDSwldfdvggPfLvQ
+ddqrtlnJDJlnjScRmMRCFHTHtFZF
+FPvglHSPcpNcFNSHFHNvZjdmbwdbzZtzsHDzbsbj
+MMnBLCCWBJCnrCVWCBstTZdZmdTtbDLswTtZ
+BMDnRCrnGhPPSgcgpG
+nsbgpbdrjMdGqnNRRWWRww
+tZZhPzCJhsJBtJPllJBCtCvwwcwwWLvWvwWRThcGcqLq
+mlBmZQPZmlppbgMmfssg
+RFdZTHFCdvjhgGnFqj
+zQLtNQpzNNtNpDtDPWLNMmGfBcjgjlgjhBnvcfnBvfjp
+PtmLsPzQVWzWDswCSwHbRZsGZw
+nPsfnPsFhTGjqGnmQppG
+RZhBbNwbBRZHZSCCHQqSpCpqqm
+VMbgNWRWMDfhtFJT
+RWhRPDhBHZWgZghRZwZgGJPGdncFdLcdLCjscFcjCjNLLj
+mQfSrlfTVqmSVTTTrprfFLqcdLHsLHFnvsFFqnNd
+TtQmVHmMrbMWRggRPJZP
+TTlCTVTdcpBlcchF
+ZLhwSMZhqhtqwqLjFcBvFmvvssGBmmjj
+LwSMRtqMHnqhhRZRRtJSVTgggVPdTdrVbQDJgTPW
+CGFFWFFVgjfzgVfcJCcgTCcBBWqSqMMBMBShhwMLMwSSMq
+fmQnflldltBZqlwqNZpB
+dvtnvmtRtsPbzCfTHjHcPzGf
+hzshzfshVhthgMmRsFRvFqmm
+PDDcZWlWBbplvmRRGtlvqQ
+ncjnDjbScnBWZjDVfwjfrrVtwLjzhr
+QRWvffVVGfDhNNjzGZLLcGGZ
+rgtpSSHpPrHSspvNLFlzTgNLlFglcc
+SSpbMHpvmwMQhMBR
+dHLtBqPCtPBHNsbRNdNNsZVN
+nQwntMwJWhwWjvcjDMlntRsNpgSbNNpglFpVggbSVF
+QDhJWwhzJtTqLzCmtT
+PSLqTqrCrRvCSJWLdLwdVWdQWL
+zNjHQnnHjHznnbDMnMMMdVZcpZZJpZWcdJFZ
+BntfgNbzfBtHzgnbbbPPSstlQSSGGrlGsrTT
+QpBNsBzztgqVtdmp
+jvrhGljRhSTlGGvjwjSwGjRvHVdqLttrMgMbtMMMVmdqqHfV
+ChTvTvljmCsQQQnNsQ
+CQCNSQHHgCtNHCNHHNDJcBJwLPtJBGhMPPPJwM
+zRTqmsdRRzrmdzVRpzPwcjdwwhLjMBMGBBLw
+hprmzRmblTzTVTVrlbrmVHNWNnCZFWNNFZlnDFSWgQ
+hGGqwwdwMqsRDGRBzlvDzB
+LTNTfcCFFFCcNHFFBzRSZRBlzHPSZdvD
+nLVTFNfVVLLWnwnwdrdbhnrhrr
+hlTpcDTpHmHwDmMbbdMMMGTPdGPR
+ZzFqNSQqHvBvzzqjFHtvSGRRMPQsJGJWRGWPMRdRsM
+BZjLNqNqzVVHgLVgll
+ZHHBzSZPVqghJgSnBhqJRQLRRMvQpwZvfNQRMMMp
+ctFCDmdDWmDGNRFMpRlwwQPP
+PrsmDmCGjtcmdjGtVqBSjJhnSbHnnghH
+QmZHTjmmHRmmdPRvHdVlPdrNNLqWzffbRtqpzfWtWsWNNW
+gwMcgnMGFGCjJLqfbtNtzzssCW
+DwMFGBwcBFjhBBhcDSJQQVQTPldTvPlVVZQSdQ
+NRTGfNffLghStLRR
+QlnWsdJWmnbWnVqWbWqHPSpmjgCjtSwhPjgtptLS
+JWchnllHqQJzGTZfTcFNDN
+VtdtcTVVCRctVdJclCVtpphpPhNGDwNPmThwWmgG
+ZjZMFnfBqqMjHZHMzBnzgPGwDmhmhDPfQNGPQGfD
+BbgsnFgMgMlVdJtlcVSs
+tlBMdBnClhLJnTbgph
+PhDDczqDGPqsHGrRGPWHGPzcFJNLTTJZLNbNLfFZgTbffL
+sHsmzzrGmPrRDRHqhHwmjBVtllwtdMdBSBtl
+QscfZsGsVjVtqGmlzvRMvl
+ThJNCHPTDDhHHJTJPHmlSMTtTTlBvlnMSzqn
+HhCdrHrCcpmmdVmb
+WPPBPvRWzvhWhWzGWtBqBSTLDZhgFSTCDgSgZZDCZs
+flbJmMJnjdMqNdfZZrFZZNFZgrrsTZ
+nQnqJlJdlQMMbVnVmdMplVnnBwcBPGttzQcvtHcWwWtHRHvB
+LLsmpJTWCJmJppCmgHCCLjbFtRFghzjfjcjcZttbRg
+SZlMPBdBtQfFSbSF
+nPqldlDwlBVnvdLWJVsmVNZCCVmJ
+HWvNVtHWJjHJsSgHsHzsDsmf
+RwZGPFGMQgzpTGSD
+PZMlwwqhFPPZqwFhPwnFbMjWJNNBtWNVJlCJJWJjWWzj
+frBSzJDtztfNVGwRzVgGhqsV
+MPMmjPWGMMmPCQCcbmRwVhTgVwTTqjvRTLww
+cFpcMGFplDHfBHFS
+gtjhjLffmgjgmbgVfbNdqFJMJMNbbwrwqq
+sWHHPSJsHzTZzTGsCdrqCNNddGdGFGRC
+ZpzHHTZWzsSSnBBPsTBnLVcpQfcJcQVQDQfcDfQt
+qMPqChqjQPRCMqlBrmGmLbPSsTbSvz
+nWNHZFVZZttWpfHsGSbBGTbWBSGmSm
+nZfpVfdZdtFHnwVHZtNwZhCJRJhcCdDcQhCqDSSCQc
+LlwSlZrftFSMpfLCdltTmmmSDmJqmssDVJBmJB
+cRcGGhpvDTmTDgsG
+nNPcjpWbNzjRRcWhbzWjvnLMddMLCwtdtMttddtrCdMz
+NszSsDCMSDzdZpCMCSMpNszfTvJhlvmlmrTfrhlhHPrmhD
+FRWBgRjWwqFWQFBBWjVncjRTvJfvvJvVrHhmVrHhmrdJTh
+wnwnqwRGFqdbNNtCGpCp
+zgsBvPVVDDrDtDgt
+nTHldmJQNTTfflcJNrQlHWpmDDFDFhWpWCLtFbphCm
+nTTNMlNfHQZTQPGSzVVZSVPSwr
+bPLbtPpwsJhlpnhnnLNNZDWhRNzWQrWWffNr
+SczqFdFHSTFjmMSMFVqFGCWWNRrWQQQRZCVWgQQgrZ
+dFdzFGHvjmqGMFwwLLsPnvBspnsn
+lwJwwmblVdvjbbbJvVnlmjGTTNTLqffpqDJffqGLqDLD
+ZtWgPtRMtQRQnTGDQNTTqL
+gCztMgWgchHhvwlllbnl
+cCwSSCVbqwCCWSbZMmGdtBllWBfdlvdt
+jzRsJjhPjnLthJNNpmpvmvvMfGvjQpGv
+nPHPFgRHLtCHZrqTcq
+dVJwCJGCVrQQGTNtLtGm
+hWWgDHBzWWWpZlhWBssLDTDsQTLLtswswL
+gPhBHpjwHcljpggwwWqvbFvdCVRqPPnnqVRb
+zRRRRNqzpQZNNRRmRcZscQcCDmCTTTDGfTbfGhrTCTrbFF
+HMvMtjgtLHVlLVfhCGfrfhJhhrvh
+LBgStjnHBjLVgggBgHndnSNNQdNWcQQNGZccwsccdQpw
+jLRqmZNGtZtvZvHzPfCvSSzhCP
+QbwDVHFrVbDVrDFbzPwSThSfddhWPWzS
+rpnFDccHFHtZNmMmRntj
+RFVdzzlNtrwSTltb
+hHGcqqBcGLQZffHhMwSswSWGrnnbMStC
+cgqLBgQgpgbbPbPz
+lfcgglhfTvmlBvclbgztnSRtSmttwRJwptWR
+FMjDjsdNDjNMQLFFLCMQdtwGGzRwzpGwzdWzzJpGhn
+ZQVNsVZMPsVhCQsFCFsHHlqlcBZrHHfBflbHBB
+vGGQQdwNCTJfQJHJbM
+FFqmzghlzhgqjlFqzZhmhPlRgBDLLRTTcHMbRcJHBLcgRH
+qFrPjnhZmqnhZZjhhmpPzZmtvbpwtdvsSCCsGwdNwvwNCp
+nrFdSHScdRwvdvRm
+NNpPLJJbNbppCvmzbHTbmsTw
+fWLHPlPtpMNBgGQgqggQSMGc
+BcHtrBcnjflfHslsrnltbTgvMwpWnnWpwwwCwCCRRW
+dzGhLSSGDdPNgLLdPWTqWWRMqwRWpvzMMv
+VPZZNhhNSSDhLNSLdFZBVgBbjHcgsgfrbBJbfs
+VMnWjjWTnNNCzzhblbbjlj
+FmHwfFHqpDrJzPQLPLbCDs
+GrdFfHqqSmmwHSqHfpdMNTtTtZCMMZtTRggGZR
+QRlnlTphqNfqdjZNmd
+rDtPmGctFrcgDjJcNjvNJNCcNw
+bgGDtgDbBWBSBVlblmVmsRMmLM
+CcQTQTrrmfQQhZZBpZpSSZ
+JFqSvLlLbWggDvDDFHjsdnshBZpjHBBhBW
+FgJqNvLRMlMMDDblrtfrTCStmCVtNttz
+MRRbbddqtHbMZbqMHHTFTFgwZglWPfgsZWgW
+LCcLjzCNGNcvpvLTFPmzlFsfTgFlgs
+NhNGcrCGrsrvcDpvVcSbtHQJQbnQbSdHMtJV
+bfMfBFcWFsWZHBWRPQpRqdwmMpmddm
+rSShvvVTNVhvVCCvThDlSvCwpGCmRmGQmPwmpLRLRdpq
+DhRzzVNVVgSzTFcgtnbHnHbfBB
+HsTGHHvlvvGTGlHBvlbZstrVrwNjrjVStwVVZR
+PPmgcFJPFcFWmWMgdNtVtQZtDVDVdZZjjR
+LLqWnMnmNvlBLCTzCT
+qTttLqLvGCQqCDlhml
+FJjzrRBrpjRWrCwrBrrwpRbbDzgghSmmNhPQhgNshmDSzSNm
+bJBrbFRjBVnWBrRBnHLfHGfdVtvHttcCdT
+mTzjGPmPPmPNjNBTvlJRlNJzZqrzrSZZSpcZqpgcgcggFr
+QWCwwMwWWhVZFbpQDSpSJS
+stMMsWwMwVWtwJTNNPvvRmTsNPsl
+gGFFNWMMNFTBlLpGpSll
+qvccssdDwDbhMhzwHLppTSHLrdBpBVLV
+PhJhzhMJzwDJwhZZtZQJCjgWtFjZ
+pGqWfqqGcspGqWqppHprpTrzhCzttMBCtbtJmtJbSBvWBt
+QDnVPgVPgDCJBMhmBJgv
+NlZwFlnnPLLlFwDlDlnPPFFHTMTdMZjTTcjsqqcsdfGdcp
+HLzZfHWWQwpgVHjVHr
+JlMlMGGDMtJGdtJhqtlccDgVCSTFFSCSDTggpvFTjSgS
+JcGRMlthtlVNMJRfzWsPnQsnnZNZns
+zVfvMpsbtQmtBlFWBZ
+lLSrlNTNRSFRFhhHRmPR
+dnSJjjwJJGwwnzVlvpszvccM
+SmlcCrpnrnznGzSBBSfzNbtsQsWZQcFbWctcbbZb
+JHgwJPjvdghbbWdDZGNLZb
+JjghvvhRwhwJVhHTzmfRfzGSMrzBfnGC
+JbCmrbnzmntnVJjbCHJJFQFvqgJgQgqLDQ
+NGhhhhPMGhWsSSchWlNsCLBBlLFQCgqvgCFFgQBg
+PdcNWWcdGdPssPPNTSNNtzbTwjntzbbVwtZpCVnb
+tGNgtsNQHsJmwwzddmQw
+hMhhDBwMhDDfCRRBjFDDTTWjdWmrmdWqjlmmmjJz
+RSpSSBhppDhRncRLswZLGvtGvNcNtL \ No newline at end of file