diff --git a/2018/04/Cargo.lock b/2018/04/Cargo.lock new file mode 100644 index 0000000..7b11acc --- /dev/null +++ b/2018/04/Cargo.lock @@ -0,0 +1,161 @@ +[[package]] +name = "aho-corasick" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cfg-if" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "chrono" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "day-04" +version = "0.1.0" +dependencies = [ + "chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "lazy_static" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.45" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "memchr" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-integer" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "redox_syscall" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "regex" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "time" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ucd-util" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "utf8-ranges" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "version_check" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum aho-corasick 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "1e9a933f4e58658d7b12defcf96dc5c720f20832deebe3e0a19efd3b6aaeeb9e" +"checksum cfg-if 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "082bb9b28e00d3c9d39cc03e64ce4cea0f1bb9b3fde493f0cbc008472d22bdf4" +"checksum chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "45912881121cb26fad7c38c17ba7daa18764771836b34fab7d3fbd93ed633878" +"checksum lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a374c89b9db55895453a74c1e38861d9deec0b01b405a82516e9d5de4820dea1" +"checksum libc 0.2.45 (registry+https://github.com/rust-lang/crates.io-index)" = "2d2857ec59fadc0773853c664d2d18e7198e83883e7060b63c924cb077bd5c74" +"checksum memchr 2.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "db4c41318937f6e76648f42826b1d9ade5c09cafb5aef7e351240a70f39206e9" +"checksum num-integer 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "e83d528d2677f0518c570baf2b7abdcf0cd2d248860b68507bdcb3e91d4c0cea" +"checksum num-traits 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "0b3a5d7cc97d6d30d8b9bc8fa19bf45349ffe46241e8816f50f62f6d6aaabee1" +"checksum redox_syscall 0.1.44 (registry+https://github.com/rust-lang/crates.io-index)" = "a84bcd297b87a545980a2d25a0beb72a1f490c31f0a9fde52fca35bfbb1ceb70" +"checksum regex 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "37e7cbbd370869ce2e8dff25c7018702d10b21a20ef7135316f8daecd6c25b7f" +"checksum regex-syntax 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "4e47a2ed29da7a9e1960e1639e7a982e6edc6d49be308a3b02daf511504a16d1" +"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" +"checksum time 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "847da467bf0db05882a9e2375934a8a55cffdc9db0d128af1518200260ba1f6c" +"checksum ucd-util 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "535c204ee4d8434478593480b8f86ab45ec9aae0e83c568ca81abf0fd0e88f86" +"checksum utf8-ranges 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "796f7e48bef87609f7ade7e06495a87d5cd06c7866e6a5cbfceffc558a243737" +"checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" +"checksum winapi 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92c1eb33641e276cfa214a0522acad57be5c56b10cb348b3c5117db75f3ac4b0" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/2018/04/Cargo.toml b/2018/04/Cargo.toml new file mode 100644 index 0000000..f8304fd --- /dev/null +++ b/2018/04/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "day-04" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] +chrono = "0.4" +regex = "1.1" diff --git a/2018/04/input.txt b/2018/04/input.txt new file mode 100644 index 0000000..78fc045 --- /dev/null +++ b/2018/04/input.txt @@ -0,0 +1,1170 @@ +[1518-09-28 00:56] wakes up +[1518-10-15 00:05] falls asleep +[1518-02-15 00:58] wakes up +[1518-08-26 00:51] wakes up +[1518-03-23 00:32] wakes up +[1518-05-04 23:56] Guard #523 begins shift +[1518-07-28 00:55] wakes up +[1518-02-08 00:49] wakes up +[1518-04-20 00:02] Guard #2017 begins shift +[1518-09-12 00:57] wakes up +[1518-06-11 00:34] wakes up +[1518-06-08 00:20] wakes up +[1518-01-29 00:53] wakes up +[1518-09-23 00:03] falls asleep +[1518-02-11 00:19] falls asleep +[1518-05-12 23:57] Guard #151 begins shift +[1518-07-24 00:47] wakes up +[1518-07-21 00:03] falls asleep +[1518-05-19 00:54] wakes up +[1518-08-21 00:52] wakes up +[1518-10-10 00:52] wakes up +[1518-02-02 00:14] wakes up +[1518-10-15 00:52] wakes up +[1518-03-13 23:46] Guard #2081 begins shift +[1518-08-07 00:26] falls asleep +[1518-08-13 00:00] Guard #349 begins shift +[1518-10-17 00:22] falls asleep +[1518-03-10 00:14] falls asleep +[1518-09-30 00:48] wakes up +[1518-07-01 23:57] Guard #3469 begins shift +[1518-04-09 23:57] Guard #3413 begins shift +[1518-04-28 00:35] falls asleep +[1518-06-08 00:49] wakes up +[1518-08-15 00:25] falls asleep +[1518-05-16 00:55] falls asleep +[1518-06-13 00:48] falls asleep +[1518-03-28 00:52] falls asleep +[1518-10-19 00:01] Guard #2677 begins shift +[1518-01-29 00:04] Guard #2017 begins shift +[1518-04-09 00:23] falls asleep +[1518-07-05 00:31] falls asleep +[1518-06-15 23:58] Guard #1151 begins shift +[1518-03-09 00:38] wakes up +[1518-09-05 00:48] wakes up +[1518-08-14 00:58] wakes up +[1518-09-05 00:40] falls asleep +[1518-06-10 23:56] Guard #151 begins shift +[1518-03-16 00:00] Guard #1091 begins shift +[1518-05-14 00:02] falls asleep +[1518-07-23 00:52] wakes up +[1518-09-13 00:50] wakes up +[1518-10-19 23:59] Guard #2087 begins shift +[1518-03-02 00:53] falls asleep +[1518-11-20 00:42] falls asleep +[1518-04-23 00:31] wakes up +[1518-04-19 00:43] wakes up +[1518-09-07 23:59] Guard #1091 begins shift +[1518-08-30 00:00] Guard #71 begins shift +[1518-11-14 00:53] falls asleep +[1518-06-08 00:04] Guard #2017 begins shift +[1518-03-21 00:58] wakes up +[1518-04-19 00:24] falls asleep +[1518-02-08 00:53] wakes up +[1518-09-23 00:32] wakes up +[1518-05-08 00:04] falls asleep +[1518-10-17 00:55] wakes up +[1518-10-12 23:57] Guard #3413 begins shift +[1518-09-24 00:06] falls asleep +[1518-08-06 00:43] falls asleep +[1518-10-15 00:49] falls asleep +[1518-01-28 00:58] wakes up +[1518-09-28 23:57] Guard #2081 begins shift +[1518-08-15 00:30] falls asleep +[1518-03-06 00:53] falls asleep +[1518-04-20 00:18] wakes up +[1518-02-18 00:10] falls asleep +[1518-02-27 23:56] Guard #1459 begins shift +[1518-09-04 23:58] Guard #907 begins shift +[1518-09-20 00:11] falls asleep +[1518-09-02 00:35] wakes up +[1518-11-12 00:03] Guard #907 begins shift +[1518-07-18 00:16] falls asleep +[1518-10-07 23:57] Guard #3539 begins shift +[1518-02-16 00:31] falls asleep +[1518-02-18 00:32] falls asleep +[1518-06-18 00:55] wakes up +[1518-09-26 00:26] falls asleep +[1518-05-12 00:44] wakes up +[1518-09-01 00:50] falls asleep +[1518-09-25 00:04] Guard #367 begins shift +[1518-07-17 00:59] wakes up +[1518-08-29 00:02] falls asleep +[1518-02-20 00:40] wakes up +[1518-05-01 00:03] Guard #409 begins shift +[1518-11-20 00:02] Guard #2593 begins shift +[1518-09-18 00:04] Guard #1091 begins shift +[1518-01-30 00:57] falls asleep +[1518-01-31 00:33] falls asleep +[1518-11-12 23:57] Guard #409 begins shift +[1518-06-14 00:53] falls asleep +[1518-08-08 00:25] falls asleep +[1518-02-01 00:10] falls asleep +[1518-07-11 00:50] wakes up +[1518-04-18 00:03] Guard #449 begins shift +[1518-10-09 00:53] wakes up +[1518-06-24 23:52] Guard #409 begins shift +[1518-07-19 00:53] wakes up +[1518-03-08 00:21] wakes up +[1518-07-14 00:36] wakes up +[1518-07-02 00:22] falls asleep +[1518-06-25 00:03] falls asleep +[1518-08-10 23:51] Guard #3539 begins shift +[1518-04-06 00:57] falls asleep +[1518-10-13 00:08] wakes up +[1518-08-24 00:58] wakes up +[1518-05-28 00:31] falls asleep +[1518-05-17 00:00] Guard #1627 begins shift +[1518-03-14 00:05] falls asleep +[1518-07-25 00:42] falls asleep +[1518-04-25 00:02] Guard #71 begins shift +[1518-11-16 00:10] falls asleep +[1518-10-05 00:00] Guard #409 begins shift +[1518-09-22 00:57] wakes up +[1518-07-02 23:59] Guard #409 begins shift +[1518-04-25 00:41] falls asleep +[1518-07-30 00:48] wakes up +[1518-02-07 00:50] wakes up +[1518-10-02 00:36] falls asleep +[1518-02-25 00:40] wakes up +[1518-03-12 00:44] falls asleep +[1518-10-10 00:55] falls asleep +[1518-01-29 00:42] falls asleep +[1518-04-17 00:57] wakes up +[1518-08-22 00:32] falls asleep +[1518-11-04 00:22] wakes up +[1518-11-03 00:29] falls asleep +[1518-05-08 00:51] wakes up +[1518-06-03 00:15] falls asleep +[1518-11-18 23:56] Guard #2081 begins shift +[1518-07-14 00:13] falls asleep +[1518-07-04 00:02] falls asleep +[1518-04-11 00:02] Guard #1459 begins shift +[1518-06-01 00:12] falls asleep +[1518-04-01 23:53] Guard #409 begins shift +[1518-06-22 00:27] falls asleep +[1518-05-20 23:57] Guard #523 begins shift +[1518-08-29 00:35] wakes up +[1518-07-29 00:54] wakes up +[1518-10-28 00:42] wakes up +[1518-07-05 00:00] Guard #523 begins shift +[1518-08-26 00:27] falls asleep +[1518-04-15 00:04] falls asleep +[1518-09-20 00:00] Guard #2393 begins shift +[1518-07-19 00:31] wakes up +[1518-02-23 00:48] wakes up +[1518-11-14 00:01] falls asleep +[1518-08-31 00:21] falls asleep +[1518-05-03 00:18] falls asleep +[1518-08-20 23:56] Guard #1627 begins shift +[1518-10-01 00:37] falls asleep +[1518-10-19 00:52] wakes up +[1518-11-05 00:40] wakes up +[1518-03-07 00:08] falls asleep +[1518-01-28 00:49] wakes up +[1518-04-14 00:22] falls asleep +[1518-08-20 00:27] wakes up +[1518-03-17 00:17] falls asleep +[1518-05-03 23:58] Guard #2593 begins shift +[1518-07-30 00:59] wakes up +[1518-08-17 00:16] falls asleep +[1518-08-22 00:25] wakes up +[1518-07-15 00:54] wakes up +[1518-04-11 23:56] Guard #409 begins shift +[1518-09-22 00:03] Guard #349 begins shift +[1518-10-01 00:18] falls asleep +[1518-02-06 00:58] wakes up +[1518-09-03 23:57] Guard #71 begins shift +[1518-09-21 00:30] falls asleep +[1518-07-27 00:03] Guard #2393 begins shift +[1518-11-09 00:19] falls asleep +[1518-08-14 00:21] falls asleep +[1518-08-01 00:02] Guard #1627 begins shift +[1518-02-07 00:58] wakes up +[1518-10-18 00:57] wakes up +[1518-06-26 00:58] wakes up +[1518-10-07 00:00] Guard #1627 begins shift +[1518-05-01 00:57] falls asleep +[1518-04-23 00:20] falls asleep +[1518-09-15 00:02] Guard #1459 begins shift +[1518-06-05 00:42] falls asleep +[1518-03-02 23:50] Guard #1627 begins shift +[1518-06-19 00:51] wakes up +[1518-06-01 23:56] Guard #151 begins shift +[1518-06-22 23:48] Guard #2393 begins shift +[1518-02-10 00:14] falls asleep +[1518-06-11 00:57] wakes up +[1518-07-09 00:39] wakes up +[1518-10-17 23:59] Guard #3469 begins shift +[1518-09-21 00:51] wakes up +[1518-06-24 00:57] wakes up +[1518-09-14 00:42] falls asleep +[1518-08-26 00:37] falls asleep +[1518-11-22 00:50] falls asleep +[1518-10-26 00:00] Guard #409 begins shift +[1518-07-12 00:33] wakes up +[1518-07-24 23:59] Guard #1627 begins shift +[1518-09-28 00:00] Guard #349 begins shift +[1518-08-28 23:46] Guard #907 begins shift +[1518-07-08 23:57] Guard #1459 begins shift +[1518-05-20 00:05] falls asleep +[1518-08-06 00:04] Guard #907 begins shift +[1518-05-03 00:45] wakes up +[1518-11-11 00:08] falls asleep +[1518-05-16 00:28] wakes up +[1518-03-11 00:54] wakes up +[1518-06-06 23:57] Guard #3469 begins shift +[1518-11-22 00:16] falls asleep +[1518-02-18 00:04] Guard #71 begins shift +[1518-06-26 00:09] falls asleep +[1518-03-08 23:48] Guard #523 begins shift +[1518-08-02 00:00] Guard #367 begins shift +[1518-11-20 00:44] wakes up +[1518-04-04 00:22] wakes up +[1518-09-22 23:51] Guard #3413 begins shift +[1518-10-10 00:04] Guard #1627 begins shift +[1518-08-05 00:07] falls asleep +[1518-09-27 00:58] wakes up +[1518-07-09 00:35] falls asleep +[1518-09-29 00:20] wakes up +[1518-06-14 00:59] wakes up +[1518-06-19 23:59] Guard #2081 begins shift +[1518-08-19 00:29] wakes up +[1518-08-16 00:51] wakes up +[1518-07-07 00:19] wakes up +[1518-06-28 00:11] falls asleep +[1518-10-31 00:45] wakes up +[1518-07-24 00:08] wakes up +[1518-05-01 00:59] wakes up +[1518-06-11 23:47] Guard #3413 begins shift +[1518-10-02 23:58] Guard #2087 begins shift +[1518-09-06 23:58] Guard #409 begins shift +[1518-03-25 00:50] falls asleep +[1518-04-05 00:46] falls asleep +[1518-07-17 00:03] Guard #71 begins shift +[1518-06-15 00:49] falls asleep +[1518-07-12 00:47] wakes up +[1518-11-07 00:19] falls asleep +[1518-03-17 00:50] wakes up +[1518-04-10 00:57] falls asleep +[1518-09-19 00:19] wakes up +[1518-08-05 00:55] wakes up +[1518-03-17 00:00] Guard #1627 begins shift +[1518-07-26 00:57] wakes up +[1518-03-26 23:56] Guard #2593 begins shift +[1518-05-30 23:49] Guard #523 begins shift +[1518-07-07 00:18] falls asleep +[1518-09-04 00:56] wakes up +[1518-06-27 00:01] falls asleep +[1518-08-11 00:49] falls asleep +[1518-03-07 00:52] wakes up +[1518-05-18 00:34] wakes up +[1518-06-05 00:59] wakes up +[1518-04-22 00:38] wakes up +[1518-05-16 00:57] wakes up +[1518-03-21 00:47] wakes up +[1518-04-25 00:57] wakes up +[1518-09-03 00:04] falls asleep +[1518-04-23 00:59] wakes up +[1518-09-02 00:01] Guard #2393 begins shift +[1518-09-22 00:53] falls asleep +[1518-09-15 00:26] falls asleep +[1518-10-24 00:34] wakes up +[1518-05-23 00:54] wakes up +[1518-02-15 00:35] wakes up +[1518-03-08 00:25] falls asleep +[1518-10-11 23:57] Guard #349 begins shift +[1518-08-04 00:36] falls asleep +[1518-04-14 00:53] wakes up +[1518-07-24 00:23] falls asleep +[1518-08-22 00:22] falls asleep +[1518-07-24 00:04] falls asleep +[1518-09-20 00:43] wakes up +[1518-05-26 00:29] falls asleep +[1518-06-11 00:32] falls asleep +[1518-03-14 23:56] Guard #151 begins shift +[1518-06-27 00:57] wakes up +[1518-05-14 23:47] Guard #2017 begins shift +[1518-11-06 23:56] Guard #367 begins shift +[1518-04-05 00:49] wakes up +[1518-09-13 23:56] Guard #151 begins shift +[1518-09-28 00:52] falls asleep +[1518-11-14 23:59] Guard #1091 begins shift +[1518-07-21 00:49] wakes up +[1518-06-08 00:27] falls asleep +[1518-08-13 00:32] wakes up +[1518-10-14 00:59] wakes up +[1518-05-22 00:35] falls asleep +[1518-06-24 00:00] Guard #409 begins shift +[1518-08-08 00:54] wakes up +[1518-09-19 00:15] falls asleep +[1518-10-15 23:59] Guard #349 begins shift +[1518-06-11 00:18] falls asleep +[1518-06-24 00:50] falls asleep +[1518-10-28 00:38] falls asleep +[1518-09-09 00:26] falls asleep +[1518-05-03 00:22] wakes up +[1518-08-18 00:00] Guard #3413 begins shift +[1518-09-16 00:58] wakes up +[1518-09-29 00:26] falls asleep +[1518-08-13 00:18] falls asleep +[1518-08-16 00:50] falls asleep +[1518-08-09 00:51] wakes up +[1518-08-02 00:59] wakes up +[1518-06-21 00:43] wakes up +[1518-07-09 00:43] falls asleep +[1518-02-16 00:51] wakes up +[1518-05-17 00:55] falls asleep +[1518-10-28 23:58] Guard #1459 begins shift +[1518-10-03 00:13] falls asleep +[1518-11-11 00:51] wakes up +[1518-05-27 00:38] wakes up +[1518-09-26 00:31] wakes up +[1518-07-02 00:58] wakes up +[1518-03-25 00:08] falls asleep +[1518-04-03 00:24] wakes up +[1518-04-18 00:33] falls asleep +[1518-06-21 00:53] falls asleep +[1518-09-25 23:59] Guard #1459 begins shift +[1518-05-26 00:03] Guard #3469 begins shift +[1518-10-26 23:59] Guard #409 begins shift +[1518-02-06 00:25] falls asleep +[1518-11-09 00:54] wakes up +[1518-09-03 00:24] wakes up +[1518-04-25 23:50] Guard #2393 begins shift +[1518-03-06 00:29] wakes up +[1518-05-12 00:02] Guard #2081 begins shift +[1518-09-26 00:53] wakes up +[1518-05-23 00:02] Guard #367 begins shift +[1518-08-13 00:41] falls asleep +[1518-09-12 00:37] wakes up +[1518-09-01 00:32] falls asleep +[1518-09-02 00:29] falls asleep +[1518-07-17 23:59] Guard #3539 begins shift +[1518-09-21 00:35] wakes up +[1518-03-28 00:49] wakes up +[1518-09-06 00:01] Guard #3413 begins shift +[1518-04-01 00:52] wakes up +[1518-10-12 00:15] falls asleep +[1518-06-20 00:13] falls asleep +[1518-10-04 00:25] falls asleep +[1518-04-18 23:57] Guard #2017 begins shift +[1518-10-23 00:48] falls asleep +[1518-05-27 00:03] Guard #367 begins shift +[1518-11-16 00:34] wakes up +[1518-09-04 00:14] falls asleep +[1518-04-04 00:34] wakes up +[1518-02-03 00:37] wakes up +[1518-04-24 00:41] wakes up +[1518-04-20 00:10] falls asleep +[1518-02-15 00:43] falls asleep +[1518-05-30 00:53] falls asleep +[1518-04-20 23:58] Guard #1091 begins shift +[1518-08-18 00:54] wakes up +[1518-02-28 00:46] falls asleep +[1518-09-11 00:34] falls asleep +[1518-04-04 00:16] falls asleep +[1518-03-03 23:56] Guard #1459 begins shift +[1518-11-04 00:19] falls asleep +[1518-05-04 00:06] falls asleep +[1518-05-02 00:00] Guard #2677 begins shift +[1518-09-26 00:37] falls asleep +[1518-06-27 00:23] wakes up +[1518-10-04 00:43] wakes up +[1518-06-08 00:52] falls asleep +[1518-05-12 00:35] falls asleep +[1518-10-01 23:58] Guard #2393 begins shift +[1518-05-17 00:16] falls asleep +[1518-10-15 00:27] wakes up +[1518-11-21 23:56] Guard #409 begins shift +[1518-02-09 00:15] falls asleep +[1518-02-21 23:56] Guard #2393 begins shift +[1518-02-23 00:04] Guard #1627 begins shift +[1518-02-23 00:56] wakes up +[1518-10-06 00:52] wakes up +[1518-04-10 00:30] falls asleep +[1518-07-22 00:29] falls asleep +[1518-10-24 00:26] falls asleep +[1518-06-23 00:04] falls asleep +[1518-10-08 00:37] wakes up +[1518-09-27 00:01] Guard #449 begins shift +[1518-10-23 00:29] falls asleep +[1518-03-24 23:57] Guard #2017 begins shift +[1518-08-27 00:51] wakes up +[1518-11-18 00:02] Guard #2063 begins shift +[1518-07-09 00:55] wakes up +[1518-03-27 00:16] falls asleep +[1518-07-03 00:45] wakes up +[1518-06-27 23:57] Guard #2393 begins shift +[1518-06-03 00:41] wakes up +[1518-04-04 00:57] wakes up +[1518-03-22 00:29] falls asleep +[1518-10-17 00:42] falls asleep +[1518-10-21 00:02] Guard #2087 begins shift +[1518-02-14 00:28] falls asleep +[1518-03-12 00:59] wakes up +[1518-10-02 00:33] wakes up +[1518-06-21 00:54] wakes up +[1518-07-29 00:32] falls asleep +[1518-06-26 00:29] falls asleep +[1518-11-14 00:47] wakes up +[1518-03-01 00:48] wakes up +[1518-03-27 23:59] Guard #367 begins shift +[1518-08-12 00:42] wakes up +[1518-05-27 00:53] wakes up +[1518-11-11 00:46] falls asleep +[1518-03-14 00:51] wakes up +[1518-02-01 00:26] wakes up +[1518-07-03 00:27] falls asleep +[1518-03-06 00:56] wakes up +[1518-07-11 00:19] falls asleep +[1518-10-31 23:57] Guard #523 begins shift +[1518-05-05 00:25] falls asleep +[1518-04-06 00:59] wakes up +[1518-02-26 00:49] falls asleep +[1518-09-16 00:56] falls asleep +[1518-02-08 00:52] falls asleep +[1518-04-24 00:04] Guard #2087 begins shift +[1518-02-24 00:04] Guard #367 begins shift +[1518-04-16 00:40] falls asleep +[1518-10-07 00:21] falls asleep +[1518-03-02 00:58] wakes up +[1518-03-29 00:34] falls asleep +[1518-05-31 00:13] wakes up +[1518-03-21 00:52] falls asleep +[1518-02-21 00:13] falls asleep +[1518-06-05 00:03] Guard #2081 begins shift +[1518-08-02 00:51] falls asleep +[1518-11-08 00:09] falls asleep +[1518-01-30 00:51] falls asleep +[1518-04-04 00:48] wakes up +[1518-11-22 00:58] wakes up +[1518-10-05 00:26] falls asleep +[1518-05-03 00:40] falls asleep +[1518-06-12 00:46] wakes up +[1518-05-21 00:35] wakes up +[1518-04-12 23:59] Guard #2677 begins shift +[1518-09-06 00:23] falls asleep +[1518-03-13 00:00] falls asleep +[1518-06-04 00:06] falls asleep +[1518-04-30 00:41] wakes up +[1518-03-30 00:01] Guard #3469 begins shift +[1518-02-27 00:25] wakes up +[1518-11-05 23:52] Guard #409 begins shift +[1518-11-01 00:42] wakes up +[1518-05-07 00:55] wakes up +[1518-11-11 00:04] Guard #449 begins shift +[1518-04-08 00:01] Guard #907 begins shift +[1518-08-11 23:58] Guard #409 begins shift +[1518-05-27 00:49] falls asleep +[1518-09-12 00:42] falls asleep +[1518-08-26 23:57] Guard #523 begins shift +[1518-03-27 00:39] falls asleep +[1518-05-09 23:59] Guard #449 begins shift +[1518-09-05 00:54] wakes up +[1518-08-18 00:17] falls asleep +[1518-04-29 00:21] falls asleep +[1518-11-14 00:12] falls asleep +[1518-03-01 00:00] falls asleep +[1518-03-09 00:19] falls asleep +[1518-08-12 00:38] falls asleep +[1518-05-06 23:50] Guard #409 begins shift +[1518-04-06 23:59] Guard #367 begins shift +[1518-04-30 00:07] falls asleep +[1518-02-23 00:54] falls asleep +[1518-10-22 00:18] falls asleep +[1518-05-07 23:50] Guard #2393 begins shift +[1518-08-15 00:01] Guard #2393 begins shift +[1518-11-09 00:01] Guard #2393 begins shift +[1518-04-10 00:58] wakes up +[1518-05-30 00:39] falls asleep +[1518-03-06 00:06] falls asleep +[1518-02-20 23:56] Guard #2677 begins shift +[1518-09-06 00:53] falls asleep +[1518-05-24 00:30] wakes up +[1518-11-20 00:37] wakes up +[1518-02-04 00:58] wakes up +[1518-07-26 00:00] Guard #349 begins shift +[1518-04-03 00:36] falls asleep +[1518-03-08 00:18] falls asleep +[1518-06-02 00:10] falls asleep +[1518-01-30 23:58] Guard #151 begins shift +[1518-11-08 00:01] Guard #2593 begins shift +[1518-03-12 23:52] Guard #3413 begins shift +[1518-01-31 23:59] Guard #449 begins shift +[1518-01-28 00:00] Guard #151 begins shift +[1518-11-16 23:51] Guard #2393 begins shift +[1518-07-16 00:33] falls asleep +[1518-06-10 00:01] Guard #1627 begins shift +[1518-11-12 00:41] falls asleep +[1518-02-07 00:57] falls asleep +[1518-03-01 00:45] falls asleep +[1518-08-07 00:55] wakes up +[1518-07-16 00:38] wakes up +[1518-06-21 00:08] falls asleep +[1518-03-03 00:39] wakes up +[1518-07-16 00:00] Guard #71 begins shift +[1518-09-12 00:04] Guard #2081 begins shift +[1518-02-13 00:50] wakes up +[1518-07-22 00:11] falls asleep +[1518-02-20 00:03] falls asleep +[1518-10-21 00:34] falls asleep +[1518-05-18 23:58] Guard #449 begins shift +[1518-04-23 00:57] falls asleep +[1518-03-05 00:02] falls asleep +[1518-09-09 23:59] Guard #2593 begins shift +[1518-02-08 23:58] Guard #2677 begins shift +[1518-06-14 00:16] falls asleep +[1518-05-28 00:01] Guard #2393 begins shift +[1518-11-06 00:05] falls asleep +[1518-10-29 00:41] wakes up +[1518-07-19 00:39] falls asleep +[1518-09-10 00:31] wakes up +[1518-09-29 00:37] wakes up +[1518-07-15 00:03] falls asleep +[1518-09-23 00:04] wakes up +[1518-02-27 00:45] wakes up +[1518-09-05 00:51] falls asleep +[1518-02-08 00:38] falls asleep +[1518-10-13 00:47] wakes up +[1518-03-23 00:05] falls asleep +[1518-06-10 00:57] falls asleep +[1518-02-24 00:40] falls asleep +[1518-05-16 00:00] Guard #151 begins shift +[1518-11-07 00:53] wakes up +[1518-08-03 00:58] wakes up +[1518-07-19 23:58] Guard #491 begins shift +[1518-03-31 23:57] Guard #367 begins shift +[1518-05-28 23:57] Guard #2063 begins shift +[1518-05-13 23:47] Guard #3539 begins shift +[1518-06-26 23:51] Guard #3413 begins shift +[1518-05-19 23:52] Guard #1151 begins shift +[1518-07-01 00:08] falls asleep +[1518-03-22 00:34] wakes up +[1518-10-04 00:00] Guard #2593 begins shift +[1518-10-31 00:03] Guard #449 begins shift +[1518-08-11 00:09] wakes up +[1518-08-23 00:57] wakes up +[1518-04-07 00:20] falls asleep +[1518-04-05 00:36] wakes up +[1518-09-15 00:56] falls asleep +[1518-10-29 00:40] falls asleep +[1518-07-28 00:53] falls asleep +[1518-06-17 00:42] falls asleep +[1518-11-21 00:30] falls asleep +[1518-06-14 00:00] Guard #2593 begins shift +[1518-04-10 00:38] wakes up +[1518-01-30 00:00] Guard #3539 begins shift +[1518-08-10 00:55] wakes up +[1518-06-16 00:30] falls asleep +[1518-05-15 00:48] falls asleep +[1518-07-10 00:33] wakes up +[1518-05-16 00:32] falls asleep +[1518-05-19 00:44] falls asleep +[1518-06-28 00:19] wakes up +[1518-07-08 00:28] wakes up +[1518-05-17 23:58] Guard #3469 begins shift +[1518-06-17 00:53] wakes up +[1518-03-24 00:27] falls asleep +[1518-03-07 00:11] wakes up +[1518-10-09 00:17] falls asleep +[1518-05-13 00:38] wakes up +[1518-07-28 00:46] wakes up +[1518-05-24 00:50] wakes up +[1518-02-27 00:00] Guard #2087 begins shift +[1518-05-12 00:53] wakes up +[1518-03-27 00:58] wakes up +[1518-09-23 00:25] falls asleep +[1518-11-23 00:52] falls asleep +[1518-05-16 00:37] wakes up +[1518-05-10 00:31] falls asleep +[1518-04-08 00:12] falls asleep +[1518-10-27 00:53] wakes up +[1518-10-23 23:58] Guard #151 begins shift +[1518-03-30 00:17] falls asleep +[1518-02-16 00:54] falls asleep +[1518-02-21 00:58] wakes up +[1518-10-26 00:51] falls asleep +[1518-03-13 00:58] wakes up +[1518-02-01 00:54] falls asleep +[1518-10-17 00:51] falls asleep +[1518-11-21 00:37] wakes up +[1518-10-19 00:31] falls asleep +[1518-03-23 00:42] falls asleep +[1518-05-18 00:40] falls asleep +[1518-06-21 00:42] falls asleep +[1518-04-30 00:45] falls asleep +[1518-08-16 00:34] falls asleep +[1518-04-27 00:53] falls asleep +[1518-04-03 00:22] falls asleep +[1518-10-17 00:47] wakes up +[1518-09-22 00:46] wakes up +[1518-06-19 00:00] falls asleep +[1518-07-12 00:36] falls asleep +[1518-11-10 00:29] falls asleep +[1518-04-02 00:01] falls asleep +[1518-05-21 23:57] Guard #3413 begins shift +[1518-03-20 00:52] wakes up +[1518-02-23 00:40] falls asleep +[1518-09-17 00:13] falls asleep +[1518-03-15 00:54] wakes up +[1518-09-19 00:03] Guard #523 begins shift +[1518-11-19 00:41] falls asleep +[1518-09-07 00:45] wakes up +[1518-07-08 00:05] falls asleep +[1518-10-11 00:30] falls asleep +[1518-01-28 00:57] falls asleep +[1518-03-03 00:01] falls asleep +[1518-08-23 00:07] falls asleep +[1518-02-07 00:49] falls asleep +[1518-07-07 00:57] wakes up +[1518-06-17 00:35] wakes up +[1518-10-23 00:41] wakes up +[1518-10-17 00:03] Guard #1459 begins shift +[1518-09-12 00:06] falls asleep +[1518-08-11 00:02] falls asleep +[1518-02-27 00:20] falls asleep +[1518-09-05 00:14] wakes up +[1518-02-15 23:56] Guard #907 begins shift +[1518-07-22 00:03] Guard #3469 begins shift +[1518-11-11 00:43] wakes up +[1518-07-18 00:36] wakes up +[1518-09-01 00:41] falls asleep +[1518-05-09 00:29] falls asleep +[1518-03-15 00:19] falls asleep +[1518-09-29 23:46] Guard #2593 begins shift +[1518-05-28 00:58] wakes up +[1518-10-01 00:59] wakes up +[1518-05-30 00:01] Guard #2677 begins shift +[1518-07-05 23:51] Guard #1459 begins shift +[1518-02-10 00:00] Guard #349 begins shift +[1518-02-18 00:53] wakes up +[1518-07-12 00:39] wakes up +[1518-11-13 00:57] wakes up +[1518-03-02 00:02] Guard #2677 begins shift +[1518-03-03 00:26] falls asleep +[1518-02-19 23:54] Guard #3539 begins shift +[1518-04-15 00:25] falls asleep +[1518-04-06 00:45] falls asleep +[1518-06-06 00:51] wakes up +[1518-06-13 00:01] Guard #907 begins shift +[1518-10-16 00:18] falls asleep +[1518-10-01 00:28] wakes up +[1518-08-28 00:16] falls asleep +[1518-06-26 00:25] wakes up +[1518-06-01 00:36] wakes up +[1518-09-24 00:52] wakes up +[1518-03-14 00:34] falls asleep +[1518-05-15 00:04] falls asleep +[1518-04-13 00:45] wakes up +[1518-05-24 00:18] falls asleep +[1518-10-29 00:48] falls asleep +[1518-06-09 00:04] Guard #2393 begins shift +[1518-03-12 00:48] wakes up +[1518-04-22 00:14] falls asleep +[1518-03-10 00:49] wakes up +[1518-04-26 00:02] falls asleep +[1518-08-31 00:23] wakes up +[1518-02-26 00:57] wakes up +[1518-09-14 00:55] wakes up +[1518-07-18 00:44] wakes up +[1518-10-25 00:02] Guard #449 begins shift +[1518-09-12 23:54] Guard #1151 begins shift +[1518-07-17 00:07] falls asleep +[1518-03-02 00:17] falls asleep +[1518-05-31 00:21] falls asleep +[1518-11-12 00:42] wakes up +[1518-01-30 00:35] wakes up +[1518-06-28 23:54] Guard #2393 begins shift +[1518-05-25 00:37] wakes up +[1518-07-28 00:14] falls asleep +[1518-09-11 00:48] wakes up +[1518-04-30 00:08] wakes up +[1518-10-29 00:53] wakes up +[1518-10-16 00:59] wakes up +[1518-08-31 00:57] wakes up +[1518-02-08 00:04] Guard #523 begins shift +[1518-05-05 23:56] Guard #1459 begins shift +[1518-03-18 00:04] falls asleep +[1518-05-30 00:55] wakes up +[1518-07-10 00:16] falls asleep +[1518-11-02 00:58] wakes up +[1518-03-18 00:49] wakes up +[1518-10-28 00:45] falls asleep +[1518-07-10 00:03] Guard #2593 begins shift +[1518-03-28 00:59] wakes up +[1518-05-23 00:44] falls asleep +[1518-08-30 00:27] falls asleep +[1518-08-09 00:00] Guard #367 begins shift +[1518-10-08 00:20] falls asleep +[1518-03-31 00:05] falls asleep +[1518-01-30 00:52] wakes up +[1518-02-24 23:52] Guard #409 begins shift +[1518-03-04 23:49] Guard #2017 begins shift +[1518-01-29 00:30] wakes up +[1518-11-02 00:37] falls asleep +[1518-03-25 00:56] wakes up +[1518-04-04 00:02] Guard #2017 begins shift +[1518-04-07 00:57] wakes up +[1518-11-19 00:42] wakes up +[1518-08-06 23:56] Guard #2593 begins shift +[1518-06-26 00:00] Guard #523 begins shift +[1518-11-08 00:36] wakes up +[1518-07-31 00:28] falls asleep +[1518-05-04 00:56] wakes up +[1518-10-23 00:55] wakes up +[1518-03-20 23:56] Guard #3469 begins shift +[1518-05-21 00:14] falls asleep +[1518-02-06 23:56] Guard #1627 begins shift +[1518-09-30 00:02] falls asleep +[1518-11-20 00:12] falls asleep +[1518-06-11 00:23] wakes up +[1518-06-22 00:00] Guard #71 begins shift +[1518-02-02 23:59] Guard #1459 begins shift +[1518-05-25 00:20] falls asleep +[1518-06-18 00:53] falls asleep +[1518-06-04 00:45] wakes up +[1518-09-28 00:34] falls asleep +[1518-07-26 00:19] falls asleep +[1518-07-01 00:37] wakes up +[1518-06-20 00:29] wakes up +[1518-02-14 00:56] wakes up +[1518-05-20 00:23] wakes up +[1518-02-07 00:43] wakes up +[1518-02-11 00:46] wakes up +[1518-07-07 23:46] Guard #367 begins shift +[1518-04-23 00:00] Guard #3413 begins shift +[1518-08-05 00:02] Guard #907 begins shift +[1518-07-10 23:59] Guard #2677 begins shift +[1518-05-12 00:50] falls asleep +[1518-10-28 00:01] Guard #1151 begins shift +[1518-03-18 23:57] Guard #1091 begins shift +[1518-08-20 00:10] falls asleep +[1518-02-12 00:58] wakes up +[1518-03-10 23:49] Guard #907 begins shift +[1518-07-01 00:01] Guard #367 begins shift +[1518-04-12 00:59] wakes up +[1518-06-22 00:28] wakes up +[1518-08-18 23:56] Guard #2393 begins shift +[1518-05-09 00:43] wakes up +[1518-08-01 00:29] falls asleep +[1518-07-06 00:03] falls asleep +[1518-05-11 00:03] Guard #491 begins shift +[1518-04-29 23:57] Guard #1627 begins shift +[1518-11-06 00:54] wakes up +[1518-04-02 00:24] wakes up +[1518-04-26 00:41] wakes up +[1518-05-07 00:02] falls asleep +[1518-09-20 23:59] Guard #2393 begins shift +[1518-09-16 00:01] Guard #349 begins shift +[1518-08-15 00:35] wakes up +[1518-08-21 00:31] falls asleep +[1518-02-16 00:55] wakes up +[1518-05-28 00:57] falls asleep +[1518-07-22 23:59] Guard #907 begins shift +[1518-10-22 00:24] wakes up +[1518-02-21 00:40] wakes up +[1518-09-16 00:39] falls asleep +[1518-11-03 00:57] wakes up +[1518-07-16 00:46] falls asleep +[1518-07-04 00:53] wakes up +[1518-08-15 00:27] wakes up +[1518-11-02 23:59] Guard #349 begins shift +[1518-04-18 00:46] wakes up +[1518-02-03 00:57] wakes up +[1518-06-05 00:28] wakes up +[1518-11-13 23:54] Guard #1627 begins shift +[1518-07-08 00:56] wakes up +[1518-07-13 00:00] Guard #1459 begins shift +[1518-02-06 00:02] Guard #907 begins shift +[1518-01-31 00:45] wakes up +[1518-05-05 00:48] wakes up +[1518-07-06 00:43] wakes up +[1518-06-14 23:59] Guard #1627 begins shift +[1518-10-31 00:44] falls asleep +[1518-02-28 23:51] Guard #367 begins shift +[1518-08-09 00:22] wakes up +[1518-09-16 00:48] wakes up +[1518-11-08 00:57] falls asleep +[1518-07-25 00:43] wakes up +[1518-03-11 23:58] Guard #1151 begins shift +[1518-06-05 23:48] Guard #2677 begins shift +[1518-06-30 00:54] wakes up +[1518-10-09 00:03] Guard #71 begins shift +[1518-06-02 23:59] Guard #907 begins shift +[1518-05-28 00:36] wakes up +[1518-06-05 00:14] falls asleep +[1518-06-17 00:14] falls asleep +[1518-03-20 00:19] falls asleep +[1518-08-25 00:01] Guard #491 begins shift +[1518-05-30 00:46] wakes up +[1518-09-23 00:59] wakes up +[1518-08-27 00:41] wakes up +[1518-06-04 00:53] wakes up +[1518-08-31 00:03] Guard #907 begins shift +[1518-07-14 00:58] wakes up +[1518-07-29 00:03] Guard #2593 begins shift +[1518-03-29 00:01] Guard #2677 begins shift +[1518-03-07 00:03] Guard #71 begins shift +[1518-06-09 00:41] wakes up +[1518-10-23 00:02] Guard #367 begins shift +[1518-10-20 00:43] wakes up +[1518-03-30 00:40] wakes up +[1518-06-27 00:38] falls asleep +[1518-09-27 00:29] falls asleep +[1518-11-05 00:23] falls asleep +[1518-03-05 00:59] wakes up +[1518-05-03 00:00] Guard #2081 begins shift +[1518-03-28 00:39] falls asleep +[1518-04-21 23:58] Guard #2017 begins shift +[1518-06-30 00:03] Guard #409 begins shift +[1518-06-29 00:45] wakes up +[1518-06-23 00:05] wakes up +[1518-08-17 00:57] wakes up +[1518-03-08 00:57] wakes up +[1518-03-26 00:20] falls asleep +[1518-06-21 00:38] wakes up +[1518-02-25 23:57] Guard #523 begins shift +[1518-03-01 00:11] wakes up +[1518-03-10 00:03] Guard #907 begins shift +[1518-08-24 00:02] Guard #409 begins shift +[1518-08-27 00:49] falls asleep +[1518-05-10 00:57] wakes up +[1518-03-22 23:53] Guard #3413 begins shift +[1518-05-01 00:48] falls asleep +[1518-04-03 00:58] wakes up +[1518-06-28 00:22] falls asleep +[1518-06-01 00:59] wakes up +[1518-03-29 00:37] wakes up +[1518-11-23 00:01] falls asleep +[1518-09-19 00:51] wakes up +[1518-03-27 00:30] wakes up +[1518-07-22 00:49] wakes up +[1518-09-30 23:58] Guard #1151 begins shift +[1518-11-09 23:59] Guard #3539 begins shift +[1518-02-11 00:01] Guard #3469 begins shift +[1518-08-27 23:57] Guard #1151 begins shift +[1518-09-28 00:43] wakes up +[1518-03-04 00:59] wakes up +[1518-08-16 00:44] wakes up +[1518-10-20 00:38] falls asleep +[1518-04-13 00:33] falls asleep +[1518-04-27 00:57] wakes up +[1518-08-26 00:04] Guard #349 begins shift +[1518-10-07 00:35] wakes up +[1518-07-23 23:50] Guard #2393 begins shift +[1518-10-21 00:36] wakes up +[1518-04-02 23:58] Guard #3469 begins shift +[1518-07-06 00:33] falls asleep +[1518-11-20 23:58] Guard #2593 begins shift +[1518-09-01 00:42] wakes up +[1518-06-08 00:56] wakes up +[1518-04-27 00:00] Guard #2677 begins shift +[1518-10-11 00:09] falls asleep +[1518-02-21 00:43] falls asleep +[1518-10-21 23:56] Guard #2087 begins shift +[1518-09-15 00:47] wakes up +[1518-04-24 00:08] falls asleep +[1518-06-20 23:57] Guard #71 begins shift +[1518-05-31 00:59] wakes up +[1518-02-02 00:10] falls asleep +[1518-08-29 00:55] wakes up +[1518-03-30 23:50] Guard #907 begins shift +[1518-10-26 00:56] wakes up +[1518-07-23 00:22] falls asleep +[1518-04-02 00:52] wakes up +[1518-07-12 00:14] falls asleep +[1518-02-18 00:22] wakes up +[1518-08-31 00:42] falls asleep +[1518-10-11 00:58] wakes up +[1518-04-14 00:02] Guard #71 begins shift +[1518-02-28 00:28] wakes up +[1518-10-17 00:32] wakes up +[1518-05-25 00:56] wakes up +[1518-10-02 00:58] wakes up +[1518-07-27 23:58] Guard #907 begins shift +[1518-10-12 00:57] wakes up +[1518-06-28 00:35] wakes up +[1518-03-22 00:57] wakes up +[1518-11-17 00:38] wakes up +[1518-09-22 00:36] falls asleep +[1518-07-30 00:53] falls asleep +[1518-08-26 00:29] wakes up +[1518-09-11 00:01] Guard #151 begins shift +[1518-03-21 23:57] Guard #2393 begins shift +[1518-07-14 00:49] falls asleep +[1518-10-30 00:22] falls asleep +[1518-02-22 00:32] falls asleep +[1518-04-28 00:10] wakes up +[1518-07-06 23:57] Guard #151 begins shift +[1518-06-17 23:56] Guard #409 begins shift +[1518-01-30 00:20] falls asleep +[1518-07-20 23:46] Guard #151 begins shift +[1518-03-26 00:48] wakes up +[1518-06-16 00:33] wakes up +[1518-08-22 00:42] wakes up +[1518-03-22 00:50] wakes up +[1518-05-13 00:34] falls asleep +[1518-06-13 00:56] wakes up +[1518-04-15 23:56] Guard #151 begins shift +[1518-03-02 00:46] wakes up +[1518-05-17 00:56] wakes up +[1518-10-29 23:56] Guard #2593 begins shift +[1518-10-28 00:56] wakes up +[1518-05-16 00:09] wakes up +[1518-02-01 00:59] wakes up +[1518-03-22 00:47] falls asleep +[1518-04-08 00:49] wakes up +[1518-09-05 00:08] falls asleep +[1518-07-03 23:50] Guard #409 begins shift +[1518-07-06 00:14] wakes up +[1518-02-03 00:56] falls asleep +[1518-08-04 00:02] Guard #409 begins shift +[1518-08-30 00:57] wakes up +[1518-10-05 00:52] wakes up +[1518-06-07 00:33] wakes up +[1518-05-27 00:35] falls asleep +[1518-07-27 00:41] wakes up +[1518-10-13 00:11] falls asleep +[1518-04-04 00:56] falls asleep +[1518-07-16 00:54] falls asleep +[1518-05-17 00:48] wakes up +[1518-07-13 00:41] wakes up +[1518-04-30 00:33] falls asleep +[1518-08-13 00:54] wakes up +[1518-04-04 00:37] falls asleep +[1518-09-09 00:03] Guard #2393 begins shift +[1518-07-08 00:41] falls asleep +[1518-09-07 00:36] falls asleep +[1518-04-29 00:00] Guard #2081 begins shift +[1518-07-27 00:07] falls asleep +[1518-09-10 00:18] falls asleep +[1518-04-17 00:00] Guard #151 begins shift +[1518-10-11 00:00] Guard #367 begins shift +[1518-09-13 00:13] wakes up +[1518-06-12 00:52] falls asleep +[1518-08-17 00:04] Guard #367 begins shift +[1518-08-23 00:00] Guard #2677 begins shift +[1518-03-25 00:18] wakes up +[1518-07-16 00:56] wakes up +[1518-10-14 00:00] Guard #409 begins shift +[1518-04-05 00:03] falls asleep +[1518-06-04 00:52] falls asleep +[1518-03-25 23:57] Guard #2677 begins shift +[1518-04-15 00:14] wakes up +[1518-09-29 00:07] falls asleep +[1518-08-10 00:00] Guard #449 begins shift +[1518-06-11 00:56] falls asleep +[1518-04-04 00:27] falls asleep +[1518-08-02 23:56] Guard #2017 begins shift +[1518-05-31 23:59] Guard #2081 begins shift +[1518-10-03 00:51] wakes up +[1518-11-10 00:38] wakes up +[1518-10-14 23:50] Guard #523 begins shift +[1518-10-05 23:58] Guard #349 begins shift +[1518-07-16 00:49] wakes up +[1518-02-07 00:38] falls asleep +[1518-09-17 00:03] Guard #151 begins shift +[1518-03-31 00:46] wakes up +[1518-03-23 23:58] Guard #523 begins shift +[1518-09-19 00:49] falls asleep +[1518-04-16 00:59] wakes up +[1518-02-25 00:03] falls asleep +[1518-04-01 00:06] falls asleep +[1518-04-28 00:56] wakes up +[1518-05-24 23:57] Guard #71 begins shift +[1518-04-09 00:54] wakes up +[1518-06-15 00:54] wakes up +[1518-09-09 00:51] wakes up +[1518-11-08 00:58] wakes up +[1518-06-12 00:02] falls asleep +[1518-03-14 00:15] wakes up +[1518-03-13 00:28] falls asleep +[1518-09-13 00:00] falls asleep +[1518-08-19 00:20] falls asleep +[1518-05-08 23:58] Guard #2393 begins shift +[1518-02-16 23:57] Guard #491 begins shift +[1518-08-01 00:59] wakes up +[1518-02-02 00:00] Guard #1459 begins shift +[1518-02-05 00:52] wakes up +[1518-09-17 00:40] wakes up +[1518-10-19 00:38] wakes up +[1518-04-11 00:51] wakes up +[1518-03-09 00:16] wakes up +[1518-08-24 00:46] falls asleep +[1518-07-30 00:20] falls asleep +[1518-03-17 23:48] Guard #3413 begins shift +[1518-10-26 00:30] falls asleep +[1518-09-13 00:17] falls asleep +[1518-02-15 00:30] falls asleep +[1518-07-19 00:26] falls asleep +[1518-06-06 00:01] falls asleep +[1518-03-05 23:58] Guard #3413 begins shift +[1518-11-01 00:09] falls asleep +[1518-09-25 00:49] wakes up +[1518-02-03 00:21] falls asleep +[1518-05-19 00:26] falls asleep +[1518-09-15 00:57] wakes up +[1518-08-08 00:03] Guard #2017 begins shift +[1518-08-27 00:13] falls asleep +[1518-07-13 00:28] falls asleep +[1518-08-28 00:56] wakes up +[1518-02-24 00:46] wakes up +[1518-06-03 23:59] Guard #3469 begins shift +[1518-03-18 00:10] wakes up +[1518-11-04 23:57] Guard #2087 begins shift +[1518-09-01 00:59] wakes up +[1518-10-10 00:20] falls asleep +[1518-02-04 00:12] falls asleep +[1518-05-25 00:50] falls asleep +[1518-09-24 00:00] Guard #449 begins shift +[1518-08-10 00:29] falls asleep +[1518-06-04 00:43] falls asleep +[1518-06-18 23:49] Guard #1459 begins shift +[1518-03-21 00:16] falls asleep +[1518-06-12 00:58] wakes up +[1518-04-04 23:46] Guard #2017 begins shift +[1518-10-19 00:51] falls asleep +[1518-05-15 00:27] wakes up +[1518-06-07 00:20] falls asleep +[1518-08-20 00:00] Guard #1627 begins shift +[1518-02-10 00:36] wakes up +[1518-04-11 00:39] falls asleep +[1518-02-18 00:38] falls asleep +[1518-07-26 00:44] wakes up +[1518-10-13 00:07] falls asleep +[1518-08-11 00:56] wakes up +[1518-06-02 00:39] wakes up +[1518-04-29 00:54] wakes up +[1518-05-18 00:06] falls asleep +[1518-11-17 00:04] falls asleep +[1518-06-08 00:15] falls asleep +[1518-08-29 00:38] falls asleep +[1518-05-31 00:04] falls asleep +[1518-02-28 00:54] wakes up +[1518-10-25 00:15] falls asleep +[1518-02-27 00:37] falls asleep +[1518-04-28 00:00] falls asleep +[1518-10-10 00:59] wakes up +[1518-04-15 00:50] wakes up +[1518-02-18 23:59] Guard #1091 begins shift +[1518-05-02 00:43] wakes up +[1518-02-05 00:00] Guard #1627 begins shift +[1518-11-22 23:47] Guard #151 begins shift +[1518-07-07 00:33] falls asleep +[1518-11-23 00:55] wakes up +[1518-04-16 00:42] wakes up +[1518-11-04 00:02] Guard #2677 begins shift +[1518-03-18 00:45] falls asleep +[1518-11-14 00:08] wakes up +[1518-06-10 00:59] wakes up +[1518-09-02 23:51] Guard #907 begins shift +[1518-06-14 00:42] wakes up +[1518-02-03 23:58] Guard #2593 begins shift +[1518-07-18 00:42] falls asleep +[1518-02-18 00:33] wakes up +[1518-11-15 23:57] Guard #2393 begins shift +[1518-05-14 00:30] wakes up +[1518-03-23 00:50] wakes up +[1518-10-06 00:16] falls asleep +[1518-01-28 00:40] falls asleep +[1518-05-16 00:12] falls asleep +[1518-07-22 00:23] wakes up +[1518-08-04 00:46] wakes up +[1518-07-05 00:44] wakes up +[1518-08-20 00:43] wakes up +[1518-09-01 00:00] Guard #2393 begins shift +[1518-02-22 00:44] wakes up +[1518-05-19 00:33] wakes up +[1518-10-11 00:14] wakes up +[1518-09-07 00:41] falls asleep +[1518-10-30 00:56] wakes up +[1518-06-01 00:39] falls asleep +[1518-04-09 00:04] Guard #2677 begins shift +[1518-03-09 00:05] falls asleep +[1518-08-16 00:00] Guard #2081 begins shift +[1518-06-04 00:27] wakes up +[1518-10-18 00:48] falls asleep +[1518-03-12 00:57] falls asleep +[1518-08-23 00:29] wakes up +[1518-07-13 23:56] Guard #367 begins shift +[1518-05-06 00:13] falls asleep +[1518-07-31 00:00] Guard #449 begins shift +[1518-08-20 00:31] falls asleep +[1518-10-27 00:07] falls asleep +[1518-03-03 00:13] wakes up +[1518-08-03 00:27] falls asleep +[1518-01-29 00:08] falls asleep +[1518-10-14 00:35] falls asleep +[1518-04-27 23:46] Guard #2017 begins shift +[1518-10-26 00:44] wakes up +[1518-05-18 00:51] wakes up +[1518-08-23 00:34] falls asleep +[1518-11-22 00:32] wakes up +[1518-07-30 00:02] Guard #2087 begins shift +[1518-05-02 00:06] falls asleep +[1518-03-13 00:08] wakes up +[1518-02-28 00:25] falls asleep +[1518-07-31 00:46] wakes up +[1518-04-16 00:50] falls asleep +[1518-09-06 00:55] wakes up +[1518-02-12 00:05] falls asleep +[1518-08-06 00:56] wakes up +[1518-03-24 00:48] wakes up +[1518-07-25 00:27] falls asleep +[1518-01-30 00:58] wakes up +[1518-04-06 00:47] wakes up +[1518-09-21 00:48] falls asleep +[1518-05-24 00:39] falls asleep +[1518-05-01 00:52] wakes up +[1518-02-11 23:46] Guard #1459 begins shift +[1518-06-17 00:03] Guard #151 begins shift +[1518-03-07 23:58] Guard #2593 begins shift +[1518-04-02 00:49] falls asleep +[1518-03-20 00:00] Guard #2087 begins shift +[1518-04-05 23:58] Guard #2087 begins shift +[1518-02-14 00:00] Guard #151 begins shift +[1518-04-30 00:54] wakes up +[1518-05-06 00:57] wakes up +[1518-09-23 00:46] falls asleep +[1518-11-02 00:02] Guard #71 begins shift +[1518-07-14 23:50] Guard #523 begins shift +[1518-07-12 00:46] falls asleep +[1518-08-09 00:48] falls asleep +[1518-11-13 00:28] falls asleep +[1518-02-12 23:52] Guard #523 begins shift +[1518-04-14 23:46] Guard #409 begins shift +[1518-08-14 00:02] Guard #2593 begins shift +[1518-06-09 00:23] falls asleep +[1518-09-07 00:37] wakes up +[1518-02-09 00:40] wakes up +[1518-05-15 00:52] wakes up +[1518-09-01 00:37] wakes up +[1518-09-25 00:15] falls asleep +[1518-04-17 00:35] falls asleep +[1518-03-07 00:20] falls asleep +[1518-06-25 00:56] wakes up +[1518-10-02 00:28] falls asleep +[1518-05-16 00:07] falls asleep +[1518-05-24 00:00] Guard #367 begins shift +[1518-06-29 00:00] falls asleep +[1518-07-12 00:00] Guard #3413 begins shift +[1518-07-25 00:29] wakes up +[1518-02-15 00:02] Guard #907 begins shift +[1518-03-22 00:53] falls asleep +[1518-04-12 00:57] falls asleep +[1518-08-09 00:06] falls asleep +[1518-02-05 00:44] falls asleep +[1518-07-19 00:00] Guard #2081 begins shift +[1518-05-22 00:54] wakes up +[1518-06-30 00:48] falls asleep +[1518-10-25 00:45] wakes up +[1518-03-04 00:33] falls asleep +[1518-11-23 00:44] wakes up +[1518-03-11 00:00] falls asleep +[1518-05-26 00:59] wakes up +[1518-09-06 00:29] wakes up +[1518-08-22 00:04] Guard #523 begins shift +[1518-11-14 00:56] wakes up +[1518-02-13 00:03] falls asleep +[1518-07-26 00:51] falls asleep diff --git a/2018/04/src/main.rs b/2018/04/src/main.rs new file mode 100644 index 0000000..2b6c13b --- /dev/null +++ b/2018/04/src/main.rs @@ -0,0 +1,176 @@ +use std::collections::HashMap; +use std::io::{self, BufRead}; + +use chrono::prelude::*; +use regex::{Captures, Regex}; + +#[derive(Debug)] +struct Entry { + date: DateTime, + event: Event, +} + +#[derive(Debug)] +enum Event { + BeginShift { guard_id: u16 }, + FallsAsleep, + WakesUp, +} + +enum State { + Default, + Guard(u16), + FallsAsleep(u16, DateTime), +} + +fn date_from_captures(caps: &Captures<'_>) -> DateTime { + let year = caps + .get(1) + .expect("faild to find year") + .as_str() + .parse::() + .expect("faild to parse year"); + + let month = caps + .get(2) + .expect("faild to find month") + .as_str() + .parse::() + .expect("faild to parse month"); + + let day = caps + .get(3) + .expect("failed to find day") + .as_str() + .parse::() + .expect("faild to parse day"); + + let hour = caps + .get(4) + .expect("faild to find hour") + .as_str() + .parse::() + .expect("faild to parse hour"); + + let minute = caps + .get(5) + .expect("failed to find minute") + .as_str() + .parse::() + .expect("faild to parse minute"); + + Utc.ymd(year, month, day).and_hms(hour, minute, 0) +} + +fn main() { + let re_begin_shift = + Regex::new(r"\[(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})\] Guard #(\d+) begins shift") + .expect("failed to build regex"); + + let re_falls_asleep = Regex::new(r"\[(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})\] falls asleep") + .expect("failed to build regex"); + + let re_wakes_up = Regex::new(r"\[(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2})\] wakes up") + .expect("failed to build regex"); + + let mut entries = io::stdin() + .lock() + .lines() + .filter_map(Result::ok) + .map(|line| { + if let Some(caps) = re_begin_shift.captures(&line) { + Entry { + date: date_from_captures(&caps), + event: Event::BeginShift { + guard_id: caps + .get(6) + .expect("failed to find y") + .as_str() + .parse::() + .expect("faild to parse y"), + }, + } + } else if let Some(caps) = re_falls_asleep.captures(&line) { + Entry { + date: date_from_captures(&caps), + event: Event::FallsAsleep, + } + } else if let Some(caps) = re_wakes_up.captures(&line) { + Entry { + date: date_from_captures(&caps), + event: Event::WakesUp, + } + } else { + panic!("failed to parse line: {}", line); + } + }) + .collect::>(); + + entries.sort_by_key(|entry| entry.date); + + let entries = entries; + + let mut minute_asleep = HashMap::new(); + let mut minutes_asleep = HashMap::new(); + + let mut state = State::Default; + + for entry in &entries { + match (state, &entry.event) { + // Default. + (State::Default, Event::BeginShift { guard_id }) => { + state = State::Guard(*guard_id); + } + (State::Default, _) => panic!("oh no"), + + // Guard. + (State::Guard(_), Event::BeginShift { guard_id }) => state = State::Guard(*guard_id), + (State::Guard(guard_id), Event::FallsAsleep) => { + state = State::FallsAsleep(guard_id, entry.date); + } + (State::Guard(_), _) => panic!("oh no"), + + // FallsAsleep. + (State::FallsAsleep(guard_id, date), Event::WakesUp) => { + state = State::Guard(guard_id); + + for m in date.minute()..entry.date.minute() { + minute_asleep + .entry((guard_id, m)) + .and_modify(|x| *x += 1) + .or_insert(1); + } + + let duration = entry.date - date; + + minutes_asleep + .entry(guard_id) + .and_modify(|x| *x += duration.num_seconds()) + .or_insert(0); + } + (State::FallsAsleep(_, _), _) => panic!("oh no"), + } + } + + let (guard_id, minutes) = minutes_asleep + .iter() + .max_by_key(|(_, asleep)| *asleep) + .expect("failed to find guard"); + + let (minute, _) = minute_asleep + .iter() + .filter(|((guard, _), _)| guard == guard_id) + .map(|((_, minute), total)| (minute, total)) + .max_by_key(|(minute, total)| *total) + .expect("failed to find minute"); + + println!("part.one={}", *guard_id as u32 * *minute); + + let (guard_id, minute, _) = minute_asleep + .iter() + .map(|((guard, minute), total)| (guard, minute, total)) + .max_by_key(|(guard, minute, total)| *total) + .expect("failed to find guard and minute"); + + println!("part.two={}", *guard_id as u32 * *minute); +} diff --git a/2018/05/Cargo.lock b/2018/05/Cargo.lock new file mode 100644 index 0000000..583b5e3 --- /dev/null +++ b/2018/05/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "day-05" +version = "0.1.0" + diff --git a/2018/05/Cargo.toml b/2018/05/Cargo.toml new file mode 100644 index 0000000..1cae2ab --- /dev/null +++ b/2018/05/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-05" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/05/example-01.txt b/2018/05/example-01.txt new file mode 100644 index 0000000..8637b35 --- /dev/null +++ b/2018/05/example-01.txt @@ -0,0 +1 @@ +dabAcCaCBAcCcaDA diff --git a/2018/05/input.txt b/2018/05/input.txt new file mode 100644 index 0000000..9babfab --- /dev/null +++ b/2018/05/input.txt @@ -0,0 +1 @@ +tvVcCtTEedPpvVDaAtfbBxiIXFMnNEPpeiInAaNjFiIrRfLMmiIlJAamPpVviIcPpaACHKkhcvNnVhXxtTsSTtbBHUvmMVuUAakKhHyQqYuayYAaAYWwbBKkyuUCTdDgSsbBIwWikKZzOdDiQqeEbmMBIogvhHvVqUuQTyYtVBbeEvVjqQEeJGkKRrHqacCAtTYcCKkyQQqhoOCGgWwMsSjrRJvvVbBwWLlNnVZzZzmjJKPpkbBciIHhwWhHeBUubyDdYHhRfFASsAaJPpbBjiIarESsGcCLlEQqqryYRnNQQqIiTtvVrXbBMmdDxRsKkeEfoOFwWdDaEeLlAbBSnHhIkKidaAaAciICDTtNoOgRrGRAaDdrEfFcCushHJjxXhSsBcCbTtMNncCmXxxAaMNnvSsBbVmSXrRxBGgbsUuZyFfFfYNnzSaAqQJVvjIRrieESsEeTZMmzTAxXaTmMttNnuUhHzZtDuUdnNsXxJjwoOWCcFfeiSsoOIEzZbBxQqjJoDduUqQOgGWwIiIMmCcFvVfiVBbLXxlabBAvaAHhXUuXSsxrRVbBcCvaAhQqHVdLlHhDnNvtTsDdJjnlLVvtdDTAHhaNOofGqQkKgmTtyYMfFFfxTtBLlFLvVlSsbBfLlLWEewvVvgGVjFfHhJllLKkbvQqzZmtTjWwJMVXxfFXAiIaFwWBbuvVUNnSGbBgGWwgKtfFTwOtTyYouUjJWRraAMmqQMmfiIFpPyDdYZzjzZJpsSPauUxXAcCMmQqlLkYKkpPAaEekKSogGOsyUezZEueoOCcEaAbLlsSdHhDSKkslLeoOEVvhHBNnRNnrHPphncCXxtJjLqQlTdzZDNRrqxXQrEeZzZzDdVvwgGCcWEeHDdvFfUuVhJRrVvdDdDjzbBcCZCcoONJTtPpjgGlLyYuUmkKMOATtsSaovVnjJnNaAnNrRPYyCcpdDjTtdpPgGhzZHDnNNEenAbBamoOquUIiEqQYyBbYylLeTtnNQMNYQquxgGXULlyBbEeYyYynzFfZUmTteEPAplLPlLWwapiIsWJjGgEeJHNnhNKgvVGknjlcCFfLoOaAZHhzwgSswWKkGucCUSpPvyYdYZzyjJxYyXsSVvbBDjJiCcIgGMmlLvVgRrGhuUFfdSUusZzPpDHPpyYJAjJafFjjstTGgdDTtSYwWwWbRrBcyVdDvfFzZrTtRXfFxQPpqNnQqBblqQLquPpBbUvFRrfFfVnbBNQgZzaACOOzxXZoobBGgHhkKsScqrRQGceECAagTtIgGzZiidATtaXxsSWjhHJwxXzZDmMPprqQUuRIBWwWoObBMmqQwbyYeEHhaACcPtTeEpYytKkTYyGLgqQGgOBbEeocCGcvVlNnLhXxjJHClhmMLlHbBZzkUuAaKrRkKRbutThdDHZzUmMBCcMmrFWwPmMpfWgvNnVGUuAagGzZIizZggHhGyYPpOiIrRIiGBbgAaBOobRcCroEemMHIiNntTtzgGvVAjJKkZzcCXBbfRrFAXxaxGghyYHDhHbTtAuUKkaBdWwCcpGgwWeEPldxtTXDdpPDLUuEFfezcCZQqcCjfbBFJgGFTtBbftXxAPpaQXXxCcuURrxuUZAazQqMmnNQQDdqwWvVqfFYycCZzqMAamAaTzZoIixXOiILmMLIkKwWxXiIiMwQUuqWOoSsSspPxXvVbgGBJjmdVVvvDfFGZLsQqSfFlzxXNncCBCcYybTtoEemMKkOoOvVqQkKgjJMRrkKqQoZzOHUkKSsCxXLlcuoNcCnYyUulZlpPmMLeEmMzBbiIPpkyYKrRtKkvVTkKgGzZKubngGNBsSUBoOIMmibkCcZaXxAUuSeEszPIEeiOoGgDdCcVFfdkKDAaaAfFFfhHBKkbIqQaABAabmofFOMyYfFrRxaAXNnQxXqaAimWwMwWxNnWwXvbyYHhBQqnNjrRJiIcCJrlLREUJjuJjeqQmMHgGhzfFoOSsOoQmRrMqKksrRSaANnpPrROdDxbBPWwpXSNnsrcCRrFfRlLNnXxijmtTtTcCSszwWZzoOZMXqQxSsODrRdXxpgGeEPowGgpPiIWgGZztcCDdTJITPwWdoODVnNvpROoyYrQZATtazyYvCcVHhqxAaXeEPpvIiCqQcNnJwWFfZzuUoNndDOedDEgsSGeryYJKkpPxDdXRNnWwrFFffGuAaUmiqQIIiLlbbBQuUqBAaMcBbAalLLlCDdYyEeOZzhHnNiIiodDaArRCcNnqQOLLleaAXxEDdYylPpSsoFzZLlFXxYEtTeYfFyyBbIvVikOoxXKaAdFULlufDLMmdDlBbfXxeDLlOodZzaAaAHhEAaFfoOWwFfPpnNrZjJzqQRmiZzgGABYybaYmMcPpfFjtTjPpJJdYyDdKkUuDprRyybBYYkKeEvVoOLaAlPoOmMIiGgOoiImMdDqfFfCcFRrhOvLXxltzPvVpQoOaANqwWcCGeEgOoQnHhgGEvVeZjJnNzhHHbBXPpxiIQqRxxcCXXnNrhcpPCHhQqrRquUAaKkYpVvoOhHAvuUVFfuUaxXlLJjYBbEewDdLlAkKEeGgaKkWOkKMZPpzmqQAGgaEUuaAKfVvVvrRFtTSskKTtGgYYyySgxXGUuAastTkUTtufFHbPpQqBhihHtTBTtDdbalLAJjGgLlpBbPrtTRlnNGrRgRXxrBbiLlPpImCcMhBbHLfrbBYyhAaGSsUuADRqVRuUrSszZvMmQOorOodaApnNPamMtTLKkdDTtzZFeElaAVvLXcIiCxlRrQqKkjYnXxNtTtTVaAvWwzZyfFXyYxiIJIiwWLpPKeEnNdRrDxdDXOfaAFqQFfrRwWJjKeEGgkkKZzOodvVTtTtgGDAXxeEhAauUHaFQAaqfoOKkXdDxdPnYyNpRrKkuMmUKUukeVvfFkKEYbBQqxXyuUhHHhdNnAaCckKMiImUudDDsvVSewWiIyOoYEfFyYDQqQqxXuQqAaGQqgORwWrlplLqQPLpBbLlrRpMmPkMhHmIiKuqQUIPpiCcCbBcPJfujJUFEeoOjqduUdOoSsDPGgpmzZyemMEYcCzxJjXZdDGgBxXjwWJeDdEUBbuNlLbhHBvVjWwJnXxSDeEdsnNcCFfjJbyrjvVJOoRTLIilvvVEeYynNlLPCcfFMOpPozZmpeEVvyBoOVGgvArRHhIiabeSRrnJsSjRXlLxHYNnyDTtBbdeEcChyXxkCcKixDdNnQqxWwJjXXWpYymMPsbvVBSslLSwIkFfieERfFefFsSToOtENfFnkvVKQqrQtLxXMmriIaVTthwQqYyWHvjJzZTtAUuRvUmMupGgPGgVlxXJjTxXEsSVvvNLlWwUJjlCQqjJcLmMjJmQqmMtPpTAOotPVveEpVHhvAnNJMyYmuUjSsjuUBbuUZjJzKRrbBkJOVvkKosmMSLlwdDcCkKZzFfgTtqyYzZwWQqQkKWPkKNnpdDFfDAahqQHdatqQjJjGgJTAzZCcRDdrcCIidoOxXDFPbBpNKEeXxwWxXDdDdoOVvfYybIiyYpmyYEXUVvsSfFrRgGuxlLBOobrMmRMmcCekZenNEzKzZaAbBgGiOnNoVvIoOhHFfKkgGZkmmMMQqWVvyRrYAazxXzkKZTtsgQqQqPtTpGcRFeAaEdDfrEebcCmgGMGgMmBUukcGgfEnNLHhllysSYSQqPrRpgGtTADdQyYsSYylLsQUuqRpPrNPpOmMKQmtIDdiTMqkxXxpPXAaAaoofFOmMNpPllLLHTtSVvhHliIOoLEeuHhUVvxLjJMmmfWLllfFFfLMiImwkFfKcWwCTuUEetLlfpPeEUTdBbfFDtVvIinCcNEnNeugUuDYyHhdBblzxoOXxXBbxXNnTtZoJjOTAatLmMqKeEkfFTtFcXxCuUfRIXxiaAWwPprTqQseQqDdESGWwvVgRrmMlLZznIiOojJNFfnNeEvWwBbwWLMmUulVySsZzNnErZKuUkzvVRehHzwWzZzZrRZYptQJjqZdDbImMOQHhYyYyqzaWwAZSsoOohHzZiZoOzTtBLOoJjlzQqbBBREeDdpPdRMgGmBbBbnNuUKkrMmQqvVDQoOqUCyYcFfvVUuYyuLbBPdDpCeEcEeudDjfFlLZzvVOosSJwyYwWbBGoOgQqsScCWxwMSzZeEYGdDgUuyMmAamMajJABtTbsAaSzXxZsVRDdrknEerOoUucCJjMmtTPiIiIMJRiKkIrxgGFfXtOlkxXGgKaAfFrRBbyYeEhHMmvVBboaAZzBbODyDdYdUuUFfrGgjfFXpPXxTisSIzuUWwZAZztTdBlSqQtTHhsbBdDcClWwiYcCyInNaAoOLxFfwNAaOonTrRtGekKDdEWYywkBbKQSzZlLyYsfbBFSsEiIkJjKKdDknNJjJjVQCbzZBcinNeEIKZyYRfFGFAafsbBIUuireeQqBbEOoInNwWAaUuTthHiSsSDdsrRnTtNLhHaAiIfFpviIrRtQqKklgGLTmMhHQgVvGqrRolkEeFfKWEpqQPesSwXBfFsSKCctTPpjJrRkUuPpJjtTlDqQqcCQdLlLiKHhjJMyAaYTtTWRrwhHtWwGmeEMdDZRrWxXwgGCclqQLzNZSszOoAllLLGgadDDdTrRtncCPcCpjLlJzZFfqQqQxnNXJjMWBbwZzmIiebsSRIirLlUuhlLHLrRZzlNnjJuPpUWLlLTtyYhHZojoEeOlEeffFjrBbYydDcCuUAacCHbBhxaAeXxEBbXKeEPFIBzLlZrCcbBRXxirlEBbeLrRPpReEIKkKHhGNngiIkMNTtSpOoPTMIibBAasCeJWwcCiIjUuMjJSsTtmKlLAakyOZBbKkwWzAKZzVGgfklLTpPtKxPqXxcCGgIiLlQqmMYyoOvVhHomMOvuUVQgbBGUuYmMyrWwkPpKHhRiIRCEeGgOPpoTtPkBbKaAFvVfpvSeEsSeEpPstIiTVwkDdkoHbBQqMmhOYyHPpGldDFfDnNdgGpPLgZzhdDiCcIKUuDTjMmJozZfFfFpqQdDhHfFSsxXpMmPLlCTzZtuiFfGxXguUgotTOGXxiKkIIkAaTtBbcCtcYMEeiIzhiOHhoPYVvieEIMmypIRrTfFUjJXoOxmsSMHstTUuShTtiIGglLfFHzZgGzZcmmxBCcfFNnyYBbJsSBbuUNnrzZRjbQMmaAcCbnNAaBmOokKNWwrZzmjJIiIiMgiIhgUuGSpSHhYysPsFfnmnNhHBEeeEYykKQqgGKkbssSZrfpPfdAasSDFtTXxzeEHHwWhhZeEEexXYypNnPYoYyOyrRIibHhhHBtTLjJObBoUuogGOvVlPpEwWMmGuIiUIuUHhiEezZjJfFjJMmgkKZujJvVUzyYkKFfePVFfMmFhZNnxXvKkGgLbBlQGghHyYqZzPtCvVfaIiXxiIBbUXxuNTtgmMhHrxXnCcoONRkKkAaPprRKGDdcWmyuhHUYCtTKzwWEeZYySsBqQzZERryGgYBbHhyWwdDcCXuUPpxAalLZzYSsmeEMyYoOtTTyYtiIZmMmMgIKxXEedDAEvQqVKkmGgMnNTKkwWhHavVGgWIlSmMdDsSsuUVWDcyYCdhhHHnlLQFfcCIRriRrTfFtEeDdErRegjeEhNnHMUuZzmJuUWwGAHhaaArbBmMMmZzbBNnRgGqQzsUueESZNZzntTpPQnNapvVVFfRrMZzaAoFfliIMxXmCcyYvVuPhSsHbgGBlMpPmfHhkKFLxXIiQqUuVDdWlvVLwjcSsWwvVOfFoLlCAPVFfvpPfFjJOopqQRraQqvKKkzXxZaAUukkKbtTvVzqjJQHkKaVYfTtVVvyYvZzdaADFwIgGioOWyvsLFGgMbkKBeEjJGgmfiPpmOoMXxZzIVvlkZzZugGavVFCqQUMmucfFfyHhtTzZTPDdNAMmHhcyYCanBdDsSFtmMTRLlRSdvVLzZleEzZBLdDNAanlQJjykKcVoOvCDLldlOZztTFisSIuUDdcBRrKxXeJjWjttsnNUuxIDpuUrrzZIWdsSDErRxXoOjMZzFIdyYBDZzdoORrZzAaGgjhgGRaArZzEeXAhaAHZzYUuQqysxTCcMYuUYhXxHMStzZJjRrSsTHtTVvawIRVvroGgOhIyiEenNIMmosSAaOkKflWwXxAaiAaHhyYyYoOqyYQXxIbkcTtCuZzqQtTxXSbBwWsjYydOZzRrAQqkKaTtKdDbxXlLBkseEYySokKDorRvxXVqQnNwWOJtXxtiIaAVvOrlLRosAameVvvVEfFVvNjJngGsSMNnuUgGlOQsanVvMmNHhAkKScClLfFOofFjJzZwsSqQWqDdihvXlLxNhHnEMmfHhTLKkAaljnNJVvYWwytFcCMnwEeWfRjgGdDcOoqMPDdKkptTmlLQhpPRJjeEKcCsSkGIiVvnKpNQCcCcqdDLlnuKkUuaAeEshHSUGmMcCkKLVvzZluUpPgGgzZktTMmUlzZLaWwpPaAkmJjQqiKhQqAaRrVYvnNZzKkVqNnNxXxBbSsXiWVyYvwWAavJjBbrRVwHsSjJCOorRLlwWOcCocmVvHhsLlBbSFfuCcbaNnAFSsJYyPZlwWieEwWgxSsXGQLlQPpRrvtTrbBRvlLOCcYKkEeyozZYyfFqQHhPpaGWHtThXFZzfxwkyYyYPfFDdzgGGgRyYrlLaAZZzXmMxGgpEIOoixgGXGggGEeMmeUuYyIiLlVhHvrRFrlLRuUHTAPpYyatamMYygGSslLxlLwWhHTtCVvcAaHXxhBbcnNsShHNnJXxNmmnqQLltOntWwTxXxXmdzZzZpPWwDuUZVvIwWiTlLfrRFtOiIizsSPpbjJBYgiIGyiYyMmUFfeEZmOWwhvroORVHZzCIikKZztTcwbBbljJLBUuhATtaGTtcCgOTYytoRrFftFfTpuUcCzvqQQPcCFfAapqVHIafVvyYjJFsJxUuXLlmMSspbGgxoOXiCcfFjuUtyYThqNnQTtEeFfBbykqQpZdDzXxcCSsSonNYykKQfFIzQqTPptzZzRraTtqQUuIiYyVvASZbBVvzdsSbXxBborDZzMBbrkKRGmeEMgLQqluaAUGgRrVIivVvmpPdWwYyfFMmAawYydDtzYyUuBbHuLWwTuUZpPcTfsOovOFfoVcCPpNRrPPaALgGllLpbBoFYvSsVyfMmOSsaKmMkAqFVvNnpMqrRSsKkyYQvTHhCcAaIirRvhHVcCsbBzIXxieNngUuGEPjJpPppiJjInNeEdDbBHhPqRrolLDdlLMmScsMaAmWwSBqAasqHhQpRnmIZuUzSNnGgoOHmsSMXxgpFbBftTUuRriDdtTKkgsSGIyWwYPXxSsGhROWwoUurVvKkmMtiIqQTYynNVDdlZzLNnvKIioOknLlIWwXxeErRwWiHCdnDdbBNWrRFfcvYcCEIiepDdQjJzZVydDYbZFjDdtcVAwYyBbEeWhHkKpPCeEcacCgGfFLlvpPoOCQqTyBbDdFfQuDQqdIiUkhHKuVvUJkvVZzEeWjJwgGBFfaNnJjIFfuMmJjWwXxQNnqUWDduUqQwXauUUuOXxtdwWDnNTPpMmcjJUlLuAXxaeBbECTvVFfVPpfFXxGgBIiNnjJvVVlLvUKkTtudDhHPpXdkKCwCDCcEeEcAajJCKkefeEFQqfAHOohciIxXMScUjrRJurSCQQqwWPnNpQLlqSsqTtcZzsFtTMQRrTtvGuJjvVnRFfrUurbtTwNnYyWBbBRrBqQkxXqQdDKnNGgGtrRFfTPpjJJjMcCUDdVFguUAaSRkMmKttTCcTIhHOoioTtgGnNcChHOiQvnNVqIWbBBYyepsSRbsSvVMMmXsBbEeQPkKpdDqOoPInnNfFNiWTtEWwFKkfyYuToOFfwWZWaiIAbwWBJvjHXQqIixhJjMGzZgZCcEemMpPGgbKkBzsSGEetTsSgcIDdiLlQrHhgGhvVlmMLadlLDApPHJjxIiBbuUKqQQoeEvNnVOXMCEecMmmMXxmxXxoTiAaInZzNnIiTlLZEezRwhxXcCHQbBYyNBxXlLUubnNiIkRcCRrdDHhJjYjJyJjtTnpPqBbRrrRCcyLdIUBBbxXOzZobWwCoMURXxryYPpjJyYumCcEeIlLUCLlwWMmPTtjJJjcbORpPTuUjiIJrRyYtMMvmMkKNnVKkmlnFfEetTNlLnDdOsTtSoNAanITtidDNrREeyesSEwliPptPsNnYySKkpTvVWKoOHhtTFfkKkwWwWwDNGTtgeVuUwvVWryKbIiBXxGgMmhHaVqPpRrQvpBvVWRrJrcCLCclRaAQdDqGkCGgcKwWVvySsYTtAcCaKkkKQFfIEevNQqrRKknGgVHSVXCSsAIisStMmKkToOabBftTeEPPpfFLljJbBrAcCVvtTaRDQqsFfYEeTzzgGZUulLTtpEwWNVvnDDSsaAbBuULldUuDRGgriIObNnBVvtIiTdDdtTiSYysiVrRvMmImMHhtTuSByYbwWsUGDdsSmqQFOofMNnRrgdJjDcCfFIiIoOsMmnSgGUuuUsboJjlLBbEezRrlLZBbjJzwWwfFWZivlLVPBFfbnNhzPQFfvVYyhHKIcaACiCEGgoOebBVvXZgyhHYGHhzoOZzyYktTJjXxZUusSdDzZqQUubBiIHhqQRTtTtXxrZuOoZzkKwOjJosGgRTIiQMADMTVDdStTZKkzsvnNcCyxXIibEMmeEeotLUVvOPpdoKYyjvVbsGpPgQqNnVpbDbiMsWmMwgGSRVvrPnNptTZzLGgYylZzzsSZdDbRzZrfcCFVETcCbBpEePWRrYtTrRypPbBCIibxXvVEezCcfXmMxTtuUsEeuUZFfWpPCwWcfFwzSEeaALloOoOFZQqBRrZYyluTtjJULnNfFUyDdXUsTpNUunUuKlJjLkORrxxXWupPAaUufFULdDTfFeEDdaAXTtEsFfxcCwagZzGbShHnNtTsOfFQmMHYsSIiyfjJFDdhKkeaAEjUuJIeECcucCDdcNxXjJxVvkNmMnKUuLlLDdjMmveEVdDrRSsnNoHhvVoOGkDdnNQqXuYsSiIfFyUnNEepNQzchHiIbBSsBbYIaAioKRrkOyFfFCXpPbjJZztFfThaAZznNDdBQDiIdqbHMmecPoOpOoCjJoOLlcCEuUaiwQqWSWBXiIxbXxwsHRrTtjCcuTOotvhHRrrvmMElLewWYiIylLRrDIHhFfiwTtUugvVOoHUbaAFjZcCIWZzFfwWimMNnNnbBMsbBrRljJYyxIWhHLJBbUujVzOojJLbBAuUaBbUuIrzZJjyYRSpPrRnPpfTtHnHhAobyYBrwWROxXJjaSRVrivZZzzXxXuZzUxioOIkKVMmFfKkpPVAiIRdDcdiIDNvVnMmJjfFcfFZzDKkEeqMjJmBblOoThSsKkHBAicqtRrTgGECczZvHbUuBhvVVeWwfCcaAKkgGeEtTZRrnJjIdhHKkXxSkcVvvVCToOhTFfFoMmbDfkKFdFfMmBMmnNMEenNmMKkDdSslLPpQqRrLnNPafNnYyzeEbnNFiIflsSCwWcyzvJAapzIiIiPpUzZuUUvVLlHhmEeBahHqQkKXFrRhHRsMmRrSQoZzOoOFffuUYyfFxxXXVfboOclLRgrRAKwWrRkaGnmMTsFTiIUuLllLOoECBeEMkKoDbbBgGhHUuBweEixXEeggGyYyYkKGSsIiwWWpPifjOpPUAsSYyjJBbMmayGgEuzRrwWIJjwWIHhnNKkmMtGjNnpPJDdgEpTvVKkdnNQmIiMnNqnDdNrpPXxIdyYKUmMEeupPpPFgGfLCcSsymUuCcIWwBwixwWHhIinOoDdNSSsRrshUuQqSZdsuXMuUmxFkKfVqPpZhpPHReEcCKEeUWwptTkVvHhKsPpBXxDnNFfdeEbWNAcotDQqdTKAaHibBIvVuUAniIhHGgbgnNOVYyKTtkOOOoocCPpeESVvsmLlpPLlUuzTQqOhHoNrRGgfoOCOGCcgpHhPiLlIoLHMmXIbBnNoOiILlFStTsIifqQxXgTtuUHhGiUEeKgQqZzzZkKoGgRrHcCnNgDUQqdDsrsXxoBbNfFneEtTuUOeEGPpgEBxyYXbZOolpPxXLhmMFfrEekTtSUusGghHKRraElLSijgGFWbBwfJEQqhwdlqCctqVvmMLlQSsagGWnJULYxVvYyaAXylEeBbwcCyKkmEHheQqMoORXxHzLZAafFVvwJjSmsSRkKDdNnrMxXuOJjwWsSFfkWGgeLpPlgpFpPiuUFAlrNntVvqQNnUuTYydgZzEeIFfiQzqQqhNnDfgAaNncCFfGwEeWwgaAGzOogGczZCjiITsRJjIiLDdXkRRqIlpwWlZmZzhHMNKkkVvkKKADdayqQYpPqQWwYJIiZzYsSoOSDdJjBxXZgSRrNTtniIBRNnOoVWwvjJrQqIodeUnNwRrjqNnQzaAZpkjJKGGgoXxOQAnRrNjzqQBbZJTFcCftaAHhWwQKxXCinlLXZcUQqHFBhHTtdUeEueKYfHeEhqQWsbBSEewGgRrYyZzFSBeeEEiIRwWrbpZFfbcrRoTtbBEnLlNhHIiVpfFPVBluZzJjUMfFSrRlkXgQwWqYysSNnCczbnsPvVpKkSxbBAavVXAaHUujJDNndvmMiwaAWJjBbTtIxrRDWIfwWLXkqQaFfmdDMAnrTFGggGBgCeEqQQjeEdDdDJdLlfFtqQlhtwFTtMmlqQuoijlLJSsKYQqHhymffFFMmQqWOSaAMgGScCsxUUuujIwWwWQlEdPeEyMmhHUuOBOobTtHVvhJSkKnFCcmMqTZzthHgGpiPWRuWcNnCTuUnzGlLxRwFfgXJQuzZjZzjJWJRJjphjBbFfDdJFwWfHKycYJckKXHsShOoIUDdjLlGQqgnXZbBzmMkKmPqXbBdDTPlgGmMWFfIirVaYQBWcaxMmKkdjJNnDAFncCrRmMcRzHhuUdtSscCEGgeinNbIiBIvoaygdDGJbBRkvPDdLlpvVVrJqJodDBbOjJjHEeFfxdDXUbyYBuPpjJfkKFviIiCcCcmNZzYykKnNnMBbwffFOodxXdrRLlkAaTtNnaCeUuEfwUyhfFIikKUwWxCcXmMRPpYyTtMgGmFflFfcCLrculLgGUFfCAXxHhcCaaARrmmMsSuFkgGCcCcKJjfQqhNjJnwrROTAmbBMZzomMyzZSIimMYysvVRDdrzHhIibqoJfFKkOjJsUuuUNnfUuPpFLluUXgZKkzVeEIiYyLlGgvLlbBtCqQCcAwWnNMkKzZmyYXdDxOokJjwOUeTnNtxKYyGgERAyYBMrlupPUYyDGgsSNjeONcCsSnSsOoVeOonYyNGHQlzRWDowCcQqWObMfCyEeEexNnQqrCuQqUUucRXlklhHLzRrBbxXxEgZzwstTSWGNnxXNIQvuUIwWhxfFOeZzEMsrRcDdUNEeOoWZzjHlLkKXOSkrXwKTceECtQqkkKulLUnqQoOwWhgAaiIKUPkKpuhnNHcyIiYCNyYTtnYaAyXxWaAwlaGgpSsPASsLyKkpPbYyJiILljFfvVGVRAPOovuXnqQNxuEekYDdyKUUzbyYKsbjJmlLMCcgGLRJjrOoNndDWMaAgRrVvEeBbTtLYEtTEebqiHmUuqQlLMFtKkPpTbSshHOeiGqHZnNzdWwDKkhVvxQqcCiPpYTjLnNYyjJxXgkKGiIltrnNRLbBuUZdDzlixYyYjteETJZznjJRGgHITEQqwZEeHhNVvnHhpIMmioZzOPiIFfOoIMmQSsQqHEbBuUpPehPpqFyYthhEeqEebQqBfFQFhHBNnWNnHOwWotOlGVbLzSsZzxXZlxJjaAlBsSMVvmjJcCkmMKjJbPpLHoOONUuzPpZVvaxOoXMmkKACtKkwWAazkTtWYyAapUUuUuNnQquPjoOIiJwyYkoOWTtwKKHLllLhZzxGmMglccTtUaLsxIZAiIgGPpcWwemQqVvMEHhwfuQqUFzWwzZdnRMmUurwWNvVnbBrjkcGjhHUrRkGgcCbBKyYuqQXxvTtzrRZeElLAGRzOowCcWOZYjJCcMYtzSwMNnmEeOmJjMXxbJWsScCsSMaAmBXqbBEqQezZQdDZPpBuUbqQMmuUKQsSqkACrQYrTVvtRCcyqmRrHhnNMeEeXDdyYxDdlLwWAuUaAvpPVaEEhHhHeimmMpPVvTtUHNnhNnHhuAajqQaAJvIivVFDgfkKFtCcTbEejAHHGghIPtNiIxxKkDdLlnNfXxQqXxIXzZxFUuqLlBJzZXxjWwxevGwWEekKGAagJjKzkCcxaAlLcCVOolwIiWLcyYhHCvdnNnYyGLKklhPsuBbkajJTtAKfFUtTcpPiEVeYKQOofxXFLlKuEeqeErRsNFfnStLlpkKQqPSsKnNPXJjUuMmkKxpuUwWyUuxXYPxXilMmLhHIkXxKlDdbcCBIiKkyqWwQYuUoglVaidJiuhbBtSCzZVvcmMOKksXxuDLlEjJedkKqQtTJjAaAhHabktTGLLllgjJDdPbBbeEeEsSjJBprBQqiJjzZzZsSsaAAWUGguUfzZYcChXZqhxXMpPiXxIrvIFfiHhaAfFaAVZEeUuFfzCcsSyaAVKXxlLchdDFZzJzqQZeEDdjfqeErooOODuUdeNnHhETtDdENwWHhhZzHIuIlLrRDdqQIqQipfFQqVGgCcCcBMmoOCzxXdDfFEeWwWwCckKjJdOoagGRryQqlnGwdDYmMydUZzuabByugGUAaYgPpxXPEsSfFgGsiHYyeiMmIVpxXPDdSsgeEdJjrRxXgmUosSOKPpkjmMSfaLlSzAauUHhPprGgRnqkIHbTAanVvQrVsspfFPDdgGSEeneEKknjJnKknNNplgGYyPTtpCcYzZywWEIiZWhAuUatHhylAoGgexXbBEORnNKbBywvuhwPxrPKzDHhdOoYyZTKkrEanNwWqaqQAQhHKkAGgKmePpwNnWCxSMmCpOooOPTgGXtucksUuQqtxXTrRkHJFfQqjGTteEgqQzWTtiIpPcFXTtCWqTtQGGIigKYireExXLlRtXxEeNnZzMmMmsSUJcWXxwWwWpPYdkKDfFLlgGONndCNnkwWpOoPbBUumKoOiLwLlIBbvYbByVUGgQqulLidDWlNnKksbBXSxTteEzOlxUjJNmZzMjGbDaAZWAhHKOokJuKGgkzOohHTtNnFfZmMUBQCqCcMyODQqZSRIirVnNbBIyYhTtHVvikaDfFoXxOpoOTLgCcepPCvNVoOoHXxWpucCUvVKkXkKZzErReFZbTtBvfEejPZiIzHsesYmXgzZCcGmMxsSJtueAgTbBlmYycCsPpOBwRDdmRuUJncwjxXitTOoIkKJaoOALlnQdDqlLEHhetOeMdhIimMPHIkKQqoEehHireERZzbNnWwBJjevLbWBcCmMbdDhtaATqgjNyWwYmMhLlHTtfFZzxHiXvUiImgUPlfdvVibBQUfLtjbBJkZzTttFfTMKkIidHhwUukWhTlLfPpFIwWpxXfFiOoRrIPeEdgdXxDoLlOoDdOhlkXxKeELQeEqxKACcaTBbheEHMmtzZFXxtTyYfDdzZpPAajJmUAaIiuSsMWwTHdDpPbBCzZchrRWzRrBlLPIipWlcCYyqKbzRjMmBwILyXxYBbltvVTetTCcEtTYkzQqxRrNzZnfQqQqhHGaHEeZzmbBsfAKlbBLxWwxRkpJjjJwWFfSoOLLltaoOJrOoRtTSslSKkUuFfcmMClOoLunrRIiIcpEkKTdDFfegGWwsXQHefFEuJvVGHhCjJelLnNUqjJQlLBxnNsiFfIZAazpPnNZFzZcCWwflLCbgGGhikcWwsSWKkwFmeqQcCUuDdHiiIIvLrRlgqEKkgpPGxnNmMdDAaIibBLljpPkLjJlzZZzCHIiDkKiJjIJbdwUuWBfFGhHcCDUAaUuDdUuusEKhWxXCUuEdyYDNntTTirRuUuHnYyPpzZHDRrdIiDkKrRsStTAadDOGBGgbYeEaAaAdeEiIBLQAJjaxXhvVjJHSsypPYaAalNnzZtTaAwWAAaIiJOxXoNVgDxrpppPiIWpFiIbBrRnfFYylzZLERrvzZkXmMwWLuUlIMmhHWQoOqSpPsorzZvkKrRVBxiKZBbzGgkmNsSzRgGEuUehHQkKDdqYeFKkvptnNIcCiUuUujJMmWHJjTVxsSAlOrUuVvvSsxujEedDJFfSLIilOQijEYEeEapPERrNnIieApEnNAanVTHwoqZaAyjBEDxVlLYyRrvTYytzZVIGYygTAUuaRroGxXTrYlwcCWkKBemsjJLlSMmKdDiIUuKmEeMkNtxYiIyrotTUiGGFQTtqQqTtUlKkLoOoVvOCcibqxXWZFOoxXfcCWkVvPoObBjBbrJjEeZUexXxtToOsGgiCcIHBbgGhTyYlHXzgGTtZTYEeIDdzZiyvtNnMLlnwLsSAIcsSeMZIvCgGcViqjzoWibIYyqJjQjJVEevGHdDhTkKEWiInqqQvLlVaEEjJnrDdfFurRBbZzOivVfFZoOzUmseEJBAiIGgKZtTzrVYRdDFzrtTnNfOoFTLlTExXWWwiKnNvrRiLPpVdkKDvlKkBSsHhzAasPUjNnKXxkcCfwrJVDdhAamMHRrvodyGgYOomMwWoGAIKkuUjXOyYwWoMmjYyJtTjJVDpcCdDquUQdMOoyYiQyNnpBbBxawPnNfFpPpjJSHhsbAWwyCUKpfIxXUuBbzfWIiaAmAcpPCtTaWjJXxvYLlyLBbUnaepPEBQaAqnPAcXxqRuNkKyQqooORrsbBotTdswWFfSiHhrgGsSpdDepPdKkKknNkAkKRTtGrRnvVFfNybBYkKtREbyuXxKxvVUufCHWwjdDwWUfFBWXYgGfCqQvyMjJyxXmMkKYxkuihwrSGQqvVsSgEhstTOveOlEeEsSeLozZHhrfFxPcnYECfHlUvRrkBbKqKkiIQkKrVvRbjcCdRDXxPfCSqQsBbnCUuLljJsSwshbTACcOoWOoOZOIUuiXRbuHhUhHzZcvVZnNzCBrtTUupXiIEeoiiOmMPULPaApexZYZzLlyuUmkYlLXxeIiYyPhHZzRrYydizZGgmYyOEkqQtSPqZVvWwDaAdghRrAlQzBbvuuunMUPpumlLNaAUbBUXvVkIJeEcjJHhCvbBPvzZUkpPKCROCTXxPtWwTpCSselYmMJpPjjpPJzLkKDdgGxXhwUuWGgLlQbBOoOEEeeAEUJDxXbBpPrnsZzBDOWwvVodJjfKDKkyYZzyczHhfEeFNYhBbHFOofImMDXxdiKUuhKeQqNvEOoAaHhKkhHpyYPFfgGPkKpxzqAoDdrREeKQbjExXOpLjJgfFGWUkKuYFfNKkpPNnylKlLxXWYzZCcywDSsQWwzZUuVPpiISlFGginNGwWYYycMLlAiIGoOWGdDfJjRsZFfscFFsTkuJtSDHhdSssGWwaQjuUsSLlKyYpFeEfkasgGSuULJjlyYaAACLzZljwWJcgGNCcXszZSxAFOohrRcgTtkWwUuZQqUyPpYXxwdVMmvKkWGsxXgkKGStuUWwpwWiLkvoOMmVIDdqQvfWpTXxPptOKSsFIifkKzibBIZmMMdDFfDSsdmzjJZcNaAzZnGgESApvCcKkDdhHntJjQcIiNnEeUNnrRMJjZPpCCkIiYuUNRECcDhHhHdMhGgHZZkKrTtUOoOPzWwUuUBbkWwsGgbLLQpJijJInsiIDdeESIiNCcJYyoCRfpVRpcBbJnUGgKkpPOokSNVvFfnXxIJjfpQGNbBoOMmcceEbjjJJFYPDfipvVMLQqliIlbdDBkKLsglsrRSSsIiHGTtgBbNtTnhOGgoYNXWwPiQqbNUAamCzrvDTTttKklLdVjJFDdfGgIimMyYhHgeEKRiXkKLSPpsccWwepZzPEeENnNnrpWQZzdBQRrRkKFKkcCKMftJtTMmaARcaQqyaSGgsMnIgGCcSskgGgtWKLlPsRrQcCAaLlquUzmMdlyZzYRXxAamMJOojWtYyDdiNmEnUuhHmZzbVrRvBhPIZQqzPpRrIinNdDidIiMwIyoYGJjPpXeNONlNnZPSTcfFkKlLqiYkrAaNnBbHnPBbZzDlcjyUuEeYgJjUuiIIimbBhHmMackuUmpagGaHzbwfasSSspaANnXMWohHSnNeEzZsSsAfCcpxXoOYbBkZeEsByDVvIiahHfVMcCDdKAxYyENhKSqQpRmMrPRUuMNqryLlyYdDYXxNbMmBqCsScCSsnQcCqNdDDvWwVxuUbEpNYuTqgGQMPpsSSeEswTjMMmykKYWwKkmWbBwPNwWqQAVKUbqQBayDdjgqQhOUoOdFiFmmMrwWRDFgWEeRkKrBbiIXxEebBpOoOovVsPyYpqQOoKkzsSyxDdxGtBbVvTPpgUuXXOoYOZOozFEeeFfbBvVeEhwcwwWWCvVOooslGLYyhHqaAQSqQlLNnwNWwnASngKkofQqFdrRMPhBGzZkDdbCVpQqazZGgIiQejZzcvvXODdIiMCcmLcGlLgntTNOoTtfFBTyYRJUyShIiHiItfBmEeoOoJOoTrHMlLGDdjOJwWGObBKAaBbPpXqZzmMgGfJgGSOPWwWwpCLoOzZDdtrcJjCTtVvhPpaCeEeKYyeEHvVhFBbpkaAVRrvQXxqKJUuCcWHhhqdDQzrjJxfxXFfuDdAMmzYSQPpqsdNnDSszZIrrbBVvukeIitTiIfFvVpRrWyYRrbBtoOTMqQmGQNnqgvkKVwhHMauMkxXKiISscEwDedDEzauUyFfYClLdLLbDdBjJGglzEwWRrEgGcCWwLAVvslUzlLlJnQVxXHrLrGeEgWJjerfoOGgoWQqERrewtTnLzBRyYrJjngoMhHMmHhrRmAaAZhpaBbQhHzqpQCJjGgcIFTtIOrRgzEQcCCcXxppPPxXvsSVLlMmYoYHATtIbBigRhHCjrRaADdXxzDdZJZzSsXKkxIxXHCmYyPPQqgMvVDCNnOhHoAaGgcvsXxicCrVvzZuUzZRfFomMOsgGoKQqkKnNNVIzQNnXxkuUqpPpPQUqQueEkKKqbzqJarRDdJKEeIuZdCCcJQqEeBunNUlWwEhlOEecCXbdDIpPvcVvCZjmaAMJWAQqvdDdEFBbBKkbFffCijnIigOARraAawZvkBYGLlEeNADlzyYrRZlnNoOTgGduPscCJSDoaKktmUuUuApDQoIiOyYJwEeWXwWxDdtPtTJxXHNFfnUiIsYySuIHnNvVhYyVvGlZzsSLgnUxwVRRUBZzbEwWtTexXmMQAGLlrxXmMREeJPpLlNKkRrWwYyTtmbHhCxXXxcIileSFfsiBBNFfnwWULAFgGvVrwhTiIsSDoUuOdzgGZKsxUKkaAxXuAqRrahHACPGgylLRrdDRrHhQDdYrqQAaXdDKkIlCQqcWRsvVSrTxsSQqTbQqNlsSaBMCRlSsLDdqQrphAxXsSeGQAmMniIqDRoxXOlLqdhHaJgGLlZuJjUGkWwKgzbBXxjylNnILlOoRVvkKTtrBbNdDFTUuwBfgQOoCheFAawPRrpWBwPaALxbgaSPSsQqpaRYkKdERQXvVbBxEeTqatTnRvDdVhtTkjfFGNtweEWTnwGJjSscgGzZbBRgLlaTpceEZtTgkKGvpPsiEhHsodDOJIgMWwfFzlwAhHaWLKyHwOVgGebBEJaAehHiIJjteEQQqqTFtiDdwWDaAKCcrYUIgNnRjNMjTtJNrwpPWKDPufEiIpPGuUHhfFRrxtpPTVvVvljJtBxHgGNqpPQnhOovkKucfewuQquUUZzumLWCcbtTgSsGawlLGgYEeyIgFbBxcCzBMQRYEctDWwFeurQqbBRozTorRNnxRrzLlKvVVvgwgGdQPpOTVvkPTvmkPpKaAwuPpMASspLzSsyaOGgKhTedDEfgbBOsYiuULvVnUzsydnNDIiFfznNEenvHhIqBWwuUpEeZPTqQTttxeERMmqzbBZQEBblLXIdJnwbZzZUuBbIFoOETNYyMmZPNboOBhHVpPnOoNvaAsSzZGOAdpUFTaAtWkSGGgbXxBgnIijLcCVvOzxlENnKjQrpDlxTozZrEkKRrlSsHNnhcUuqppPYyPhnNHvlmlLZEevgGPWxeEAadDpqytBbbOlIAaWwwWiDqoRrVurCdcCBbRpPrmMlLeElBbyyYUMmOoAavIrRHAaeEhzEqQeWwCcsWtXiGgeIAaOHhpPozodfMYLnNOoQUIaOJzDKkdFjJIzHhPVvhHbDzZdaABLjGCcFfSKWwwZzZMOvVCcfFTtNYOLlQaADTSvwCcWVFfYjCQqgxbdwWRrlIAlxfObBoFMdDvcLzZBqfTBIHuJjogGFjuUiIiqQmFfDTtZBbzdvHcBbCVrDdRedQQdgGhUuDdetXxfFPqfGgtbOHwKkWRdgpxVvwWioOQqzzAQTtsLlSxDdKkNnVvzSsEtOXZzxXBbxvOCcTLlcCtnNQMmTWwjzlyYNqaCjCTLVvMHlFcCOgTNeEFDyYdNmIPpWyYZbqIoYuUrXzghGgSlNnzvVxgGnNXZCcoODESyYjrgGVJmMsIiwTIQuVvRWbBwTuUTtTmzZhHcRrRmeEiiIIbjGUuMmuHhHAaLlhnWwbBmhGPAaHOisSFxpPbBZjFfMmafFQqfFAJsiIoOuHhGApPRbBrFfxXsBvWwiIYfFZzNYzLejYJjgTFPxpJjPKLlDKlLkNnoeufFIbPwaJgGCcAdKJmMIiIEzwzZWfIbMHhGgmBLtbBZhJjfPUNnuDdeKMmJcCBvYDdiIHFfLtNYyRAQqJjEerHhigKIiAakHNmMuUqOtTOLlXSicpBbFGgebnNBjiIKJjxXToOdDLguuGgSsMhbBHmvpEcCcxXKkCTVvteIiyQqxdDrljkuwqgYhaKbBwcCBiINBbqQnbZZBkMFYyXfFFfFMmfZzxfXxXaRVvrpEeDTtcdDqjJMmCqHUkKKkKkrRlLygfFGQnNkkCJPpjlAaKkLEeMeEaAMwDdWxQxXDzWwQdLjJlFgUuwkKYibBILlybjGgRkYWHhHOdbYgVGMUumGdDRWIipXxxQqLnDYfGoWqtTAwNiITtMQqMNnCcQNnNTxXWwIiIfPpvxHhIZZDRblzRrZylZpURrKkSjJspZMdDcCPIisNnnNUVvzjkkKSBbtTvaMmWwAVlQrRqtTRUuyYymVsSZKQxXqznVvlElwQBzAftTPprHkcEDdHwsSqGkUuIiAaOoiZQAavyYICJDSnNoBrRDFjzJgGjJCcVAavvVvqhHZPpkTtKzWfanNsvtTLioYyOoBsixjJiIyhHKbbBtTBwWzyxNniIkKBDdsSGyYrbBaANntTRXVpPvQLlqWiScvVnOoNIiKVrsMvgGTuKmMkSsLtZXMUuaGARrDLkCqQxvVXHSsOHTxWgGKrRToOQqLNkWwSHmVKFfCABbWYhSecCcprRHdFQEeLjKkiTbBWjYAPROKiKTGgLltuUTPQqCNCJeEBqQQeEBStMfXdpWwPmIiabiyFfxoVNnvOXxLdDlnOowjJlHxXOoeEzZzZGDWwMmMmFwlLWXjJKhHPAZpPAdDCcabNAangteERrgDdgrRNKwnNWfPoOjJtLjFffCcvvVVkWsSwDQTWnXCUufFcYlIiIisUuhCIMRwJrOZhHuGgKkUzMyTUuthbzZuUByYHJjAaFuUfSPyYgCWwCluUYeAYyfFZzaEqQiIGVVlgGLcCLBpPbKEvVfEMAWLnNwWoeEdRrPrsTwtilGgQedPsuUPpSTYyPbBvNVviSdDwWxXLlYbSWPleyKlaZhhuwJtcsjJWwCisShHIcLVGcKpPfFkbWvFfYBuUyYoOVvEeCdDvVcknNxjJSsAzLiaMmBWSFfvXsFSTAEHrCnSLlTSsxXkzZaYtTbfFqkqsJjVlfFdDLssSxXHKpzdDHZYKkISjYySiTvVKkMMKZzvIjZrRLlIAcmIiWYygcpgmKRvVzSsCWwZmEbuUNdYyiVbvsYyNnJwpPoOkFftcCTtTtAjaFRkUuKgcOwfpNyorRODOoMeELBWPlwWVjJOvVpPxXCnQwNahHnNyKJgGjHKJtTRAJzZKTtkssmMDhFYcIclfXxNnnhvVEFfeyMmpPVvHaIiaDdqQttTKksSODjAwWaJmyYUNEBbzZelxFBbYqSsgZtTnNWfFdDInXxNYvVTIPvcHhHJzZSsAjJbsLAaoYHiJjIiIQUaGirjSkgiOoKsSsfFBbxXpPWPkUtkHhETtTBbqQSaAQquUAaETUWrpPREgOXjcFKFJjyDRMmpSuUiIqQHIrFoIiOtLlPjQMGgyBUdDApDLhHsSldPMtTIiXxtdHhlXxbYyBLoGRsSCcGjJNrTVvdMmaYybONGgdDdGTAPaAwCcZGdDfFjtsSBbbTXpYdwWEFfqGgQXPdDaHhAbBwWvByYDdsQqzFfeEECcQxYOcCJdRrnfFkKFSbBskBbHOZzXxPpbwWlLncpPwWolDAtTRRrrFRFoOlbOuUUuWFaAfwvVWtwWTVKBAFPpwWsWMysSAcbNCWAhWIjJaXtucdDCJTrOoNbBAiwgfwWLbCOovYZzPjRlYyLpPhYWwBpffFEMzZLhSsxXxXHlfOopPFHFfmjyYJuUMpMcThLltTEbrRBtTFxoOVvXeenNsoiIfNnaAFmyjbENcpyNniIYmMPcCCQqbVvEBEerEXgGdORrGjTcoOMjrLxlLnNpsSoMyYGgNzZzQTaApPJLljlLdRsYyLNaCCBbEeJIiZyVviessSSMmxnNXdDygFfaAzqQgZzkuRLiJcHhIGeVlLkRrKfFvbDkZzRdkHvVaApPdpppNiKKkkADdnNTEQRWjdDCcAauuUWSswwWurnGRaAFfrFvPsmMJjGgQkKJjZndjJjuDZYVIivyTtbOVvvHhVNnqvYPoOpOVvGgiVGgvOoOoDhHXzOFSswTZcCIizKLELHxcNAyYWnMmGytAlLaTtzZcoOCHhTYNiVvhConRoOnylmMQqKdDQqpMDgsUUXjgGhHTIiSstIpwVgZIkIiDdZyYGgevTDJjMZzmIidetSlExZEKgIiMmvVXrRgGATHLCapWwPeEzIiMmoOMuYlsdyKPpPxGEggqQsSixXGnsrVvCeRChHcSsNZmwnigGeEIameENMfAEePpVxmUJttTJdDkdTgxqQqQNNnsZzwFXxiHFAahHfHqjWwJmzZjJBbLDVbBDFexdcVGqqQQKCceoBOFCRrcfYoOyaCIaBwIEVIHqvVvwWPkKlLqvJfFFShGvVyfFcCcCYicTJJjRrCiVEuyPJjZuiJlgGpQqPoOohzZHOBctTQqKkZzCCcEyYSxziIZXselknNOQDsSIfjAbByYEUukfsPxXaTtAxBbPpHxXEPpEevVwWQhzdeEexKbRrUuBprMmeENnRPkTtjhbnNPpzZBHZfiHYVvCLqLiIXxhnaRDdWstYkXCNuJHxWHrxbYFbBfyBXRqIvVmMicLAzZUADdTvQqwWuUVVIcLlyacdDQjjbdDWwPZzpMmErRwVQqXgEfPOozoOyhBbeYyXOoxOoOoxaVwJTMmtGuSYyIPtaFVvPyYpfDIpPYyfFGgGvVJDoYYugMKkSYREerrDdXbBlLBPMXxmRrBooOCiFcUnxsSacCkfUtaRRAEejIyOoeiIVvzZHZzBSnNsOhaAlLRSXQRrEeTtqUjpPJUuTnfaWYupgRrPYjhHkvVAVvRrvCcwWVwQWkKYYQNnhJcVAnNAxIJjyWwOoKUHLqbQlLgvhTUEwWANfLlFBbPTfFtEEftSmBuHhxdDgyJjyYHhYkpPSAGgYuUeEyzJZkKzZaAkhAmjwfFuAmmCcWkOoVvzEeZmMMSNnErFVvkKQqlLiTmlrRLZVAAaavsKkDdUUesyecCrEjJPpLYyYFfcTUjJhGyoVECWUQjmMTYyGSsfwIiWeEBkVEBAdNWHxGgXxOBbWwuoOYyQqOohWcCwwvshwBYOcDQbtTqQvGRDdrAjJUTtuaLJjlryYSwWRNnhHzYXvVFZdtGofHhebqQfFmudDqTeEtGgiwWIvOoVelAPrSsuLKkLSsqnhYSFqQvfFwpbCzZXxzfFKxXUukUYyueydyiQIiyNQqQZZCCVvsSXRPsSrwSNPPbIgyzeKZzkHhpEWwTYygyqXxtThEeEIJyYBbZLlzDdVvCogGmXOeEKupvoVvyYpEkKdsBuOOoLlVtTviIoUYGgsgdkKDRrFRSsxXxElWwpFAaPnbBdnPaQkKqbBOosSNJfFcrZTdnNrWFfScCMWODJjjLxXDsyYhAahHrRtoqJIaAiogGZzPpDRJOojaZzAwepJJGJrgqRasOohHgapPHxEeIiqQfzZTaAGgtcCXJrRiElLNnUuCclCummDKkdptppPcCuyFfvVLlVjpPRAauUIsbBSRQWwVvEJAaoOiIjvoLjBbKGRrrMVvkKlLoxXjLprJMmbzZsSkLlKfFDSsJTTDbaAtcqQoOIkBbKYyvVXQikuqVXmaoPpQqOyUuGLfFMZzlqkKfFRwMvnMGvWpPxUSyYspPUuxFtkKTIdEeDdtTrgGMvVUfRrcIUFDvoHrRUFrPFfTFpPUtnllKpQPptaZBTKVvZzYeEMCcxteiIEcCcQqiQiXxWOoucCUwXSFNnuUtTuUpVLlyuzMwITtiQWnddDcncCNCATeMmEtlbpzyYzruzSsfsunSyYsLaApPlVtqVnSBbBbEQdjEeuUnPwWOozFdDqQqmlLUuaAKPTtYyUcTBjnNPHhxEeQiIqRrKkyYLltllzwWkKvVkKqrsSRKqSsBeHhHHVvhUuXgGJNErsuCbENhLujJphHFfMxXGguvKRrVAauyFUuhWwIicCIujjYgGaiSvdwHhWFgGoZzBbOuTUBbQqLKkvgWeCrROpmNzIizZZnOXrEBbBRCVvcFQcjaCIibBNpwfzsSZUgaGuAarRKKDdLlcKEmDnGTXwmMmmsShHheDdpPCIEenNgfnNpovyYBFluUTBrRWdBqDpVLkCcRHhXxHcaACVvmhHGAdDaAavYyIihuiLlbHOTRPpNMGqyNHhGTJGUsjVINnNpZpzjhHtBbyYpbXLljHhwZyjaxgZymWOoOOoSsoMzZPCcYypcCQvVqlGGWwgEpZQqzTdgzZigNnWvMhHzZWKzNnZDdNBnDDNiZLlWyVOkBbKZXwWxalLdDAdDAudJUIQXRRuTFoFfOfruUbXVNbpZswWsBvNfJjPpqRcCaAOOOOAAaaoLKGPpQqsaAmFKDqGqQFZzfXCDdZLqXxmsREeFfDdKoOnXxNWpPLJjFCnNFfjUZzZjFXQAaClpgsAgURpUuPqmMnLcCSYjYoJjEeHtThyYQdDKQqcCXyYSpQJEDdtNfCBXxZCSNnsKfsytuDCcsDdyfgzdyYDSmCaAXVLVlCFdwhpXxqjwYyLFtSxipaXxqHhzaTMmQtxPDJjqYiNnFTzGgDagGhHktJvVEejOFiTjyYSsJhHnqNnVvjJSsgGPQFEiqQGVmiaNKkvqyaABKRHIVlldEvkcLlgGfFHyxsHJjcyYGgpVpRhRSsrviiInCmMYaQGTiUsSratboOtFcCJElYSupPUXwWHEhsGbhAaYyHSZEebNWnNLlwWDxXZShVySDdZriWoOiXkoJjObKISeEeEZwiIYyDWwdlkBbKOuwHhRmQnquUeikXMmxWrROEoPJdDFlLfPqkdDClogrRWKHoOMmzAalHjJZOowWgbAKymVxULlpPjJXMmKyWeUGvVgLBNnetTypRrEZzAaewhNnHtTLbBPmeAfgeEGFUuDyjJJmzVxXjNkKKNNkNhDdDFfNNAanXumMhHgygGQfFqYIiGYyOspOaDdeghUudjJRVvCXxcrnOfeEGyXaewtCgaHhInNJHhNnjJjgCcGHsEeOoFgKkKoOECHLgALHkKRruUzpwmznAzZkwWZDkKNwWSsosqpPiIiIxyJaCcOsSVhHTfFBOoaAemIikKfDdFSlLmrZpvxQwtZUubHHHhcgSoOeOokKKCyyYEgGJLhqQwOJeEcCaXpPSnVvkKRoKrRpPxXpPpNnwIiFwQqwwWWNnncskQqSZzSQqCKVeHcmiHhuzBbaAZdKkDCYXxDZwxjaAJfJibEUlkPsPpqIinEeNZyvjJEeYyOSKRrERFfcrRTFfYFtTfPpyveQqEbUONkAOuUQCRsSrNczbfEXxfFlveLsoOlfnDkqQmzhHgFfGvnMkfFoNyXxmfSKayYARrXlKjiIwLqQNcCGmMpPqFfgbtbBdDgbBXkKkbsWAaFaXxWtTJjkKpkLMAuPeEhKUuqQApPetgJSsVBGgbnDdhEQiSMbHGnNFfBSszZNnIYtTOJnNqQKhElLdgGxrRDKkiwuZzjgRVvrffSfINgouQmIiRFsYFiaAPUkKWLIFffZOOmpORroXyrnRIKizZIBSenUtSsnNuUyeEBhiKkmThxgoOHFeSshfFtOoyYHyttbsNACcNrjJCRrKkcNvJjGgYDdyVPpLzZzpffpPFmZzYGgyDoNnOAoKbjlLLQqlvQqVOoGSYzZtWPaAQxSZMcuUGgdvyYHoosTKTNbBJjeyiIZzAaLnRrvVLlfFNlWXIGnBIRKkTpKxXeKXmYNQhHwJtAaTcCNQqnZzjReElwWjOoNIOocxsKkYyVQqDdUCcaJOomMjXxmMmyYMIwWGWrZzaYyxXjJqXGglOoCvVyYppPJrRjgGzSiGgEeRrBAawWLKkzzeSsbxXqCctaJWwAajqQVuUGgLqphyaRzyDdGrRiIdJWsPhyQqgSyqQqQDWwwWBwhHfhYHYbUuBUuyYyhYDdyrqFYlCctvCcMlJjFXmerUOmAalMpAaNSBfMGmOoMgTtckeEVCitQJTMmvCjVvEeQGJjrftEGOghERwCceRmmzawWUuAKfjGgWGgDEvRBCcbrVIiedwfFPpFfJFkZMMrEWreHGogehHTFRgXxqhHOKkoHhJcVtjpPqTIcvKYyCmFaXxAbsnVvTtjJPpPmwWLMQzZqouRlLuUEcCMjJxfLmVTHhmMLyfQRyHFWoObdYaAsGYHpSwgGjDgYZrAYHPQlmMvATWwQTtBEvVIiZZuDlYyLdlLMmUlQqTtpPbJjIsZPpPcUuLxQpPxWwXARwgGgiAuUutTvYySXCinsSDdJLiIyYrWqnyMxKjJkkENnrkKzTtZbUlPpLilZzLiIIuBGgRxXkPtribNgiqrRrzZRQxwtTNnYPpEDdntktSOOhVDCmzsXlLqorkXcDdCxKROpTysgMmJBkdDOaYydMFPZQcCqlvbBXxVnHcChRCcnanSBTTAaYhOoTnNnNyYHEfhGXXxQqHtMIeWwEHbOoYDdTuQqRrNEsbkPpvVwWirNRYxOoPMosSAacCSsorRnMmNSszgGFillLwupIflLyLpPlSfrMioOIqHhIwWDdiEeUOGlLxXHzZmMhniFDdsdDFFGcCJoOUWyPpVAavYIkdDKdXDTteHkyuUBbYDdEejoVgGbIJjiBvNngGyizZbghRrBmsIqeHDdNwWvjGTEakHpUaHhmlKPwAfwXxsSSpPBCcKxGBbwWiIlLFfTBGQgnKkKklcCWJkLxumMpPiIUksFMYnOKmNVZxXMKdNFLSlEVUuLesCcdDiISRrFrRQqBZCnQqcqoQqaKnouBJjZzVthHSsCrrRerRksoVYznNQwWSpKLueBIjFJjXWzdycCCccXxXxUIMCKkBbhEvkcssLyYlIiKSCNwWWfWSsmMdDPpPbBkOrNTtsGIigUrRurRrRNnxlUuLTtAjLLlloWMNnfcCFmaAiIJjHljeYcVvkEsGCHtThhhBIizTSsWqXVPzRMsnNSEesQqMJjsKkSEbtvpPoAHhsSjYXiIQSOndzKaNiIjjJJZoOMWPZhBblaGlPphBbceQsSqjJkPpgGGfcCShNnyYiAGnNcrRTWEAxYGEeggeEFoNDHGEAoPBbrRSolLOYyojJOoLlUxeEpPnPLlpdHkKfHhFnKuUnnknvVJvZMjoOWoOwxXYdOoasFfSEMpXsSxuUlWcCPYLYylEbZzluEwYkoOXxxuXvWwMDdYXxkarRBGHhzhLZwWodDOhaAkWwwcCGOLcUuKQpjIipOPpeowUuKIXxEDRrdUnNuanXxNAQNqweEWMrWeEUoLWkKzsikBKxIwIRZJjzzsYvHszmbBbBMdaAwnBzsBgSHehwWxSsSnNsRrwOoWsivIjJiVRrUuIyLejfTBTzZARuItgqAyXRhHrRNRrnrxfFchHNDdIVHrPvmKkMSsPqXxEeeEsSQChScCTtXYhCKVeDLLvihrkbYQVnAiIIEeMQMQqmqvgIUuIuUiyYefqpfFQNvVqQhHtGgIfoYyZzTyYKAlLdZtfpPIpPyQdpXTqtAZQAPkKIiIoGgOXsTflWJMmQPvVHWBbDVvfcLvyYlvxcMXxPpsVvNnZGFjJQiDdIqhHYSCcdUTYSFkczbczZFncCpPIiFfTqQejzASsoOaZqPsxkqJjOyJyslNMmQruLlGaSGPLcAaMmsSdUuDqxfJzuaAcCJcflwxXHhkQWwqiIrSMEeQhHLllzVvbBFfcxtTgQdkhHfMSgklooYyAaosSrLlLlZzHhQFnVbSSzPBnvxBRtUgGrrlPFfpTtLxwdDWqiujDUaDdQqzKkovYwzIPpnZzddNbntTkwsfFsrqQRSSmDdVwlLHhGICcGDtPegLXSIisxmMmQqHhxXwMBxXbYzGXAJUuYzWJxSstTBPTJZPzKkgVvGPpPnGgNGBbgnivJSugjEetgntTYQgmRrnrtohBIBbUHBbVgMBbhrKlvpPPdtTQbDCcwbtLfbVjJfFOPQqFGMmoOishOoHScjJdgGDEHZZzzMMWxtgzhLlHkKZNEoVdDfFvOeAadMekCWMXyYdDxmwkkbBUgAGuFWPdDncAaAxXoOJwWCqtTfrbesScCrGhHgRRhaXbBxAHxoMNnPoXxcEwGVltTuUutUfJjDVsIWfFwAyEeJNnJUiWwHfsSlLYUvCcsSkVUmeEPIiUlHiIneBcPpUSRenjEexsShEbHhnNQkQrRdDpaAPZpPaAPpHhLLTmMiIXpTtJboOtCutTpkMQrTtRfZpNJDqesNvQTBbvSsNUjJSFZURZZPBLZHhzauUDNguUGwFfqhHWsSmZUYvVvPfsOoxIqICPBbpTXmyQqktPpxXbzATyYyJjCIiZzWwhqQHcYSsqPkLLNTxXuowWOoOdDftVvYypRfuhOVdfuiVvCPnNppPFumRDifFfXuXYyBkKbwVgmwWNVmSmkKMtTsfFAaWrQLkKmlgYpPdDAAaMxvLlQUKIqaAxIiEeirrRRCEeTBdttjdBIiVvbvVBMmjRPlJOmRuUgkXeExJlOVKkepPqEWwAaCcernNiISsiRrmGgMrJZzvkKYUPTPMVUuMmvMUcLeNnIhHfFjxJjFXjJhAGUuSArQGRjgvVjEejPErwWTttTRWDXxdaArdOEeAmMajQOTHyRrYyYSCcYydfFlJdFfowmQCcqswRDtzRQqCjnNQKkqnNnbUmMuYyBQMmqwWLlApNDNpfPLmMeXeWwErfGSGgybSDePqQOVPURrkoeExmMWfFwMOcDdzZjqVvQiQqeHQkKYGHhtFeExuUXfePqQKkEZYGiSsBUuppnsjJrbBRRrWRprxccsSsSzzqnYbBuUqIYDYEOoZcBPWVfCcsylduUDmMLbBkzZKHNQllURpaLEPpQUQqMBsSEFgGOgTDzGgfeEeEYyxynNZXxZzDdrsjMmzHhZJRIiSsgVBqdajJADdDiIdCPpoNnybOoxXWHmMSfFVWiIHhRrHYyyrRYIiUoXNnhwnDTtabevEeKbFgzZtJquwceDvVFfdvOYIQYyqigHuwWtNQqnyYGgCyeCcEUuleRMmEPpXxYRrSEuuynNYSzfFMtIgGEefReNWwnlLsmKwMMaJjUWZyOoYzJMbBaHIiKzjZaswWKGXUhHbMZzsLlTFeelLpJjgGGgnaRVvreuXxQqtjJnNHVGqBQliIhukYfFiXmKkMaFfavCjHqAgGTtaTtyywqWaxXqQrRKJtTNnjJypTiItGPfFSsUywRrAFNtuxsrHobiIhnNeErROoZqQkKXxmhHMzVvvVESsYaAHnNhHwWhiJarrATuFKAXNPEepuCetTEfSsIcObpbxRXxXLlxXxdDysrRmGUyyOdjRrgiRIirbBIidAEeTfFkCcKKkpispgGkKPUgMKkmjWvAXGgEHnNCcYZpFeGxvWekKoOxXhUKkuHdDQZTtzqBJJqPxXpbQqRrBWwCAYCivtauWBbwHhalCQhwXhjUncxKMmXxyTSwrANHMiImlxXQlcyhIFzJsSiIXxXRrnNPpKkrREvVDZHqWweJQqjhXDdpSFKBbqQfgJjnKkNGFeaJvBbVFXxKkVgGwWyYvidqoGgWwQqiIKLbdDLjIUpPzpmMYUevIcJjjtCIgHsfjKkVQRrtTpwKkWVQhiqQveiWbAicATtoYybOEDaGgAdfEcCbaSPpoOSszMmZsSsACcBeqfnNFQnEeIiNFkgvHhCcCDDdXEkKfdbBvDddlOogGMQrRrRhFfsShIfWSnXGtDKjTjOoaAuMXvaFmneEMLlAcCTtNWMJjnlLNznsSCcrEcVvRSNgIGGegGgXpkYDSLyUHheEmeEoOZpPALlclhtawWUuxGWwWwkaAezXSseLsScCsTETNnttoOvVVEJjmMzKizGFfvWPiJOoxuqQUQquuLlSGdpPmPtTkLQqYNWwrNOcHIoMmOngNwalLnCdDXhlmMEeepPlSsktWfoZTtxdtTIxSsXoyzZVQbBOooOoBNQqnhQqHAghbBJjiIhqQHHGmMVvazdUJRrtTJjDNzJjqSpVxXfgcCNmMdDRKkFfsSUCjsSJcUCcXxJaAwsvVVvSrqGgetKkDdVvFUuMmfaInPPPDhKDrKdBClLZlLztTJjXbWJjLlpPwBDdtTxcWwNGgnElLgiCCcfOoFjIlrUnNKGLlNnMmZGYRrQqYyPpEIYVvzjUuccACxXcnOolBpZzPiImkKPpMboOSrDBbGgtZzqwTtWQqZnmOPAaXlRJmFfoOCtJgoDxGgyYeRbcDdCBJjjJPpbRxXrePpBcvLyYlVCnfFeBJGgYMihHIOSnnNYyNEzZSsnZkKzhHNERrfeHtCuUmPbBmDhHdMhmeLlcCFPbIiyKkTtHrJkKpyVcBlFGbBjJWIabBjuSsUmMJnlLOxXoRXxtjeEcCUTxAiwXxHaeEPpwRrcnBgGCaYUDduhHmcCHhwSfabkvwTtkUuQqKGUugWwfFaAUXxukKoBLfrfYyadEeLOCCcNBcCohKfbBxXNDjoyXiJjXxIqeZSeEbVpxHheDyPxnNSstBiIsftTFSqQTJgXxzWqQpatgDnoBAlLDtRDdRrnjJgOoeEfFrgfFOXxkZzCEecKDDdTwRrgGCcmMWmTtaAayYubYmqJmMpTDwTtmHvTtVhkKTtMWdoOzvKtTkVZzZfsSRihseEPrdYfkfCJxoGnNePpiIwuteUuKksXxtTYyteKBbTudDKpwTtSkIGXxKsJcCPpRxXIwWgAuwWmMqhjfFJqQyOlSBajhCWwfFUuVpityirRwKkZzPpzGQjJBbyfXkKMmLnupPMjJLHhIildoTAvVdPpDAneBbEeENtThYMvVmoONnHNNnFLVvkKCiCyfbBHpPdSSttTTEeZzEUuejarjkhkYAYynWqcCaAPpNcovwWLpwblzZeEwWmdcfFCYnKkPXxFWoCGSsrzZfAJaTZzSsSTpPtGIigsKWjSVBgGVoOvIiFxXfvEeIwWDniIOoBeMzcZrkMGqQnNWwNnPCcCDdGwMZzBbCaZziHhzJtTiVkfXxFmmtzZpPIzjgGJZsJsDdzZmMiyzhPpFftWtTwTZPkhQAeEaqfFSUulLGgvgZzGKkqlLQSQKQaAXxByAMmaAKHhtuUsAaNcRheatsfSxVswbAIdnNAaDdDlZaXvVKhHbyVwBiIGglLCaAgvlSCTjWCcUHHzAqQOoLkYELpwsBFKbBTtkjJfPpysInyYGgVPgGpptpDEqLITnAVvaIiNnNWtSRuUXxpDOlzkKpPcCZwamerRFAtTaVvekrSsRwjGgJWliEeIvMmvXxgeEYyqQyLccGpsdDYmoRjWlNnLrmttTTicHSQqQqsSbBLyxNFfwfFBbtqdKpPUuyYFJlUuTpFoZztTOkKkKjJkXxnGiIGRrBbTGBzzwghHGWSpPsZapnNGgkxGgfyYdHhgkKGghLWAIiaKkNXJjYJjhHIBHhJEpPejsSAzZyYfFMmMDxFuUmThQqxXHsbhkKGgHqbiIjcncptTtkHhIgQqGHQqRriIhkorqQpSsemwWMEaJzZjyJwtaYyAOoIJPplqfDhPOoCElLlLhHsHyYuUvVywZzapPckYyvMhsKjJnlEeJaAjtkwMmXtSshoOovkKTtVKkhHhcKldaAagAeSsbBESsmxLlzQqTlUlLuUtVmSsSaFfgGARveEkCsxXIwxgvVxXbfFkKtTXcCdDYZgGkYXISbfFOIlVSAFvVwaALoOlQVjZfFWwaAJfdwWbOsdjcKkiVqzIKgQWhhHGVvgqQsSjJTteCynNpPYKhRFdDaZbqWLeLqQNUugGZeEkkdDKzvMYrqQcCWsmMSGgwLMefFEmsKFfKkIiUupPSrRsFfJZPpuXxeESpmiIzXxPdFfPpZzBYybDuxcCHhXPkKDdzaAvVLYeECcLBrdzKkRrziEIieAaaAXVPpFitnHhqmNnmZzkUuKnBbAaWapLlPQwOyYgVvFydlNnQqLNRrmMlQKkDDddFfwWZzQqbBhHqXyYBbpPPwbBrggvcCRtTrYyTlLsStGaAyBDnNohwPpSsyKrJBZzGgWGfjmMbBJnNqQDcCEeqZmMdDkKdJjFfqIiXAtTamVvgGmoLlOcKKqYDduhLlQzZczZUtTBbuQCCAacSsdPrRAxmKUuoObzHhzkKWkAHIiyGQWUKWwrRJLRXYlLRrPVJjpfFPUUGltKkHsShAaicCIkJEfPCCcIsgGKkxTtSsobBHhoQeEIinhTtjJGIRByYbaLlrdDnTlGghyVbjHhkDvVuUdEkCcKPpUupFHBbzTliFFfZeijkDajAWpBVSsvVviUkKEyYOdkNnnNEezZXOoZzpxXftGyJuUAaElZiIymMnyVbSHbBhTtupPUyYLlLlagcCUOoSDdzXFflLfhHAaIzZoFfFfhpmMgHMNUmMMmzZMmTVwwWPpWrRvtUuliILgJBTtKkMaArCMttRPprrUqitWSjJjvVvRJseqQnNdPpiILnmMNscXuUStFfTsxCjJWwHGZxRyOiQBzZLlzYywiiIMnfntmXxMGofLgGhLVvlmLlltcbBJcAQDwWdnVBbvLjJZCcJOotqoCcVofFTenNZXqaZZtjJTIXPGDrhoBTFQpTEHuUWwgPpGDqkKqDEvhVMIJfOsSHhQJjqUhiYNnylpAaPKkSsDdLbtbBaQqAtTKkFpPQdDbdDlCWwXHhxVmlLXFfLCccCrRcCaiUugGgGUuWwKkLzZDOoBXlLabBAGcnNJysthHdqKkoCcyWwbwWBMmnkHhKCcomzWksguUJJjlQqhHpHsQqShZUuieEfcCZQqjoAiFaAfuqOdDoKklymXxFDOYQqyZQqiEIxTwdRrDSZiVVvuYtTrRLsSlLDGPSspKkNngcmMmMRUvOQdLmZzHjJhHhMmMNKkMmgGnozZBTHhGgPIirRpYQPvVXwjJNnpYYyyVzkKMLyYVQCLJjeEDdeRPpfFOtXLgGYxuUPpXydPzwWZTtAmMaRqJkrReLXcCZEeoqQlJNsoOFWwfSsXFfxKwZcCzfclLnNUugGmMCFfgrRGuPDaognpzntePpfiQqzBJjWwWNjDixNnBbereEXpzPQqsSxXCcbQBbiVNZYRrSZuRZzrNlIySoGFKktHRrkoAYSsZlGgPanNXxEehHaAmUSsWRrMViItpaAmMCcJjEeEeKtoqDWfFxXGkyeEYSsZuUXnZzNOtfFZOUEfdTCesSySsrqmbZKkXfGizZrRWABuUwlajJAMUWEsSTwWtFCUnbBVvNVXbLlXLlxTLRriIFfhHXgeFgGUIipdBbGgkfFsSRnmnibBIaAKkXxJrLlGiuyRkdpMoOmPiIITkSsKfEjvoWhYkvROoraSsAVpPBbZkTtKmFfGijSeNnIiRfFrISVzYyCPtSRraAsAGybBYjJraArdDRytTYSpPkKsCgWglLJKHrNAQOotbBdDbBHhjJiIqOosSoOrxXeDeEXxybJjByYraAAtTsAGBXqQlpHhWbhHulGgLUYRryHiIhfSshhHzZHEHMmxXIicqGPpFCmMcUuSHhCcsbWtfIinarRKXxQqkSsALluUiLvVYvVQqAvVDQUETttTeurqQdQNaqgEaHPcmLlbALuUvVnFfBOokKtmwIDdpPiWMCtTcXthPpHvVwTTttLiIsFpPfUuLlSfFixRhkaAKHyhHhHedDEqJjYpcIiQdDjJaXkKSktNcCnXxHWRfaDdlubbIVvPpHjJmMhdDPpjJEiILBMYynOowWmMyYjgaqRrbBIiurrvOozZJjWXumMNiUqQWwtTuhiIqQjpQqJjAgGaTAajqdxXFYyfPaWwMTAOdsjFrRfSpUAaAMmaYyJjDaAwdDtLzxUbjJBuXqaAQZLOodaxXnaAxaAGgXwiIWfvVFgGEegybpPKVvXxVzfFWBbrRgGoGNJXxIcmwWMFfeDiIVdNnDTrUuRedDEtHhDPpdawCcAaCXxMmczZzVvtTVuUigLEebBlGBxoLHeLbjcfFDIiyYzUikjAjQZBzZqQZeEivnPLlpTtkOSWwISVmMwaAWdmrfFRPpGppMWwchiXxcrGahDdJjyOyrRvVqcCeZGmbBMolLWwiJjfiIiqPQZUmMuqOoAPtTdDLHiIhhHlHzavSsVdnNDkKOGNbZXKXHqQfFKCckhHrREehxtTtVfFvTkxlNtTOoOIiFREwpaAPBbROolfFRDVvxOoDeEPpddDXMOAaomdXFfxSPpshvWwqNjsSLZuUuSssaASLSaZzJhHDdveEVrpPmMFfgmMIiGRfFCcjlYyeeZQqlDcYyTPptxXAGgAtTaZdWeCmHxXhUEeAHgGDdlLhmPVvVLlvFfEKWiIUuwURRieEeEXxSFfsyZaUFrRUuXCcQqcCRZHxXDYTtybBdwJjifFIjPfkKtTHhkEfFcAbBHmMfFmsSMRCcTkKXxlcodDsFfjFQSstwWTxkUuokKaAYygjoJgIGgiQqmhBSsbRtjOMkMmKbFWJjwtTTsYaAlLlLujJjnNYyOortuUbWrRwGgCloxVVCUCcuJEqvVsSAPOoveEuUcBoOHhfFLlKgbHpmlLHHhhDOGNPpsSsarxUQquXRWNwWnKkOWaAMmMmHiPplLaAIEfIikKHhsSQqFfVvoZPpAyYHhaSPLKklwGLlfJjdMFffIfDuohqQHzuUZHJjoOIitTGwzZWMmDdJYATtuksSvanpJtWnjJlUYyuBbLNoOmtUynNnPTteBXdsSAamMcoOQcCnRKkQaAnmrsVvkdbBDHndiIDKktTIWweExXieXaaMmrRvdKIWwikqQoODVAkmvFAdYeEbjJSzfFKyPiIpPdMmsSDFaCcYyOwmxXxJjPxXAFWUkKuBZhZzAAPMKoOCQqCRrcAjJrRMGOdDoJOoxXCLdIhHiJjtbBrRTKkeUutTaAtToOEpZgGOoUuzNhMmRKyBbIsSDdQyYVvqQCtsfwWFpzLnonpPEgGMmxgyOYiWmcCAajOoYyBbJJkKjDmMpHMYVvyNecPpCiIMnPpITwZzmgGFfrRaAMnNrsSLDvgwfFWGVAaZQqdBbDSpkwTGKqQrRKkzZBbiNHhmAHhHhYACrjTFmkftTFwWfULlurFfTtqbDqwPReSsxXECCSjJslwyYWAwgGWahHxaAIrkGtTRZcmhHMMunsSBxXITqQtpsSxAaCcnlLyKkLpPGSwWpVlLvPmPtTfFrRIFdcCpyfBCCtTngcCcCqgGoOeHhEPZzXxPpFisiEeIKulLYywCctpPTTtWNTVvtjWeEOowCPqQrVvvPFwWraQqAcOjSkKwWsIijNhHnPqiUuIlPplIiBScpPCIiKJjXxuSsZpoxXEecCxXBcCbaAuFwWfRaATtHhgGzxXcCzHkKhNnmeBbrzZYynyjJKcczmuZwWzlLCqTNCcVPxXaVvrRhAaHzZswWeLlDdCkoHhpPeEPwsSFcOoCVifFKdDlZzIPtTkKTgwDjJWuPpIxXiUuzqQKlLGCdDtTHfanKPkJqAgTjZzUKtgGQqQcCqSoOffCAaKkSgzZGmMuUgGzSraNnAFgwgamCygIpPQqfLsvVlLqQvliILqdkHhLYnyoOwXxwlLlLWmMgMSsxuUXQzZqhHMmmqQGlPNnoeJBqkOaqQQFfgGZtTXqQeuUVhHgddWwDDGnaAEkHFfkoOoOyFfeEnZCYdknNrRFbBgGbAaYySNtTRBbFfbBwWdjDBbdNnueaFfkzCcZKoqwWlLHlnYyNZyIiLhHEGgcRrtcCJjcdDoaArKkcuVpVHhjiKxUdaAvVuUQqDNnVZYyqZPpzLaHmJjMbBGzQpaAHhqQPpsTKeFfyYxXoMGgIDpWwEjlNnLJyWwmftTFMKWwMQCcqKiIkzxcCzZXxXpPwWSsXzZEluBbpoIIOxHhPGgptTnNPxozoKgGkwatBHTtSWJdDjcPgjJGxXpVvNcFpSsJjxXdrDJBjJjJLKklVxXuLhYqQzZyuUFceyZzAaNCpXXYyxRlLOxXoEVdDoSVjJTtvtTTtZsSzsSLlHesOoFfRWHIiIrRUKXVvyYmwWYVnTUutNyYqQcFyxLlwbdDuJbBKkhTtcFXkUTtYmMAavLlkKVHhBerYyToOQqyAaaAYgraHhKdDDFtTnNfyYEPRcCbjJlLkKmMBlfFLIDOSwWjJKkAaOsDdSYnUrQfFCaGgpNbFfAiJjUuINYyBbOPpowWulVpPNSsnwgGRrMqQwWwDdpPOoFFOoJjfZiGgFPkmMucYaBWAXIoOaAibPrRcCYTtqImPjJHhiIpBCcbDiIIiPdyYvVHeeErREhvxJhOoNGgnHBbcCbBtTsSQqiuUIKkYyAaTtwiIWVIiefFEvQqDdtTriKrRMmkIRihHsSQzZqYyZzaGvVgGggOeEDOjRWcCOoBbFJuvVpSDdgIiGrRZbxXIVYykBbIwettRZrReEfryvKkRkaSsDdUubjSMuISsUmMujJFPpfMmRrolKkLNnURNKdDAakeeEeAyYzZsSQNTtweXxtgiBIhHbBwOZJQzpPmrRrRECibBalxXWNtTsSmHhBbTViISstxhLtSSsXbByYEuzRJZzZbcCBbBzDdpSsKwFrRfzwAaQBIlJuUjkKDdLuzBbZcbBbwpPWBCfgCcgvVbIiZHPphzBIuOfFqjJQRroUuQRJjHhrqRrNIinMmFfyYWwwRrIiSuUFfdDsWZznNTtTtORVvoOXTLlnkMEbVvLyEeGgbBRtuJjJjUnNgzlLZhHJjOtiVvuUmMnNvXlLdgGebSstTJyYAvVaYaAzPFnNfKaAkpnNzRrZQOWwWbBhtvNeNnPnyYNeyeJDdTtnNIJeEsSjqyYTtoeeEEnNsUXVWwcCUuRkKobkYKkPpyKBLaOoXvthwTrRPxxXXVfEkKyrZcuUwWCnMJjfFIrRnNvVCcMmXbCcRMJjvVxXmOjVvJXxLlKkwihHxCcKGgVWwfFeNdrRDfyYSsiyYrRISGgskKPGgwmMPPQqRLlIieEXdpPrRGviInjaxXCcLATtqlRrbLlLlYyDyDVvFfpBbPdgoZzzZGyYgdhNhUTtItXxTtXxLlSXxAaZzsNnecwbBHkukKUeSGgmMdtGgTgfFqQbnNXOozZxkKDLlBwWjtqSmMSssTtQTdnNhaAcSJjuXxUwWsKdDPEeVvpJIiXeQiwWWwsoOSDdIGkKzZNnbeyYMmEBfaADTtdTtFkKSFfsVJjHhhEriIRPtTpjqQJMtTfCKIJwWjGAaQqgHqQgBoOJjcaALlzdDMmSXfFbHhNnuBRrbqQaAEcjJgfFmMOojOoUBbeEhqxSDdEPpdDVLlvteOoPCZtTjJzXxiNUPTttTeEpyYaArRGgsLtTjfFADdaAgKkXPqQpxGTMmloOsKkPKrXXYyiIkghHpPGBbayXxYFDdSMhyfFYlLvVAQqcjJkKDdYyCgvVFiIOojJXZKywWoOXxXxidvMmVDPpWbJrcCZBGgkQYyLwIiEuUeEebZwRsSRPpotTOrWwrtTrRtkXNnmIiMHGDdDiLltkKHTtwKWDbBaAsSmIiKwYyWTlFCPpUuzVvZcuDdsSYyqkKYgGEeyHMmcChPpPUupIDFLpuGKkvTtViIMiIKkuVXxPpxhHIhVvmManNAXIihHZzAaVvxXnJGQpIiPFfZzqQRrHwDdBiIIokKLlOisSlVEIVvQfFqEeOeEyYgGihpHDmeZhHzEAaCcEhHoTsSCclLwNnWdDNVBbjJlLvKkWGUugRrWSswZzCzZhHNjBbYqCcQyrMmMrWZzwWLluUKkbjJoFfVvSvVMmMfFnNmMJjLtCcuUGaExXUTVvbBjOgGlLoJjwWCcNOonMyeESEaAShGmMWwgcpPCpTaAtkKJFAaVDdzfxDKkQnNqdPUvVuwiIXxhOEetTvnVcEGVvlnJjNUznNZutfFPwSsWdFfATtKvKkTtszdoOPpoiCcrRIYMmmTtvVukvVwJjWSsdDKUCcQDdEecqUubBbjawzdBJjfFgJnuXcCLdDSssRrSoZKkXxXsxSepPEvbBGgVYvVyIkbBzZMKcDcBXkKxQqbaACLmMloylLwCjuThMmDdRrwWbBHIykUugwcUuPpPpxLlfZzNnCwTMmtdDZeEnNnNhKWGgwRrSKCIiaAYyGgNNnNncCnUTOQqoxtFfRVvrcsXiuUIHheEcKkEYyMkPpRRrrejJRtqQUEebBukSspRnaevVcCEwWQqbBADdQqVvNXpRrRrWHAaUVWYPpkraGZzgLLlNnYuUPWwXxpTHXxiIwMmVFfvBbzKkeFfLzZceEGfFglLCPpKwWkvJjjJVvVgGPNfFSsbBNvVfFSWwoOdDvVxXvfFAaXxRsSsSznNZqKkNtlLlLQqZzBhsSVvOoOokKiKQbBlLXxcCNVveEZmMsAFKGWwgkKksJoOuuUMrRGDGvsSVQqEevEkKXxhIyYMmVvReErSeGgpnNGABbDgGVvWgyYGgWwaANLcCYADMmZcgmMUuGbZzvSsFUuOoIifDdPpTtPyYiUiuWwUYxXPpuUPpymnNMneRrKkRUpmMFfPTtGqQxXmeEtTMtTfTtFXxguQFYyfMmpqQaaAGgGguUHhAvVNnPmuUMgGFfdDyYHGKQqkFfZzgLldDCkiIiIvIiYWCcwRmRSssIikKSrQqHQzxHEecCyXxFNnLlUuuGgsSyYwaSIkKCcbXxcCRqfFYyQKBeEzZUSWVviIwosBbTHUZzlLjJBbSsIxXjDIASsvLPpGOUuLpkNnTQUkdDfFkKmPPppuUuVvUCczZMTtdDqkfFqQyBQqbpPCcEviIexXtTtTICYQqyzZSpHjLlJgNDVYfaAFyrgGREevVvrRPpXbBVvKSyYsDdZVvvUuVNnGgGgcCZzkoOwlLWoOAiIlLlLxfFXaXaAzZxbBhZzvVFfHLhHzZaAltTgVrRFffkJjKgUxXuYyBbGFEeUslLBlLbSuEWwVvQqXbQfiFNnYyvVNnYnNyZlLzXXGKkTtiIlLeEaVvpqQPZEezAgBbEenTpihaZnNzQqbBJRloOLrnNBvVGdfVLlzZMIBbEsSeDSsmMdRcqQazLlAakMmKYvDdcCUuVjJHaAhyCcxFfbtTwffFUuFjBoWIiIisZbBTymanNAqQOodDyzoZrmBbMgOnNoNnaRruUhHRfoOFRGgjGgJrrVUuJgsyvVYiGmMgISYysCcSCKxXJaALlvhHVIRriRjJeVvxhHXEqQbBNDAaZKkWRrSsCJjQqBbTtagGziXSlRrAuIiCbBCLXZTZzcipPInedDEohXxXBvgLoCNncuUIiThCJjcwbjJfUuacCAdDGgqGgjhHJQHHTfizWetIFfitTihYyrNpIiPyjfFJCcXIXxXxTvVBblBbGgLxYyuqQUXvbBVnNJvVrlLNlLnRGgIidxPCcpVqQvXcCBbnNDOohHtHvVhyLlIXQXxeEgGgIGixXIgEoiIUuBkKrcCbBQaAqwWRGrRgYyfhcCIoFfOQmaAMBeyNnlYykKGIimcCwlPDdpWwKkKkBbBSksSBKkEjJeVvZVparWrRQqAawvgBOoYklPpLcChHCcGWwHNoOVvDddXoPpOfFHhiIxdDaADPpWWwxRiIVvKsMmoxhyYJwnUJjuuCRQqrSmopPXHibBOaAohHVqFfidDneEkKvVeXGRrgZnNpPKDdLHhYcFmRrBbBwWdHhgGwrZLuUrbBxnNXREUrRueqqQxXosSOhtTQqgOoyYoOtsSTEvoEexXEJUucCnRrYydLtTaAHhYyRbBYBbmMymbmMsSJjmMareWwcQqhHCkXwWVvEuzZcChHoWaAKacFfqQxfFMEeAaKkAeKkEamMNnMRrmmXHhTGxKkvVeEKhHkSSCcsNnojJjzZOcCQYyBsSZcCYOfFXxaojYSsyJCcjJUuOgGtoqeEQNnWHoOQqUMuHYuWFcAXmMEekKxtBbTKDDlLJjFWmMOomwWPpMmaAMIVhQjRbaABsSKlrRLrjYQqAOVEoOePwWpTDEeJVvjZrbBCNfqzZQaRsgGSrJEejnNemMEXcCADdCqQwbqyhZzHRrbBPpAvRfpPQqmMFbBFxXfxXinNIUXIixuwLptxQpMHhYyxoONJuigGxCOAZzuUaAaEKkefFoMmjyCjJDxXdYktpVvPEeTPrjwsSkKVvJUeEqlLjxsSGBbrReEWNnrXPpSsgnNpPRKkrqiIQZxXVvFJjfNtwdDUuUrHZzdfFDmMhxXwpzxXZIPmMOBbwWoWwTtQMmfNsLljoJkKjaAYfdDFqQtTdDPppDULlueCcLzZIiqiJQqLlnNXfFmsoyYwMkXxKkXxIYyWwxXnqQAayYNBbOUdDLZzMUumfLlWTtwWTzZgEWwFfaAeGOoHxMZzyYYymXLTFfDpPAaOcCoqXxWXxwWwQqcvQqVVvGZzZzbftRNKXxxCwWdDchHtiITIisSluUdDFixBbTtXaAwyYdXVhNKkBZpBbPGxKLxXjJYyvVsmvVuBwWbUDdyYLGgZCczbvCcrRvvVPpeOaAipzZnNmMuUPDdqQfmMFSGuUgsoOICBUuzaAPZmMgeEGPnNEedDpIizpgnNGhHLlPsysSLltTkEQsSqpPmMmMPpDvVnNbdDCcfsSvVheEuCzxNbBmMIcoOkqVOoFfvarRrCcuZzURCqQcqqQuQKjJkBbqUgYyMmPzZJWuNnAFfDdaEDOikKTtFflLbTtEeFfjJjMmJsGzbsQqyMmkKjyoOnvuUVznNLPLzZIiiQrPprKkPpKTmMtxEiIzZelTfFsSkKVvLltaAMmrfFAaGJjgGgStqNXrRxOonQOoJZSQqsWwWrRFOtTodHhYaAyHQIotVvvVTaAoLlXxOOixXGdDgZqIyYiWMmwGTtDRLafyYhHIfUuOoPtTTtGEfFwfxDdmMXcCgGFKopPxXUsWzlZzmMZhRrrYzWwZWipPIukKjRrNpPwYySmMsAZzTZdVvbKVvEeRrkxuUXBDmXxMKkeEzQJjLMmRrRrvufFUBpPbVEeqSsQtTDlLWHeCcIIQqisebnNBAfFRhHHzYyPpWwbBeShHmMRSuJjdDleELdgGdLlGgtTDGlLKkhOzZXxVvLltTGkQqufMmfFFxfFYyEeeEhdDpPlGIigNnGguUlLcFnWwtZMTtovkKoHhGBNNnGTtguUaUuhRrFhHfrRkKkOekKEZgWwGLlwOoWzCaHhBbnwSPqQbvVBuJGKkgjXxPLlZzpkrmMmMvVzVvQvsSjJUSDzNSsnsHXIWbTtiAaobBOMMpPPoOpmYlkDiPpRDtSsrRJjPeTOoiivTtIiVYyKkZTtUsSLPplwUutTfFlLWjJBbehHGgDdYvVMmbnmOeEoVvMNnNBuoOoYyJFXxIwIMmWdOkKTdDTSsttmbEeEZzekKjJcekKoOyYGgteEfjJSzTtZtNrCBFvFJjPpUuqGgaAfFEerplLcCiIPXxCcUufzZxzZBbMmhtaAcCTkKHAoOzMmZfFbMzZudDucQqCZfFfRrFPHhlexXELjVUuKkZYpgGPLSswWVtXxTCceECFfGgcvBZKkhHFyYApyiIYsSlmOcFfDdCftHUutTtKBbGmMaAWwgsjJhlLIiHkKDiWvVwJjNBbzkKTtxXkKTtFnJjNcCfFpPYynNQCIabdDQqtLXxomMDdOQXUuxfCcTtFdSsjJCroZzObwWBJjavPlLppVvPIRhvVqQXxrRczZCFfHvfkKcCFrsiINYJPpCjsSXxpPyfjJeEWeEwFpPhLlFpPIVbFcCfBviRrNDdbpPBsilzZDdZvnOGgoNSsllLMmKkQzZLMWwyYKtTkmlqgVvGIiwsSkKvViXmMLSmZzIriInNRwnHhWwdDNizJGgfjfaAQqFJBuhEeBbGpPcCWgGdVbBRGgVTWwBbjJoOMmFfTttJuUYyjkKkKUSsJhkKIlLlLCcyYHhgGAzZCdDckWwKnNAbBavVBaAUuoWwmMWwtTRqQrOfFhYYyyHvVkKVvxBbPpcVvfYTtnIiNStTsUuzZyfiIFjJDdDdmMeEIiuUJjITtYyvVZzVviaAgGFfRrIvVinNTtZzUuCCcZqvVgckKVcCvPtTpCGnxSseEXDYWJjwydpPPKknBbaANxKmMgOHhRrJEwWFfmMelXaAnCnOoNOoUimMTtpPjCcJJjJdSslLDhHLljXxxjJXLlqyYQqoSvVMmrPqCcCXmMxNKkAKkKkRraDdnqQlaAMlLmBbLpPcQpPpRtPpTsBAKkWXxXNnSeBbyYUuxdDDdiIAFFffanHhkKDdNtuUrRlwJjXHhoPtyYSSsEeEeugGxmMlLWwYumXxMrRWwWWWwetTEwwzlLyYcRrwtqQxlLXeJjnNtTaAQqvBLNYynGsSglmgGqQIBdZzGgCcBnwWNDdPrRvSUuBJxXRrkOzZKEekIiQqDDdousSlTOBYbBHHhfFhAaEOokbBKeqQFfPpKkEDdMmYyIPpiqQeRrtlLmvVeEsWwgwWGSdamNnqwWJjtrnNSuUeEWFhHfUpGgPAazzcCtTTtdXxcCDGgQEeqOoKFUuLlfUuxboJjOBEMmeEeciItTkrRKkqpdDLlZHnSsNpIjJgWwGqQgGOBbBNJjSTtsGqaAQZzNvgGVnUmMuuUFWwfgSDoKkMnNmuUdmMdFnJjNXxLJjlfFfRrCceIiPgtTGZdDtEAaeySXKEekxdEeLlpFzZcHheEvVZCczAaqOoSZzsvVQxvcgGCzwWZshmMisSvVSZDyYJjdzsVwWvqIaAiTtnNgpPPpjwbPATtbBkXxYZzRLsuUfFSlvcvVCFfsSBbbBEnIieEViNnmMlLSsxXIvdQqyYwSlLsWEeUuILWwwWWZzYLmBQPprRhMzZmHqsSbrtKkTOookKBDdpPClLplLcuiOcEeWwSsvVuLlIiiBZzNYynNnpPbDBbxXrRUuNnlYNDUudnZtTVvzQNTtHhwWcSbBsCrSsKnqWXxPdDpVLljJvvVjJrtNtkKOjLlPpJDdqdDXxtTkXaRrAwWbBKkgGZzAKkaHWwhuURKkqhHgGCGgmNnngGNJrRSsUDdukKVjwzzZdDgGdDpfnNFPtHhKkyYcvVGgfFCUyYtTyYFfMmJjyYVkKveHhxXtTEYyqQVvQqeEXxewpaAQqeoOkKESmMxPpmmXxzZUvVuMvVXxqQoFfsSJjONnFfpDdFZzLSslFAaffhHPpFfFffFIihiIHgGTtHhiIPoOoEufAaFUdDjNnhHJeLlHhIiOaABoOeaAErPgGSsEVvbyYdDwtTrMyLlYzZbBmTtSsSLlNnsaAHhsGfviIujgGJJjmPSspyXxYCcYygbRNVRrvUMmlLRrgVtTqmzZYyoOqbBQfRCrRNnhAlLazZAaHXBbxsTtfFFfdDxXmFYyfCawuUWFdcgGpEEUuebBiIezZPtbBTmmMMueEUWRrcUuDdDzZKzZkAalLxXxbfdDFvYyUutfBshNnHSbYyFAaogGgGShHsAMDdmfoOWwqQFxiOomJjeEUiIuMAbOoKZAazjHhoOHhJjbBkhDdHOoKRDdrqXaALlrRYyxYJHhfVvEewWAazLlbBZzyMiImCcYsSBPpvqxpPJvVuUCcjiIiIXPJPpjyXxcCVNSsnCLlvVwiIXxnXrRzZLlpPxUuNzZYyuUWwTtDctTCchzZIWfDdquUxXfFsSQFSsbBwtTirRNQqQqwWHxXqbBQRrhrVvRsTtiMNUMmupPriIEedSsDPScOoClLQbCRrWwsWmMwoOOQsSZSOoTgGttDdVzZmyYjJhHPfzZAacCQfFSwWVObBoZqQzvspnSjJrLlRIuUiFtCzoOtCclZQqBbNnOoEeAaLkKlIiPpVvzUTtcaAQqCXJjxhPYykHhKpZCdkKDcWlLQqeEwTVmMUuvfFKkWQqROBDGgsapPAZnNXxZZzzCzZVvLlcCcZijJqvVOsPKYbBfFHTtITtyYCQrYyRuqQUuUAaqoOczZIieLdDlTtuUvVEihzZHfFASsaJIBGgPSvvJjVVoOsjSIiBbAlLiWNnwHhXbcCBmMxaAtrRTgGhcCfFcCZPDdkKbaABpPHIJjVviWRUurFyYYyfDdEUcCiIOouhHzFfZeoNcjgGVvJsSqQCnMzRzZrpPuhHtTZzIZIoMmBbeEzSsMFVvfoOVcUuCOowWvUsSMmuNXyYHhxouUTmMNMmMMTXxOopPhHtnVNnvjCDSsdqGgGgQXlLxXAeEBbheLlgBbbBXxGElLfFfwWKkKzZJRkKeEIiwWrjLlkOoAaKhMPpmTgGgGUuMmtFfkKjUuJLixrRXBbIlCdDcGgHgHhAZzzZgGUKPmFfMpkqQdDukWIiQqsWwSwvFfOIoOtTiWwomMRrGgcbuUkKBCfFRrAaRrVKhHVVqeEqSsILzpQqlLjsSsSfBweEWcCUJXxYyFfnNLlkKjMoOEehFfIqQhtTHhHnNnxkKAaXWwQyQoRnjJNrLKklOxXqvQqUMmxXkKuHgGvVhbBrRHCeEZRrOMmozckaABbuUlLIMKFfoOLlAdDTtaAupSsZzZzPKJjzZHsSQqhkLlKzZuUnJjNgGsSEeXwNiInWBzZdlPpLoODbxPHhvQqENnegGQqCYcCybBcCDQqdVUEeuvViIZzZzOoFayYuUgGGgAnNTtsjJSfGFMmfvVBUubgvNncVkRrGDdgyYNVvZzhQqHgszmMZQhHBbqSrfFXxKMmTToOOottkEesSrRHTuUtZzCJirRtTIhxXyYHTtRGgrSshHrKkFSsNtTovVgGEeOmgAaGhHZzeWwlLAaVBhHbeuUEFfHIDdmMhHuUomMXxWwLSNfFnTcCTWwtjJKkTwWPpZzlLhHZzUsDeEdSKUcCFfuBLZqQzWRrqgGIbTtBSsisSQwQqIiNnGHTtdDhggGFYzqQSsZiHirhUuHILlZzEeUudDiReEWmEJjeMAhGgZzdwWDsmPpyYwWEtTecCyTKkQoOlLqtpPycCmcCtaAzZESseXeTtEaASPpNGgYMfFmwSsSsWjJYyoOynhHWdDyYvVwDdafUuFGgVvxHhgcMmCqQcCrRGHJbDmMDCcRvVrdiHhWwfmpPJnNewkKkCcKaAiIiRRwWjJPdSsieErWwRXREekOoKrFfxXxEebwWBXUuELleSTUdDxXRYyreEuOofFTJwfFXxwWRiIrCcVvttTTEWwxOoXkbgGEbBYygGejJEeSsCjJGgfWDiIdwokPpKLUuYsSqsSbAaPuUpDMmVIivZPoOOoALlaHYyhAaqQqQUCconNOuJYylLjsSpNnNyYnqkRrKQzsrrfyYxXUuFMmfMmbpWwihHmMNnGgKkkKIiItuUSsUuxXYAUuaAnNcGgCKkULlzlLHhSsuTiItPpUYyKSnmcjJCoOqQeEMFfNhSsHChHcAQDdpPqLleoOEgGhkKZJjzZlLBVaAjJceEnNZhHzsSCBbzZJvlLSWwspaACIicpPuUdDyYRrULJjriIUuRrKkROUuDWwoOdqQmvCcPCcTtAqqmMZzxXNjvzZVJFfIQqhHHcCEeNnhiwsSVvqQrRoOvoWwWwOLAaPpHhnNujJBbzZiDzZCcdDsSdnNmMjJrRuUIWwnNUiwBbfFKkVvLllLpPAyoOYtwWIDdiejJaAjJZzgGhHbBfFiIaqSsBbQkuUaADPTtpNndvgGYyVNtTnnkKNlLXxivVGpPAaSsiIxXzBbCeEKkceLpZzPlPJYDdytTnNmMSsCmMcqvVWwQxXjOoKZzaAtTkSsgJjGpbkRrABbaUpPyOoYuPFffEeFFjJfpcRrXxMmMwSsCsSyYVBbszZTtgGVvqQIiSXxvneYtTyaHhAEoOAFVvPpWPpwcBeEPpTtbjJTVvFfvVpVzHfkKvGgZzpuUPpFOsSovddDDVSgGsjjJnNFfJRtbjJgGkKBbBaATrdDIJjiRzygsSSTtsGkKrRVvsGgSYSQqaKkoOAPdVvDnNpoOfFjwWfpPkKUuFJXxMtTNHGoXxHhZvVzeEHhOlLRnWwzZGgMZzqhHCcXvVMglKGgkLoPpaAOGMChjbBLScCslJpPutvVmzZMAaXxHZpJjPfFtTmXuUAaxyCLlXxAaRAarTeFfgGHBnNbxXhFfJjnNlLQqTtEKUuURrybpcCjJPBYoIiOyYFfSsceEZzaACdGgDcIiVdDvtToYyOYyaAPjJBbOTttssSSdNntsSTDeEdIiKWlLfFcCIiRrAabBccRTtrCrhmtTzZxXMaAZzHpkKxXXfVvyYFRrFvkyYaXxUuIcCiWwoqQNnyYRrYEcSIZzBOobiEeTtmZOoOyYoNnztpPjmMKkqRrQJVOodDtTLlvsgGLBbAalnmbKkvViXxPZJjhHzpfxkKXpLltfFrTZxRrXzYytRTAaeExXAaOBboLlpPaAkVFfeEvxgEeCgGUuldMmDxXLhHxbvVKkcCBXKnNkcaAGnNWwqnNvVuUQXAaRJIiFrRXxLwWxXsSJOXxzRLlJjrlGKkgUuwVKkYyvFnNfOTtoodsSSsSsnNPpouULliHhIODdDpRrOoPOiFGGggffFmMWNnwIexXEBYBbBTtblLMlLfFmyEFfjJVvgfFtRrUuyYTmAueEUzZatuUrRvVTtwWTOokoOKkcUCcuCnYyNbBEzZeOoxXIbIixRmMLlrLmMlkKSseqQEIiwWlMmaAWwvVLSbBsFHheEbBKkXWwPpxLMmlGgfvVUulLlLNnwWSrTtRMHhGJZzjTtiaJjUuAlLIRWwWwhHpPdDrgAKkawYfFtTyWBLlbmQLlnNqsLNDdrRIinOVlLgvVGVaAvpPGyYgPTtGgpPikfFKeEIVvjJVvlcmMCpPLluuUxXSsqQSsSMmsBboOUPkKpqQzoOZAaERZzScCMmBPpbdDqQvVHxXhsSgtbAagGBTrvyYDdHhZzcrRCNnXiIxzZyIiYdeEDWlLlBbLOowVzhnNHoOlBbLKQCuUrRcqYyklLBbZzkRCcrZzzRrFIizWwZHjJpPGghoxAaapPGgAqQeEXOaAfKkAaZPpDdkxXaACcfFoObVviIiIBxoOXrFfpPWPpURrTtuCuUchHwENRYyJjXxrnebTUutJjrRjNnCcJTticCIbBBRKLlnNdHhDTtwWUuqyYeMmEsSveZYyrRRrzJSsjjMmJZzKkUoOaAEeuVvqJjgUuWXLKkbhHeEgkKlLGDiLlIhHTmMtdxXDwWQrRgGqkKqQoOZYyNMmnaAntTNVvuUIizxXyYbDdZzoOBaRJjrQqLltxLlSWwsCckKqQNnJLlRMmAaOoBbUuuxDhHxXdXLsSoKsSkTzoOZYGKkgdDxuaAUXyFftTjmpRZzzZNKJjvmWkKNnXRrAatTdQqoODrRARrNIiLlLfFlAaEoOonNOenaAafhHQqFLHhlUqaiIAQVvlHVvhXaAjJxrBYlLybHhbeEAaUuqQbBjJeEIzrRZZpPzeTtJaAKkjbzZBchaAHCdDEpPiXUuOoeEcBbCMmxTmMNyYnJjLeEuIiHhUtTZzlSlLsvVSshHPdDmMuOGgBbocFfwWCUUutLlnlLNJjmTtWwMyYtTPHdFfDsXxSUuWwmMNnhwEerRWpkKAanNgnNBbQCcGaAjOoJFrZuUzBbRYMmyFOocCwZzWMwWjJvVNnpMhHDxXyYoYyZPpzOdKkbBVfFvmFRragyYNnbAaBGAfFfwWzZPkKIiwTomMOtLlWRrxXFflNOidDgGIoaAnDdXLkKfFlijJoOrRGgIdDNnQqpPVvshpPnoZzOnsOoSzZmKxXSBbskxXMIXxioOqQwKwWkKkWSXxqlLaHhGgdDMmFfxXoOEzZuUhHbBvVEeeIiZOozKjSsxiIpPXHhJkcCsIiZzqsSQLIieFGgPpCKCGIivVgqatlLTSsAQNQqngqQZzhHTtvCqQcVGJjSOoQqUDbpPBiIOodQdCPpcDqqPpQXxubBzGgaAkKZIitTTtZwjJYeEDTtMmdyKkKYJjlLyzLbBlgGHhNnMWwAaLlBbIciIHWwhCiPODdzZoGgQqtAaTBFiaAItTKKgGHhkWAawTbBMKkcCoOFfIiRrmGgGgtkKKkoqQOkREerDrRdSIiWlLXxwsknSIAYyaiIinVvlLdlLDNsqQHhfmMwqQWwLUuGglWwGWDdalLIiuTtGgUWfWwFsSdDUuwwWXxGgmfFMzZTaKkKktThHzrRZLlsLlSMuUunIPzZpZzrpPEzZeRiVeOoKkXxqiIzZsKkfFbBSYTOotaAyIKbBYgGsZztToOrRSqQSsrVvNyYsEYVzZXxEeRrtdDYOoefFEqQVvJjJjCcSsJKjJkjBxXjITtNngGmMMmMEeoOmiavyYJjVAmMsSjhHOorsSRWwhHIizZsSUuIizZQqJcCJBbbbxXQqTmMturUuIioORBbyPpYZzdDDdUBCceoFgGUufOyYCfFcEnNzPWwpZMxjnRrNJUuFfeckKCEWwXDfFdDQoUQqvVUuGpPjJZzgowWDQyYqJGgjdcqxXQQqkKEeJjWwrRQqCceEsPpuUoOwjJWjwWJSoVvOZzCqgGQqQYybgGuuUUNnbYyBuUBkKwWrNnRGgvTuMmUtVssDdSYySkkPpKfYyFJjJjbBWwtTXxqXDdxQAiInUuNaWwmfFMVcCvfHhKMmsSklmPHhpMdDJFvBbVfsSrRxXiIKkalkKjJLAVvxvVXjgnNAapPYyHRIYyBbiFIxXkKfhHPpLQqRvVvKkVbTtBrFflESseAfFaVvSsSsFetYyTdLlSssShHJjCcUZzhHIKkicCIiZzbeETtbBeEVWwvBrRQquauUJSEeszHhZEejgGAZzdDKkLlsSYyDLlFfKBbkoyEexXHcCOoEekKhqQfrRKWBbrRLlwkFPXxpWwdDPxBDdqPppPQPLlIipbVvXGgewkKWhHEqQyZKkXxoOnNTtPEeJCzZiCKkcIcuJjFfUVkXxjmMJAaKvdDhHOoHhjEeVvpuUYrRyEebBTVEeGgBboHNnDdQnNCyKkIMDRVvrdAkKaJjJjrbYyaAtTBRQYyqfOkKIhotTOcCHIioKkHhBKbcCTtBPhHpmMkfLlXxXkKyWwYxwLlnesSENWZoOzyYYykKnxXNFeFfIiEbHhRrlLcCcCqQgiINhHnHSsiIhRrnNfFstTSYywtTWfxXFpPjgMmGGgwWlTTttTiItLaAlLOoqQaAQqRBbxiIvVJfFPpjXRBbrEQqjSsVnNMmSUcsSCuDdsgGuUmjJbBMXxiRrIhHpPtoxXFBbQCcqOvasSdDAVxZzYeEyOoXodDPpfcClLGgTtEeGgpPEeZMmKLlTtNeEKkGgHhnNSsnmoOMkPpdhHZzDqQKkguUhXxCcHoOLCclhHKgGkGcCgKkeEYyGrRxXjcCvMmVpCcInNcCQqAamzZXxMZziIUunNwCoOcWFCPpzZNXxnJjOoaGEegoqQOAcGZzgfLdDdDZzYykIiwWRrKqQyYQLlqlgGCcMFfAamNgGnbBCclWzZwLiFDdfjrRJqBbQGEegiIswWSLmMyjJYKkOcCaGjJgxXVvAJBbjhtcuUCTMmcCPAapTtPpvVmFfpPqQrGgWtYWqQmMwyTnNwRqQkKTtQFuUPBbpfqSsMlMeEmdDLdrRDCLlWbBwcVvwWlLmOLlojBbJfFWwmMtxteETXTlfFLaACcCrRtTcHIihuMuUmUjmMDdJXxoXPpyKkEefbBFYiIxOUuAaReEFfGJjgrjJlLTtIillahHSsvUAauJkKjPpoOVZWkyYNblLBjJnIijJKyYwSsgGEeyWJjJCcjwuUYIJjiemMwrRQgmMGqjFTtfrRJGgWhHLxXjvVJzUuZeElbvFfVlTtLBNnEfXxFipPIWkKJXxjFftJjnNOomMTtwWTKwlKkLeExzMmPrRpZXyYGcCsSBSUusbWwMmgWskKSkDdNbBVvnNnWwwSxXpPVXxAaJjvEeCMmcUuXxTlLtMmxXwWrRooOAjnNqQCuUaAGgcJNTVvtJjnQqEepOoPTlLtaOspPJnNLlZlUuLzEeNXxbBBbnhHfFjCctUuFXxKkmjJpZzPyYMHhfThhHiIiIJOojgGPpHTNnLUulVZzvTaAthjJGwbBNbBFmMfUuSwWsGgnaAnNRrSwNnWsdaHhmMADYqQfFJjogCcGEeaAONniTFVOovfXxnNWiIfFYywlLtIhHSkKzZsCwWQqLQqlXxUuBuUbUWwGguymzZMJrRBbjSsDdSsJHBbhwctTaIirRNnAChHoOuKHhkUWZrRzpqQPLlkKPpBOobJVvjDdqQhHpPFfhpPHBbSsUuyYebBHhuUPpEhVvJjHBboOVatTARrckmMKMmCIiabsILliSoOBfoOFGgAflLFhHRrvVYyyYMmuUyYqQUPpuMCcucTttTCSsJuUFDdfrRNPpnLlCaAVvcXxUmMutTEeRrSsTtdDiIiIRPpoOEetTXpcCBbPHlkKLluUUuLwRBbrWSsSOohHiKkIgGfAaFuUDPpdSsfPpFKkkhHCcHhTtfFbBpBbPKoyYOduUDKkYymMCcUKknNevVObBeEoeRLbBlrEebBNnDcCAabBIwWiZGgLKkcClLhyYHUufFlZhHfFzXUulLxCcaAkKweEUuWDdCcCccsSyYCxXOoQquOLloLlxXsiFfISxXUckKtTCzhHHhxXmgGcPpCMdheEKkHqQhHhHyYbrRYyjJXWwoSsOxtTsZzSirRILveHhEfFVvOoOXDdxsSqDdkKQosSRLltTKkrVTnNAawWrRhHtZzwQqewWESsWooOoOrRxTYytHhXNWwwWnQqOxXOoiWwINRzZreEnelaALELlCclLeEKkOzZmMooOSszZBbSVvTtsLllSsiNnWwIqQZzLlhHmMyYXCcxWwBbJGkKgzCcZQKCckZzvVqaAxXpPjNnjJTtOoZIiAazdgJjGrRYyDzwWZAaZzMmGgoAazZQfFQqqtTlsmMSJPpjLpPloOceTGgjJtECbBLJjOKEekwWQqOEewWoqGgGgNnnTAatCcNZzgGQSsBFxXZzoOBEedDbBbvGtTgVTtfKkRrWwGyYgaAFiIfT diff --git a/2018/05/src/main.rs b/2018/05/src/main.rs new file mode 100644 index 0000000..d840ce9 --- /dev/null +++ b/2018/05/src/main.rs @@ -0,0 +1,88 @@ +use std::collections::HashSet; +use std::io::{self, BufRead}; + +fn react(polymer: I) -> String +where + I: Iterator, +{ + let mut input = polymer.collect::>(); + + loop { + let remove = input + .windows(2) + .enumerate() + .filter(|(_, chars)| { + assert!(chars.len() == 2); + + let left = chars[0]; + let right = if chars[1].is_uppercase() { + chars[1].to_ascii_lowercase() + } else { + chars[1].to_ascii_uppercase() + }; + + left == right + }) + .map(|(i, _)| i) + .scan(None, |state, i| { + if let Some(n) = state { + let prev = *n + 1; + + *n = i; + + if prev != i { + Some(i) + } else { + None + } + } else { + *state = Some(i); + + Some(i) + } + }) + .collect::>(); + + if remove.is_empty() { + break; + } + + input = input + .into_iter() + .enumerate() + .filter(|(i, _)| !remove.contains(i) && !remove.contains(&(i - 1))) + .map(|(_, c)| c) + .collect::>(); + } + + input.into_iter().collect::() +} + +fn main() { + let input = io::stdin() + .lock() + .lines() + .filter_map(Result::ok) + .collect::(); + + println!("part.one={}", react(input.chars()).len()); + + let units = input + .chars() + .map(|c| c.to_ascii_lowercase()) + .collect::>(); + + let min = units + .into_iter() + .map(|u| { + let stream = input + .chars() + .filter(|c| *c != u && *c != u.to_ascii_uppercase()); + + react(stream).len() + }) + .min() + .expect("failed to find shortest polymer"); + + println!("part.two={}", min); +} diff --git a/2018/06/Cargo.lock b/2018/06/Cargo.lock new file mode 100644 index 0000000..c87e1a0 --- /dev/null +++ b/2018/06/Cargo.lock @@ -0,0 +1,4 @@ +[[package]] +name = "day-06" +version = "0.1.0" + diff --git a/2018/06/Cargo.toml b/2018/06/Cargo.toml new file mode 100644 index 0000000..8b14959 --- /dev/null +++ b/2018/06/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-06" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/06/example-01.txt b/2018/06/example-01.txt new file mode 100644 index 0000000..95d160a --- /dev/null +++ b/2018/06/example-01.txt @@ -0,0 +1,6 @@ +1, 1 +1, 6 +8, 3 +3, 4 +5, 5 +8, 9 diff --git a/2018/06/input.txt b/2018/06/input.txt new file mode 100644 index 0000000..7cf5491 --- /dev/null +++ b/2018/06/input.txt @@ -0,0 +1,50 @@ +194, 200 +299, 244 +269, 329 +292, 55 +211, 63 +123, 311 +212, 90 +292, 169 +359, 177 +354, 95 +101, 47 +95, 79 +95, 287 +294, 126 +81, 267 +330, 78 +202, 165 +225, 178 +266, 272 +351, 326 +180, 62 +102, 178 +151, 101 +343, 145 +205, 312 +74, 193 +221, 56 +89, 89 +242, 172 +59, 138 +83, 179 +223, 88 +297, 234 +147, 351 +226, 320 +358, 338 +321, 172 +54, 122 +263, 165 +126, 341 +64, 132 +264, 306 +72, 202 +98, 49 +238, 67 +310, 303 +277, 281 +222, 318 +357, 169 +123, 225 diff --git a/2018/06/src/main.rs b/2018/06/src/main.rs new file mode 100644 index 0000000..9d90013 --- /dev/null +++ b/2018/06/src/main.rs @@ -0,0 +1,120 @@ +use std::collections::HashMap; +use std::io::{self, BufRead}; + +fn distance(a: (i32, i32), b: (i32, i32)) -> i32 { + (a.0 - b.0).abs() + (a.1 - b.1).abs() +} + +#[derive(Clone, Copy, Debug)] +enum State { + Empty, + Owner(usize, i32), + Equal(i32), +} + +#[derive(Clone, Copy, Debug)] +enum Area { + Infinite, + Finite(usize), +} + +fn main() { + let coordinates = io::stdin() + .lock() + .lines() + .filter_map(Result::ok) + .map(|line| { + let coords = line + .split(", ") + .map(|coord| coord.parse::().unwrap()) + .collect::>(); + + (coords[0], coords[1]) + }) + .collect::>(); + + let width = coordinates + .iter() + .map(|(x, _)| *x as usize) + .max() + .expect("failed to find max x") + + 1; + + let height = coordinates + .iter() + .map(|(_, y)| *y as usize) + .max() + .expect("failed to find max y") + + 1; + + let mut grid_view = vec![State::Empty; width * height].into_boxed_slice(); + + for x in 0..width { + for y in 0..height { + for (i, c) in coordinates.iter().enumerate() { + let distance = distance(*c, (x as i32, y as i32)); + let state = &mut grid_view[x + (y * width)]; + + *state = match state { + State::Empty => State::Owner(i, distance), + State::Owner(_, d) if *d > distance => State::Owner(i, distance), + State::Owner(o, d) if *d == distance && *o != i => State::Equal(distance), + State::Equal(d) if *d > distance => State::Owner(i, distance), + _ => *state, + }; + } + } + } + + let mut areas = HashMap::new(); + + for x in 0..width { + for y in 0..height { + if let State::Owner(o, _) = grid_view[x + (y * width)] { + let a = areas.entry(o).or_insert(Area::Finite(0)); + + if x == 0 || x == width - 1 || y == 0 || y == height - 1 { + *a = Area::Infinite; + } else { + match a { + Area::Infinite => (), + Area::Finite(area) => *area += 1, + } + } + } + } + } + + let (_, area) = areas + .iter() + .filter_map(|(i, area)| { + if let Area::Finite(area) = area { + Some((i, area)) + } else { + None + } + }) + .max_by_key(|(_, area)| *area) + .expect("failed to find max area"); + + println!("part.one={}", area); + + let mut grid_view = vec!['.'; width * height].into_boxed_slice(); + + for y in 0..height { + for x in 0..width { + let total = coordinates + .iter() + .map(|c| distance(*c, (x as i32, y as i32))) + .sum::(); + + if total < 10_000 { + grid_view[x + (y * width)] = '#'; + } + } + } + + let area = grid_view.iter().filter(|r| **r == '#').count(); + + println!("part.two={}", area); +} diff --git a/2018/07/Cargo.toml b/2018/07/Cargo.toml new file mode 100644 index 0000000..49b7d09 --- /dev/null +++ b/2018/07/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-07" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/07/src/main.rs b/2018/07/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/07/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/08/Cargo.toml b/2018/08/Cargo.toml new file mode 100644 index 0000000..3688ffb --- /dev/null +++ b/2018/08/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-08" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/08/src/main.rs b/2018/08/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/08/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/09/Cargo.toml b/2018/09/Cargo.toml new file mode 100644 index 0000000..9beb4dd --- /dev/null +++ b/2018/09/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-09" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/09/src/main.rs b/2018/09/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/09/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/10/Cargo.toml b/2018/10/Cargo.toml new file mode 100644 index 0000000..0dfdce2 --- /dev/null +++ b/2018/10/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-10" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/10/src/main.rs b/2018/10/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/10/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/11/Cargo.toml b/2018/11/Cargo.toml new file mode 100644 index 0000000..7936c3b --- /dev/null +++ b/2018/11/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-11" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/11/src/main.rs b/2018/11/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/11/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/12/Cargo.toml b/2018/12/Cargo.toml new file mode 100644 index 0000000..aacd7bf --- /dev/null +++ b/2018/12/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-12" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/12/src/main.rs b/2018/12/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/12/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/13/Cargo.toml b/2018/13/Cargo.toml new file mode 100644 index 0000000..a27b18a --- /dev/null +++ b/2018/13/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-13" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/13/src/main.rs b/2018/13/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/13/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/14/Cargo.toml b/2018/14/Cargo.toml new file mode 100644 index 0000000..eafd020 --- /dev/null +++ b/2018/14/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-14" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/14/src/main.rs b/2018/14/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/14/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/15/Cargo.toml b/2018/15/Cargo.toml new file mode 100644 index 0000000..ee373de --- /dev/null +++ b/2018/15/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-15" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/15/src/main.rs b/2018/15/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/15/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/16/Cargo.toml b/2018/16/Cargo.toml new file mode 100644 index 0000000..2100ebb --- /dev/null +++ b/2018/16/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-16" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/16/src/main.rs b/2018/16/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/16/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/17/Cargo.toml b/2018/17/Cargo.toml new file mode 100644 index 0000000..0bd4a59 --- /dev/null +++ b/2018/17/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-17" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/17/src/main.rs b/2018/17/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/17/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/18/Cargo.toml b/2018/18/Cargo.toml new file mode 100644 index 0000000..4b623dd --- /dev/null +++ b/2018/18/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-18" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/18/src/main.rs b/2018/18/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/18/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/19/Cargo.toml b/2018/19/Cargo.toml new file mode 100644 index 0000000..04c6838 --- /dev/null +++ b/2018/19/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-19" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/19/src/main.rs b/2018/19/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/19/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/20/Cargo.toml b/2018/20/Cargo.toml new file mode 100644 index 0000000..7bc2ac2 --- /dev/null +++ b/2018/20/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-20" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/20/src/main.rs b/2018/20/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/20/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/21/Cargo.toml b/2018/21/Cargo.toml new file mode 100644 index 0000000..67297c5 --- /dev/null +++ b/2018/21/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-21" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/21/src/main.rs b/2018/21/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/21/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/22/Cargo.toml b/2018/22/Cargo.toml new file mode 100644 index 0000000..7b3f6e9 --- /dev/null +++ b/2018/22/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-22" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/22/src/main.rs b/2018/22/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/22/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/23/Cargo.toml b/2018/23/Cargo.toml new file mode 100644 index 0000000..b58ce53 --- /dev/null +++ b/2018/23/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-23" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/23/src/main.rs b/2018/23/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/23/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/24/Cargo.toml b/2018/24/Cargo.toml new file mode 100644 index 0000000..1ede8c2 --- /dev/null +++ b/2018/24/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-24" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/24/src/main.rs b/2018/24/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/24/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/2018/25/Cargo.toml b/2018/25/Cargo.toml new file mode 100644 index 0000000..a4a45bc --- /dev/null +++ b/2018/25/Cargo.toml @@ -0,0 +1,7 @@ +[package] +name = "day-25" +version = "0.1.0" +authors = ["Anders Olsson "] +edition = "2018" + +[dependencies] diff --git a/2018/25/src/main.rs b/2018/25/src/main.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/2018/25/src/main.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +}